編集

Nvimの:helpページは、生成され、ソースtree-sitter-vimdocパーサーを使って処理しています。


ファイルの編集

1. はじめに edit-intro

Vimでファイルを編集するということは
1. ファイルをバッファに読み込む 2. エディタコマンドでバッファを変更する 3. バッファをファイルに書き込む
current-file
バッファを書き込まない限り、元のファイルは変更されません。ファイルの編集を開始する(ファイルをバッファに読み込む)と、ファイル名が「カレントファイル名」として記憶されます。これはカレントバッファの名前としても知られています。コマンドラインで "%" と共に使用できます。:_%.
alternate-file
すでにカレントファイル名がある場合、そのファイル名が代替ファイル名になります。コマンドラインで "#" と共に使用できます。:_# そして、CTRL-^ コマンドを使用して、カレントファイルと代替ファイルを切り替えることができます。ただし、:keepalt を使用した場合、代替ファイル名は変更されません。代替ファイル名はウィンドウごとに記憶されます。
:keepalt :keepa :keepalt {cmd} カレントの代替ファイル名を保持したまま、{cmd} を実行します。間接的に(例えば関数で)呼び出されたコマンドは、代替ファイル名を変更する可能性があることに注意してください。
すべてのファイル名はバッファリストに記憶されます。編集のためにファイル名を入力した時(例えば、":e filename")、あるいは書き込みのためにファイル名を入力した時(例えば、":w filename")、そのファイル名はリストに追加されます。バッファリストを使用すると、編集したファイルを覚えておくことができ、CTRL-^ コマンドでファイルを素早く切り替えることができます(例えば、テキストをコピーするため)。最初にファイルの番号を入力し、それから CTRL-^ を押します。
CTRL-G または CTRL-G :f :fi :file :f[ile] カレントファイル名(":cd" を使用していない場合は入力した通り)、カーソル位置('ruler' オプションが設定されていない場合)、およびファイルステータス(読み取り専用、変更済み、読み取りエラー、新規ファイル)を出力します。このメッセージを短くする方法については、'shortmess' オプションを参照してください。
:f[ile]! :file と同様ですが、'shortmess' がこれを示していても、名前を切り詰めません。
{count}CTRL-G CTRL-G と同様ですが、カレントファイル名をフルパスで出力します。カウントが1より大きい場合、カレントバッファ番号も表示されます。
g_CTRL-G word-count byte-count g CTRL-G カーソルの現在位置を、Column、Line、Word、Character、Byteの5つの方法で出力します。CharacterとByteの数が同じ場合、Characterの位置は省略されます。
行に画面上で複数の位置を占める文字(<Tab> や特殊文字)、または列あたり複数のバイトを使用する文字('encoding' が utf-8 の場合、0x7F より上の文字)がある場合、バイト列と画面列の両方がダッシュで区切られて表示されます。
'ruler' オプションと wordcount() 関数も参照してください。
v_g_CTRL-G
{Visual}g CTRL-G "g CTRL-G" と同様ですが、視覚的に選択された領域の Word、Character、Line、Byte のカウントが表示されます。ブロックワイズモードでは、Column カウントも表示されます。({Visual} については、Visual-mode を参照してください。)
:file_f
:f[ile][!] {name} カレントファイル名を {name} に設定します。オプションの ! は、:file と同様に、メッセージを切り詰めるのを避けます。バッファに名前があった場合、その名前は 代替ファイル名になります。リストされていないバッファが古い名前を保持するために作成されます。:0file
:0f[ile][!] カレントバッファの名前を削除します。オプションの ! は、:file と同様に、メッセージを切り詰めるのを避けます。
:buffers :files :ls 現在知られているすべてのファイル名をリストします。 windows.txt :files :buffers :ls を参照してください。
Vim は、入力したファイル名のフルパス名を記憶します。ほとんどの場合、ファイル名が表示されるときは入力した名前のみが表示されますが、":cd" コマンドを使用した場合は、フルパス名が使用されています。:cd.
home-replace
環境変数 $HOME が設定されていて、ファイル名がその文字列で始まる場合、多くの場合、HOME が "~" に置き換えられて表示されます。これはファイル名を短く保つために行われました。ファイルの読み取りまたは書き込みを行う場合、フルネームが引き続き使用され、ファイル名を表示する場合のみ "~" が使用されます。ファイル名を置き換えた結果が "~" だけになる場合、代わりに "~/" が使用されます('backupext' が "~" に設定された状態で $HOME に設定されたオプション間の混乱を避けるため)。
バッファを書き込むとき、デフォルトでは現在のファイル名を使用します。したがって、"ZZ" または ":wq" コマンドを実行すると、元のファイルが上書きされます。これを望まない場合は、":write" コマンドにファイル名引数を指定して、バッファを別のファイルに書き込むことができます。例えば
vim testfile
[change the buffer with editor commands]
:w newfile
:q
これにより、"testfile" の変更されたコピーであるファイル "newfile" が作成されます。ファイル "testfile" は変更されません。いずれにせよ、'backup' オプションが設定されている場合、Vim は上書きされる前に元のファイルの名前を変更またはコピーします。元のファイルが必要だとわかった場合、このファイルを使用できます。'patchmode' オプションも参照してください。バックアップファイルの名前は通常、元のファイルと同じで、'backupext' が追加されます。デフォルトの "~" は、既存のファイルを誤って上書きするのを避けるために少し奇妙です。".bak" を優先する場合は、'backupext' オプションを変更してください。バックアップファイルは、'backupdir' を設定することで別のディレクトリに配置できます。
ファイル名を指定せずに編集を開始した場合、メッセージに "No File" が表示されます。":write" コマンドがファイル名引数付きで使用された場合、カレントファイルのファイル名がそのファイル名に設定されます。これは、'F' フラグが 'cpoptions' に含まれている場合にのみ発生します(デフォルトでは含まれています)cpo-F。これは、空のバッファにテキストを入力してからファイルに書き込む場合に便利です。'cpoptions' に 'f' フラグが含まれている場合(デフォルトでは含まれていません)cpo-f、ファイル名は ":read file" コマンドで設定されます。これは、引数なしで Vim を起動し、それから ":read file" を実行してファイルの編集を開始する場合に便利です。ファイル名が設定され、'filetype' が空の場合、ファイルタイプ検出の自動コマンドがトリガーされます。not-edited
ファイル名が実際に編集を開始せずに設定されたため、そのファイルを上書きするのを防ぐことができます。これは、「notedited」フラグを設定することで行われます。このフラグが設定されているかどうかは、CTRL-G または ":file" コマンドで確認できます。「notedited」フラグが設定されている場合、「[Not edited]」が含まれます。バッファを現在のファイル名に書き込むとき(":w!"を使用)、"notedited" フラグはリセットされます。
abandon
Vim は、バッファを変更したかどうかを記憶します。変更した内容が失われるのを防ぐために保護されています。書き込みを行わずに終了しようとしたり、別のファイルの編集を開始しようとしたりすると、Vim はこれを拒否します。この保護を無効にするには、コマンドに「!」を追加します。変更は失われます。例:バッファが変更された場合、":q" は機能しませんが、":q!" は機能します。バッファが変更されたかどうかを確認するには、"CTRL-G" コマンドを使用します。メッセージには、バッファが変更された場合は文字列「[Modified]」が含まれ、'm' フラグが 'shortmess' に含まれている場合は「+」が含まれます。
変更を要求せずに自動的に保存する場合は、'autowriteall' オプションをオンにします。'autowrite' は、すべてのコマンドで機能しない関連する Vi 互換オプションです。
変更されたバッファを保存せずに保持したい場合は、'hidden' オプションをオンにします。hidden-buffer を参照してください。 'hidden' が設定されていない場合でも、一部のコマンドはこのように機能します。コマンドのヘルプを確認してください。

2. ファイルの編集 edit-a-file

