Panda Noir

JavaScript の限界を究めるブログでした。最近はいろんな分野を幅広めに書いてます。

vue の SFC 内でうまくコメントアウトプラグインを動かしたい vim + mini.comment 編

(vim + mini.comment 編と書いたが、別に他パターンを書く予定はない)

割と手間取ったのでメモとして残しておきます。他の人の参考にもなりそうなので

結構無理やりな方法を取ったので、もっとスマートなやり方がありそうですが…

ポイント: hooks.pre で filetype を切り替える + vue の commentstring を設定する

こんな感じの基本方針のもと実装しました。

  1. コメントアウト処理の直前に filetype をカーソル行のものに変更
  2. コメントアウト処理が走る
  3. 処理が終わったらもとに戻す

以下がコードです (パッケージマネージャーは packer.nvim)

  use 'Shougo/context_filetype.vim'
  use {
    'echasnovski/mini.comment',
    config = function()
      require 'mini.comment'.setup {
        hooks = {
          pre = function()
            -- context_filetype プラグインを使って、カーソル行の filetype を取得している。
            vim.cmd('noa setfiletype ' .. vim.fn['context_filetype#get_filetypes']()[1])
          end,
          post = function()
            -- コメントアウト処理が終わったので元に戻す
            vim.cmd 'filetype detect'
          end
        }
      }
    end
  }

ポイントは noa setfiletype です。noa なしで setfiletype としてしまうと、LSP が起動してしまいます。LSP が動くと余計なシンタックスエラーが表示されてウザったいので noa をつけて不要な autocmd が動かないようにしてます。

ただ、これでは不十分です。実は mini.comment はそのままだと vue テンプレートのコメントアウトができません(多分。あまりよく調べてない)。そこで、自力で commentstring を設定する必要があります

  vim.api.nvim_create_autocmd({ 'BufRead', 'BufNewFile' }, {
    pattern = '*.vue',
    command = 'setlocal commentstring=<!--%s-->'
  })

これでコメントアウトできるようになります