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/bin
に xremap
の実行ファイルが設置されます。(場所を変えたい場合は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に接続できなかった的なエラーが出て動かない)WantedBy
はdefault.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