Karabiner-Elements と Hammerspoon を持って Sierra に行こう

完全に出遅れた感のある内容ですが、Karabiner を捨て、Karabiner-Elements と Hammerspoon をインストールし、Sierra に移行しました。

Karabiner
Karabiner-Elements
https://pqrs.org/osx/karabiner/

Hammerspoon
http://www.hammerspoon.org/

追記: Sierra の標準機能でキーリマップする方法があったので Hammerspoon だけ握りしめて Sierra に来ました。
http://qiita.com/hetima/items/b475997008dabd567da0

Karabiner で行っていたカスタマイズは単純なリマップと、「かな」キーをモデファイキーとして使い、空打ちした場合「かな」を出力するというものでした。試しに作ってみた程度で本格的には導入していませんでしたが。

とりあえず空打ち可能なモデファイキーを Hammerspoon で実現することにしました。どうせなら汎用的に使えるようなものにしようとライブラリを作りました。

hyperex
https://github.com/hetima/hammerspoon-hyperex

というわけでこの記事は実質的に hyperex の宣伝です。

僕の init.lua はこんな風になっています。

local KEY_EISU = 0x66; local KEY_KANA = 0x68;
local KEY_LBRA = 30; local KEY_RBRA = 42;
local KEY_ATMARK = 33; local KEY_COLON = 39;

local hyperex = require('hyperex')
local hx = hyperex.new('f18'):setInitialKey(KEY_EISU):setEmptyHitKey(KEY_KANA)
hx:bind(KEY_LBRA):to('8', {'shift'}) --(
hx:bind(KEY_RBRA):to('9', {'shift'}) --)
hx:bind(KEY_ATMARK):to('3', {'shift'}) --#
hx:bind(';'):to('2', {'shift'})
hx:bind(KEY_COLON):to('7', {'shift'})
hx:mod({'cmd'}):to('any')

冒頭でよく使うキーを定数化しています。

local hyperex = require('hyperex')
local hx = hyperex.new('f18')

hyperex.luainit.lua と同じ ~/.hammerspoon に配置して require() で読み込み、new()インスタンスを作ります。
コンストラクタにモデファイキーにしたいキーを渡します。かな キー(PC 用キーボードなので正確には変換キー)を Karabiner-Elements で F18 にリマップしているので、このインスタンスかな キーを押したときに作動します。リマップした理由は後述します。

hx:setInitialKey(KEY_EISU):setEmptyHitKey(KEY_KANA)

コンストラクタに続けてメソッドチェーンで設定をしています。setInitialKey() は基本キーが押されると同時に出力されるキーです。この例では かな を押すとただちに 英数 が出力されます。

setEmptyHitKey() は基本キーを押したけれど何もせずに離した場合に出力されるキーです。いわゆる空打ちです。この例では かな が出力されます。Hammerspoon では hotkey に使ったキーと同じキーを含むイベントを直後に送出できない仕様があります。ここで かな を出力するためには かな 以外のキーを基本キーにしないといけないのでリマップしているというわけです。

これらの設定はもちろん省略可能で、何も設定しなければプレーンなモデファイキーとして動作します。

hx:bind(';'):to('2', {'shift'})

初期設定が終わったらショートカットを登録していきます。例えばこれは基本キーを押しながら ; キーを押したら shift+2 を出力するという設定です。

hx:mod({'cmd'}):to('any')

そして最後のこれは、すべてのキーに cmd モデファイアを付け足して出力するという設定です。基本キー+a などと打ったら cmd+a が出力されます。基本キー+shift+a などと他のモデファイキーも押していたら cmd+shift+a となります。
hotkey に使ったキーと同じキーは使えないと書きましたが、hyperex で hotkey を使っているのは最初に押す基本キーだけで、他は eventtap を使っているのでこういうことが可能です。
対象キーが重複する場合は、先に設定した方を優先します。また、 mod() よりも bind() が常に優先されます。

mod() を活用すれば「矢印キーは cmd+opt+矢印、FKey は cmd+ctl+* その他は cmd+*」というような変則的なモデファイキーも作れます。

