如何将LaTeX引号视为文本对象?


29

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

我通常使用类似T`ct'(向后退至`,更改至')。但是,这是笨拙且不自然的。我宁愿能够使用的线沿线的东西ciq(“引号中的变化”),就像我所能做的ciwca)ci"ca',等。

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

Answers:


10

我不知道乳胶,但这似乎可行:

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

我基于此处的信息:http : //vim.wikia.com/wiki/Creating_new_text_objects

您还可以添加对以下内容的支持aq

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

iq例如,这适用于,但似乎不适用于daq
Doorknob

对。您还可以aq使用其他类似的映射使其工作。我编辑了答案。我还在映射中用T'交换了T`,以便它首先向前搜索,这对我来说似乎更自然。
superjer 2015年

这适用于单引号,但daq``foo''短短的结果`foo'
门把手2015年

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

7

编辑:我刚刚发现了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),这些对象可以返回到上一个`,并进入可视选择模式,然后选择下一个'

这对于工作ciqcaqyiq,和diq。然而,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文本对象以调用它。

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

  1. Yanking可能会将光标放在意想不到的位置(可以通过在命令(例如ma2F`v2f'<cr>`a)中添加标记来解决此问题,只需确保不要使用您经常手动使用的光标即可)
  2. 光标必须在引号内;如果在引号上出现奇怪的事情。

总结一下,这是我个人.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中使用过多的常规功能。那只是个人喜好;不难切换对象名称。我还添加了文件类型检测和标记。


2

这是一个古老的问题,但对未来的访问者有利:我发现使用以下方法更容易更改乳胶报价:

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

然后This thing is "Foobar"!可以在vim和乳胶中正常工作。


0

插入 vim-sandwich

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

  • l`l'`text'
  • l"``text''
  • 文本对象,可以轻松对其进行操作。

在使用默认映射的情况下,以下工作

  • textobject:更换的内部文本`text'cisl'或如果最近的周围的自动检测是细cib(例如光标h`a (phony) text'要求压vibibc)。但是,您可以定义以下其他文本对象iq(OP示例), 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
  • 添加textsaiwl'单撇号,以获得`text'
    该命令的图案是sa{motion/textobject}{surrounding}与装置调用操作者add surroundinginner word并环绕类型是latex single quote
  • sdl'或用删除sdb
  • 随着srl'l"或随着变化srbl"

它支持

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.