2023/11/20


はじめに

11/18、東京秋葉原のアキバプラザで、4年ぶりとなる VimConf、「VimConf 2023 Tiny」が開催されました。

今回、Kaoriya さんから「SoftwareDesign で執筆した内容で基調講演をして欲しい」とお願いされた際に、即答で OK をしましたが実は少し不安がありました。SoftwareDesign を事前に購入した人に同じ話を聞かせてしまうのは残念すぎないかという気持ちです。どうしようかとしばらく検討しましたが、SoftwareDesign の内容からスピンオフした内容にする事にしました。

規模が少し小さいとは言え、せっかく楽しみにきて頂いてる皆さんに、残念に思われないようにしたい、少しでも「来て良かった」と思って貰えるイベントにしたと思い、テーマは変えないまま色々な Bram Moolenaar 氏のエピソードを盛り込んだつもりです。

11/18 当日、僕は会場の受付で運営側としてノベルティの VimConf マスクを配布させて頂きました。(お気付きだっただろうか)

事前の PC 接続テストで Ubuntu Linux がうまく HDMI 出力できず最終的に KaoriYa さんのノート PC をお借りする事になった事だけが残念です。

発表の感想

以下は各登壇者の発表の感想です。

Λlisue さん (Revolutionizing Vim/Neovim Plugin Development ~ An In-Depth Look into Denops)

Vim と deno を RPC で繋ぎ、TypeScript で実装を行う事で、Vim をロックさせず、なおかつ型のある安全な実装をできる Denops という仕組みを実装した、ありすえさんの発表。Denops が生まれた経緯などがわかりやすく解説されていた。

Pros/Cons が説明されている点と、どんな物に Denops を適用すれば良いのかを解説していたのは良かった。AI との組み合わせはこれからの Vim 界隈でも増えていくと思いました。

ゴリラさん (Looking back at vim meetup)

ゴリラ.vim を発足した理由や、今も尚開催を継続しているモチベーションを説明いただきました。ゴリラさんの日頃からのモチベーションの高さは僕も皆も関心していて、逆にゴリラさんから熱いパワーを貰っている側面もあります。「まだ発表するには自分は早い」と言わずどんどん発表して欲しいとの事。次回開催は 12/13 です。次回開催は 12/13 です。(大事な事なので2度書きました)

大倉雅史さん (Developing a Vim plugin with Ruby, or when in Ruby do as the Rubyists do)

RSpec の使い勝手のよろしく無い部分を Vim で解決しようという話。英語での発表でありながらテンションの高さを表現されており素晴らしかった。個人的には LT の時の「マスタリング Vim」もテンション高くて良かったです。

kuu さん (Modern techniques for implements insert mode plugins / Why use IME within text editor?)

skkeleton の作者 kuu さんがインサートモード時の処理の難しさと skk.vim や eskk 等との比較なども。実は僕も Vim での SKK 実装を2回ほどやった経緯があり興味深く見せて頂きました。ちなみに SKK にチャレンジしたけど挫折した人は意外といるという知見を得ました。

aiya000 さん (Boost your vimrc with some template techniques!)

vimrc の基本的な構成の説明や、vital.vim が凄いという話をしていただきました。vimrc を書く上で便利な Lambda や辞書リテラル、メソッド記法、そして皆がまだ使ってないかもしれない String interpolation を解説して頂きました。僕個人もまだ String interpolation を使ってないのでどんどん使って行きたい。

ほか懇親会でも沢山 LT をしてくれた方がいて、とても楽しい会でした。

ところで

新型コロナウィルスが蔓延してテック系イベントが開催されなくなってはや数年、今年は開催しようという運営の判断で VimConf 2023 を開催しました。ただしギリギリまで決めかねていた事もあり、また4年という歳月が過ぎた事で、正直テキストエディタのシェアも変わっている可能性もあり、正直もしかするとユーザの多くが VSCode に移ってしまったかもしれないという一抹の不安もありました。運営としては極力、力を入れすぎない開催にしようという判断で VimConf 2023 Tiny と名付け、幾らか規模を小さくして開催する事にしました。

