🎅

今年のVim関係とそれ以外も含めた活動での結果とエッセンス

2020/12/18に公開

この記事はVim Advent Calendar 2020の18日目の記事です。

今年のVim活動の総括

何を書こうか悩みましたが、2020年のVim関係の活動をまとめてそこから何か抽出しよう、と考えました。

今年のVim関係だけどVimじゃない活動の総括

それ以外にも関係する活動が多少あったので、それも合わせて書きます。

活動内容

詳細

vim-efm-langserver-settings

efm-langserverの「lintツールをlanguage serverにしてしまう」という汎用性の良さと、vim-lsp-settingsによるlsp という(そのころはまだ敷居が高かった)ものの簡便化のよさに感激して作りました。
(どちらも作者はmattnさん)

vim-lsp-settingsを真似てツールが使えるようなってさえいれば、zero configで利用できるようにしたのがポイント。

Vim プラグインとしての工夫: vim-efm-langserver-settings

プラグインしては、導入するだけで動作する、ale/coc/vim-lspに対応というのがあります。
おかげか、自分的には利用者が多いプラグイン(の様子)。

複数のプラグインへの設定追加には、

after
 + plugin
   + ale
   + coc
   + lsp

という箇所へファイルを入れることで、各プラグインがロードされたら合せてロードされるVimの機能、after directoryというものを使っています。

これは自分で入れるプラグインの追加設定をする場合にも有効なので(ex ~/vimfile/after以下などに自分で設定を書いたファイルを入れる)、覚えて損はないです。

lightline-lsp

小物プラグイン。
vim-lspから(一部非公開の関数を使って)lspの状態を取得し、lightlineに表示するためのコンポーネントを定義するプラグイン。

maximbaz/lightline-aleというものを元に作成、あまり特別なことはしていないので、キャプチャを載せるにとどめます。

lightline-lsp : Image from Gyazo

efm-langserverとその左の状態インジケータがそれです。

vim-fg

検索補助プラグイン。
yegappan/grepからインスパイアされたもので、非同期でgrep/pt/agほかの実行をハンドリングして、結果をquickfixへ出力します。

上のでも期待した動きはしますが、自分の環境とうまく合わないなどもあったので最終的には自作することになりました。

Vim プラグインとしての工夫: vim-fg

非同期に外部プロセスをハンドリングするのにvim-jp/vital.vimそしてlambdalisue/vital-Whiskyによる
Job(vim/neovimのjobの抽象化)[1]とPromise[2]を利用しています。

また、このプラグインも上の各種grepperを動かすための設定を抱えています。そしてその設定はtomlで書かれていますが、これもvitalのライブラリとそれによる設定ファイル同梱機能が活躍(一部予定)。

まだまだ作りかけですが、通常生活では満足する程度には動作します。
いつか、この設定部分を独立したライブラリにしたいのですね。

asdf-vim

これについては別記事を参照のこと。

vital-codec Math.Fraction

今後こうしたいなー、というプラグインの構想があるのだが詳細を説明するとなると長いので省略します。 とはいえ、ほかの人の作ったものが開発停止になり、そのうち自分用にforkするだろうというものですが。
ただ、その中で、「分数をうまく扱いたい」というのが出てきました。

そういう機能なのでvitalの自分モジュールとして作成することにしました。

プログラミングでの、分数・有理数(Rational, Fraction)の扱いについてはいろいろあります。今回はPythonのfractionsを参照して作成しました。
またその動作を考えると、文字からの数値への変換とその桁が十分な精度である必要があります。これについてはvital.vimのData.BigNum[3][4]が使えるので、これを利用しています。

Vim プラグインとしての工夫: vital-codec Math.Fraction

実はそこまでのことはしていないので、これ自体はvitalのモジュールを作る例としてよい例になるのではないかと思っています。vital-codec/Fraction.txt at master · tsuyoshicho/vital-codec
ですので、小さめのライブラリを作りたい、とかライブラリに切り出したいと考えている人が作業する際の参考になれば幸いです。

一応の工夫として以下があります。

  • モジュールが生成するオブジェクトに識別子を与えて判定可能にしている。(is_Rational)
  • テスト作成とエラーハンドリング(最大のものはzero divid関係)をがんばったので、エラー処理やエラーのテストの例としても悪くない。
  • 生成するRationalオブジェクトでadd/sub/mul/divなどをメソッドとして持ち、メソッドチェインできるようになっている。
  • また、ほぼ同じ処理をクラスのメソッドとしても持っており、そこは数値(整数)、文字列(整数)、BigNum、Rationalを入れて処理もできるようにしてある。

などがあります。たとえvitalのモジュールにしないにしても、Vim scriptでオブジェクトとかそのための記述方法の参考にはなるかと。

まとめ

当初は記事のネタもなく、「今年は大したことしてないなー」と思ったものだが、案外活動しているようでした。
これからもいろいろと頑張りたいと思います。

脚注
  1. vital-Whisky/Job.txt at master · lambdalisue/vital-Whisky ↩︎

  2. vital.vim/Promise.txt at master · vim-jp/vital.vim ↩︎

  3. Vimで任意精度整数演算ができるライブラリを作った - チューリング不完全 ↩︎

  4. vital.vim/BigNum.txt at master · vim-jp/vital.vim ↩︎

Discussion