在VIM中的多行之间选择双引号之间的文本

时间:2014-02-13 12:01:31

标签: select vim multiline lines

假设我有以下文字:

"test 1
test 2
test 3"

我想选择引号之间的所有内容。我已经使用了vi“,但它不起作用,只有当文本在一行上时才有效。另一方面,当我有这样的东西时:

(test1,
test 2)

我输入vi(它会选择整个文字。

任何指针都将非常感激。感谢

4 个答案:

答案 0 :(得分:6)

由相同字符("'分隔的文本对象仅在一行内工作,否则很难确定选择的正确范围。

如果您想要这样的多行文本对象,则必须定义自己的替代方案。像kana/vim-textobj-user或我自己的CountJump plugin这样的插件可以帮助您。

答案 1 :(得分:4)

内置引号和双引号文本对象不跨越线边界。但是,您可以使用vim的运算符进行搜索。 e.g。

y/"<cr>
c/"<cr>FOO<esc>
d?"<cr>

答案 2 :(得分:1)

vim-textobj-quotes插件完全符合您的要求:https://github.com/beloglazov/vim-textobj-quotes

它为最接近的任何类型的引号对提供文本对象,并支持跨越多行的引号。仅使用iqaq,它允许您操作当前围绕光标的单个(&#39;),双(&#34;)或后面(?)引号的内容,位于光标前面或后面(按优先顺序排列)。换句话说,当需要达到报价时,它会向前或向后跳跃。

请查看上面链接的github页面了解更多详情。

答案 3 :(得分:0)

您可以创建以下映射:

" Visual
nnoremap <silent> vi" ?"<CR><space>v/"<CR><BS>
nnoremap <silent> vi' ?'<CR><space>v/'<CR><BS>
nnoremap <silent> vi` ?`<CR><space>v/`<CR><BS>
nnoremap <silent> va" ?"<CR>v/"<CR>
nnoremap <silent> va' ?'<CR>v/'<CR>
nnoremap <silent> va` ?`<CR>v/`<CR>

" Delete
nnoremap <silent> di" ?"<CR><space>v/"<CR><BS>d
nnoremap <silent> di' ?'<CR><space>v/'<CR><BS>d
nnoremap <silent> di` ?`<CR><space>v/`<CR><BS>d
nnoremap <silent> da" ?"<CR>v/"<CR>d
nnoremap <silent> da' ?'<CR>v/'<CR>d
nnoremap <silent> da` ?`<CR>v/`<CR>d

" Change
nnoremap <silent> ci" ?"<CR><space>v/"<CR><BS>c
nnoremap <silent> ci' ?'<CR><space>v/'<CR><BS>c
nnoremap <silent> ci` ?`<CR><space>v/`<CR><BS>c
nnoremap <silent> ca" ?"<CR>v/"<CR>c
nnoremap <silent> ca' ?'<CR>v/'<CR>c
nnoremap <silent> ca` ?`<CR>v/`<CR>c

来源: https://gist.github.com/eruizc-dev/78964fa83b57dca687ec1bd0d1690aa9