``like this''
(或单引号为`like this'
)。这使得在Vim中浏览它们变得很困难。我通常使用类似
T`ct'
的东西(向后直到`
,更改直到'
)。但是,这是笨拙且不自然的。我希望能够像ciq
一样使用某些东西(“ quotes”),就像我可以做ciw
,ca)
,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>
#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>
这些创建新的文本对象(
aq
和iq
),然后返回到上一个`
,进入可视选择模式,然后最多选择下一个'
。 适用于
ciq
,caq
,yiq
和diq
。但是,yaq
和daq
不会取消/删除外部引号,因此我创建了另一个文本对象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'
(例如,cib
中h
上的光标需要按`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 quote
或sdl'
删除sdb
或srl'l"
它支持Tim Pope或Kana的
Ingo Karkat的visualrepeat.vim(Tim Pope的vim-surround不支持)。
评论
这适用于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