如何在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命令。