Vim_diff
Nvim :help
頁面,使用 tree-sitter-vimdoc 解析器,從 原始碼 產生。
Nvim 與 Vim 的差異
雖然編輯器和 Vimscript (而非 Vim9script) 的功能大多相同,但 Nvim 在許多方面與 Vim 不同。此文件完整且集中地列出這些差異。
使用
$XDG_CONFIG_HOME/nvim/init.vim
而不是
.vimrc
作為你的
設定。
使用 $XDG_CONFIG_HOME/nvim
而不是 .vim
來儲存設定檔案。
使用
$XDG_STATE_HOME/nvim/shada/main.shada
而不是
.viminfo
來儲存持續性工作階段資訊。
shada
預設啟用檔案類型偵測。可以透過在
init.vim 中加入 ":filetype off" 來停用。
預設啟用語法高亮。可以透過在
init.vim 中加入 ":syntax off" 來停用。
預設配色方案已更新。由於配色方案仰賴預設如何定義高亮群組,這可能導致配色方案看起來不同。在
init.vim 中加入 ":colorscheme vim" 或在配色方案檔案中加入 ":source $VIMRUNTIME/colors/vim.lua" 來還原舊的預設連結和顏色。
'define' 預設為 ""。C ftplugin 將其設定為 "^\\s*#\\s*define"
'grepprg' 為一般 grep 使用 -H 和 -I 旗標,並且在可用時預設使用 ripgrep
'include' 預設為 ""。C ftplugin 將其設定為 "^\\s*#\\s*include"
'isfname' 不包含 ":" (在 Windows 上)。磁碟機代號無需此符號即可正確處理。(使用
gF 處理以 ":line:col" 為後綴的檔案路徑)。
'path' 預設為 ".,,"。如果存在,C ftplugin 會加入 "/usr/include"。
已啟用 matchit 外掛程式。要在你的設定中停用它:
:let loaded_matchit = 1
滑鼠在
命令列模式 或
more 提示中不會啟用,因此你可以透過輸入 ":" 來暫時停用它。或者,如果你想要部分或完全停用滑鼠或彈出式選單,請執行以下任一操作:
變更
'mousemodel',因此
<RightMouse>
會擴展選取範圍,而不是顯示彈出式選單
set mousemodel=extend
對應
<A-LeftMouse>
,使其在游標移動前暫時停用滑鼠
nnoremap <A-LeftMouse> <Cmd>
\ set mouse=<Bar>
\ echo 'mouse OFF until next cursor-move'<Bar>
\ autocmd CursorMoved * ++once set mouse&<Bar>
\ echo 'mouse ON'<CR>
若要移除預設彈出式選單,但不停用滑鼠:
aunmenu PopUp
autocmd! nvim_popupmenu
僅移除 "How-to disable mouse" 選單項目 (及其分隔符號)
aunmenu PopUp.How-to\ disable\ mouse
aunmenu PopUp.-2-
預設對應
default-mappingsNvim 在
啟動時會建立以下預設對應。你可以透過在你的設定中簡單地移除對應來停用其中任何一個,例如 ":unmap Y"。
預設自動指令
default-autocmds預設自動指令存在於以下群組中。使用 ":autocmd!
{group}
" 來移除它們,使用 ":autocmd
{group}
" 來查看它們的定義。
nvim_terminal
TermClose:以不帶任何參數啟動 (因此使用
'shell') 且在結束時未發生錯誤的
終端機 緩衝區會自動關閉。
TermRequest:終端機模擬器會回應 OSC 背景和前景要求,當 Nvim 選項
'background' 為 "dark" 時,指示 (1) 黑色背景和白色前景,或者當
'background' 為 "light" 時,指示 (2) 白色背景和黑色前景。雖然這可能無法反映實際的前景/背景顏色,但允許將
'background' 保留給在終端機模擬器中執行的巢狀 Nvim 執行個體。
nvim_cmdwin
CmdwinEnter:在
cmdwin 中,將語法同步限制為 maxlines=1。
nvim_swapfile
SwapExists:當交換檔案由正在執行的 Nvim 程序擁有時,跳過交換檔案提示 (將
v:swapchoice 設定為 "e")。顯示
W325 "忽略交換檔案…" 訊息。
主要元件
使用者體驗
以直觀且一致的方式工作是 Nvim 的主要目標。
Vim 的內部測試函數(test_autochdir()、test_settime() 等)不公開(也沒有實作);相對地,Nvim 具有健全的 API。
如果行為、選項和文件花費使用者過多時間,而不是節省時間,則會被移除。
在效益大於任何向後相容性成本的情況下,可用性細節已得到改進。以下是一些例子
內建一些原本需要外部外掛的功能
架構
Nvim UI 與核心編輯器「解耦」:所有 UI,包括內建的
TUI,都只是連接到 Nvim 伺服器的外掛(透過
--server 或
--embed)。多個 Nvim UI 客戶端可以連線到同一個 Nvim 編輯器伺服器。
外部外掛在獨立的處理程序中執行。
remote-plugin 這提高了穩定性,並允許這些外掛在不阻塞編輯器的情況下工作。即使使用舊的 Vim 介面(
if_pyth、
if_ruby)的「傳統」Python 和 Ruby 外掛也是在外部處理程序中執行,因此它們不會導致 Nvim 崩潰。
平台和 I/O 設施建立在 libuv 之上。Nvim 受益於 libuv 的功能和錯誤修復,其他專案也受益於 Nvim 開發人員對 libuv 的改進。
功能
輸入/對應
ALT (
META) 組合鍵永遠有效(即使在
TUI 中)。使用任何按鍵對應
<M-:
<M-1>
、
<M-BS>
、
<M-Del>
、
<M-Ins>
、
<M-/>
、
<M-\>
、
<M-Space>
、
<M-Enter>
等。
區分大小寫:<M-a>
和 <M-A>
是兩個不同的鍵碼。
一般命令
Q 會重播上次錄製的巨集,而不是切換到 Ex 模式 (
gQ)。
選項
:setlocal {option}<
會將所有選項的廣域值複製到本機值。
'exrc' 搜尋 ".nvim.lua"、".nvimrc" 或 ".exrc" 檔案。會提示使用者是否信任該檔案。
'fillchars' 旗標:"msgsep"、"horiz"、"horizup"、"horizdown"、"vertleft"、"vertright"、"verthoriz"
「clean」會從跳躍列表中移除未載入的緩衝區。
"F" 旗標不會影響自動命令的輸出。
"q" 旗標會完全隱藏巨集錄製訊息。
'tabline' 在標籤頁標籤上按下滑鼠中鍵會關閉標籤頁,並且 %@Func@foo%X 可以在滑鼠點擊時呼叫任何函數
Shell
Shell 輸出 (
:!、
:make、…) 永遠會透過 UI 傳遞,因此不會「搞亂」螢幕。(如果您想搞亂螢幕,仍然可以使用 "chansend(v:stderr,…)")
:! 不支援「互動式」命令。請改用
:terminal。(GUI Vim 有類似的限制,請參閱 Vim 中的 ":help gui-pty"。)
:!start 在 Windows 上不是特殊情況。
標記
如果刪除相關聯的行,則會移除標記。
如果使用相同的識別碼在同一群組中放置兩次標記,則會移動標記。
啟動
-e 和
-es 會呼叫與 -E 和 -Es 相同的「改進的 Ex 模式」。
-E 和
-Es 會將 stdin 作為文字讀取(放入緩衝區 1)。
會自動退出,不需要 "-c qa!"。
略過交換檔案對話方塊。
如果腳本名稱為 "-",
-s 會從 stdin 讀取一般命令。
預設有效:"-" 檔案是選用的
'term' E529 E530 E531 'term' 反映從
$TERM 和其他環境檢查推斷出的終端機類型。僅用於除錯;在啟動期間不可靠。
:echo &term
Nvim 將在 Linux 虛擬終端機上使用 256 色功能。Vim 在 Linux VT 上只使用 8 種顏色加上亮前景。
這些 Nvim 功能後來被整合到 Vim 中。
本節記錄各種底層行為的變更。
mkdir() 行為已變更
1. 假設 /tmp/foo 不存在且 /tmp 可寫入,則 mkdir('/tmp/foo/bar', 'p', 0700) 將會建立 /tmp/foo 和 /tmp/foo/bar,權限皆為 0700。Vim 的 mkdir 會建立 /tmp/foo,權限為 0755。
2. 如果嘗試使用 'p'
建立一個已存在的目錄(例如 mkdir('/', 'p')),mkdir() 會靜默結束。在 Vim 中,這會產生錯誤。
3. 現在 mkdir() 的錯誤訊息會在 mkdir 失敗時包含 strerror() 文字。
它不會使用 "[...]"(原為:"[[], [...]]",現在為:"[[], []]")。"..." 僅用於遞迴容器。
6. (內部)在 Vim 中嘗試列印或字串化 VAR_UNKNOWN 會導致沒有結果,並產生 E908 錯誤,在 Nvim 中則會產生內部錯誤。
Viminfo 文字檔案已被二進位(messagepack)
shada 檔案取代。其他差異
當
printf() 與
%p
引數一起使用時會傳回有意義的內容:在 Vim 中,它過去會傳回無用的字串位址(字串會被複製到新分配的記憶體中),並且在無法強制轉換為字串的類型上會失敗。詳情請參閱
id(),目前它在內部使用
printf("%p", {expr})
。
:lua print("a\0b")
會印出 a^@b
,就像 :echomsg "a\nb"
一樣。在 Vim 中,會將 a
和 b
印在不同的行上,就像 :lua print("a\nb")
一樣。
:lua error('TEST')
會發出錯誤訊息
E5108: Error executing lua: [string "<Vimscript compiled string>"]:1: TEST
而 Vim 只會發出 "TEST"。
Lua 可透過
vim.api
直接存取 Nvim
API。
指令
如果檔案在外部被更新,:write!
不會顯示提示。
函數
input() 和
inputdialog() 支援彼此的功能(分別為取消時傳回和補全),透過字典引數(如果使用,會取代所有其他引數),並且 "cancelreturn" 如果以字典形式傳遞,則可以有任何類型。
高亮群組
反白群組名稱允許包含 @
字元。
定義不符合正規表示式
[a-zA-Z0-9_.@-]*
的名稱的反白群組會發生錯誤(請參閱
group-name)。
巨集(
recording)行為
重播在 :lmap 期間錄製的巨集會產生與錄製時相同的動作。在 Vim 中,如果在使用 :lmap'ped 鍵時錄製巨集,則錄製和重播期間的行為會有所不同。
對應
為可簡化的按鍵 (例如 <C-I>
) 建立對應不會取代其簡化形式 (例如 <Tab>
) 的現有對應。
以 "#" 開頭並接數字的字串,在對應的左側不代表功能鍵。
工作目錄(Vim 在 Nvim 之後實作了其中一些)
getcwd(-1)
等同於 getcwd(-1, 0)
,而不是傳回全域工作目錄。請使用 getcwd(-1, -1)
來取得全域工作目錄。
這些舊版 Vim 功能尚未實作
這些 Vim 功能已從 Nvim 中故意移除。
別名
ex (別名為 "nvim -e")
exim (別名為 "nvim -E")
gex (GUI)
gview (GUI)
gvim (GUI)
gvimdiff (GUI)
rgview (GUI)
rgvim (GUI)
rview
rvim
view (別名為 "nvim -R")
指令
:behave
:fixdel
hardcopy :hardcopy
已移除。請改用
:TOhtml
並使用網頁瀏覽器或其他 HTML 檢視器列印產生的 HTML。
:helpfind
:mode (不再接受引數)
:open
:Print
:promptfind
:promptrepl
:scriptversion (永遠是版本 1)
:shell
:sleep! (不會隱藏游標;與 :sleep 相同)
:smile
:tearoff
:cstag
:cscope
:lcscope
:scscope
:Vimuntar
:TOhtml
已被 Lua 版本取代(具有各種差異)
選項
antialias
對於 backspace=0
設定 backspace=
(空白)
對於 backspace=1
設定 backspace=indent,eol
對於 backspace=2
設定 backspace=indent,eol,start
(Nvim 的預設行為)
對於 backspace=3
設定 backspace=indent,eol,nostop
bioskey (MS-DOS)
conskey (MS-DOS)
cscopepathcomp
cscopeprg
cscopequickfix
cscoperelative
cscopetag
cscopetagorder
cscopeverbose
esckeys
keyprotocol
'insertmode' 'im' 使用以下腳本來模擬
'insertmode'autocmd BufWinEnter * startinsert
inoremap <Esc> <C-X><C-Z><C-]>
inoremap <C-C> <C-X><C-Z>
inoremap <C-L> <C-X><C-Z><C-]><Esc>
inoremap <C-Z> <C-X><C-Z><Cmd>suspend<CR>
noremap <C-C> <Esc>
snoremap <C-C> <Esc>
noremap <C-\><C-G> <C-\><C-N><Cmd>startinsert<CR>
cnoremap <C-\><C-G> <C-\><C-N><Cmd>startinsert<CR>
inoremap <C-\><C-G> <C-X><C-Z>
autocmd CmdWinEnter * noremap <buffer> <C-C> <C-C>
autocmd CmdWinEnter * inoremap <buffer> <C-C> <C-C>
lua << EOF
vim.on_key(function(c)
if c == '\27' then
local mode = vim.api.nvim_get_mode().mode
if mode:find('^[nvV\22sS\19]') and vim.fn.getcmdtype() == '' then
vim.schedule(function()
vim.cmd('startinsert')
end)
end
end
end)
EOF
注意: regex 引擎仍有硬式編碼的限制,僅考慮 6 個組合字元。
printoptions
textauto
textmode
weirdinvert
外掛
logiPat
rrhelper
macmap.vim
tools/check_colors.vim
macros/{justify,matchit,shellmenu,swapmous}.vim: 請直接使用 packadd! justify
等命令
供應器
啟動
--literal
: 檔案引數永遠是文字形式;若要在 Windows 上展開萬用字元,請使用
:n 例如
nvim +"n *"
簡易模式:eview, evim, nvim -y
受限模式:rview, rvim, nvim -Z
Vi 模式:nvim -v
測試函式
test_alloc_fail()
test_autochdir()
test_disable_char_avail()
test_feedinput()
test_garbagecollect_soon
test_getvalue()
test_ignore_error()
test_null_blob()
test_null_channel()
test_null_dict()
test_null_function()
test_null_job()
test_null_list()
test_null_partial()
test_null_string()
test_option_not_set()
test_override()
test_refcount()
test_scrollbar()
test_setmouse()
test_settime()
test_srand_seed()
xterm-8bit xterm-8-bitXterm 可以在使用真實 8 位元 CSI 的模式下執行。要支援這個功能,需要自動偵測終端機是否處於 UTF-8 模式或非 UTF-8 模式,因為在不同模式下,8 位元 CSI 字元的寫入方式會有所不同。Vim 在啟動時會向終端機發出「請求版本」序列,並檢視終端機如何傳送 CSI。Nvim 不會發出此類序列,並且總是使用 7 位元控制序列。