常見問題

Nvim 的 :help 頁面,是使用 tree-sitter-vimdoc 解析器,從 原始碼 產生 的。


常見問題

一般問題 faq-general

我的設定檔 (VIMRC) 應該放在哪裡?
請參閱 設定;你可以複製 (或建立符號連結) 你現有的 vimrc。nvim-from-vim
開發版本(預發行版)的穩定性如何?
不穩定(預發行)的 Nvim 版本 https://github.com/neovim/neovim/releases/tag/nightly(「HEAD」,即 master 分支)用於積極地測試新功能和變更。它通常是穩定的,但偶爾會破壞你的工作流程。我們依賴 HEAD 使用者回報自動測試未發現的「盲點」。
使用穩定的(發行)版本 https://github.com/neovim/neovim/releases/latest 可以獲得更可預測的體驗。
我可以使用基於 Lua 的 Vim 外掛程式嗎(例如 NEOCOMPLETE)?
不行。從 Nvim 0.2 PR #4411 https://github.com/neovim/neovim/pull/4411 開始,Lua 已內建,但不支援舊的 Vim if_lua 介面。
如何在終端機中使用「真色彩」?
如果偵測到支援的終端機,預設會啟用真色彩(24 位元色彩)。如果你的終端機未被偵測到,但你確定它支援真色彩,請將此行加入你的 init.vim
set termguicolors
當切換模式時,NVIM 顯示奇怪的符號(�[2 q
這是你的終端機模擬器中的一個錯誤。發生此問題是因為 Nvim 預設會發送游標形狀的終端碼,如果終端機似乎與 xterm 相容(TERM=xterm-256color)。
要解決此問題,你可以
使用不同的終端機模擬器
在你的 Nvim 設定中停用 'guicursor'
:set guicursor=
" Workaround some broken plugins which set guicursor indiscriminately.
:autocmd OptionSet guicursor noautocmd set guicursor=
另請參閱 $TERM 以取得 $TERM 的建議值。
如何在終端機中更改游標形狀?
對於 Nvim 0.1.7 或更舊的版本:請參閱 man nvim 中關於 NVIM_TUI_ENABLE_CURSOR_SHAPE 的說明。
對於 Nvim 0.2 或更新的版本:游標樣式由 'guicursor' 選項控制。
若要_停用_游標樣式,請將 'guicursor' 設定為空
:set guicursor=
" Workaround some broken plugins which set guicursor indiscriminately.
:autocmd OptionSet guicursor noautocmd set guicursor=
如果你想要不閃爍的游標,請使用 blinkon0。請參閱 'guicursor'
'guicursor' 預設為啟用,除非 Nvim 認為你的終端機不支援它。如果你確定你的終端機支援游標形狀,請在你的 init.vim 中設定 'guicursor',如 'guicursor' 中所述。
Vim 的終端機選項 t_SIt_EI 會被忽略,就像所有其他 t_xx 選項一樣。
舊版本的 libvte(gnome-terminal、roxterm、terminator 等)不支援游標樣式控制碼。#2537 https://github.com/neovim/neovim/issues/2537
如何在終端機中更改游標顏色?
游標樣式(形狀、顏色、行為)由 'guicursor' 控制,即使在終端機中也是如此。游標顏色(與形狀相對)只有在設定 'termguicolors' 時才會生效。
'guicursor' 給出了一個範例,但這裡有一個更複雜的範例,它在插入模式和一般模式中設定不同的顏色
:set termguicolors
:hi Cursor guifg=green guibg=green
:hi Cursor2 guifg=red guibg=red
:set guicursor=n-v-c:block-Cursor/lCursor,i-ci-ve:ver25-Cursor2/lCursor2,r-cr:hor20,o:hor50
在退出或暫停並恢復 NVIM 後,游標樣式未還原
終端機沒有提供查詢游標樣式的方法。使用自動指令來管理游標樣式
au VimEnter,VimResume * set guicursor=n-v-c:block,i-ci-ve:ver25,r-cr:hor20,o:hor50
  \,a:blinkwait700-blinkoff400-blinkon250-Cursor/lCursor
  \,sm:block-blinkwait175-blinkoff150-blinkon175
au VimLeave,VimSuspend * set guicursor=a:block-blinkon0
游標形狀在 TMUX 中沒有改變
這是 tmux 決定的,而不是 Nvim。請參閱 tui-cursor-shape 以取得修復方法。
請參閱 #3165 https://github.com/neovim/neovim/pull/3165 以取得討論。
TMUX 中游標閃爍?
如果在 tmux 下開啟 nvim 時,游標 _ 在沒有文件的情況下快速出現和消失,並且你在 EndOfBufferNormal 中設定了 ctermbg,請嘗試將這些設定為 NONE
hi EndOfBuffer ctermbg=NONE ctermfg=200 cterm=NONE
hi Normal ctermbg=NONE ctermfg=200 cterm=NONE
--remote 和其他相關功能發生了什麼?
--remote 部分支援。clientserver
如果你需要 Vim 中有但在 Nvim 中遺失的旗標,你可以改用 https://github.com/mhinz/neovim-remote

執行階段問題 faq-runtime

使用滑鼠複製到 X11 主要選取區無法運作
clipboard=autoselect 尚未實作 https://github.com/neovim/neovim/issues/2325。你可能會發現這個解決方法很有用
vnoremap <LeftRelease> "*ygv
vnoremap <2-LeftRelease> "*ygv
我的 CTRL-H 對應無法運作
此問題已在 Nvim 0.2 中修復。如果你正在執行 Nvim 0.1.7 或更舊的版本,請調整你的終端機「kbs」(key_backspace) terminfo 項目
infocmp $TERM | sed 's/kbs=^[hH]/kbs=\\177/' > $TERM.ti
tic $TERM.ti
(可以隨意刪除執行上述指令後建立的臨時 *.ti 檔案)。
<HOME> 或其他「特殊」按鍵無法運作
請確保 $TERM 設定正確。
對於 screen 或 tmux,$TERM 應該是 screen-256color(而不是 xterm-256color!)
在其他情況下,如果字串中沒有出現「256」,則可能是錯誤的。嘗試 TERM=xterm-256color
:! 和 SYSTEM() 在互動式程序中會發生奇怪的事情
Nvim 中的 :terminal 支援互動式指令。但是 :!system() 不支援互動式指令,主要是因為 Nvim UI 使用 stdio 進行 msgpack 通訊,但也為了效能、可靠性和跨平台一致性(請參閱 https://vimhelp.org/gui_x11.txt.html#gui-pty)。
PYTHON 支援無法運作
在 Nvim 中執行 :checkhealth 以進行自動診斷。
其他提示
python neovim 模組已重新命名為 pynvim(很久以前)。
如果你正在為 pynvim 模組使用 pyenv 或 virtualenv https://pypi.org/project/pynvim/,,則必須將 g:python3_host_prog 設定為 virtualenv 的解譯器路徑。
請閱讀 provider-python
請確保你擁有最新版本的 pynvim Python 模組
python -m pip install setuptools
python -m pip install --upgrade pynvim
python3 -m pip install --upgrade pynvim
嘗試使用 nvim -u NORC 以確保你的設定 (init.vim) 沒有導致問題。如果你收到 E117: Unknown function,則表示存在執行階段問題:faq-runtime
:CHECKHEALTH 報告 E5009: INVALID $VIMRUNTIME
這表示 health#check() 無法載入,這表示 $VIMRUNTIME'runtimepath' 已損壞。
$VIMRUNTIME 必須指向 Nvim 的執行階段檔案,而不是 Vim 的。
目前的用戶應該可以讀取 $VIMRUNTIME 目錄內容。
確認 :echo &runtimepath 包含 $VIMRUNTIME 路徑。
檢查以下輸出
:call health#check()
:verbose func health#check
NEOVIM 找不到其執行階段
如果 :help nvim 顯示 E149: Sorry, no help for nvim,則會發生這種情況。
請確保 $VIM$VIMRUNTIME 指向 Nvim 的(而不是 Vim 的)執行階段,方法是檢查 :echo $VIM:echo $VIMRUNTIME。這應該會給出類似 /usr/share/nvim resp. /usr/share/nvim/runtime 的結果。
另請確保你沒有意外地覆蓋你的 runtimepath (:set runtimepath?),它預設包含上述的 $VIMRUNTIME(請參閱 'runtimepath')。
NEOVIM 執行速度緩慢
使用快速的終端機模擬器
使用最佳化版本
:checkhealth nvim 應該會報告其中一種「建置類型」
Build type: RelWithDebInfo
Build type: MinSizeRel
Build type: Release
如果它報告 Build type: Debug 並且你是從原始碼建置 Nvim,請參閱 https://github.com/neovim/neovim/blob/master/BUILD.md
顏色未正確顯示
請確保 $TERM 設定正確。
從 shell 執行 TERM=xterm-256color nvim。如果顏色正確顯示,則在你的使用者設定檔(通常是 ~/.profile)中匯出 TERM 的該值
export TERM=xterm-256color
如果你使用 tmux,則改為將此行加入你的 tmux.conf
set -g default-terminal "tmux-256color"
對於 GNU screen,請設定你的 .screenrc <https://wiki.archlinux.org/index.php/GNU_Screen#Use_256_colors>
term screen-256color
注意: Nvim 會忽略 t_Co 和其他 t_xx 終端碼。
NEOVIM 無法讀取 UTF-8 字元
從命令列執行以下指令
locale | grep -E '(LANG|LC_CTYPE|LC_ALL)=(.*\.)?(UTF|utf)-?8'
如果沒有結果,則你可能未使用 UTF-8 地區設定。請參閱這些問題
在 TMUX 或 GNU SCREEN 中的 ESC 延遲
這是 tmux / screen 中的常見問題 https://www.google.com/?q=tmux%20vim%20escape%20delay(另請參閱 https://github.com/tmux/tmux/issues/131#issuecomment-145853211)。必須將對應的逾時調整為較低的值(10-20 毫秒)。
.tmux.conf:
set -g escape-time 10
# Or for tmux >= 2.6
set -sg escape-time 10
.screenrc:
maptimeout 10
「為什麼在 VIM 中不會發生這種情況?」
它確實會發生(嘗試 vim -N -u NONE),但是如果你在 ESC 後快速按下按鍵,則 Vim 會將 ESC 解釋為 ESC 而不是 ALT(META)。除非你仔細觀察游標,否則你不會注意到延遲。這種權衡的結果是 Vim 無法理解 ALT(META)按鍵組合,因此例如 nnoremap <M-a> 無法運作。ALT(META)按鍵組合始終在 Nvim 中運作。另請參閱 Vim 中的 :help xterm-cursor-keys
Nvim 0.3 在完全支援 ALT 對應的情況下,會模擬 Vim 的行為。請參閱 i_ALT
啟用滑鼠模式時,GNU SCREEN 中的 ESC 會遺失
發生這種情況是因為 screen 中的一個錯誤 https://savannah.gnu.org/bugs/?60196:在滑鼠模式下,screen 會假設 ESC 是滑鼠序列的一部分,並將無限期等待序列的其餘部分,而不管 maptimeout 為何。在 screen 中修復此問題之前,沒有已知的解決方法,只能雙按 Esc,這會導致將單個 Esc 傳遞給 Nvim。
在檔案類型外掛程式和自動指令中呼叫 INPUTLIST()、ECHOMSG 等功能無法運作
這是因為 Nvim 預設會設定 shortmess+=F。Vim 在使用 set shortmes+=F 時也會有相同的行為。目前有計畫改進此問題,但同時作為一個權宜之計,請使用 set shortmess-=F 或使用 unsilent 如下。
unsilent let var = inputlist(['1. item1', '2. item2'])
autocmd BufNewFile * unsilent echomsg 'The autocmd has been fired.'
G:CLIPBOARD 設定未使用。
如果剪貼簿提供者已經載入,您需要在設定後重新載入它。請使用以下設定。
let g:clipboard = { 'name' : ... }
if exists('g:loaded_clipboard_provider')
  unlet g:loaded_clipboard_provider
  runtime autoload/provider/clipboard.vim
endif
或者,如果您希望在指派給 g:clipboard 時自動重新載入,請將 init.vim 設定如下。
function! s:clipboard_changed(...) abort
  if exists('g:loaded_clipboard_provider')
    unlet g:loaded_clipboard_provider
  endif
  runtime autoload/provider/clipboard.vim
endfunction
if !exists('s:loaded")
  call dictwatcheradd(g:, 'clipboard', function('s:clipboard_changed'))
endif
let s:loaded = v:true

建置問題 faq-build

一般建置問題
請執行 make distclean && make 以排除因過時的建置環境而導致的失敗。
LOCAL.MK 中的設定沒有生效
CMake 會快取建置設定,因此您在修改 local.mk 後可能需要執行 rm -r build && make
CMAKE 錯誤
configure_file 設定檔案時發生問題
這可能是權限問題,如果您以 root 使用者身分執行 make,然後稍後以非特權身分執行 make,就可能會發生這種情況。要修正此問題,請執行 rm -rf build 並重新嘗試。
產生 Helptags 失敗
如果重新安裝失敗並顯示「產生 helptags 失敗」,請嘗試移除先前安裝的執行階段目錄 (如果在建置期間未設定 CMAKE_INSTALL_PREFIX,則預設為 /usr/local/share/nvim)
rm -r /usr/local/share/nvim

設計 faq-design

為什麼 RPC 不使用 JSON?
JSON 無法輕鬆/有效率地處理二進位資料
JSON 規格不明確:https://seriot.ch/parsing_json.php
為什麼嵌入 Lua 而不是 X?
Lua 是一種非常小的語言,非常適合嵌入。Python/Ruby/etc 的最大優勢在於其龐大的程式庫集合,但這與 Nvim 無關,因為 Nvim 是「包含所有功能」的程式庫:引入另一個標準程式庫將是多餘的。
Lua 5.1 是一種完整的語言:語法已凍結。這對於向後相容性來說非常好。
Nvim 內部也使用 Lua 作為 C 的替代方案。額外的效能在那裡很有用,而不是像 Python 或 Vim9script 這樣的慢速語言。
LuaJIT 是地球上最快的執行階段之一,比 Python 和「Vim9script」快 10 倍 https://vimhelp.org/vim9.txt.html,比 Vimscript 快 100 倍。
Python/JS 在大小和可攜性方面比 Lua 花費更多,而且已經有許多基於 Python/JS 的編輯器。因此,Python/JS 會使 Nvim 變得更大且可攜性更差,以換取一個不具差異化的功能。
另請參閱
為什麼選擇 Lua 5.1 而不是 Lua 5.3+?
Lua 5.1 是一種與 5.3 不同的語言。Lua 組織在每個新版本都會進行重大變更,因此即使我們切換 (不是升級,而是切換) 到 5.3,當他們在 5.4、5.5 等版本中建立下一個新語言時,我們也不會獲得任何好處。而且我們會失去 LuaJIT,它比 Lua 5.3+ 更有價值。
Lua 5.1 是一種完整的語言。要「升級」它,請新增程式庫,而不是語法。Nvim 本身已經是一個非常好的 Lua「標準程式庫」,我們將繼續發展和增強它。在此情況下,變更 Lua 的規則不會獲得任何好處。
Neovim 會將 VIMSCRIPT 轉譯為 LUA,而不是直接執行 VIMSCRIPT 嗎?
我們正在實驗 vim9jit https://github.com/tjdevries/vim9jit,以將 Vim9script (Vim9 的 Vimscript 變體) 轉譯為 Lua,並已使用它將 Vim9 外掛程式 https://github.com/neovim/neovim/pull/21662 連接埠到 Nvim Lua。
我們沒有計劃轉譯舊版 Vimscript。
是否鼓勵外掛程式作者將其外掛程式從 VIMSCRIPT 連接埠到 LUA?您是否計劃無限期地支援 VIMSCRIPT? (#1152)
我們預期沒有任何理由要棄用 Vimscript,它是一種有價值的 DSL https://en.wikipedia.org/wiki/Domain-specific_language,適用於文字編輯任務。維護 Vimscript 相容性比大規模移轉現有的 Vim 外掛程式成本更低。
僅僅為了好玩而從 Vimscript 連接埠到 Lua 不會獲得任何好處。Nvim 絕對是 Vim 的分支,以便利用已經花費在數千個 Vim 外掛程式上的工作,同時啟用新型外掛程式和整合。
主要
指令索引
快速參考