ゴール
37行目のようなものを、折りたたんで非表示にしたい。
必須プラグイン
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行表示となり、数を増やすことも可能。
折りたたまれたときの表示を変更する
標準の折りたたまれたときの表示形式が好きではない人は、以下を設定すると良い。
vim.opt.foldtext = "" 折りたたまれたときに、このように割と見慣れた表示になる。
設定全体
プラグインマネージャーは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:全ての折りたたみを開く