【Linux】トラックパッドでジェスチャーを可能にする

Linux(Ubuntu)を使用していると、Macのトラックパッドジェスチャーが使いたくなることがあります。特にワークスペースの移動や、戻る(←)・進む(→)が恋しくなります。libinput-gesturesを使用すれば、Macほど快適ではありませんがLinuxでもある程度はできるようになります。

libinput-gesturesの導入

libinput-gestures を導入すれば基本的なことはノー設定で実現できます。

公式の手順通りインストールします。私はUbuntu20.04でやりました。

まずはinputグループに自身のユーザーを追加します。

$ sudo gpasswd -a $USER input

続いて必要なライブラリのインストール。(以下のパッケージはUbuntuにおいて必要なパッケージです)

$ sudo apt-get install xdotool wmctrl

さらに、libinput-gesturesが使用するコアライブラリであるlibinput-toolsをインストールします。(UbuntuのようなDebian系のみ必要みたい)

$ sudo apt-get install libinput-tools

最後に本丸であるlibinput-gesturesをインストールします。こちらはレポジトリをクローンして手動でインストールする必要があります。

$ git clone https://github.com/bulletmark/libinput-gestures.git
$ cd libinput-gestures
$ sudo make install
$ cd ..
$ rm -rf inbinput-gestures

一瞬でインストールが完了すると思います。

libinput-gesturesにはsetupコマンドが用意されているので、そのコマンドを叩いて自動起動とデーモンを開始します。

$ libinput-gestures-setup autostart
$ libinput-gestures-setup start

以上でセットアップは完了。簡単ですね。

ジェスチャーの設定は /etc/libinput-gestures.conf にあります。一見しておくとよいと思いますが、基本的な設定は最初からできていて、凝ったことしないならデフォルトからいじる必要はないかも?

もし自分でカスタマイズしたいなら、/etc/libinput-gestures.confを ~/.config/libinput-gestures.conf にコピーして、そちらを編集するといいようです。

デフォルト設定

libinput-gesturesのデフォルトは次のようになっています。

ジェスチャーアクション
3or4本指スワイプ アップ↑上のワークスペースへ ※ナチュラルスクロールの場合は下
3or4本指スワイプ ダウン↓下のワークスペースへ ※ナチュラルスクロールの場合は上
3or4本指スワイプ レフト←Alt+右(進む)
3or4本指スワイプ ライト→Alt+左(戻る)
3or4本指ピンチインSuper+S(アクティビティ画面を表示する=Windowキー)
3or4本指ピンチアウトSuper+S(アクティビティ画面を表示する=Windowキー)

ピンチイン・アウトが同じアクションなのでちょっと勿体無いものの、基本的にはこれで十分って人も多いんじゃないでしょうか。どのジェスチャーも3本指でも4本指でも発動します。なおlibinput-gesturesでは2本指のジェスチャーは割り当てることができません。

カスタマイズする

デフォルトでも事足りますが、少々変更してちょこっと便利にしてみました。

いじる前に設定ファイルホームディレクトリにコピーしてきましょう。

$ cp libinput-gestures.conf ~/.config/libinput-gestures.conf

編集するのは~/.config以下のファイルの方ですね。

さて、編集するにあたってカスタマイズ後の設定を次のように決めました。

ジェスチャーアクション
4本指スワイプ アップ↑上のワークスペースへ ※ナチュラルスクロールの場合は下
4本指スワイプ ダウン↓下のワークスペースへ ※ナチュラルスクロールの場合は上
3本指スワイプ ダウン↓Ctrl + W(閉じる)
3本指スワイプ レフト←Alt + 右(進む)
3本指スワイプ ライト→Alt + 左(戻る)
3本指スワイプ 左・上←↑Ctrl + PageUp(前のタブ)
3本指スワイプ 右・上←↑Ctrl + PageDown(次のタブ)
4本指ピンチインSuper + S(アクティビティ画面を表示する)
4本指ピンチアウトSuper + D(デスクトップを表示)
3本指ピンチインCtrl + -(縮小)
3本指ピンチアウトCtrl + =(拡大)

対応する設定は次のとおりです。

