Vim 和 Neovim 以多种有用的方式配对单引号 (
'
)。特别是:
'
时,vim 会生成另一个 '
并将光标放在该对之间。'
之间的文本被视为 vim 可以操作的文本对象。同样的行为也适用于 vim 与第二个反勾号配对的反勾号 (`)。
这太棒了;但是,在某些情况下,反勾号应与单引号配对,而不是与第二个反勾号配对。我的问题是:
在 Latex 中,左双引号是使用两个反引号 (``) 而不是双引号 (") 编写的,并用两个单引号 ('') 结束。在这种情况下,所需的配对将是两个反引号和两个单引号光标位于中间。此外,文本对象应该是反引号组和单引号组之间的文本。 Friedrich
下面建议的csquotes 包有助于解决 Latex 案例,但我对更普遍地解决这个问题的东西感兴趣。 Stata
在 Stata 中,包含双引号的本地宏和字符串都使用此模式。一个简单的例子:local foo bar
di "`foo'"
generate one_dbl_quote = `"""'
这会将字符串
bar
放入名为 foo
的本地宏中,然后将
foo
的内容打印到控制台,然后创建一个包含单双引号的字符串变量。事实证明,
文本对象(有关更多信息,请参阅
:help text-objects
)。答案是轻量且
可以很容易地适应这个问题。它确实有一个警告,即它仅适用于单引号和
仅当字符串位于一行中时,这对于 Stata 宏来说似乎可以接受(但不适用于 LaTeX)。仅针对 stata
文件类型启用映射(如果文件类型不是
已知,请考虑使用 :help new-filetype
) 中的说明添加它,并创建一个 ~/.vim/after/ftplugin/stata.vim
文件,如下所示:
vnoremap <buffer><silent> iq t'oT`
onoremap <buffer> iq <Cmd>normal viq<CR>
vnoremap <buffer><silent> aq f'oF`
onoremap <buffer> aq <Cmd>normal vaq<CR>
或者 - 有点不太整洁 - 你可以走捷径,只需通过 autocmd
启用它们
基于您的 vimrc
:中的文件扩展名
augroup quotes-text-objects
autocmd!
autocmd BufNew,BufEnter *.dta vnoremap <buffer><silent> iq t'oT`
autocmd BufNew,BufEnter *.dta onoremap <buffer> iq <Cmd>normal viq<CR>
autocmd BufNew,BufEnter *.dta vnoremap <buffer><silent> aq f'oF`
autocmd BufNew,BufEnter *.dta onoremap <buffer> aq <Cmd>normal vaq<CR>
augroup END
请注意,这使用 <buffer>
映射,因此它们不会泄漏到非 Stata
文件。
您甚至可能决定疯狂地覆盖默认运算符 iq
和
aq
,而不是使用
i`
和
a`
。
对于跨越多行的字符串,事情很快就会变得棘手。在这种情况下,我建议使用一个插件,例如链接问题的答案中提到的两个插件:vim-sandwich 或 - 对于 LaTeX 具体来说 -
textobj-latex。 如果您喜欢这些建议中的任何一个,请访问 Vi 和 Vim SE
并向各自的作者投赞成票!