hx:mod({'cmd', 'alt'}):to('left', 'right', 'down', 'up')
hx:mod({'cmd', 'ctrl'}):to('fkeys')
hx:mod({'cmd'}):to('any')

追記:モデファイキーを hyperex の基本キーに設定できるようアップデートしました。左右のコマンドキーを空打ちするとそれぞれ 英数かな に変更する設定はわずか2行です。

local hxLCmd = hyperex.new('cmd'):setEmptyHitKey(0x66)
local hxRCmd = hyperex.new('rightcmd'):setEmptyHitKey(0x68)

これまで Lua には触れたことがなく多少の不安がありましたが、変態的で面白い言語ですね。

追記:ターミナル.app の「キーボード入力のセキュリティを保護」をオンにしていると、Hammerspoon の eventtap 監視機能が無効になるようです(keyStroke や hotkey は使えます)。hyperex はこの影響を受けます。保護オンにしたまま回避するのは難しいと思われます。

一人で Slack を始めてみた

チームチャット系の web サービス、存在は知りつつも使う機会に恵まれず傍観していたのだけど、HipChat が無料化されたのを機に Slack に登録してみました。一人で。HipChat も一応アカウント取ったんだけど、Slack の方がなんかオシャレだったので。

とりあえず一人で使ってみると、どこにも発信されない独り言をぼそぼそ呟いているだけで悲しくなれます。Slack には最初から bot がいるので多少寂しさは紛れます。URL を貼ると要約を自動で展開してくれるので賑やかです。twitter integration を使って自分の tweet を流し込んでみたり、一人でもいろいろ活用する術はあるのではないでしょうか。短いメモを断続的に記録していく Day One 的な使い方が適していると思われます。
日本語の検索は問題なくできるのですが、上記の URL を貼って自動で展開される要約部分はヒットしません。twitter integration で流し込まれる本文も同じ扱いなので検索できません。非常に惜しいところです。

f:id:hetima:20140529224457j:plain

日々のメモをため込んでおくくらいなら無料プランでもじゅうぶん使えますが、有料プランにすると、5個しか使えない integration が無制限になったり、検索できる過去ログの件数もやっぱり無制限になったりと便利なのですが月8ドル、1年分一括でも80ドルとかなり高いです。有料プランを検討するなら月2ドルの HipChat の方が有利です。ただし、Slack は紹介リンクで100ドル、登録途中のアンケートに答えると100ドル、合計200ドルのクレジットがアカウントにチャージされるので、一人なら約2年間無料で使えます。このクレジットは60日で期限が切れる模様ですが、期限が切れる前に有料プランにすると全額使い切るまで有効だと FAQ に書いてありました。どうせ失効するなら使わないと損ですが、有料プランに移行するときにクレジットカードの登録が必要です。チャージされているクレジットが初回支払い額より多ければカードから引き落としはされません。登録後すぐにカード情報を削除しても問題ありません。

このリンク から登録すると紹介リンクボーナス100ドル貰えます。

最初は100ドル単位でばらまいて採算取れるのか不思議でしたが、これはユーザーに対してではなくチームに対してチャージされるものなので、10人参加しても100ドルx10にはならず、多人数のチームであればわりとすぐに100ドル消費してしまいます。逆に一人であれば100ドルでかなりの期間遊べるというわけです。

既にどこかのチームに所属している人もトップページから登録すると自分が管理者になるチームを作れます。同じメールアドレスを使ってもチームごとに別アカウント扱いです。自分が管理者になる新規チームを作るときには紹介リンクやアンケートが使えるので200ドルチャージされます。プライベートな場所、あるいは Slack の動作確認などに活用できるかと思われます。

WWDC 2014 予想 #expectWWDC

はてなのエンジニアもWWDC 2014に参加します!皆さんもWWDCの予想をしてみませんか!! #expectWWDC - Hatena Developer Blog

Shift キーを12個増やす

KeyRemap4MacBook を使います。private.xml を開いて、以下のような item を追加して ReloadXML。