◆ ~/.config/libinput-gestures.conf
gesture swipe up    4 _internal ws_up
gesture swipe down  4 _internal ws_down
gesture swipe down  3 xdotool key ctrl+w
gesture swipe left  3 xdotool key alt+Right
gesture swipe right 3 xdotool key alt+Left
gesture swipe left_up   3 xdotool key ctrl+Page_Up
gesture swipe right_up  3 xdotool key ctrl+Page_Down

gesture pinch in  4 xdotool key super+s
gesture pinch out 4 xdotool key super+d
gesture pinch in  3 xdotool key ctrl+minus
gesture pinch out 3 xdotool key ctrl+equal

その他に割り当て可能なジェスチャーもありますので、詳しくは公式githubを見てください。

Ubuntu 20.04インストールしてからやること

2年ぶりのLTSであるUbuntu 20.04がリリースされました。さっそくインストールして初期設定を楽しむことにしました。内容をつらつら〜っと書いていきます。

環境

  • Ubuntu 20.04(日本語Remix版ではない)
  • Thinkpad X395

言語を日本語にしてインストールしておけば、直後からMozcが使えるようになってます(※GUIでの設定変更については後述)。Thinkpadのトラックポイント・トラックパッドもどちらも問題なく使用できます。超簡単。

というわけでさっさとやったことリストに行きます。

システム系

Ubuntuシングルサインオン

正直なんのメリットがあるのかよく分からんのですが(笑)、Ubuntuファンとしてアカウントを登録してログインしておきました。多分不要だと思います。

ダークテーマに変える

設定-[外観]から変更可能になってます。

世の中ダークテーマが流行りですな。

マウス設定変更

設定-[マウスとタッチパッド]で

  • マウスのスピードを最速に
  • ナチュラルスクロールをONに
  • タッチパッドの速度を最速に

キーボード設定変更

設定-[ユニバーサルアクセス]のタイピング欄でリピートキーの設定を変更。

タイ語を入力ソースに追加

設定-[地域と言語]の入力ソースで+ボタンを押してタイ語を追加する。まあ普通の人はタイ語のタイピングなんて必要ないでしょうが・・・。

不要なアプリ削除

Ubuntu Softwareを起動して、インストール済みのタブを選択。使用しなさそうなアプリをガンガン削除する。以下は私の場合。

削除したアプリ名理由
AisleRiotやらない
Solitaireやらない
CalendarGoogleカレンダー使うから
Document Scannerスキャナ持ってないし
Déjà Dup バックアップツール別の方法でバックアップするし
GNOME マインスイーパーやらない
GNOME 上海やらない
GNOME 数独やらない
Remminaリモートデスクトップしないし
SeahorseBitwarden使うし
To DoMicrosoft To-Do使うし
RhythmboxLollypop使うし

Gnome Tweaksインストール

Ubuntu Softwareからインストールします。Tweakする内容は、

  • CapslockをControlに
  • マウスのアクセラレーションプロファイルをAdaptiveに
  • バッテリー残量を表示する
  • トップバーに曜日を表示する
  • 静的ワークスペースに 数は3つにする

ファイルの設定

Windowsでいうエクスプローラーのことです。

  • 詳細表示に切り替える
  • サイズ・種類・更新日を表示する

ホーム内のディレクトリを英語にする

日本語だとターミナルでcdするときとかに面倒臭いです。英語に変えます。

ターミナル(端末)を開いて次のコマンドを実行します。

$ LANG=C xdg-user-dirs-gtk-update

ダイアログが表示されるので、2度と聞かれないようにチェックを入れてUpdate…でリネーム完了。

mozcの設定

日本語でインストールするとMozcは最初からインストールされています。しかしなぜかGUIの設定ツールが入っていません。手動で入れましょう。

$ sudo apt install mozc-utils-gui

これで地域と言語の歯車アイコンで起動できるようになります。

Macも使っているので、[キー設定の選択]でことえりにしておきます。

VPNの追加

OpenVPNの場合、ovpnファイルがあればインポートするだけで完了です。

L2TP/IPsecの場合はGUIの設定ツールをインストールしてやります。

$ sudo apt install network-manager-l2tp-gnome

設定-[ネットワーク]でVPNの+ボタンを押すと、L2TPが増えてます。

google-drive-ocamlfuseのインストール(Googleドライブ)

