vi文本編輯器vi重要的原因kedit gedit Pico Nano
POSIX / Single Unix Specification
vi歷史簡介ed em en ex vi
Vim:vi的備用編輯器^G 顯示文件名稱
Vim:vim
vim -C [ -rR ] [ file… ]
-C compatibility mode
editing buffer
Ctrl Shift Return Esc
command mode 輸入模式 input mode
:set showmode
vi:view、vi –R
-R Read-only
vi -r test.c
-r recover
交換文件 swap file .test.c.swp
編輯完成後刪除交換文件。
vi!字符有時候用來表示忽略某些類型的檢查。
vi使用屏幕的方式插入控制字符 ^V,後面跟希望輸入的控制字符
制表符(8個空格) ^I
vi和ex命令vi命令 單字母或雙字母,無需return鍵:w,dd ex命令 以冒號開頭,按徹底取消命令,特殊鍵糾正命令
刪除鍵入的最後一個字符
^W
刪除鍵入的最後一個單詞
^X/^U
刪除整行
vi命令的策略- 將光標移動到上一行的開頭
+/ 將光標移動到下一行的開頭
0 當前行的開頭
$ 當前行的末尾
^ 當前行的第一個非空格/制表符的字符上
w 下一個單詞詞首
e 下一個單詞詞尾
b 上一個單詞詞首
大寫忽略標點符號
) ——> 下一個句子
( <—— 上一個句子
} 下一個段落
{ 上一個段落
^F forward
^B backward
^D down 向下移動半屏
^U up 向上移動半屏
n ^D/D 設置跳轉行數
以不可見的名稱標記任意行
鍵入m,後面跟一個字母,該字母就是這一行的名稱。跳轉到這一行可以鍵入一個反引號或一個單引號,後面跟這一行的名稱。
:/ :? n N
使用正則表達式
.
匹配除新行字符之外的任意單個字符(相當於?)
^
錨:匹配行的開頭
$
錨:匹配行的末尾
\<
錨:匹配單詞的開頭
\>
錨:匹配單詞的末尾
[list]
字符類:匹配list中的任何字符
[^list]
字符類:匹配不在list中的任何字符
\
引用:從字面上解析元字符
/M . .
/M[a-z][a-z]
/H[a-z]*y
nG 跳轉到第n行 vi
1G 跳轉到第1行 vi
gg 跳轉到第1行 vi
G 跳轉到最後一行 vi
:n 跳轉到第n行 ex
:1 跳轉到第1行 ex
:$跳轉到最後一行 ex
都改變到輸入模式:
i = insert a = append
i 光標位置之前
a 光標位置之後
I 當前行開頭
A 當前行末尾
o 當前行下面
O 當前行上面
特殊鍵依然可以使用,不必離開輸入模式。
^V^H 控制字符只算一個字符。
r 精確修改一個字符(不進入輸入模式)
R 改寫,鍵入的每一個字符都覆蓋當前行上的一個字符 R替換文本時,vi不會離開當前行,字符超過行尾,只是在這一行的末尾追加額外的字符
s 使用多個字符替換一個字符(**substitute)
C 替換從當前光標到行末的所有字符(change)
cc 替換一整行
S 替換一整行
cmove 以插入方式從當前光標替換到move所給出的位置
ex):s/pattern/replace/
都是ex命令,substitute
:s/UNIX/Linux
替換當前行上該模式的第一個匹配項
:s/UNIX/Linux/gc
g=global, c=confirm
:sUNIX//g
刪除模式
:57s/UNIX/Linux/
替換特定行
:57,63s/UNIX/Linux/
替換指定范圍的行
:.,$s/UNIX/Linux
.代表當前行,$代表最後一行
:%s/UNIX/Linux/cg
%代表所有行
vi命令:
`x` 刪除光標處的字符
`X` 刪除光標左邊的字符
`D` 刪除光標到行末的字符
`dmove` 刪除光標到`move`所給位置處的字符
`dd` 刪除當前行
d與c類似
ex命令:
:lined 刪除指定行
:line,lined 刪除指定范圍的行
u 撤銷上一命令對編輯緩沖區的修改
U 恢復當前行
. 重復上一命令對編輯緩沖區的修改
vi中一共有9個這樣的緩沖區,分別編號為1至9。將一個編號緩沖區中的內容插入到編輯緩沖區中,鍵入一個”(雙引號),後面跟著一個p或P(put,與o類似)命令。
"1p "2p "1pu.u.u.u.u
在撤消了第一次插入之後,如果使用.(點號)命令重復插入,那麼vi將自動地將緩沖區編號加1。
p 無名緩沖區的內容插入到光標的右邊
P 無名緩沖區的內容插入到光標的左邊
xp 調換兩個字符
deep 調換兩個單詞(光標開始處於第一個單詞的左邊)
ddp 調換兩行
y、yy或Y命令將文本由編輯緩沖區復制到無名緩沖區; 將光標移動到希望插入文本的位置; 使用p或P執行插入。
在不刪除文本的情況下將文本復制到無名緩沖區時,稱之為接出(yank)了文本。
yw
接出了1個單詞
y10w
接出了10個單詞
y10W
接出了10個單詞(忽略標點符號)
yb
接出了1個單詞
y2(
接出了2個句子
y5}
接出了5個段落
yy
接出1行
10yy
接出10行
y0
接出了從當前字符到這一行開頭之間的文本
y$
接出了從當前字符到這一行末尾之間的文本
Y = yy y與d類似,yy與dd類似,Y與D完全不同。
~命令改變字母的大小寫,然後光標向右移動一個位置。(大范圍內連續使用~時安全的)
對於有些vi來說,~命令不會越過一行的末尾。我的vim –C就是如此。
第一種類型的選項是開關(switch):set showmode noshowmode
第二種類型的選項是變量(variable) :set tabstop=4
^I,將行的結束顯示為$
number
nu
off
顯示行號
readonly
ro
off
不允許修改編輯緩沖區的內容
showmatch
sm
off
輸入模式:顯示匹配的()、{}和[]
shownmode
smd
off
當進入輸入模式時顯示一個提醒
wrapscan
ws
off
在搜索過程中,環繞到文本的開頭/ 末尾繼續搜索
writeany
wa
off
允許不需要重載!就可以寫入任何文件
lines
-
24
文本的行數
shiftwidth
sw
8
autoindent使用的空格數
tabstop
ts
`8
制表符間距
wrapmargin
wm
0
設置自動換行時的頁邊距
:set [ option [?]… | all ]
顯示所有選項的值 :set all
顯示一個選項的值 :set number?
顯示改變了默認值的選項 :set (讀取初始化文件改變)
:set wrapmargin=?
:set wm=?
將光標移到單詞後的空格處,然後鍵入r。r命令使用新行字符取代空格,從而將行分隔。
將光標移動到第一行,並鍵入J(大寫字母J)將把當前行與下一行合並成一個長行,可以在J命令之前放置一個重復次數。
ex)在所有的ex命令中,.(點號)代表當前行,$代表編輯緩沖區中的最後一行,0代表編輯緩沖區的開頭。
:x [ , y ] co z
:x [ , y ] m z
在命令名稱前面指定一個單獨的行號或一個行號范圍,這就是要移動的或復制的行。在命令名稱之後,可以指定目標行號,新行將插入到目標行的下面。
:5co10 復制第5行到第10行下面
:4,8m20 移動第4至第8行插入到第20行的下面
交換緩沖區的上下兩部分
:1 , . m $ : . , $ m 0
shell命令
`:!command` 暫停`vi`,執行`shell`命令
`:!!` 暫停`vi`,執行最近一條命令
`:sh` 暫停`vi`,啟動默認`shell`
`:!bash` 暫停`vi`,啟動`bash`
`:!tcsh` 暫停`vi`,啟動`tcsh`
:[ line ] r file
: r 命令讀取文件的內容,並將該內容插入到編輯緩沖區中指定行之後。
:10 r info
:0 r info
:$ r info
如果省略了行號,vi將把數據插入到當前行之後。
shell命令的輸出插入到編輯緩沖區:r有一種特別有用的變體。如果在:r命令之後不是鍵入文件的名稱,而是鍵入一份!(感歎號),後面跟一個程序的名稱,那麼vi將執行該程序,並將程序的輸出輸入插入到編輯緩沖區中。
:r !ls
:0r !date
:line r file 在指定行後面插入文件file的內容
:r file 在當前行後插入文件file的內容
:line r !program 在指定行後插入程序program的輸出
:r !program 在當前行後插入程序program的輸出
fmt使用!和!!命令將把編輯緩沖區中的行發送給另一個程序,該程序的輸出將替換原始行。
n!!program 在n個行上執行程序program
!move program 從當前行至move行執行程序program
將光標移到到希望處理的開始位置,鍵入希望處理的行數,後面跟!!(兩個感歎號)以及程序的名稱,再後跟鍵。
5!!sort 10!!fmt
!(單感歎號)命令的工作方式與此相似,只是在!命令在指定輸入行的范圍時更具有靈活性。
!}fmt
格式化整個編輯緩沖區
gg
!Gfmt
ex命令w,允許在不退出vi的情況下,不時地備份數據。
`:w` 將數據寫入原始文
`:w file` 將數據寫入到一個新文件中
`:w! file` 覆蓋一個已有的文件
`:w>>file` 將數據追加到指定的文件中
只保存編輯緩沖區中的特定行,則可以采用通常的方法指定行號。例如,為了將第10行寫入到文件save中(替換save的內容),可以輸入:
:10w! save
為了將第10行至第20行追加到save中,可以使用:
:10,20w>>save
:wq == +ZZ`
當開始編輯一個新文件時,編輯緩沖區中的原有內容將會丟失,所以要確保首先使用:w命令將數據保存。
`:e file` 編輯指定的文件
`:e!` 重新編輯當前文件,忽略自動檢查
`:e! file` 編輯指定的文件,忽略自動檢查
為經常使用的單詞或表達式創建縮寫,使用:ab(abbreviate,縮寫)命令。
:ab [ sort long ]
:ab eg exception gifted
只有eg是一個單詞的時候才會進行替換,vi不會替換其他單詞中的eg,例如egotistical。
刪除縮寫:una(un-abbreviate,反縮寫)
:un short
通過輸入:ab命令本身查看所有的縮寫列表。
macro)允許創建自己的單字符命令,這些命令稱之為宏(macro)。(宏就是微型程序。)
:map [ x commands ]
x是一個字符,commands是vi或ex命令序列。
:map命令可以創建宏,即vi或ex命令序列的縮寫。宏名稱必須是單個字符。如果選擇早已擁有含義的字符作為命令,那麼原有含義將會丟失。
例如:map K deep :map X dd
存在命令覆蓋問題。
vi:比較適合作為宏名稱的字符
| 字母 | g K q v V Z|
|標點符號 | @ # * \|
|Ctrl字符 | ^A ^K ^O ^W ^X|
Vim:比較適合作為宏名稱的字符
|字母 | K q v V|
|標點符號 | @ \|
|Ctrl字符| ^@ ^A ^K ^O ^T ^X|
例:
:map * I/*^VA*/^V
I在行頭進入輸入模式。然後鍵入/*,後面跟一個空格。此時,按退出輸入模式。為了在宏中插入一個碼,我們鍵入^V(^V[Ctrl]告訴
+
Vvi接下來的鍵要從字面上解釋)。A(append,追加)命令在行的末尾進入輸入模式。然後鍵入一個空格,後面跟著*/。退出輸入模式,再次使用。
將宏賦給到的功能鍵。
:map #1 :set all
顯示所有的宏列表:
:map
移除宏:
:unmap x x是宏的名稱
.exrc、.vimrcvi .exrc dot-E-X-R-C
vim .vimrc dot-vim-R-C
rc run commands
vi/Vim初始化文件樣本
"==================================================
" Simple vi/Vim initialization file
"==================================================
"
"1.Option
set autoindent
set compatible
set showmatch
set showmode
set wrapmargin=6
"
"2.Abbreviations
ab eg exceptionally gifted
ab h Harley
"3.Maxros
map K deep
map X dd
map g 1G
map #5 {!}fmt^M
"4.shell commands
!date;sleep 2
一旦啟動,vi即在/home中查找初始化文件,執行初始化文件中的命令後,vi將查看exec選項。如果選項是打開的,vi即在當前目錄中查找第二個初始化文件。
Vimvimtutor