しかしその不安はすぐに間違っていた事に気付かされました。VimConf 2023 Tiny のチケットはあっという間に完売し、さらに SNS で「チケット買えなかった」「もっと参加人数を増やして欲しかった」と言われるほどでした。

そして何よりも Vimmer の皆さんの熱量が何も変わっていない事にとても嬉しく感じました。まだ VimConf を終えた直後ですが「また VimConf やろう」という気持ちも湧きました。そして今回、LT に Vim 好きの中学生がエントリしてくれました。メタバースで Vim の集会をやってる話をしてくれました。Vim 好きがちゃんと若い人たちにも育っているのを感じました。いい話すぎる。

今回、参加される皆さんにはマスクの着用をお願いしました。その為にマスクをノベルティとして配布しました。スタッフとして考えた末のノベルティでしたが当日、皆さんちゃんとマスクを付けて頂いていて本当に嬉しかったです。ありがとうございました。

今は無事 VimConf を復活させる事ができた安堵感でいっぱいです。

Posted at by



2020/01/06


はじめに

この文章は、普段から Vim を使い、仕事でも趣味でも Go 言語を書いている僕が、最近どの様な環境で書いているかを説明した文章です。ベストプラクティスではありません。

vim-go と僕

元々、Go 言語はリポジトリの misc/vim に Vim で Go 言語を書くための syntax やコマンドを持っていました。今でもそれらは Google のリポジトリに置かれています。ミュージアム的な物なので、実用的ではないと思います。

GitHub - google/vim-ft-go

A rudimentary Go filetype plugin. Provides syntax files and basic settings for go files. This is a f...

https://github.com/google/vim-ft-go

これを Fatih Arslan 氏が拡張した vim-go が、最近では Vim で Go 言語を書くためのデファクトスタンダードになっていました。vim-go は :GoImport コマンドによる import 文の追加や、:w での保存時にソースコードを整形する機能、:GoDef による定義位置ジャンプなど、色々な機能を搭載していきました。

僕もずっと vim-go を愛用してきて、幾らかコントリビュートもさせて頂いたりしました。正直、vim-go が無いと Go 言語が書けない、そんな風にも思っていました。

大きくなりすぎた vim-go

最近、vim-go が Language Server Client を実装しました。僕は vim-lsp という Language Server Client を使っていたのでそれらを無効にしていました。少し残念だったのが vim-go の Language Server Client の実装に伴い、幾らかバグが発生していました。またシンタックスハイライトにもバグがありました。そしてこれは最近思い始めた事ではないのですが、幾らかの機能を無効にしていても「若干重たいな」と感じていました。

vim-go1
vim-go2

普段から vim-go の幾らかの機能を無効にする為の設定を vimrc に書いていたのですが、ふと「もしかして僕には vim-go は大きすぎるのかもしれない」と思ったのです。

僕が欲しい機能は何だ

改めて、僕が Vim による Go 言語の編集環境で欲しい物を洗い出してみました。

  • Go 言語のシンタックスハイライト
  • 入力補完
  • :GoImport コマンド
  • :w による自動ソースコード整形、およびそのエラー表示

これだけあれば、僕には十分なのです。

Go 言語のシンタックスハイライトに関しては、最近の Vim であればデフォルトランタイムに含まれています。Go 言語は新しい予約語を増やす事はないので、これで十分です。

入力補完に関しては vim-lsp を使っており、こちらの方が色々な言語をサポートしており拡張性もあり、そもそも僕は vim-lsp のコントリビュータでもあるのでこちらが使いたいです。ただし、実は僕は入力補完は使っていなかったりします。Vim による編集の体験を良くする為に Vim や vim-lsp へのコントリビュートは行っていますが、僕本人はほぼ手打ちしていたります。

残るは :GoImport コマンドと :w による自動ソースコード整形なのですが、これだけの為に vim-go に依存する必要はないと思い立ち、vim-go を卒業する事を決めました。

vim-goimports による引越し

GitHub - mattn/vim-goimports: Vim plugin for Minimalist Gopher

vim-goimports Vim plugin for Minimalist Gopher Features Auto-formatting with :w GoImport/GoImportAs ...

https://github.com/mattn/vim-goimports

