Open6

neovimでperl開発 ー 2024年冬

kobakenkobaken

neovimでperlの開発をしている。
vscodeを使おうと10回くらい試して、vimに戻っている。
vim最高。

kobakenkobaken

使っているプラグイン

  • itchyny/lightline.vim
  • junegunn/vim-easy-align
    • コードフォーマットをする君。コードフォーマットをするなら、formatterを利用するのが良いと思うが、たまに自前で整形したい箇所が出た時に使ってる。
  • ibhagwan/fzf-lua
    • ファイルを fzfのインターフェイスで探せる。
    • <leader><leader> で.git配下のファイルを探せるように設定してる。
  • 補完関連
    • neovim/nvim-lspconfig
    • hrsh7th/nvim-cmp
    • hrsh7th/cmp-nvim-lsp
    • github/copilot.vim
      • copilotは補完の枠に収まらない感じはする
  • stevearc/oil.nvim
    • filer。fzfでファイルを探してるので、ファイルの削除やリネームなどの用途で使うことが多い。vimの操作でファイル操作できて面白い。
  • junegunn/goyo.vim
    • zenモード用。画面から余計な要素を除いてくれる。気分を変えたい時に使ってる。
  • markonm/traces.vim
    • 置換するとき便利
  • vim-perl/vim-perl

pluginの数が多くても私は使いこなせないので、
半年、1年経っても、使ってないプラグインは消して、今、生き残っているのがこのあたり。

kobakenkobaken

perl 専用の設定

  • vim-perlが、subroutine signatureのハイライトをいい感じにしてくれるように perl_sub_signatures = 1 を設定している
  • gf でファイルジャンプをいい感じにしてくれるように pathの設定を次のようにしている
    • https://github.com/kfly8/dotfiles/blob/main/config/nvim/ftplugin/perl.lua
    • perlインタプリタはmiseで管理, モジュールはcarmelかcartonで管理している。
    • carmelでインストールしたモジュールにファイルジャンプできるように、env PERL5OPT="-MCarmel::Setup" perl -e "print join \',\', @{\\$Carmel::MySetup::environment{inc}}" で設定したいパスを読み込んで、pathに追加しているのがおもしろポイント。
-- 関数: 外部コマンドを実行して結果を取得
local function exec_cmd(cmd)
  local handle = io.popen(cmd)
  if not handle then
    return nil
  end
  local result = handle:read("*a"):gsub("%s+$", "") -- 改行を削除
  handle:close()
  return result
end

-- Perl の archname を取得
local perl_arch = exec_cmd('perl -MConfig -e "print \\$Config{archname}"')
if not perl_arch then
  vim.notify("Failed to get Perl archname", vim.log.levels.ERROR)
  return
end

-- Perl のライブラリパスを取得
local perl_lib = exec_cmd('which perl | perl -pe "s!([^/]+)/bin/perl\n!\\$1/lib/\\$1!"')
if not perl_lib then
  vim.notify("Failed to get Perl library path", vim.log.levels.ERROR)
  return
end

local perl_lib_arch = perl_lib .. "/" .. perl_arch

-- Carmel 環境がある場合のpathを設定
if vim.fn.isdirectory(".carmel") == 1 then
  local perl_carmel = exec_cmd('env PERL5OPT="-MCarmel::Setup" perl -e "print join \',\', @{\\$Carmel::MySetup::environment{inc}}"')
  if perl_carmel then
    vim.opt_local.path:append(perl_carmel)
  else
    vim.notify("Failed to get Carmel environment paths", vim.log.levels.WARN)
  end
end

-- その他のpathを設定
local additional_paths = {
  "lib",
  "t/lib",
  "blib/lib",
  "blib/arch",
  "extlib",
  "local/lib/perl5",
  "local/lib/perl5/" .. perl_arch,
  perl_lib,
  perl_lib_arch,
  "./",
}

vim.opt_local.path:append(table.concat(additional_paths, ","))
kobakenkobaken

その他、雑感

決まりきったことを書くならcopilotの方が編集スピードが早い。
copilotが補完しやすいようにコードを書くことを意識しないとなーと思ってる。
例えば、テストケースだけを書いたテキストをコピーして、それを元にテストコードを書いてもらうなど。

改めて、まとめてみると、手で編集するためのプラグインは減って、コードを移動したり、補完したりするプラグインの方を重視するようになったんだなーと感じた。