:e :edit reload :e[dit][!] [++opt] [+cmd] カレントファイルを編集します。これは、Vim の外部で変更された場合に、カレントファイルを再編集する場合に便利です。:edit! discard [!] が指定されている場合、カレントバッファの未保存の変更は破棄されます。[!] がない場合、'autowriteall' が設定されていてファイルを書き込むことができる場合を除き、未保存の変更がある場合はコマンドが失敗します。 ++opt および +cmd も参照してください。
:edit_f
:e[dit][!] [++opt] [+cmd] {file} {file} を編集します。:edit!_f
[!] が指定されている場合、カレントバッファの未保存の変更は破棄されます。[!] がない場合、'hidden' が設定されているか、'autowriteall' が設定されていてファイルを書き込むことができる場合を除き、未保存の変更がある場合はコマンドが失敗します。++opt および +cmd も参照してください。
:edit_# :e# :e[dit] [++opt] [+cmd] #[count] :files で表示されるように、[count] 番目のバッファを編集します。このコマンドは [count] CTRL-^ と同じことを行います。ただし、":e #" は代替バッファにファイル名がない場合は機能しませんが、CTRL-^ はその場合でも機能します。 ++opt および +cmd も参照してください。
:ene :enew :ene[w] 新しい名前のないバッファを編集します。'hidden' が設定されているか、'autowriteall' が設定されていてファイルを書き込むことができる場合を除き、カレントバッファに変更が加えられている場合は失敗します。'fileformats' が空でない場合、新しいバッファには最初に指定されたフォーマットが使用されます。'fileformats' が空の場合、カレントバッファの 'fileformat' が使用されます。
:ene! :enew! :ene[w]! 新しい名前のないバッファを編集します。カレントバッファへの変更を破棄します。:enew のように 'fileformat' を設定します。
:fin :find :fin[d][!] [++opt] [+cmd] {file} 'path' 内で {file} を検索し、見つかったら :edit で開きます。
:{count}fin[d][!] [++opt] [+cmd] {file} ":find" と同様ですが、'path' 内で {count} 番目に見つかったファイルを使用します。例えば、":2find file" は、'path' 内で 2 番目に見つかった "file" を開きます。指定した {count} より 'path' 内で見つかるファイルの数が少ない場合は、エラーメッセージが表示されます。
:ex
:ex [++opt] [+cmd] [file] :edit と同じです。
:vi :visual :vi[sual][!] [++opt] [+cmd] [file] Ex モードで使用した場合、Ex モード を終了し、ノーマルモードに戻ります。それ以外の場合は :edit と同じです。
:vie :view :vie[w][!] [++opt] [+cmd] file Ex モードで使用した場合、Ex モード を終了し、ノーマルモードに戻ります。それ以外の場合は :edit と同じですが、このバッファに対して 'readonly' オプションを設定します。
CTRL-^ CTRL-6 CTRL-^ 代替ファイルを開きます。通常、代替ファイルは直前に編集していたファイルです。これは 2 つのファイルを素早く切り替えるための方法です。ファイル名がない場合でも動作するという点を除いて、":e #" と同じです。
'autowrite' または 'autowriteall' オプションが有効で、バッファが変更されている場合は、バッファを書き込みます。通常、^ 文字は 6 キーに位置しており、CTRL と 6 を押すと CTRL-^ になります。ただし、一部の非 US キーボードでは、CTRL-^ は別の方法で入力されます。
{count}CTRL-^ バッファリストの [count] 番目のファイルを編集します(":e #[count]" と同じ)。これはファイルを素早く切り替えるための方法です。詳細は、上記の CTRL-^ を参照してください。
gf E446 E447 [count]gf カーソル下またはカーソル後のファイル名を編集します。ニーモニック: "goto file"。ファイル名に含まれる文字を判別するために 'isfname' オプションを使用します。末尾の句読点 ".,:;!" は無視されます。エスケープされたスペース "\ " は単一のスペースに縮小されます。'path' オプションをファイル検索のためのディレクトリ名のリストとして使用します。相対ディレクトリとワイルドカードの詳細については、'path' オプションを参照してください。'suffixesadd' オプションを使用して、サフィックスが追加されたファイル名をチェックします。ファイルが見つからない場合、'includeexpr' を使用して名前を変更し、再度試行します。[count] が指定された場合、'path' 内で見つかった [count] 番目のファイルが編集されます。このコマンドは、Vim が現在のファイルを 破棄 することを拒否した場合に失敗します。新しいウィンドウでファイルを編集する場合は、CTRL-W_CTRL-F を使用します。新しいファイルを編集したい場合は、以下を使用してください
:e <cfile>
gf を常にそのように動作させるには
:map gf :e <cfile><CR>
名前が "type://machine/path" のようなハイパーテキストリンクである場合は、netrw プラグインが必要です。Unix の場合、"~user/file" のように '~' 文字が展開されます。環境変数も 展開 されます。
v_gf
{Visual}[count]gf "gf" と同じですが、ハイライトされたテキストが編集するファイル名として使用されます。'isfname' は無視されます。先頭の空白はスキップされます。それ以外の場合、すべての空白と特殊文字がファイル名に含まれます。({Visual} については、ビジュアルモード を参照してください。)
gF
[count]gF "gf" と同じですが、ファイル名の後に数字が続く場合、カーソルはそのファイルの指定された行に移動します。ファイル名と数字は、ファイル名ではない文字('isfname' を参照)および数字ではない文字で区切られている必要があります。" line " も、:verbose command UserCmd の出力で使用されるように認識されます。ファイル名、区切り文字、数字の間の空白は無視されます。例:
eval.c:10
eval.c @ 20
eval.c (30)
eval.c 40
v_gF
{Visual}[count]gF "v_gf" と同じです。
これらのコマンドは、単一のファイルの編集を開始するために使用されます。これは、ファイルがバッファに読み込まれ、現在のファイル名が設定されることを意味します。開かれるファイルは現在のディレクトリに依存します。:cd を参照してください。
ファイルが読み込まれた後に表示されるメッセージの説明については、read-messages を参照してください。
バッファを混乱させて、最初からやり直したい場合は、":e!" コマンドを使用できます。":e" コマンドは、現在のファイル名を変更した場合にのみ役立ちます。
:filename {file} ここで説明した内容に加えて、ファイル名が期待される場所で使用される特別な項目については、cmdline-special で説明しています。
Unix 以外のシステムでの注意: 単一のファイル名を受け付けるコマンド(":edit file" など)を使用する場合、ファイル名にスペースを含めることができますが、末尾のスペースは無視されます。これは、ファイル名にスペースを埋め込むことが一般的なシステム(MS-Windows など)で役立ちます。例: ":e Long File Name " コマンドは、"Long File Name" ファイルを編集します。複数のファイル名を受け付けるコマンド(":next file1 file2" など)を使用する場合、埋め込まれたスペースはバックスラッシュでエスケープする必要があります。
wildcard wildcards {file} 内のワイルドカードは展開されますが、ファイル補完と同様に、'wildignore''suffixes' が適用されます。サポートされるワイルドカードはシステムによって異なります。以下は一般的なものです。? は 1 文字にマッチします。* は何も含めてすべてにマッチします。** は何も含めてすべてにマッチし、ディレクトリを再帰的に検索します。[abc] は 'a'、'b'、または 'c' にマッチします。
ワイルドカードの特別な意味を回避するには、バックスラッシュを先頭に追加します。ただし、MS-Windows ではバックスラッシュはパス区切り文字であり、"path\[abc]" は "[" が 'isfname' オプションに含まれている場合でも、ワイルドカードと見なされます。これを回避する簡単な方法は、"path\[[]abc]" を使用することです。これは "path\[abc]" ファイルにマッチします。
starstar-wildcard
Unix、Win32、macOS、およびその他のいくつかのシステムでは、"**" を展開できます(ただし、Unix および macOS では 'shell' 設定に依存する場合があります)。zsh では正しく動作することがわかっています。bash の場合、少なくとも bash バージョン >= 4.X が必要です。これにより、ディレクトリツリーを検索できます。これは、最大 100 ディレクトリの深さまで検索します。一部のコマンドでは、これがわずかに異なる動作をすることに注意してください。file-searching を参照してください。例:
:n **/*.txt
ファイルを見つけます
aaa.txt
subdir/bbb.txt
a/b/c/d/ccc.txt
ワイルドカードではない文字が "**" の直前または直後に使用されている場合、これらは最上位ディレクトリでのみマッチします。これらは、ツリー内のさらに下のディレクトリには使用されません。例えば
:n /usr/inc**/types.h
ファイルを見つけます
/usr/include/types.h
/usr/include/sys/types.h
/usr/inc/old/types.h
"/sys" を含むパスは、"/inc" にマッチする必要がないため含まれることに注意してください。したがって、"/usr/inc*/*/*..." にマッチするようなものであり、"/usr/inc*/inc*/inc*" にマッチするようなものではありません。
backtick-expansion `-expansion Unix およびその他のいくつかのシステムでは、ファイル名引数にバッククォートを使用することもできます。例えば
:next `find . -name ver\\*.c -print`
:view `ls -t *.patch  \| head -n1`
Vim は 'shell' を使用してバッククォート内のコマンドを実行し、標準出力を指定された Vim コマンドの引数として使用します(シェルコマンドからのエラーメッセージは破棄されます)。Vim が実行しているシェルコマンドを確認するには、'verbose' オプションを 4 に設定します。シェルコマンドが 0 以外の終了コードを返すと、エラーメッセージが表示され、Vim コマンドは中断されます。これを回避するには、以下のようにシェルが常にゼロを返すようにします。
:next `find . -name ver\\*.c -print \|\| true`
スターの前のバックスラッシュは、find プログラムの実行前にシェルが "ver*.c" を展開するのを防ぐために必要です。シェルパイプ記号 "|" の前のバックスラッシュは、Vim がコマンド終了として解析するのを防ぎます。これは、ほとんどの他のシステムでも動作しますが、バッククォートは項目全体を囲む必要があるという制限があります。最初のバッククォートの直前または最後のバッククォートの直後にテキストを配置することはできません。
`=
外部コマンドとしてではなく、Vim 式としてバッククォートを展開させるには、最初のバッククォートの直後に等号を置きます。例えば
:e `=tempname()`
式にはほぼすべてのものを含めることができるため、'"'、"|"'、'%'、'#' の特別な意味を回避するためにも使用できます。ただし、'wildignore' は他のワイルドカードと同様に適用されます。
式の環境変数は、式を評価するときに展開されるため、これは機能します。
:e `=$HOME .. '/.vimrc'`
これは文字列内で $HOME を使用していますが、文字通り使用され、おそらく意図したものではありません。
:e `='$HOME' .. '/.vimrc'`
式が文字列を返す場合、名前は改行で区切られます。結果が リスト の場合、各項目が名前として使用されます。改行も名前を区切ります。このような式は、Ex コマンドの引数としてファイル名が期待される場所でのみサポートされていることに注意してください。
++opt [++opt] [++opt] 引数を使用すると、1 つのコマンドに対していくつかのオプションを設定したり、不正な文字の動作を指定したりできます。形式は次のとおりです。
++{optname}
または
++{optname}={value}
ここで、{optname} は次のいずれかです: ++ff ++enc ++bin ++nobin ++edit ff または fileformat は 'fileformat' を上書きします。enc または encoding は 'fileencoding' を上書きします。bin または binary は 'binary' を設定します。nobin または nobinary は 'binary' をリセットします。bad は不正な文字の動作を指定します。:read の場合は edit: ファイルを編集しているかのようにオプションを保持します。:write の場合は p: ファイルの親ディレクトリを作成します。
{value} には空白を含めることはできません。オプションの有効な値であれば何でも構いません。例:
:e ++ff=unix
これは 'fileformat' を "unix" に設定して同じファイルを再度編集します。
:w ++enc=latin1 newfile
これは現在のバッファを latin1 形式で "newfile" に書き込みます。
'fileencoding' または ++enc で指定された値が 'encoding' と異なる場合、ファイルを書き込むときに表示されるメッセージは "[converted]" を示します。
複数の ++opt 引数を、空白で区切って指定できます。これらはすべて、+cmd 引数の前に記述する必要があります。
++p
"++p" フラグは、ファイルが存在しない場合、そのファイルの親ディレクトリを作成します。たとえば、"foo/bar/file.txt" を編集する場合、":write ++p" コマンドは、ファイルを書き込む前に必要に応じて "foo/bar/" を作成します。
:edit foo/bar/file.txt
:write ++p
":write" ( "++p" なし) が常に存在しない親ディレクトリを作成するようにしたい場合は、次の autocmd を設定に追加します。
" Auto-create parent directories (except for URIs "://").
au BufWritePre,FileWritePre * if @% !~# '\(://\)' | call mkdir(expand('<afile>:p:h'), 'p') | endif
++bad
"++bad=" の引数は、変換できない文字や不正なバイトの処理方法を指定します。次の 3 つのいずれかを指定できます: ++bad=X 各不正な文字を置き換える単一バイト文字。++bad=keep 不正な文字を変換せずに保持します。これにより、テキストに不正なバイトが含まれる可能性があることに注意してください。++bad=drop 不正な文字を削除します。
デフォルトは "++bad=?" のようになります: 各不正な文字を疑問符で置き換えます。一部の場所では、逆さまの疑問符 (0xBF) が使用されます。
すべてのコマンドが ++bad 引数を使用するわけではないことに注意してください。追加してもエラーが表示されない場合でも、例えば :write などです。
読み取り時、'fileformat' および 'fileencoding' オプションは、使用された形式に設定されます。書き込み時にこれは発生しないため、次の書き込みではオプションの古い値が使用されます。'binary' オプションも同様です。
+cmd [+cmd] [+cmd] 引数は、新しく開いたファイル内でカーソルを配置したり、他のコマンドを実行したりするために使用できます。+ 最後の行から開始します。+{num} {num}行目から開始します。+/{pat} {pat} を含む最初の行から開始します。+{command} 新しいファイルを開いた後、{command} を実行します。{command} は任意の Ex コマンドです。{pat} または {command} に空白を含めるには、バックスラッシュでエスケープします。バックスラッシュの数は2倍にします。
:edit  +/The\ book             file
:edit  +/dir\ dirname\\      file
:edit  +set\ dir=c:\\\\temp  file
最後の例では、バックスラッシュの数が2回半分になることに注意してください。一度は "+cmd" 引数のため、もう一度は ":set" コマンドのためです。
ファイル形式
'fileformat' オプションは、ファイルの <EOL> スタイルを設定します。
'fileformat' 文字名
"dos" <CR><NL> または <NL> DOS 形式 DOS形式
"unix" <NL> Unix 形式 Unix形式
"mac" <CR> Mac 形式 Mac形式
ファイルを読み込む際、上記の文字は <EOL> として解釈されます。DOS 形式(Windows のデフォルト)では、<CR><NL><NL> の両方が <EOL> として解釈されます。DOS 形式でファイルを書き込む場合、<NL> ごとに <CR> 文字が追加されることに注意してください。file-read も参照してください。
ファイルを書き込む際、上記の文字が <EOL> に使用されます。DOS 形式では、<CR><NL> が使用されます。DOS-format-write も参照してください。
DOS 形式でファイルを読み込み、Unix 形式で書き込むことができます。これにより、すべての <CR><NL> のペアが <NL> に置き換えられます('fileformats' に "dos" が含まれている場合)。
:e file
:set fileformat=unix
:w
Unix 形式でファイルを読み込み、DOS 形式で書き込むと、すべての <NL> 文字が <CR><NL> に置き換えられます('fileformats' に "unix" が含まれている場合)。
:e file
:set fileformat=dos
:w
新しいファイルの編集を開始し、'fileformats' オプションが空でない場合(デフォルト)、Vim はファイル内の行が指定された形式で区切られているかどうかを検出しようとします。"unix,dos" に設定されている場合、Vim は単一の <NL> (Unix で使用される) または <CR><NL> のペア (MS-Windows) で終わる行を確認します。すべての行が <CR><NL> で終わっている場合にのみ、'fileformat' が "dos" に設定され、それ以外の場合は "unix" に設定されます。'fileformats' に "mac" が含まれており、ファイル内に <NL> 文字が見つからない場合、'fileformat' は "mac" に設定されます。
'fileformat' オプションが MS-Windows 以外のシステムで "dos" に設定されている場合、[dos] メッセージが表示され、通常とは異なる状況が発生していることを示します。MS-Windows システムでは、'fileformat' が "unix" に設定されている場合、[unix] メッセージが表示されます。すべてのシステムで、'fileformat' が "mac" に設定されている場合は、[mac] メッセージが表示されます。
'fileformats' オプションが空で、DOS 形式が使用されているが、ファイルの読み込み中に一部の行が <CR><NL> で終わっていなかった場合、ファイルメッセージに "[CR missing]" が含まれます。'fileformats' オプションが空で、Mac 形式が使用されているが、ファイルの読み込み中に <NL> が見つかった場合、ファイルメッセージに "[NL missing]" が含まれます。
新しいファイルが存在しない場合、'fileformats' が空のときは、現在のバッファの 'fileformat' が使用されます。それ以外の場合は、'fileformats' の最初の形式が新しいファイルに使用されます。
バイナリファイル、実行ファイル、または Vim スクリプトファイルを編集する前に、'binary' オプションを設定する必要があります。これを行う簡単な方法は、"-b" オプションを指定して Vim を起動することです。これにより、'fileformat' の使用が回避されます。これがないと、単一の <NL> 文字が予期せず <CR><NL> に置き換えられる危険性があります。

