サポンテ 勉強ノート

サポンテの勉強ノート・読書メモなどを晒します。

Karabiner を卒業し、Hammerspoon に移行してやりたいこと8つ

2018年10月追記

移行を考えているうちに Karabiner の進化がどんどん進み、結局移行の必要がなくなりそうです。

はじめに

キーマップ変更(リマップ)ソフトとして Hammerspoon へ移行を考えています。この記事では「考える」だけで実際にはまだ移行していません。移行作業は Lua スクリプトを組むことになるため時間がかかります。先ずは、自分がどういうことを実現したいかを整理してみます。

サポンテの環境

サポンテは仕事 Windows、プライベート Mac ユーザーです。この二つのプラットフォームには、少なくない差異があります。その差異のうちで戸惑うことが多いのが「キーバインド」です。

キーバインドというのは、どこにどのキーがあって、Shift や Cntrol 等のキーと組み合わせてどんな感じになるのか、といったようなことです。

片方のプラットフォームだけを使っている人、つまり Mac なら Mac だけ、Windows なら Windows だけを使っている人は「JIS キーボードなら同じになるのではないか」と思うかもしれませんが、微妙に違っているのです。

WindowsMac の気になる差異

いくつか例を挙げると、次のような感じになります 1

入力 Mac Windows
アンダースコア キー一つ Shiftキーが必要
モディファイア 4つ 3つ
Excel セル編集 Ctrl + U F2
英数/かな 専用キー トグル

また、Contorl キーはどちらのプラットフォームにもありますが、用途が全く異なります。2

一つ一つの小さな差異から生まれるストレスがボディブローのように効いてくるので、願わくば二つの環境でキーバインドを統一したい。

どちらも物足りない

サポンテは、ただ「統一されて」いれば良いというわけではなく、後述する「SandS(エス アンド エス)」他いろいろなキーバインドを追加して使っています。

「統一」以上の柔軟なリマップが必要なのです。

そのようなわけで、Mac では KeyRemap4MacBook(現 Karabiner )、Windows では nodoka を使っています。これらはいずれも、かなり柔軟な設定ができます。

nodoka

nodoka は Windowsキラーアプリです。サポンテはそう思っています。かなり柔軟にキーマップを替えることができ、ロックモードという独自のモードを最大10個まで持つことができます(1個しか使っていませんが)。

これにより、例えば Emacs でいうところの set mark を実現することができ、且つ、エディタに限らず様々なアプリケーションで共通して使うことができるのです。

もはやこの nodoka 抜きでは考えられないほどの生産性をもたらします。有料ですが、サポンテは数年前に買いました。

nodoka でできないこと

「英数/かな」は専用キーが便利です。現在どちらの入力モードにあるのか確認不要であるためです。

こちらは IME の設定で変更しています。端末が新しくなるたびに設定が必要なのと、リモートデスクトップで別の端末やサーバーを操作する時に使えないので不便しています。可能なら nodoka だけでやりたい。

同じような人はいるようです。

日本語入力の切り替えはトグルじゃダメ、の件 - DTP Transit

KeyRemap4MacBook

(サポンテはまだ Karabiner ではなく KeyRemap4MacBook を使っています)

Windows の nodoka に比べると設定が難しく、ロックモードにあたるものがありません。Shift ロックはできるのですが、それでは意図しないキーバインドにも Shift が適用され困る場合があります。あくまで「擬似的な Shift ロック」であってほしいのです。

そして Hammerspoon

そこで最近 Karabiner 代替として注目を集める Hammerspoon が目に留まりました。Hammerspoon 自体はキーリマップソフトではなく、キーリマップ できるソフトだそうです。

その設定は XML やテキストではなく、スクリプト言語 Lua を使用します。

このことにより、単純なリマップではなく複雑な制御ができるようになるのではないかと期待できます。

まずは SandS

まずは SandS を実現したいと思います。

SandS とは、Space キー 3 を Shift キーとして使用するものです。エンジニアは記号を入力するため Shift キーは多用するのですが左右にあり不便です。

SandS の仕様は以下のようになります。

  • Space キーを普通に押すと Space を入力する。
  • Space キーを押しつつ他のキーを押すと Shift キーとして振る舞う。
  • Space キーを押しつつ他のキーは押さなかったけれども一定時間長押ししたら Shift キーとして振る舞う(Space 入力にはしない)。

これは有名な__文字通り「名前の有る」__ハックなので、間違いなく先人がいるはずです。

