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/