LaTeX中的引号与普通文本中的引号不同,因为它们的格式为``like this''(或单引号为`like this')。这使得在Vim中浏览它们变得很困难。

我通常使用类似T`ct'的东西(向后直到`,更改直到')。但是,这是笨拙且不自然的。我希望能够像ciq一样使用某些东西(“ quotes”),就像我可以做ciwca)ci"ca'等一样。

有什么办法告诉Vim将``LaTeX'' `quotes'视为文本对象? (此外,还有什么方法只能在编辑.tex文件时触发此操作吗?)

#1 楼

我不了解LaTeX,但这似乎可行:

vnoremap iq :<C-U>silent! normal! t'vT`<CR>
omap iq :normal viq<CR>


我基于这里的信息:http://vim.wikia.com/wiki/ Creation_new_text_objects

还可以添加对aq的支持:

vnoremap aq :<C-U>silent! normal! f'vF`<CR>
omap aq :normal vaq<CR>


评论


这适用于iq,但似乎不适用于daq。

–门把手
15年2月13日在22:13

对。您还可以使其与aq一起使用,并具有其他类似的映射。我编辑了答案。我还在映射中用t'交换了T`,以便它首先搜索,这对我来说似乎更自然。

–superjer
2015年2月16日在23:21



这适用于单引号,但是对“ foo”的daq只导致`foo'。

–门把手
2015年2月16日在23:57

我认为这种方法不能比单引号更有效。您将需要对文本进行比f和t运算符允许的更深入的检查,这将要求编写一个包含变量和所有内容的完整函数。我现在没有时间这样做。

–superjer
2015年2月17日在1:49

#2 楼

编辑:我刚刚发现了vim-textobject-latex插件,它添加了您正在寻找的确切功能(除了其他一些功能)。从插件的自述文件:

当前支持的文本对象是:

a   i   Description
a\ i\ Inline math surrounded by ``\(`` and ``\)``.
a$  i$  Inline math surrounded by dollar signs.
aq  iq  Single-quoted text ``\`like this'``.
aQ  iQ  Double-quoted text ``\``like this''``.
ae  ie  Environment ``\begin{...}–\end{...}``


,因此您可以根据需要使用caq等。我对其进行了测试,并且它可以像宣传的那样工作,但是请注意,它取决于vim-textobject-user插件。另请注意,您必须确保首先加载textobject-user插件,否则事情将无法正常工作。


如果您不想弄乱插件,那么我的原始答案仍然有用:

将这两行添加到您的.vimrc中将满足您的大部分需求。

onoremap aq :<c-u>normal! F`vf'<cr>
onoremap iq :<c-u>normal! T`vt'<cr>


这些创建新的文本对象(aqiq ),然后返回到上一个`,进入可视选择模式,然后最多选择下一个'

适用于ciqcaqyiqdiq。但是,yaqdaq不会取消/删除外部引号,因此我创建了另一个文本对象a"来处理该问题(不需要i",但我添加来保持一致:

onoremap a" :<c-u>normal! 2F`v2f'<cr>
onoremap i" :<c-u>normal! 2T`v2t'<cr>


这里的主要缺点是,这会破坏常规的ca"等用途。如果以au FileType tex开头,则只会在.tex文件中出现该问题,但有时仍会令人讨厌。您也可以将对象命名为ad / id(“ d”表示“双引号”),但对我来说似乎不太直观(我的目标是与正常操作的差异最小)。

我能想到的将它们包装成两个文本对象的唯一方法是编写一个函数,以检查第一组之外的另一个引号,并设置aq文本对象来调用该函数。

注意:这些还有其他一些小问题:


Yanking可能会使光标停留在意外的位置(可以通过在命令中添加标记来解决此问题(例如ma2F`v2f'<cr>`a,只需确保不要使用您经常手动使用的光标即可))
光标必须位于引号内;如果将所有内容括在引号中,则会发生奇怪的事情。


要总结所有这些,这是我本人将为此问题添加到我的.vimrc中的内容:

augroup filetype_latex
    au!
    au FileType tex,plaintex onoremap a' :<c-u>normal! muF`vf'<cr>`u
    au FileType tex,plaintex onoremap i' :<c-u>normal! muT`vt'<cr>`u
    au FileType tex,plaintex onoremap a" :<c-u>normal! mu2F`v2f'<cr>`u
    au FileType tex,plaintex onoremap i" :<c-u>normal! mu2T`v2t'<cr>`u
end augroup


如您所见,我选择了打破常规的ca' / ya" / etc功能,所以我不必为他们学习新命令,因为我不会过多地使用常规功能无论如何在LaTeX中。那只是个人喜好;不难切换对象名称。我还添加了文件类型检测和标记。

#3 楼

这是一个老问题,但是为了将来的访问者受益:我发现使用以下方法更容易更改乳胶报价:

\usepackage{csquotes} % change " " into nice double quotes  
\MakeOuterQuote{"}


然后This thing is "Foobar"!在vim和乳胶。

#4 楼

插件vim-sandwich


另一个有用的插件是vim-sandwich,它定义了ft特定的环境



l`l',用于`text'

l"和qbr120文本对象可轻松对其进行操作。

在工作之后具有默认映射



textobject:用``text''替换`text'的内部文本,或者如果自动检测到最近的周围环境很好cisl'(例如,cibh上的光标需要按`a (phony) text')。但是,您可以定义以下附加文本对象vibibc(OP示例)
iq
现在只需按 omap <unique> iq <Plug>(textobj-sandwich-query-i)l' xmap <unique> iq <Plug>(textobj-sandwich-query-i)l' omap <unique> aq <Plug>(textobj-sandwich-query-a)l' xmap <unique> aq <Plug>(textobj-sandwich-query-a)l' omap <unique> iQ <Plug>(textobj-sandwich-query-i)l" xmap <unique> iQ <Plug>(textobj-sandwich-query-i)l" omap <unique> aQ <Plug>(textobj-sandwich-query-a)l" xmap <unique> aQ <Plug>(textobj-sandwich-query-a)l" ciq即可。

加到ciQ中并带有text单撇号以获得saiwl'
该命令的模式为`text',表示调用sa{motion/textobject}{surrounding}上的运算符add surrounding,环绕类型为inner word

latex single quotesdl'删除


sdbsrl'l"


它支持Tim Pope或Kana的





Ingo Karkat的visualrepeat.vim(Tim Pope的vim-surround不支持)。