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
命令:
:line
d 刪除指定行
:line,line
d 刪除指定范圍的行
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
、.vimrc
vi .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
即在當前目錄中查找第二個初始化文件。
Vim
vimtutor