単独で押すと普通に FKEY の挙動。押したまま他のキーを押すと Shift を押しながら〜の挙動になり FKEY は発動しません。 これで Shift キーから遠い上段の記号類のすぐ上に巨大な Shift バーが追加されたようなもの。片手で楽々入力できます。

この設定を施して1年ほど経ちますが、体に覚え込ませるまではならず、結局 Shift キー押すことの方が多いです。FKEY 遠いですもんね。

FKEY の判定がキーアップ時になってしまうため、困る場合は適宜 autogen タグを減らしましょう。

Finder のリスト表示に特別な項目を表示する

さっき気付いたんですけど Finder のリスト表示に音楽ファイルのアルバムとか画像の大きさとか表示することができるようです。

特定の名前がついたフォルダ、またはそのサブフォルダをリスト表示にしていると、表示できる項目が増えます。ヘッダのコンテクストメニューから追加することができます。

フォルダ名と追加される項目の対応は以下の通り。他にもあるかもしれません。

Music : アルバム、作成者、再生時間、年、ジャンル、レート、タイトル、トラック番号
Image Pictures : 大きさ、解像度
Movies : 大きさ、再生時間、タイトル、コーデック

これはホームフォルダにある Music、Pictures、Movies 用の特別なオプションなのだろうと推察されますが、ホームフォルダ直下に限らずどこに置いていても、フォルダ名さえ一致していればこのオプションが使えます。
1文字目は大文字である必要があり、小文字の「music」は認識されません。「Musics」「ImageFiles」というように該当の単語で始まっていれば認識されます。

Dropbox から Copy に乗り換えた話と同期がとれなくなったときの対処

Dropbox が一時不安定になったのをきっかけに同種サービスの Copy に乗り換えてみようと思った。サーバに接続できないトラブルはどちらにしても起こりえるし、Dropbox はほぼ復旧済みのようだが、単純に Copy の方が容量が多いという理由。

実際使ってみると、クライアントアプリケーションの使い勝手はほぼ同じ。同期するフォルダは1箇所しか指定できないが、項目ごとに同期を外せるのが便利だったので、しばらくは Copy で行こうと思う。

「項目ごとに同期を外せる」利便性をひとつ挙げると、同期はしたくないがバックアップはしておきたいていうフォルダを作って同期をオフにしておけばクラウド上にのみ保存されるバックアップになる。web ブラウザからアップロード/ダウンロードする手間があるけれど。まとめてダウンロードしたくなったら同期をオンにすれば勝手に全部降ってくる。

f:id:hetima:20140113211615j:plain

Windows マシンにあるいくつかのフォルダを Mac に保存したいという目的があった。同期するフォルダは1箇所しか指定できないが、Windows 側でショートカットを Copy フォルダ内に作れば複数の場所を集約できる。
まず同期フォルダのトップに「Windows」というフォルダを作ってこれを Windows との同期専用にする。Windows 上ではこのフォルダ以外の同期チェックを外しておく。「Windows」フォルダの中に同期させたいフォルダのショートカットを入れる。きちんとフォルダとして同期されるし、オリジナルのフォルダに Copy 管理下に置かれている印が付く。Mac 側ではもちろん普通のフォルダとして扱われる。ただしショートカットであるため名前に .lnk の拡張子が付いている。これを変更すると Windows のショートカットが壊れてしまうので危険。シンボリックリンクかジャンクションにしておいた方がよさそう。
それから Copy フォルダのトップに新たなフォルダを作るとすべてのデバイスで同期する設定になっているので、同期させたくないデバイスではその都度同期を外す必要がある。

環境を構築している時に乱暴な構成変更などをやって、同期がうまく降ってこないことが何度かあった。そんな時は項目ごとに同期を外せる機能を利用して、対象フォルダの同期オフ→同期オンを行うとうまく行くことが多い。同期オフにするときローカルファイルを削除するかどうかを選べる。クラウド上が最新でフォルダの容量が大きすぎない場合は一旦削除した方がスムーズに再同期できるんじゃないかな。

