Perl Navigatorについて
この記事は、Perl Advent Calendar 2022 の24日目の記事です。昨日は、@tecklさんの「Perlのちょっとしたテキスト処理で生活を豊かにする」でした。
大雪の降っている地域のみなさんは無事でしょうか。ホワイトクリスマスだやったー!とか言ってるレベルじゃない大雪の地域もあるみたいなので油断しないでみんな生きていこうな!という気持ちで私はいます。とはいえ、この記事をのんびり読めているということはまったく無事なのだろうと思いますが、普段雪なんて降らない地域にも降ってるみたいなので、今年も残りあとわずか、みんないろいろあれこれあっただろうけど、無事に楽しくあたたかくハッキーにやりきりましょうよ!やくそくだぞ😉
Perl Navigator
さて、私は現在、お仕事ではPerlを書いていませんが、この個人ブログをちょろちょろメンテナンスするためにときどきPerlを書いています。WSL2でローカル開発をして本番サーバにデプロイするという環境で、コードの編集にはもっぱら VS Code を利用しています。長年 notepad++ と Vim の二刀流でやってきたのですが、いまでは VS Code 一本になってしまいました。VS Codeはここ数年で目覚ましく普及しているので利用しているという人も多いかと思います。
そんなVS Code で Perlを書くなら必ず入れたい拡張機能、それが Perl Navigator です。Perl Navigatorは文法チェックをはじめとして自動補完や定義元ジャンプなどプログラミングの生産性を爆上げするインテリジェントな機能を提供してくれます。しかも、VS Codeの拡張機能としてインストールするとサクッと適用されるのです。ctagのためにスクリプトを実行したりする手間は必要ありません。Perl NavigatorはLanguage Server Protocol実装なので、VS Code以外にもEmacsやVimなどでも利用できます。とはいえVS Codeではとりわけ簡単に導入できるのでぜひ試して欲しいです。
https://marketplace.visualstudio.com/items?itemName=bscan.perlnavigator
そんなPerl Navigatorについて、ここから詳細を語りたいところですが、それは本日 発売の WEB+DB PRESS vol.132 をご覧ください。Perl Hackers Hub で「コーディングを楽にするPerl Navigator ─ 便利機能をエディタに簡単導入!」という記事を書かせて頂きました。Perl Navigatorの機能を網羅的に紹介しつつ、細かい設定の勘所についても触れています。これでみんな、Perlのモダンな編集環境を手に入れるんだ!という気持ちを全力でぶつけています。
見出しは以下のようになっています。
- 簡単で便利なPerl Navigator
- サポート範囲が広いPerl Navigator
- Perl Navigatorのインストール
- Perl Navigatorの便利機能
- 文法チェック
- 変数や関数の定義元へのジャンプ
- 打鍵数と誤入力を削減する自動補完
- オブジェクトや関数などの情報表示
- Perlモジュールと連携した便利機能
- Perl::Criticで品質検査
- Perl::Tidyで整形処理
- App::perlimportsでモジュールの読み込みを自動整備
- Perl Navigatorのカスタマイズ
- 任意のPerlを利用する設定
- ライブラリパスの設定
- 連携モジュールで個別設定
もともとこのブログや Twitter で Perl Navigator についてあれがわからないとかこれが悩ましいなどと書いていたところに、Perl Hackers Hubで記事書きませんか、とお声がけいただきました。光栄です。@__papix__++。当時はPerl Navigatorをインストールしてみてはいるもののあまり使いこなしていなかったので記事にできるか不安がありましたが、せっかくの機会なので勉強しがてら書いてみようと受けることにしました。
実は原稿を一通り書き上げて修正作業に入る頃に家族でコロナに罹ってピンチになったり、編集校正後のタイミングでPerl Navigatorに新機能(App::perlimports連携)が入って加筆修正したりと それなりに山を越えてなんとか無事書き上げることができました。5年ぶり2度目の Perl Hackers Hub執筆だったのですが、前回に引き続き @inao さんに担当して頂き圧倒的大船感でした。プロ編集者の百戦錬磨レビューを受けるのはなかなかしびれるものがあります。貴重な体験ができてほんと受けて良かったなと思います。また、記事中ではモダンなPerlコードの代表(俺調べ)として、isuconのソースコードを使わせて頂きました。@941 さんと @kfly8 さんにはご承諾感謝致します。
Perlのような動的で自由度が悪魔的に高い言語も、近年のバージョンアップではLanguage Server Protocolと相性の良い明示的な世界観を手に入れつつあります(サブルーチンシグネチャやFunction::Parametersなどなど)。つい最近ですが、Perl NavigatorのAuthor bscanさんは Data::Class というモジュールを発表しています。SYNOPSISを見るだけで胸熱ですよね。昔はPerl書きまくってたけど最近はとんとご無沙汰で、という人も多いと思いますが、他のプログラミング言語にあるような書き心地がPerlにもやってきつつあります(インテリジェントな機能が嫌いな人もいたりしますが)。2023年にはさらに実装が進んでいくでしょう。期待にドキがムネムネしますね!
念のためもう一度 書いておきますが、WEB+DB PRESS vol.132 は本日 発売!
perlcpanfile
そんなわけで、Perl NavigatorをVS Codeに入れてPerlアプリを書いていると気づくことがあります。cpanfile が波線だらけになる!という問題です。
これは、主に cpanfileと Perl::Criticの相性が悪く use strict
してないとか use warnings
しろとかまあいろいろ言われてしまう。cpanfile は 中身はPerlコードなのですが言ってしまえばDSLで書く設定ファイルなので、通常のアプリケーションコードのような記述をしないのでそうなってしまうのです。
対策として cpanfileをignoreするとか、Perlとしてではなくプレーンテキストとして扱えば波線は消えますが、見た目に少々味気ないことになってしまいます。かといってintellijやVSCodeを幼少から使っている人には波線を許容するのは痛恨の極みでしょう。
というわけで、VS Code拡張機能の Hello, World をやってみたいという個人的なモチベーションもあったので、cpanfile専用の拡張機能を書いてみることにしました。
波線だらけだったのが、こんな感じになります。
拡張機能のページはこちらです。
https://marketplace.visualstudio.com/items?itemName=bayashi.perlcpanfile
VS Codeの拡張機能メニューから cpanfile で検索しても出てくるのでぜひお試しください(拡張機能をインストールしたら、cpanfileを紐づけるのをお忘れなく!READMEに書いてあります)。
VS Code拡張機能を書いてみる
では、さいごに簡単にVS Codeの拡張機能の書き方について触れておきます。実際のところ、google検索するだけでたくさんのチュートリアルに出会うことができます。LSPを用いた言語サーバの実装はかなり本格的でボリューミーになりますが、シンタックスハイライトを作る程度はけっこうお手軽です(シンタックスの複雑度や、どのくらいまじめに実装するかにもよります)。
- vscodeで自作のシンタックスハイライト・スニペット拡張機能を作る
- VSCodeのシンタックスハイライトの作り方
- Syntax highlightの公式ガイド
- Language Grammars — TextMate 1.x Manual
- TextMate における文字色一覧
このあたりのページを読めばシュッと書けてしまいます。VS Codeの拡張機能エコシステム恐るべし。
拙作の perlcpanfile は取り急ぎシンタックスハイライトだけ実装してますが、もしかしたら LSPにも手を出してモジュール名の補完くらいはやってみたいなという心持ちでいますがまあ、必要とされることもあまりないと思うのでまたなにかのきっかけで実装してみたくなったらやるかもしれない、くらいの湯加減です (cpanfileのモジュール名補完のためにバックグラウンドでLanguage Server動いてるのはギャグのように思えなくもない。やるとしたら Perl Navigatorの中で実装されるのが理想的?)。
というわけで、明日は guvnrtheさんです(の予定でしたが、キャンセルされたようです)。みなさま、楽しいクリスマスを!🎅