行末とファイル末尾 eol-and-eof

Vim には、ファイル形式を制御するためのいくつかのオプションがあります。'fileformat' <EOL> スタイル:Unix、DOS、Mac 'endofline' 最後の行が <EOL> で終わるかどうか 'endoffile' ファイルが CTRL-Z で終わるかどうか 'fixendofline' eol と eof を修正するかどうか
最初の3つの値は、通常、ファイルの読み込み時に自動的に検出され、テキストをファイルに書き込む際に使用されます。バッファの編集中は、すべての行に改行があり、CTRL-Z は存在しないように見えます('binary' が設定されている場合は例外で、動作が異なります)。
'fixendofline' オプションは、書き込む内容を選択するために使用できます。オプション値を変更して、読み込んだ方法とは異なる方法でファイルを書き込むこともできます。
以下に、使用方法の例をいくつか示します。
Unix 形式のファイルが必要な場合 (すべての行が NL で終了)
setl ff=unix fixeol
おそらく、どの Unix ライクなシステムでもこれを行う必要があるでしょう。また、最新の MS-Windows システムもこれでうまく動作する傾向があります。Vim スクリプトには、常にこの形式を使用することをお勧めします。
古い MS-DOS ファイルを最新の環境で使用し、改行を修正し、CTRL-Z を削除し、<CR><NL> スタイルの <EOL> を保持する場合
setl ff=dos fixeol
これは多くの MS-Windows プログラムで役立ちます。これらのプログラムでは、<CR><NL> の改行が期待されることがよくあります。
最後の <EOL> を削除し、最後の CTRL-Z を追加する場合 (例:CP/M のような古いシステム)
setl ff=dos nofixeol noeol eof
最後の <EOL> と最後の CTRL-Z を含む、ファイル形式を現状のまま正確に保持する場合
setl nofixeol

3. 引数リスト 引数リスト arglist