Linux版の「バックアップと同期」ツールはGoogleからリリースされていません。しょうがないのでgoogle-drive-ocamlfuseというツールを使用します。「バックアップと同期」と違ってローカルにはフイルの実態を置きません。Windowsでいうネットワークドライブみたいな感じだと思っておけばいいと思います。

$ sudo add-apt-repository ppa:alessandro-strada/ppa
$ sudo apt-get update
$ sudo apt-get install google-drive-ocamlfuse

続いて設定します。私は2つのアカウントを使っているので両方設定しておきます。

まずはマウントポイントをmkdirして、google-drive-ocamlfuseコマンドを叩いて1つめのアカウントで認証を完了します。以下例では~/GoogleDrives/hogeにマウントしてます。

$ mkdir ~/GoogleDrives/hoge
$ google-drive-ocamlfuse ~/GoogleDrives/hoge

2つ目のアカウントもほぼ一緒。-labelオプションを付ける点が異なります。

$ google-drive-ocamlfuse -label 適当なラベル ~/GoogleDrives/fuga

認証が済んだらどちらも正常にマウントできているか確認しておきましょうね。

このままだと自動起動してくれないので、自動起動用スクリプトを書きます。内容はさっきやったことです。

$ vi ~/bin/google-drive-ocamlfuse-start.sh
◆google-drive-ocamlfuse-start.sh
#! /usr/bin/bash

google-drive-ocamlfuse ~/GoogleDrives/hoge
google-drive-ocamlfuse -label 適当なラベル ~/GoogleDrives/fuga

実行権限も付けて。

$ chmod +x ~/bin/google-drive-ocamlfuse-start.sh

あとはスタートメニューから[自動起動するアプリケーション]を起動して先程のスクリプトを登録しておきます。

MP4とか再生できるように

大人の事情で初期状態ではMP4などが再生できません。追加パッケージをインストールします。

$ sudo apt-get install ubuntu-restricted-extras
$ sudo apt-get install ffmpeg

途中同意を求められたら同意してください。

CopyQインストール

クリップボード拡張アプリです。履歴からペーストできたり定型文登録できたりととても便利です。

$ sudo apt install copyq

適当に設定してください。私は、

  • 自動的に起動する オンに
  • グローバルショートカット マウスカーソルの下にメインウィンドウを表示をSuper+Ctrl+Vに
  • タブを追加して定形文を少々登録

Easystrokeのインストール

マウスジェスチャーアプリです。Ubuntu Softwareからインストールできます。設定した内容は次のような感じ。

ジェスチャー名前キー
前のタブCtrl+PageUp
次のタブCtrl+PageDown
閉じるCtrl+W

戻る・進むボタンはマウスに付いてるのでここでは登録しませんでした。

libinput-gesturesのインストール

トラックパッドでの3・4本指ジェスチャーを可能にするツールです。

ちょっと長くなるので別の記事にしました。

【Linux】トラックパッドでジェスチャーを可能にする

xkeysnailのインストール

キーマップ変更ツールです。

これもちょっと長くなるので別の記事にしました。

xkeysnailでキーマップ変更から自動起動まで

playerctlのインストール

LollypopやSpotify、Youtube(ブラウザ)など各種プレイヤーに対し再生や一時停止などをコマンドラインから操作できるようになるツールです。なぜこれを使用するかというと、アプリケーションによっては再生・一時停止などのメディアキーに対応してないものがあるからです。playerctlのコマンドをショートカットキーに登録しておけば、あらゆるプレイヤーを同じショートカットキーで操作できるので便利です。

altdesktop/playerctl

$ sudo apt install playerctl

インストールしたら試しに何か音楽ファイルを再生してみましょう。そうしたら次のコマンドを叩くことで一時停止・再生がトグルできます。

$ playerctl play-pause

その他のコマンドについては公式のREADMEを見てください。

あとは各種playerctlコマンドをOSのショートカットに登録するだけ。設定の[キーボードショートカット]を開き、一番下の+ボタンで新しいショートカットを追加します。

こんな感じで「再生/一時停止:playerctl play-pause」「前の曲:playerctl previous」「次の曲:playerctl next」の3つをショートカットとして登録しました。

アプリ系

Google Chromeインストール