これを手がかりに、Hammerspoon をキーリマップに使っているサイトをいくつかさがしてみます。

Lua について

Hammerspoon の設定ファイルは Lua で書きます。Lua は以前一度だけ、Raspberry Pi にて触ったことがあります。まったく始めてでしたが他の言語に似たところが多く、迷うことのない、とても取っ付きやすい言語でした。従って不安はありません。

Programming in Lua プログラミング言語Lua公式解説書

Programming in Lua プログラミング言語Lua公式解説書

実現したいこと

  1. SandS
  2. 英数、かなキーの長押しでコマンドに
  3. Ctrl を組み合わせたキーでカーソル移動
  4. Ctrl + Space で set mark
  5. Ctrl + K で「行末までカット」。set mark モードでは選択範囲だけ。
  6. Ctrl + ; で行頭に移動
  7. Ctrl + Y で「ペースト」
  8. Ctrl + I で編集(Excel のセル編集など)

SandS

やはり、すでに実現している人がいます。

いまさらだけど、Hammerspoon で SandS。2017年最終版 | 夜コーヒー

英数かなコマンド

Hammerspoon で、左右のコマンドキーに英数キー、かなキーのやつ | 夜コーヒー

うーん、これは逆でした。

しかし逆の設定をすればいいですね、きっと。

カーソル移動

これは単純に置き換えで行けます。下記のサイトが参考になるでしょう。

Karabiner 使えない対策: Hammerspoon で macOS の修飾キーつきホットキーのキーリマップを実現する - Qiita

サポンテは単純な Emacs キーバインドが苦手です。左手小指で Ctrl を押しながら F とか A とか E とか辛いです。N と P はそのまま使っています。ですので、いくつかは Emacs 標準と違えてあります。

Emacs標準 サポンテ版
N N
P P
A ;
E H
F .
B ,

set mark

これは参考になるサイトがありませんでしたが、変数を使えば簡単に実現できそうです。

Ctrl + K カット

これも二つのモードによって挙動が異なります。選択範囲カットは簡単そうですが、set mark していないときには「行末までカット」にしなければいけません。つまりクリップボードに入れたいのです。これが難しそうです 4

Ctrl + ; で行頭に移動

Command + ← をマッピングすれば良いと思うでしょう?しかし二段階になってほしいのです。最初にインデント(ハードタブまたはソフトタブ)の終わった箇所に移動し、もう一度実行するとインデントを除いた行頭に移動する、さらにもう一度実行するとインデントの終わった箇所に移動という感じです。Windows ではそのような動きをし、それが便利なのです。

# 最初のカーソル位置
    こんに|ちは
# 最初の実行後
    |こんにちは
# 二回目の実行後
|    こんにちは
# もう一度実行
    |こんにちは

これはさすがに厳しいかもしれませんね。

Ctrl + Y で「ペースト」

mac 標準機能でも Karabiner でも似たようなことができます。しかしクリップボードを共有していないようなのです。共有する設定にしているのですが効いていないようなのです。

Ctrl + I で編集(Excel のセル編集など)

これはアプリケーションごとに設定が必要です。以下のサイトではアクティブなアプリケーションによる判定処理をしているので参考になるでしょう。

Karabiner 使えない対策: Hammerspoon で macOS の修飾キーつきホットキーのキーリマップを実現する - Qiita

スクリプト

実際のスクリプトはかなり長くなりそうです。読み難くならないよう気をつけて作りたいと思います。


  1. この記事では全て JIS キーボードを使うことを想定しています。

  2. Windows キーはアプリケーションで使用するモディファイアというよりシステムで使うホットキーのようなものなので除外します。

  3. Space キーという呼称は JIS 配列のキーボード上での呼称で、US 配列のキーボードでは横方向に大分長いので Space バー と呼ぶそうです。サポンテは左の「英数」キーと右の「かな」キーを多用するため JIS キーボードが手放せません。US 配列で左右のコマンドキーをそれぞれ「英数」「かな」に割り当てるやり方を採っているかたもいらっしゃるようですが、親指の定位置からかなり遠いです。JIS 配列の「英数」「かな」キーの位置あたりがちょうどいいのです。わたしは逆に「英数」「かな」の長押しをコマンドキーにリマップしています。

  4. 難しそうと思ったのですが「cmd + shift + →」「cmd + x」のキーシークエンスをやればいいだけかも。