Vim の起動時に複数のファイル名を指定すると、このリストは引数リストとして記憶されます。このリスト内の各ファイルにジャンプできます。
:buffers コマンドで確認できるバッファリストと混同しないでください。引数リストは Vi にすでに存在していましたが、バッファリストは Vim の新機能です。引数リスト内のすべてのファイル名もバッファリストに存在します(:bdel または :bwipe で削除されていない場合)。ただし、バッファリスト内の名前が引数リストにないのはよくあることです。
この件については、ユーザマニュアルの 07.2 節で紹介しています。
グローバルな引数リストが1つあり、デフォルトではすべてのウィンドウで使用されます。ウィンドウにローカルな新しい引数リストを作成できます。:arglocal を参照してください。
以下のコマンドと、式関数 argc() および argv() で引数リストを使用できます。これらはすべて、現在のウィンドウの引数リストで機能します。
:ar :arg :args :ar[gs] 引数リストを、現在のファイルを角かっこで囲んで表示します。
:ar[gs] [++opt] [+cmd] {arglist} :args_f
{arglist} を新しい引数リストとして定義し、最初の一つを編集します。変更が行われており、Vim が現在のバッファを 破棄 することを望まない場合、これは失敗します。++opt および +cmd も参照してください。
:ar[gs]! [++opt] [+cmd] {arglist} :args_f!
{arglist} を新しい引数リストとして定義し、最初の一つを編集します。現在のバッファへの変更は破棄します。++opt および +cmd も参照してください。
:[count]arge[dit][!] [++opt] [+cmd] {name} .. :arge :argedit {name} を引数リストに追加して編集します。重複のチェックはありません。引数リストにファイルを2回追加できます。:argded。これは、:argadd を使用してから :edit を使用するのと似ています (ただし、:edit は引数リストを変更しないため、引数リストポインタは変更されません)。ファイル名にスペースがある場合は、 "\" でエスケープする必要があります。[count] は :argadd と同様に使用されます。現在のファイルを 破棄 できない場合でも、{name} は引数リストに追加されますが、編集はされません。重複のチェックは行われません。++opt および +cmd も参照してください。
:[count]arga[dd] {name} .. :arga :argadd E479 :[count]arga[dd] E1156
{name} を引数リストに追加します。{name} が省略された場合は、現在のバッファ名を引数リストに追加します。[count] が省略された場合、{name} は引数リストの現在のエントリの直後に追加されます。それ以外の場合は、[count] 番目のファイルの後に追加されます。引数リストが "a b c" で、"b" が現在の引数の場合、これらのコマンドの結果は次のようになります。
コマンド 新しい引数リスト
:argadd x a [b] x c :0argadd x x a [b] c :1argadd x a x [b] c :$argadd x a [b] c x 最後のコマンドの後: :+2argadd y a [b] c x y 重複のチェックはありません。引数リストにファイルを2回追加できます。後で :argdedupe を使用して修正できます。
:argadd *.txt | argdedupe
現在編集中のファイルは変更されません。 注: このメソッドも使用できます。
:args ## x
これにより、"x" 項目が追加され、新しいリストがソートされます。
:argded[upe] :argded :argdedupe 引数リストから重複したファイル名を削除します。現在のファイルが重複している場合、現在のファイルは元のファイルインデックスに変更されます。
:argd[elete] {pattern} .. :argd :argdelete E480 E610 {pattern} に一致するファイルを引数リストから削除します。{pattern} はファイルパターンのように使用されます。file-pattern を参照してください。現在のエントリを削除するには、"%" を使用できます。このコマンドは、引数リストから削除されても、現在編集中のファイルを保持します。例
:argdel *.obj
:[range]argd[elete] [range] ファイルを引数リストから削除します。例
:10,$argdel
引数10以降を削除し、1〜9を保持します。
:$argd
最後のものだけを削除します。
:argd
:.argd
現在の引数を削除します。
:%argd
引数リストからすべてのファイルを削除します。範囲の最後の番号が高すぎる場合、最後の引数までが削除されます。
:argu :argument :[count]argu[ment] [count] [++opt] [+cmd] 引数リストの[count]番目のファイルを編集します。[count]が省略された場合は、現在のエントリが使用されます。変更が行われており、Vimが現在のバッファを破棄したくない場合は、失敗します。++opt+cmdも参照してください。
:[count]argu[ment]! [count] [++opt] [+cmd] 引数リストの[count]番目のファイルを編集し、現在のバッファへの変更を破棄します。[count]が省略された場合は、現在のエントリが使用されます。++opt+cmdも参照してください。
:[count]n[ext] [++opt] [+cmd] :n :ne :next ]a E165 E163 [count]個先のファイルを編集します。変更が行われており、Vimが現在のバッファを破棄したくない場合は、失敗します。++opt+cmdも参照してください。
:[count]n[ext]! [++opt] [+cmd] [count]個先のファイルを編集し、バッファへの変更を破棄します。++opt+cmdも参照してください。
:n[ext] [++opt] [+cmd] {arglist} :next_f
:args_fと同じです。
:n[ext]! [++opt] [+cmd] {arglist} :args_f!と同じです。
:[count]N[ext] [count] [++opt] [+cmd] :Next :N E164 引数リストの[count]個前のファイルを編集します。変更が行われており、Vimが現在のバッファを破棄したくない場合は、失敗します。++opt+cmdも参照してください。
:[count]N[ext]! [count] [++opt] [+cmd] 引数リストの[count]個前のファイルを編集します。バッファへの変更を破棄します。++opt+cmdも参照してください。
:[count]prev[ious] [count] [++opt] [+cmd] :prev :previous [a :Nextと同じです。++opt+cmdも参照してください。
:rew :rewind [A :rew[ind] [++opt] [+cmd] 引数リストの最初のファイルの編集を開始します。変更が行われており、Vimが現在のバッファを破棄したくない場合は、失敗します。++opt+cmdも参照してください。
:rew[ind]! [++opt] [+cmd] 引数リストの最初のファイルの編集を開始します。バッファへの変更を破棄します。++opt+cmdも参照してください。
:fir :first :fir[st][!] [++opt] [+cmd] ":rewind"の別の名前です。
:la :last ]A :la[st] [++opt] [+cmd] 引数リストの最後のファイルの編集を開始します。変更が行われており、Vimが現在のバッファを破棄したくない場合は、失敗します。++opt+cmdも参照してください。
:la[st]! [++opt] [+cmd] 引数リストの最後のファイルの編集を開始します。バッファへの変更を破棄します。++opt+cmdも参照してください。
:wn :wnext :[count]wn[ext] [++opt] 現在のファイルを書き込み、[count]個先のファイルの編集を開始します。++opt+cmdも参照してください。
:[count]wn[ext] [++opt] {file} 現在のファイルを{file}に書き込み、{file}が既に存在し、'writeany'オプションがオフでない限り、[count]個先のファイルの編集を開始します。++opt+cmdも参照してください。
:[count]wn[ext]! [++opt] {file} 現在のファイルを{file}に書き込み、[count]個先のファイルの編集を開始します。++opt+cmdも参照してください。
:[count]wN[ext][!] [++opt] [file] :wN :wNext :[count]wp[revious][!] [++opt] [file] :wp :wprevious :wnextと同じですが、次のファイルではなく前のファイルに進みます。
上記のコマンドの[count]はデフォルトで1です。一部のコマンドでは、2つのカウントを使用できます。最後のもの(一番右のもの)が使用されます。
[+cmd]引数がない場合、カーソルはそのファイルの最後に既知のカーソル位置に配置されます。'startofline'が設定されている場合は、カーソルは行の最初の空白でない位置に配置され、そうでない場合は最後に既知の列が使用されます。最後に既知のカーソル位置がない場合は、カーソルは最初の行(Exモードでは最後の行)に配置されます。
{arglist}
引数リストのワイルドカードは展開され、ファイル名はソートされます。したがって、コマンドvim *.cを使用してすべてのCファイルを編集できます。Vim内からコマンド:n *.cを実行すると同じです。
ファイル名を区切るには空白を使用します。ファイル名に空白またはタブを含めるには、その前にバックスラッシュを付けます。たとえば、単一のファイル "foo bar" を編集するには
:next foo\ bar
Unixおよび他のいくつかのシステムでは、バッククォートも使用できます。たとえば
:next `find . -name \\*.c -print`
findプログラムを実行する前にシェルによって "*.c" が展開されるのを防ぐために、アスタリスクの前のバックスラッシュが必要です。
arglist-position
引数リストがある場合、ウィンドウのタイトル(タイトルがあり、'title'がオンの場合)および "CTRL-G" コマンドで表示されるファイルメッセージで、編集中のファイルを確認できます。(4 of 11) のように表示されます。引数リストの現在の位置で実際にファイルを編集していない場合は、((4) of 11) となります。これは、引数リストの4番目の位置にいるが、引数リストの4番目のファイルを編集していないことを意味します。これは、":e file" を実行した場合に発生します。

LOCAL ARGUMENT LIST

:arglocal
:argl[ocal] グローバル引数リストのローカルコピーを作成します。別のファイルの編集を開始しません。
:argl[ocal][!] [++opt] [+cmd] {arglist} 現在のウィンドウにローカルな新しい引数リストを定義します。それ以外の場合は、:args_fのように機能します。
:argglobal
:argg[lobal] 現在のウィンドウにグローバル引数リストを使用します。別のファイルの編集を開始しません。
:argg[lobal][!] [++opt] [+cmd] {arglist} 現在のウィンドウにグローバル引数リストを使用します。:args_fのように、新しいグローバル引数リストを定義します。グローバル引数リストを使用するすべてのウィンドウには、この新しいリストが表示されます。
複数の引数リストが存在する可能性があります。それらはウィンドウ間で共有できます。共有されている場合、あるウィンドウで引数リストを変更すると、他のウィンドウでも変更されます。
ウィンドウが分割されると、新しいウィンドウは現在のウィンドウから引数リストを継承します。その後、2つのウィンドウはこのリストを共有しますが、どちらかが:arglocalまたは:argglobalを使用して別の引数リストを使用するまでは共有します。

USING THE ARGUMENT LIST

:argdo
:[range]argdo[!] {cmd} 引数リストの各ファイル、または[range]が指定されている場合は、その範囲内の引数に対してのみ{cmd}を実行します。これは次のように動作します
:rewind
:{cmd}
:next
:{cmd}
etc.
現在のファイルを破棄できず、[!]がない場合、コマンドは失敗します。1つのファイルでエラーが検出された場合、引数リストのそれ以降のファイルはアクセスされません。引数リストの最後のファイル(またはエラーが発生した場所)が現在のファイルになります。{cmd}には、複数のコマンドを連結するための'|'を含めることができます。{cmd}は引数リストを変更してはなりません。注:このコマンドの実行中、Syntax autocommandイベントは'eventignore'に追加することにより無効になります。これにより、各ファイルの編集が大幅に高速化されます。:windo:tabdo:bufdo:cdo:ldo:cfdo:lfdoも参照してください。
:args *.c
:argdo set ff=unix | update
これにより、'fileformat'オプションが "unix" に設定され、ファイルが変更された場合は書き込まれます。これは、すべての*.cファイルに対して実行されます。
:args *.[ch]
:argdo %s/\<my_foo\>/My_Foo/ge | update
これにより、すべての"*.c"ファイルと"*.h"ファイルで、"my_foo"という単語が"My_Foo"に変更されます。"my_foo"が使用されていないファイルのエラーを回避するために、":substitute"コマンドには "e"フラグが使用されます。":update"は、変更があった場合にのみファイルを書き込みます。

4. 書き込み writing save-file

注:'write'オプションがオフの場合、ファイルを書き込むことはできません。
:w :write E502 E503 E504 E505 E512 E514 E667 E949 :w[rite] [++opt] バッファ全体を現在のファイルに書き込みます。これがファイルへの変更を保存する通常の方法です。'readonly'が設定されている場合、または親ディレクトリが存在しない場合など、ファイルが書き込めない他の理由がある場合は失敗します(これを回避するには++pを使用してください)。++optについては++optを参照してください。ただし、++p、++bin、++nobin、++ff、および++encのみが有効です。
:w[rite]! [++opt] "'readonly'" が設定されている場合、または書き込みが拒否される他の理由がある場合に強制的に書き込むことを除いて、":write" と同様です。注:これにより、ファイルのパーミッションと所有権が変更され、(シンボリック)リンクが壊れる可能性があります。これを回避するには、'cpoptions'に'W'フラグを追加してください。
:[range]w[rite][!] [++opt] 指定された行を現在のファイルに書き込みます。ファイルにバッファ内のすべての行が含まれないため、これは通常とは異なります。
:w_f :write_f :[range]w[rite] [++opt] {file} {file}が既に存在し、'writeany'オプションがオフでない限り、指定された行を{file}に書き込みます。
:w!
:[range]w[rite]! [++opt] {file} 指定された行を{file}に書き込みます。既存のファイルを上書きします。
:w_a :write_a E494 :[range]w[rite][!] [++opt] >
Append the specified lines to the current file.
:[range]w[rite][!] [++opt] >> {file} 指定された行を{file}に追加します。'!'はファイルが存在しない場合でも書き込みを強制します。
:w_c :write_c :[range]w[rite] [++opt] !{cmd} [range]行を標準入力として{cmd}を実行します('!'の前のスペースに注意してください)。{cmd}は":!{cmd}"のように実行され、'!'はすべて前のコマンド:!に置き換えられます。
":w"コマンドのデフォルトの[range]はバッファ全体(1,$)です。バッファ全体を書き込むと、それは変更されたとはみなされなくなります。":w somefile"で別のファイルに書き込む場合は、'cpoptions'の "+" フラグによって異なります。含まれている場合、書き込みコマンドは'modified'フラグをリセットしますが、バッファ自体はファイルと異なる場合があります。
":w"でファイル名が指定された場合、それは代替ファイルになります。たとえば、書き込みが失敗した場合に、後で ":w #" で再試行したい場合に使用できます。これは、'cpoptions'オプションから 'A' フラグを削除することでオフにできます。
ここで 'fsync' オプションが重要になることに注意してください。このオプションが設定されていると、書き込みが遅くなる可能性があります (ただし、より安全になります)。
:sav :saveas :sav[eas][!] [++opt] {file} 現在のバッファを {file} という名前で保存し、現在のバッファのファイル名を {file} に設定します。以前の名前は代替ファイル名として使用されます。[!] は既存のファイルを上書きするために必要です。'filetype' が空の場合、ファイルが書き込まれる前に新しい名前でファイルタイプ検出が行われます。書き込みが成功すると、'readonly' がリセットされます。
:up :update :[range]up[date][!] [++opt] [>>] [file] ":write" と同様ですが、バッファが変更された場合にのみ書き込みを行います。

複数のバッファを使用した書き込み buffer-write

:wa :wall :wa[ll] 変更されたすべてのバッファを書き込みます。ファイル名がないバッファはエラーメッセージの原因になります。読み取り専用のバッファは書き込まれません。
:wa[ll]! 読み取り専用のバッファも含め、変更されたすべてのバッファを書き込みます。ファイル名がないバッファは書き込まれず、エラーメッセージの原因になります。
Vim は、(「!」が使用されていない限り) 他の場所で変更されたファイルを上書きしようとすると警告を表示します。 timestamp を参照してください。
backup E207 E506 E507 E508 E509 E510 'backup''writebackup' または 'patchmode' オプションがオンになっている間に (追記ではなく) 既存のファイルに書き込むと、元のファイルのバックアップが作成されます。ファイルはコピーされるか、名前が変更されます ('backupcopy' を参照)。ファイルが正常に書き込まれた後、'writebackup' オプションがオンで、'backup' オプションがオフの場合、バックアップファイルは削除されます。'patchmode' オプションがオンの場合、バックアップファイルの名前が変更される場合があります。
バックアップテーブル
'backup' 'writebackup' アクション
off off バックアップは作成されない off on 現在のファイルをバックアップし、その後削除する (デフォルト) on off 古いバックアップを削除し、現在のファイルをバックアップする on on 古いバックアップを削除し、現在のファイルをバックアップする
'backupskip' パターンが書き込まれるファイルの名前と一致する場合、バックアップファイルは作成されません。この場合、'backup' および 'writebackup' の値は無視されます。
'backup' オプションがオンの場合、古いバックアップファイル (新しいバックアップファイルと同じ名前) は削除されます。'backup' が設定されておらず、'writebackup' が設定されている場合、既存のバックアップファイルは削除されません。ファイルが書き込まれている間に作成されるバックアップファイルには、別の名前が付けられます。
一部のファイルシステムでは、クラッシュ時にバックアップと新しく書き込まれたファイルの両方が失われる可能性があります (存在する可能性はありますが、不正なデータが含まれている可能性があります)。その場合は、スワップファイルがディスクに同期されているため、回復を試してください。まだ存在する可能性があります。:recover
'backupdir' オプションで指定されたディレクトリは、バックアップファイルを配置するために使用されます。(デフォルト: 書き込まれたファイルと同じディレクトリ)。
バックアップが元のファイルのコピーである新しいファイルであるか、元のファイルの名前が変更されるかは、'backupcopy' オプションによって異なります。コピーが作成される場合と、ファイルの名前が変更される場合の詳細については、そこを参照してください。
バックアップファイルの作成に失敗した場合、書き込みは行われません。とにかく書き込みたい場合は、コマンドに「!」を追加します。
ファイルウォッチャー
バッファが書き込まれたときに動作するプログラム (inotify、entr、fswatch など) や、外部アプリケーションがファイルを編集するために Vim を実行する場合 (git など) に問題が発生し、これらのプログラムが元のファイルが変更されたことに気付かないと思われる場合は、'backupcopy' オプションの値を "yes" に切り替えることを検討してください。これにより、Vim は、これらのウォッチャープログラムが期待する同じファイルに、新しいファイルを作成することなく書き込むことができます (新しいファイルを作成すると、ファイルが変更されたことを検出できなくなります)。crontab も参照してください
書き込み権限
新しいファイルを作成する場合、権限は読み取り/書き込みになります。Unix の場合、マスクは 0o666 で、さらに umask が適用されます。読み取りのために読み込まれたファイルを書き込む場合、Vim は権限を保持しますが、s ビットをクリアします。
読み取り専用書き込み
'cpoptions' オプションに 'W' が含まれている場合、Vim は読み取り専用ファイルの上書きを拒否します。'W' が存在しない場合、システムが許可すれば (ディレクトリが書き込み可能である必要がある) ":w!" は読み取り専用ファイルを上書きします。
書き込み失敗
新しいファイルの書き込みに失敗した場合、変更内容と元のファイルの両方を失わないように注意する必要があります。バックアップファイルがなく、新しいファイルの書き込みに失敗した場合、すでに元のファイルを失っています。ファイルを書き出すまで Vim を終了しないでください。バックアップが作成された場合、(可能であれば) 元のファイルの位置に戻されます。Vim を終了し、行った変更を失った場合でも、元のファイルはほとんどの場合残っています。元のファイルの復元に失敗した場合、元のファイルを失ったことを示すエラーメッセージが表示されます。
DOS 形式の書き込み
'fileformat' が "dos" の場合、<CR><NL><EOL> に使用されます。これは Windows のデフォルトです。他のシステムでは、珍しい <EOL> が使用されたことを示すために、"[dos]" というメッセージが表示されます。Unix-format-write
'fileformat' が "unix" の場合、<NL><EOL> に使用されます。Windows では、"[unix]" というメッセージが表示されます。Mac-format-write
'fileformat' が "mac" の場合、<CR><EOL> に使用されます。 "[mac]" というメッセージが表示されます。
file-formats と、'fileformat' および 'fileformats' オプションも参照してください。
ACL
ACL はアクセス制御リストの略です。これは、ファイルのアクセス権を制御するための高度な方法です。新しい MS-Windows および Unix システムで使用されますが、ファイルシステムがそれをサポートしている場合に限ります。Vim はファイルの書き込み時に ACL 情報を保持しようとします。バックアップファイルには、元のファイルの ACL 情報が設定されます。ACL 情報は、ファイルが読み取り専用であるかどうかを (ファイルを開くときに) 確認するためにも使用されます。
xattr E1506 E1508 E1509 xattr は拡張属性の略です。これは、ファイルシステム内のファイルとともにメタデータを保存するための高度な方法です。使用されている実際のファイルシステムによって異なり、Vim は Linux システムでのみサポートしています。Vim は、ファイルの書き込み時に拡張属性情報を保持しようとします。バックアップファイルには、元のファイルの拡張属性が設定されます。
読み取り専用共有
MS-Windows がネットワーク上のドライブを共有する場合、読み取り専用としてマークできます。これは、ファイルの読み取り専用属性が存在しない場合でも、NT ネットワーク共有ドライブの ACL 設定でファイルへの書き込みが許可されている場合でも、ファイルに書き込めない可能性があることを意味します。Win32 プラットフォーム上の Vim は、読み取り専用のネットワークドライブを検出し、ファイルを読み取り専用としてマークします。 :write でオーバーライドすることはできません。
書き込みデバイス
ファイル名が実際にはデバイス名の場合、Vim はバックアップを作成しません (それは不可能です)。デバイスはすでに存在するため、「!」を使用する必要があります。 Unix の例
:w! /dev/lpt0
および MS-Windows
:w! lpt0
Unix では、名前が通常のファイルやディレクトリを参照していない場合、デバイスとして検出されます。FIFO または名前付きパイプも Vim にとってはデバイスのように見えます。MS-Windows の場合、デバイスはその名前で検出されます: CON CLOCK$ NUL PRN COMn n=1,2,3... etc LPTn n=1,2,3... etc 名前は大文字または小文字にすることができます。

5. 書き込みと終了 write-quit

:q :quit :q[uit] 現在のウィンドウを閉じます。これが最後の 編集ウィンドウ である場合は、Vim を終了します。変更が行われ、Vim が現在のバッファの 破棄 を拒否した場合、および引数リストの最後のファイルが編集されていない場合は、失敗します。他のタブページがあり、現在のタブページの最後のウィンドウを閉じると、現在のタブページが閉じられます タブページQuitPre 自動コマンドイベントをトリガーします。別のウィンドウを終了する場合は、CTRL-W_q を参照してください。
:conf[irm] q[uit] 終了しますが、変更が行われた場合、または引数リストの最後のファイルが編集されていない場合は、プロンプトを表示します。:confirm および 'confirm' を参照してください。
:q[uit]! 書き込みを行わずに終了します。現在のバッファに変更がある場合も同様です。バッファは、'hidden' が設定されている場合でもアンロードされます。これが最後のウィンドウで、変更された非表示のバッファがある場合、現在のバッファは破棄され、最初に変更された非表示のバッファが現在のバッファになります。常に終了するには ":qall!" を使用します。
:cq[uit] 書き込みを行わずに常に終了し、エラーコードを返します。:cq を参照してください。
:wq
:wq [++opt] 現在のファイルを書き込んでウィンドウを閉じます。これが最後の 編集ウィンドウ だった場合、Vim は終了します。ファイルが読み取り専用であるか、バッファに名前がない場合、書き込みは失敗します。引数リストの最後のファイルが編集されていない場合、終了は失敗します。
:wq! [++opt] 現在のファイルを書き込んでウィンドウを閉じます。これが最後の 編集ウィンドウ だった場合、Vim は終了します。現在のバッファに名前がない場合、書き込みは失敗します。
:wq [++opt] {file} {file} に書き込んでウィンドウを閉じます。これが最後の 編集ウィンドウ だった場合、Vim は終了します。引数リストの最後のファイルが編集されていない場合、終了は失敗します。
:wq! [++opt] {file} {file} に書き込んで現在のウィンドウを閉じます。これが最後の 編集ウィンドウ だった場合、Vim を終了します。
:[range]wq[!] [++opt] [file] 上記と同じですが、[range] 内の行のみを書き込みます。
:x :xit :[range]x[it][!] [++opt] [file] ":wq" と同様ですが、変更が行われた場合にのみ書き込みます。 'hidden' が設定されていて、ウィンドウが複数ある場合、現在のバッファは、ファイルの書き込み後に非表示になります。
:exi :exit :[range]exi[t][!] [++opt] [file] :xit と同じです。
ZZ
ZZ 変更されている場合は現在のファイルを書き込み、現在のウィンドウを閉じます (":x" と同じ)。現在のファイルに複数のウィンドウがある場合、現在のウィンドウのみが閉じられます。
ZQ
ZQ 変更を確認せずに終了します (":q!" と同じ)。

複数のウィンドウとバッファ window-exit

:qa :qall :qa[ll] 変更されたバッファがない場合に Vim を終了します (次の変更されたバッファへ移動するには ":bmod" を使用します)。'autowriteall' が設定されている場合、:wqall のように変更されたすべてのバッファが書き込まれます。
:conf[irm] qa[ll] Vim を終了します。変更されたバッファがある場合は、プロンプトを表示します。:confirm を参照してください。
:qa[ll]! Vim を終了します。バッファへの変更は失われます。:cquit も参照してください。これは同じ動作をしますが、ゼロ以外の値を返して終了します。
:quita :quitall :quita[ll][!] ":qall" と同じです。
:wqa[ll] [++opt] :wqa :wqall :xa :xall :xa[ll] 変更されたすべてのバッファを書き込み、Vim を終了します。ファイル名のないバッファ、読み取り専用のバッファ、またはその他の理由で書き込みできないバッファがある場合、Vim は終了しません。
:conf[irm] wqa[ll] [++opt] :conf[irm] xa[ll] 変更されたすべてのバッファを書き込み、Vim を終了します。読み取り専用のバッファやその他の理由で書き込みできないバッファがある場合は、プロンプトを表示します。:confirm を参照してください。
:wqa[ll]! [++opt] :xa[ll]! 読み取り専用のバッファであっても、変更されたすべてのバッファを書き込み、Vim を終了します。ファイル名のないバッファ、またはその他の理由で書き込みできないバッファがある場合、Vim は終了しません。

6. ダイアログ edit-dialogs

:confirm :conf :conf[irm] {command} {command} を実行し、操作の確認が必要な場合はダイアログを使用します。:edit:q:qa:w コマンド (読み取り専用設定を上書きする場合) や、未保存の変更によって失敗する可能性のある :only:buffer:bdelete などのコマンドで使用できます。
:confirm w foo
"foo" がすでに存在する場合、確認を求めます。
:confirm q
変更がある場合、確認を求めます。
:confirm qa
変更された未保存のバッファが存在する場合、それぞれのバッファを保存または破棄するように求められます。「すべて保存」または「すべて破棄」を選択することもできます。
常に ":confirm" を使用したい場合は、'confirm' オプションを設定してください。
:browse :bro E338 E614 E615 E616 :bro[wse] {command} {command} の引数に対して、ファイル選択ダイアログを開きます。現在、これは :e:w:wall:wq:wqall:x:xall:exit:view:sview:r:saveas:sp:mkexrc:mkvimrc:mksession:mkview:split:vsplit:tabe:tabnew:cfile:cgetfile:caddfile:lfile:lgetfile:laddfile:diffsplit:diffpatch:pedit:redir:source:update:visual:vsplit、および :qall'confirm' が設定されている場合に機能します。 注: Win32 GUI のみです。コンソールでは、FileExplorer の自動コマンドグループが存在する場合、`browse edit` が機能します。":browse" が不可能な場合、エラーメッセージが表示されます。{command} がブラウズをサポートしていない場合、{command} はダイアログなしで実行されます。":browse set" は :options のように機能します。":browse oldfiles" については、:oldfiles も参照してください。
構文は、いくつかの例で最もよく示されます。
:browse e $vim/foo
$vim/foo ディレクトリでブラウザを開き、選択したファイルを編集します。
:browse e
'browsedir' で指定されたディレクトリでブラウザを開き、選択したファイルを編集します。
:browse w
現在のバッファのディレクトリでブラウザを開き、デフォルトとして現在のバッファのファイル名を指定し、選択したファイル名でバッファを保存します。
:browse w C:/bar
C:/bar ディレクトリでブラウザを開き、デフォルトとして現在のバッファのファイル名を指定し、選択したファイル名でバッファを保存します。'browsedir' オプションも参照してください。ブラウズがサポートされていない Vim のバージョンでは、コマンドは変更されずに実行されます。
browsefilter
MS-Windows では、ブラウズダイアログで使用されるフィルターを変更できます。g:browsefilter または b:browsefilter 変数を設定することで、フィルターをグローバルまたはバッファローカルに変更できます。変数は "{filter label}\t{pattern};{pattern}\n" 形式の文字列に設定されます。ここで、"{filter label}" は「ファイルの種類」コンボボックスに表示されるテキストであり、{pattern} はファイル名をフィルターするパターンです。複数のパターンを';'で区切って指定できます。
たとえば、ダイアログに Vim ファイルのみを表示するには、次のコマンドを使用できます。
let g:browsefilter = "Vim scripts\t*.vim\nVim Startup Files\t*vimrc\n"
b:browsefilter 変数を設定することで、フィルター設定をバッファごとにオーバーライドできます。通常は、ファイルタイププラグインで b:browsefilter を設定し、ブラウズダイアログに現在編集しているファイルのタイプに関連するエントリを含めるようにします。欠点: これにより、異なるタイプのファイルの編集を開始するのが難しくなります。これを克服するために、Windows では「すべてのファイル(.)\t*\n」を、他のプラットフォームでは「すべてのファイル()\t\n」を最後のフィルターとして追加して、ユーザーが必要なファイルにアクセスできるようにすることができます。
Vim が実際に browsefilter をサポートしていない場合に browsefilter を設定しないようにするには、has("browsefilter") を使用できます。
if has("browsefilter")
   let g:browsefilter = "whatever"
endif

7. 現在のディレクトリ current-directory

:cd:tcd、および :lcd を使用して別のディレクトリに変更できます。これにより、ファイル名の前にディレクトリ名を入力する必要がなくなります。また、":!ls" や ":te ls" などの外部コマンドの実行にも違いが生じます。
カレントディレクトリには、グローバル、タブ、ウィンドウの 3 つの「スコープ」があります。ウィンドウローカルの作業ディレクトリは、タブローカルの作業ディレクトリよりも優先され、タブローカルの作業ディレクトリは、グローバル作業ディレクトリよりも優先されます。ローカル作業ディレクトリ (タブまたはウィンドウ) が存在しない場合、階層内の次の上位スコープが適用されます。
:cd E747 E472 :cd[!] 'cdhome' がオフの場合の非 Unix システム: 現在のディレクトリ名を表示します。それ以外の場合: 現在のディレクトリをホームディレクトリに変更します。ウィンドウローカルディレクトリをクリアします。すべてのシステムで現在のディレクトリを表示するには、:pwd を使用してください。
:cd[!] {path} 現在のディレクトリを {path} に変更します。{path} が相対パスの場合、'cdpath' にリストされているディレクトリで検索されます。ウィンドウローカルディレクトリをクリアします。すでに開いているファイルの意味は変更されません。これは、そのフルパス名が記憶されているためです。ただし、arglist のファイルは変更される可能性があります。MS-Windows では、アクティブなドライブも変更されます。現在のファイルのディレクトリに変更するには、次のようにします。
:cd %:h
:cd- E186 :cd[!] - (前の ":cd {path}" コマンドの前の) 前の現在のディレクトリに変更します。
:chd :chdir :chd[ir][!] [path] :cd と同じです。
:tc :tcd :tc[d][!] {path} :cd に似ていますが、現在のタブのディレクトリのみを設定します。現在のウィンドウもこのディレクトリを使用します。現在のディレクトリは、他のタブのウィンドウや、独自のウィンドウローカルディレクトリを持つ現在のタブのウィンドウでは変更されません。
:tcd-
:tc[d][!] - (前の ":tcd {path}" コマンドの前の) 前の現在のディレクトリに変更します。
:tch :tchdir :tch[dir][!] :tcd と同じです。
:lc :lcd :lc[d][!] {path} :cd に似ていますが、現在のウィンドウの現在のディレクトリのみを設定します。他のウィンドウまたはタブの現在のディレクトリは変更されません。
:lch :lchdir :lch[dir][!] :lcd と同じです。
:lcd-
:lc[d][!] - (前の ":lcd {path}" コマンドの前の) 前の現在のディレクトリに変更します。
:pw :pwd E187 :pw[d] 現在のディレクトリ名を表示します。getcwd() も参照してください。:pwd-verbose
'verbose' がゼロ以外の場合、:pwd は現在のディレクトリが設定されたスコープも表示します。例
" Set by :cd
:verbose pwd
[global] /path/to/current
" Set by :lcd
:verbose pwd
[window] /path/to/current
" Set by :tcd
:verbose pwd
[tabpage] /path/to/current
:lcd または :tcd コマンドが使用されていない限り、すべてのウィンドウは同じ現在のディレクトリを共有します。別のウィンドウにジャンプするコマンドを使用しても、現在のディレクトリは変更されません。
:lcdコマンドがウィンドウで使用された場合、指定されたディレクトリがそのウィンドウのカレントディレクトリになります。:lcdコマンドが使用されていないウィンドウは、グローバルまたはタブローカルのディレクトリに固定されます。別のウィンドウにジャンプすると、カレントディレクトリは最後に指定されたローカルカレントディレクトリに変更されます。何も指定されていない場合は、グローバルまたはタブローカルのディレクトリが使用されます。新しいウィンドウを作成すると、現在のウィンドウのローカルディレクトリを継承します。
タブを切り替える際も同様の動作が適用されます。現在のタブにローカルワーキングディレクトリがない場合は、グローバルワーキングディレクトリが使用されます。
:cdコマンドを使用すると、現在のウィンドウとタブはローカルカレントディレクトリを失い、今後はグローバルカレントディレクトリを使用します。:tcdコマンドを使用すると、現在のウィンドウのみがローカルワーキングディレクトリを失います。
:cdを使用した後は、ファイルの読み書きにフルパス名が使用されます。一部のネットワークファイルシステムでは、これにより問題が発生する可能性があります。フルパス名を使用すると、現在使用中のファイル名は同じファイルを参照し続けます。例:ファイルa:testとディレクトリa:vimがある場合、「:e test」「:cd vim」「:w」コマンドは、a:vim/testを書き込むのではなく、ファイルa:testを上書きします。ただし、「:w test」を実行すると、ファイルa:vim/testが書き込まれます。これは、新しいファイル名を指定し、「:cd」の前のファイル名を参照しなかったためです。

8. バイナリファイルの編集 edit-binary

Vimはテキストファイルを編集するために作られましたが、バイナリファイルを編集することも可能です。-b Vim引数(bはバイナリの意)を指定すると、VimはファイルI/Oをバイナリモードで実行し、バイナリファイルを編集するためのいくつかのオプションを設定します('binary'オン、'textwidth'を0に、'modeline'オフ、'expandtab'オフ)。'binary'オプションを設定すると、同じ効果が得られます。ファイルを読み込む前に、これを実行することを忘れないでください。
バイナリファイルを編集する際には、いくつかの注意点があります。
実行可能ファイルを編集する場合は、バイト数を変更してはいけません。テキストを変更するには、「R」または「r」コマンドのみを使用してください。「x」キーまたはバックスペースで文字を削除しないでください。
'textwidth'オプションを0に設定してください。そうしないと、行が予期せず2つに分割されます。
<EOL>が少ない場合、行は非常に長くなります。画面に収まらない行を編集したい場合は、'wrap'オプションをリセットしてください。この場合、水平スクロールが使用されます。行が長すぎる場合(limitsを参照)、その行を編集することはできません。ファイルを読み込む際に、行が分割されます。また、ファイルを読み込む際に「メモリ不足」エラーが発生する可能性もあります。
ファイルを読み込む前に、必ず'binary'オプションを設定してください。そうしないと、<CR><NL><NL>の両方が行末とみなされ、ファイルを書き込む際に<NL><CR><NL>に置き換えられます。
<Nul>文字は画面に^@と表示されます。「CTRL-V CTRL-@」または「CTRL-V 000」で入力できます。
ファイルに<NL>文字を挿入するには、行を分割します。バッファをファイルに書き込むと、<EOL>に対して<NL>が書き込まれます。
Vimは通常、ファイルの末尾に<EOL>がない場合は追加します。'binary'オプションを設定すると、これを防ぐことができます。最後の<EOL>を追加する場合は、'endofline'オプションを設定してください。また、このオプションの値を読み取って、最後の行に<EOL>があったかどうかを確認することもできます(テキストでは確認できません)。

9. 暗号化 encryption

:X E817 E818 E819 E820 暗号化されたファイルの編集のサポートは削除されました。https://github.com/neovim/neovim/issues/694 https://github.com/neovim/neovim/issues/701

10. タイムスタンプ timestamp timestamps

Vimは、編集を開始するときに、ファイルの更新タイムスタンプ、モード、およびサイズを記憶します。これは、(あなたが知らずに)同じファイルの2つの異なるバージョンを持つことを避けるために使用されます。
シェルコマンドが実行された後(:!cmd 中断 :read! K)、ウィンドウ内のすべてのバッファについて、タイムスタンプ、ファイルモード、ファイルサイズが比較されます。Vimは、変更されたファイルに対して、関連付けられたFileChangedShell自動コマンドを実行するか、警告を表示します。GUIでは、これはVimが入力フォーカスを取り戻したときに発生します。
E321 E462 Vimの外部でファイルが変更された場合にファイルを自動的にリロードしたい場合は、'autoread'オプションを設定してください。ただし、これはファイルを書き込む時点では機能せず、Vim内でファイルが変更されなかった場合にのみ機能します。ignore-timestamp
確認を求められたり、ファイルを自動的にリロードしたりしたくない場合は、以下を使用できます。
set buftype=nofile
または、シェルからgvimを起動する場合は、以下のようにします。
gvim file.log -c "set buftype=nofile"
FileChangedShell自動コマンドが定義されている場合、警告メッセージやプロンプトは表示されないことに注意してください。この処理は自動コマンドに期待されています。
ディレクトリ(例:netrw-browseを使用した場合)については警告はありません。ただし、新しいファイルの編集を開始し、それが後でディレクトリとして作成された場合は警告が表示されます。
Vimがファイルのタイムスタンプが変更されたことに気づき、ファイルがバッファで編集中であるが変更されていない場合、Vimはファイルの内容が等しいかどうかを確認します。これは、ファイルを再度読み込み(非表示バッファに読み込み、すぐに再度削除します)、テキストを比較することで行われます。テキストが等しい場合は、警告は表示されません。
警告が十分に表示されない場合は、次のコマンドを使用できます。
:checkt :checktime :checkt[ime] Vimの外部で変更されたバッファがあるかどうかを確認します。これにより、ファイルの2つのバージョンを作成してしまう場合にチェックして警告します。これが自動コマンド、「:global」コマンドから呼び出された場合、または入力されなかった場合、実際のチェックは、副作用(ファイルの再読み込み)が無害になるまで延期されます。ロードされた各バッファについて、関連付けられたファイルが変更されているかどうかがチェックされます。ファイルが変更された場合、Vimはアクションを実行します。バッファに変更がなく、'autoread'が設定されている場合、バッファはリロードされます。それ以外の場合は、ファイルをリロードするかどうかの選択肢が提供されます。ファイルが削除された場合はエラーメッセージが表示されます。以前に存在しなかったファイルが存在するようになった場合は、警告が表示されます。ファイルがチェックされると、タイムスタンプがリセットされ、再度警告が表示されることはありません。構文強調表示、マーク、差分ステータス、'fileencoding''fileformat'、および'binary'オプションは変更されません。これらもリロードするには、v:fcs_choiceを参照してください(例:コードフォーマットツールがファイルを変更した場合)。
:[N]checkt[ime] {filename} :[N]checkt[ime] [N] 特定のバッファのタイムスタンプをチェックします。バッファは名前、番号、またはパターンで指定できます。
E813 E814 選択した場合、Vimはバッファをリロードします。このバッファを含むウィンドウが表示されている場合、リロードはこのウィンドウのコンテキストで発生します。それ以外の場合は、ほとんどの自動コマンドが機能するように特別なウィンドウが使用されます。このウィンドウを閉じることはできません。他にもいくつかの制限が適用されます。現在のバッファの外では何も起こらないようにするのが最善です。例えば、ウィンドウローカルオプションを設定すると、間違ったウィンドウになる可能性があります。ウィンドウを分割し、そこで何かを実行して閉じるのはOKです(他の自動コマンドによる副作用がない場合)。関係のないウィンドウやバッファを閉じると、問題が発生します。
ファイルを書き込む前に、タイムスタンプがチェックされます(「!」が使用された場合を除く)。変更されている場合は、Vimは本当にファイルを上書きするかどうかを尋ねます。
警告: ファイルは読み込み後から変更されています!!! 本当に書き込みますか?(y/n)
「y」を押すと、Vimはファイルの書き込みを続行します。「n」を押すと、書き込みが中断されます。「:wq」または「ZZ」を使用した場合は、Vimは終了せず、再度ファイルを書き込む機会が与えられます。
このメッセージは通常、編集セッションの開始後に誰かがファイルに書き込んだことを意味します。これが別の人である場合は、おそらくファイルへの変更と他の人の変更をマージする必要があるかどうかを確認する必要があります。ファイルを別の名前で書き込み、差分を確認します(このためには「diff」プログラムを使用できます)。
別の編集セッションから、または別のコマンド(例:フィルターコマンド)で自分でファイルを変更した可能性もあります。その場合は、保持したいファイルのバージョンがわかります。
時間チェックの精度は、ファイルシステムによって異なります。Unixでは通常、秒未満です。古いファイルシステムやMS-Windowsでは、通常1秒です。秒未満のタイムスタンプチェックが利用可能かどうかを確認するには、has('nanotime')を使用します。
問題がないのにメッセージが表示される状況が1つあります。それは、Win32システムで夏時間開始日の場合です。Win32ライブラリには、Vimを時間のずれについて混乱させる何かがあります。この問題は翌日には解消されます。

11. ファイル検索 file-searching

ファイル検索は現在、'path''cdpath'、および'tags'オプション、finddir()findfile()に使用されています。他のコマンドはワイルドカードを使用しており、これは少し異なります。
3種類の検索があります。
1) 下向き検索: starstar
下方向検索では、ワイルドカード "*"、"**"、およびご使用のオペレーティングシステムでサポートされている可能性のあるその他のワイルドカードが使用されます。"*" と "**" は Vim 内部で処理されるため、すべてのオペレーティングシステムで動作します。なお、"**" は名前の先頭にある場合にのみ特別なワイルドカードとして機能します。
"*" の使い方は非常に簡単です。0 文字以上の文字に一致します。検索パターンでは ".*" となります。なお、"." はファイル検索には使用されません。
"**" はより高度です。
ディレクトリにのみ一致します。
デフォルトでは最大 30 階層のディレクトリに一致するため、ディレクトリツリー全体を検索するために使用できます。
一致する最大階層数は、"**" に数値を付加することで指定できます。したがって、'/usr/**2' は一致します。
/usr
/usr/include
/usr/include/sys
/usr/include/g++
/usr/lib
/usr/lib/X11
....
これは 3 階層になるため、'/usr/include/g++/std' には一致しません。許容される数値範囲は 0 ("**0" は削除されます) から 100 です。指定された数値が 0 未満の場合はデフォルトの 30 になり、100 より大きい場合は 100 が使用されます。システムにはパス長の制限 (通常 256 バイトまたは 1024 バイト) もあります。
"**" はパスの末尾にあるか、パス区切り文字または数値とパス区切り文字が続く場合にのみ使用できます。
"*" と "**" は任意の順序で組み合わせることができます。
/usr/**/sys/*
/usr/*tory/sys/**
/usr/**2/sys/*
2) 上方向検索: ここでは、ディレクトリを指定し、そのディレクトリツリーを上方向にファイル検索できます。上方向検索を制限するために、停止ディレクトリを指定できます。停止ディレクトリは、パス ( 'path' オプションの場合) またはファイル名 ( 'tags' オプションの場合) に ';' を付けて追加されます。複数の停止ディレクトリが必要な場合は、';' で区切ります。停止ディレクトリが不要な場合 ("ルートディレクトリまで上方向に検索する") は、';' だけを使用します。
/usr/include/sys;/usr
は以下を検索します
/usr/include/sys
/usr/include
/usr
相対パスを使用した場合、上方向検索は Vim の現在のディレクトリまたは現在のファイルのディレクトリ (相対パスが './' で始まり、'd' が 'cpoptions' に含まれていない場合) で開始されます。
Vim の現在のパスが /u/user_x/work/release で、以下を実行した場合
:set path=include;/u/user_x
その後、gf を使用してファイルを検索すると、ファイルは以下で検索されます。
/u/user_x/work/release/include
/u/user_x/work/include
/u/user_x/include
注: 'path' 設定に存在しないディレクトリが含まれている場合、Vim は存在しないディレクトリをスキップし、上方向検索を使用している場合は存在しないディレクトリの親ディレクトリも検索しません。
3) 上/下方向の組み合わせ検索: Vim の現在のパスが /u/user_x/work/release で、以下を実行した場合
set path=**;/u/user_x
その後、gf を使用してファイルを検索すると、ファイルは以下で検索されます。
/u/user_x/work/release/**
/u/user_x/work/**
/u/user_x/**
注意してください! これは多くの時間を消費する可能性があります。'/u/user_x/**' の検索には '/u/user_x/work/**' および '/u/user_x/work/release/**' が含まれるためです。したがって、'/u/user_x/work/release/**' は 3 回検索され、'/u/user_x/work/**' は 2 回検索されます。
上記の例では、パスを以下に設定することができます。
:set path=**,/u/user_x/**
これは以下を検索します
/u/user_x/work/release/**
/u/user_x/**
これは同じディレクトリを検索しますが、順序が異なります。
":find"、":sfind"、および ":tabfind" コマンドの補完は、URL を含む 'path' 項目、または深さ制限付きの二重アスタリスク (/usr/**2) または上方向検索 (;) 表記では現在動作しないことに注意してください。

12. 信頼できるファイル trust

'exrc' が有効になっている場合、Nvim はファイルシステム上にある任意のコードを実行します。悪意のあるコードの実行を防ぐために、"信頼できるファイル" のみが実行されます。:trust コマンドまたは vim.secure.read() 関数を使用して、ファイルを信頼済みまたは信頼されていないとしてマークできます。
:trust E5570 :trust [++deny] [++remove] [file]
信頼できるファイルを管理します。++ オプションがない場合、:trust は現在のバッファを、その内容のハッシュに基づいて信頼済みとしてマークします。信頼リストはディスクに保存され、Nvim は再起動後に再利用します。
[++deny] は、[file] (または [file] がない場合は現在のバッファ) を信頼されていないとしてマークします。これは実行されることはなく、'exrc' はそれを無視します。
[++remove] は、[file] (または [file] がない場合は現在のバッファ) を信頼リストから削除します。ファイルが 'exrc' または vim.secure.read() によって検出されると、ユーザーにファイルを信頼するか拒否するかを尋ねられます。
メイン
コマンドインデックス
クイックリファレンス