问题描述
|
我是Vim脚本编写的新手。我需要编写一个脚本,将一个文本与其他文本包围起来。例如:
\\surroundingtext{surrounded text}
(是的,对于LaTeX)。我想突出显示“环绕的文本”并发出命令,或者让“环绕的文本”是正则表达式命令的结果。
我想问题是,如何将其放入函数中?
谢谢,
杰里米
解决方法
这是我的工作:
vnoremap <buffer> <leader>sur \"zc\\surroundingtext{<C-R>z}<Esc>
这将创建一个视觉模式映射,您可以在其中以字符方式视觉选择(v
)您要包围的文本,键入\\sur
(假定默认的mapleader
为\\
),该文本将被您指定的文本包围。
\"z
指定寄存器\'z \'
c
告诉vim更改视觉选择的文本,将原始文本放置在寄存器'z'中
\\surroundingtest
是左侧
<C-R>z
告诉Vim粘贴寄存器\'z \'
}
在右边
<Esc>
使您回到正常模式
我还将更进一步,并创建普通模式和插入模式映射:
nnoremap <buffer> <leader>sur i\\surroundingtext{}<Esc>i
inoremap <buffer> <leader>sur \\surroundingtext{}<Esc>i
您可以将这些映射放在您的~/.vimrc
文件中,但它们将针对每个filetype
进行映射。
对于他们来说,更好的地方是您的~/.vim/after/ftplugin/tex.vim
文件,因此仅当您的filetype
是tex
时才映射它们。如果父目录尚不存在,请创建它们。
假设文件类型正确设置为tex
,并且您已启用文件类型插件:
filetype plugin on
, 几周前,我问了一个非常类似的问题。如何在vim中单词的两边重复添加文本?答案中有很好的起点。
我建议您使用视觉选择,因为您需要包围任意文本块而不是单个单词。按v
进入视觉选择模式,然后选择要包围的文字。接下来,使用以下按键记录具有所需修改的宏:
qa \" record a macro in buffer a
x \" cut the selected text
i \" enter insert mode
prefix \" type the desired prefix
<esc> \" exit insert mode
p \" paste the cut text
a \" enter insert mode after the pasted text
postfix \" type the desired postfix
<esc> \" exit insert mode
q \" stop recording
要重新使用该宏,只需直观地选择要修改的下一个块,然后按@a
。
如果周围的文本经常变化,或者如果您希望在整个编辑会话中保持这种状态,则可能会太麻烦。在那种情况下,您可能想编写一个vim脚本函数来以更健壮的方式处理它。