【发布时间】:2012-03-02 13:37:10
【问题描述】:
vimrc 示例文件下面有一行
inoremap Ctrl-u Ctrl-G u Ctrl-u
inoremap是什么意思,这条线的作用是什么?
【问题讨论】:
标签: vim
vimrc 示例文件下面有一行
inoremap Ctrl-u Ctrl-G u Ctrl-u
inoremap是什么意思,这条线的作用是什么?
【问题讨论】:
标签: vim
我也想知道这个。见http://vim.wikia.com/wiki/Mapping_keys_in_Vim_-Tutorial(Part_1)#Insert_mode_maps:
要映射仅在插入和替换模式下工作的键,请使用“imap”或“inoremap”命令。
示例:以下命令映射以插入当前缓冲区的目录名称:
:inoremap <F2> <C-R>=expand('%:p:h')<CR>
要显示当前定义的插入模式映射,请使用不带任何参数的“imap”命令:
:imap
要从插入模式中删除键盘映射,请使用 ':iunmap' 命令。例如,以下命令删除 .
的插入模式映射:iunmap <F2>
由于可打印键在插入模式下在当前缓冲区中插入字符,因此您应该使用不可打印键来创建插入模式映射。不可打印键的一些示例包括功能键、以 Ctrl 或 Alt 键为前缀的键。
[剪辑]
所以,例如,在我的 ~/.vimrc 我有
inoremap jk <ESC>
inoremap jj <Esc>
在插入模式下按下它会返回正常模式。
【讨论】:
有关该命令为何具有如此奇怪名称的更多信息,请参阅this excellent descriptionmap 和noremap 之间的区别。真的很高兴知道!
总结那篇文章,这里有一个选择引用:
*map命令的一个缺点是递归的危险......Vim 提供了另一组不使用映射的映射命令 当他们执行他们的操作时考虑到。
所以noremap 来避免可怕的映射递归,例如
:nmap dd O<esc>jddk
映射右侧的dd 递归到映射的左侧定义,Vim 陷入无限循环!
【讨论】:
vim:help inoremap 对此很有诗意:
:ino[remap] {lhs} {rhs} mapmode-i :ino :inoremap
:ln[oremap] {lhs} {rhs} mapmode-l :ln :lnoremap
:cno[remap] {lhs} {rhs} mapmode-c :cno :cnoremap
Map the key sequence {lhs} to {rhs} for the modes
where the map command applies. Disallow mapping of
{rhs}, to avoid nested and recursive mappings. Often
used to redefine a command. {not in Vi}
因此,它为 ^U 创建了一些插入模式映射,显示文件名(^G,撤消最近的更改(u),并将缓冲区向上滚动半屏(^U)。
我不知道为什么有人会想要这个特定的命令序列,除了演示inoremap 功能——^U 指的是创建定义时命令的含义,而不是回调进入重新定义的^U 映射。
【讨论】: