VIM:可映射(未使用)的快捷键字母?

23

我想创建两个对我自己有效的映射:

map X ddp

我希望能够一次性删除并粘贴。

map X "_dw

如何删除一个单词而不将其复制到寄存器中。

不过我不想破坏任何现有的、有用的快捷键,所以我想知道能用哪些按键 - 有什么建议吗?我是不是太过小心谨慎了?

5个回答

24

vim的帮助文档有一个名为:he map-which-keys的部分

1.7 WHAT KEYS TO MAP                                    *map-which-keys*

If you are going to map something, you will need to choose which key(s) to use
for the {lhs}.  You will have to avoid keys that are used for Vim commands,
otherwise you would not be able to use those commands anymore.  Here are a few
suggestions:
- Function keys <F2>, <F3>, etc..  Also the shifted function keys <S-F1>,
  <S-F2>, etc.  Note that <F1> is already used for the help command.
- Meta-keys (with the ALT key pressed). |:map-alt-keys|
- Use the '_' or ',' character and then any other character.  The "_" and ","
  commands do exist in Vim (see |_| and |,|), but you probably never use them.
- Use a key that is a synonym for another command.  For example: CTRL-P and
  CTRL-N.  Use an extra character to allow more mappings.

See the file "index" for keys that are not used and thus can be mapped without
losing any builtin function.  You can also use ":help {key}^D" to find out if
a key is used for some command.  ({key} is the specific key you want to find
out about, ^D is CTRL-D).

如果您正在寻找控制键及其含义,您可能需要使用^V进行引用。您可以输入:help ^V^C以查找有关^C的帮助。(在玩具操作系统上,^Q可能有效。) - Brian
非常感谢!第三点注意事项(使用“,”)非常有帮助。它可以解锁数十个易于到达的空绑定。 - WalksB

13
许多Vim插件使用初始<Leader>来启动它们的键序列;这是一个(通常情况下)未使用的键,可以由用户进行配置。
 *<Leader>* *mapleader*
为了定义一个使用 "mapleader" 变量的 mapping,可以使用特殊字符串 "<Leader>"。它会被替换为 "mapleader" 的字符串值。如果 "mapleader" 没有设置或为空,则使用反斜杠代替。例如:
        :map <Leader>A  oanother line<Esc>
作用等同于:
        :map \A  oanother line<Esc>
但是在执行下面的命令后:
        :let mapleader = ","
它的作用就变成了:
        :map ,A  oanother line<Esc>
请注意,"mapleader" 的值在定义 mapping 时使用。更改 "mapleader" 对已经定义的映射没有影响。

10

在Vim中,每个ASCII字符(包括大小写)都被用于某种功能。因此,你最终会覆盖某些字符,所以选择不常用的字符进行覆盖。为自己的扩展使用常见的习惯用法可能有所帮助。例如,我使用前导逗号:

map ,w :w!<CR>
map ,e :e #<CR>
imap ,, <ESC>

(对我来说,最后一个特别有用,因为我几乎从不需要在插入模式下连续输入两个逗号,而且不必一直按 Esc 键也很好。)


这实际上是一个非常好的想法,我想我会复制它。 - hora
3
使用<Leader>代替硬编码的逗号将是首选方案。 - Thomas Hunter II
不想一直按Esc键吗?Ctrl + [ 是ESC的替代品。我发现这一点相当晚,但它改变了我的生活。 - joeljpa
你知道还有什么是你从来不用的吗?大写锁定键。将其重新映射为 Esc(或修饰键),你的生活将会变得更好,就像使用 hjkl 而不是箭头键一样微妙而无处不在。 (如果你确实使用 CapsLock,请将 Shift 设为锁定+锁定修饰键,而不是仅保持修饰键,这样你的生活也会变得更好,就像[...]一样微妙而无处不在。) - mtraceur

5
通常我使用控制键+ [字母] 或 alt + [字母] 进行大部分映射,这是安全的,但要注意 'w',因为它需要用于窗口命令。您可能还会对 arpeggio.vim 感兴趣,它可以让您创建同时按下多个键的映射 - 它将大大扩展您的映射可能性,而不会危及到其他映射。例如,您可以将 "dp"(同时按下)映射到执行 "ddp" 以一次命令中删除和粘贴。

刚开始使用arpeggio,到目前为止我很喜欢它。 - stephenmm

2

嗯,不要这样做。在创建映射时,尽量不要覆盖任何内容......不是因为您不使用被覆盖的命令,而是因为您可能有/将来会使用的某些插件正在使用它。

然后您再进行覆盖,接着您就需要担心了。

就我个人而言,对于像您举例的命令,我喜欢使用Ctrl +某些键组合。在vim中有很多免费的组合键,Ctrl附近左侧的字母组合起来很好。

顺便问一下,您想用这些映射做什么......我理解第二个(逐个删除单词),但第一个对我来说没有意义。它应该做什么?交换行吗?


一般来说,插件作者应该使用 normal!noremap。(但并不是每个人都这样做,我认为有些情况下他们不能这样做。) - idbrii
@pydave - 是的,应该在合适的地方使用它们。nmap/nnoremap都有其适当的用法,不应将任何一种视为万能方法。最好了解它们之间的区别。 - Rook

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接