← Vim研究所

Neovimのoil.nvimの使い方 :wで改名・移動・削除を確定する

2026-10-26 公開 ・

oil.nvimは、ディレクトリの中身を1行1ファイルのバッファとして開くNeovimのプラグインです。行を書き換えて:wすると、その差分がそのまま改名・移動・削除になります。どのファイラーを選ぶかはNeovimのファイラー比較で扱ったので、この記事はoil.nvimを選んだ後の使い方に絞ります。

見た目は普通のバッファでも、:wの先にあるのはファイルシステムです。どこまでがバッファの編集で、どこからがディスクへの書き込みなのか。その境目を、確認画面の中身・確定した後のu・名前の衝突の3点を中心に実機で確かめました。

検証環境:NVIM v0.12.4(macOS)、oil.nvimはvim.pack.addで入れた2026-10-11のコミットd3733d9(git describeではstable-9-gd3733d9)。一時ディレクトリにHOMEとXDG_*を向けたNeovimをtmuxの中で動かし、ファイル操作の前後をlsとfindで突き合わせました。確認画面とエラーは実際の表示です。LSP連携(lsp_file_methods)とSSH越しの操作(oil-ssh://)は試していません。

目次(9項目)
やりたいことoilバッファでの操作
上の階層へ-
開く・入るEnter
改名行を書き換えて:w
移動ddで切り取り、別の階層でpして:w
複製yyでヤンク、pして:w
作成新しい行を書いて:w(末尾に/でディレクトリ)
削除ddして:w
隠しファイルg.で表示を切り替え

oil.nvimは何をするプラグインか

Neovimの標準の一覧は、ファイルを選んで開くためのものです。改名や削除は専用のキーに割り当てられていて、netrwでファイルをコピー・移動するときもマークを付けてからmcやmmを押す流れになります。0.12からは標準の一覧そのものがnetrwから別物に変わりつつあり、その経緯はNeovimの標準ファイラがnetrwからdirへにまとめました。

oil.nvimには、ファイル操作のための専用キーがほとんどありません。cwで名前を変え、ddで消し、oで行を足す。いつもの編集で一覧を目的の形に書き換え、:wで「この形にしてくれ」と頼む仕組みです。開いたバッファの中身をgetline()で見ると、その仕掛けが分かります。

:echo getline(1, "$")
['/002 docs/', '/004 src/', '/003 README.md']

画面にはdocs/としか出ていませんが、行の頭に/002のような番号が隠れています。oilはこの番号で「どの行がどのファイルか」を覚えていて、番号が同じまま名前が変われば改名、番号ごと別のディレクトリのバッファに現れれば移動と判定します。開いた直後のカーソルが6桁目にあるのは、この番号を飛ばしているからです。&filetypeはoil、&buftypeはacwriteで、:wはファイルへの書き出しではなくoilの処理に渡されます。

入れ方と開き方

Neovim 0.12なら、標準のvim.packで入れられます。READMEの動作要件はNeovim 0.10以降です。

-- init.lua
vim.pack.add({ 'https://github.com/stevearc/oil.nvim' })
require('oil').setup({})

初回の起動でThese plugins will be installed:とProceed? [Y]es, (N)o, (A)lways:が出るのでyで入ります。設定項目default_file_explorerが既定でtrueなので、nvim .で開くとnetrwではなくoilの一覧が出ました。バッファ名はoil:///で始まる絶対パスです。

一覧の中では-で上の階層、Enterでファイルを開くかディレクトリに入ります。ここで1つ引っかかったのは、ファイルを開いた後のバッファで-を押しても何も起きないことです。oilのキーはoilのバッファの中だけで効きます。ファイルから一覧へ戻るのは:Oilで、引数を省くとそのファイルのあるディレクトリが開き、カーソルはそのファイルの行に乗っていました。READMEもvim.keymap.set("n", "-", "<CMD>Oil<CR>")を例に挙げているので、-を全体に割り当てておくと行き来が1つのキーになります。そのほかのキーは一覧の中でg?を押すと出ます。

改名・作成・削除は行を書き換えて:w

README.mdの行でCを押してNOTES.mdと打ち、:wすると確認画面が出ます。

MOVE README.md -> NOTES.md
           [Y]es    [N]o

改名は「同じディレクトリの中での移動」として扱われ、確認画面にRENAMEという語は出ません。yで確定すると、ディスク上の名前が変わります。

作成は行を足すだけです。docs/の一覧で3行を足して:wしました。

archive/
memo.txt
img/logo.txt
CREATE docs/archive/
CREATE docs/memo.txt
CREATE docs/img/
CREATE docs/img/logo.txt
           [Y]es    [N]o

末尾が/の行はディレクトリになります。img/logo.txtのように途中に/を含めると、間のディレクトリも一緒に作られます。削除は行をddして:wで、DELETE docs/memo.txtと出ました。

確認画面でnを押した場合、ディスクには何も起きず、バッファの[+]も残ります。編集は捨てられずに保留されるので、直してからもう一度:wすれば済みます。

名前が衝突したとき

同じディレクトリの一覧で、note.mdを既にあるNOTES.mdに書き換えて:wすると、確認画面の前で止まりました。

Error in BufWriteCmd Autocommands for "oil://*":
Error parsing oil buffers

重なった行にはDuplicate filenameという診断が付き、ステータスラインにE:1が出ます。ディスクには何も起きていません。

この検査はバッファに見えている行どうしを比べるだけです。隠しファイルは既定で一覧に出ないので、そこに重ねると話が変わります。中身の入った.hiddenがある状態で、visible.txtの行を.hiddenに書き換えて:wしました。

MOVE visible.txt -> .hidden
           [Y]es    [N]o

エラーは出ず、yで確定すると.hiddenの中身はvisible.txtのものに置き換わっていました。元の中身は残っていません。移動の実体はOSのrenameで、行き先にファイルがあれば黙って上書きします。新しい行として.hiddenを足した場合はCREATE .hiddenが出たものの、既存の中身はそのまま残りました。作成は追記モードで開くだけなので壊さない、という違いです。隠しファイルのあるディレクトリで改名するときは、先にg.で全部を見せておくと安全です。

開いているバッファの名前を変えたときの扱いも見ました。未保存の変更が無いバッファは、改名すると:lsの名前も新しいほうに置き換わりました。a.txtに未保存の変更を残したままalpha.txtに改名すると、新しい名前のバッファに変更が引き継がれる一方で、古いa.txtのバッファも[+]付きで残りました。古いほうに切り替えるとE211: File "src/a.txt" no longer availableと出て、そこで:wすると"src/a.txt" [New]として書き出され、改名したはずのファイルが復活します。改名の前に開いているファイルを保存しておくのが確実です。

移動と複製はdd/pとyy/pで

ディレクトリをまたぐ操作は、レジスタを経由します。親の一覧でNOTES.mdをddし、保存しないままEnterでsrc/に入ってp、そこで:wしました。

MOVE NOTES.md -> src/NOTES.md
           [Y]es    [N]o

確定後にfindで見ると、ファイルはsrc/の下に移っていました。複製はddをyyに変えるだけで、docs/に貼るとCOPY src/NOTES.md -> docs/NOTES.mdになります。ddは「元の行が消えて別の場所に現れた」、yyは「元の行が残ったまま別の場所にも現れた」なので、隠れた番号の動きから移動と複製を見分けているわけです。

ここで普通のバッファと違うのは、未保存のまま別のディレクトリへ移れる点です。親の一覧は[+]のまま裏に残り、:wは開いているすべてのoilバッファの変更をまとめて1つの確認画面に出します。裏に変更が残ったまま:qすると、次のように止められました(パスは省略)。

E162: No write since last change for buffer "oil:///…/work/src/"

:wの確認画面とskip_confirm_for_simple_edits

確認画面に出た操作の種類は、今回の検証でMOVE・COPY・CREATE・DELETEに加えて、ゴミ箱を使う設定にしたときのTRASHとRESTOREの6つでした。毎回yを押すのが手間なら、skip_confirm_for_simple_edits = trueで単純な操作だけ確認を省けます。ヘルプには、削除を含まない・別アダプタ(ローカルとSSHなど)をまたがない・移動か複製が1件まで・作成が5件まで、という条件が書かれています。境目をそれぞれ打って確かめました。

操作確認画面
改名1件出ない
改名2件出る
作成5件出ない
作成6件出る
削除1件出る

削除は1件でも必ず確認が出るので、ddの押し間違いがそのまま消えることはありません。一方、改名1件は確認なしで確定します。次の節のとおり確定後のuは効かないので、この設定を入れるなら改名の打ち間違いは自分で名前を戻すことになります。

確定した後のuは何を戻すのか

:wする前のuは普通に効きます。行を書き換えた直後にuを押すと1 change; before #2と出て元の名前に戻りました。

確定した後は違います。README.mdをNOTES.mdに改名してyした直後にuを押すと、表示はNOTES.mdのまま、メッセージはAlready at oldest changeでした。ディスクが戻らないのはもちろん、バッファの表示すら戻りません。このまま:wしても変更が無いので何も起きませんでした。

理由はoilのソースにあります。確定の後、oilはディレクトリを読み直して一覧を描き直し、そのときundolevelsを一時的に-1にして取り消しの履歴を捨てています(lua/oil/view.luaのコメントは「Undo should not return to a blank buffer」)。描き直す前の空の状態にuで戻れてしまうのを避けるためで、副作用として確定前の編集にも戻れなくなります。確定した操作を取り消したいときは、逆の操作をもう一度書いて:wするしかありません。

ゴミ箱と隠しファイルの設定

require('oil').setup({
  delete_to_trash = true,
  view_options = { show_hidden = false }, -- 既定値。g. で切り替え
})

delete_to_trash = trueにすると、確認画面の語がDELETEからTRASH src/c5に変わりました。確定後、ファイルは$HOME/.Trashの下に移っていました。今回はHOMEを一時ディレクトリに向けていたのでその下の.Trashに入りましたが、macOS用の処理(lua/oil/adapters/trash/mac.lua)はホームディレクトリ直下の.Trashへ移す作りなので、普段の環境ならFinderのゴミ箱と同じ~/.Trashです。Finderの「戻す」が効くかは試していません。

戻すのはoilの中でできます。一覧でg\を押すとoil-trash:///というバッファに切り替わり、ゴミ箱の中身が並びます。そこでddし、もう一度g\で元のディレクトリに戻ってp、:wするとRESTORE src/c5と出て、ファイルが元の場所に戻りました。

隠しファイルはg.で表示を切り替えます。押すと.hiddenと、親を指す../の行が現れ、もう一度押すと消えました。改名の節で見た上書きを避けるという意味では、普段からshow_hidden = trueにしておく選択もあります。

使ってみて

確定した後のuで元に戻せると思い込んでいて、検証の途中で改名を戻そうとしたらAlready at oldest changeと言われて手が止まりました。もう1つ肝を冷やしたのが隠しファイルへの上書きで、確認画面にはMOVEとしか出ないので、行き先に見えないファイルがあることにyを押すまで気づけませんでした。テスト用の空ファイルだったから笑い話で済みましたが、.envのような名前だったらと思うと、改名の前にg.を押す癖がつきました。

まとめ

oil.nvimでは、一覧を書き換えている間はただのバッファで、:wして確認画面でyを押した瞬間にファイルシステムが変わります。確定前ならuもnも効き、確定後はuが何も戻さないので、逆の操作を書き直すしかありません。

改名はMOVE、別の階層へのdd/pは移動、yy/pは複製として確認画面に出ます。名前の重複は見えている行どうしでしか検査されないので、隠しファイルや開いたままのバッファが絡むときだけは一段慎重に扱ってください。netrwやほかのファイラーとの比較から読み直したいときはファイラー比較の記事に戻れます。

関連記事

← Vim研究所 トップへ戻る