公式からdebをダウンロードしてインストールします。

ダウンロードしたdebファイルを右クリック→別のアプリケーションで開く-[アプリケーションのインストール]で開くとインストールできます。

Thunderbirdの設定

デフォルトでインストールされてます。まともなメーラーがないので仕方なく使ってます。アカウントの設定とかします。

Poddrのインストール

ポッドキャストアプリです。最初からインストールされているRhythmboxでも聴けるんですが、なんかイマイチもさいです。

というわけでPoddrというアプリをインストールします。

Ubuntu Softwareで検索すると見つかるはず。

こんな感じのアプリです。

結構使いやすげ。

Lollypopのインストール

ローカルにある音楽はLollypopで再生してます。

これもUbuntu Softwareからインストールできます。

Spotifyのインストール

ちゃんとLinux版があります。公式いわくUbuntu Softwareからのインストールを推奨してるみたい。というわけで入れましょう。

インストールしたらログインして、設定を変更します。

  • 言語を日本語に
  • 音量の均一をオフに(コンプレッサーがかかるので若干音質が悪くなるそうな)
  • 友達のアクティビティを表示するをオフに
  • 自動再生をオフに

Cawbirdのインストール

LinuxにはろくなTwitterクライアントがないのですが、まだマシかなーというのがこのCawbirdです。

Ubuntu Softwareからインストールできます。

ヘビーユーザーではない私には十分かな。

Skypeをインストール

zoomなんてオシャレなものは使いません。硬派にSkypeです。

公式サイトからLinux版(deb)をダウンロードしてインストールしましょう。

少し設定を変えておきます。

  • 背景をぼかす
  • 字幕を表示する

Webアプリ(Chromeショートカット)

よく使うWebアプリはGoogle Chromeでショートカットにしておくと便利です。デスクトップにアイコンが追加され、Dockにアイコンを追加することもできるので、通常のアプリと変わらずに使用できます。

私は以下のWebアプリのショートカットを作りました。

  • Googleカレンダー
  • Microsoft To-Do

ショートカットはChromeのメニューからできますよ。ショートカットを作成したいページに訪れ、設定メニューの中の[その他のツール]-[ショートカットを作成]でOKです。ウィンドウにしておいたほうが便利だと思います。

ショートカットを作成するとデスクトップにアイコンファイルができるのですが、このままではダブルクリックで起動できません。アイコンファイルを右クリックして[起動を許可する]を選択しておくと、次回以降はダブルクリックで起動できるようになります。

開発系

fishシェルのインストール

デフォルトですでに便利だというfishシェルを使います。公式の手順でもいいですが、aptでインストールできました。

$ sudo apt install fish

ログインシェルはbashから変更しないほうがいいと思います。次節でTerminatorというターミナルアプリをインストールしますので、そちらの設定でfishを使用するようにします。

terminatorインストール

Gnome端末だとショボいのでTerminatorをインストールします。

$ sudo apt install terminator

