October 6, 2018

xremapをsystemctlで自動起動するメモ

xremapを使ってemacs以外(というかslackとchromium)でemacsバインディングで操作できるようにしています。めんどくさがって毎回ターミナルで実行していたのですが、起動忘れていてイライラしたりしたのでsystemctl使って勝手に起動するようにしました。といいつつsystemctl詳しくないので調べて多分こうだろうで動かしたら上手くいったものになります。 色々試行錯誤したのでいらないコマンドとか混ざってるかもですが後々何したか思い出せるようにメモしました。

環境

17.10で最初やったけど今は↓でもちゃんと動いています。

$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=18.04
DISTRIB_CODENAME=bionic
DISTRIB_DESCRIPTION="Ubuntu 18.04.1 LTS"

xremapをmakeしてinstall

xremapをcloneしたディレクトリで以下を実行すると、 /usr/local/binxremap の実行ファイルが設置されます。(場所を変えたい場合はDISTDIR指定すればよさそう)

$ make
$ sudo make install

ユニット定義ファイル

以下のファイルを ~/.config/systemd/user/xremap.service に置きます。(ディレクトリがない場合はあらかじめ作る)

[Unit]
Description=xremap

[Service]
KillMode=process
ExecStart=/usr/local/bin/xremap /path/to/xremap_config.rb
ExecStop=/usr/bin/killall xremap
Restart=always

[Install]
WantedBy=default.target

ユニット定義ファイルのメモ

  • ExecStart / ExecStop は絶対パスで書く
  • /etc/systemd/ の下にユニット定義ファイルをおくシステムレベルでは動かない( xremap がX serverに接続できなかった的なエラーが出て動かない)
  • WantedBydefault.target でないと動かない(システムレベルでは multi-user.target がデフォみたいなのをどこかで見たけど今回はユーザレベルなのでまあそうかという感じ)

サービス実行と自動起動設定

$ systemctl --user daemon-reload
$ systemctl --user start xremap
$ systemctl --user enable xremap

ユニット定義ファイルを書き換えた場合には daemon-reload が必要です。新規で追加した場合は必要なのかわからないのですが、やったからといって問題があるわけではなさそう。 xremap に渡す設定ファイルを書き換えた場合は systemctl --user restart xremap します。

systemctlのログの確認

journalctl -f すると tail -f した形でログが流れます。ログファイルそのものは /var/log/journal/ 配下にありますがバイナリなので、 journalctl コマンドを使います。

参考資料

(ついで)xremapの設定ファイル

公式のサンプル をちょっと書き換えたものになります。私の環境だとemacsの名前(inspectした値)が emacs25 にならずRubyのObjectのinspectそのままになってしまい困っていたのですが、考えたらemacsと端末とchromiumとslack以外はUbuntuでほぼ使わないので、chromiumとslackでだけ有効化するようにしました(なんで emacs25 じゃなくなったのかちょっとコード追ったりしたんだけどたぶんX側の都合のような気がするのでよくわからなかった…。)

window class_only: ['slack', 'chromium-browser'] do
  # emacs-like bindings
  remap 'C-b', to: 'Left'
  remap 'C-f', to: 'Right'
  remap 'C-p', to: 'Up'
  remap 'C-n', to: 'Down'

  remap 'M-b', to: 'Ctrl-Left'
  remap 'M-f', to: 'Ctrl-Right'

  remap 'C-a', to: 'Home'
  remap 'C-e', to: 'End'

  remap 'C-k', to: ['Shift-End', 'Ctrl-x']

  remap 'C-d', to: 'Delete'
  remap 'C-h', to: 'BackSpace'
  remap 'M-d', to: 'Ctrl-Delete'

  remap 'M-w', to: 'Ctrl-c'
  remap 'C-y', to: 'Ctrl-v'
  remap 'C-w', to: 'Ctrl-x'

  remap 'C-v', to: 'Page_Down'
  remap 'M-v', to: 'Page_Up'

  remap 'C-s', to: 'Ctrl-f'

  # actually these are vim insert mode bindings, but compatible with shell
  remap 'C-u', to: ['Shift-Home', 'Ctrl-x']

  remap 'C-m', to: 'Return'
  remap 'C-j', to: 'Return'
end

© yoshihara 2017-2019

Powered by Hugo & Kiss.