修改 vim (neovim) 引号配对,以在具有某些扩展名的文件中将反勾号与单引号配对

问题描述 投票:0回答:1

背景:

Vim 和 Neovim 以多种有用的方式配对单引号 (

'
)。特别是:

  1. 当您输入
    '
    时,vim 会生成另一个
    '
    并将光标放在该对之间。
  2. '
    之间的文本被视为 vim 可以操作的文本对象。

同样的行为也适用于 vim 与第二个反勾号配对的反勾号 (`)。

问题:

这太棒了;但是,在某些情况下,反勾号应与单引号配对,而不是与第二个反勾号配对。我的问题是:

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

示例:

乳胶

在 Latex 中,左双引号是使用两个反引号 (``) 而不是双引号 (") 编写的,并用两个单引号 ('') 结束。在这种情况下,所需的配对将是两个反引号和两个单引号光标位于中间。此外,文本对象应该是反引号组和单引号组之间的文本。 Friedrich

下面建议的

csquotes 包有助于解决 Latex 案例,但我对更普遍地解决这个问题的东西感兴趣。 Stata

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

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

这会将字符串
bar
放入名为

foo

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

事实证明,
vim neovim
1个回答
1
投票
也适用于这个问题。

我不会尝试复制这里的所有答案,而是复制用户的答案

superjer 定义新的映射 对于 aqiq

 文本对象(有关更多信息,请参阅 
: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

并向各自的作者投赞成票!

© www.soinside.com 2019 - 2024. All rights reserved.