Archives

Ulysses for Mac の .Ulysses-Group.plist がイカン構造をしている件

Ulyssesのファイルはプレーンテキストだから

さんざんウダウダ言った挙句、Scrivenerを捨ててUlyssesで原稿を書いている現状。

最大の理由は、やはりUlyssesが(外部フォルダにおいて)プレーンテキストファイルを扱えることです。

私は原稿執筆時に青空文庫フォーマットを利用しており、プレースホルダを置いておいて後で置換したりします。

{hoge}hoge[#「hoge」に傍点]に置換したり。最初から青空文庫フォーマットにすると、リッチテキストほどではないにせよ編集が大変)

元データがプレーンテキストであれば、このような処理をスクリプトで自動化することができます。それ以外にも、ファイル名を連番化したり、分割されたファイルを統合したり。

Ulysses自体にもフォーマット変換して出力する機能はありますが、青空文庫フォーマットには対応していないので、自前のスクリプトで処理する必要があるとも言えます。

外部フォルダの文書構造はどこに保存されているのか?

Ulyssesはシート(個々の文書)を任意に並べ替える機能を持ちます。この際、順序情報はどこに保存されているのでしょうか。

Ulyssesに連携したフォルダには、「.UlyssesRoot」「.Ulysses-Group.plist」というファイルが自動生成されます。ここに、フォルダごとのコンフィグ情報や、シートの順序等の情報が格納されています。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>childOrder</key>
<array>
<string>オープニング</string>
<string>紹介</string>
</array>
<key>createMarkedFile</key>
<false/>
<key>sheetClusters</key>
<array>
<array>
<string>序文.txt</string>
</array>
<array>
<string>書誌情報.txt</string>
</array>
</array>
</dict>
</plist>

<key>childOrder</key>下にある<array>はサブフォルダの順序、<key>sheetClusters</key>下にある<array>には直下のシートの順序を、それぞれ子要素として持ちます。

例えばファイル名の連番化をするには、.Ulysses-Group.plistの書き換えとファイルのリネームを同時に行えばよいわけです。

XML構造上の問題

問題は、これが完全なツリー構造ではない点にあります。

<key>childOrder</key>下にある<array>と、<key>sheetClusters</key>下にある<array>を、データ的に区別することは困難です。例えば、XPathで表現すれば、どちらも//plist/dict/arrayとなります。

実用上は、

  • 取得したいのは<string>要素の値と順序のみである
  • childOrdersheetClustersでは階層数が異なる

ということから、例えばxmlstarletでいずれかを選択的に取得することは可能です。

1
2
3
4
5
6
7
8
9
$ xml sel -I -t -v //plist/dict/array/string .Ulysses-Group.plist
Attempt to load network entity http://www.apple.com/DTDs/PropertyList-1.0.dtd
オープニング
紹介
$ xml sel -I -t -v //plist/dict/array/array/string .Ulysses-Group.plist
Attempt to load network entity http://www.apple.com/DTDs/PropertyList-1.0.dtd
序文.txt
書誌情報.txt

なかなかに気持ち悪い。sedで処理することも考えましたが、結局のところ暗黙的な記述ルールに依存したバッドプラクティス臭いスクリプトにならざるを得ません。

plistのルールセットはよく知りませんが、XML的には<key><array>の子要素にすれば済む話でしょう。それか、<array type="childOrder">とかでもいいよ。

なんとかしてほしいのですが、受けが狭すぎて改善要望として投げるのもどうか、ともにょっている次第。

Todoist for Windows の中華フォント問題を解決する

今回のアップデートで直ってなかったので。

漢字が変なフォントで表示されるやつです。

結論としては、中国語の言語ファイルを削除すればOKです。

Todoistのインストールフォルダ(Windows7ではC:\Program Files (x86)\Todoist)内のlocaleフォルダに、言語ファイルが格納されています。

この中の、zh-CN.pakおよびzh-TW.pakを削除/移動/リネームすれば、日本語フォントが適用され、正常に表示されます。

まあ、フォント選ばせてくれれば済む話なんですけどね。

bashシェル関数でオプション解析する

すごく簡単に。

以下を参考。

まとめるとこんな感じ。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
w ()
{
OPTIND_OLD="$OPTIND";
OPTIND=1;
POSTFIX="";
function usage_exit ()
{
echo "Usage: hw [-a] [-p text]"
};
while getopts ap:h OPT; do
case $OPT in
a)
pwd
;;
p)
POSTFIX=" $OPTARG"
;;
h)
usage_exit;
return
;;
\?)
usage_exit;
return
;;
esac;
done;
shift $(($OPTIND - 1));
OPTIND="$OPTIND_OLD";
echo "Hollo World!$POSTFIX"
}

ghq管理下のリポジトリを検索するとき、自分で作ったのから絞り込めるようにした

からの続き。

