日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

程序員用 vim 編輯代碼的常用技巧

 herowuking 2014-04-10

程序員用 vim 編輯代碼的常用技巧

在oschina看到不錯(cuò)的vim技巧文章,讀了之后vi水平大有提高呵呵。 總結(jié)一下寫代碼的常用vi的命令,以后繼續(xù)總結(jié)到這里來吧。大家有什么好的技巧也可以教我一下。

 

   

-----------基本動(dòng)作--------------

i     切換到插入模式,在光標(biāo)之前

a     切換到插入模式  在光標(biāo)之后,自己體會(huì)和i的區(qū)別吧

I     切換到插入模式,光標(biāo)在行的開始

A     切換到插入模式  光標(biāo)在行的結(jié)尾


v  進(jìn)入 visual mode ,選擇模式?

R  進(jìn)入替換模式,輸入的文字直接覆蓋替換光標(biāo)下的字符。 直到按<Esc>建退出。


<Esc>  退出輸入模式,

 

:w    保存文件

:w  newfilename  文件另存為

:q    退出編輯

:wq   保存并退出

:edit  打開另外一個(gè)文件, 可以用<TAB> 補(bǔ)全


u     undo  取消上次修改

ctrl + R    redo 重復(fù)上次修改


:help   后面加上某個(gè)命令,查看vim的幫助文檔

 

--------------編程常用設(shè)置--------------------

:set nowrap  / set wrap   "禁止自動(dòng)換行/啟用自動(dòng)換行  有時(shí)候不自動(dòng)換行看起來更清楚一些

:set number   "顯示行號(hào)

:set tabstop=4    "設(shè)置tab的寬度

:set shiftwidth=4  "設(shè)置自動(dòng)縮進(jìn)的的寬度

:syntax on   "語法高亮

:set filetype=c    "如果文件擴(kuò)展名不是 c,可以用這個(gè)為vim指定文件格式。

:set cindent    "啟用 C 的自動(dòng)縮進(jìn)

:set colorcolumn=80    "設(shè)置代碼一行最多80字符長度的可視邊界,7.3版本以后可用。

"不大常用的tab相關(guān)設(shè)置 :set softtabstop=4 ,:set smarttabs,  :set  expandtab   把插入的tab 都轉(zhuǎn)換成空格  , 還有retab等,按照設(shè)置重新轉(zhuǎn)換tab ? (用法 :%retab8 )  ,

 "突出顯示當(dāng)前行 set nocursorline

set cursorline

" 自動(dòng)切換當(dāng)前目錄為當(dāng)前文件所在的目錄

set autochdir

" 允許在有未保存的修改時(shí)切換緩沖區(qū),此時(shí)的修改由 vim負(fù)責(zé)保存

set hidden

 set nobackup  "禁用vim的自動(dòng)備份文件功能

" 搜索時(shí),高亮顯示搜索到的單詞


set hlsearch

colorscheme evening    "設(shè)置代碼高亮 的 顏色配置方案為  evening 

"我比較喜歡下面這幾種配色,都可以在網(wǎng)上找到吧 monokai  evening  twilight  vividchalk  freya  spiderhawk   

colorscheme monokai  "我覺得這個(gè)最好看了


set exrc  "設(shè)置vim加載所有目錄下.vimrc文件,這樣每個(gè)工程目錄就可以有自己的自定義設(shè)置了。


set secure  '限制上一步設(shè)置里面的目錄下的vimrc不能使用某些不安全的命令



很多配色方案可以到vim網(wǎng)站去找,不過這里也有個(gè)抓屏,查看方便

VIM Color Scheme Test 

http://vimcolorschemetest./svn/html/index-c.html



設(shè)置編碼, 參考 正確設(shè)置 Vim 的字符編碼選項(xiàng) http:///vim-gvimvim-on-win32

set encoding=utf-8  這個(gè)設(shè)置了之后會(huì)在文件結(jié)尾加上編碼標(biāo)志,只是gvim內(nèi)部使用的? 我看有問題再設(shè)置這個(gè)選項(xiàng)好了

set fileencoding=

上面的設(shè)置可以直接執(zhí)行也可以放到vimrc文件里面去,以便每次啟動(dòng)時(shí)有效??梢韵旅孢@個(gè)加到vimrc方便使用

 編碼設(shè)置相關(guān)設(shè)置的說明: 來自 http://wensuper./blog/1495384

       encoding(enc):encoding是Vim的內(nèi)部使用編碼,encoding的設(shè)置會(huì)影響Vim內(nèi)部的Buffer、消息文字等。在Unix環(huán)境下,encoding的默認(rèn)設(shè)置等于locale;Windows環(huán)境下會(huì)和當(dāng)前代碼頁相同。在中文Windows環(huán)境下encoding的默認(rèn)設(shè)置是cp936(GBK)。 
        fileencodings(fencs):Vim在打開文件時(shí)會(huì)根據(jù)fileencodings選項(xiàng)來識(shí)別文件編碼,fileencodings可以同時(shí)設(shè)置多個(gè)編碼,Vim會(huì)根據(jù)設(shè)置的順序來猜測所打開文件的編碼。 
        fileencoding(fenc):Vim在保存新建文件時(shí)會(huì)根據(jù)fileencoding的設(shè)置編碼來保存。如果是打開已有文件,Vim會(huì)根據(jù)打開文件時(shí)所識(shí)別的編碼來保存,除非在保存時(shí)重新設(shè)置fileencoding。 
termencodings(tenc):在終端環(huán)境下使用Vim時(shí),通過termencoding項(xiàng)來告訴Vim終端所使用的編碼。 
        termencodings(tenc):在終端環(huán)境下使用Vim時(shí),通過termencoding項(xiàng)來告訴Vim終端所使用的編碼。 

|:help encoding-values|列出Vim支持的所有編碼。 




設(shè)置gui界面 字體,打開時(shí)自動(dòng)最大化

