我即将重读这本 400 页的书,并标记某些单词以进行索引。
我正在寻找一组 VIM 宏,它们可以帮助我快速浏览标记要索引的单词和单词组的文本。我的想法是:
- 索引当前单词的按键(无论光标位于第一个字母还是其他任何字母上)。
foobar
变为\alsoindex{foobar}
- 一个按键将索引该单词和其后跟的单词。(
foo bar
变成\alsoindex{foo bar}
) - 将此词和下一个词索引为关键词的击键(
foo bar
变为foo bar\index{bar|foo}
) - 索引突出显示的任何文本的按键
如果我真的有梦想,我希望\index
在标点符号后插入。例如foo bar. Baz
变成foo bar.\index{bar} Baz
这超出了 VIM 宏的功能吗?
答案1
这当然可以在 Vim 中完成。首先,让我给你四个要点的方法。我把它们都设为快捷键<leader>i
(i 代表索引)。如果你不知道,<leader>
我在下面做了一个小解释。命令的解释也在下面给出。
索引当前单词的按键:
:nmap <leader>i "zdiwi\alsoindex{}<ESC>P
一个按键将索引该单词和其后面的单词:
:nmap <leader>i "zd3iwi\alsoindex{}<ESC>P
将此单词和下一个单词索引为关键词的击键:
nmap <leader>i "zyiww"xyiwea\index{\|<ESC>"xPl"zpa}
索引突出显示的任何文本的按键:
vmap <leader>i "zy`>a\index{}<ESC>"zP
最后一个问题:我不太清楚如何区分标点符号和其他字符,但是命令
nmap <leader>i "zyiwf i\index{}<ESC>"zP
将索引光标下的单词,但\index
在下一个空格之前插入命令
现在进行一些说明:
领导者: 领导者(或地图领导者)是一个键,它是一个特殊键(您可以选择哪个),您可以使用它来轻松创建快捷方式,它可以由用户设置(默认为反斜杠),并提供一种生成快捷方式的简便方法。如果领导者是反斜杠,则<leader>i
与相同。有关领导者的更多信息可以在或\i
中找到:help leader
这里。
词语定义: 当然,问题的答案取决于单词的定义。Vim 有两种不同的单词定义。一种叫做 a word
,另一种叫做 a WORD
。前者是字母串,后者是用空格分隔的字符串。请参阅:help word
和:help WORD
了解精确定义。要将命令从处理word
's 改为处理WORD
's ,w
应该将 every 改为 a W
。
寄存器: 在上面的命令中z
和x
指的是寄存器(在所有情况下),因此可以更改它们,以使用不同的寄存器。
映射 这些命令仅在正常模式下有效,但有一个命令仅在可视模式下有效。这就是nmap
和的作用vmap
。这些命令的工作原理以及有关键映射的更多信息,请参见这里和这里
免责声明: 这些命令只有在光标放在单词上时才有效,有些命令只有在同一行中该命令后面还有一个单词时才有效,如果在特殊情况下使用,可能会产生意想不到的结果。另外,如果最后一个单词只有一个字符,则第三个命令无法正常工作,如果单词只有一个字符,则第五个命令无法正常工作。
解释: 现在开始解释!它们其实都很相似。让我们从最上面的开始,然后继续向下。
该部分
"zdiw
删除光标下的单词并将其存储在寄存器中z
。试着看看:help iw
。该部分i\alsoindex{}
将 Vim 设置为插入模式并输入\alsoindex{}
。该部分<ESC>P
离开插入模式并将文本粘贴到花括号之间。这个和上一个一样,但是现在部分
3iw
指的是光标所在的单词和下一个单词(使用命令时iw
空格也算作单词,因此它3iw
代替了2iw
)。部分
"zyiw
将光标下的单词拉到寄存器中z
,部分w
将光标移动到下一个单词的开头,部分"xyiw
将光标下的新单词拉到寄存器中x
,部分ea
移动到单词的末尾并进入插入模式,部分\index{\|
键入\index{|
,部分<ESC>"xP
将寄存器的内容粘贴x
在和之间{
,|
部分l"zp
将光标向前移动一位并粘贴寄存器的内容z
,部分a}
插入最后一个}
。该部分
"zy
将视觉中的内容拉到寄存器中z
,该部分`>
将光标移动到视觉的末尾(刚刚在那里),该部分a\index{}
进入插入模式并输入\index{}
,然后该部分<ESC>"zP
将寄存器的内容插入z
花括号之间。
现在来解释一下最后一条命令。这条命令和其他命令一样。它的一部分"zyiw
将光标下的单词拖放到 register 中z
,另一部分f i
将光标移动到下一个空格处并将 Vim 置于插入模式,另一部分\index{}<ESC>"zP
将 index 命令与 register 的内容一起插入z
。