雜項
Nvim 的 :help
頁面,由 原始碼 使用 tree-sitter-vimdoc 解析器 產生。
雜項指令
N<Del>
<Del>
輸入數字時:移除最後一位數字。
注意:如果您想使用
<BS>
來執行此操作,請將此映射新增至您的 vimrc
:map CTRL-V <BS> CTRL-V <Del>
:as[cii] 或
ga :as :ascii ga 列印游標下字元的 ASCII 值,以十進位、十六進位和八進位表示。助記符號:Get Ascii 值。
例如,當游標位於 'R' 上時
<R>
82,十六進位 52,八進位 122
當字元為非標準 ASCII 字元,但根據
'isprint' 選項可列印時,也會提供不可列印版本。
當字元大於 127 時,也會列印
<M-x>
形式。例如
<~A> <M-^A> 129,十六進位 81,八進位 201
<p>
<|~> <M-~>
254,十六進位 fe,八進位 376
(其中
<p>
是一個特殊字元)
檔案中的
<Nul>
字元在內部儲存為
<NL>
,但它會顯示為
<^@> 0,十六進位 00,八進位 000
如果字元可以作為雙圖插入,也會輸出可用於建立該字元的兩個字元
<ö> 246,十六進位 00f6,八進位 366,雙圖 o :
這表示您可以輸入
CTRL-K
o : 來插入 ö。
g8 g8 列印游標下字元中使用的位元組的十六進位值,假設它使用
UTF-8 編碼。這也會顯示組合字元。
'maxcombine' 的值無關緊要。一個具有兩個組合字元的字元範例
e0 b8 81 + e0 b8 b9 + e0 b9 89
8g8 8g8 在游標處或之後尋找非法 UTF-8 位元組序列。當編輯應該是 UTF-8 但由於包含非法位元組而被讀取為 8 位元編碼的檔案時,可以使用它。不會繞到檔案結尾。請注意,當游標位於非法位元組上或游標位於多位元組字元的中途時,該指令不會移動游標。
:l :list :[range]l[ist] [count] [flags] 與 :print 相同,但預設情況下將 Tab 顯示為 ">",尾隨空格顯示為 "-",不間斷空格字元顯示為 "+"。進一步由
'listchars' 選項更改。有關 [flags],請參閱
ex-flags。
:# :[range]# [count] [flags] :number 的同義詞。
:#! vim-shebang :#!{anything} 忽略,因此您可以使用以下程式碼開始 Vim 腳本
#!vim -S
let mylogbook='$HOME/logbook.md'
exe $':e {mylogbook}'
$
put ='## ' .. strftime('%d. %b %Y')
norm! o
使該腳本可執行並執行它以建立新的日記項目。
:z E144 :[range]z[+-^.=][count] 顯示以 [range] 指定的行周圍的幾行文字,如果沒有 [range],則顯示目前行周圍的文字。
如果有 [count],則表示您將看到多少行;如果沒有 [count] 且只有一個視窗,則使用
'scroll' 選項值的兩倍,否則使用目前視窗高度減 3。這是在下表中 "scr" 的值。
:z 可以單獨使用,也可以後接幾個標記。這些具有以下效果
標記 第一行 最後一行 新游標行
---- ---------- --------- ------------ + 目前行 1 scr 向前 1 scr 向前
1 scr 向後 目前行 目前行 ^ 2 scr 向後 1 scr 向後 1 scr 向後 . 1/2 scr 向後 1/2 scr 向前 1/2 scr 向前 = 1/2 scr 向後 1/2 scr 向前 目前行
完全不指定標記與 "+" 相同。如果標記為 "=",則會在目前行周圍列印一行虛線。
:z! :[range]z![+-^.=][count] 與 ":z" 類似,但如果未指定 [count],則預設為 Vim 視窗高度減 1。
:[range]z[!]#[+-^.=][count]
:z#與 ":z" 或 ":z!" 類似,但會為行編號。
:= := [args] 沒有 [args]:列印最後一行號。有 [args]:等同於
:lua ={expr}
。請參閱
:lua
:{range}= 列印
{range}
中的最後一行號。例如,這會列印目前行號
:.=
:norm[al][!]
{commands}
:norm :normal 執行一般模式指令
{commands}
。這使得可以執行在命令列上輸入的一般模式指令。
{commands}
的執行方式就像是它們被輸入一樣。對於復原,所有指令都會一起復原。當遇到錯誤時,執行會停止。
如果給定 [!],則不會使用映射。如果沒有給定,當從不可重新映射的映射 (
:noremap) 呼叫此指令時,仍然可以映射引數。
{commands}
應該是完整的指令。如果
{commands}
未完成指令,則最後一個指令將被中止,就像輸入了
<Esc>
或
<C-C>
一樣。這表示必須完成插入指令(若要啟動插入模式,請參閱
:startinsert)。也必須完成 ":" 指令。您不能使用 "gQ" 來啟動 Ex 模式。
當 ":normal" 忙碌時,不會更新顯示。
{commands}
不能以空格開頭。在其前面放一個計數 1 (一),"1 " 是一個空格。
此指令後面不能接其他指令,因為任何 '|' 都被視為指令的一部分。
另一種方法是使用
:execute,它使用表示式作為引數。這允許使用可列印字元來表示特殊字元。
範例
:exe "normal \<c-w>\<c-w>"
:{range}norm[al][!]
{commands}
:normal-range針對
{range}
中的每一行執行一般模式指令
{commands}
。在執行
{commands}
之前,游標會定位在範圍的第一欄中,針對每一行。否則,它與沒有範圍的 ":normal" 指令相同。
要自動進入
終端模式autocmd TermOpen * startinsert
該指令會在連接到管道(而非終端機)的非互動式 shell 中執行。使用
:terminal 來執行連接到終端機的互動式 shell。
背景化("&")指令不得寫入 stdout 或 stderr,串流會立即關閉。
E5677 請改用
jobstart()。
:call jobstart('foo', {'detach':1})
對於 powershell,鏈接字串化的可執行檔路徑需要使用呼叫運算子 (&)。
:!Write-Output "1`n2" | & "C:\Windows\System32\sort.exe" /r
E34 {cmd}
中的任何 "!" 都會被替換為先前的外部指令(另請參閱
'cpoptions'),除非使用反斜線跳脫。範例:":!ls" 接著 ":!echo ! \! \\!" 會執行 "echo ls ! \!"。
{cmd}
中的任何 "|" 都會傳遞給 shell,您無法使用它來附加 Vim 指令。請參閱
:bar。
{cmd}
中的任何 "%" 都會展開為目前檔名。
{cmd}
中的任何 "#" 都會展開為替代檔名。特殊字元不會被跳脫,請使用引號或
shellescape()。
:!ls "%"
:exe "!ls " .. shellescape(expand("%"))
換行字元會結束
{cmd}
,除非換行符號前面有反斜線。接下來的內容會被解讀為另一個
: 指令。
如果指令產生過多輸出,可能會跳過某些行,以便指令可以快速執行。不會遺失任何資料,這只會影響顯示。最後幾行始終會顯示(絕不跳過)。
若要避免按下 Enter 的提示,請使用
:silent !{cmd}
:redi :redir :redi[r][!] >
{file}
將訊息重新導向至檔案
{file}
。指令的輸出訊息會寫入該檔案,直到重新導向結束。訊息也會同時顯示在螢幕上。當包含 [!] 時,現有檔案會被覆寫。當省略 [!] 時,且
{file}
存在,此指令會失敗。
一次只能有一個 ":redir" 處於作用狀態。呼叫 ":redir" 會在開始重新導向至新的目標之前,關閉任何作用中的重新導向。如需遞迴使用,請查看
execute()。
若要停止在螢幕上回顯訊息和指令,請將指令放入函式中,並使用 ":silent call Function()" 呼叫它。其他替代方案是
'verbosefile' 選項或
execute() 函式,這些可以與 ":redir" 組合使用。
:redi[r] >> {file}
將訊息重新導向至檔案 {file}
。如果 {file}
已存在,則附加到該檔案。
:redi[r] @{a-zA-Z} :redi[r] @{a-zA-Z}> 將訊息重新導向至暫存器 {a-z}
。如果暫存器的名稱以大寫 {A-Z}
給定,則附加到該暫存器的內容。暫存器名稱後的 ">" 是可選的。 :redi[r] @{a-z}>> 將訊息附加到暫存器 {a-z}
。
:redi[r] @*> :redi[r] @+> 將訊息重新導向至選取或剪貼簿。為了向後相容,暫存器名稱後的 ">" 可以省略。請參閱
quotestar 和
quoteplus。 :redi[r] @*>> :redi[r] @+>> 將訊息附加到選取或剪貼簿。
:redi[r] @"> 將訊息重新導向至未命名的暫存器。為了向後相容,暫存器名稱後的 ">" 可以省略。 :redi[r] @">> 將訊息附加到未命名的暫存器。
:redi[r] =>
{var}
將訊息重新導向至變數。如果變數不存在,則會建立該變數。如果變數存在,則會將其初始化為空字串。在重新導向結束之前,變數將保持為空。只能使用字串變數。重新導向開始後,如果變數被移除或鎖定或變數類型被更改,則進一步的指令輸出訊息會導致錯誤。當使用區域變數(函式中的 l:var 或腳本中的 s:var)且另一個
:redir
導致目前變數結束時,範圍可能不同,且賦值會失敗。若要取得一個指令的輸出,可以使用
execute() 函式,而不是重新導向。
:redi[r] =>> {var}
將訊息附加到現有變數。只能使用字串變數。
:redi[r] END 結束重新導向訊息。
:filt :filter :filt[er][!]
{pattern}
{command}
:filt[er][!] /{pattern}/
{command}
將
{command}
的輸出限制為與
{pattern}
相符的行。例如,若要僅列出 xml 檔案
:filter /\.xml$/ oldfiles
如果給定 [!],則將 {command}
的輸出限制為與 {pattern}
不相符的行。
{pattern}
是 Vim 搜尋模式。除了用 / 包圍它之外,還可以任何非 ID 字元(請參閱
'isident'),只要它沒有出現在
{pattern}
中即可。如果沒有包圍字元,則模式無法包含 bar 字元。
'ignorecase' 不會被使用。
只會篩選一般訊息,不會篩選錯誤訊息。
:sil :silent :silent! :sil[ent][!]
{command}
靜默執行
{command}
。一般訊息將不會給定或加入訊息歷史記錄。當加入 [!] 時,錯誤訊息也會被略過,並且當偵測到錯誤時,不會中止指令和對應。
v:errmsg 仍會設定。當未使用 [!] 時,錯誤訊息會導致進一步的訊息正常顯示。使用
:redir 開始的重新導向會像往常一樣繼續,儘管可能會有細微的差異。這將允許重新導向指令的輸出,而不會在螢幕上看到它。範例
:redir >/tmp/foobar
:silent g/Aap/p
:redir END
若要靜默執行普通模式指令,請使用
:normal 指令。例如,若要在沒有訊息的情況下搜尋字串
:silent exe "normal /path\<CR>"
":silent!" 用於執行可能失敗但要忽略失敗的指令。範例
:let v:errmsg = ""
:silent! /^begin
:if v:errmsg != ""
: ... pattern was not found
:uns :unsilent :uns[ilent]
{command}
非靜默地執行
{command}
。只有當使用
:silent 來執行此指令時,才會有所不同。即使使用
:silent 時,也可以使用此方法來提供訊息。在此範例中,
:silent 用於避免關於讀取檔案的訊息,而
:unsilent 用於能夠列出每個檔案的第一行。
:silent argdo unsilent echo expand('%') .. ": " .. getline(1)
:verb :verbose :[count]verb[ose]
{command}
使用設定為 [count] 的
'verbose' 執行
{command}
。如果省略 [count],則會使用 1。":0verbose" 可用於將
'verbose' 設定為零。額外使用 ":silent" 會產生訊息但不顯示訊息。":silent" 和 ":verbose" 的組合可用於產生訊息並使用
v:statusmsg 及其相關項目檢查訊息。例如
:let v:statusmsg = ""
:silent verbose runtime foobar.vim
:if v:statusmsg != ""
: " foobar.vim could not be found
:endif
當串連另一個指令時,":verbose" 僅適用於第一個指令
:4verbose set verbose | set verbose
:verbose-cmd 當
'verbose' 非零時,列出 Vim 選項或按鍵對應或縮寫或使用者定義的函式或指令或高亮群組或自動指令的值時,也會顯示上次定義的位置。如果它們是在 Lua 中定義的,則只有在設定
'verbose' 時才會被找到。因此,請使用 -V1 引數啟動 nvim 以查看它們。如果它是手動定義的,則不會有「上次設定」訊息。當它在執行函式、使用者指令或自動指令時定義時,會回報它定義所在的腳本。
特殊情況
當
'keywordprg' 等於 "man" 時,"K" 前面的 [count] 會插入到 "man" 指令之後和關鍵字之前。例如,當游標位於 "mkdir" 上時使用 "2K",會導致
!man 2 mkdir
v_K
{Visual}
K 類似於 "K",但會將視覺反白的文字用作關鍵字。僅當反白的文字不超過一行時才有效。
gO gO 顯示目前緩衝區的檔案類型特定的可瀏覽「大綱」。例如,在
說明緩衝區中,這會顯示目錄。
[N]gs
gs :sl :sleep :[N]sl[eep] [N][m] 什麼都不做 [N] 秒,如果給定了 [m],則什麼都不做 [N] 毫秒。"gs" 始終使用秒。預設為一秒。
:sleep "sleep for one second
:5sleep "sleep for five seconds
:sleep 100m "sleep for 100 milliseconds
10gs "sleep for ten seconds
可使用 CTRL-C
中斷。「gs」代表「進入睡眠」。在睡眠期間,游標會定位在文字中,若在可見位置。佇列中的訊息會在睡眠期間處理。
2. 像 less 或 more 一樣使用 Vim less
如果您使用 less 或 more 程式來檢視檔案,您不會獲得語法高亮。因此您可能會想改用 Vim。您可以使用 shell 腳本 "$VIMRUNTIME/scripts/less.sh" 來達成此目的。
這個 shell 腳本會使用 Vim 腳本 "$VIMRUNTIME/scripts/less.vim"。它會設定對應來模擬 less 支援的指令。否則,您仍然可以使用 Vim 指令。
這並非完美。例如,當檢視短檔案時,Vim 仍然會佔用整個螢幕。但它對於大多數使用情況都足夠好用,而且您還可以獲得語法高亮。
"h" 鍵會提供可用指令的簡短概觀。
如果您想在使用 less 時設定不同的選項,請在您的 vimrc 中定義 LessInitFunc,例如
func LessInitFunc()
set nocursorcolumn nocursorline
endfunc
對單行操作的行為如下
否則註解標記會被加入到目前行 (例如 foo
會轉換為 /*foo*/
)。空白行會被忽略。
對多行操作的行為如下
否則,所有受影響的行都會被轉換為註解;空白行會被轉換為空的註解 (例如 /**/
)。註解標記會對齊到縮排最少的行。
o_gc o_gc-default gc 用於游標周圍最大連續非空白註解區塊的文字物件 (例如,
gcgc
取消註解一個註解區塊;
dgc
刪除它)。僅在等待操作模式下有效。