修改Vim(neovim)引号配对,以在具有特定扩展名的文件中将反引号与单引号配对

f87krz0w  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(119)

上下文:

Vim和Neovim以几种有用的方式对单引号(')进行配对。特别是:
1.当你输入'时,Vim会生成另一个',并将你的光标放在这对之间。

  1. ' s之间的文本被视为Vim可以操作的文本对象。
    同样的行为也适用于Vim与第二个反勾号配对的反勾号(`)。

提问:

这很好;然而,在某些情况下,反勾应该与单引号配对,而不是与第二个反勾配对。我的问题是:

  • 这种行为在哪里受到控制?
  • Vim和neovim有什么不同吗?
  • 我有什么选项可以修改此行为,使反引号仅在某些上下文中(即具有某些扩展名的文件)与单引号配对,同时在其他地方保持默认行为?

示例:

乳胶

在Latex中,双引号的开头使用两个反引号(``)而不是双引号(“),并使用两个单引号(”)结束。在这种情况下,所需的配对将是两个反引号和两个单引号,光标在中间。此外,文本对象应该是反引号集和单引号集之间的文本。
下面由Friedrich提供的csquotes包对Latex情况有帮助,但我对更一般地解决这个问题的东西感兴趣。

状态

在Stata中,本地宏和包含双引号的字符串都使用这种模式。一个简单的例子:

local foo bar 
di "`foo'"
generate one_dbl_quote = `"""'

字符串
这将字符串bar放入名为foo的本地宏中,然后将foo的内容打印到控制台,然后创建一个包含一个双引号的字符串变量。

dgsult0t

dgsult0t1#

事实证明,How can I treat LaTeX quotes as a text object? on Vi and Vim SE的几个答案也适用于这个问题。
我不会在这里重复所有的答案,但是用户superjeranswer定义了aqiq文本对象的新Map(更多信息请参见:help text-objects)。答案是轻量级的,可以很容易地适应这个问题。它确实有一个警告,它只适用于单引号,只有当字符串在一行,这似乎是可以接受的用于Stata宏(但不用于LaTeX)。
要仅为stata文件类型启用Map(如果文件类型未知,请考虑使用: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>

字符串
或者-稍微不那么整洁-你可以采取一个快捷方式,根据你的vimrc中的文件扩展名通过autocmd启用它们:

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>Map,因此它们不会泄漏到非Stata文件中。而不是使用iqaq,您甚至可能决定疯狂地覆盖默认运算符i``和a``。
对于跨多行的字符串,事情会变得非常棘手。在这种情况下,我建议使用一个插件,比如在链接问题的答案中提到的两个插件:vim-sandwich或-特别是LaTeX-textobj-latex
如果你喜欢这些建议中的任何一个,请访问Vi and Vim SE,并给予相应的作者你的赞成票!

相关问题