LinuxとかOSSのこととか

Linux (主にNixOS) や OSS に関する取り組みを記述するブログ。

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} },
 };