e, ge, E, gE 以word为单位移动到word末字母, 大写则以空格跳转
fx, Fx 当前行移动到下一个x字符, 大写向反方向, ;重复, ,反向重复
tx, Tx 同f, 但将光标停留在x前一个字符上, 大写反方向, ;重复, ,反向重复
% 匹配括号
^, $ 行首,行尾
9G 跳到9行
9% 跳到9%行
H, M, L 首行, 中间行, 尾行
CTRL-G 显示当前第几行
CTRL-U, CTRL-D 向上向下半屏移动
CTRL-E, CTRL-Y 向上向下滚动一行
CTRL-F, CTRL-B 向上向下整屏滚动
zt, zz, zb 将当前光标行置为屏幕顶端, 中央, 底端
/, ?, n, N 搜索, 反向搜索, 跳目标, 反向跳目标
/\<the\> 字符串边界搜索,不会匹配there
*, #, g*, g#搜索/反向搜索光标处字符串默认使用<>, g*, g#不会使用<>
ma, `a, ‘a 标记a, 精准跳转到a, 跳转到a
:marks 查看所有标记
:marks a 查看a标记
d4w 删除4个单词, etc
c 类似d, 但执行后进入insert模式
x 代表dl(删除当前光标下的字符)
X 代表dh(删除当前光标左边的字符)
D 代表d$(删除到行尾的内容)
C 代表c$(修改到行尾的内容)
s 代表cl(修改一个字符)
S 代表cc(修改一整行)
daw, diw 当光标位于word中间删除这一个word, aw, iw是文本对象, 包括/不包活空白字符
~切换字母大小写
gU, gu, g~ 改变大小写
rx, 5rx 替换单个字符为x, 替换5个字符为x
. 重复上次命令
v, V, CTRL-V, o, O 区块, 行区块, 矩形区块, 跳区块行头, 区块行头尾
y, Y, p, P 复制, 粘贴
"XNyy //复制N行到X粘贴板
"Xp //使用X粘贴板
:1,5left [width] 1-5行左对齐, center, right, width为空则去textwidth或80
zf, zo,zO, zc,zC 创建, 打开,打开所有 关闭,关闭所有折行
<, >, =, gg=G 左移, 右移, 格式化, 全文格式化
g CTRL-G 统计字数
R 进入替换模式
I 行首插入模式
A 行尾插入模式
:w, :wall 保存, 保存所有窗口
:e! FILE 不保存本文件编辑新文件
:sp, :vs [FILE]开新窗口split, 垂直分割 vsplit
:new, :vnew开空新窗口
:q, :qall 退出, 退出所有窗口
CTRL-W HJKL 移动窗口
]c, [c vimdiff跳到前一个/后一个不同之处
qa--q, qA--q, @a, @@ 记录命令到a,追加命令到宏a 使用宏a, 重复上次宏
:%s/FILE/REPLECE/g 替换
s只作用本行第一个
1,5s 1-5行
5s 5行
.+3,$-3s 当前行+3行到最后一行-3行
'a,'bs 标记a到标记b
%作用所有行
g修饰符 一行所有
c修饰符 确认, y, n, a(别问了, 全换), q(停止吧), l(替换这个后退出), CTRL-E(上滚屏), CTRL-Y(下滚屏)
:g/PATTERN/COMMAND 全局匹配并作用命令
! 执行外部命令
:read !ls 读取命令输出
:write !wc 将文本写入一个命令
:mksession a.vim 保存会话
vim -S a.vim 恢复会话
gf 将光标放在文件名字符串上gf会直接寻找并编辑, 如果是internet上的他会自动下载并编辑
:X, vim -x a.c 加密文件, 输入空密码停止加密
CTRL-P 自动补全
变量
let a = 1
let a = 'hello'
let a = "hello" #与上你懂的
let a = hello
unlet a
$name 环境变量名
&name vim选项名
@r vim寄存器名
b:a 局部缓冲变量
w:a 局部窗口变量
s:a 局部该脚本变量
g:a 全局变量
v:a 预定义变量
echo "hello" a
if a<9
...
else
...
endif
? : #三目
字符串包含
a =~ b a包含b
a !~ b a不包含b
while a<9
...
endwhile
continue
break
function a(a,b,c) return a
...
endfuncion
call a(...)
let a = a(...)
function! a() #定义个已经定义过的函数
function a(a, …) #不定参数 a:0 实际参数个数 a:1第一个参数
try
…
catch /E484:/
…
finally
...
endtry
exists(“a”) 判断变量a是否存在
sleep 1 睡1秒 50m 50毫秒
execute 执行一个表达式
finish 什么不干
plugin.vim 插件
plugin.txt 文档
内置函数
字符串函数
当前缓冲区操作
系统函数和文件操作
缓冲区, 操作和参数列表
折行
语法高亮
历史列表
交互操作
vim服务器
其他
映射from: http://www.douban.com/group/topic/10866937/
有五种映射存在
- 用于普通模式: 输入命令时。
- 用于可视模式: 可视区域高亮并输入命令时。
- 用于操作符等待模式: 操作符等待中 ("d","y","c" 等等之后)。
见下: |omap-info|。
- 用于插入模式: 也用于替换模式。
• 用于命令行模式: 输入 ":" 或 "/" 命令时。
下表是map绑定中,对应的模式代号。现在先了解一下,等看完之后再回过头看这个模式代号就会明白了。
字 符 模 式 ~
<Space> 普通、可视、选择和操作符等待
n 普通
v 可视和选择
s 选择
x 可视
o 操作符等待
! 插入和命令行
i 插入
l 插入、命令行和 Lang-Arg 模式的 ":lmap" 映射
c 命令行
我主要讲解一下“n(普通模式)”下的两个绑定命令,等看完之后就对应的明白别的模式下的命令了。
适用于普通模式的映射命令主要有:
1. :map
[语法] :map {lhs} {rhs} |mapmode-nvo| *:map*
1.1 作用模式: n、v、o (普通、可视和选择、操作符等待)
1.2 命令格式:
:map {lhs} {rhs}
含义: 在:map作用的模式中把键系列 {lhs} 映射为 {rhs},{rhs}可进行映射扫描,也就是可递归映射。
1.3 举例:
:map td :tabnew .<cr>
含义:在其作用模式(普通、可视、操作符)下,输入td等价于输入 :tabnew . <cr>。而普通模式下输入:tabnew . <cr>就是打开当前目录
如果再定义绑定 :map ts td,就是指在其作用模式下输入ts等价于td,也就是打开当前目录。不过如果没有特殊需要,一般不建议递归映射。
2. :noremap
:moremap和:map命令相对,作用模式和命令格式都相同,只不过不允许再对{rhs}进行映射扫描,也就是{lhs}定义后的映射就是{rhs}的键序列,不会再对{rhs}键序列重新解释扫描。它一般用于重定义一个命令,当然如果:map不需要递归映射的话,建议试用:noremap
比如:
:noremap ts td
它的意思是在其作用模式下,输入ts就是输入td,但是和:map不同的是,此时td再不会做进一步扫描解释。虽然之前已经定义了td,但是不会对td再做扫描
3. :unmap
:unmap是对应取消:map绑定的{lhs},作用模式相同,命令格式 :unmap {lhs}。
例如:
:unmap td
就是取消在其作用模式中td的绑定,比如之前td被绑定为:tabnew .<cr>,此时此绑定消失。
4. :mapclear
:mapclear时对应取消所有:map绑定的,慎用!
5. :nmap
:nmap是:map的普通模式板,也就是说其绑定的键只作用于普通模式。
例如:
:nmap td :tabnew .<cr> 和 :map td :tabnew .<cr> 在普通模式下等效
6. :nnoremap
:nnorempa和:nmap的关系和:noremap和:map的关系一样,只是:nmap的非递归版
7. :nunmap
:nunmap和:nmap的关系和:unmap和:map的关系一样,取消:nmap的绑定。
8. :nmapclear
:nmapclear是对应取消所有:map绑定的,慎用!
看完以上,应该可以发现一个规律,前4个是一组,后4个时一组,后一组比前一组多一个n就是指只作用于普通模式。其中每组内*nore*是其对应的非递归版、*un*是取消绑定某个<lhs>绑定、clear后缀是取消所有绑定。发现了这个规律,再翻到前面的模式代号表,你大体可以猜到vmap、xmap、smap、omap是什么意思了吧,以及相对应的nore版本、un版本、clear版本。
另外:
{rhs} 之前可能显示一个特殊字符:
* 表示它不可重映射
& 表示仅脚本的局部映射可以被重映射
@ 表示缓冲区的局部映射
到这一步你可以轻松的长吸一口气,因为相关的命令已经都了解了,记不住没关系,可以随时:help map一下。不过别急,后面还有map更多的选项等着去攻克。
键表 |key-notation|
<k0> - <k9> 小键盘 0 到 9 *keypad-0* *keypad-9*
<S-...> Shift+键 *shift* *<S-*
<C-...> Control+键 *control* *ctrl* *<C-*
<M-...> Alt+键 或 meta+键 *meta* *alt* *<M-*
<A-...> 同 <m-...> *<A-*
<t_xx> termcap 里的 "xx" 入口键
特殊参数:
1. <buffer>
2. <silent>
3. <special>
4. <script>
5. <expr>
6. <unique>
它们必须映射命令的后边,在其他任何参数的前面。
<buffer>如果这些映射命令的第一个参数是<buffer>,映射将只局限于当前缓冲区(也就是你此时正编辑的文件)内。比如:
:map <buffer> ,w /a<CR>
它的意思时在当前缓冲区里定义键绑定,“,w”将在当前缓冲区里查找字符a。同样你可以在其他缓冲区里定义:
:map <buffer> ,w /b<CR>
比如我经常打开多个标签(:tabedit),想要在各自标签里定义",w"键绑定,那么你只要在每个标签页里分别定义就可,其作用域也只在各自的标签里。同样要清除这些缓冲区的键绑定也要加上<buffer>参数,比如:
:unmap <buffer> ,w
:mapclear <buffer>
<silent>是指执行键绑定时不在命令行上回显,比如:
:map <silent> ,w /abcd<CR>
你在输入,w查找abcd时,命令行上不会显示/abcd,如果没有<silent>参数就会显示出来
<special>一般用于定义特殊键怕有副作用的场合。比如:
:map <special> <F12> /Header<CR>
<unique>一般用于定义新的键映射或者缩写命令的同时检查是否该键已经被映射,如果该映射或者缩写已经存在,则该命令会失败
<expr>. 如果定义新映射的第一个参数是<expr>,那么参数会作为表达式来进行计算,结果使用实际使用的<rhs>,例如:
:inoremap <expr> . InsertDot()
这可以用来检查光标之前的文本并在一定条件下启动全能 (omni) 补全。
一个例子:
let counter = 0
inoremap <expr> <C-L> ListItem()
inoremap <expr> <C-R> ListReset()
func ListItem()
let g:counter += 1
return g:counter . '. '
endfunc
func ListReset()
let g:counter = 0
return ''
endfunc
在插入模式下,CTRL-L插入顺序的列表编号,并返回;CTRL-R复位列表编号到0,并返回空。
<Leader> mapleader
mapleader变量对所有map映射命令起效,它的作用是将参数<leader>替换成mapleader变量的值,比如:
:map <Leader>A oanother line<Esc>
如果mapleader变量没有设置,则用默认的反斜杠代替,因此这个映射等效于:
:map \A oanother line<Esc>
意思时输入\A键时,在下一行输入another line并返回到普通模式。
如果设置了mapleader变量,比如:
let mapleader = ","
那么就等效于:
:map ,A oanother line<Esc>
<LocalLeader> maplocalleader
<LocalLeader>和<Leader>类似,只不过它只作用于缓冲区。
因此在设置mapleader和maplocalleader时最好区分开,不要出现冲突。
大体上映射的主要部分已经都提到了,还有很多具体的映射相关的内容可以参见:help map