原文地址:http://blog.csdn.net/shiwei408/article/details/7296462
Vim是Unix系統上的文本編輯軟件(你該不會不知道什麼是文本編輯軟件吧!),在windows上也有移植的版本,方便了Windows上的用戶。Vim的文本編輯功能非常強大,強大的有些讓人吃驚!並且非常穩定,你的文檔不用經常存盤,它不會出現類似於“***程序內部錯誤!”等等現象,***程序曾經讓我欲哭無淚啊!
開始使用Vim吧!
啓動:在命令提示符後輸入vim,然後回車,就啓動了vim,然後進入vim的界面。如果在命令提示符後輸入vim ### 並回車,則表示希望編輯###這個文件,例如vim .xinitrc,則編輯.xinitrc這個文件,如果這個文件不存在,則表示新建這個文件並編輯。好了,你趕快試試吧,然後我將告訴你如何輸入一些文本。
vim的工作模式
彆着急,要想輸入文本,要先熟悉一下Vim的工作模式。(我第一次就是在輸入了vim後,就開始劈里啪啦的輸入,可是怎麼沒反映啊!?)
vim的工作模式有三種,分別是正常(Normal)模式、插入(insert)模式和可視(visual)模式。這就是說Vim在不同的模式下工作的表現形式是不同的。在進入vim後,默認的模式是Normal模式,這時可以輸入一些命令,不過別急,咱們先輸入一些文本看看。在Normal模式下,單擊i或者a,則進入insert模式,這時你可以輸入了。爲了後面的學習,你多輸入些內容。輸入結束後,單擊Esc鍵,回到Normal模式,然後輸入:w filename,如果你啓動vim時已經包含文件名,輸入:w(注意包括冒號),則將文件存盤。
OK,恭喜你!你現在已經能夠啓動vim,輸入內容並存盤了。
下面我們我們簡單介紹一下模式的內容。
前面說過,vim在不同的模式下有不同的工作方式,例如輸入文本內容在insert模式下,其他進行修改、刪除、拷貝、粘貼等在Normal模式下。因此當你發現輸入錯誤想修改時必須切換到Normal模式下進行,是不是很麻煩啊!我當初也是這樣認爲的,但是你一旦習慣後,你就會覺得它的好處了!切換到Normal模式就是單擊Esc鍵,vim的屏幕下面有當前工作模式的提示。進入輸入文本的insert模式是輸入i或者a。i和a這倆個指令的區別就是i代表在光標前插入字符,a代表在光標後插入字符,就是這麼簡單,OK,如何用就看你的了!
編輯文本
進行文本編輯,應該是Unix初學者最開始碰到的問題。Unix下的默認配置文件經常要修改的啊!所以掌握編輯方法是非常重要的。並且本文的目的就是讓初學者掌握簡單而又實用的編輯、修改命令。至於其他的高級使用方法,可以參考其他書籍!
OK,咱們就開始學習吧!
移動光標是最基本的,下面都是移動光標的命令,看看那個好記,就記住吧。
在Noraml模式下,鍵盤上的h、j、k、l 分別代表左、下、上、右移動光標。OK,在你剛纔編輯的文檔中試試移動光標,爽吧!再也不用移動手指到那4個方向鍵了!
什麼?你說這4個鍵一次只能移動一個字符和一行,太慢了!OK,下面幾個快速移動光標的方法你有精力就記住吧!
一次移動一個字(word)
w和b指令一次分別向後/向前移動一個字。
注:(1)可以用數字來進行移動多個Word,例如3w,2b就是分別向右(向後)移動3個word, 和2個word。
(2)中文因爲是連在一起的,所以如果沒有空格或者數字、英文標點的話,將視爲一個word。
移動到一行的頭和尾
^ :行頭 $ :行尾
注:行尾$,可以用3$移動到下面第3行尾,行首^ 不支持數字。
如何跳到指定行?
nG
注:(1)n表示第n行,例如10G,則跳到第10行,且光標在行首。
(2)如果沒有n,只有G,則跳到最後一行,且光標在行首。
我想用G命令,但是如何知道第幾行?OK,在Normal模式下輸入:set number就可以顯示行號了,如果想關閉行號,則輸入:set nonumber。
好了,移來移去,來點別的吧,例如如何修改,複製。OK,GO!
先來看看如何進行修改吧。Word和其他的一些文本編輯器都是編輯和輸入混雜在一起的,輸入的同時就可以修改。而Vim的這些編輯指令必須在Normal模式下,切記!
修改命令
刪除:
在word等編輯器下,如果輸入錯了,我們可以用Delete和Backspace鍵刪除,然後再重新輸入,vim也可以這樣,x就是刪除光標所在處的字符(char),dw就是刪除一個字(word),然後在輸入i或者a進行新內容的輸入。
刪除整行如何操作?dd就可以刪除光標所在行。
那刪除光標所在處到本行的結尾呢?D或者d$就可以了。還記得$嗎?代表什麼來着?
刪除結束還要在輸入i 或者a 才能輸入真麻煩!有沒有刪除後就進入inster模式的指令呢?當然有,就是關於c的指令,cw是刪除一個Word,cc刪除整行,c$和C都是刪除光標所在處到本行的結尾。你可能已經明白了,其實c的指令是修改指令。
好了,你是否已經把內容刪乾淨了,沒有可以編輯的內容了呢?呵呵,沒關係,u指令可以讓你恢復刪除的內容。在Normal模式下,輸入u,就恢復了,重複輸入u就把整個內容都恢復了,u就是其他文本編輯器裏的Undo的指令,對應的Redo指令就是[Ctrl]r。需要注意的是在不同模式下,u 的含義是不同的。如果在instert模式下輸入然後在Normal模式下執行u,則會刪除上一次輸入的所有內容。如果是在 Normal 模式下執行其他的指令例如x,然後再執行u,就恢復一次 Normal 下的指令。Redo也一樣。
OK,讓我們來學習更加重要的功能吧!
剪切、複製、粘貼等相關
剪切、複製等這些指令都是同塊(block)相關的操作,因此無論如何都要先了解一下塊的基本知識。vim裏用mark來定義一個標記,然後用y指令把指定的內容進行復制到緩存中,然後用p來粘貼。!@#¥%^&,天啊,太複雜了。沒關係,咱們用個例子來說明吧,很簡單的!
例如下面的文本:
this is the first line
this is 2nd line
我們可以先把光標移動到第一行的行首,然後切換到Normal模式(還記得如何切換嗎?),輸入ma(表示標記a),然後移動光標到第2行的2nd處,輸入y`a(表示把標記a到光標所在處複製到緩存中),然後移動光標到你希望粘貼的地方輸入p(表示粘貼)。OK你已經完成了最基本的複製、粘貼功能。
下面我們看看這幾個命令(m,y,p)的情況。
m指令。m指令非常簡單,他就是做標記,你可以做從a到z的26個標記例如ma,mb,mc等。他在很多指令中會用到,例如刪除,這本入門就不介紹了,你可以參考其他書籍。
y指令表示yank,其實就是拷貝。不過他有其他的指令形式,例如yy複製整行。
p指令就是粘貼。例如上面的例子。
OK,既然你知道了yy指令,那希望複製一行並粘貼的話,我想你應該知道如何操作了吧(yy,p)。
也許你用m做標記感覺不是很舒服,OK,我們來個可視的塊的選擇方法。那就是v指令。
記得在其他的文本編輯器裏我們可以用鼠標選擇一些文本,然後copy,paste,在vim裏一樣可以,當然希望用鼠標最好用gvim。現在來試試v的指令吧。
在Normal模式下,輸入v(看到屏幕下面的visual模式提示了嗎?),然後移動光標,看到被選擇的內容了吧 。選擇好了,你可以輸入d把他們刪除,也可以輸入y將他們複製到緩存中,然後用p來粘貼到你希望的地方。什麼多次粘貼,多按幾次p就可以了,也可以輸入#p,#代表連續粘貼的次數,例如粘貼100次,就輸入100p。
OK,我想你一定喜歡上v命令了,還有V和[CTRL]v呢!V(大寫)是表示可視行,就是代表你移動光標時,選擇的範圍是行,不像小寫的v是一個字符。另外[CTRL]v是選擇方塊,你可以試試,就清楚了!
好了,基本的東西就這些了,當然還有幾個也不錯的命令東東,很簡單,它能高效的配合你上面的基本工作,那還猶豫什麼!開始吧!
連接行
你在編輯的時候,一定會碰見希望把兩行或者多行合併成一行的情況。好,vim已經給你設計好了,就是J指令,注意是大寫(j是什麼?)。J表示將光標所在行和下一行合併成一行,如何合併多行,可以輸入#J,#代表希望合併的行數,例如3J。
插入新行
怎麼插入新行?用o或者O指令(不是零)。o是在當前行下插入新行,大寫O是在當前行上插入新行。真是簡單,而且直接進入instert模式,不錯,設計的很貼心。
如何在一行內查找一個字符(或者一箇中文單字)?
使用fx,Fx,tx,Tx指令。其中x代表欲查詢的字符。他們的區別是:fx(向右)查x,且光標停在x上,Fx(向左)查x,且光標停在x上,tx(向右)查x, 且光標停在x前,Tx(向左)查x, 且光標停在x後。
如何查找字符串?
使用/xxxxx。其中×××××爲需查找的內容。當查到多個內容時,可以輸入n來將光標定位到下一個位置。此外查找命令有歷史記錄功能,可以輸入/,然後用光標上、下鍵來切換已經查過的內容。要注意的是幾個特殊的字符必須在前面加。這幾個字符爲:.*[]^%/?~$。如果想往回查找,則輸入?,改變查找順序,再輸入n來進行定位。當然也可以用N來反向查找。
如何翻頁(半頁)?
使用[ctrl]u和[ctrl]d。其中^u爲向上翻半頁,^d爲向下翻半頁。
如何插入一些特殊的字符,例如:∮等?
使用:digraphs來顯示特殊字符的列表,然後輸入CTRL+K+顯示出來的2個字符來輸入特殊字符,例如輸入CTRL+K+I+o,則爲∮。
哦!忘記了告訴你如何退出vim!
在Normal模式下,輸入ZZ就可以保存文檔並退出。
在Noraml模式下,輸入:q!可以強制退出,就是不保留修改退出。
好了,享受Vim吧!
基本上vi可以分爲三種狀態,分別是命令模式(command mode)、插入模式(Insert mode)和底行模式(last line mode),各模式的功能區分如下:
1) 命令行模式command mode)
a) 進入vi
不過有一點要特別注意,就是您進入vi之後,是處於「命令行模式(command mode)」,您要切換到「插入模式(Insert mode)」才能夠輸入文字。初次使用vi的人都會想先用上下左右鍵移動光標,結果電腦一直嗶嗶叫,把自己氣個半死,所以進入vi後,先不要亂動,轉換到「插入模式(Insert mode)」再說吧!
3、命令行模式(command mode)功能鍵
1). 插入模式
在使用「last line mode」之前,請記住先按「ESC」鍵確定您已經處於「command mode」下後,再按「:」冒號即可進入「last line mode」。
1、下表列出命令模式下的一些鍵的功能:
左移光標一個字符
右移光標一個字符
光標上移一行
光標下移一行
光標移動至行首
數字“0”,光標移至文章的開頭
光標移至文章的最後
光標移動至行尾
向前翻屏
向後翻屏
向前翻半屏
向後翻半屏
在光標位置前插入字符
在光標所在位置的後一個字符開始增加
插入新的一行,從行首開始輸入
從輸入狀態退至命令狀態
刪除光標後面的字符
刪除光標後的#個字符
(大寫X),刪除光標前面的字符
刪除光標前面的#個字符
刪除光標所在的行
刪除從光標所在行數的#行
複製光標所在位置的一個字
複製光標所在位置的#個字
複製光標所在位置的一行
複製從光標所在行數的#行
粘貼
取消操作
更改光標所在位置的一個字
更改光標所在位置的#個字
2、下表列出行命令模式下的一些指令
w filename
儲存正在編輯的文件爲filename
儲存正在編輯的文件爲filename,並退出vi
放棄所有修改,退出vi
顯示行號
查找,在/後輸入要查找的內容
與/或?一起使用,如果查找的內容不是想要找的關鍵字,按n或向後(與/聯用)或向前(與?聯用)繼續查找,直到找到爲止。
對於第一次用vi,有幾點注意要提醒一下:
1、用vi打開文件後,是處於「命令行模式(command mode)」,您要切換到「插入模式(Insert mode)」才能夠輸入文字。切換方法:在「命令行模式(command mode)」下按一下字母「i」就可以進入「插入模式(Insert mode)」,這時候你就可以開始輸入文字了。
2、編輯好後,需從插入模式切換爲命令行模式才能對文件進行保存,切換方法:按「ESC」鍵。
3、保存並退出文件:在命令模式下輸入:wq即可!(別忘了wq前面的:)
(h,j,k,l,w,b等等)或者是指行號.
# (這裏#代表一個數字)
執行n次後面的命令...
: 進入ex模式
) 下一句
( 上一句
} 下一段
{ 上一段
]] 下一節
[[ 上一節
0 行的開頭
$ 行的末尾
^ 行的第一個非空白字符
+ 下一行的開頭
- 上一行的開頭
(空格) 下一個字符
(回車) 下一行
/ 向前搜索
? 向後搜索
% 查找當前小(中,大)括號的匹配字符
, 逆向重複上一個f,F,t或T操作
; 重複上一個f,F,t或T操作
. 重複上一個操作
` 轉到標記處
' 轉到標記所在行的開頭
`` 查找前回到上一個做標記的地方
'' 查找前回到上一個做標記所在行的開頭
~ 切換字符的大小寫
" 保存到寄存器中
!! 重複上一次SHELL命令
! 把後面的文本送給命令, 取代輸出(例如,
!}fmt把當前的段落
送給命令fmt處理,然後用fmt返回的東西替換輸出.)
>> 右移當前段落一個移動寬度(shiftwidth)
<< 左移當前段落一個移動寬度(shiftwidth)
>%
從當前到匹配小(中,大)括號之間的文本右移
<%
從當前到匹配小(中,大)括號之間的文本左移
(似乎漏了一個符號|, 移動到某一列----譯註)
a 在當前位置之後添加
A 在當前行的末尾添加
^a 沒有使用
b 上一個單詞的開頭
B 上一個單詞的開頭,忽略標點符號
^b 上移一屏
c 覆蓋...
C 覆蓋到行末尾
^c 終止插入模式,在命令模式沒有用
d 刪除...
D 刪除到行末尾
^d
下移半屏,如果在插入模式下則移到上一個移動寬度(ShiftT-ab)處
e 單詞的末尾
E 單詞的末尾,忽略標點符號
^e 屏幕下卷一行
f 查找...
F 向後查找...
^f 下移一屏
g 未用
G ...跳至[缺省是到文件末尾]
^g 顯示狀態欄
h 左移
H 屏幕上的第一行
^h 在插入模式下是退格,命令模式下是左移
i 在當前的位置前面插入
I 在本行的第一個非空白字符前面插入
^i 插入模式下是製表鍵,命令模式下未用
j 下移
J 把下一行合併到本行
^j
命令模式下是下移,插入模式下是建一個新行
k 上移
K 未用
^k 未用
l 右移
L 屏幕中的最後一行
^l 重繪屏幕
m 把當前位置標記到寄存器中
M 屏幕的中間行
^m 回車
n 重複上次查找
N 逆向重複上次查找
^n 命令模式下是下移
o 在當前行的下面建一個新行
O 在當前行的上面建一個新行
^o 未用
p 在當前行的下面粘貼
(譯註--應爲在當前位置的後面粘貼)
P 在當前行的上面粘貼
(譯註--應爲在當前位置的前面粘貼)
^p 命令模式下是上移
q 未用
Q 退出並且啓動ex
^q 未用
r 覆蓋當前的字符
R 在插入模式下一直覆蓋字符
^r 在命令模式下面重繪屏幕
s 替換
S 替換整行
t 到...
T 向後到...
^t 移到下一個移動寬度(shifttab)處
u 撤消上一次操作
U 撤消對本行的所有修改
^u 上移半屏
v 未用
V 未用
^v 未用
w 下一個單詞的開頭
W 下一個單詞的開頭,忽略標點符號
^w
命令模式下未用,在插入模式下是到上一個單詞的開頭處
x 刪除當前字符
X 刪除前一個字符
^x 未用
y 複製...
Y 複製整行
^y 屏幕上卷一行
z 重新配置當前行周圍的屏幕
ZZ 保存之後退出
^z 未用
(譯註--在命令模式下,^z執行了UNIX暫停操作)
6.1 - 命令模式的輸入選項(:命令)
(注: 這不是一個規範的列表,,
我只是列出了一些最重要的命令)
:r <文件> 把<文件>讀入到當前文檔
:r !<命令> 把<命令>的輸出插入到當前文本中
:nr <文件> 把<文件>插入到第n行
:!<命令> 運行<命令>,然後返回
:sh 轉到SHELL
:so <文件> 讀取<文件>,再執行文件裏面的命令
(譯註--文件中的命令應該都是一些ex命令)
:x 保存之後退出
:wq 保存之後退出
:l1,l2w
<文件>把第l1和第l2行之間的文本寫到<文件>中去,如果沒-有指定<文件>,
vi就假定是當前文件,如果沒有指定l1,l2,就假定是整個文-件(就成了:w)
:w >> <文件> 添加到<文件>末尾. 也可以使用行號
:w! 覆蓋當前文件
:q 退出
:q! 不存盤就退出
:e <文件> 不離開vi編輯<文件>
:e! 重新編輯當前文件,忽略所有的修改
:n 編輯下一個文件
:e +n <文件>
從第n行開始編輯<文件>,如果超過了末尾,就從末尾開始編輯
:e#
編輯替換文件(如果使用了命令:e<文件>,替換文件就指的是原-始文件)
:args 顯示所有要編輯的文件
:rew 重新回到第一個編輯的文檔
:map m n 創建一個宏(使 m 做 n)
:map! m n 創建一個插入模式的宏(使 m 做 n)
:unmap m 刪除宏m
:unmap! m 刪除插入模式的宏m
:ab <1> <2> 縮寫,敲<1>的時候用<2>取代
:unab <1> 取消縮寫<1>
:set <選項> 設置<選項>...
6.2 - 設置選項(set)
可以使用括號中的縮寫形式. 語法:
:set <選項> <參數> (如果需要參數的話)
也可以在一行中指定多個選項
:set <選項>? 顯示出當前這個選項的參數值
:set all 則顯示所有的選項值
對那些無須參數的選項來說,使用:set
no<選項>就可以把它給關了
選項: 缺省值: 含義:
autoindent (ai) noai
使新行自動縮進,和上(下)行的位置對齊
autoprint (ap) ap
每條命令之後都顯示出修改之處
autowrite (aw) noaw
在:n,:!命令之前都自動保存文件
beautify (bf) nobf
在輸入的時候忽略所有的控制字符
(除了製表鍵(tab),換行(newline),進紙(for-mfeed))
directory= (dir=) /tmp 存放緩衝區的目錄名
edcompatible noedcompatible
在替換的時候使用類ed的用法
errorbells (eb) errorbells 出錯的時候響鈴
exrc (ex) noexrc
允許在主目錄(home)外面之外放.exrc文件
hardtabs= (ht=) 8 設置硬製表的邊界
ignore case (ic) noic 正規式裏忽略大小寫
lisp nolisp 打開lisp模式
list nolist
顯示所有的製表鍵和行的結尾
magic magic
可以使用更多的正規表達式
mesg mesg 允許向終端發送消息
number (nu) nonumber 顯示行號
open open 允許開放和可視化
optimize (opt) optimize
優化吞吐量,打印時不發回車
paragraphs= (para=) IPLPPPQPPLIbp 設置{ & }的分界符
prompt prompt
命令模式下的輸入給出:的提示符
readonly (ro) noro
除非用!號否則不準保存文件
redraw noredraw 當編輯的時候重繪屏幕
remap remap 允許宏指向其他的宏
report= 5
如果影響的行數>這個數的話就報告
scroll 1/2 window
下卷屏幕時滾動屏幕的數目,
同樣這也是z命令輸出的行數(z 輸出2倍滾屏的大小)
sections= SHNHH HU
定義節的末尾(當使用命令[[ 和 ]] 時)
shell= (sh=) /bin/sh
缺省的SHELL,如果設置了環境變量SHELL的話,就使用變-量
shiftwidth= (sw=) 8
當使用移動(shift)命令時移動的字符數
showmatch (sm) nosm 顯示{, }, (, ), [, 或者 ]
的匹配情況
showmode noshowmode
顯示你處在什麼模式下面
slowopen (slow)
插入之後不要立刻更新顯示
tabstop= (ts=) 8
設置製表停止位(tabstop)的長度
taglength= (tl=) 0
重要標記的字符個數(0表示所有的字符)
tags= tag, /usr/lib/tags
定義包含標記的文件路徑
term= 設置終端類型
terse noterse 顯示簡短的錯誤信息
timeout (to) timeout 一秒鐘後鍵盤映射超時
ttytype= 設置終端類型
warn warn 顯示"No write since last
change"信息
window= (w=) 可視模式下窗口的行數
wrapmargin= (wm=) 0
右邊距,大於0的話最右邊的單詞將折行,留出n個空白位置
wrapscan (ws) ws
查找到文件尾後再重頭開始
writeany (wa) nowa
可以保存到任意一個文件去
#cd /usr/src
#make kernel KERNCONF=GENERIC