假设我有以下文字:
"test 1
test 2
test 3"
我想选择引号之间的所有内容。我已经使用了vi“,但它不起作用,只有当文本在一行上时才有效。另一方面,当我有这样的东西时:
(test1,
test 2)
我输入vi(
它会选择整个文字。
任何指针都将非常感激。感谢
答案 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
它为最接近的任何类型的引号对提供文本对象,并支持跨越多行的引号。仅使用iq
或aq
,它允许您操作当前围绕光标的单个(&#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