というわけで今のところサブ Windows のファイルをメイン Mac に吸い上げるという目的でしか使っていないが、デバイスごとに同期する項目を選択できるのが非常に便利だった。容量も無料で15GB、紹介リンク経由で登録すれば +5GB で 20GB とかなり多いのでおすすめ(私の紹介リンクはこちらです https://copy.com?r=NA1tE1)。このリンク経由で登録した後、MacWindows かモバイルアプリをインストールしてアプリからログインすると 5GB 増える。

Mavericks のタグをちょっと調べた

カラータグを複数つけると見た目は複数適用されているが、ラベル属性は1種類しか適用されない。kMDItemFSLabel は複数の値を持てない。ラベルで検索するとラベル属性として採用されているひとつの値でしかヒットしない。

Finder でのタグ編集時「,」は区切り文字として扱われる。「,」を含む文字列をペーストしても分割される。

Automator などでラベルを付けるとデフォルトのカラータグが付く。デフォルトのタグ名を変更、あるいは削除している場合も、システムデフォルトの「レッド」「ブルー」などが付く。例えば青いラベルを「Blue」に変えていたとしても付加されるタグは「ブルー」となり、「Blue」タグでは検索にかからない。ラベルは青いものがちゃんと付いていて、ラベルで検索すると該当する。
カラータグを削除している場合は「ブルー」のタグが付き、ラベルも青くなるが、タグ自体には色が付かない。タグとは関係なくカラーラベル属性を持っているように見える。タグを編集すると「ブルー」タグに色が付く。タグに色が付く前に削除するとファイルのラベル属性も消える。関連してないわけではないらしい。

kMDItemUserTags と com.apple.metadata:_kMDItemUserTags は厳密には違う。前者はタグの名前しか持たないが、後者はカラーラベル情報も持っている。 参考:OS X 10.9 Mavericks: The Ars Technica Review | Ars Technica

Finder 環境設定の挙動

  • タグを既にリストに存在する名前にリネーム→既に使用されていると言われ変更できない
  • タグを削除→ファイルに付いているタグも消える。 デフォルトのカラータグを削除すると旧 OS で付けていたカラーラベル属性も飛んでしまうので注意

zip で退避させるとどうなるか

  • 無色のタグを付けたファイルを zip にして退避→タグを削除→zip 解凍→ファイルにタグは残っている
  • →そのタグに色を付ける→zip 解凍→解凍したファイルに色は付かない(kMDItemFSLabel=0)
  • →更に色を変える→ここで解凍したファイルに色がつく
  • 解凍後 Finder 環境設定でタグ名を変更→解凍したファイルのタグも変わる。色は付かないまま
  • →しかし情報を見るなどで表示すると色付きタグになっている→他のタグを追加してみると更新されて色が付く

カラータグを付けたファイルを zip にして退避

  • →そのタグの色を変える。→zip 解凍→タグ名はそのまま色が変わる(現在のタグに付いている色になる)
  • →そのタグの色を戻す→zip 解凍→タグ名はそのまま色もそのまま(現在のタグに付いている色==圧縮前の色)
  • →そのタグを無色に→zip 解凍→タグ名はそのまま無色(現在のタグ同様無色になる)
  • →そのタグを削除→zip 解凍→ファイルにタグは残っている色も付いている(圧縮前の色)
  • 解凍した直後なぜか一瞬デフォルトのカラータグ名が見える

無色タグとカラータグを付けて zip 退避

  • →無色タグに色を付ける→zip 解凍→無色タグだったタグに色が付く(無色タグのみと挙動が異なる)
  • →カラータグを無色に→zip 解凍→両方無色(現在のタグ同様無色になる)
  • →カラータグを削除→zip 解凍→両方無色だが圧縮前の色が残っている変な状態

以上、条件がややこしくて間違ってるとこがあるかもしれません。圧縮解凍のケースはそんなに重要じゃないです、文章量を稼いでるだけです。とりあえずデフォルトカラータグの削除には気をつけましょう。