vim-goimports は、上記の残る2つの問題を解決する為だけに作ったプラグインです。

  • :GoImport コマンド
  • :w による自動ソースコード整形、およびそのエラー表示

メンテナンスやバグ修正は行いますが、これ以上、機能を足す予定はありません。もし「あー、vim-go のあの機能はさすがに欲しかった」と思い出す事があれば、僕はおそらく別のプラグインを作るでしょう。

これは vim-go がイケてないという話ではなく、僕と vim-go との距離感の話です。僕が vim-go に歩みよるよりも、僕のスタイルに何かを足して僕が欲しかった物を作った方が近かった、というだけの話です。

Plug 'prabirshrestha/async.vim'
Plug 'prabirshrestha/asyncomplete.vim'
Plug 'prabirshrestha/asyncomplete-lsp.vim'
Plug 'prabirshrestha/vim-lsp'

Plug 'mattn/vim-lsp-settings'
Plug 'mattn/vim-goimports'

Language Server や入力補完が必要ない方であれば以下でも構いません。

Plug 'mattn/vim-goimports'

これにより、vim-go の幾らかの機能を無効にする為に書いていた設定類を消しました。:GoDef による定義位置ジャンプは vim-lsp が有効になっていれば gd で可能ですし、ソースコードの整形は vim-goimports がやってくれます。ソースコード整形は、本来 Language Server でやれる話ですが、これに関しては絶賛取り組み中で、もう少し時間が必要です。それまでの間は vim-goimports に頼る事にします。また下記のエントリでもご紹介した通り、Vim の歩むべき道は、個別の言語の個別のプラグインによって個々のツールの導入に時間を割いたり vimrc を太らせる事ではないはずなのです。

Big Sky :: Vim をモダンな IDE に変える LSP の設定

Go 言語の IDE 機能を得る為に何か知る必要はありません。Java の IDE 機能を得る為に何か知る必要はありません。HTML の IDE 機能をインストールする為に npm コマンドの使い方を...

https://mattn.kaoriya.net/software/vim/20191231213507.htm

おわりに

上記の引越し作業により、幾分 vimrc の Go に関する項目がスッキリしました。今後、本来は必要なはずだった vim-go の機能が見つかれば、自分で作っていくしかありません。ですが 2019 年末に「こっちの方が近い」と思った自分を信じて、しばらくはやってみます。

改訂2版 みんなのGo言語 改訂2版 みんなのGo言語
松木 雅幸, mattn, 藤原 俊一郎, 中島 大一, 上田 拓也, 牧 大輔, 鈴木 健太
技術評論社 Kindle版 / ¥2,350 (2019年08月01日)
 
発送可能時間:

Posted at by



2019/12/31


この記事は Go の編集環境について書いていません。昨日書いた、ぼくがかんがえたさいきょうの Vim のこうせい 2019年 年末版は、僕個人の好みに依存するため一緒に書くべきではないですし、おすすめするつもりも無いです。IDE 機能の説明だけ欲しいと思う方もいるでしょうし、また純粋に Go の編集環境だけの説明が欲しいと思う方もいると思ったからです。

はじめに

以前からも「Vim はテキストエディタではない IDE だ」と言われる事は割と多かったのですが、昨今 Language Server Protocol の登場により本当に Vim を「テキストエディタ」と呼べなくなってきてしまう状況になりつつあります。

これまで Vim は、ctags でタグを生成し、Vim から定義位置ジャンプを行い、フォーマットコマンドを使ってファイルを整形してきました。これはとてもうまく行きました。ctags は多くの各種プログラミング言語をサポートしていますし、taglist の様なプラグインを使えば tags ファイルを読み込んでシンボルリストを表示する事もできます。Vim 標準の機能を伝えばタグスタックも使えます。対応していない言語についてはそれ専用の tags 生成プログラムを探せば良いですし、フォーマットコマンドもそれ専用の物を探してくればよかったのです。

しかしこれをずっと繰り返してきた Vim の設定ファイルは一体どの様な物になっていったでしょうか。個々のプラグイン専用の設定項目が散乱し、プラグイン毎にスタイルの異なった設定を行う必要があり、それ専用のタグ生成コマンド、整形コマンドを用意する時間を捻出しなければなりませんでした。入力補完については色々な言語毎に異なる仕様に悩まされるばかりでした。

