效果图来一个:
http://vim.spf13.com/
这个网站里面的vim配置非常全,推荐.
下面是对这个vim快捷键总结:
<Leader> 是","
打卡一个二进制文件:
输入':', 然后输入'%!xxd'
调整窗体大小:变大Ctrl+Shift+'=',变小Ctrl+w+'-'
复制粘贴:
系统拷贝: " + y
系统粘贴: ctrl + shift + v
复制一行: 0y1y: 0跳转到行首,y1y复制一行,
复制一个单词: ye :从当前位置复制到单词的末尾.
复制某一部分: y2/foo 会一直复制到第二个foo出现的地方
只删除不剪切: 将删除的内容放入 black hole register "_ 中如 "_dd 就可以将当前行内容删除并且不会放在任何寄存器中。
删除: d0 删至行首。
d$ 删至行尾。
插入模式:
a
→ 在光标后插入o
→ 在当前行后插入一个新行O
→ 在当前行前插入一个新行cw
→ 替换从光标所在位置后到一个单词结尾的字符
Nerd Tree: ctrl + e只是显示nerdtree, 但是如果需要显示当前文件的nerd tree: ,nt
r – 刷新当前目录及所有子目录
R – 刷新当前根路径及所有子目录
关闭或开启缩进的dark/light模式: <leader>ig
窗口: ctrl + w切换窗口, 先键入ctrl + w然后再键入c:关闭窗口,
翻页: ctrl + u向上翻页, ctrl + f 向下翻页
跳转: 首先需要安装:sudo apt-get install exuberant-ctags , ctrl+ ]跳转到定义,ctrl + t反向跳转,
ctrl+d
向下翻页 d(down) , ctrl+u
向上翻页 u(p)
0:跳到当前行首, ^:跳到当前行的第一个字符.
fa→ 跳到这行a字母的下一个出现的地方。(对比 ; )会查找下一个(上一个)地方. 3fa→ 在这行中查找a出现的第三个位置.
gg: 回到顶部, shift + g 回到底部.
w: 跳转到下一个单词的开头,W:下一个单词(跳过标点), b: 跳到上一个单词, B:跳到上一个单词(跳过标点)e: 跳转到下一个单词的结尾.
%:跳转对应的"([{" 处.
*(对比#) : 跳到当前光标的下一个(上一个) 相同单词的地方
ctrl +o/i : 向后跳转,向前跳转.
如果有多处文件定义,首先实行":ts",然后选择定义的地方即可进入
区域选择:
J→ 让所有行连接在一起
<(对比>) → 向左(右)对齐.
注释多行: 先用^跳转到行首,然后Ctrl-v进入列编辑模式,然后往下到你要注释段的末行,按I,这时光标会跳回选区的第一行,输入注释符,然后按Esc,完工。
所选择的行的末尾添加一些东西:
-
-
-
- <C-v>
- 跳到目的行 (jjj 或者 <C-d> 或者 /patternor%等等…)
- $跳到行末尾
- A, 写入一些文本,[按] ESC 键.
-
-
行选择: shift + v
选中{}里面的内容: 把光标放在{或}上面,按回车键即可以选中括号里面的内容. 另外选中(), [] 还有ifdef 宏定义体内的内容都是使用回车键选中即可
展开折叠:
zm 关闭所有
zr 打开
zR 打开所有
zc 折叠当前行
za 打开当前折叠,再执行一次关闭当前折叠
zd 删除折叠
zD 删除所有折叠
NERD Commenter :
,ca :切换注释方式,比如C/C++ 的块注释/* */和行注释//
,cc :注释当前行
,c+空格 :切换注释/非注释状态
,cs :以”性感”的方式注释
,cA :在当前行尾添加注释符,并进入Insert模式
,cu :取消注释
TagBar :
<leader>tt打开当前文件的tag目录
surround: 修改包围符号,举例: 'hello'
输入cs'" 变成"hello"
输入 cs'<q>变成 <q>hello</q> , 然后再输入 cst' 变回'hello'
输入ds'删除包围符号,变成hello
输入ysiw'添加包围符,变成'hello'
输入yss' 整行添加包围符,变成'hello,world'
修改配色:
echo colorscheme 256-jungle > ~/.vimrc.local, 所有的配色保存在~/.vim/bundle/vim-colors/ 以及 ~/.vim/bundle/vim-colorschemes/ 两个目录中.
也可以直接在打开的vim中输入:color molokai 切换色彩主题.
我主要用到是C,推荐几个:kruby
查找文件: ctrl + p 启用ctrlp插件,可以查找当前目录的,
Press <c-f> and <c-b> 切换模式,Files, Buffers 和 MRU Press <c-d> 文件名查找. Press <c-r> 正则表达式模式查找.
替换命令:
1: s/old/new/ 把当前行中模式old的第一次出现替换为new
2: s/old/new/g 把当前行中的每一个old替换为new
3: 50,100s/old/new/g 把第50-100行之间的old替换为new
4: 1,$s/old/new/g 把整个文本中的old替换为new
5: %s/old/new/g 把整个文本中的old替换为new
6: 1,$s/old/new/gc 替换前要进行确认(想替换输入 y ,不想替换直接 回车)
- 删除行尾空格:
:%s/s+$//g
- 删除行首多余空格:
%s/^s*//
或者%s/^ *//
- 删除沒有內容的空行:
%s/^$//
或者g/^$/d
- 删除包含有空格组成的空行:
%s/^s*$//
或者g/^s*$/d
- 删除以空格或TAB开头到结尾的空行:
%s/^[ | ]*$//
或者g/^[ | ]*$/d
去除windows编辑过的文件的换行符^M, "%s/ / ":
少量替换的推荐方法
其实很多时候可能仅仅需要对几个变量做更改,范围不大,调用这么销魂的命令明显得不偿失。这种情况下,最快捷的方法还是将光标移动到要修改的变量名前(最好是通过search),cw
键入新的变量名Esc
,然后n
跳转到下一个match,然后.
重复替换操作……
当然如果你对Vim命令情有独钟,下面的命令一样解决问题:bufdo %s/pattern/replace/ge | update
针对所有的buffer(所有打开的文件)进行替换。还有更狠的:
:arg *.cpp #当前路径下的所有cpp文件
:argadd *.h #加上所有h头文件
:argdo %s/pattern/replace/ge | update #对arg中定义的所有文件执行替换操作
=也是一个好用的工具:
This is number X
This is number X
This is number X
This is number X
This is number X
This is number X
This is number X
然后冒号进入Command-line模式 (关于Vim的几种模式)
:%s@X@=line('.')
|
就得到了
This is number 1 This is number 2 This is number 3 This is number 4 This is number 5 This is number 6 This is number 7 This is number 8 This is number 9 This is number 10
=其实就是对=之后的表达式求值用来做替换。line('.')是一个返回数值的函数,返回当前行的行号,所以每一行的行号被作为=的返回值,用来替换X,就得到了需要的结果。
其他方法比如做一个宏(Macro)来逐行递增也可以达到效果,但是不如用这个=方便。
因为=后面的部分是作为表达式来处理的,所以更复杂一些的替换都可以很简单的得到实现,比如 (先撤销掉之前的改动,下同):
:%s@X@=line('.')*line('.')
|
就可以得到
This is number 1 This is number 4 This is number 9 This is number 16 This is number 25 This is number 36 This is number 49 This is number 64 This is number 81 This is number 100
我个人觉得最好用的是这个功能
:%s@X@=printf("%03d", line('.'))
|
可以得到
This is number 001 This is number 002 This is number 003 This is number 004 This is number 005 This is number 006 This is number 007 This is number 008 This is number 009 This is number 010
自动补全snippet:
比如,输入"for" 然后按tab键,用光标下键选择匹配的snippet,然后键入"ctrl + k"选择想要的snippet。snippet的格式中$1,$2分别表示按tab匹配$1,再按一次tab匹配$2.
surround插件操作:
"helloworld" -> ds"(删除"surrounding) -> helloworld
"helloword" -> cs") -> (helloword)
"helloword" -> cs"( -> ( helloword ), 所有surrounding符号左边的替换都会加上空格,右边的不会。
if *x>3 { -> ysW) ->if (*x>3) {, ys添加一个surround, w表示word, W表示WORD(被空格隔开的连续的字符串), p代表paragraph
fjdskfjkj fdjskfl fdskajfkl fdsaaf -> yss" -> " fjdskfjkj fdjskfl fdskajfkl fdsaaf"
ci[ ci( ci< ci{ 删除一对surrounding并进入插入模式继续编辑。
di: 剪切surrounding之间的文本; yi复制。 ca:同ci,但修改内容包括surrounding符号本身。 da, ya同, a均表示包含surrounding符号本身。
t 表示html/xml 的一对标签, 比如 <div>abc</div> ->dst -> abc
TAB替换为空格:
:set ts=4
:set expandtab
:%retab!
显示空格:
:b 27 -- buffer 切换跳转, 这个就是切换到编号27的buffer, 显示buffer可以使用ls命令。 27和b之间可以不加空格,另外加入27是test.c 输入"te"也是可以跳转过去的。
u 撤销上一步的操作
Ctrl+r 恢复上一步被撤销的操作
. 重复上一次操作
自动补全选择:首先用光标键选中需要补全的内容,然后ctrl + j,即可
显示变量和函数tag: <Leader>tt
nnoremap,inoremap,vnoremap
前缀代表生效范围
inoremap就只在插入(insert)模式下生效
vnoremap只在visual模式下生效
nnoremap就在normal模式下(狂按esc后的模式)生效
这样可以减少快捷键所用到的键位组合的个数
一个组合可以有多种用途 就不用费劲心思思考 该映射哪个没被绑定过的键了
出现的问题:
1. 升级到spf13 3.0版本,编辑模式 光标键变成 ABCD?
解决: 修改 .vimrc.before文件: let g:spf13_no_omni_complete = 1
2. 升级到spf13 3.0版本,提示:
neocomplete does not work with this version of Vim.
It requires Vim 7.3.885 or later with Lua support ("+lua").
解决: vim-nox
vim-gtk
vim-gnome
vim-athena 根据自己的系统类型安装其中的一个