‘Vim’ カテゴリーのアーカイブ

shun

OS X に byobu で tmux 環境をお手軽構築 [2015 冬版]

ターミナルの分割ウィンドウ、便利ですね。OS X だと有名なターミナルエミュレータに iTerm があり、多分に漏れずこれも分割ウィンドウに対応しているのですが、愛用している AquaSKK との相性が悪く Terminal.app を使わざるを得なくなっていました。Terminal.app のウィンドウ分割は貧弱なのでしばらくタブでなんとかしていたものの、いい機会なので以前から見送っていた tmux の環境を整えることでウィンドウ管理を行なおうと思い立ったのが今回の動機です。

対象読者

tmux 便利にしたいけどいい感じの設定が分からない、でもよく分からないまま他人の丸コピは嫌という方。

準備

byobu は端末のウィンドウマネージャで、tmux をバックエンドに使っています。tmux 自体を設定していくと快適な設定までもって行くのに割と手間がかかりますが、byobu を導入するだけである程度までいい感じにしてくれます。

brew install byobu

依存管理で tmux もインストールされます。入れた直後で以下のような感じです。

byobu-iikanji

もうこれで随分いい感じですね。満足した人はもうこれでもいいと思います。

tmux をよしなにしてくれるので、デタッチ([tmux-prefix]-d)後に attach を明示しなくても再度 byobu を実行すると前回のウィンドウにアタッチしてくれ、既に起動していたかどうかを考える必要が無くなります。

byobu はデフォルトでコピーモード中のキーバインドが Vim っぽくなっている(vi-copy)のもいいところです。
コピーモードの開始は Ctrl-[、リージョンの選択開始: Space、選択終了: Enter、貼り付け Ctrl-] となっています。他にも tmux のコマンドは [tmux-prefix]-? で一覧が見れるので、こまめに確認しながらひたすら覚えていくと良さそうです。念願のウィンドウ分割は [tmux-prefix]-%、[tmux-prefix]-| で出来ます、やりましたね。

設定

F1、F2、等に設定項目が割り当ててあったりするのですが、これを覚えるのも面倒です。これらは全て byobu-* プレフィクスが付いたコマンドが提供されている為、シェル補完するとどのようなものがあるか見ることが出来ます。

スクリーンショット 2015-12-24 09.56.20

とにかくまずは byobu-config してみましょう。

byobu-config では、tmux のプレフィクスキーの設定やステータスラインに表示する項目の設定、ログイン時の自動起動設定が出来ます。ステータスラインに表示出来る項目は様々にあるのでカスタマイズが楽しいですが、OS X では動かないものもままあるようです。プレフィクスキーについては C-a を押した初回に C-a をプレフィクスとして使うか Emacs よろしく行頭への移動に使うか聞かれます。readline 系の入力では C-a をよく使うのでここはプレフィクスとせずに、byobu-config から C-t へとしておきました。

デフォルトだとステータスラインの位置は下にありますが、これが Vim のステータスラインと近くて見辛くなるので上へと変えておきます。byobu の設定ファイルは ~/.byobu/ の中にあり、バックエンドに用いる tmux の設定ファイルも配置されています。

スクリーンショット 2015-12-18 15.04.46

# ~/.byobu/.tmux.conf
set -g status-position top


Vim を起動しても安心。

クリップボード連携

tmux を使っていると悩ましいのがコピーモードと OS のクリップボードの連携で、各位悩まれているのか色んな記事で触れられています。色々見た中ではこちらの設定が良さげな気がしました。私はペーストは tmux のバッファでやってくれて困らないのでコピーのほうだけ設定しています。

unbind -t vi-copy Enter
bind -t vi-copy Enter copy-pipe "reattach-to-user-namespace pbcopy"

マウスサポートこれは今まで何度も挫けてきたポイントで、というのも Terminal.app はこれまでマウスレポーティングが出来ず、端末内で動くマウスをサポートしているプログラム、例えば Vim などにはワークアラウンド的な設定を入れて凌いていました。
ところがなんと、遂に El Capitan に含まれている Terminal.app だとマウスレポーティングが使えるようになりました。アップデートしておもむろに 「表示 > マウスレポーティングを許可 ⌘R」をチェックしましょう。
tmux の issue を参照すると、マウスの上スクロールに対してコピーモードを開始する(=コンソールログが遡って見れる)設定がコメントされているのでこれを使わせて貰います。

### https://github.com/tmux/tmux/issues/145 ###
# Start copy mode when scrolling up and exit when scrolling down to bottom.
# The "#{mouse_any_flag}" check just sends scrolls to any program running that
# has mouse support (like vim).
bind -n WheelUpPane if-shell -F -t = "#{mouse_any_flag}" "send-keys -M" "if -Ft= '#{pane_in_mode}' 'send-keys -M' 'copy-mode -e'"

この設定がよく出来ていて、マウスをサポートしている(Vim のような)プログラムが起動していればそちらに制御を譲るようになっています。

課題

