- Author: harajune
- Filed under: IT
Friday
Sep 18,2009
screenには大変なじみがあるのではないかと思いますが、最近windowの縦分割(左右に分ける)をしたくなり、tscreenやscreenのパッチなど色々と考えた末に、tmuxにしてみました。
理由は特にない(^^;;んですが、使ってみた結果tmuxの方が若干見た目に奇麗であるように感じました。
現在最新版はバージョン0.9なのですが、ドキュメントがなくソースを読むしかない(?)ので、軽く使えるコマンドについて言及したいと思います。
とりあえずmacの人はmacportsにあるのでコマンド一発ではいります。
そして、次は設定ファイルをおきましょう。screenでいうところの.screenrcは、.tmux.confというファイルになります。
私の設定ファイルはこちらをごらんください。
基本的にソースに付属しているscreen-keys.confをもとにしています。
このファイルを.tmux.confにリネームしてホームフォルダに置くだけで、screen風なキーバインドになります。
さて、screen-keys.confだけだとwindowを左右に分割することができないので、以下の設定を書き足してあります。
(他にも書いたんですが、ど忘れ・・・・)
CODE:
-
#layout
-
bind h select-layout even-horizontal
-
bind v select-layout even-vertical
-
bind f select-layout active-only
こうして、tmuxを立ち上げたあとC-a C-Sで画面を分割し、C-a C-hで分割を左右にすることができます。
さて問題はこの「select-layout even-horizontal」というコマンドをどこから見つけてくるかです。ドキュメントがないっぽいので、ソースを見ます。
ビビらなくても大丈夫。大変奇麗に作られてるのですぐに読めると思います。
ソースをここからダウンロードして展開してみてください。
そして、cmd-から始まるファイル名のファイルを探します。これが全部コマンドになっています。バージョン0.9だとこんな感じになっています。
CODE:
-
% ls |grep "cmd-"
-
cmd-attach-session.c
-
cmd-bind-key.c
-
cmd-break-pane.c
-
cmd-choose-session.c
-
cmd-choose-window.c
-
cmd-clear-history.c
-
cmd-clock-mode.c
-
cmd-command-prompt.c
-
cmd-confirm-before.c
-
cmd-copy-buffer.c
-
cmd-copy-mode.c
-
cmd-delete-buffer.c
-
cmd-detach-client.c
-
cmd-down-pane.c
-
cmd-find-window.c
-
cmd-generic.c
-
cmd-has-session.c
-
cmd-kill-pane.c
-
cmd-kill-server.c
-
cmd-kill-session.c
-
cmd-kill-window.c
-
cmd-last-window.c
-
cmd-link-window.c
-
cmd-list-buffers.c
-
cmd-list-clients.c
-
cmd-list-commands.c
-
cmd-list-keys.c
-
cmd-list-sessions.c
-
cmd-list-windows.c
-
cmd-list.c
-
cmd-load-buffer.c
-
cmd-lock-server.c
-
cmd-move-window.c
-
cmd-new-session.c
-
cmd-new-window.c
-
cmd-next-layout.c
-
cmd-next-window.c
-
cmd-paste-buffer.c
-
cmd-previous-layout.c
-
cmd-previous-window.c
-
cmd-refresh-client.c
-
cmd-rename-session.c
-
cmd-rename-window.c
-
cmd-resize-pane.c
-
cmd-respawn-window.c
-
cmd-rotate-window.c
-
cmd-save-buffer.c
-
cmd-scroll-mode.c
-
cmd-select-layout.c
-
cmd-select-pane.c
-
cmd-select-prompt.c
-
cmd-select-window.c
-
cmd-send-keys.c
-
cmd-send-prefix.c
-
cmd-server-info.c
-
cmd-set-buffer.c
-
cmd-set-option.c
-
cmd-set-password.c
-
cmd-set-window-option.c
-
cmd-show-buffer.c
-
cmd-show-options.c
-
cmd-show-window-options.c
-
cmd-source-file.c
-
cmd-split-window.c
-
cmd-start-server.c
-
cmd-string.c
-
cmd-suspend-client.c
-
cmd-swap-pane.c
-
cmd-swap-window.c
-
cmd-switch-client.c
-
cmd-unbind-key.c
-
cmd-unlink-window.c
-
cmd-up-pane.c
ここから「cmd-」を除いた部分がコマンド名です。機能はだいたいコマンド名見ればわかりますね。
各々のコマンドは引数を取ったりします。それを調べる時はソースを見ます。
たとえばさっきの「select-layout」であれば「cmd-select-layout.c」を見ます。すると、こんな感じのコードが見えるはずです。(一部抜粋)
CODE:
-
const struct cmd_entry cmd_select_layout_entry = {
-
"select-layout", "selectl",
-
CMD_TARGET_WINDOW_USAGE " layout-name",
-
CMD_ARG1,
-
cmd_select_layout_init,
-
cmd_target_parse,
-
cmd_select_layout_exec,
-
cmd_target_send,
-
cmd_target_recv,
-
cmd_target_free,
-
cmd_target_print
-
};
細かい説明ははしょりますが、というか理解してないのですが、ここからコマンド名が「select-layout」であり、エイリアスが「selectl」であることが読み取れます。
ちなみにこの書き方はxwindowの拡張であるglxの実装の一つであるcompizのプラグインもこういった書き方になっているので、見慣れておくといいような気もします。
次に、引数ですが次の部分に注目します。
CODE:
-
void
-
cmd_select_layout_init(struct cmd *self, int key)
-
{
-
struct cmd_target_data *data;
-
-
cmd_target_init(self, key);
-
data = self->data;
-
-
switch (key) {
-
case KEYC_ADDESC('0'):
-
data->arg = xstrdup("manual-vertical");
-
break;
-
case KEYC_ADDESC('1'):
-
data->arg = xstrdup("even-horizontal");
-
break;
-
case KEYC_ADDESC('2'):
-
data->arg = xstrdup("even-vertical");
-
break;
-
case KEYC_ADDESC('9'):
-
data->arg = xstrdup("active-only");
-
break;
-
}
-
}
はい。ここで「even-vertical」とか出てきましたね。細かい説明はまたしてもはしょりますが、ここが引数でありそうな事はぱっと見でわかると思います。わかってください。
これをもとにさっきの設定を見てみましょう。
CODE:
-
#layout
-
bind h select-layout even-horizontal
-
bind v select-layout even-vertical
-
bind f select-layout active-only
今まで見てきた通りですね!
じつは、他のコマンドもだいたい似たような感じになっています。それぞれのコマンドは非常にコンパクトにわかりやすく書いてあるので山勘で何とかなるかと思います。
しかし、0.8系と0.9系でコマンドが変わったりしてるようなので、まだちょっと注意がいるかもしれません・・・・
というかんじで、みなさん楽しいtmuxライフをおくりましょう!
- Author: harajune
- Filed under: 雑記
Tuesday
Sep 1,2009
キーワード自動リンクの話を某勉強会でしました。その資料を公開します。
自動リンクのためのデータ構造としてTrieを採用し、今回は有名な実装であるsenna, Tx, dartsの比較をしました。
それぞれのライブラリの背景は次の様なデータ構造です。
- senna - パトリシア木
- Tx - LOUDS
- darts - Double Array
今回の実験はとりあえず実装しましたレベルなので、厳密な速度や容量にはなっていない可能生があります。
というのは、それぞれのライブラリを精査したわけではないからです。
またキーワード抽出した結果がそれぞれで若干異なっています。抽出できたキーワードの件数に大きなさや検索にかかる時間に相関が無さそうなので概ね正しいと考えることにしました。
というわけで、ご参考まで。