あれ以来、特に置き場の決まっていないなにかをGithubからcloneするときはghq getして、シェル関数で検索できるようにしています。便利。

しかし、管理下にあるリポジトリが増えるにつれ、自分で作ったリポジトリだけ検索したい場合が増えてきました。

そこで、シェル関数をちょっと弄って、「ghq全体から検索」と「自分で作ったリポジトリの中から検索」を分けてみました。

シェル関数

.bashrcで定義。

参考として、ghq管理下のディレクトリ構成は以下のようになります。

(ghqルートディレクトリ)/(リモートリポジトリのドメイン)/(ユーザ名)/(プロジェクト名)

~/.gitconfigでghqルートディレクトリを指定。

1
2
[ghq]
root = ~/ghq

するとこんな感じ。

~/ghq/github.com/catfist/MyHexo
~/ghq/bibucket.org/catfist/dotfiles

ghq listで検索する場合、ドメインは検索対象になりません。(ユーザ名)/(プロジェクト名)から部分一致検索されます。

1個だけ出力して即cd

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 自分で作ったのだけ(find repositories)
fr ()
{
dir=$(ghq list -p "catfist/"|grep -im1 "$(ghq root)/[^/]*/catfist/.*$1.*")
if [ -d "$dir" ]; then
cd "$dir"
pwd
else
echo "ERROR:No hit";
fi
}
# ghq全体(find repositories all)
fra ()
{
dir=$(ghq list -p|grep -im1 ".*$1.*")
if [ -d "$dir" ]; then
cd "$dir"
pwd
else
echo "ERROR:No hit"
fi
}

pecoで絞り込みしてcd

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 自分で作ったのだけ(ghq+peco)
gp () {
dir=$(ghq list -p catfist/|grep "$(ghq root)/.*/catfist/.*$1.*"|peco)
if [ -d "$dir" ]; then
cd "$dir"
pwd
else
echo "ERROR:No hit"
fi
}
# ghq全体(ghq+peco all)
gpa () {
dir=$(ghq list -p "$1"|peco)
if [ -d "$dir" ]; then
cd "$dir"
pwd
else
echo "ERROR:No hit"
fi
}

Karabinerからホットキー経由で色々する

SimultaneousKeyPressesが楽しすぎる

Karabinerは、いわゆるキーリマップアプリです。つまり、あるキー入力を、別のキー入力に置き換えることができます。

ここで面白いのが、普通の文字キーの同時押しを変換前のキーとして指定できることです。例えば、「C+P」の同時押しを「⌘+C」に置き換えて、コピーするといったことができます。

これを活用すると、指の移動範囲を劇的に減らすことができます。超楽しいです。

実例

色々間違いがあったので、Qiitaで書き直しました。

BetterTouchToolが病気なのでJitouchに乗り換えた

Yosemiteでも直らなかったシリーズ。

BetterTouchToolを使っているとトラックパッドが死ぬ

これまた他に症例を見たことがないのですが、BetterTouchToolを使っていると、トラックパッドが全く機能しなくなる不具合がしばしば発生します。タップもスワイプもクリックも、文字通り全てです。

この場合、同時にDockが表示されなくなり、またApplication Switcher(⌘+⇥)でアイコンが表示されなくなります。(切り替え自体は有効)

そのたびにOS再起動していたのですが、Yosemiteでも直らないどころか頻度アップしたので本気出して検証してみました。

Dockを再起動する…ものの

いろいろぐぐった結果、このあたりの機能は全部Dockプロセスの子プロセスであり、Dockを再起動すると直るらしいことが分かりました。

そこで、症状発生時にターミナルで以下のコマンドを実行してみると、トラックパッドは使えるようになりました。

1
$ killall Dock

しかし、DockそのものとApplication Switcherのアイコンについては、やはり表示されないままです。再起動すると直るのですが。

さらにいろいろぐぐった結果、Window Serverというプロセスが怪しいような気がしたのですが、私の環境だと、起動直後の正常な状態でもWindow Serverプロセスが走っていません。

というわけで、対症療法すら満足にできませんでした。

常駐アプリ同士のコンフリクトが原因?

BetterTouchToolのPreferencesを見ると、TextExpanderとかコンフリクトするから調子悪いときは止めてね的なことが書いてあるので、そもそも不具合の原因がここということは考えられなくもありません。

ただ、優先度としてはTextExpanderのほうが高い(換えが利かない)ので、BetterTouchToolを諦めることにしました。

Jitouchを試す

類似ツールを探してみた結果、Jitouchがよさそうだという結論に至りました。有料アプリですが、高くはないですし。

Homebrew Casksで導入できます。なお、Yosemite対応版はβ扱いになっていますが、Caskで入るのはβ版のほうです。Mavericksユーザは、逆に注意が必要ですね。

1
$ brew cask install jitouch

