如何在Vim中映射键
在Vim中,键映射是将一组键或命令分配给特定键以执行特定任务的过程。例如,要使用ggVG命令选择文件中的所有行,必须按四个键才能完成。如果只按一下键呢?这就是Vim键映射派上用场的地方。键映射是一种在Vim中自动化许多经常执行的任务的方法。你一定听说过;如果某件事你做了两次以上,那就自动化吧!
在这个全面的指南中,我将解释如何在Vim中映射键来自动化操作。从创建基本键映射到高级键映射,以及使它们永久化和删除它们的过程。
- 语法
- Vim特殊参数
- 创建基本Keymap
- 列出键映射
- 使keymap永久存在
- 避免递归
- 创建特定于模式的键映射
- 如何映射鼠标事件
- 如何映射与领导键在Vim
- 如何映射一个Vimscript函数
- 如何在Vim中映射外部命令
- 如何在Vim中删除Keymap
- Vim Key Mapping Cheat Sheet
- 结论
语法
要在Vim中映射键,使用以下语法:
地图
在上面的语法中:
地图 | Nmap、imap、vmap、xmap、cmap或omap |
* | ,,,,和 |
左侧包含一个或一组要映射的键 | |
右侧包含一组将由左侧键执行的键或命令 |
本质上,是一个或一组键,用于执行命令或操作。
在上面的语法中,section是可选的。
Vim特殊参数
Vim特殊参数是用于为键映射提供附加功能的标签。这些参数出现在:map命令之后,在{rhs}和{lhs}之前。
例如,要创建一个特定于缓冲区的map,可以如下方式使用特殊参数:
:地图ggVG
抑制来自键映射的回显消息 | |
使映射特定于缓冲区(对当前缓冲区是唯一的) | |
表示映射是脚本或插件的一部分 | |
*它用于定义使用表示法进行映射的特殊键(功能键、控制键、shift键和其他非字母键) | |
它表示映射的左手边是一个表达式,需要对其求值以获得右手边 | |
使地图在本地和全球地图中独一无二 | |
跳过对映射中的下一个命令字符的等待 |
下面的图像中提到了Vim的特殊关键符号。
例如,如果您想在键映射中使用空格键,则将使用符号。
在Vim中创建一个基本的Keymap
让我们通过一个基本示例来理解Vim键映射。我想将选择所有行命令(ggVG)映射到ctrl+a键。为了映射ctrl+a键,我将在Vim中运行以下命令。
:地图ggVG
这里,表示ctrl和a键,而ggVG是选择文件中所有行的命令。默认情况下:map关键字用于正常模式映射,但是:nmap也可以显式地用于正常模式。
类似地,使用F1键映射行号切换功能:
:map:set number!
现在,当您按F1键时,将启用行号,再次按F1键将禁用行号。
请注意,此方法只映射当前缓冲区中的键,并将在关闭缓冲区时删除。
列出键映射
要列出普通、可视和操作挂起模式的所有键映射,请使用:map命令。
:地图
要列出插入模式和命令行模式的键映射,请使用:map!命令。
:地图!
要列出特定模式的键映射,只需在map关键字前键入mode的首字母。
: nmap | 显示正常模式的映射 |
: imap | 显示插入模式的映射 |
: vmap | 以显示地图的可视和选择模式 |
: smap | 显示选择模式的映射 |
: xmap | 显示可视模式的映射 |
:提出 | 显示命令行模式的映射 |
核心: | 显示操作符挂起模式的映射 |
此外,要列出所有映射,包括带有路径的插件映射,请使用:verbose map命令。
:详细的地图
对于特定的键,只需在命令(:verbose map)中提到该键。
使keymap永久存在
上面提到的键映射将只映射当前缓冲区中的键。为了使Vim密钥映射永久化,映射必须放在vimrc文件中。
注意,在vimrc文件中放置keymap时,不要在map命令前添加冒号(:)。
将keymap放入vimrc文件后,使用:wq命令或shift+zz键保存并退出。放在vimrc文件中的键映射是全局的,可以在所有Vim会话中使用。但是,如果某些键映射影响当前会话中的工作,则可以暂时禁用它们,请参阅下面如何在Vim中删除键映射一节。
vimrc是Vim的设置文件,包含各种命令和设置。它存在于macOS的/usr/share/vim/目录中,Linux的/etc/vim目录中。重要的是要注意,上述目录中的vimrc文件是系统特定的文件。您也可以编辑这些文件进行密钥映射,但我建议在主目录中创建一个特定于用户的vimrc文件。
避免递归
在继续之前,了解Vim键映射中的递归是很重要的。它的弊端和如何预防它。它可以通过一个例子来理解。
:map dd 3jdd
在上面的示例中,我将dd键映射为向下移动3行,并删除光标下的行。现在,当我按下dd时,它将尝试执行映射3jdd。Vim将dd命令解释为一个映射,并重复执行该映射,如下图所示。
注意:递归可以冻结Vim编辑器。按ctrl+c键解冻。
为了避免递归,将map关键字替换为noremap,其中' nore '表示非递归。我将用noremap替换map关键字,以修复上述keymap中的递归。
:noremap添加3jdd
我建议使用noremap而不是map,以避免意外地创建递归映射。
创建特定于模式的键映射
Vim使键映射非常通用,甚至可以很容易地创建特定模式的键映射。例如,如果您已经使用F1键为插入模式创建了keymap,那么您可以在另一种模式中为全新的操作映射相同的F1键。
在下面的示例中,我映射了F1键以在正常模式下删除3行,并在插入模式下猛拉3行。
: nmap 3 dd
: imap
当按F1键时,第一个映射在正常模式下删除三行,而在插入模式下使用相同的键时,第二个映射在当前行中添加一个缩进。现在,让我们来理解每种模式下的映射。
Normal Mode映射
要在正常模式下应用映射,只使用nmap关键字。例如,要使用ctrl+c键复制文件中的所有行,我将使用以下命令。
: nmap ggVGy
如前所述,使用非递归方法映射键是最佳实践,因此,我将用nnoremap关键字替换nmap。
: nnoremap ggVGy
将它放在vimrc文件中,不带冒号(:),使其成为永久键映射。
在下面的例子中,我将使用noremap而不是map。
插入模式映射
要映射插入模式的键,只需使用i而不是n。例如,在插入模式下,ctrl+p和ctrl+n键分别用于根据向后匹配和向前匹配自动完成单词。为了映射ctrl+p键和tab键,我将使用以下命令。
: inoremap
更重要的是,如果希望将操作符挂起模式命令映射到插入模式,则需要在右侧插入键以退出插入模式,以便执行这些命令。例如,在下面的keymap中,我想使用ctrl+x键删除3行并重新进入插入模式。
3: inoremap ddi
现在,当我按下ctrl+x键时,它将打印3ddi命令而不是执行它。
为了解决这个问题,我将在之前插入3ddi命令。
3: inoremap ddi
现在,该命令将执行保持插入模式。
许多迷你笔记本电脑没有Esc键,Esc键对于退出当前模式很重要。因此,要映射Esc键以退出插入模式,可以使用键映射。在下面的示例中,我使用ex键退出到正常模式。
: inoremap交货
当您快速按下ex键时,插入模式将退出,从而进入正常模式。
可视模式映射
可视化模式是在Vim编辑器中选择文本的一种非常重要的模式。视觉模式除了基本的选择外,还有视觉线条、视觉块等不同的模式。
在可视模式下,使用波浪号(~)来切换大小写。要使用波浪(~),您必须按两个键(shift+~)。在下面的示例中,我在可视模式下映射c键以选择光标下的单词并更改其大小写。
:vnoremap c ~
现在,按v键进入可视模式,按c键切换光标下的单词,如下图所示。
命令行模式映射
许多Vim基本命令只能在命令行模式下工作。例如,保存文件使用:w命令,同样,保存和退出使用:wq命令。所有制表符和拆分操作也都是在命令行模式下完成的。例如,为了创建一个新的选项卡,使用:table命令。要快速创建一个选项卡,ctrl+t键就足够了。
: cnoremap课程
现在,按冒号(:)进入命令行模式,然后按ctrl+t打开一个新选项卡;它比键入整个表命令和返回键要快得多。
创建Vim自定义命令
进入命令模式来执行映射似乎不太有用。但是您可以使用:command选项在Vim中创建自己的自定义命令。这个特性非常类似于Vim键映射。例如,要创建一个快速命令,将行号和文本宽度设置为80。
:命令Mycmd:set number textwidth=80
现在,进入命令模式并执行:Mycmd命令。
操作挂起模式映射
Operator pending mode是指Vim在按下Operator键后等待动作命令的模式。常见的操作符是y, d和c。例如,要删除当前行和以下3行,您将使用具有3j运动的d操作符(d3j)。您不能同时按下这些键来实现所需的操作。
该模式通常用于映射运动。让我们映射一个运动,它将选择当前的线和它后面的3条线。
j: onoremap 3
现在,要使用yF2键拖动当前行和其后的3行,以同样的方式,也可以应用d操作符。
另一件要记住的重要事情是,如果你给上面提到的映射运动添加一个计数,比如2,映射将把它当作23j,而不是6j。要解决这个问题,可以使用表达式register " =。上面的映射可以修改为@= ' 3j '。
: onoremap @ = ' 3 j '
如何映射鼠标事件
虽然Vim是一个完全可定制的以键盘为中心的文本编辑器,但鼠标功能的可用性使它更好。除了普通的键盘键,所有的鼠标事件也可以在Vim中映射。例如,如果要映射右双击和左双击分别向前和向后跳转标记,则使用以下映射。
: noremap]“
: noremap ['
下表给出了可以映射的其他鼠标事件。
如何在Vim中映射领导键
没有先导键的Vim映射是不完整的。领导键是可用于映射键的默认键,即使它们被映射为执行其他任务也是如此。例如,如果您映射了d键来删除所有行,那么我们可以映射相同的键来使用首键只删除5行。
对于那些不熟悉Vim领导键的人来说。它是一个以另一个键或一组键为前缀的键,用于映射命令或操作。Vim的默认领导键是一个反斜杠(),但它是可定制的。
例如,dd命令用于删除光标下的行。如果您想映射dd命令来删除文件中的所有行,那么您可以使用先导键。
noremap添加ggVGd
现在,无论何时按下dd键,文件中的所有行都将被删除。您可以将Vim领导键属性为Windows上的控制键或macOS上的命令键。
如何映射一个Vimscript函数
Vim编辑器并不局限于命令或操作。围绕Vim有一种完整的编程语言来创建自定义功能,称为Vimscript。您可以轻松地创建脚本或函数并将其映射到键。例如,让我们创建一个函数来启用行号、鼠标功能和文本宽度等设置。
MySettings()函数
设置数量
设置鼠标=一个
设置textwidth = 80
endfunction
将这个函数放在vimrc文件中。
让我们将这个函数映射到前导键和s键。我将使用
调用MySettings()
现在,只要您按下s键,就会调用该函数,并执行该函数中的任何功能。
注意:在Vim中创建自定义函数时,函数名的第一个字母应始终大写。
如何在Vim中映射外部命令
外部命令也可以映射到Vim中。外部命令指Linux或Unix命令。例如,如果您希望将外部排序命令映射到F1键来对当前缓冲区中的所有行进行排序,则使用以下命令。
: noremap: % !排序
同样,如果您正在编写脚本文件并使其可执行而不离开Vim会话,则可以在内部使用chmod命令。例如,要使当前文件可执行,可以执行命令:!chmod +x %在Vim。如果您经常执行此任务,那么只需将一个键映射到它。
: noremap: !Chmod +x %
在Vim中,任何外部命令都可以带感叹号(!)。
如何在Vim中删除Keymap
要删除Vim中的键映射,首先确定它的定义位置。如前所述,键映射可以是缓冲区本地的和永久的。如果keymap是永久性的,并且放置在vimrc文件中,那么只需从文件中删除它们就可以取消键映射。
如果映射是在当前缓冲区中完成的,那么可以使用:unmap或:unmap!命令。
- :unmap清除普通模式、可视模式、选择模式或操作挂起模式的键映射
- :映射!清除插入模式和命令行模式的键映射
例如,要删除键,请使用:unmap。此外,键的删除可以是特定于模式的。如果要删除法线模式映射,请使用:nunmap。其他用于删除keymap的特定于模式的命令如下:
: nunmap | 删除正常模式的映射 |
: iunmap | 删除插入模式的映射 |
: vunmap | 删除可视和选择模式的映射 |
: sunmap | 删除选择模式的映射 |
: xunmap | 删除可视模式的映射 |
: cunmap | 删除命令行模式的映射 |
: ounmap | 删除操作符挂起模式的映射 |
需要删除当前缓冲区中的所有映射,使用:mapclear命令。
: mapclear
上述命令将清除正常、可视、选择或操作符挂起模式的所有键映射。
要清除插入模式和命令行模式的所有键映射,请使用:
: mapclear !
请注意,默认的Vim命令不能清除,但是可以使用:unmap命令禁用。例如,如果要禁用删除光标下行的dd功能,则使用:unmap dd。
:映射弟弟
dd将不再在当前缓冲区中起作用。使用此方法,可以为当前会话禁用任何keymap。
Vim Key Mapping Cheat Sheet
下面的图像提供了所有命令及其特定模式的列表,以供参考。
结论
Vim键映射是自动化任务、常用键绑定、命令和其他操作的方便方法。这是一个多样化的主题,在本指南中,我涵盖了与Vim中的键映射相关的所有主要方面。从一般语法到创建基本的keymap,再到映射高级Vimscript函数和外部命令。要了解有关Vim键映射的更多信息,请使用Vim中的:help key-mapping命令。