エンジニアを目指す初学者に向けて、わかりやすく解説したブログです。

【Neovim】VSCodeのような折りたたみ機能を設定する

ゴール

37行目のようなものを、折りたたんで非表示にしたい。

Image in a image block
Image in a image block

必須プラグイン

nvim-treesitterが必須プラグインである。

逆に言えば、折りたたみ機能専用のプラグインなどは必要ない。

Vim標準の構文解析では、言語構造を完全に理解することはできないため
以下のような役割分担で使うと良い。

  • 折りたたみの開始と終了の解析: nvim-treesitterプラグイン
  • 折りたたみの実行など:Vim標準の折りたたみ機能

設定方法

nvim-treesitterプラグインを入れた状態で、以下の設定を行うことができればOK。

vim.opt.foldmethod = "expr"
vim.opt.foldexpr = "v:lua.vim.treesitter.foldexpr()"
vim.opt.foldlevel = 99

foldmethod, foldexpr

これは折りたたみ境界の計算方法を決めるものである。

exprは、foldレベルを計算式(expression)の評価結果から決めることを表していて foldexprと併用することでその計算式を指定できる。

今回の場合は、 foldexprにtreesitterの折りたたみレベル計算関数を当てはめているので
「treesitterが計算した折りたたみレベルで折りたたみを作成する」という設定にしている。

foldlevel

これは初期状態の折りたたみレベルを指定するもの。

0を指定すると「全てが折りたたまれた状態」になるので、十分大きい値である 99を指定することで
「初期状態では何も折りたたまれていない」という状況を作る。

補足オプション(任意)

左側に折りたたみ可能であることの目印をつける

標準では、どこで折りたたみができるのかがわかりにくい。

そのため、目印が欲しい場合は以下を設定すると良い。

vim.opt.foldcolumn = "1"

このように一番左側に折りたたみレベルが表示される。

設定値が 1の場合は1行表示となり、数を増やすことも可能。

Image in a image block

折りたたまれたときの表示を変更する

標準の折りたたまれたときの表示形式が好きではない人は、以下を設定すると良い。

vim.opt.foldtext = ""

折りたたまれたときに、このように割と見慣れた表示になる。

Image in a image block

設定全体

プラグインマネージャーはlazy.nvimを使用している前提。

return {
  "nvim-treesitter/nvim-treesitter",
  build = ":TSUpdate",
  branch = "main",
  lazy = false,
  config = function()
    vim.opt.foldmethod = "expr"
    vim.opt.foldexpr = "v:lua.vim.treesitter.foldexpr()"
    vim.opt.foldlevel = 99

    -- mainブランチの新しいAPIを使用
    local ts = require("nvim-treesitter")

    -- インストール・ハイライト対象の言語リスト
    local languages = {
      "lua",
      "typescript",
      "javascript",
      "vim",
      "tsx",
      "vue",
      "json",
      "astro",
      "html",
      "css",
      "scss",
      "dockerfile",
    }

    -- パーサーを非同期でインストール
    ts.install(languages)

    -- 指定したファイルタイプでTreesitterハイライトを有効化
    vim.api.nvim_create_autocmd("FileType", {
      pattern = languages,
      callback = function() vim.treesitter.start() end,
    })
  end,
}

覚えておきたいコマンド

最低限以下のコマンドを覚えておけば、折りたたみを不自由なく使いこなせるだろう。

もっと他の細かいコマンドを知りたい場合はヘルプ :h foldを参照。

  • zo:折りたたみを開く
  • zc:折りたたみを閉じる
  • za:折りたたみの開く・閉じるをトグルする
  • zM:全ての折りたたみを閉じる
  • zR:全ての折りたたみを開く