Vim中remap、noremap、nnoremap和vnoremap映射命令的区别
Vim中remap、noremap、nnoremap和vnoremap映射命令的区别
技术背景
Vim 是一款强大的模态编辑器,有多种模式,如正常模式、可视模式等。为了提高编辑效率,用户可以自定义按键映射。而 remap
、noremap
、nnoremap
和 vnoremap
这些命令在按键映射中起着关键作用,理解它们的区别对于 Vim 配置至关重要。
实现步骤
1. 理解 remap
选项
remap
是一个选项,用于使映射递归工作。默认情况下是开启的,一般建议保持默认。
2. 区分递归和非递归映射命令
- 递归映射命令:
:map
及其相关命令(如:nmap
、:vmap
等),在映射时会递归展开。例如:
1 |
|
这里 Q
会被映射到 gg
,因为 j
会在递归映射中被展开。
- 非递归映射命令:
:noremap
及其相关命令(如:nnoremap
、:vnoremap
等),映射时不会递归展开。例如:
1 |
|
W
会被映射到 j
,而不会进一步展开到 gg
。
3. 考虑不同模式
Vim 的映射命令可以针对不同模式使用。模式字母有:
n
:仅正常模式v
:可视和选择模式o
:操作符待决模式x
:仅可视模式s
:仅选择模式i
:插入模式c
:命令行模式l
:插入、命令行、正则搜索等模式
例如,:nnoremap
用于正常模式的非递归映射,:vnoremap
用于可视和选择模式的非递归映射。
核心代码
以下是一些示例代码,展示不同映射命令的使用:
1 |
|
在这个例子中,按下 K
会先展开到 H
,再展开到 G
并停止,最终执行 G
的功能(跳转到最后一行)。
最佳实践
- 尽量使用非递归映射命令(如
:noremap
系列),以避免意外的递归展开导致的问题。 - 对于不同模式的映射,使用特定模式的映射命令(如
:nnoremap
、:vnoremap
等),提高映射的精确性。
常见问题
1. 为什么我的映射没有按预期工作?
可能是使用了递归映射,导致映射被意外展开。可以尝试使用非递归映射命令。
2. 如何映射到所有模式?
需要同时使用 :map
(适用于正常、可视、选择和操作符待决模式)和 :map!
(适用于插入和命令行模式)。
Vim中remap、noremap、nnoremap和vnoremap映射命令的区别
https://119291.xyz/posts/difference-between-vim-mapping-commands/