awesometaro

kakouneを使ってみる

はじめに

私はエンジニアでソースコードの編集のためにテキストエディターを利用している。 数あるテキストエディターの中でも私はVimやEmacsのようにカスタマイズ性の高いエディターを好んで利用している。 最近はVimに操作性の似たTUIエディターのHelixが有名になってきている。 HelixはVimとKakouneというテキストエディターからインスパイアされた新しいテキストエディターである。 このHelixの操作性が非常に良かったため、しばらく使ってきた。 しかしHelixにはプラグインシステムが未だに存在しない。 私はエディターにはカスタマイズ性を求めているため、これは致命的であった。 そこで私はKakouneを使ってみようと思った。

Kakoune

KakouneもVim同様にTUIのテキストエディターである。 Vimとの違いとしては、Vimは操作・範囲選択という順番にコマンドを実行するのに対して、Kakouneでは、範囲選択をしてからコマンドを実行するような考え方だ。 Helixの操作性はKakouneから影響を受けているため、Kakouneと同様である。 しかし、Helixとの違いはプラグインを利用できるところだ。 LSPやtree sitterのようにモダンなテキストエディターの機能も利用することができる。

Kakouneの哲学は非常に面白い。 例えばvimでよく使うパネルの分割機能も持たない。 それはUIの責務からであり、KakouneではこういったUIの責務をtmuxやzellijに譲っている。

プラグインの書き方

コクーンのプラグインは以下のようにして書く。 主にシェルスクリプトと組み合わせて構成する。

define-command php-cs-fix %{
    nop %sh{ php-cs-fixer fix "$kak_buffile" --quiet}
    edit!
}

zellijを開く場合は以下のように書く。

define-command yazi -docstring 'open yazi in current buffer dir' %{
    evaluate-commands %sh{
        # 一時ファイルを作成
        tmp=$(mktemp)
        # カレントバッファのディレクトリを取得
        dir=$(dirname "$kak_buffile")
        
        # terminalコマンドを文字列として組み立てて出力する
        # %{ ... } で囲むことでクォートの競合を避ける
        echo "terminal sh -c %{
            yazi '$dir' --chooser-file='$tmp'
            if [ -f '$tmp' ]; then
                files=\$(cat '$tmp')
                rm -f '$tmp'
                [ -n \"\$files\" ] && kak -p '$kak_session' -e \"evaluate-commands -client '$kak_client' edit \$files\"
            fi
        }"
    }
}

terminalはtmuxやzellijを利用して新規パネルを開く。