結局、僕が行き着いた先は「消しやすい Vim の構成」でしたが、この消しやすい Vim の構成であっても、各プログラミング言語毎に用意すべきツール類をまとめる事は出来ませんでした。

Language Server Protocol の登場

そこにやってきたのが Language Server Protocol です。Language Server を導入する事で、各言語に対する定義位置ジャンプや入力補完のインタフェースが統一され、Vim の設定はある程度統一される様になりました。元々の Vim を「昭和」、各プログラミング言語向けのプラグインが氾濫していた頃を「平成」と例えるなら、ようやく Vim は「令和」になったと言って良いと思います。それでも問題が全て消え去った訳でありません。Language Server を導入する為にはその言語に対する知見が必要です。「このプログラミング言語を触ってみたいな」と思った人が定義位置ジャンプや入力補完、ソースファイル整形といった、最近の IDE であればあって当然の機能を得るには、Language Server を導入する為の知見が必要でした。そこで筆者は先日、vim-lsp-settings というプラグインを作りました。

vim-lsp の導入コストを下げるプラグイン vim-lsp-settings を書いた。 - Qiita

これら全ての機能は、テキストエディタと Language Server との間で JSON-RPC を使い、ソースコード本体、コード補完候補、座標情報などを交換する事で実現されています。 温故知新 実...

https://qiita.com/mattn/items/e62b9f16bc487a271a7f

vim-lsp を利用するには

このプラグインを導入する事で、そのプログラミング言語について詳しくない人でもコマンド1発で入力補完や定義位置ジャンプやソースコード整形といった「IDE 機能」を得る事ができる様になります。やるべき事は2つ

  • vim-lsp とその動作に必要なプラグインを入れる事
  • vim-lsp-settings を入れる事

ファイルを開いて拡張機能のインストールを提案されたら :LspInstallServer を実行するだけなのです。これだけで以下のプログラミング言語の IDE 機能が得られるのです。

Language Language Server Local Install
C/C++ clangd No
C# omnisharp Yes
Clojure clojure-lsp Yes
TypeScript typescript-language-server Yes
JavaScript typescript-language-server Yes
JavaScript javascript-typescript-stdio Yes
Python pyls Yes
Rust rls No
Go gopls Yes
Ruby solargraph Yes
PHP intelephense Yes
Java eclipse-jdt-ls Yes
Lua emmylua-ls Yes
Vim vim-language-server Yes
Bash bash-language-server Yes
Terraform terraform-lsp Yes
Dockerfile dockerfile-language-server-nodejs Yes
YAML yaml-language-server Yes
XML lsp4xml Yes
Fortran fortls Yes
Scala Metals Yes
Elm elm-language-server Yes
JSON json-languageserver Yes
Swift sourcekit-lsp No
COBOL cobol-language-support Yes
Reason reason-language-server Yes
TeX texlab Yes
TeX digestif No
Nim nimls No
D dls No
Elixir elixir-ls Yes
Groovy groovy-language-server Yes

Go 言語の IDE 機能を得る為に何か知る必要はありません。Java の IDE 機能を得る為に何か知る必要はありません。HTML の IDE 機能をインストールする為に npm コマンドの使い方を覚えたり、LaTeX の IDE 機能をインストールする為に、配置場所を考える必要もありません。もしインストールを実行しても動かなかったら、それは vim-lsp-settings のバグです。

以前まででれば vim-lsp を導入すると Language Server の登録が必要でした。

if executable('gopls')
    au User lsp_setup call lsp#register_server({
        \ 'name''gopls',
        \ 'cmd'{server_info->['gopls']},
        \ 'whitelist': ['go'],
        \ })
    autocmd BufWritePre *.go LspDocumentFormatSync
endif

その為、新しい Language Server を導入する度に以下の様な設定が増えていき、設定ファイルがどんどん増えてしまっていました。それが vim-lsp-settings の導入により、その殆どを消し去る事ができました。以下が僕の ~/.vim/_config/200-lsp.vim です。

if empty(globpath(&rtp, 'autoload/lsp.vim'))
  finish
endif

