,并且在大多数情况下,原因非常相似。
我建议将此问题作为参考对于此类问题,请提供调试映射的完整过程。如果用户遇到映射问题
,可以将其重定向到此处,以消除最常见的问题。问题,此处将不解决。
#1 楼
您的映射未完成应做的工作或行为与预期的不同,请执行以下步骤来解决此问题:检查密钥是否已有效映射到应执行的操作
< brVim提供命令
:map
。默认情况下(未提供任何参数时),命令将显示当前创建的所有映射。这是命令结果的示例:
Doc一如既往是您的朋友:
:h map-listing
您可以在第一列中看到映射的模式(普通模式为
n
,可视模式为v
等),第二列显示映射的键,最后一列显示映射到的键。请注意,在映射的动作可能会出现一些其他字符之前,了解它们很重要:
*
表示不是可重映射的(即它不是递归映射,请参见此答案后面的know when to use nore
)&
指示仅脚本本地映射是可重映射的在寻求有关映射的帮助时,最好添加此信息
,因为它可以帮助其他人理解您的映射行为。
可以将提示限制为标准
@
的姐妹命令(例如
:map
,:vmap
,:nmap
等)的特殊模式。现在,将搜索限制为有问题的映射,您可以传递键
序列您正在调试作为命令的参数,例如:
:map j
:map <Leader>m
:map <F5>
请注意,
:omap
键将被列表中的实际值替换。如果命令的结果表明您的键已正确映射,则可能是
,该问题不是来自Vim,而是来自终端或桌面。
环境。请参见检查您的映射是否确实被Vim截获的部分。
如果命令的结果显示您的键未正确映射,请参见以下部分。
检查是什么覆盖了您的映射
<Leader>
命令的另一个方便用法是将其与:map
结合使用:这将提示最后一个修改了映射的文件。
例如,请参见以下两个屏幕快照,它们是
verbose
的结果:第一个是由my
:verbose map
修改的映射,第二个是由插件创建的映射:现在,如果您看到另一个脚本修改了映射,则必须查看是否可以删除它或修改其行为。 (请注意,某些插件提供了
变量来启用/禁用其映射,不幸的是,并非所有插件都可以做到这一点。)
如果最后一个更改映射的文件是您的
.vimrc
,请确保没有其他行也定义了同一键的映射。 .vimrc
文件将使用文件中的最后一个愉快地覆盖任何映射。不会拦截您的密钥:命令
.vimrc
显示您的密钥已正确映射,但按不执行任何操作。您的映射在gVim(GUI)上有效,但不起作用在终端Vim中
,您的映射可在定义的终端仿真器上运行,但不能在另一个操作系统上运行。
您的映射可在已定义的操作系统但不能在另一个OS上运行。
,可能是由以下原因之一以下两件事:
某些东西在Vim之前拦截了密钥:它可以是不同的应用程序:您的OS,您的桌面环境,您的终端仿真器,Tmux(如果您使用它)...
要解决此问题,您应该:
如果使用tmux,请尝试暂时删除
:map
请参考您的终端或桌面环境的文档。
您还可以参考姐妹站点,例如超级用户,
Unix和Linux,askUbuntu等...
如果这是问题,那么您有两个解决方案:要么花费
(很多时间)来更改导致问题的应用程序的行为,要么找到
另一个不会被其他应用程序拦截的映射键组合。尝试映射:
终端仿真器的实现方式不同,其中一些
无法处理某些特定的键组合。 (为什么
不能这样做的原因不在此问题的范围内,请参阅其文档或前面提到的
姐妹站点以获取更多详细信息。)
在此情况下,您没有很多解决方案:要么将您的
密钥更改为另一种可以由您的终端正确处理的密钥,要么您
更改您的终端仿真器。
检查常见的陷阱
映射中的一些问题经常发生,并且主要与vimscript语法有关。如果映射有意外行为,请记住检查以下几点:
不要在与映射相同的行上添加注释,而应在该行上添加注释以上。例如:
不要这样做:
inoremap ii <esc> " ii to go back into normal mode
Vim将空白,
.tmux.conf
和注释视为映射的一部分而是这样做:
" ii to go back into normal mode
inoremap ii <esc>
这更容易阅读,并且不会弄乱您的映射。
不要使用
"
传递命令。示例:不要这样做:
nnoremap <Leader>x :w | !% python -m json.tools
Vim会将管道
|
视为命令终止:当您为|
提供源代码时,将创建映射.vimrc
,然后将执行外部命令nnoremap <Leader>x :w
。 > nnoremap <Leader>x :w <bar> !% python -m json.tools
请参阅有关
!% python -m json.tools
的说明。知道何时使用
<bar>
:始终使用。 LearnVimscriptTheHardWay很清楚地解释了它:永远不要使用
nore
,map
,nmap
等...总是偏爱nore版本:vmap
,noremap
,nnoremap
等... vnoremap
代表nore
映射,这意味着即使重新映射它,映射的右侧也将被视为内置功能。例如:假设您要映射
non-recursive
删除行,并映射>
递增行的缩进。如果您不使用非递归映射,则可以执行以下操作:(请勿用于示例)
nmap > dd
nmap - >
当您点击>您的行将被删除,那很好。但是,当您点击时-您的行也会被删除而不是缩进。为什么?因为Vim理解“我收到了对
-
的点击,我应该将其翻译为-
,然后将其翻译为>
”。相反,请这样做
nnoremap > dd
nnoremap - >
这样,Vim会将
dd
转换为-
,并且由于>
而不会尝试进行任何其他翻译。将需要使用递归映射形式,但这并不是很常见。为了澄清起见,我将从这个答案中引用@romainl:仅当您打算在映射中使用任何其他映射时才使用递归映射。如果您不使用,则使用非递归映射。
Vim将其解释为另一个键。例如,
nore
与<C-h>
等效,如<backspace>
在法语键盘上,
<C-j>
与<enter>
相同,并且所有键都相同。 <M-a>
映射。正如@LucHermitte在评论中指出的那样,这是使用此类映射的插件问题,例如vim-latex。á
等同于<m-
。映射Ctrl +大写字母和Ctrl +小写字母是不可能的,这是终端发送ASCII码的方式。
当映射似乎影响另一个键时如果可以解决问题,请尝试使用其他lhs组合,检查将哪些十六进制代码发送到Vim。
检查是否正确定义了领导者:如果涉及
<C-S-a>
不起作用,并且您使用命令<C-a>
更改了领导者,请检查领导者的定义是否在映射定义之前完成。否则,Vim会尝试使用您认为不是的键来创建映射。另外,如果您想使用空格键作为领导者(这是最新的),请确保使用正确的符号:<leader>
您的映射仍然不起作用?
如果您已完成此答案的所有步骤,但映射仍无法正常工作,则可能需要在此站点上寻求帮助。
帮助人们提供帮助您记得要提供一些关键信息,例如:
用于定义映射的命令。
您希望映射执行的操作。
对问题的准确描述:
“不起作用”对将尝试帮助您的人并没有真正的帮助。如果映射没有执行任何操作,或者其行为与预期不同,则应进行精确调整。
还要表明您实际上已经按照此处描述的步骤进行操作,并且通过
mapleader
和let mapleader = "\<Space>"
获得的结果所有这些都可以为您和网站用户节省很多时间。 />有用的命令:
:map
有时重设映射而不用退出Vim来帮助调试其行为可能很有用。 br />为此,您可以使用命令
:verbose map
,该命令将删除分配给:unmap
的正常,可视和运行中待命模式的映射。 :unmap <key>
将删除插入模式的映射。有关其他模式,请参见<key>
。 />文档::iunmap
,:help :unmap
Vim常见问题解答的第20节是关于映射的,其中包含有趣的问题:
还有一个好处:关于最佳做法的问题查找在映射中使用哪些键
评论
按照主持人的建议与其他用户分享我的经验。并且因为在这里我看到很多问题,其中用户的映射不起作用,并且在大多数情况下,原因与我在问题的第一行中所说的非常相似,因此收集这些原因应该可以减少有关映射的重复问题数。
–statox♦
16年7月1日在5:35
vim-latex和法语键盘经常出现的问题:
–卢克·赫米特(Luc Hermitte)
16年11月3日,9:21
当我们使用:map {sequence}->询问缓冲区本地映射时,知道如何读取缓冲区本地映射也很重要。
–卢克·赫米特(Luc Hermitte)
16-11-3在9:23
有时我们真的很想调试发生的事情。通常,当映射调用插头映射或名称无法记住的函数或带有复杂参数的函数时。在这种情况下,我们可以执行以下命令::debug normal {keysequence}(没有爆炸声),或:debug i {keysequence}用于插入模式映射等。如果键序列包含特殊键(
–卢克·赫米特(Luc Hermitte)
16-11-3在9:28
关于元序列,这是FAQ的古老观点,因为vim-latex确实选择使用
–卢克·赫米特(Luc Hermitte)
16-11-3在9:33