if has("gui_running")

    if has("win32")

        " 設(shè)定 windows 下 gvim 啟動(dòng)時(shí)最大化

        autocmd GUIEnter * simalt ~x

        " 設(shè)定 windows 下圖形界面下的字體。該字體需要自己下載安裝,下載地址:

        "好像程序員比較喜歡的字體有

        "1. Bitstream Vera Sans Mono

        "http://www-old./fonts/

        "http://ftp./pub/GNOME/sources/ttf-bitstream-vera/1.10/

        "2. 微軟visual stuido 自帶的 Consolas字體

        "http://www.microsoft.com/en-us/download/details.aspx?id=17879

        " 下載安裝完,gvim的菜單里面又有了Consolas 字體,可以用下面這個(gè)設(shè)置

        "  set guifont=Consolas:h12:cANSI     

        "  Bitstream_Vera_Sans_Mono在默認(rèn)的 gvim菜單里面有這個(gè),

        "下面這個(gè)設(shè)置字體大小為12

         set guifont=Bitstream_Vera_Sans_Mono:h12:cANSI     

    else

        " 設(shè)定 linux 下圖形界面下的字體,該字體 Fedora 7 自帶

        set guifont=DejaVu\ LGC\ Sans\ Mono\ 14

    endif

endif



記錄上次文件打開時(shí)的光標(biāo)的位置,這個(gè)很好,下次打開自動(dòng)把光標(biāo)移到上次修改的地方。 BufReadPost 是文件加載完的時(shí)候的動(dòng)作吧

 autocmd BufReadPost *

\ if line("'\"")>0&&line("'\"")<=line("$") |

\exe "normal g'\"" |

\ endif



"隱藏gvim的工具欄和菜單,按f1時(shí)才彈出, Toggle Menu and Toolbar
set guioptions-=m
set guioptions-=T
map <silent> <F1> :if &guioptions =~# 'T' <Bar>
        \set guioptions-=T <Bar>
        \set guioptions-=m <bar>
    \else <Bar>
        \set guioptions+=T <Bar>
        \set guioptions+=m <Bar>
    \endif<CR>

參考 http://vimdoc./htmldoc/gui.html




" 這個(gè)比較放到上面的go語言插件的后面才起作用,go那里好像重設(shè)置語法了

" 高亮顯示行尾的空格,和空格和TAB鍵混用的情況

" http://vim./wiki/Highlight_unwanted_spaces

" ctermbg 必須用顏色名字,guibg可以用顏色值

highlight default ExtraWhitespace ctermbg=red guibg=#F92672

match ExtraWhitespace /\s\+$\| \+\t/

" 可以用下面這個(gè)刪掉所有的行尾空格

" %s/\s\+$//

" 或者像下面這個(gè)map <leader>w git stripspace命令,來刪掉這個(gè) whitespace error

" 默認(rèn)的<leader>鍵是 “\ ” 有的是逗號(hào)",”

function! Preserve(command)

  " Preparation: save last search, and cursor position.

  let _s=@/

  let l = line(".")

  let c = col(".")

  " Do the business:

  execute a:command

  " Clean up: restore previous search history, and cursor position

  let @/=_s

  call cursor(l, c)

endfunction


" delete all trailing whitespace in current file

if has ("win32")

map <leader>w :call Preserve(":%!c:/git/bin/git.exe stripspace")<CR>

else

map <leader>w :call Preserve(":%!git stripspace")<CR>

endif



set path="" vim搜索c的+include文件的路徑,比如下面 [I   gf 命令等需要打開頭文件的時(shí)候,就要根據(jù)這個(gè)path變量去搜索了。


------------移動(dòng)光標(biāo)---------------

h   j   k   l  光標(biāo) “左 下 上 右” 移動(dòng)

0        光標(biāo)移動(dòng)到本行的的開始

^        光標(biāo)移動(dòng)到本行的第一個(gè)字符

$        光標(biāo)移動(dòng)到本行末尾

b        光標(biāo)移到單詞的開頭

e        光標(biāo)移到單詞的末尾

w        光標(biāo)移到下一個(gè)單詞

大寫的 E W和小寫的e w類似,不過單詞是以空格作為分界。移動(dòng)光標(biāo)到下一個(gè)空格的的前或者后面一個(gè)字符。

+       光標(biāo)移到下一行的開頭

-       光標(biāo)移到上一行的開頭

%        光標(biāo)在匹配 最近() {} 塊切換,這個(gè)很有用啊,類與visual studio中的ctrl + ]

‘’       兩次單引號(hào),光標(biāo)移到上次修改的位置。 兩次反引號(hào) ` 才是正式的寫法? 一個(gè)反引號(hào)加上一點(diǎn)(`.)也可以跳到最后一個(gè)修改的位置(參加mark和macro的用法  http://www./vi-vim-tutorial-5.gif

        其實(shí)是反引號(hào)書簽的用法來的,    “m + 一個(gè)字母表示的書簽名字”  就在當(dāng)前行設(shè)置一個(gè)書簽。   “反引號(hào) + 一個(gè)字母表示的書簽名字” 就跳到該書簽的位置。

     標(biāo)簽的一個(gè) 用法,比如要?jiǎng)h大量內(nèi)容,可以在某個(gè)地方ma ,mz 之類的設(shè)置標(biāo)簽到某行,然后把光標(biāo)移到對(duì)應(yīng)的位置,再 d`a   y`z 之類的可以刪除到指定標(biāo)簽位置的所有內(nèi)容。

     gvim里面單引號(hào)和反引號(hào)一樣的效果,ma 之后, ‘a(chǎn)可以移動(dòng)到書簽a的位置



G        光標(biāo)移到文件的末尾

gg       光標(biāo)移到文件的開始

行號(hào)+G   或者 行號(hào)+gg    跳轉(zhuǎn)到第幾行

f + 字符   光標(biāo)移到本行的 下一個(gè)指定字符,搜索

F + 字符   光標(biāo)移到本行的 上一個(gè)指定字符,反向搜索

{  段落的開始

}  段落的結(jié)尾


(  句子的開始

)  句子的結(jié)尾


g,    最近的修改

g;    最近的修改


