Vim 好用的 ex 命令 筆記
分類
說明
ex 命令是 vim 內部執行的命令,以 : 開頭,本篇將分享一些好用的 ex 命令。
備註
- [] 代表選填,可不填
- 外殼 shell 是執行命令的介面,就像終端打指令一樣。
[++opt]
跟開啟檔案格式有關。
++fileformat={value}
換行符號格式
選項 | 換行符號 |
---|---|
dos |
<CR><NL> |
unix |
<NL> |
mac |
<CR> |
範例
++fileformat=unix
換行符號使用 unix 格式
[+cmd]
參數可以用來在新打開的文件定位光標或執行任何其他命令:
命令 | 說明 |
---|---|
+ |
從最後一行開始。 |
+{num} |
從第 {num} 行開始。 |
+/{pat} |
從匹配 {pat} 的第一行開始。 |
+{command} |
打開新文件以後執行 {command} 。 |
{command}
可以是任何 Ex 命令。
{pat}
就是 pattern 匹配。
[range]
這被稱作 [range]
(範圍)。 它由一個或多個被 ,
或 ;
分割的行限定字元組成。
當範圍被 ;
分割時,在解釋下一個行限定符之前,遊標的位置會被設定為前一個行限定符確定的行值。也就是 :100;+3
一定會假設游標位置是100,即使目前游標位置不是100。
命令 | 說明 |
---|---|
:1,3 |
第1到3行。 |
:2,+3 |
第2行到當前行的後三行。 |
:2;+3 |
第2行到第2行的後三行。 |
特殊符號
行號可以用下列符號限定:
符號 | 說明 |
---|---|
. |
當前行 |
$ |
文件的最後一行 |
% |
相當於 1,$ (整個文件) |
/{pattern}[/] |
下一個匹配 {pattern} 的行 |
幫助文件 :help :range
位移
這些符號後面可以跟著 (一個或多個) +
或 -
和一個可選的數字。該數字會與前面的行號相加或相減。若該數字省略,則認為是1,同 +1
。
++
或 --
就是 +2
和 -2
意思,跟符號數相同。
如果 +
或 -
前為空,使用當前行,也就是 .+
。
0
與 1-
相同,都是放在檔案開頭。
幫助文件 :help :range-offset
範例
:.,$
當前行到結尾
:1,.
1到當前行
:%
所有行
:.,.+10
當前行到當前行後10行
:.,+5
當前行到當前行後5行,.
省略
:1,$-2
1到最後一行-2行
:+,++
下一行到下下一行。
:2,3co0
將2到3行複製到檔案開頭
Range Pattern
查看幫助文件 :help :range-pattern
使用 pattern
匹配模式當作範圍。
範例
:/pattern/d
刪除下一個包含 pattern 的行。
:/pattern/+d
刪除下一個包含 pattern 的下一行。
:/pattern1/,/pattern2/d
從第一個包含 pattern1 的行刪除到第一個包含 pattern2 的行。
:.,/pattern/d
從當前行刪除到第一個包含 pattern 的行。
反向搜尋,將 / 換成 ? 即可。
{address}
指定行號,用法同 [range]
。
[x]
可自訂暫存器,也可忽略使用默認的暫存器,關於暫存器請參考 Vim 暫存器。
| 分割命令
查看幫助文件 :help :bar
|
可以用來分割命令,所以你可以在一行裡輸入多個命令。如果你想在參數裡使用 |
,應在前面加上 \
。
範例:
:1,3d | g/a
刪除1到3行,顯示有 a 的行內容。
命令列補全
幫助文件 :help cmdline-completion
在編輯命令列的時候,有一些指令可以用來補全遊標前面的單字。
以下是可以使用的指令:
CTRL-D
列出與遊標前面的模式所匹配的名字。
'wildchar'
選項
用遊標前的模式完成匹配。匹配的項目 (如果有多項匹配,則選第一項) 會插入並取代模式。大致上就是按 <Tab>
自動補全的功能。
命令
:#
:[range]# [count] [flags]
和 :number
相同。
範例
1,3#
顯示1到3行內容。
:=
:= [flags]
顯示末行的行號。
:{range}= [flags]
顯示 {range}
範圍內最後一行的行號。
範例
:=
列印總行數。
:.=
列印當前行號。
:!{cmd}
:!{cmd}
在外殼裡執行 {cmd}
命令,命令完成後會返回 vim。
:[range]!{cmd}
指定範圍執行 {cmd}
,其輸出結果將替代原有的內容。
:copy
:[range]co[py] {address}
把 [range]
指定的行複製到 {address}
給出的行之下。
範例
:1,3co4
複製1到3行到第4行之下。
:delete
:[range]d[elete] [x]
刪除 [range]
範圍的行 (預設: 目前行) [到暫存器 x 裡]。
範例
:1,3d
刪除1到3行。
:help
<Help>
或
:h[elp]
開啟一個視窗並以唯讀方式顯示幫助文件。
:h[elp] {subject}
類似 :help
,但附加跳到 {subject}
標籤上。
例如: :help options
獲取特定幫助
如果查找特定類型的幫助,可以通過前綴進一步指定上下文:
類別 | 前綴 | 例子 |
---|---|---|
普通模式指令 | 無 | :help x |
可視模式指令 | v_ | :help v_u |
插入模式指令 | i_ | :help i_<Esc> |
命令列模式指令 | : | :help :quit |
命令列編輯 | c_ | :help c_<Del> |
選項 | ‘ | :help 'textwidth' |
:move
:[range]m[ove] {address}
把 [range]
指定的行移到 {address}
給出的行之下。
範例
:1,3m4
將1到3行移動到第4行之下。
:number
:[range]nu[mber] [count] [flags]
和 :print
相同,但每行之前顯示行號。
:[range]p[rint] {count} [flags]
顯示 {count}
行,從 [range]
指定的範圍開始。
:put
:[line]pu[t] [x]
放置文字 [從暫存器 x
] 在行號 [line]
(默認為目前行) 之後。
:quit
:q[uit]
退出當前窗口。如果是最後的一個 edit-window,退出 Vim。
:q[uit]!
退出不保存,即使當前緩衝區發生了修改也是。
:read
:r[ead] [++opt] [name]
在遊標下方插入檔案 [name]
(預設: 當前檔案)。
:{range}r[ead] [++opt] [name]
在指定行下方插入檔案 [name]
(預設: 當前檔案)。
:[range]r[ead] [++opt] !{cmd}
執行 {cmd} 並將它的標準輸出插入到遊標下方。
範例:
:0r /path/to/file
在檔案開頭插入 /path/to/file
的內容。
:$r /path/to/file
在檔案結尾插入 /path/to/file
的內容。
:shell
:sh[ell]
該命令啟動一個外殼。外殼退出後 (執行完 exit
命令或按 <Ctrl-d>
),你會回到 Vim。
:t
和 :copy
等價,此命令在 Vim9 腳本裡不支持,因為它太容易和變數名稱混淆了。
建議記住 :copy
就好。
:wq
:wq [++opt]
寫回當前的文件並且關閉視窗。 如果是最後的一個 edit-window ,Vim 退出。
範例
:wq
儲存當前檔案並離開
:write
:w[rite] [++opt]
將整個緩衝區寫入當前文件。
:[range]w[rite] [++opt] {file}
將指定行寫入文件 {file}
。
:[range]w[rite]! [++opt] {file}
將指定行寫入文件 {file}
。覆蓋已存在的文件。
:[range]w[rite][!] [++opt] >>
將指定行附加到當前文件後。
幫助文件 :help :w_a
:[range]w[rite][!] [++opt] >> {file}
將指定行附加到檔案 {file}
之後。!
強制寫入,即使該檔案還不存在。
範例
:w
儲存當前檔案
:w {file}
儲存到 {file}
檔案,不指定 [range]
就代表全寫,就像另存新檔。
:w! {file}
強制將檔案寫入到 {file}
,例如:我用 vim 開啟 a 檔案 $ vim a
,假設已經存在 b 檔案,我可以用 :w! b
寫入到 b 檔案。
:1,100w >> {file}
將1到100行附加到 {file}
。
:xit
:[range]x[it][!] [++opt] [file]
和 :wq
類似,但只有在檔案已修改時寫入才會實際進行。
平常我都會使用 :wq
,比較少會用 :x
。
:yank
:[range]y[ank] [x]
抽出 [range]
所指定的行 [到暫存器 x
]。
相關文章:
一杯咖啡的力量,勝過千言萬語的感謝。
支持我一杯咖啡,讓我繼續創作優質內容,與您分享更多知識與樂趣!