st (simple terminal), Touchpad で スクロールができるようにする
NixOS での話ですが、他でも使えると思います。
最近は、Terminal に st を使っています。rxvt-unicode から乗り換えました。乗り換えた理由は、rxvt-unicode が True Color に対応していなかった、そんな理由だったと思います。
NixOSでの st のインストール方法
NixOS で st を使えるようにするには、/etc/nixos/configuration.nix
でパッケージを宣言するだけですが、カスタマイズを色々することになるので、最終的にはこんな感じになります。
environment.systemPackages = with pkgs; [ # *snip* (st.overrideAttrs (oldAttrs: rec { patches = [ ./st-patch/st-scrollback-0.8.5.diff ./st-patch/st-scrollback-reflow-0.8.5.diff ]; configFile = writeText "config.def.h" (builtins.readFile ./config.def.h); postPatch = "${oldAttrs.postPatch}\n cp ${configFile} config.def.h"; })) # *snip* ];
フォントやカラーテーマ等は config.def.h
で設定します。config.def.h
の元本はここから取ってきました。 パッチは、色々機能を拡張できる機能で、それらはここで確認できます。
これらは、どちらもローカルにファイルを保存して取り込むだけでなく、URLから取り込む方法もあり詳細は wiki にあります。私は、ハッシュ値の計算が面倒だったのと、リモートのソースは勝手に変更される可能性があるので、全てローカルに保存して使いました。
そんなことより重要なのは、config.def.h
が反映されるのはパッチを当てた後になることです。パッチには config.def.h
の diff もあるのですが、それらの diff は 自分の用意した config.def.h
で上書きされます。なのでパッチを読んで、config.def.h
の設定を自分の config.def.h
に適切に拾い上げていく必要があります。
本題
せっかくインストールした st ですが、画面をスクロールさせることができませんでした。タッチパッドを下から上に動かすと、^Y
が端末に入力され、上から下に動かすと^E
が入力されるだけでした。悲しい。
解決策は、FAQ によると、3つあるようです。この記事では最後のを試しました。2つ目は scroll をどうやって NixOS で取り込み管理していくか、すぐには分からなかったため、試さなかったです。
## How do I scroll back up? * Using a terminal multiplexer. * `st -e tmux` using C-b [ * `st -e screen` using C-a ESC * Using the excellent tool of [scroll](https://git.suckless.org/scroll/). * Using the scrollback [patch](https://st.suckless.org/patches/scrollback/).
やったこと
上記の configuration.nix
の通り、スクロール機能を追加するために2つのパッチを追加しました。また、スクロール機能をキーバインドするため、config.def.h
を以下のように編集しました。Button4がタッチパッドを下から上にスクロールさせることに相当し、Button5がタッチパッドを上から下にスクロールさせることに相当します。それらに今回追加した kscrollup, kscrolldown を設定しました。これにより、タッチパッドを動かしても画面がスクロールされない問題が解決しました。
diff --git a/config.def.h b/config.def.h index f8546d0..4dd4821 100644 --- a/config.def.h +++ b/config.def.h @@ -163,9 +163,9 @@ static MouseShortcut mshortcuts[] = { /* mask button function argument release */ { XK_ANY_MOD, Button2, selpaste, {.i = 0}, 1 }, { ShiftMask, Button4, ttysend, {.s = "\033[5;2~"} }, - { XK_ANY_MOD, Button4, ttysend, {.s = "\031"} }, { ShiftMask, Button5, ttysend, {.s = "\033[6;2~"} }, - { XK_ANY_MOD, Button5, ttysend, {.s = "\005"} }, + { XK_ANY_MOD, Button4, kscrollup, {.i = -1} }, + { XK_ANY_MOD, Button5, kscrolldown, {.i = -1} }, };