vim 键盘映射 :nn 表示啥

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了vim 键盘映射 :nn 表示啥相关的知识,希望对你有一定的参考价值。

网上看到一个vimrc的配置,其中键盘映射没有用常用的:map,而是用了:nn,这是什么意思呢?

表示只在normol模式下有用。map表示所有模式适用。 参考技术A nnoremap
建议你 help nn或者help nnoremap

如何修改vim插件默认映射?

:map <space>x 输出如下:
n <Space>x *@:ToggleCheckbox<CR>

我想取消这个bullets.vim插件的映射,用这个键来干别的事,请问要怎么做呢?

一般情况下,你只要在 vimrc 里按你自己喜欢的方法定义 <space>x 这个映射就行了。因为 vimrc 最先加载,因此定义的映射也最早生效。其它插件在定义映射的时候,习惯上会用 :map <unique> 来避免覆盖已有映射,所以你不用担心自己定义的映射会被覆盖。

-----------------------------

正确编写的插件,上面的方法肯定奏效,一定要先试试看。

还有一些插件,提供了一些可以定义的选项来改变插件的行为,这就只能看插件的帮助文档(通常是英文的)来确定是不是有相关的选项了。但习惯上插件还是不能覆盖已有的映射。

再不行的话,最简单的建议就是不要用这个插件了。如果确实想用,可以看下面的做法,稍有些长。因为这一定程度上是在挽救别人插件的错误。

-----------------------------

你定义在 vimrc 里的映射如果被覆盖,说明插件没有遵循 vim 插件的一般原则。这时,除非你能比插件更晚定义映射,不然没有办法阻止插件覆盖你的定义。

    分两种情况,如果这个有问题的插件是一般插件(即是定义在 plugin 下),那么你可以在 vimrc 里加一个自动命令:

au VimEnter * :map <space>x  <something-you-want-to-do>

    VimEnter 这个事件是在 vim 完成启动后触发的,这时所有插件已经加载完毕。因此这时定义的映射,可以覆盖已有的定义。当然上面代码里 <something-you-want-to-do> 的地方要换成实际的定义。

    另一种插件是文件类型插件(定义在 ftplugin下),这些插件根据你编辑的文件按需加载,比如你编辑 file.c 时会加载对应 c 语言的插件,编辑 file.py 时会加载对应 python 的插件等等。这些插件在用的时候加载,因此加载的时机是不确定的。这时如果你想覆盖 c 语言插件定义的内容,需要在 after/c.vim 里加入你要定义的内容(如果没有这个文件你自己创建就好)。after 下的脚本会在其它相关的脚本加载之后再加载,所以可以覆盖已有的内容。c.vim 就用来覆盖 c 语言相关的内容。

    但这也不保证成功,因为现在的插件一般可以用 autoload 的机制来延迟加载。这时你没有办法预知代码何时会运行。习惯上不能在 autoload 中定义映射就有这个考虑。

    最后的办法,是找到定义映射的那个插件,然后手动改掉相关的定义。但这种做法有不确定性,比如乱改别人的代码可能会导致插件崩溃。像你这种只改个映射可能还好。最重要的是,作者可能不知道这个 bug,将来更新插件什么的,你改的东西又没了,还得再改一遍。因此改别人的代码是下策。


好在你知道这个映射是 bullets.vim 定义的,看名字可能是个普通插件,所以如果 vimrc 的方法不行,优先采用自动命令的方法试一试。

------------------------------------

顺带提一下,取消这个键映射后,你可以执行

:ToggleCheckbox

来完成这个映射本来的功能。


如果这个功能你觉得很常用,只是不习惯用默认的映射,可以在 vimrc 里加上:

nnoremap <key-sequence>  :ToggleCheckbox<CR>

<key-sequence> 那里换成你自己希望的键序列。


如果还有其它疑惑欢迎追问。

追问

说得很全面了,但是仍有点疑问,难道不是后加载的插件定义的映射会覆盖vimrc的映射吗?还是说vim识别到按键已被映射,所以插件映射配置不会生效?

追答

编写插件通常遵循的约定是:如果默认使用的按键已被映射,就不应覆盖。所以正常情况,你只要保证自己能最早定义就行了(写在 vimrc 里就能保证)。这个约定不是强制的,所以如果插件有特殊目的,或者写插件的人不知道这个约定,那么的确是后定义的覆盖前面的。

插件编写遵循的一般约定是:如果按键已用于其它映射,则不应覆盖。因此正常情况下,你只要保证自己的映射最早定义就行了(写在 vimrc 里就能保证)。这个约定是 vim 官方文档给的建议,但不是强制的。所以如果插件有特殊目的,或写插件的人不知道这个约定,那么的确是后定义的覆盖前面的。

插件编写遵循的一般约定是:如果默认的按键已用于其它映射,则不应覆盖。因此正常情况下,你只要保证自己的映射最早定义就行了(写在 vimrc 里就能保证)。这个约定是 vim 官方文档给的建议,但不是强制的。所以如果插件有特殊目的,或写插件的人不知道这个约定,那么的确是后定义的覆盖前面的。

追问

vimscript中如何判断按键是否已被映射?

追答

如果需要的话,用 mapcheck() 可以查。但插件一般只要用 :map 定义映射就行了。这样如果按键已经被定义,本次 map 会执行出错。插件可以选择把这个错误报告给用户,也可以不。

来自:求助得到的回答
参考技术A 你好,
先进入vim,然后输入:
:unmap <space>x

上面命令是解除"<space>x"映射
然后应该就可以重新使用map进行你自定义的映射了.
你先看一下行吗, 如果行的话,可以将上面解除绑定及自定义映射写入~/.vimrc文件,就不用每次打开vim都重新设置了.
希望对你有帮助,上面的描述我没有去试,你看看行吗?不行的话追问,咱一起研究研究

以上是关于vim 键盘映射 :nn 表示啥的主要内容,如果未能解决你的问题,请参考以下文章

VIM键盘映射 (Map)~转载

从零开始配置 vim—— 键盘映射进阶

从零开始配置 vim——键盘映射的一些技巧

ubuntu下Xmodmap映射Esc和Ctrl_L

Linux修改键盘映射

如何修改vim插件默认映射?