zshで補完を自動で表示してくれるauto-fu.zshの簡単な紹介と、指定文字以上から補完を始めるようにする変更の方法

auto-fu.zshzshで自動的に補完の候補を表示してくれるスクリプトzshには本来の機能でpredict-onがあり、こちらも似たようなことをしてくれるけど、いろいろ挙動が異なります。自分が使ってみたところ以下のような違いがあったように感じました。間違ってるかもしれないし、もっと違うかもしれません。

  • predict-onは過去の履歴を調べて補完候補を出すが、auto-fuは単純に一致するものを出している?
  • auto-fuは補完部分に色が付いたりする
  • predict-onは補完候補の一覧がでてくるタイミングがまちまちだが、auto-fuは一文字毎にカーソル位置にあった補完候補の一覧が表示される

predict-onよりauto-fu.zshの挙動のほうが好みのような気がしたので試用しています。ただ少し気になることがあって、それは一文字目から補完が開始されること。最初の何文字かは無視してほしい。そのような動作をさせるために以下のような変更をしました。

diff --git a/auto-fu.zsh b/auto-fu.zsh
index e3856d9..8a8fedc 100644
--- a/auto-fu.zsh
+++ b/auto-fu.zsh
@@ -416,6 +416,10 @@ with-afu-compfuncs () {
 }
 
 auto-fu () {
+  if [[ $#BUFFER -lt 3 ]] then
+    return
+  fi
+
   emulate -L zsh
   unsetopt rec_exact
   local LISTMAX=999999 

これで3文字未満は補完候補が表示されません。ひとまずその場しのぎで書いたものの、'3'という値は設定ファイルあたりで指定できるようにしたいので、zshの書きかた調べて修正したいと思ってます。

zshのanything.elやunite.vimっぽい機能を実現するzaw.zshの簡単な紹介と、予めsourceを指定したキーバインドを設定する方法

巷にはemacsanything.elを呼び出してzshで幸せになる方法があるようですが、emacs入れる必要があるのでvimに改宗した私としては導入が面倒でやりたくありません。うれしいことに、ちまたにはzaw.zshというものがあり、これはzshだけで実装されたanything.elっぽい処理をしてくれるスクリプトらしいです。導入は簡単で、git cloneしてzaw.zshを読み込むだけ。ただしzsh-4.3.10が必要です。4.3.9だとエラーがでました。

$ git clone https://github.com/nakamuray/zaw
$ cd zaw
$ source zaw.zsh

あとは '^X;'(デフォルトのbindkey)を押すと、sourceの一覧が表示されるので、適当に選択。historyあたりがわかりやすいかも。sourceを選択すると、あとはリストからのインクリメンタルな絞り込みができる。どこかでhistory-incremental-pattern-search-{backward,forward}を設定するとlife changingになるよ!!!!!!!!!!!!!!!!とかありましたけど、zaw.zshなら絞り込まれた結果が一覧できてもっとlife changingだと思います。設定も上記のように簡単ですし。

本題

ただ、気になることは、毎度sourceを選択する必要があるところ。個人的にはhistoryとか頻繁に使いそうなので、ここは1hopで操作できるようにしたい。これを実現するには以下のような設定を行えば良いみたいです。

zsh-history() {
  zaw zsh-src-history
}
zle -N zsh-history
bindkey '^Xh' zsh-history

もともとzawの実装であるzaw関数は引数にsourceを指定できるようなので、sourcesフォルダの中をみて、historyのsourceの関数名を探して指定し、新しいwidgetを作成しただけです。

これでCtrl-x hと押すと即historyの一覧が表示されてlife changingですね。まだあまりanything.elとかunite.vimの便利さをばりばり体感しているわけではないので、それらに慣れるといくつか機能追加したくなる気がしますが、ひとまずこれで幸せになれそうです。

zshのコマンドラインスタック(buffer stack)を表示させながら次のコマンドを入力する方法

zshにはbuffer stackという仕組みがあって、これを使用すると入力途中のコマンドを一時的に保留しておいて、別のコマンドを実行した後、再度続きから入力することができる。

以下buffer stackの使用例

# 以下は自分で入力していて、実行前にdfで確認したくなったとする
$ tar xvzf hoge.tar.gz
# ESC-q を押下
# するとbufferが空になる
$ 
# 改めてコマンドを入力
$ df -h
...
# コマンド実行後、stackに退避していた入力途中のコマンドが自動的に入力された状態になる
$ tar xvzf hoge.tar.gz

zshのブログ記事などを見たりするとこの機能が便利便利言ってる人がいるけど、私は結局使ってない。理由はいろいろあると思うけど、その理由の一つとして

  • 退避したスタックが見えない

というのがあると思ってる。この理由は結構大きいと思っていて、例えば、ある仕事をしていてPCと向き合っていたとする。そんなとき同僚に話しかけられてちょっと雑談したあと、再度PCの画面を見る。すると、いままで自分がしていた仕事がふっと頭から抜け落ちることがある。そんな自分にはbuffer stackが表示されない時点でなぜ今新しいコマンドを入力しようとしているか振り替えることができないから、あまり便利に思えなかった。

改めて調べてみると、保留しておいたコマンドを簡単に表示させておくことができたので、以下にその設定を載せる。

show_buffer_stack() {
  POSTDISPLAY="
stack: $LBUFFER"
  zle push-line
}
zle -N show_buffer_stack
bindkey "^[q" show_buffer_stack

内容は単純で、ESC-qを押す前に表示されていたコマンドをPOSTDISPLAYで表示させているだけ。課題として、再帰的なpush-lineには対応していないので、そのあたりを便利に感じている人にはこれでは不十分であること。ただ、これで不満に思っていたことが一つ解消されたので、これから活用していく良い切っ掛けになると思う。

appstoreでアップデートできるソフトウェアがあるのに更新できないときの対処法

以下のダイアログが表示されてアップデートできなかった。

ほかのアカウントで使用可能なアップデートがあります
"(null)"用のアプリケーションをアップデートするには、そのアカウントでサインインしてください。

私のときの原因は、設定したのを忘れる程度に昔に設定した、spotlight無効化が原因。以下の手順でindexを再構築したらアップデートできるようになった。

$ sudo mdutil -i off /
$ sudo mdutil -i on /
# 右上のspotlightのアイコンクリックして、再構築のprgress barが表示されてることを確認

参考
https://discussionsjapan.apple.com/message/100577919

tmux

screen-keys.conf
http://tmux.cvs.sourceforge.net/viewvc/tmux/tmux/examples/screen-keys.conf?revision=1.7

cp screen-keys.conf ~/.tmux.conf

もしも.tmux.confを変更しても設定が反映されていなかったら、tmuxのプロセスが生きてる可能性がある
psで調べて適宜killしてからtmuxを再起動すること

prefixはC-tに変更

set -g prefix ^T
bind t send-prefix

以降必要に応じて修正予定

iTerm2

羅列だけのメモ。

公式 : http://code.google.com/p/iterm2/
スクリーンショット付き機能紹介:http://sites.google.com/site/iterm2home/screenshots

すこし試してみて気になる機能

  • visor風味の動作設定
  • 背景透過
  • 256色
  • autocomplete (cmd+;)
  • 範囲選択した時点でclipboardに

synergyでキーボードによるscreenの切り替えを設定する方法

背景

synergyには以下のようなGUIで簡単に設定できるようなツールがある。

これらを使用すると簡単に設定できるものの、一部設定できない項目がある。キーボードによるscreenを切り替え設定もその一つ。

普段xmonadとかvimperatorなどを使用してキーボード主体で生活しているため、synergyの切り替えもキーボードで操作したいと思ったのが動機。

基本設定

今回例に挙げる、自分が使用している以下の状況の設定をメモ。

  • mac
    • server. こちらのキーボードとマウスを共有。
  • ubuntu
    • client.

macの右端とubuntuの左端をつなげて、マウスで行き来できるようにする。この設定ではまだキーボードで移動はできない。section: screensにはそれぞれのPC名を指定する。

mac$ vim synergy.conf
section: screens
  mac:
  ubuntu:
end

section: links
  mac:
    right = ubuntu
  ubuntu:
    left = mac
end

この時点でおかしな点がないか動作確認。'-f'はsynergyをforegroundで動作させるオプション。正常に設定できているのなら、その旨のメッセージが表示される。

mac$ synergys -f --config synergy.conf
ubuntu$ synergyc -f mac

キーボードによる移動の設定

ここから本題。前述の設定に以下のsectionを追加する。

mac$ vim synergy.conf
section: options
  keystroke(alt+control+a) = switchToScreen(mac)
  keystroke(alt+control+s) = switchToScreen(ubuntu)
end

設定を追記したら、^Cやkillなどで、一度synergysを停止し、再度起動する。synergycを再起動する必要はない。設定が正常なら、以下の設定が有効になる。

  • alt + ctrl + a
    • macにフォーカスを合わせる
  • alt + ctrl + s
    • ubuntuにフォーカスを合わせる

synergyにはswitchToScreenというactionが用意されており、これを使用すると引数に指定したscreen名にフォーカスを合わせることができる。keystrokeオプションを設定し、そのactionとしてこれを指定することで今回の機能が設定できる。

その他設定や使用可能なキーの名前は以下のページで確認できる。
http://synergy2.sourceforge.net/configuration.html

toggleで移動する設定

上記の設定は特定のキーを押すとそのscreenに移動する設定だが、同じキーを押すことで順番にscreenを切り替えるように設定することもできる。以下がその設定の全文。

section: screens
  mac:
  ubuntu:
end

section: links
  mac:
    right = ubuntu
    left = ubuntu
  ubuntu:
    left = mac
    right = mac
end

section: options
  keystroke(alt+control+a) = switchInDirection(right)
end

screenにはswitchInDirectionというactionがあり、これを使うとlinks sectionで設定した画面の位置関係で移動するキーバインドが設定できる。screenの両端をそれぞれ繋げることで、switchInDirectionでぐるぐる巡回させることができるようになる。