vim常用操作

vi是個可視化的編輯器,可視化編輯器的含義就是在編輯文本時可以看到它們。Linux下的vim是vi的一個增強版本,有彩色和高亮等特性,對編程有很大的幫助。

基本使用:
啓動和退出vim
vim的啓動:在Linux的提示符下鍵入vim(或使用vim myfile來編輯已經存在的文件)即可啓動它。
vim的退出:先按下Esc鍵回到命令行模式,然後鍵入“:”,此時光標會停留在最下面一行,再鍵入"q"(如果強行退出則還在後面加 "!" ),最後按下Enter鍵即可。

VIM 關於移動的命令
在當前行裏面有效的移動光標
* fx:移動光標到當前行的下一個 x 處。很明顯,x 可以是任意一個字母,而且你可以使用 ; 來重複你的上一個 f 命令。
* tx:和上面的命令類似,但是是移動到 x 的左邊一個位置。(這真的很有用)
* Fx:和 fx 類似,不過是往回找。
* w:光標往前移動一個詞。
* b:光標往後移動一個詞。
* 0:移動光標到當前行首。
* ^:移動光標到當前行的第一個字母位置。
* $:移動光標到行尾。
* ):移動光標到下一個句子。
* ( :移動光標到上一個句子。
在整個文件裏面有效移動光標
* <C-F>:向下移動一屏。
* <C-B>:向上移動一屏。
* G:到文件尾
* numG:移動光標到指定的行(num)。(比如 10G 就是到第 10 行)
* gg:到文件首
* H:移動光標到屏幕上面
* M:移動光標到屏幕中間
* L:移動光標到屏幕下面
* *:讀取光標處的字符串,並且移動光標到它再次出現的地方。
* #:和上面的類似,但是是往反方向尋找。
* /text:從當前光標處開始搜索字符串 text,並且到達 text 出現的地方。必須使用回車來開始這個搜索命令。如果想重複上次的搜索的話,按 n。
* ?text:和上面類似,但是是反方向。
* ma:在當前光標的位置標記一個書籤,名字爲 a。書籤名只能是小寫字母。你看不見書籤的存在,但它確實已經在那裏了。
* `a:到書籤 a 處。注意這個不是單引號,它一般位於大部分鍵盤的 1 的左邊。
* `.:到你上次編輯文件的地方。這個命令很有用,而且你不用自己去標記它。

有效的移動大段的文本
* v:按字符選擇。經常使用的模式,所以親自嘗試一下它。
* V:按行選擇。這在你想拷貝或者移動很多行的文本的時候特別有用。
* <C-V>:按塊選擇。非常強大,只在很少的編輯器中才有這樣的功能。你可以選擇一個矩形塊,並且在這個矩形裏面的文本會被高亮。
在選擇模式的時候使用上面所述的方向鍵和命令(motion)。比如,vwww,會高亮光標前面的三個詞。Vjj 將會高亮當前行以及下面兩行。
一旦你高亮了選區,你或許想進行一些操作:
* d:剪貼選擇的內容到剪貼板。
* y:拷貝選擇的內容到剪貼板。
* c:剪貼選擇的內容到剪貼板並且進入插入模式。
如果你很清楚的知道你想拷貝或者剪切什麼,那你根本就不需要進入可視選擇模式。這樣也會節省時間:
* d{motion}:剪切 motion 命令跨過的字符到剪貼板。比如,dw 會剪切一個詞而 dfS 會將從當前光標到下一個 S 之間的字符剪切至剪貼板。
* y{motion}:和上面類似,不過是拷貝。
* c{motion}:和 d{motion} 類似,不過最後進入插入模式。
* dd:剪切當前行。
* yy:拷貝當前行。
* cc:剪切當前行並且進入插入模式。
* D:剪切從光標位置到行尾到剪貼板。
* Y:拷貝當前行。
* C:和 D 類似,最後進入插入模式。
* x:剪切當前字符到剪貼板。
* s:和x類似,不過最後進入插入模式。
y+y 將光標目前所在的位置整行復制
y+w 複製光標所在的位置到整個單詞所在的位置
n+y+w 若按3yw,則會將光標所在位置到單詞結束以及後面兩個單詞(共3個單詞)一起復制
n+y+y 若按3yy,則將連同光標所在位置的一行與下面兩行一起復制

粘貼很簡單,按 p。

使用多重剪貼板
很多編輯器都只提供了一個剪貼板。VIM 有很多。剪貼板在 VIM 裏面被稱爲寄存器(Registers)。你可以列出當前定義的所有寄存器名和它們的內容,命令爲“:reg”。最好使用小寫字母來作爲寄存器的名稱,因爲大寫的有些被 VIM 佔用了。使用寄存器的命令爲雙引號 “。
比如:我們要拷貝當前行到寄存器 k。你應該按 “kyy。(你也可以使用 V”ky。爲什麼這樣也可以呢?)現在當前行應該已經存在了寄存器 k 裏面直到你又拷貝了一些東西進入寄存器 k。現在你可以使用命令 “kp 來粘貼寄存器 k 裏面的內容到你想要的位置。

vim中常用的刪除文本命令:
d+左方向鍵 連續按d和左方向鍵,將光標所在位置前一個字符刪除
d+右方向鍵 將光標所在位置字符刪除
d+上方向鍵 將光標所在位置行與其上一行同時刪除
d+下方向鍵 將光標所在位置與下一行同時刪除
d+d 連按兩次d,可將光標所在的行刪除,若是連續刪除,可以按住d不放
d+w 刪除光標所在位置的單詞,若是光標在兩個字之間,則刪除光標後面的一個字符
n+d+d 刪除包括光標所在行及鄉下的n行
n+d+上方向鍵 刪除包括光標所在行及向上的n行
n+d+下方向鍵 同n+d+d命令
D 將光標所在行後面所有的單詞刪除
x 將光標所在位置後一個字符刪除
X 將光標所在位置前一個字符刪除
n+x 刪除光標所在位置及其後的n個字符
n+X 刪除光標所在位置及其前的n個字符

vim中常用的找出行數的命令:
Ctrl+g 在最後一行中顯示光標所在位置的行數及文章的總行數
nG 將光標移至n行
r 修改光標所在字符
R 修改光標所在位置的字符,可以一直替換字符,知道按下ESC鍵
u 表示復原功能
U 取消對行所作的所有改變
. 重複執行上一命令
Z+Z 連續按下兩次Z,文件將保存並退出vim
% 符號匹配功能,在編輯時,如果輸入"%(",系統會自動匹配相應的")" #這功能在ubuntu中我沒有實現,不知道誰能解釋一下
#可以用/代替%

vim中搜索及替換命令 :
/pattern:從光標開始處向文件尾搜索pattern
?pattern:從光標開始處向文件首搜索pattern
n:在同一方向重複上一次搜索命令
N:在反方向上重複上一次搜索命令
:s/p1/p2/g:將當前行中所有p1均用p2替代
:n1,n2s/p1/p2/g:將第n1至n2行中所有p1均用p2替代
:g/p1/s//p2/g:將文件中所有p1均用p2替換

vim中命令行模式切換到輸入模式,進行插入:
* i:在當前字符的左邊插入
* I:在當前行首插入
* a:在當前字符的右邊插入
* A:在當前行尾插入
* o:在當前行下面插入一個新行
* O:在當前行上面插入一個新行
* c{motion}:刪除 motion 命令跨過的字符,並且進入插入模式。比如:c$,這將會刪除從光標位置到行尾的字符並且進入插入模式。ct!,這會刪除從光標位置到下一個歎號(但不包 括),然後進入插入模式。被刪除的字符被存在了剪貼板裏面,並且可以再粘貼出來。
* d{motion}:和上面差不多,但是不進入插入模式。
使用數字也是 VIM 強大的而且很節省時間的重要特性之一。在很多 VIM 的命令之前都可以使用一個數字,這個數字將會告訴 VIM 這個命令需要執行幾次。比如:
* 3j 將會把光標向下移動三行。
* 10dd 將會刪除十行。
* y3″ 將會拷貝從當前光標到第三個出現的引號之間的內容到剪貼板。
數字是擴展 motion 命令作用域非常有效的方法。

vim最後行模式主要的操作命令:
e 創建新的文件
n 加載新的文件
w 寫文件,也就是將編輯的內容保存到文件系統中。主要它是保存到臨時文件中,直接退出,他並沒有保存到文件中的
w! 如果想寫只讀文件,使用它強制寫入文件
q! 不問你是否保存文件,強制退出
set nu set 可以設置vim的某些特性,這裏是設置每行開頭提示行數。想取消設置,使用命令 set none
/ 查找匹配字符串功能。如/(,將查找(和);如果想繼續向下查找,可以按n鍵;向前繼續查找則按N鍵
? 與/相似,但它是向前查找字符串

vim的注意事項:
1,當你不知道你是處於編輯方式還是命令方式時,可以使用Esc鍵退出命令方式,然後進行操作。

2,在使用vim時,萬一發生了系統掉電或者突然關機時,可以使用恢復命令,如編輯file文件時突然斷電或系統崩潰後的恢復命令:$ vi file -r

3.編程常用技巧:
% 跳轉到配對的括號去
[[ 跳轉到代碼塊的開頭去(但要求代碼塊中'{'必須單獨佔一行)
]p 和 p 的功能差不多,但是它會自動調整被粘貼的文本的縮進去適應當前代碼的位置。試一下!
>> 縮進所有選擇的代碼
<< 和上面類似,但是反縮進
gd 到達光標所在處函數或者變量的定義處。
K 在 Man 裏面查找光標當前所在處的詞。
'' 跳轉到光標上次停靠的地方, 是兩個', 而不是一個"

4.winmanager+ctags+taglist:
$ctags -R 進行ctag標籤的初始化或者是更新,自動補全需要。
在源程序main.c不在tag目錄時要進行以下操作:
:set tags= /src/main.c


<F1> 顯示幫助
<cr> 如果光標下是目錄, 則進入該目錄; 如果光標下文件, 則打開該文件
- 返回上級目錄
c 切換vim 當前工作目錄正在瀏覽的目錄
d 創建目錄
D 刪除目錄或文件
i 切換顯示方式
R 文件或目錄重命名
s 選擇排序方式
x 定製瀏覽方式, 使用你指定的程序打開該文件

5.自動補全
TAB鍵補全
Ctrl+X Ctrl+L 整行補全
Ctrl+X Ctrl+N 根據當前文件裏關鍵字補全
Ctrl+X Ctrl+I 根據頭文件內關鍵字補全
Ctrl+X Ctrl+] 根據標籤補全
Ctrl+X Ctrl+F 補全文件名
Ctrl+X Ctrl+D 補全宏定義
Ctrl+X Ctrl+V 補全vim命令
Ctrl+X Ctrl+U 用戶自定義補全方式
Ctrl+X Ctrl+S 拼寫建議

6.編譯:
VIM默認的設置爲gcc的編譯指令make,
編譯完成後顯示信息,
下面列出了命令
編譯 :make
列出所有編譯信息 :cl
顯示第一條信息 :cfirst
顯示最後一條信息 :clast
顯示第n條信息 :cc n 例如顯示第5條 :cc 5
顯示下一條信息 :cn
顯示上一條 :cp
如果此爲錯誤信息,那麼打回車,vim會自動把光標跳至錯誤行。

7.其他
1、連續行註釋
  使用Vim/Vi編輯shell腳本,在進行調試的時候,需要進行多行的註釋,每次都要先切換到插入模式,在行首輸入註釋符“#”,再退回命令模式,非常麻煩。其實如果要註釋連續行,可在命令模式下執行,格式如下:
  :起始行,終止行s/要替換字符/替換爲新字符/g
  如需註釋第1行到第20行,可以執行:1,20s/^/#/g
  其中“^”表示在行首插入,“#”爲要插入的字符,“g”表示執行替換時不確認,若希望每行交互詢問是否執行,可將“g”改爲“c”。

  2、非連續行註釋(可以直接寫在vimrc裏面)
  如果註釋非連續的多行,可以定義快捷鍵簡化,格式爲:
  :map 快捷鍵 執行命令
  如定義快捷鍵Ctrl+P爲在當前行行首添加“//”註釋,可以執行:
  :map ^P I//
  “^P”爲定義快捷鍵Ctrl+P,要注意先按“Ctrl+v”再按“Ctrl+p”;

常用的map有:
1. cmap handles command-line mappings.
2. imap handles insert-only mappings.
3. map maps keys in normal, visual, and operator-pending mode.
4. map! maps keys in Vim's command and insert modes.
5. nmap maps keys in normal mode only.
6. omap maps keys in operator-pending mode only.
7. vmap maps keys in visual mode only.

另一個例子是:map <F10> <Esc>:tabnew<CR>,這裏面的Esc是手動輸入的~<CR>相當於回車
我在搜索的時候喜歡vim的高亮顯示,但是我想在任意一個時候得到上次搜索的高亮結果(編輯的時候關掉,查找的時候開啓),那麼我在vimrc裏寫一個函數:

function ToggleHLSearch()
if &hls
set nohls
else
set hls
endif
endfunction

然後在後邊在來一個映射:map <silent> <C-n> <Esc>:call ToggleHLSearch()<CR>
這樣就解決了這個隨時打開高亮搜索功能的問題。

  如果要取消此快捷鍵,只需輸入命令:
  :unmap ^P
想查看設置的快捷鍵,輸入:map即可看到。

  3、縮略語
  原來輸入經常用的信息可以如此簡單,
  :ab 替代符 原始信息
  示例如下:
  :ab sammail [email protected]
  執行之後,在輸入模式下任何地方錄入“sammail”,再敲任意字母符號或者回車空格,咔嚓一下,利馬就變成“[email protected]”,那真是相當的方便啊!
:iab XXX YYY
要是不想替代就在輸入完後按Ctrl+&#173;v

  4、可以直接在Vim/Vi中執行UNIX/Linux命令不需退出Vim/Vi  :!命令

  5、可以直接將其他文件內容導入當前編輯文件中
  格式爲:r 文件名
  如,需要導入文件/etc/issue的內容,執行:r /etc/issue
  先舉個例子,很多程序員喜歡寫完程序後在註釋中寫入當前時間,我有個好辦法即省事又快速還準確,只需要在命令模式下執行:r !date
  當前時間就自動被導入了,任何命令的結果導入到當前編輯文件中,格式爲 r !命令

  5、助力編程的查詢功能
  以前在Linux系統下寫一些C語言程序,有時記性不好,忘記了語法格式,使用Vim/Vi編寫時可直接查詢。如寫程序寫到fork時,突然失憶了(失去了對這個東東的記憶),就可以直接把光標移動到fork上,按“K”(大寫的K),直接就會跳到Linux程序員手冊,看到fork的幫助,看完後回車繼續編寫。

6、:h quickref 翻到VIM Quick Reference頁(有用!)。
7、環境變量%表示當前文件名。
8、# 加密(小心使用,不要忘了密碼)
:X : 然後vim會提示你輸入密碼
:wq
9.csupport的常用操作:

-- 註釋操作 -----------------------------------------------------------

/cl end-of-line comment (n,v,i)
/cj adjust end-of-line comment(s) (n,v,i)
/cs set end-of-line comment column (n)
/c* code -> comment /* */ (n,v)
/c/ code -> comment // (n,v)
/cc code -> comment // (n,v)
/co comment -> code (n,v)
/cfr frame comment (n,i)
/cfu function comment (n,i)
/cme method description (n,i)
/ccl class description (n,i)
/cd date (n,i)
/ct date /& time (n,i)

-- 常用結構 ---------------------------------------------------------

/sd do { } while (n,v,i)
/sf for (n,i)
/sfo for { } (n,v,i)
/si if (n,i)
/sif if { } (n,v,i)
/sie if else (n,v,i)
/sife if { } else { } (n,v,i)
/sw while (n,i)
/swh while { } (n,v,i)
/ss switch (n,v,i)
/sc case (n,i)
/s{ { } (n,v,i)

-- 預處理命令 -------------------------------------------------------

/p< #include <> (n,i)
/p" #include "" (n,i)
/pd #define (n,i)
/pu #undef (n,i)
/pie #if #else #endif (n,v,i)
/pid #ifdef #else #endif (n,v,i)
/pin #ifndef #else #endif (n,v,i)
/pind #ifndef #def #endif (n,v,i)
/pi0 #if 0 #endif (n,v,i)
/pr0 remove #if 0 #endif (n,i)
/pe #error (n,i)
/pl #line (n,i)
/pp #pragma (n,i)

-- 常用短語 -------------------------------------------------------------

/if function (n,v,i)
/isf static function (n,v,i)
/im main() (n,v,i)
/i0 for( x=0; x<n; x+=1 ) (n,v,i)
/in for( x=n-1; x>=0; x-=1 ) (n,v,i)
/ie enum + typedef (n,i)
/is struct + typedef (n,i)
/iu union + typedef (n,i)
/ip printf() (n,i)
/isc scanf() (n,i)
/ica p=calloc() (n,i)
/ima p=malloc() (n,i)
/isi sizeof() (n,v,i)
/ias assert() (n,v)
/ii open input file (n,i)
/io open output file (n,i)

-- 代碼段支持-----------------------------------------------------------

/nr read code snippet (n,i)
/nw write code snippet (n,v,i)
/ne edit code snippet (n,i)
/np pick up prototype (n,v,i)
/ni insert prototype(s) (n,i)
/nc clear prototype(s) (n,i)
/ns show prototype(s) (n,i)
/ntl edit local templates (n,i)
/ntg edit global templates (n,i)
/ntr rebuild templates (n,i)

-- C++ ----------------------------------------------------------------

/+c class (n,i)
/+cn class (using new) (n,i)
/+ci class implementation (n,i)
/+cni class (using new) implementation (n,i)
/+mi method implementation (n,i)
/+ai accessor implementation (n,i)

/+tc template class (n,i)
/+tcn template class (using new) (n,i)
/+tci template class implementation (n,i)
/+tcni template class (using new) impl. (n,i)
/+tmi template method implementation (n,i)
/+tai template accessor implementation (n,i)

/+tf template function (n,i)
/+ec error class (n,i)
/+tr try ... catch (n,v,i)
/+ca catch (n,v,i)
/+c. catch(...) (n,v,i)

-- 編譯調試 ----------------------------------------------------------------

/rc save and compile (n,i)
/rl link (n,i)
/rr run (n,i)
/ra set comand line arguments (n,i)
/rm run make (n,i)
/rg cmd. line arg. for make (n,i)
/rp run splint (n,i)
/ri cmd. line arg. for splint (n,i)
/rk run CodeCheck (TM) (n,i)
/re cmd. line arg. for CodeCheck (TM) (n,i)
/rd run indent (n,v,i)
/rh hardcopy buffer (n,v,i)
/rs show plugin settings (n,i)
/rx set xterm size (n, only Linux/UNIX & GUI)
/ro change output destination (n,i)

常用個性化設置:
全局變量

GLOBAL VARIABLE DEFAULT VALUE TAG (see below)

g:C_GlobalTemplateFile plugin_dir.'c-support/templates/Templates'
g:C_LocalTemplateFile $HOME.'/.vim/c-support/templates/Templates'
g:C_TemplateOverwrittenMsg 'yes'

g:C_CodeSnippets plugin_dir."/c-support/codesnippets/"
g:C_Dictionary_File ""
g:C_LoadMenus "yes"
g:C_MenuHeader "yes"
g:C_OutputGvim "vim"
g:C_XtermDefaults "-fa courier -fs 12 -geometry 80x24"
g:C_Printheader "%<%f%h%m%< %=%{strftime('%x %X')} Page %N"

Linux/UNIX:
g:C_ObjExtension ".o"
g:C_ExeExtension ""
g:C_CCompiler "gcc"
g:C_CplusCompiler "g++"
g:C_CFlags "-Wall -g -O0 -c"
g:C_LFlags "-Wall -g -O0"
g:C_Libs "-lm"
g:C_LineEndCommColDefault 49
g:C_CExtension "c"
g:C_TypeOfH "cpp"

g:C_CodeCheckExeName "check"
g:C_CodeCheckOptions "-K13"

10.在你編輯你的電子郵件或者其他有段落的文本時,你可能會發現使用方向鍵和你預期的效果不一樣,有時候可能會一次跳過了很多行。這是因爲你的段落在 VIM 看來是一個大的長長的行。這時你可以在按 h、j、k 或者 l 之前鍵入一個 g,這樣 VIM 就會按屏幕上面的行如你所願的移動了。


2.關於一些基本設置
|:set| :se[t] 顯示所有被改動的選項。
參數
'autoindent' 'ai' 根據上一行決定新行的縮進
'cindent' 'cin' 實現 C 程序的縮進
'cinkeys' 'cink' 設置 'cindent' 時啓動縮進的鍵
'cinoptions' 'cino' 設置 'cindent' 時如何縮進
'cinwords' 'cinw' 'si' 和 'cin' 在這些詞後加入額外的縮進
'shiftwidth' 'sw' (自動) 縮進使用的步進單位,以空白數目計
'smarttab' 'sta' 插入 <Tab> 時使用 'shiftwidth'

sample
:set cin 實現 C 程序的縮進
:set sw=4 設計(自動) 縮進使用4個空格
:set sta 插入<tab>時使用'shiftwidth'
:set backspace=2 指明在插入模式下可以使用<BS>刪除光標前面的字符
:set filetype=cpp 指定文件類型爲C++,以便使用高亮關鍵字顯示
:syntax enable 設置高亮關鍵字顯示

怎麼讓vim在啓動時自動設置?
啓動vim的時候使用vim -u /root/vimrc.vim
Vim 會在啓動的時候執行這個文件裏的命令,並且使用:vertion可以查看到系統vimrc配置文件,用戶vimrc配置文件等的路徑

怎樣讓vim自動縮排代碼?
將光標放在{處,按ESC到Normal模式,然後按v再按%就可以把大括號中內容選定,然後按=就可以按照C語言格式縮排
%命令的作用是跳到匹配處,比如括號之間,C的宏指令#if #else #endif之間。

“去掉討厭的有關vi一致性模式,避免以前版本的一些bug和侷限
set nocompatible
“顯示行號
set nummber
“檢測文件的類型
filetype on
“記錄歷史的行數
set history=1000
“背景使用黑色
set background=dark
“語法高亮度顯示
syntax on
“下面兩行在進行編寫代碼時,在格式對起上很有用;
“第一行,vim使用自動對起,也就是把當前行的對起格式應用到下一行;
“第二行,依據上面的對起格式,智能的選擇對起方式,對於類似C語言編寫上很有用
set autoindent
set smartindent
“第一行設置tab鍵爲4個空格,第二行設置當行之間交錯時使用4個空格
set tabstop=4
set shiftwidth=4
“設置匹配模式,類似當輸入一個左括號時會匹配相應的那個右括號
set showmatch
“當vim進行編輯時,如果命令錯誤,會發出一個響聲,該設置去掉響聲
set vb t_vb=
“在編輯過程中,在右下角顯示光標位置的狀態行
set ruler
“默認情況下,尋找匹配是高亮度顯示的,該設置關閉高亮顯示
set nohls
“查詢時非常方便,如要查找book單詞,當輸入到/b時,會自動找到第一
“個b開頭的單詞,當輸入到/bo時,會自動找到第一個bo開頭的單詞,依
“次類推,進行查找時,使用此設置會快速找到答案,當你找要匹配的單詞
“時,別忘記回車
set incsearch

,輸入左邊括號"("後自動完成")",並把光標定位到兩個括號中間
:inoremap ( ()<ESC>i
:inoremap ) <c-r>=ClosePair(')')<CR>
:inoremap { {}<ESC>i
:inoremap } <c-r>=ClosePair('}')<CR>
:inoremap [ []<ESC>i
:inoremap ] <c-r>=ClosePair(']')<CR>

function ClosePair(char)
if getline('.')[col('.') - 1] == a:char
return "/<Right>"
else
return a:char
endif
endf

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章