functions:on_lsp_buffer_enabled() abort
  setlocal omnifunc=lsp#complete
  setlocal signcolumn=yes
  nmap <buffer> gd <plug>(lsp-definition)
  nmap <buffer> <f2> <plug>(lsp-rename)
  inoremap <expr> <cr> pumvisible() ? "\<c-y>\<cr>" : "\<cr>"
endfunction

augroup lsp_install
  au!
  autocmd User lsp_buffer_enabled call s:on_lsp_buffer_enabled()
augroup END
command! LspDebug let lsp_log_verbose=1 | let lsp_log_file = expand('~/lsp.log')

let g:lsp_diagnostics_enabled = 1
let g:lsp_diagnostics_echo_cursor = 1
let g:asyncomplete_auto_popup = 1
let g:asyncomplete_auto_completeopt = 0
let g:asyncomplete_popup_delay = 200
let g:lsp_text_edit_enabled = 1

サーバ登録に関する物は無くなりました。let を設定している箇所は、vim-lsp およびそれに必要なプラグインの動作を変更する物です。人によっては好ましくない物もあるので皆さんの好きな様に変更頂くのが良いです。

lsp_diagnostics_enabled はファイルの変更に伴いリアルタイムにエラー表示する機能 Diagnostics を有効にする設定、asyncomplete_auto_popup および asyncomplete_auto_completeopt は自動で入力補完ポップアップを表示する設定、asyncomplete_popup_delay はポップアップを表示するまでのディレイ、lsp_text_edit_enabled は LSP の仕様である textEdit を有効にする設定です。この lsp_text_edit_enabled に関しては少し実験的な実装になっている為、もし誤動作する様であれば 0 に設定するのが良いです。

vim-lsp-settings も合わせて vim-lsp を使いたいのであれば以下を vimrc に記述します。

Plug 'prabirshrestha/asyncomplete.vim'
Plug 'prabirshrestha/asyncomplete-lsp.vim'
Plug 'prabirshrestha/vim-lsp'
Plug 'mattn/vim-lsp-settings'
Plug 'mattn/vim-lsp-icons'

Plug 'hrsh7th/vim-vsnip'
Plug 'hrsh7th/vim-vsnip-integ'

vim-lsp-icons はソースコードにエラーがあった際にアイコンでエラー表示をしてくれる為のプラグインです。また Language Server の中には、穴あき形式で補完候補を返してくる物もあり、これをうまく対応してくれるのが vim-vsnip です。

これだけ設定して、上記の 200-lsp.vim を有効にしておけば、おおよその Language Server が正しく動作し、F2 キー(または :LspRename)でシンボルのリネーム、gd で定義位置ジャンプ、:LspDocumentFormat でソースコード整形、gVim を起動したらアイコンでエラー表示がされる様になります。

これを導入する事で、これまで C# の補完の為に導入していた omniSharp-vim や、tags ファイルで定義位置ジャンプを行っていた rust.vim の様な言語専用のプラグイン、それに必要な rustfmt といったツール類を消し去る事ができました。

僕が現在、言語専用に入れているプラグインは Vim のデフォルト syntax では対応しきれていない物に対応させる為に入れている数種類のプラグインだけになりました。

おわりに

昨日書いた、ぼくがかんがえたさいきょうの Vim のこうせい 2019年 年末版とは別に Vim をモダンな IDE にする為の設定を説明しました。人によっては、Vim の設定管理方法が僕とは違うが IDE 機能は欲しいと思われる方もいるだろうと思いましたので、別記事で書かせて頂きました。

昨今、僕が Vim に望んでいるのはこういった氾濫してしまった設定ファイル類をプラグイン等により減らす方向に向かって欲しいという事です。これらの整理なくしては、次の時代に対応できなくなってしまいます。できればプラグイン固有の設定すら書かなくても良い時代になる事を願っています。

最後に、これとは別に僕が「Go 言語の編集でこれだけは外せない」と思っている物を後日書きたいと思います。

さて、あと数時間で 2019 年も終わりです。今年も色々な方にお世話になり、色々な活動をする事ができたと思っています。皆さまに感謝しつつ、来年もまた皆さんのお役に立てられる情報を発信して行けたらと思います。来年も宜しくお願い致します。

Posted at by