私の場合、これらのツールに求めるのはトラックパッドでウインドウを右寄せ/左寄せすることです。

Jitouchの場合、「Miximize Right/Left」というアクションが相当します。試してみたところ、挙動もキビキビしてなかなかいい感じ。

BetterTouchToolとJitouchの比較

BetterTouchToolは無料でありながら非常に高機能なアプリであり、キーボードショートカットの作成も可能ですが、とりあえずトラックパッド周りに絞ります。

BetterTouchToolの長所をあえてひとつ挙げるならアクションの自由度ではないでしょうか。

特にスクリプトを実行できることは非常に大きく、出力としてできないことはほぼないといえます。

Jitouchは、指定できるマルチタッチジェスチャが非常に優れています。指数に応じたタップ・スワイプはもとより、タッチしたまま別の指でタップ/スライドや、文字を描くといった指定が可能です。多様なだけでなく、混ざりにくい点も評価できます。

なお、Character Gesture(文字を描く)が最初起動しなくて戸惑ったのですが、通常より離した二本指でタッチする必要があります。人さし指と薬指でやるのがよさそう。成功すると、画面上に軌跡が描かれます。

また、プリセットがなく全部自分で考えろ式のBetterTouchToolに比べ、プリセットが整っているのも長所といえそうです。指定できるアクションも、汎用的でわかりやすいものが揃っています。

ただし、ジェスチャ毎に指定できるアクションが限定されているのは意味が分かりません。自由に組み合わせたらええやん。また、アクションの自由度はBetterTouchToolとは比較にならないほど貧弱です。まあ、「Open file」があるので、AutoMatorでアプリでも作ればたいていのことはできそうですが……。

全体的には、BetterTouchTool…病んでさえいなければという感じなのですが、トキなので仕方ありません。

しばらく、Jitouchで運用してみようと思います。

(2014-12-31追記)Jitouchでも不具合発生

なんともはや……。

こちらは、Jitouchが一切機能しなくなるというものです。しかも、Dockを再起動しても回復しない(Dock再起動時の不具合はキッチリ発生)ときた。

使ってみたらBetterTouchToolよりJitouchのほうが具合よさげなので利用は継続しますが、ほんと、なんなのなの……。

かわせみでも草を生やしたい

現在、Macの日本語入力システムとしてかわせみ2を使っています。句読点変換機能や、2GBメモリにも優しい軽量動作が魅力です。

しかし、唯一気になる点が、ローマ字変換の挙動です。かわせみでは、「wwwww」と入力したとき、自動的に「っっっっw」と変換されます。

すなわち、「w」を連打しても草が生やせないのです。一応Ctrl+Lで全角英字変換はできますが、グルーヴ感が多いに損なわれます。ニコ生で不自由するのです。

まあ、そういう時は全角英字か、Google日本語入力にでもすればいいのですが、できればいつも通りの環境で爆笑したいところです。

かわせみでも草を生やしたい

かわせみではローマ字テーブルの編集が可能であり、例えば私は「zh」を「←」に変換するように設定していますが、上記の挙動については変更できないようです。

そこで、一応の対策としては、自動英字置換があります。「http://」を入力すると英字モードにするとかいうアレです。

「かわせみ2 環境設定 > 自動英字置換」で「+」をクリックし、「ww」を追加します。置換後の動作は「元のモードで継続して入力する」にします。

こうすると、「ww」を入力した時点で、続きも含めた入力文字が半角英字列に置換されるため、草を生やすことができます。

しかし、全角英字列へ変換することはできないため、伝統的な作法からはやや外れます。どうしても全角にしたい場合は、やはり手動で変換するしかないようです。

(2014-12-28追記)capslockの動作変更

スクリーンショット

capslock動作を「ON で全角英字入力」にすることで、capslockを押すだけで簡単に草を生やすことができます。これだと伝統的な作法にのっとった全角wになるため、より理想的です。

Karabinerの設定を弄るためのTIPS

Karabinerは非常に便利なアプリですが、設定画面を眺めたときのワケワカ感がスゴくて尻込みしがちに思われます。

Karabinerが怖くなく、めどくなくなるために。

色々追記するかも。

自分で定義したリマップを有効化するための基本的な流れ

  • private.xmlを書く
    • 「Preferences > Misc & Uninstall > Open private.xml」で保存ディレクトリをFinderで開ける
  • Reload XMLする
    • 「Preferences > Change key」にある
  • チェックボックスにチェックを入れる

private.xmlの参考

色んな記事や公式ドキュメントを参考。

private.xmlの構造

最小構成はこれ。

  • xml
    • root
      • item
        • name
        • indetifier
        • autogen
        • autogen…
      • item…

autogen、itemはいくつあってもよい。

設定画面を開く

Karabinerの設定画面はウインドウとして固定されない。つまり、⌘+Tabで出てこない。