マウスサポートのの一部でドラッグがうまく判定出来ていないようで、リージョン選択や Vim のウィンドウサイズ調整がうまくいっていません。が、両方ともキーボード操作で問題無くあまり多用するわけでも無いので対応策はのんびり探しています。

如何だったでしょうか。おまけ程度のつもりで色々設定を書き連ねてしまったらうっかり長くなってきてしまいましたが、ひとまず byobu を入れてみるだけでも使い易さが全く違うと思います。また byobu を入れられる環境であればとりあえずインストールするだけで環境が整うのも魅力的です。
ここから不便を感じるようになってきたら色々設定を盛り込んでいって、やばい byobu にしたり tmux/screen に回帰したりするのもいいかもしれません。余談ですが byobu は元々 screen をバックエンドに開発されていたのでバックエンドを切り替えることも出来ます。

それでは良いターミナルライフを!


shun

MacVim で mvim シェルスクリプトを活用する

OS X で使える GUI 用 Vim には MacVim kaoriYa 版 があります。
dmg パッケージで配布されていて導入が手軽、かつ自動アップデータ等の機能もあり便利です。

KaoriYa 版に限らずこの MacVim には以前から mvim というシェルスクリプトが同梱されています。

https://github.com/splhack/macvim-kaoriya/wiki/Readme#コンソールからmacvimappを起動する
Terminal.appやiTerm.appからMacVim.app (GUI)を起動する場合は、mvimシェルスクリプトを使用します。
$ /Applications/MacVim.app/Contents/MacOS/mvim
GUIでvimdiffを起動するにはmvimdiffを使用します。
$ /Applications/MacVim.app/Contents/MacOS/mvimdiff file1 file2
/Applications/MacVim.app/Contents/MacOSにパスを通すと便利です。

これは MacVim を端末から様々な方法で起動する為のスクリプトで、上記のページでは GUI 起動のみ触れてありますが
他にも様々に用いることが出来ます。

:help mvim に記載されている通り、これは代表的な MacVim.app のインストール先を探索して
起動を試みるスクリプトです。

mvim として起動すると GUI での起動が行われますが、このスクリプトは自身が起動されたコマンドを見て
起動方法を替えるように書かれている為、これに symlink することで様々に起動することが出来ます。

# GUI mode, implies forking
case "$name" in m*|g*|rm*|rg*) gui=true ;; esac

# Restricted mode
case "$name" in r*) opts="$opts -Z";; esac

# vimdiff, view, and ex mode
case "$name" in
*vimdiff)
opts="$opts -dO"
;;
*view)
opts="$opts -R"
;;
*ex)
opts="$opts -e"
;;
esac

例えば mvimdiff a.file b.file とすると m prefix で GUI 起動の設定、vimdiff suffix で vimdiff 起動となる為
GUI で a.file-b.file 間の vimdiff が起動されます。

また、m を付けずに vim としてリンクし起動すると、端末内から MacVim を使用することも出来ます。MacVim kaoriya は
頻繁に更新される為、常に新しい、また GUI と統一したバージョンの Vim を使用出来るメリットがあります。

GUI 起動の prefix には g もある為、gentoo コマンドを作成して MacVim (GUI) を起動するなどといったことも可能です。

導入

mvim コマンド自体は下記に含まれています。

$ /Applications/MacVim.app/Contents/MacOS/mvim

:help mvim を見ると mvim スクリプトは /usr/local/bin に配置して使おうといった旨の記載がありますが、MacVim KaoriYa のページだと

/Applications/MacVim.app/Contents/MacOSにパスを通すと便利です。

と解説されており、こちらには symlinked な mvimdiff 等派生コマンドが既に配置されています。

❯ ll /Applications/MacVim.app/Contents/MacOS/
total 6264
-rwxr-xr-x 1 shun staff 356K Dec 7 13:59 MacVim
-rwxr-xr-x 1 shun staff 2.3M Dec 7 13:59 Vim
-r-xr-xr-x 1 shun staff 373K Dec 7 13:59 ctags
-rwxr-xr-x 1 shun staff 685B Dec 7 13:59 macvim-askpass
lrwxr-xr-x 1 shun staff 4B Dec 8 15:37 mview -> mvim
-rwxr-xr-x 1 shun staff 2.2K Dec 7 13:59 mvim
lrwxr-xr-x 1 shun staff 4B Dec 8 15:37 mvimdiff -> mvim
lrwxr-xr-x 1 shun staff 4B Dec 8 15:37 view -> mvim
lrwxr-xr-x 1 shun staff 4B Dec 8 15:37 vimdiff -> mvim

好みの方法で使用するといいと思います。

mvim スクリプトのバージョンによっては 14 行目辺りにある VIM_APP_DIR の設定が適切でない場合があるので、
この場合は /usr/local/bin/ にでも再配置して環境に合った適切な値に設定して使用すると良さそうです。
dmg パッケージからインストールしているのであれば /Applications を設定すると動くかもしれません。

終わりに

この季節恒例の Advent Calendar、今年も盛り上がっているようです。