ターミナル内で右クリックして[設定]。

  • defaultプロファイルの背景を0.8透過に
  • defaultプロファイルのコマンドで[ログイン・シェルではなくカスタムコマンドを実行にチェックを入れて /usr/bin/fish を入力。

NeoVimインストール

vimでもいいのですが、なんとなくNeoVim派なので。

$ sudo apt install neovim

gitインストール

開発には必須です。

$ sudo apt install git

最低限の設定もしておきます。

$ git config --global user.name "ユーザー名"
$ git config --global user.email メールアドレス
$ git config --global core.editor nvim

githubに公開鍵登録

gitプロトコル使う場合は鍵認証が便利です。

$ bash
$ ssh-keygen -t rsa -b 4096 -C "メールアドレス"
〜パスフレーズ使わない私はエンター連打〜
$ eval "$(ssh-agent -s)"
$ ssh-add ~/.ssh/id_rsa
$ cat ~/.ssh/id_rsa.pub | xclip -selection c # クリップボードにコピー

githubのSettingsページからSSH KEYを登録する。xclipコマンドでクリップボードにコピーされた公開鍵をペーストする。

fzfインストール

高速ファインダをインストールします。

$ sudo apt install fzf

curlインストール

何かと必要になりますから。

$ sudo apt install curl

ドットファイル類pull

ドットファイル類はPrivateなgithubレポジトリにおいてあるのでpullしてきます。ここは各個人いろんなやり方があるんでしょうね。

Javaインストール

バージョン切り替えて使うとかハードなJavaユーザーの人はSDKMANを使ったほうがいいのかもしれませんが、私はJDK8をたまーに使用するだけなので、aptで入れちゃいます。openjdkにしました。

$ sudo apt install openjdk-8

memcachedインストール

仕事で使用するので。

$ sudo apt install memcached
$ sudo systemctl status memcached

よし、ちゃんと起動してるな。

Powerline fontsインストール

かっこいいターミナルを作るには必須のフォント。公式の手順通りですが、以下の手順でインストールできます。

$ git clone https://github.com/powerline/fonts.git --depth=1
$ cd fonts
$ ./install.sh
$ cd .. rm -rf fonts

Cascadia codeのインストール

Microsoft製のフォントです。プログラミングに向いてます。

$ sudo apt install fonts-cascadia-code

これで使えるようになってます。

IntelliJインストール

VSCodeも好きなんですが、やっぱりJetBrainsのIDEは最高です。有料のUnlimitedユーザーなので使わないと元取れない気もするし笑。

  1. 公式サイトでLinux版をダウンロード
  2. 展開したフォルダを ~/Applications の中に配置
  3. binidea.shを実行

次回以降は普通にスタートメニューから起動できます。

Slackインストール

もはやデベロッパーには必須のツールでしょう。

これは公式からDEB版をダウンロードしてインストールします。

Xnodenvのインストール

nodeのバージョン管理ができます。

$ curl -fsSL https://raw.githubusercontent.com/nodenv/nodenv-installer/master/bin/nodenv-installer | bash

以下をconfig.fishに追加します。※fishシェルです

set -x PATH $HOME/.nodenv/bin $PATH
status --is-interactive; and source (nodenv init -|psub)

あとは好きなバージョンのnodeをインストールしましょう。私は10.13.0をインストールしました。

$ nodenv install 10.13.0

dockerのインストール

言わずもがなdockerです。公式の方法だとまだUbuntu 20.04のレポジトリがなかったみたい?

というわけでaptでインストールしました。sudoなしで実行できるようにもしておきます。

$ sudo apt install docker.io
$ sudo systemctl enable --now docker
$ sudo usermod -aG docker あなたのUbuntuユーザー名

ここで一旦ログインしなおす必要ありです。ログイン後にちゃんと動くか試してみます。

$ docker run hello-world

ちゃんとHello, Worldできましたか?

composeもよく使うのでインストールしておきます。

$ sudo apt install docker-compose

おしまい

ざっとこんな感じです。

Ubuntu 20.04の使用感としては「ほとんど苦労せずに快適に使える」ですね。VineLinux使ってたユーザーとしては、Linuxデスクトップってこんなにもまともになってきたんだなあと感慨深いものがあります。

しかし(Macのおかげで)決して流行らないと思いますが・・・笑

Linuxで思い通りのキーマップを設定する【xkeysnail】

LinuxのキーマップはWindowsのそれに近いので、Mac使いにすれば少々使いにくいです。そこでPython製のツールであるxkeysnailを使用して独自のキーマップを設定してみました。いつでもVim風にhjklでカーソル移動できるようになったのでかなり快適。インストールと設定そしてちょっと面倒な自動起動の方法についてまとめます。

xkeysnail

mooz/xkeysnai

from xkeysnail.transform import *

define_keymap(re.compile("Firefox|Google-chrome"), {
    # Ctrl+Alt+j/k to switch next/previous tab
    K("C-M-j"): K("C-TAB"),
    K("C-M-k"): K("C-Shift-TAB"),
}, "Firefox and Chrome")

define_keymap(re.compile("Zeal"), {
    # Ctrl+s to focus search area
    K("C-s"): K("C-k"),
}, "Zeal")

define_keymap(lambda wm_class: wm_class not in ("Emacs", "URxvt"), {
    # Cancel
    K("C-g"): [K("esc"), set_mark(False)],
    # Escape
    K("C-q"): escape_next_key,
    # C-x YYY
    K("C-x"): {
        # C-x h (select all)
        K("h"): [K("C-home"), K("C-a"), set_mark(True)],
        # C-x C-f (open)
        K("C-f"): K("C-o"),
        # C-x C-s (save)
        K("C-s"): K("C-s"),
        # C-x k (kill tab)
        K("k"): K("C-f4"),
        # C-x C-c (exit)
        K("C-c"): K("M-f4"),
        # cancel
        K("C-g"): pass_through_key,
        # C-x u (undo)
        K("u"): [K("C-z"), set_mark(False)],
    }
}, "Emacs-like keys")

↑これは公式のサンプルですが、xkeysnailではこのような定義でキーマップをカスタマイズできます。ベタに修飾キー+何かのキーをマップしたり、ワンショットモディファイヤ(押して離すとXX、押しながらだとYYみたいな)もできますし、Emacsみたいに2ストロークにもできるし、特定のアプリケーションにのみ発動する定義もできたりと、かなり高機能な印象です。

やれることは公式サンプルを見たほうが早いです。

https://github.com/mooz/xkeysnail/blob/master/example/config.py

インストール環境

  • Ubuntu 20.04
  • xkeysnail 0.3.0

インストール方法

公式の手順通りインストールします。Ubuntu 20.04はpython3はデフォルトで入ってますがpipは入ってません。pipをインストールして、そのpipでxkeysnailをインストールします。

$ sudo apt install python3-pip
$ sudo pip3 install xkeysnail

設定

自分のした設定は次のような感じ。

◆config.py
import re
from xkeysnail.transform import *


define_modmap({
    Key.CAPSLOCK: Key.LEFT_CTRL,
    Key.RIGHT_CTRL: Key.LEFT_CTRL,
})


define_multipurpose_modmap({
    Key.Q: [Key.Q, Key.RIGHT_META],
    Key.APOSTROPHE: [Key.APOSTROPHE, Key.RIGHT_CTRL],
})


define_keymap(None, {
    # Vim-like
    K("RSuper-h"): K("Left"),
    K("RSuper-j"): K("Down"),
    K("RSuper-k"): K("Up"),
    K("RSuper-l"): K("Right"),
    # Emacs-like
    K("RC-a"): K("Home"),
    K("RC-e"): K("End"),
    K("RC-d"): K("Delete"),
    K("RC-h"): K("Backspace"),
    K("RC-k"): [K("Shift-End"), K("Delete")],
    # Mac-like
    K("Super-Backspace"): [K("Shift-Home"), K("Backspace")],
    # Eclipse-like
    K("Shift-Enter"): [K("End"), K("Shift-Enter")],
    K("C-Shift-Enter"): [K("Up"), K("End"), K("Enter")],
})

Vim風カーソル移動

すべてのアプリケーションにおいて、q + h/j/k/lでカーソル移動ができるようにしました。なんでqなの?となるかもしれませんが、通常の修飾キー(Ctrl/Alt/Shift/Window)を使用すると、他のショートカットとバッティングしたり、修飾キーを離した時にワンショットが発火してしまったりとトラブルになることが多いです。例えば、最初はqではなく左Winキー + h/j/k/lでカーソル移動できるようにしていたのですが、アプリケーションによっては左Winキーを離した時に発火してしまい、Gnomeのアクティビティ画面が表示されてしまうという不都合がありました。左Winではなく右Winにするとアクティビティ画面は起動しないのですが、キーボードによっては右Winキーが無かったりするので万能ではありませんでした。

というわけで凝ったことをするなら「修飾キーではない通常キーを修飾キーとして使う」方が筋がいいと思います。

で、どうしてqキーを選んだかというと、

  • 頻繁に使わない
  • 左手のホームポジションから小指が容易に届き、右手のhjklにも無理がない

という理由でqにしました。

上記config.pyの次の部分がqを修飾キーとしても使えるようにする設定にあたります。

define_multipurpose_modmap({
    Key.Q: [Key.Q, Key.RIGHT_META],
    ...
})

define_multipurpose_modmap という関数で複数目的の修飾キーを設定できます。ここでは『qを押して離すとqキー』『押しっ放しの間はRIGHT_META(右Winキー)』という設定にしています。押しっ放しのときに右Winというのがポイント。

そしてカーソル移動を実現している設定は次の部分にあたります。

define_keymap(None, {
    # Vim-like
    K("RSuper-h"): K("Left"),
    K("RSuper-j"): K("Down"),
    K("RSuper-k"): K("Up"),
    K("RSuper-l"): K("Right"),
    ...

RSuper というのが右Win(RIGHT_META)にあたります。なんでキーの指定の仕方が違うんだよって思うかもしれません。このあたりは公式のソースを見てみてください。

https://github.com/mooz/xkeysnail/blob/master/xkeysnail/key.py

Emacs風キーマップ

Emacsはちょっとしか触ってこなかったですが、結構便利だったなと思うキーマップがあったので取り入れてみました。こちらは'で発動するようにしています。このアポストロフィ(シングルクォート)はUSキーボードだと右手の小指ですぐに押せます。

define_multipurpose_modmap({
    ...
    Key.APOSTROPHE: [Key.APOSTROPHE, Key.RIGHT_CTRL],
})

押しっ放しにしたときは右Ctrlキーになります。

この右Ctrlを使ってEmacs風キーマップを設定します。

define_keymap(None, {
    ...
    # Emacs-like
    K("RC-a"): K("Home"),
    K("RC-e"): K("End"),
    K("RC-d"): K("Delete"),
    K("RC-h"): K("Backspace"),
    K("RC-k"): [K("Shift-End"), K("Delete")],
    ...

これらはMacならデフォルトでCtrlキーに割り当てられてます。結構色んなところで標準で取り入れられてるキーマップなので、Vimmerでも覚えておいたほうがいいかと思います。

なお、右Ctrlキーを割り当てちゃうと、普通の右Ctrl+a/e/d/h/kが使えなくなるんじゃね?と思うかもしれませんが、先の設定で右Ctrlは左Ctrlに変更しているので大丈夫です。

define_modmap({
    ...
    Key.RIGHT_CTRL: Key.LEFT_CTRL,
})

なんだかすごくややこしい話ですが、要するに

  1. 元の右Ctrlは左Ctrlにマップして退避
  2. ' を押しっぱなしの間は1でフリーになった右Ctrlにマップ

というふうになっています。ちょっと混乱する場合は、落ち着いてconfig.pyを上から見ていってくだされ。

Mac風キーマップ

Mac用のUSキーボードでLinuxを使っていると、「カーソル位置から行頭まで削除」するのに、ついついCMD+Backspaceを押してしまうんですよね・・・。このショートカットはかなり使用頻度が高いので、Linuxでも実現しておきます。

define_keymap(None, {
    ...
    # Mac-like
    K("Super-Backspace"): [K("Shift-Home"), K("Backspace")],
    ...

通常であればCMDキーがWinキーに割り当てられているはずです。SuperはWinキーなので、つまりCMD+Backspaceを押すと行頭まで削除してくれるようになります。ただ、行頭まで削除をShift+Home→Backspaceで実現しているだけなので、Vimのような特殊な(?)環境下では上手くいきませんが、そこはご愛嬌ということで。

なお、本気でカスタマイズしたいなら、アプリケーションごとに設定を施すこともできます。例えば公式の例には、Google ChromeとFirefoxにのみ有効な設定例が載っています。

define_keymap(re.compile("Firefox|Google-chrome"), {
    # Ctrl+Alt+j/k to switch next/previous tab
    K("C-M-j"): K("C-TAB"),
    K("C-M-k"): K("C-Shift-TAB"),
    ...

Eclipse風?キーマップ

eclipse固有のものではないですが、Shift+Enterでカーソル下に行を挿入、Ctrl+Shift+Enterでカーソル上に行を挿入、というものがあります。あれってプログラミングしてるとすごい便利だなあと感じることが多いです。というわけで、どんなエディタにも必要だと感じたので設定してみました。

define_keymap(None, {
    ...
    # Eclipse-like
    K("Shift-Enter"): [K("End"), K("Shift-Enter")],
    K("C-Shift-Enter"): [K("Up"), K("End"), K("Enter")],
})

ポイントは、Shift+Enter時の最後にEnterではなくShift+Enterを送っていることです。これは、エディタによっては元々Shift+Enterにショートカットが割り当てられていることがあるため、それを殺さないようにするためです。例えばWordpressでも、通常のEnterのみと、Shift+Enterでは違います。Wordとかもそうだったかな?そういったアプリ固有のキーマップを活かすようにしています。

自分の設定を試す

自分で作成したconfig.pyですが、xkeysnailを実行して実際に試してみます。

試すには次のようにxkeysnailをrootで実行して設定ファイルを指定します。

$ sudo xkeysnail config.py

たぶんエラーが出ると思います。セキュリティ上の理由でrootはroot以外のユーザーが起動したXサーバに接続することができませんのです。xhostコマンドでrootを一時的に追加します。

$ xhost +SI:localuser:root

もういちどxkeysnailを実行してみましょう。実行したターミナルはそのままにしておいて、他のアプリケーション上で設定したキーマップを試してください。うまく設定できました?

自動起動

うまく設定できたらsystemdに登録して自動起動するようにしておきます。xkeysnailはrootで実行する必要がありますが、どっちみち先程のxhostコマンドは一般ユーザーで実行する必要があるので、一般ユーザーで起動するようにしたほうがラクです。というわけで一般ユーザーに必要な権限だけ与えて、user環境のsystemdに登録することにします。

まずはグループを作成します。uinputというグループ名にします。

$ getent group uinput  # 一応すでに存在しないか見ておく
$ sudo groupadd uinput

できましたら、inputと先程作成したuinputグループにユーザーを追加します。

$ sudo usermod -aG input,uinput あなたのユーザー名
$ getent input   # 確認
$ getent uinput  # 確認

あなたのユーザーがinput, uinputグループに追加されていることを確認しました。

続いてudev ruleを作成します。作成場所は/etc/udev/rules.dの中です。

◆/etc/udev/rules.d/70-input.rules
KERNEL=="event*", NAME="input/%k", MODE="660", GROUP="input"
◆/etc/udev/rules.d/70-uinput.rules
KERNEL=="uinput", GROUP="uinput"

上記2ファイルを配置したら、一旦PCを再起動します。

続いて、以下のファイルを~/.config/systemd/userに作成します。ディレクトリがなかったら作ってね。あなたのユーザー名は適宜変更してください。

◆~/.config/systemd/user/xkeysnail.service

[Unit]
Description=xkeysnail

[Service]
KillMode=process
ExecStartPre=/usr/bin/xhost +SI:localuser:root
ExecStart=/usr/local/bin/xkeysnail /home/あなたのユーザー名/.config/xkeysnail/config.py
Type=simple
Restart=always
RestartSec=10s

# たぶん :0 で問題ないと思いますが環境にもよります。`echo $DISPLAY`の値を設定してください
Environment=DISPLAY=:0

[Install]
WantedBy=default.target
軽くポイントを説明しておくと、

  • ExecStartが実行コマンドです
  • ExecStartPreが実行コマンド前に実行するコマンドです(さっきのxhostコマンド)
  • 落ちたりしたら自動的にリスタートするようにしていますが、そのリトライはRestartSecで10秒後を指定してます

といった感じです。

では次にキーマップ設定であるconfig.pyを~/.config/xkeysnail/config.pyに配置してください。

ではサービスとして登録しましょう。

$ systemctl --user enable xkeysnail

登録できたら起動してみます。

$ systemctl --user start xkeysnail

ちゃんと起動しているかステータスも見ておきます。

$ systemctl --user status xkeysnail
● xkeysnail.service - xkeysnail
     Loaded: loaded (/home/あなたのユーザー名/.config/systemd/user/xkeysnail.service; enabled; vendor preset: enabled)
     Active: active (running) since Sat 2020-04-25 14:24:57 JST; 3h 6min ago
    Process: 6409 ExecStartPre=/usr/bin/xhost +SI:localuser:root (code=exited, status=0/SUCCESS)
   Main PID: 6410 (xkeysnail)
     CGroup: /user.slice/user-1000.slice/user@1000.service/xkeysnail.service
             └─6410 /usr/bin/python3 /usr/local/bin/xkeysnail /home/あなたのユーザー名/.config/xkeysnail/config.py

Active: active (running) になっていれば成功です。設定したキーマップを試してみましょう。

というわけで快適なLinux生活になりました。作者には強いありがたみ感じます。