Tom Maisey

TmuxとVimを併用されている方も多くいらっしゃると思います。 実はこの2つを組み合わせると移動がすごい便利になります。 意外とVim + Tmuxの組み合わせ技の記事は無いため、書こうと思います。

Vimでいえば、ターミナル派とGVim派の2流派に分かれると思いますが、 もっぱら私はターミナル派です。なぜならTmuxとの親和性が良いからです。 エディタでコードを書きながら、すぐにMySQLなどコンソールに叩くことも簡単です。 たまにあのGVim特有の滑かで早い描画に戻りたくなることもありますが、これはトレードオフと思いぐっと我慢しています。

Vimでのコマンドライン

もちろんVimでもシェルのコマンドはデフォルトで叩けます。 EXモードに移行し、エクスクラメーションマークをつければコマンドを実行可能です。

:!mv file.txt file.backup.txt

Vimshellなどをプラグインすれば、 Vimでも対話的にシェルを叩くことが可能になります。 GVimなどを利用してそこから、同じUIでシェルを叩きたい人にはもってこいです。

ただ個人的な感想でいえば、インストールはしておりますが、あまり利用していません。 やはりターミナルの作業はターミナルでやったほうがiTermなどのターミナルアプリの設定調整の恩恵も大きくうけられますし、 Tmuxのほうがよりダイナミックにウインドウ移動、ローテーション、サイズ変更が可能です。

もっとも・・・どちらもツールはツールなので、気に入ったものを使いこなすことがベストだと思います。

Vim NERDTreeについて考察

ご存知、NERDTreeはVimのツリー型エクスプローラプラグインです。 EXモードでNERDTreeと叩くだけでファイルツリーをグラフィカルに表示してくれます。

コマンドラインでは分かりにくいフォルダ構成ですが、NERDTreeだけあれば、 簡単にGUI風にファイルの一覧を取ることが出来ます。iTerm側の設定でマウスレポーティングを有効にすれば、ターミナル起動のVimであろうとマウスでクリックすることでで、 NERDTreeを開くことも可能です。もはやこれはCUIと呼べるのか謎です。

本題に戻り、Linux系ではtreeというコマンドでファイルのツリー構造を出力することも可能です。しかし別にその一覧を見たところで移動も出来ないですし、 あくまでドキュメント作成用のコマンドの位置づけだと感じています。

私は.vimrcに下記のような設定を追加しております。

"------------------------------------------------------------
" NERD-Tree.vim
"------------------------------------------------------------
nnoremap <silent> <Leader>n :NERDTreeToggle<CR>
nnoremap <silent> <Leader>N :CD<CR>:NERDTree<CR>
let NERDTreeShowHidden=1

command! -nargs=? -complete=dir -bang CD  call s:ChangeCurrentDir('<args>', '<bang>')
function! s:ChangeCurrentDir(directory, bang)
    if a:directory == ''
        lcd %:p:h
    else
        execute 'lcd' . a:directory
    endif

    if a:bang == ''
        pwd
    endif
endfunction

Leader + nでNERDTree自体をトグル表示させ、 Leader + Nで開いているファイルバッファにcdで移動させ、そこのファイル一覧を表示させています。

Uniteなどの利用して、Fuzzyに移動したのち、Leader + Nを利用して自分自身ごと 該当ファイルのあるディレクトリに移動します。 微調整あれば、NERDTreeの(up a dir)をクリックしたり、ディレクトリ自体をクリックして、移動します。 そのタイミングでは通常のLeader + nを利用すれば、ツリー構造を変更させずNERDTreeを トグル表示させることが可能です。意識して使い分けると非常に便利です。

NERDTreeとTmux

基本技ですがNERDTreeではツリーに移動した後にcdとコマンドを叩くと、そのPATHにVim内部で移動します。

NERDTree: CWD is now: xxx

Vim内部でPATH移動をするとどうなるかというと、EXモードでコマンドを叩く時にそのPATHが基準となります。なので簡単に:! rm file.txtといったアクションが可能となります。普通のコマンドラインで移動するよりも、自分がどこに居るかツリー構造でわかるため、作業がわかりやすいです。

実はこのVimの内部PATH移動はTmuxのSplit Paneにも引き継がれます。すなわち、NERDTreeでcdさせて、tmuxのsplit paneを行うと、そのパスを開いてくれます。

ソースコードなどを作業しているときは非常に快適です。 NERDTreeのcdで移動したのち、tmuxのpaneを開き、そこでBashなどのコマンドを簡単に呼び出すことが可能です。

Unite & NERDTree & Tmux コンビネーション

上記の一連の流れを組み合わせるととても早く任意のディレクトリに移動出来ます。

Uniteのヒストリを開いたのち、NERDTree + CDさせパスを移動します。 その後、Tmuxでsplit paneをすれば、簡単に最近使ったファイルの箇所に移動可能です。

上記の動画では、/tmp配下から~/dotfiles/binへcdし、新しいTmux paneを作成しています。最後にbreak paneも実行し、新WindowとしてTmux上で完結しています。

(なおこちらのTmuxはVersion1.8です。1.9系以上ではTmuxでのデフォルト挙動が変わっているなど可能性もありますので、色々ご注意下さい。)

最後に

前回記事のMacで少し生産性の上がるBashエイリアス集 にて解説したcdffjjjコマンドなどと組み合わせればさらに威力が増します。 ターミナル上で高速で移動したのち、vimで起動させそこを起点に作業開始させます。 すなわち、今回説明したVimからの移動とは逆パターンです。

私の例でいえば、両方ともケースバイケースで使い分けております。 autojump(j/z)コマンドであれば、コマンドラインから一発で最近に作業したディレクトリに移動出来ます。 Uniteの場合ではand検索も出来るのである程度自分が意図する移動先ディレクトリを確認しながら向かうことが出来ます。長らく使ってみると、「たぶん、これautojumpだと一発でいけないかもな」「考えなくていいから、Vim経由にしょう」などフィーリングで感じられるようになるはずです。

是非、空気を吸うようなフィーリングで移動出来るようにトレーニングしましょう。 楽しい世界が待っております。