それでいて、普通に開くには「メニューバーのKarabinerアイコンをクリック→Preferences…をクリック」とかなのでめどい。

しかし、SpotlightやAlfredでKarabiner.appを叩けば設定画面が開く。

簡単にReload.xml

Karabinerにはコマンドラインインターフェースが用意されている。

使い方は上記記事の通りだが、reloadxmlが極めて有用。設定画面を起動する必要がなくなる。

/Applications/Karabiner.app/Contents/Library/bin/karabinerにエイリアスを設定しておくと使いやすい。

例えば、.bashrcに以下を追加する。

1
2
alias karabiner='/Applications/Karabiner.app/Contents/Library/bin/karabiner'
alias kreloadxml='/Applications/Karabiner.app/Contents/Library/bin/karabiner reloadxml'

kreloadxmlでリロードできる。

MacVimで簡単に編集したい

Alfred WorkflowでAlfredからprivate.xmlを開けるようにする。

キーワードから以下のbashスクリプトを起動。

1
2
3
PATH="$PATH:/usr/local/bin/" # PATHにmvimコマンドを追加
mvim ~/Library/Application\ Support/Karabiner/private.xml
/Applications/Karabiner.app/Contents/Library/bin/karabiner reloadxml

リロードもしたい。

.vimrcに以下を追加。

1
:command! Kre :!/Applications/Karabiner.app/Contents/Library/bin/karabiner reloadxml

編集後、:Kreでリロード。

Vimの挿入モード抜けるとき英数モードにするアレ(Karabiner設定例)

Vimの挿入モード抜けるとき英数モードにしたい問題

古代からあるアレです。

我々日本人はVimで日本語を入力することがあるわけですが、そのままノーマルモードに復帰すると、ノーマルモードのコマンドを入力したとき、変換されてしまいンアーッってなるやつです。

この対策として、キーリマップアプリを利用して、EscキーにEsc+英数キーを割り当てるという方法が知られています。

このジャンルではKeyRemap4MacBookというアプリが著名でしたが、現在は改名してKarabinerになっています。

今回、Karabinerの設定がまとまりましたので、記事にしてみます。

private.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?xml version="1.0"?>
<root>
<list>
<item>
<name>LeaveInsMode with EISUU(Terminal)</name>
<identifier>private.app_terminal_esc_with_eisuu</identifier>
<only>TERMINAL</only>
<autogen>--KeyToKey-- KeyCode::ESCAPE, KeyCode::ESCAPE, KeyCode::JIS_EISUU</autogen>
<autogen>--KeyToKey-- KeyCode::N, VK_OPTION, KeyCode::ESCAPE, KeyCode::JIS_EISUU</autogen>
<autogen>
__SimultaneousKeyPresses__
KeyCode::J, KeyCode::K,
KeyCode::ESCAPE, KeyCode::JIS_EISUU,
Option::SIMULTANEOUSKEYPRESSES_RAW
</autogen>
</item>
</list>
</root>

only要素でTERMINALを指定した場合、各種ターミナルエミュレータ(で実行されるVim)はもちろんのこと、MacVimでも有効になるようです。

指定内容は以下の通りです。

入力 出力
Esc Esc+英数
⌥n Esc+英数
jk同時押し Esc+英数

徐々にめんどくさくなっていった歴史ともいう。

なお、SimultaneousKeyPressesのオプションをOption::SIMULTANEOUSKEYPRESSES_STRICT_KEY_ORDERにすると、指定した順序で押した場合のみ有効になります。

Key Repeat

ただ、初期設定だと同時押し判定が厳しすぎて押しづらいので調整します。

「Preferences > Key Repeat > Simultaneous Key Presses > Delay Threshold of Key」を50msから200msにしました。

これで、サクッとノーマルモードに復帰できるようになります。

Homebrew Casksの1Passwordが改名していた件

Homebrew Casksの1Passwordが改名していた

ある日、ふとbrew cask listした際に、不穏な結果が出ました。

1
2
$ brew cask list
onepassword(!)

こんなんが含まれていたのです。

で、brew cask info onepasswordしてみると、全ての情報が空になっています。

さらに、brew cask search passwordとかしてみると…

1
2
3
4
5
6
==> Partial matches
1password
1password-beta
1password3
password-gorilla
password-practice

名前変わっとるやん! つーか最初から1passwordにしとけや!

「onepassword」がアンインストールできない

まあ、それなら削除すればいいやと思って、brew cask uninstall
したのですが、これが一晩ほっといてもサッパリ終わりません。かといって、別にエラーが出るでもない。

もうめんどくさくなったので、brew cask info onepasswordでディレクトリ確認して、普通に削除しました。あと/Applicationsディレクトリのシンボリックリンクも。

それからbrew cask install 1passwordしたら普通に使えているので、たぶん大丈夫だと思います。