效果圖來一個:
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/^[ |\t]*$//
或者g/^[ |\t]*$/d
去除windows編輯過的文件的換行符^M, "%s/\r/ ":
少量替換的推薦方法
其實很多時候可能僅僅需要對幾個變量做更改,范圍不大,調用這么銷魂的命令明顯得不償失。這種情況下,最快捷的方法還是將光標移動到要修改的變量名前(最好是通過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 根據自己的系統類型安裝其中的一個