MacOSXで最強のTerminal環境を構築するには

投稿者 nanki 2010-02-11 04:00:00 GMT

screenshot

大それたタイトルだが、Terminal.app(以下Terminal)のタブ機能を快適に使う話である。

Terminalを使い倒している皆様なら、当然のことながら、5~10の端末が開いていると思うが、僕は今までタブを使ってこなかった。

これは大体次のような理由によるものである。

  1. 切替が面倒くさい
  2. 中身が分からない
  3. タブの分狭くなる

今回は、この三つの問題を解決して、タブを快適に使おうじゃありませんか。

問題: 切替が面倒くさい

これはTerminal.app が、次のタブ/前のタブ、という操作しか用意していないことに起因する。 2~3つなら問題ないが、5~10のタブを切り替えるには機能不足。

これを terminaltabswitchingを使って解決する。

terminaltabswitching はTerminal.appのタブの切替を⌘0-9 で行えるようにするSIMBLプラグイン。 本家からforkされ、いくつかSnowLeopard関連の変更などがあたっていそうな niw’s terminaltabswitching at master - GitHub に、このコミットをマージしたものを使っている。

ビルド方法は

$ xcodebuild -configuration Release build

buildするだけで勝手にinstallされる。

これで、タブの切替が楽になった。

問題: 中身が分からない

タブの切替は出来るようになったが、タブの中身は切り替えるまでわからない。 プロセス名が書いてあったりするが、全部zshじゃあどれがどれだかわからないし、vimを終了すると、”Thanks for flying Vim”とかに書換えられて鬱陶しい。 ここでは、zsh と vim について掘り下げる。他の環境の人は各自深追いしてください。

# ~/.zshrc
function title {
  print -n "\e]0;$@\a"
  export TITLE="${(pj: :)@}"
}

chpwd() {
  title $(basename "$(pwd)")
}

cd .

まず、便利な関数titleを用意する。 $ title hello terminal! でタブのタイトルが設定できる。 また、現在のタブのタイトルを簡単に得る方法がたぶんないので、環境変数に保存する。

chpwd は、カレントディレクトリが変化した時に呼び出され、現在のディレクトリ名をタイトルに設定する。 これで、どのタブが何か一目瞭然となる。わからないのは、ディレクトリ名をつける人のセンスの問題に帰着する。

# ~/.vimrc
execute ":set titleold:".fnameescape($TITLE)
execute ":set titlestring:".fnameescape($TITLE." - %t")

vimは終了時に、titleoldをタイトルとして設定するので、それを、環境変数$TITLEにしておく。 さらに、ファイル編集中は、ファイル名が表示されるようになった。

問題: タブの分狭くなる

MacOSXの画面はただでさへ、Dockやメニューバー、タイトルバーで狭くなっているのに、この期に及んでタブバーでさらにせまくなるなんて許せない。 もう、画面を90度回転させて使いたい。

回転は首が痛くなりそうなのであきらめて、アプリケーションをフルスクリーンで使う方法ならある。 megazoomerがそれ。これもSIMBLプラグイン。SIMBL様さま。 使い方は、ここぞという時に⌘Enter

どうせ、タブとか考慮されてないから、変な事になるんでしょ、と思いきや、Dockもメニューバーもタイトルバーもきれいに消えて、すごい快適。

難点は、

  • そのアプリケーションがアクティブな間Spotlightが使えなくなる
  • マウスで履歴などを選択する時に、ウィンドウ下端に行っても、自動でスクロールしない

ついでにSafariでも使ってみたけど、たまに変になる。

数々の苦難を乗り越えて

当初の問題を解決したので、次いってみよう。

Marc Liyanage - Blog - Mac OS X - Terminal Tricks: “term” revisited, with tabs で公開されているスクリプトでは、AppleScriptを通して、Terminalを操作し、コマンドラインからタブを開く事ができる。

これを、~/bin/term などに保存すると、$ term -t ~/work でタブを開く事ができる。 コマンドの実行などもできる。 さらに、こんな感じのコマンドも用意した。zshのaliasでいい人はそっちの方がいいと思う。

#!/bin/sh
# ~/bin/tab
term -t "$@"

僕の場合、今手を付けている作業を、ブラウザのタブやTerminalのカレントディレクトリなどを外部記憶として保存しているので、OSの再起動はとても避けたい作業のひとつだが、 次のようなコマンドを実行することで、zshが開いているタブ群を再現できるスクリプトが得られるのでとてもよい。

$ lsof -a -c zsh -d cwd  | tail +2 | awk '{print "tab " $9}' | sort | uniq
tab /Users/nanki/*******/****
tab /Users/nanki/*******/*********/****/**********
tab /Users/nanki/*******/********************
tab /Users/nanki/****/*********/****/****/****
tab /Users/nanki/****/****/*********

(あ、エスケープしてない)

疑問点まとめ

  • 10を超えるタブはどうするのかしらん
  • screen はどうしよう
  • AppleScript使ったらタブのタイトルとれるかな?
参考:

この間の.zshrc - cheat 補完

投稿者 nanki 2008-09-30 00:25:00 GMT

netswitch! | 今日の.zshrc - cheat 補完 の補完関数だけど、なんだか遅いなと思ってたら間違いがあって、毎回cheatコマンドを実行していた。

元エントリ中のコードは修正済みだが、差分は以下の通り。

-    echo $*[1,-2] | sed -e 's/^/compadd /g' > ~/.zsh/completion/$*[-1]
+    eval $*[1,-2] | sed -e 's/^/compadd /g' > ~/.zsh/completion/$*[-1]

-  completion_list `cheat sheets | grep -v All` _cheat
+  completion_list 'cheat sheets | grep -v All' _cheat

遅さに困ってた人ごめんなさい。


今日の.zshrc - cheat 補完

投稿者 nanki 2008-09-25 07:00:00 GMT

cheatsheet を集めた cheat という gem があって、たまに便利である。

გ gem install cheat
გ cheat assertions
assertions:
  # Credit: http://nubyonrails.com/articles/ruby-rails-test-rails-cheat-sheet
  # Use 'cheat assert_raise' for more details
  
  # Standard Ruby Assertions
  
  assert                  boolean 
  assert_equal            expected, actual 
  assert_raise            *args 
  assert_raises           *args, &block 
  …
  …

cheat自身の使い方は

გ cheat cheat

どんなcheatsheetがあるのかは

გ cheat sheets

で見られる。

なんだけど、数が多すぎてもうどうしようもないので、さらに便利にするために、zshの補完を使ってみた。

見よう見まね。

completion_list () {
  mkdir -p ~/.zsh/completion
  if [ ! -f ~/.zsh/completion/$*[-1] ]; then
    eval $*[1,-2] | sed -e 's/^/compadd /g' > ~/.zsh/completion/$*[-1]
  fi

  `cat ~/.zsh/completion/$*[-1]`
}

_cheat () {
  completion_list 'cheat sheets | grep -v All' _cheat
}

compdef _cheat cheat

completion_list は一応再利用できるようにしてあるけど、ちゃんと調べたら既にありそうだ。

追記:

いつまでたってもassertionsの内容が古いままだなぁと思っていたら、キャッシュしてた。

გ cheat --new

でキャッシュをクリア。