gd 移到程序變量的定義   在函數(shù)里面查找

gD 移到程序變量的定義   在文件里面查找


[(   移到光標(biāo)位置到  類似if 的條件判斷的括號(hào)的開始

])   移到光標(biāo)位置到 類似if 的條件判斷的括號(hào)的結(jié)尾

[{    代碼塊的開始(for 循環(huán)if等的大括號(hào))

]}    代碼塊的結(jié)尾 (for 循環(huán)if等的大括號(hào))

[[  移到函數(shù)的開始{

]}  移到函數(shù)的結(jié)尾的}


[#   ]#   移到外層#if  #endif的 

[/  代碼注釋的塊的開始

]/  代碼注釋的塊的結(jié)尾

參考 *29.3* Moving through a program

 http://vimdoc./htmldoc/usr_29.html#29.3

 

 zz       光標(biāo)當(dāng)前位置滾動(dòng)到移到屏幕的中間

zt  zb  光標(biāo)當(dāng)前位置滾動(dòng)到屏幕頂端和底部

shitf + M   光標(biāo)滾動(dòng)到移到屏幕的中間, 自己體會(huì) 和zz的區(qū)別

shitf + H   光標(biāo)滾動(dòng)到移到屏幕的頂端

shitf + L   光標(biāo)滾動(dòng)到移到屏幕的底部

ctrl + E    向上滾屏

ctrl + Y   向下滾屏, windows的vim聽說需要重新map一下命令才有效果,否則是redo效果,自己google一下吧

ctrl + F  ctrl +B  上下翻頁


ctrl  + o    ctrl + i  移動(dòng)光標(biāo)到上一次光標(biāo)所在的位置,在光標(biāo)的歷史位置記錄里面前后移動(dòng)。

*CTRL-O* 

CTRL-O Go to [count] Older cursor position in jump list 
(not a motion command). {not in Vi} 
{not available without the |+jumplist| feature} 

<Tab> or *CTRL-I* *<Tab>* 
CTRL-I Go to [count] newer cursor position in jump list 
(not a motion command). 
In a |quickfix-window| it takes you to the position of 
the error under the cursor. 
{not in Vi} 
{not available without the |+jumplist| feature} 

--------------搜索用法-----------------

# 和 *      在文件搜索光標(biāo)當(dāng)前位置的單詞,高亮位置。向前和向后搜索。 非常有用。

g# g*      同# *用法,但搜索的時(shí)候,當(dāng)前單詞如果作為其他的單詞的一部分的時(shí)候,也高亮顯示。# 和 *  要求完整匹配,這個(gè)值要求部分包含就可以了

/  和 ?    進(jìn)入搜索模式,在文檔搜索相應(yīng)的單詞。 向前和向后

 

n  和 N     上面的兩個(gè)搜索用法之后,向前和反向搜索下一個(gè)

 

[I     類似# 和 * 用法,不過顯示一個(gè)快速列表。 還有這個(gè)用來搜索c /c++變量定義的,默認(rèn)會(huì)用tags,但如果沒有tags,也會(huì)在include 的頭文件里面也會(huì)搜索,準(zhǔn)確找到該類型的定義。這點(diǎn)和gD  gd比較類似。 gD在文件里面搜索變量定義,gd在函數(shù)里面搜索,但這個(gè)[I 會(huì)搜索#include的文件。 include的查找目錄由vim的path變量定義,可以修改vimrc配置文件指定path變量,不然vim會(huì)找不到頭文件的。

數(shù)字 + [ + <TAB>     跳到上面一條命令里面顯示的第幾個(gè) 位置去。

]I  類似[I   但只列出后面的

]i  類似[I   但只列出前面的

參考 *29.4* Finding global identifiers  http://vimdoc./htmldoc/usr_29.html#29.4



 :/buf\c   搜索內(nèi)容時(shí),后面加上 \c 不區(qū)分大小寫

---顯示搜索命令歷史--

q/ 顯示搜索命令歷史的窗口 

q? 顯示搜索命令歷史的窗口 可以選擇重用以前用過的搜索查找命令


在多個(gè)文件里面搜索

:vimgrep /pattern/[j][g] file file2... fileN



/joe/e                      : cursor set to End of match  搜索時(shí)可以移動(dòng)光標(biāo)到相對(duì)單詞結(jié)尾偏移的位置

3/joe/e+1                   : find 3rd joe cursor set to End of match plus 1 [C] 

/joe/s-2                    : cursor set to Start of match minus 2  搜索時(shí)可以移動(dòng)光標(biāo)到相對(duì)丹迪開頭偏移的位置

:g/gladiolli/#              : 彈出所有的包含gladiolli的行供    類似  [I  但【I使用的是當(dāng)前光標(biāo)下的詞來搜索


/jo[ha]n     Search john or joan

/\< the      Search the, theatre or then

/the\>       Search the or breathe

/\< the\>   Search the

/fred\|joe   Search fred or joe

/\<\d\d\d\d\>   Search exactly 4 digits

/^\n\{3}    Find 3 empty lines


------------替換操作------------------------------

:s/要替換的單詞/替換為的內(nèi)容/             和perl里面的正則一樣啊,  

:%s/buf_/buf/c    在全文件替換buf_ 為buf,并且詢問是否替換

:127,215 s/foo/bar    替換127行到215之間的foo為bar。

. 表示當(dāng)前行, $表示最后一行,


:%s/\%Vold/new/g                : Do a substitute on last visual area [N]


. or $ for current and last lines respectively. One could also use relative prefixes + and - to refer to offsets after or before the curent line, respectively. Thus: :.,$j meaning "from the current line to the last line, join them all into one line". :% is synonymous with :1,$ (all the lines).

The :... g and :... v commands bear some explanation as they are incredibly powerful. :... gis a prefix for "globally" applying a subsequent command to all lines which match a pattern (regular expression) while :... v applies such a command to all lines which do NOT match the given pattern ("v" from "conVerse"). As with other ex commands these can be prefixed by addressing/range references. Thus:.,+21g/foo/d means "delete any lines containing the string "foo" from the current one through the next 21 lines" while :.,$v/bar/d means "from here to the end of the file, delete any lines which DON'T contain the string "bar."


參考文檔 |10.2| Substitution

 http://vimdoc./htmldoc/usr_10.html#10.2



:%s/old/new/g    Replace all occurences of old by new in file

:%s/old/new/gw    Replace all occurences with confirmation

:2,35s/old/new/g   Replace all occurences between lines 2 and 35

:5,$s/old/new/g   Replace all occurences from line 5 to EOF

:%s/^/hello/g    Replace the begining of each line by hello

:%s/$/Harry/g    Replace the end of each line by Harry

:%s/onward/forward/gi   Replace onward by forward, case unsensitive


---------------刪除、復(fù)制和粘帖--------------------

o      在光標(biāo)位置下面新建一行

O     在光標(biāo)位置上面新建一行

j        合并上下兩行為一行

d       刪除

c       change 剪切并進(jìn)入插入模式, 和d的區(qū)別是這個(gè)會(huì)把剪切的記錄也保存到重復(fù)命令   .    的記錄里面去。

C    D   d$  c$   刪到行的結(jié)尾

s      刪除當(dāng)前字符并且進(jìn)入插入模式

S      刪掉一整行然后進(jìn)入插入模式

行數(shù)+ dd    刪除指定行數(shù),比如 3dd  刪除3行

行數(shù)+ cc    和 上一個(gè)類似,但會(huì)記錄重復(fù)記錄。

 yy                 復(fù)制當(dāng)前行內(nèi)容到剪切板

行數(shù)+ yy         復(fù)制多少行, 3yy  復(fù)制3行 

p    在光標(biāo)前粘貼

P  在光標(biāo)后粘貼

r   替換當(dāng)前選中內(nèi)容,關(guān)于選擇,參見下面xisual 模式


可以組合使用

y2w 復(fù)制后面連個(gè)單詞

d2w    刪除兩個(gè)單詞

db     刪除到單詞開頭

di(   di)     da(  da)   刪除括號(hào)里面的塊

di>    di<

di{    di}

同樣有

 ce     cw   c3w 等


d/foo  刪除到后面第一個(gè)出現(xiàn)foo的地方

y?bar  同樣有復(fù)制到前面第一個(gè)出現(xiàn)bar的位置

y2/foo 復(fù)制當(dāng)前光標(biāo)位置到后面第二次出現(xiàn)foo之間的字符。

d/fred/                                :delete until fred

y/fred/                                :yank until fred

c/fred/e                               :change until fred end


利用標(biāo)簽用法,刪除或復(fù)制大塊數(shù)據(jù)

可以在某個(gè)地方ma ,mz 之類的設(shè)置標(biāo)簽到某行,然后把光標(biāo)移到對(duì)應(yīng)的位置,再 d`a  c'a  y`z   之類的可以刪除或復(fù)制從當(dāng)前光標(biāo)所在wei位置到標(biāo)簽所在位置的所有內(nèi)容。 修阿刪除多行數(shù)據(jù)時(shí)這個(gè)比較方便。


利用visual模式,刪除或復(fù)制大塊數(shù)據(jù)。

按v 或者V 進(jìn)入visual模式后,可以選擇大塊內(nèi)容,用d c y 等進(jìn)行操作。參考某某的 “選擇塊”的介紹。



"*  雙引號(hào)+星號(hào) 再加上復(fù)制或者粘貼命令,把內(nèi)容復(fù)制到系統(tǒng)剪切板,

"*yy  把當(dāng)前行復(fù)制到系統(tǒng)剪切板

"*p   從系統(tǒng)剪切板粘帖出來

 


:%s/ *$//g      Delete all white spaces

:g/string/d     Delete all lines containing string

:v/string/d     Delete all lines containing which didn’t contain string

:s/Bill/Steve/    Replace the first occurence of Bill by Steve in current line

:s/Bill/Steve/g    Replace Bill by Steve in current line

:%s/Bill/Steve/g    Replace Bill by Steve in all the file

:%s/\r//g             Delete DOS carriage returns (^M)

:%s/\r/\r/g             Transform DOS carriage returns in returns

:%s#<[^>]\+>##g        Delete HTML tags but keeps text

:%s/^\(.*\)\n\1$/\1/           Delete lines which appears twice

ggVGg?                  Change text to Rot13

---------------------------------

指定寄存器

d   c  s  y p 等指令操作的內(nèi)容,默認(rèn)保存到 “” 寄存器。但也可以用雙引號(hào)加 一個(gè)字母表示的名字指定26個(gè)寄存器中任意的一個(gè)。

小寫字母表示替換原有寄存器的內(nèi)容,大寫表示追加內(nèi)容到寄存器

"ayy    復(fù)制當(dāng)前行內(nèi)容到 a號(hào)寄存器

“Ayy   把當(dāng)前行內(nèi)容添加到寄存器a里面,如果以前a寄存器已經(jīng)有一行內(nèi)容了,那么這個(gè)做完a寄存器就有兩行內(nèi)容了。

"ap  粘帖寄存器a里面內(nèi)容

"bp  粘帖寄存器b里面內(nèi)容

:reg             : display contents of all registers
:reg a           : display content of register a
qqq              : empty register "q"  應(yīng)該是記錄 一個(gè)空的宏到寄存器,所以寄存器就被清空了
qaq              : empty register "a"


其他的還有 0 到9好等寄存器,只讀寄存器等,參考文檔 

registers

http://vimdoc./htmldoc/change.html#registers


:g/^\s*$/d                  : delete all blank lines

:g!/^dd/d                   : delete lines not containing string

:v/^dd/d                    : delete lines not containing string

:g/joe/,/fred/d             : not line based (very powerfull)

:g/fred/,/joe/j             : Join Lines [N]

:g/^/t.                     : duplicate every line

----------------重復(fù)命令-----------------------

.      按 “點(diǎn)” 這個(gè)句號(hào)字符重復(fù)執(zhí)行命令,  從上一個(gè)按 i 進(jìn)入“插入模式”開始到  esc建退出的所有動(dòng)作。

       非常有用。不如用了重復(fù)刪除 重復(fù)粘貼等。


 

-------------選擇塊---------------------------

vim里面的 “visual mode”應(yīng)該也去學(xué)一下。 選擇文字時(shí)用比較方便。就是進(jìn)入這個(gè)模式之后,把當(dāng)前光標(biāo)和你移動(dòng)到的光標(biāo)的內(nèi)容都選擇起來。

v     進(jìn)入 visual 選擇模式,以字符為選擇單位

V    選擇viusal模式,不過以整行為選擇單位

然后就可以用 hjkl鍵選擇區(qū)域。 


組合命令

“viB”  選擇當(dāng)前光標(biāo)所在的兩個(gè)大括號(hào)包含的整個(gè)代碼塊,不包含大括號(hào)  

“vaB”  選擇當(dāng)前光標(biāo)所在的兩個(gè)大括號(hào)包含的整個(gè)代碼塊,包含大括號(hào)

類似的有

vib vab   選擇兩個(gè)括號(hào)里面的一整塊內(nèi)容

viw vaw  選擇一個(gè)單詞

 

類的的組合有,用于選擇大括號(hào) 尖括號(hào)等里面的內(nèi)容,i不包含,a包含。可以和其他編輯命令組合使用。

ii{

a{

i(   a(

i<  a< 

i[   a[


也可以用鼠標(biāo)直接選擇區(qū)域,那就是select mode,后用鼠標(biāo)選取之后,可以用ctrl + O  或者ctrl + G切換到visual mode。


很多命令可以在 visual mode下面操作,參考這里

http://vimdoc./htmldoc/visual.html#visual-operators


比較常用的有,選擇多行之后進(jìn)行刪除復(fù)制,修改代碼縮進(jìn)等。


---------viusul mode的整塊操作模式----Blockwise operators------------

ctrl  + v  開始進(jìn)入viusual mode的整塊操作模式選取。

然后可以用hjkl 鍵選擇塊。

可以I之后修改esc退出后就應(yīng)用到所有的行。 d刪除,p可以粘貼整塊的內(nèi)容等。

windows因?yàn)榭旖萱I默認(rèn)ctrl +v 是粘貼,所以 ctrl + q才是塊操作。

這個(gè)功能可以用來給多行代碼前面加上注釋 // 。


其他的塊模式的操作有

I 在block的前面插入

A  添加字符串到 block的結(jié)尾

c  C  修改block的每一行內(nèi)容為指定字符床

< >  整block的縮進(jìn)修改

r    替換

d 刪除整個(gè)選中的block

p 粘貼整塊block

參考 http://vimdoc./htmldoc/visual.html#blockwise-operators





其他visual模式說明參考詳細(xì)參見:

http://vimdoc./htmldoc/visual.html#Visual

 

-------------代碼縮進(jìn)-----------------

<      選擇塊減少縮進(jìn),自己先用visual 模式,viB 選擇塊之后,再做這個(gè)就可以縮進(jìn)一整塊   

>      選中塊增加縮進(jìn)。   這個(gè)縮進(jìn)寬度由  set shiftwidth=4 定義 

 <iB   >iB    <aB   >aB 可以直接使用,不用先選擇代碼塊。

>i{   <a{ 等

>%    也可以直接把光標(biāo)移到塊的前面或者后面的大括號(hào)那里,然后運(yùn)行    >%   命令就可以了,同樣應(yīng)也有 <%

>i{     上面那個(gè)是把大括號(hào)一起移動(dòng)的,這個(gè)縮進(jìn)不包含大括號(hào)。

 =     自動(dòng)縮進(jìn)代碼塊,用法,先把光標(biāo)移到一塊的起始括號(hào)那里 { ,然后 執(zhí)行   =%  就可以格式化整個(gè)代碼塊了。

>>   當(dāng)前行減少縮進(jìn), 左移

<<    當(dāng)前行增加縮進(jìn),右移

5>>   行數(shù)加縮進(jìn),那么就一共幾行一起調(diào)整縮進(jìn)

 


組合命令

==   格式化當(dāng)前一行。

=a{       等號(hào)加上其他選擇塊命令,  格式化 一個(gè) 代碼塊。

1G=G    解釋1G移到文件開始, G移到文件結(jié)束,所以這個(gè)組合就是格式化整個(gè)文件的代碼。

gg=G    和 1G=G  等價(jià)


  -------------------大小寫轉(zhuǎn)換--------------------------------------

 按 v 進(jìn)入”visual mode “ 模式,然后選中制定的文字,

再  gu  ,選中的文字轉(zhuǎn)換為小寫。

    gU  選中的文字轉(zhuǎn)換為大寫。


guW   guW 等命令可以直接轉(zhuǎn)換一個(gè)單詞的,但我在Windows的 gvim里面好像默認(rèn)沒有這個(gè)用法,只能先到visual選擇模式 gu才可以用??隙髂莻€(gè)是vim或者linux平臺(tái)的默認(rèn)設(shè)置吧。


轉(zhuǎn)換光標(biāo)下面的字符的就是 vgu  vgU 啦,

一開始發(fā)現(xiàn)不進(jìn)入 ”visual mode “ 模式不能進(jìn)行大小寫轉(zhuǎn)換,不過后來發(fā)現(xiàn),這些也是可以直接使用的,下面這些更方便一些吧

 ~ 將光標(biāo)下的字母大小寫反向轉(zhuǎn)換 

guw 將光標(biāo)所在的單詞變?yōu)樾?nbsp;

guw 將光標(biāo)所在的單詞變?yōu)樾?nbsp;

gUw 將光標(biāo)所在的單詞變?yōu)榇髮?nbsp;

guu 光標(biāo)所在的行所有字符變?yōu)樾?nbsp;

gUU 光標(biāo)所在的行所有字符變?yōu)榇髮?nbsp;

g~~ 光標(biāo)所在的行所有字符大小寫反向轉(zhuǎn)換


同樣有 gU2w 等組合

------------------ 其他輔助編程用法-----------------------

[CTRL-I, ]CTRL-I Search for a word under the cursor in the current file and

any brought in by #include directives.

gd,  Search for the definition of a variable 在函數(shù)里面查找

gD Search for the definition of a variable 在整個(gè)文件查找

]CTRL-D, [CTRL-D Jump to a macro definition.

]d, [d, ]D, [D Display macro definitions


CTRL-A,CTRL-X : increment, decrement next number on same line as the cursor 只在Linux下面起作用。Windows可能需要重新做一下按鍵映射


ctrl + n   insert模式時(shí),在輸入很長的變量名字函數(shù)名字時(shí),可以使用這個(gè)做自動(dòng)補(bǔ)全,就不用完整的敲入整個(gè)變量名字了

ctrl + p  按ctrl + n補(bǔ)全之后,如果不合適,可以用這個(gè)取消補(bǔ)全,


----------------------- 臨時(shí)退出 Vi/Vim、進(jìn)入 shell 環(huán)境后再回來的要求:-------------------------------

方法一:使用 Ctrl-z 以及 fg 這兩個(gè)命令組合。

  這一解決方法主要利用了 Linux/Unix 的作業(yè)機(jī)制。具體原理是:Ctrl-z 命令將當(dāng)前的 Vi/Vim 進(jìn)程放到后臺(tái)執(zhí)行,之后 shell 環(huán)境即可為你所用;fg 命令則將位于后臺(tái)的 Vi/Vim 進(jìn)程放到前臺(tái)執(zhí)行,這樣我們就再次進(jìn)入 Vi/Vim 操作界面并恢復(fù)到原先的編輯狀態(tài)。

方法二:使用行命令 :sh。

  在 Vi/Vim 的正常模式下輸入 :sh即可進(jìn)入 Linux/Unix shell 環(huán)境。在要返回到 Vi/Vim 編輯環(huán)境時(shí),輸入 exit 命令即可。

  這兩種方法實(shí)現(xiàn)機(jī)制不一定,但效果一樣,都非??旖萦行?。

---------------------------------取得外部輸入--------------------------------------------------------------

 : r!<cmd> 將命令 <cmd> 的輸出結(jié)果插入到當(dāng)前光標(biāo)所在位置 

:r <file> 將文件 <file> 讀入到當(dāng)前光標(biāo)所在位置

---------------------把多條命令錄制為宏------------------------------

q  加上 一個(gè)字母表示宏的名字      表示開始宏的錄制

q  再次按q,表示錄制完成

@  加 一個(gè)字母的表示的宏的名字,表示執(zhí)行對(duì)應(yīng)的宏

比如qa 開始錄制宏a, 然后按q停止,再@a就可以執(zhí)行剛剛錄制的宏a了

@@  執(zhí)行最后一次執(zhí)行過的宏。

5@@ 重復(fù)執(zhí)行5次最后一次行的宏


多個(gè)組合操作需要重復(fù)執(zhí)行的時(shí)候,使用這個(gè)功能可以方便很多。

參考

10.1*Record and playback commands

http://vimdoc./htmldoc/usr_10.html#10.1


http://www./vi-vim-tutorial-5.gif

------------------設(shè)置鍵盤快捷鍵-------------------

The main commands to know when dealing with key bindings are:

:map for the modes Normal, Insert, Visual and Command-line  所有模式都起作用

:imap for Insert mode only     只在insert模式起作用

:cmap for Command-line mode only

:nmap for Normal mode only

:vmap for Visual mode only


一個(gè)例子,把ctrl + s 映射為后面保存文件

:map <C-s> :w<cr>


其他常用按鍵表示

<CR>     : carriage Return for maps      <Space> 空格鍵
<Esc>    : Escape
<Leader> : normally \  change with :let mapleader = ","
<Bar>    : | pipe
下面這個(gè)用在按鍵映射里面不錯(cuò),不過肯能只在Linux下面有效,比如下面這個(gè)映射為在當(dāng)前目錄搜索當(dāng)前光標(biāo)所在的單詞
	:nnoremap <F3> :grep <C-R><C-W> *<CR><esc>:cw<cr>
CTRL-R CTRL-W   : pull word under the cursor into a command line or search
CTRL-R CTRL-A   : pull whole word including punctuation
CTRL-R -        : pull small register
CTRL-R [0-9a-z] : pull named registers
CTRL-R %        : pull file name (also #)


參考 http://vimdoc./htmldoc/map.html

------------------------查看執(zhí)行過的命令 歷史記錄---------------------------


: 上下鍵 查找和補(bǔ)全


:history   列出所有的歷史記錄

:his c  

:his s

-------------------VIM buffer 窗口-------------------------------------------------------

VIM里面一個(gè)buffer對(duì)應(yīng)一個(gè)打開的文件


" 允許在有未保存的修改時(shí)切換緩沖區(qū),此時(shí)的修改由 vim負(fù)責(zé)保存

:set hidden


"查看已經(jīng)打開的buffer

:ls   或者 :buffers  命令都可以


“在不同的buffer直接切換,這個(gè)很好用

ctrl + 6


"切換到對(duì)應(yīng)的buffer去 比如下面切換到第2個(gè)buffer 

:buffer 2


"用不同的窗口打開所有的buffer

:ball

:vertical ball  "在垂直分隔的窗口打開所有buffer


:sbuffer  "split buffer到不同的窗口


前后一個(gè)buffer

:bnext   :bn

:bprevious   :bp


:bd[elete][!] [N]  可以指定號(hào)碼的buffer,不指定buffer號(hào)碼就關(guān)閉當(dāng)前buffer, 會(huì)關(guān)閉打開這個(gè)buffer的所有windoww,并顯示另外一個(gè)buffer。 不同于 :q[uit]  和 :close的關(guān)閉window命令


另外還可以使用輔助插件

bufexplorer.zip : Buffer Explorer 插件

http://www./scripts/script.php?script_id=42

安裝完 輸入 :BufExplorer  , 就會(huì)彈出一個(gè)包含所有buffer列表的窗口供選擇。用鼠標(biāo)或者鍵盤都可以跳轉(zhuǎn)的到對(duì)應(yīng)的buffer去。

或者在normal模式直接輸入下面這個(gè)斜杠開始的命令,都可以打開bufexplorer的窗口。

  '\be' (normal open)  or 

  '\bs' (force horizontal split open)  or 

  '\bv' (force vertical split open) 


"可以把f9映射為這個(gè)buffer瀏覽的快捷鍵。

noremap <silent> <F9> :BufExplorer<CR>

nmap <F10> :bn<CR>

nmap <F11> :bp<CR>

--------------------------------配置gvim左側(cè)文件瀏覽欄------------------

安裝 nerdtree  這個(gè)插件

https://github.com/scrooloose/nerdtree

然后就可以,用  :NERDTree 命令啟動(dòng) 左側(cè)瀏覽欄,然后 在左邊點(diǎn)擊 文件名 就自動(dòng)打開,鼠標(biāo)中建點(diǎn)擊,在新的窗口打開文件。

t 鍵 打開一個(gè)新的 tab 窗口里面打開文件。

然后可以在vimrc中加入下面這行代碼讓vim 啟動(dòng)是自動(dòng)打開 文件瀏覽欄。

autocmd vimenter * NERDTree


安裝很簡單,網(wǎng)頁有說明

cd ~/.vim/bundle
git clone https://github.com/scrooloose/nerdtree.git

在Windows 平臺(tái),放到vim的安裝目錄就可以了。沒有裝git自己下載對(duì)應(yīng)的插件文件放到對(duì)應(yīng)的目錄去就可以了。


最好也安裝一下這個(gè)插件配合,這樣在gvim里面啟動(dòng)時(shí),自動(dòng)啟動(dòng)NERDTree 的文件瀏覽欄,并且打開新的tab是,這個(gè)文件瀏覽窗口也始終顯示。

不用配置前面的autocmd vimenter * NERDTree 命令了。 他autoload目錄的插件自動(dòng)加載。

https://github.com/jistr/vim-nerdtree-tabs


有很多默認(rèn)選項(xiàng)開關(guān) ,可以參考網(wǎng)頁的說明

let g:nerdtree_tabs_open_on_gui_startup=1     這個(gè)默認(rèn)就是1了,

let g:nerdtree_tabs_open_on_console_startup=1   直接在字符終端的的vim里面也默認(rèn)啟動(dòng) NERDTree


不過他這個(gè)插件加載比較慢,需要的時(shí)候再打開比較好

" 把F2映射為顯示左側(cè)目錄瀏覽樹窗口開關(guān)

map <F2> :NERDTreeToggle<CR>

-----------------------c/c++ 結(jié)構(gòu)解析,函數(shù)快捷查找-------------------------------------------

另外為了瀏覽文件是查看搜索函數(shù)名字,有人還喜歡安裝 

cscope

ctags

taglist

等插件,這樣查看搜索函數(shù)定義之類的方便一點(diǎn)吧。有需要的時(shí)候在網(wǎng)上找一下相關(guān)資料吧



------------------vim里面搜索目錄下的文件,quickfix模式和grep--------

在vim里面直接搜索目錄下的文件的內(nèi)容


:grep sendv *.c       使用外部grep程序

:vimgrep /sendv/   *.c   使用內(nèi)部vim 模式的搜索,速度較慢 Vim 需要載入每個(gè)文件,就像編輯它們那樣。如果文件里沒有匹配,相應(yīng)

的緩沖區(qū)又會(huì)被徹底刪除

:vimgrep sendv\c   *.c   使用內(nèi)部vim 模式的搜索,速度較慢


:help vimgrep

greo 在windows系統(tǒng)默認(rèn)調(diào)用的是findstr /n命令來進(jìn)行搜索的的, 可以通過  :set grepprg 設(shè)置來修改設(shè)置

linux缺省為 "grep -n " 參考

http://vimcdoc./doc/options.html#'grepprg'

我安裝了git 自帶一個(gè)mingw的grep 還是改為用grep好了,比findstr命令好用吧

:set grepprg=c:/git/bin/grep.exe\ -n

:grep -i sendv *.c 這樣就可以用grep的各種參數(shù)了

其他的'grepformat'設(shè)置vim怎么解析grep的輸出,一般都不用修改了吧。參考vm的文檔



搜索之后只顯示一行,可以:cc 重復(fù)顯示結(jié)果

或者打開 quickfix窗口


:cw[indow] [height]     當(dāng)存在可以識(shí)別的錯(cuò)誤時(shí),打開窗口。如果該窗口已經(jīng)打開且

                        沒有可識(shí)別的錯(cuò)誤,則將此窗口關(guān)閉。

:cope[n] [height]       打開一個(gè)窗口顯示當(dāng)前的錯(cuò)誤列表。

:ccl[ose]               關(guān)閉 quickfix 窗口。


:colder 和 :cnewer  合適顯示十個(gè)搜索歷史記錄


在打開的窗口里面可以直接用鼠標(biāo)雙擊和enter鍵可以跳到指定找到的指定位置去。

但以前的窗口緩沖器沒有修改才行?   在quickfix 窗口  ctrl +w 在按enter鍵,可以在新窗口打開。


ctrl + w 在窗口直接切換



在quickfix模式里面常用操作

:cc                顯示詳細(xì)信息 ( :help :cc )

:cp                跳到上一個(gè)結(jié)果 ( :help :cp )

:cn                跳到下一個(gè)結(jié)果 ( :help :cn )

:cl                列出所有結(jié)果 ( :help :cl )

:cw                如果有結(jié)果列表,則打開quickfix窗口 ( :help :cw )

:col               到前一個(gè)舊的結(jié)果列表 ( :help :col )

:cnew              到后一個(gè)較新的結(jié)果列表 ( :help :cnew ) 


可以把這些命令映射到快捷建方便使用

":nmap <F4> :cw<cr>

":nmap <F4> :cclose<cr>

:nmap <F5> :cn<cr>

:nmap <F6> :cp<cr>

   "把 f3 按鍵映射為在本目錄下文件里面搜索光標(biāo)下面的單詞

if has("win32")

" grep的設(shè)置

:set grepprg=c:/git/bin/grep.exe\ -n

"windows平臺(tái)用這個(gè)

:nmap <F3> "*yw<cr>:grep <c-v> ./*<cr><esc>:cw<cr>

else

" linux 平臺(tái)用這個(gè)

:nnoremap <F3> :grep <C-R><C-W> *<CR><esc>:cw<cr>

endif


可以使用下面這個(gè)顯示和隱藏quickfix窗口的函數(shù),這樣cw 和 cclose功能都映射到同一個(gè)按鍵了

" 彈出和隱藏quickfix窗口

" 來自http://vim./wiki/Toggle_to_open_or_close_the_quickfix_window

function! QFixToggle()

  if exists("g:qfix_win")

    cclose

    unlet g:qfix_win

  else

    " copen 10

cw

    let g:qfix_win = bufnr("$")

  endif

endfunction

let g:qfix_win = 1

nmap <script> <silent> <F4> :call QFixToggle()<CR>



參考http://vimcdoc./doc/quickfix.html


這種quickfix的用法,vim內(nèi)部出了grep 還支持make和其他編譯工具的,可以參考vim的文檔

--------------------------------------



vim-multiple-cursors插件 “True Sublime Text style multiple selections for Vim”

======================================================

https://github.com/terryma/vim-multiple-cursors

允許同時(shí)選擇多個(gè)同名變量,同時(shí)修改。 參考上面主頁上面的動(dòng)畫演示。比較有意思的一個(gè)插件,


可以用 git clone https://github.com/terryma/vim-multiple-cursors 把目錄復(fù)制下來,然后把a(bǔ)utoload 和 doc plugin目錄復(fù)制到vim目


錄去使用就可以了。

使用起來很簡單,在normal模式,把光標(biāo)移到一個(gè)變量名字上面,再不停的按 ctrl +n 就把相同名字的變量都選中了。然后使用vim的命令就


可以編輯了。esc退回普通模式。



commentary.vim 快捷注釋代碼插件

========================

https://github.com/tpope/vim-commentary

Commentary 可以幫你注釋代碼。在normal模式輸入gcc 即可將該行注釋(Commentary 會(huì)根據(jù)當(dāng)前的 filetype 使用.

在visual 模式,額可以選擇多行,然后輸入 gc ,注釋掉整個(gè)選中內(nèi)容。

再次敲擊 gcc 即可還原注釋。我把空格鍵作為注釋映射,下面這樣:


nmap <space> gcc

vmap <space> gc

即在 normal 模式下,敲擊空格鍵可以注釋當(dāng)前行,在 visual 模式下,敲擊空格鍵可以注釋選中的內(nèi)容

參考了 http:///2013/11/my-vim-configuration-plugin/的設(shè)置


NERD Commente  另外一個(gè)輔助注釋代碼的插件

================================

http://www./scripts/script.php?script_id=1218


vim-expand-region 自動(dòng)擴(kuò)展選擇區(qū)域的插件

==================================

https://github.com/terryma/vim-expand-region

可以通過 +   _  按鍵來擴(kuò)大選擇區(qū)域。比如,比如光標(biāo)在單詞中間,按一下 +,就選中整個(gè)單詞,再+就選中單詞外層的括號(hào)里面內(nèi)容。等等,可以去上面主頁去看動(dòng)畫。我只想在visual模式才使用這個(gè)功能,他插件里面會(huì)自己做一下判斷你是否已經(jīng)映射了快捷鍵的,如果已經(jīng)有了,它就不在做nmap的普通模式的映射了。


" 自動(dòng)擴(kuò)大選擇區(qū)域的插件,讓它只在visual 模式才使用+  _鍵盤映射 

vmap + <Plug>(expand_region_expand)

vmap _ <Plug>(expand_region_shrink



YouCompleteMe

===========

c/c++的最好用的自動(dòng)補(bǔ)全插件,基于clang的c/c++語法分析



 強(qiáng)烈推薦閱讀下面這篇文章,體會(huì) 重復(fù)命令和 組合命令用法。

 http://www.oschina.net/news/25882/why-they-are-using-vi

為什么這些死腦筋們?cè)谟?nbsp;VI ?

 

翻譯的還好,也許你要原版的。

Why, oh WHY, do those #?@! nutheads use vi?

http://www./a-why-vi-vim.html

 

后來也參考了

技巧:快速提高 Vi/Vim 使用效率的原則與途徑

http://www.ibm.com/developerworks/cn/linux/l-cn-tip-vim/ 


vim的官方文檔,可以用去看一下。不錯(cuò)的,詳細(xì)的說明。

http://vimdoc./htmldoc/usr_toc.html

 不過好像http://www./vim/vimbook-OPL.pdf   這個(gè)更有條理一些,講的很詳細(xì),而且例子也不錯(cuò),也將很多編程相關(guān)的高級(jí)用法等。我也參考了一下這個(gè)書。


之前發(fā)的一個(gè)圖也是很好的參考。

http://hiphotos.baidu.com/widebright/pic/item/5d880d241eb39b40c89559a6.jpg

原來圖是來自這里的啊 

Graphical vi-vim Cheat Sheet and Tutorial  

 http://www./a_vi_vim_graphical_cheat_sheet_tutorial.html

這網(wǎng)站還有很多圖,給出由淺入深的學(xué)習(xí)步驟圖。


不錯(cuò)的參考圖書

Hacking Vim

A cookbook to get the most out of the latest

Vim editor


這個(gè)帖子提到的幾個(gè)用法也不錯(cuò)

http:///questions/1218390/what-is-your-most-productive-shortcut-with-vim/1220118#1220118



Best of Vim Tips

http://www./vimtips.html


Using vim as C/C++ IDE

http://www./2014/using-vim-as-c-cpp-ide/

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多