Vim 好用的 ex 命令 筆記


建立時間: 2023年7月19日 01:31
更新時間: 2024年1月19日 10:41

說明

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 意思,跟符號數相同。

如果 +- 前為空,使用當前行,也就是 .+

01- 相同,都是放在檔案開頭。

幫助文件 :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 相同,但每行之前顯示行號。


: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]。

觀看次數: 600
exvim命命

相關文章:

按讚追蹤 Enjoy 軟體 Facebook 粉絲專頁
每週分享資訊技術

一杯咖啡的力量,勝過千言萬語的感謝。

支持我一杯咖啡,讓我繼續創作優質內容,與您分享更多知識與樂趣!