Neovimでバッファみたいにファイル操作できるoil.nvimの使い方

Neovimのファイルエクスプローラーのプラグインoil.nvimを紹介します。

oil.nvimとは

oil.nvimはちょっと変わったファイルエクスプローラーです。ファイル一覧のバッファを編集することで「作成・削除・リネーム・移動」ができます。

ファイル名を変えたりディレクトリを移動すると、LSP経由でimportのパスも置換してくれます。

インストール

READMEを参考に、各自のパッケージマネージャーでインストールします。

リポジトリ名だけのコピペ用
stevearc/oil.nvim
lazy.nvimの例
{
'stevearc/oil.nvim',
---@module 'oil'
---@type oil.SetupOpts
opts = {},
-- Optional dependencies
dependencies = { { "echasnovski/mini.icons", opts = {} } },
-- dependencies = { "nvim-tree/nvim-web-devicons" }, -- use if prefer nvim-web-devicons
}

アイコンを表示させたい人はmini.iconsnvim-web-deviconsのどちらかを入れておきましょう。
※この記事ではnvim-web-deviconsの方を入れています。

最低限の設定

setupを呼び出すだけで最低限の設定は終了です。カスタマイズは後で説明します。

require("oil").setup()

使い方

oil.nvimのファイルエクスプローラーを開く方法はいくつかあります。

  • :Oil
    • :Oil <path>で指定したディレクトリを開ける
    • :Oil --floatだとfloating windowで開ける
  • :e <path>
    • この挙動は設定でオフにできる
  • APIの呼び出し
    • require("oil").open(dir)
    • require("oil").open_float(dir)

ファイル操作

ファイルエクスプローラーを開いたら、あとはバッファを編集して保存するだけです。

次の動画はリネームの例です。history.jsというファイルをhoge.jsに変更しています。

バッファを保存すると、適用するファイル操作の確認画面が出ます。

同様にファイルの作成・削除・移動ができます。

キーマップ

ファイルの行でEnterを押すと、そのファイルを開きます。
ディレクトリの行でEnterを押すと、ファイルの一覧がそのディレクトリに切り替わります。
-を押すと親ディレクトリに切り替わります。

ここらへんの操作感はnetrwに近いです。

Ctrl+cで閉じます。

次の手順でファイルを別階層のディレクトリに移動できます。

  1. 行を切り取る(ddなど)
  2. ディレクトリを切り替える(Enter-
  3. 貼り付け(pなど)

Ctrl+pでプレビューもできます。

キーマップはデフォルトでいくつか定義されており、変更も可能です。詳しくは:h oil-actionsで確認してください。

LSP

LSPのファイルリネームにも対応しています。

たとえばTypeScriptでsrc/foo.tssrc/bar.tsにリネームすると、importのパスも変更されます。

import { baz } from "./foo"
import { baz } from "./bar"

次の動画が実際の例です。
リネーム後にLSPで編集されたファイルは、バッファとして開きます。

※LSPを立ち上げずにリネームすると、この機能は動きません。

カスタマイズ

ここからは筆者のカスタマイズを紹介します。

フルパスで開かれるのを防ぐ

ファイルの行でEnterを入力すると、そのファイルがフルパスで開かれるようです。

これを相対パスに変更するには次のように書きます(参考)。

vim.api.nvim_create_augroup("OilRelPathFix", {})
vim.api.nvim_create_autocmd("BufLeave", {
group = "OilRelPathFix",
pattern = "oil:///*",
callback = function()
vim.cmd("cd .")
end,
})

2種類のキーマップを設定

まずは:Oilをそのまま実行するキーマップを設定しました。

vim.keymap.set("n", "<Space>go", function()
require("oil").open()
end, { desc = "Oil current buffer's directory" })

上記は、「今開いているバッファのディレクトリ」が開きます。
これに対して、カレントディレクトリを開くキーマップも設定しました。

vim.keymap.set("n", "<Space>gO", function()
require("oil").open(".")
end, { desc = "Oil ." })

以上、oil.nvimの紹介でした。import文の書き換えをやってくれるので重宝しています。

ファイルツリーではない点に注意です。

初めてmmvを知った時に近い感動を覚えました。