Vim_diff
Nvim の :help
ページは、生成されており、ソース を tree-sitter-vimdoc パーサーを使って解析しています。
Nvim と Vim の差異
Nvim は、エディターと Vimscript (Vim9script ではない) の機能はほとんど同じですが、多くの点で Vim と異なります。このドキュメントは、それらの違いを網羅的に集めたリファレンスです。
設定 には、
.vimrc
の代わりに
$XDG_CONFIG_HOME/nvim/init.vim
を使用します。
設定ファイルの保存には、.vim
の代わりに $XDG_CONFIG_HOME/nvim
を使用します。
永続的なセッション情報には、
.viminfo
の代わりに
$XDG_STATE_HOME/nvim/shada/main.shada
を使用します。
shada
ファイルタイプ検出はデフォルトで有効になっています。これは、
init.vim に ":filetype off" を追加することで無効にできます。
構文強調表示はデフォルトで有効になっています。これは、
init.vim に ":syntax off" を追加することで無効にできます。
デフォルトのカラースキームが更新されました。これにより、ハイライトグループのデフォルトの定義方法に依存しているため、カラースキームの見え方が異なる場合があります。古いデフォルトのリンクと色を復元するには、
init.vim に ":colorscheme vim" を追加するか、カラースキームファイルに ":source $VIMRUNTIME/colors/vim.lua" を追加します。
'background' は (ターミナル/UI によって自動的に設定されない限り) デフォルトで "dark" に設定されています
'backupdir' はデフォルトで .,~/.local/state/nvim/backup// (
xdg) に設定され、自動的に作成されます
'define' はデフォルトで "" に設定されています。C ftplugin はそれを "^\\s*#\\s*define" に設定します
'fillchars' は (実質的に) デフォルトで "vert:│,fold:·,foldsep:│" に設定されています
'grepprg' は通常の grep に -H および -I フラグを使用し、利用可能な場合は ripgrep をデフォルトで使用します
'include' はデフォルトで "" に設定されています。C ftplugin はそれを "^\\s*#\\s*include" に設定します
'isfname' には (Windows では) ":" が含まれません。ドライブレターはそれなしで正しく処理されます。(":line:col" で終わるファイルパスには
gF を使用してください)。
'path' はデフォルトで ".,," に設定されています。C ftplugin は、存在する場合は "/usr/include" を追加します。
'tags' はデフォルトで "./tags;,tags" に設定されています
'undodir' はデフォルトで ~/.local/state/nvim/undo// (
xdg) に設定され、自動的に作成されます
matchit プラグインが有効になっています。設定で無効にするには
:let loaded_matchit = 1
マウスは
コマンドラインモード または
more-prompt では有効になっていないため、":" を入力するだけで一時的に無効にできます。または、マウスまたはポップアップメニューを部分的または完全に無効にする場合は、次のいずれかを実行します
'mouse' オプションを解除して、マウスを完全に無効にします
set mouse=
'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
"マウスを無効にする方法" メニュー項目 (とその区切り線) のみを削除するには
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 の背景と前景の要求に応答し、(1) Nvim オプション
'background' が "dark" の場合は黒い背景と白い前景を、(2)
'background' が "light" の場合は白い背景と黒い前景を示すことで対応します。これは、実際のフォアグラウンド/バックグラウンドの色を反映しない場合もありますが、ターミナルエミュレーターで実行されているネストされた Nvim インスタンスで
'background' を保持できます。
TermOpen:
ターミナル バッファのデフォルトオプションを設定します
nvim_cmdwin
CmdwinEnter:
cmdwin での構文同期を maxlines=1 に制限します。
nvim_swapfile
SwapExists: スワップファイルが実行中の Nvim プロセスによって所有されている場合、スワップファイルのプロンプトをスキップします (
v:swapchoice を "e" に設定)。
W325 "スワップファイルを無視…" メッセージを表示します。
主要なコンポーネント
ユーザーエクスペリエンス
直感的かつ一貫して動作することは、Nvim の主要な目標です。
feature-compile
Nvim は常にすべての機能を含んでいます。これは、100 以上のオプション機能のさまざまな組み合わせを出荷する Vim とは対照的です。
feature-compile これは、Vim の "HUGE" ビルドのよりスリムなバージョンと考えてください。これにより、バグの表面領域が減少し、ユーザーにとって混乱や摩擦の一般的な原因が解消されます。
Vim の内部テスト機能 (test_autochdir(), test_settime() など) は公開されていません(実装もされていません)。代わりに Nvim には堅牢な API があります。
ユーザーが節約する時間よりも多くの時間を費やすことになる動作、オプション、ドキュメントは削除されます。
ユーザビリティの詳細は、後方互換性のコストよりもメリットが大きい場合に改善されました。いくつかの例を挙げます。
一部の機能は、外部プラグインを必要としていたものが組み込まれています。
ヤンクされた領域のハイライト表示については、
vim.hl を参照してください。
アーキテクチャ
Nvim UI はコアエディターから「分離」されています。組み込みの
TUI を含むすべての UI は、Nvim サーバーに接続する (
--server または
--embed 経由) プラグインに過ぎません。複数の Nvim UI クライアントが同じ Nvim エディターサーバーに接続できます。
外部プラグインは別のプロセスで実行されます。
remote-plugin これにより安定性が向上し、それらのプラグインがエディターをブロックすることなく動作できるようになります。古い Vim インターフェイス (
if_pyth,
if_ruby) を使用する「レガシー」Python および Ruby プラグインでさえ、プロセス外で実行されるため、Nvim をクラッシュさせることはできません。
プラットフォームおよび I/O 機能は libuv を基盤として構築されています。Nvim は libuv の機能とバグ修正の恩恵を受けており、他のプロジェクトは Nvim 開発者による libuv の改善の恩恵を受けています。
機能
コマンドライン
(実験的)
g:Nvim_color_cmdline コマンドライン (
: ) は、
g:Nvim_color_cmdline
で定義されたコールバックによって色分けされます (このコールバックはテスト専用であり、将来削除される予定です)。
コマンド
:Man はデフォルトで利用可能で、補完などの多くの改善が加えられています。
:match は、ハイライトグループが定義される前に呼び出すことができます
:write に "++p" フラグを指定すると、親ディレクトリが作成されます。
入力/マッピング
ALT (
META) コードは常に機能します (
TUI でも)。任意のキーで
<M- をマップします:
<M-1>
,
<M-BS>
,
<M-Del>
,
<M-Ins>
,
<M-/>
,
<M-\>
,
<M-Space>
,
<M-Enter>
など。
大文字と小文字を区別します: <M-a>
と <M-A>
は 2 つの異なるキーコードです。
ノーマルコマンド
gO は、現在のバッファのファイルタイプ定義された「アウトライン」を表示します。
Q は、Ex モードに切り替える代わりに、最後に記録されたマクロを再生します (
gQ )。
オプション
:set {option}<
は、すべての
グローバルローカル オプションのローカル値を削除します。
:setlocal {option}<
は、すべてのオプションのグローバル値をローカル値にコピーします。
'exrc' は、".nvim.lua", ".nvimrc", または ".exrc" ファイルを検索します。ユーザーは、ファイルを信頼するかどうかを尋ねられます。
'fillchars' フラグ: "msgsep", "horiz", "horizup", "horizdown", "vertleft", "vertright", "verthoriz"
"view" は、ジャンプリストを移動するときに
mark-view を復元しようとします。
"clean" は、アンロードされたバッファーをジャンプリストから削除します。
"F" フラグは、自動コマンドからの出力に影響を与えません。
"q" フラグは、マクロ記録メッセージを完全に非表示にします。
'tabline' タブページラベルの中央クリックでタブページを閉じ、%@Func@foo%X はマウスクリック時に任意の関数を呼び出すことができます
シェル
シェルの出力 (
:!,
:make, …) は常に UI を介してルーティングされるため、画面を「めちゃくちゃ」にすることはありません。(画面をめちゃくちゃにしたい場合は、"chansend(v:stderr,…)" を使用できます :)
Nvim は、出力が多すぎる場合に、シェルコマンド (
:!,
:grep,
:make) からのメッセージを調整 (スキップ) します。データが失われることはありません。これは表示にのみ影響し、パフォーマンスが向上します。
:terminal 出力は調整されることはありません。
:! は「インタラクティブ」コマンドをサポートしていません。代わりに
:terminal を使用してください。(GUI Vim にも同様の制限があります。Vim の ":help gui-pty" を参照してください。)
:!start は Windows で特殊ケースとして扱われません。
サイン
関連付けられた行が削除されると、サインが削除されます。
同じグループ内で同じ識別子で 2 回配置されたサインは移動されます。
起動
-e と
-es は、-E と -Es と同じ「改善された Ex モード」を呼び出します。
-E と
-Es は、stdin をテキストとして読み取ります (バッファ 1 へ)。
自動的に終了し、"-c qa!" は不要です。
スワップファイルダイアログをスキップします。
-s は、スクリプト名が "-" の場合、stdin からノーマルコマンドを読み取ります。
stdin から (コマンドではなく) テキストを読み取る
--デフォルトで動作します: "-" ファイルはオプションです
より多くのケースで動作します:
-Es, ファイル引数
'term' E529 E530 E531 'term' は、
$TERM およびその他の環境チェックから派生したターミナルタイプを反映します。デバッグ専用です。起動中は信頼できません。
:echo &term
"builtin_x" は、システムで予期される terminfo ファイルが見つからなかったため、
builtin-terms のいずれかが選択されたことを意味します。
Nvim は、Linux 仮想ターミナルで 256 色の機能を使用します。Vim は、Linux VT で 8 色に加えて明るい前景のみを使用します。
Vim は、その
builtin-terms にあるものと、terminfo から読み取ったものを組み合わせ、その組み合わせがどのように機能するかを制御する
'ttybuiltin' 設定を持っています。Nvim はどちらか一方を使用し、両方をマージしようとはしません。
これらの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() テキストが含まれるようになりました。
string() と
:echo の挙動が変更されました
1. ネストされたコンテナ構造には、最大再帰深度制限が適用されません。
2.
string() は、再帰制限を超えたときではなく、ネストされたコンテナで即座に失敗します。
3.
:echo が以下のような重複したコンテナに遭遇した場合、
let l = []
echo [l, l]
"[...]" は使用しません(以前は "[[], [...]]"、現在は "[[], []]")。"..." は再帰的なコンテナにのみ使用されます。
5. 文字列化された無限大および NaN 値は
str2float() を使用するようになり、評価して戻すことができます。
6. (内部)Vim で VAR_UNKNOWN を出力または文字列化しようとすると何も出力されず E908 になりますが、Nvim では内部エラーとなります。
Viminfo テキストファイルはバイナリ(messagepack)の
shada ファイルに置き換えられました。その他の違い
shada-s は、レジスタだけでなく、すべての項目のサイズを制限するようになりました。
一部のエラーが発生した場合、ShaDa コードはユーザーが対応を決定できるように一時ファイルをそのまま保持します。Vim はこのような場合、一時ファイルを削除します。
shada-error-handling
printf() は
%p
引数で使用すると意味のある値を返します。Vim では文字列の役に立たないアドレス(文字列は新たに割り当てられたメモリにコピーされます)を返し、文字列に変換できない型では失敗していました。詳細については
id() を参照してください。現在、内部的に
printf("%p", {expr})
を使用しています。
:lua print("a\0b")
は、:echomsg "a\nb"
と同様に、a^@b
を出力します。Vim では、:lua print("a\nb")
とまったく同様に、a
と b
を別々の行に出力します。
: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 参照)。
マクロ(
録画)の挙動
:lmap 中に録画されたマクロの再生は、録画時と同じアクションを生成します。Vim では、:lmap'ped キーを使用中にマクロを録画すると、録画時と再生時の挙動が異なります。
マッピング
簡略化可能なキー(例:<C-I>
)のマッピングを作成しても、簡略化された形式(例:<Tab>
)の既存のマッピングは置き換えられません。
マッピングの lhs の先頭にある数字の後に続く "#" は、ファンクションキーを表しません。
パフォーマンス
フォールドは挿入モード中に更新されません。
構文ハイライト
syncolor.vim が削除されました。Nvim は、構文ハイライトが有効かどうかにかかわらず、ライトおよびダーク背景の両方に対して、デフォルトのハイライトグループを自動的に設定するようになりました。これは、
:syntax-on と
:syntax-enable が同一になったことを意味します。以前に after/syntax/syncolor.vim ファイルを使用していたユーザーは、そのファイルをカラースキームに移行する必要があります。
:colorscheme
ワーキングディレクトリ(Vim はこれらのいくつかを Nvim の後に実装しました)
haslocaldir() は、ウィンドウ番号として -1 が渡された場合にのみタブローカルディレクトリをチェックし、可能な戻り値は 0 と 1 のみです。
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 を Web ブラウザまたはその他の HTML ビューアで印刷してください。
:helpfind
:mode (引数を受け付けなくなりました)
:open
:Print
:promptfind
:promptrepl
:scriptversion (常にバージョン 1)
:shell
:sleep! (カーソルを非表示にしません。:sleep と同じ)
:smile
:tearoff
:cstag
:cscope
:lcscope
:scscope
:Vimuntar
:TOhtml
は (さまざまな違いを伴う) Lua バージョンに置き換えられました
Eval
Vim9script
v:none (JavaScript の "undefined" を表すために Vim で使用されていました)。代わりに
v:null を使用してください。
オプション
アンチエイリアス
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
'guipty' (Nvim はすべてのプラットフォームでパイプと PTY を一貫して使用します。)
keyprotocol
'pastetoggle' 'pt' ただ貼り付けるだけです。™ ターミナルまたは GUI の貼り付け機能 (
CTRL-SHIFT-v
、CMD-v (macOS)、中クリックなど) を使用してテキストを貼り付けると、
貼り付け は自動的に処理されます。
'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
画面バッファに収まらない大きな文字でテキストを編集することはできますが、表示することはできません。
g8 または
ga を使用してください。
mbyte-combining を参照してください。
注: rexexp エンジンには、構成文字を 6 つのみ考慮するというハードコードされた制限がまだあります。
printoptions
textauto
textmode
weirdinvert
プラグイン
logiPat
rrhelper
macmap.vim
tools/check_colors.vim
macros/{justify,matchit,shellmenu,swapmous}.vim: packadd! justify
などを直接使用してください
プロバイダー
if_lua : Nvim の
Lua API は Vim の "if_lua" と互換性がありません。
起動
--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 ビット制御シーケンスを使用します。