以下命令若在vim/gvim中执行前面需要加冒号“:
”,在.vimrc文件中添加时不需要。
map
map可以理解为快捷键,合理的快捷键可以为我们省下不少时间。
比如
map - dd
在normal模式当你按下-
时,会删除一整行(等于执行了dd
)。
map就是让你用少量,便于按的键来代替比较多、繁的键。
如果你想用到一些特殊字符,比如空格就是<space>
,ctrl键+c键就是<c-c>
。
Q:如果想-
键实现把整行先删除再粘贴在下一行(即把整行下移一行)怎么办?
A:map - ddp
Q:如果想_
键实现把整行上移一行怎么办?
A:map _ ddkP
(实现方法不唯一)
nmap,imap与vmap
前面我们把-
键映射了dd
,但当你进入插入模式(insert)时,你按下-,只是插入了dd这两个字符,而不是删除整行,该如何解决。
imap - <esc>ddi
我们知道,vim有三种模式,normal,visual,insert,与此对应,nmap,vmap,imap就是在某一模式下的映射。所以我们如果想在insert模式下让-键删除一行,需要先退回normal模式,再dd
,再按i
进入insert模式。
Q:visual模式下,U
可以把小写转换为大写,iw
可以选中整个单词,怎么让<c-u>
在normal与insert模式下实现把整个单词全部变为大写?
*noremap
假设你写了这么一条map
nmap dd O<esc>jddk
如果你执行dd
会发生什么?由于映射双方都有dd
,会无限循环。当执行完O<esc>j
后又执行dd(即执行O<esc>jddk
)
而*noremap
(Nonrecursive Mapping)就是解决这个问题,当后面被映射的键映射其它键时,*noremap
命令会使其在该map中失效,也就是dd
仍然只是删除一整行命令。
那么上面的例子可以这样写
nnoremap dd O<esc>jddk
tips:如果你对上面这个映射不满意,在.vimrc中可以直接删除该行,但在vim中如何直接(暂时)取消?
nunmap dd
Leaders
在windows中有些组合键,比如win+d可以关闭所有窗口,win+l可以锁屏,而leader就有点像win键,告诉vim:我要用快捷键了。事实上,我们不关心这个leader是什么,只是需要这么一个“前缀”。(该类比并不恰当,windows中组合键需要一起按,leader只是个前缀,先按leader再按其它的键即可)
设置leader
let mapleader = ","
这样我们就把逗号设置为mapleader(逗号是惯例,比较容易按,也不会影响原来的功能)。然后你就可以这样设置:
nnoremap <leader>d dd
这样你只需要按下,d
就等于执行了dd
为什么不写死呢,把逗号写进去?程序猿都知道,设为变量总是比常量写死更方便,以后容易替换;别人在复制你的配置时,马上知道这是一个leader,他就容易改为他习惯的;在许多vim插件中也会用到leader。
还有一种leader,“local leader”,你可以把这两个leader设为相同或者不同
比如
let maplocalleader="\\"
这个localleader的意义往往是你想在某一种特殊文件中用一个leader,比如html,python,(不同的编程语言频繁的操作也会有差异),会 方便不少。
文章整理翻译自Learn Vimscript the Hard Way