2012年05月27日

vimfilerとUniteでVimをファイラとして使用する方法

vimfilerはUniteと連携し、Vim上でのファイル操作をサポートするプラグインです。

私はこれまで、vimfilerはあまり使用していませんでした。Vim上でのファイル間の移動は :Unite file コマンドで行い、ファイル操作はvimshellを使用していました。半年ほど前から「vimfilerが便利になった」という話をあちこちで見かけるようになり、試してみたところ本当に便利だったので少しずつ使うようになりました。

3ヶ月ほど使用してみて運用方法が固まってきたので、このあたりでノウハウをまとめておきます。

この記事では、vimfilerのインストール方法、私がよく使用するvimfilerの機能、私のvimfilerの設定などを紹介します。

目次

動作確認環境

  • Vim 7.3
  • vimfiler 3.1
  • Unite 3.1
  • vimproc 7.0

vimfiler, Unite, vimprocインストール

vimfiler, Unite, vimprocをgithubからダウンロードします。pathogen,Vundle系プラグインを使用されている方は、ダウンロードしたファイルを ~/.vim/bundle 以下に配置します。ちなみに私はneobundleを使用しています。neobundleのインストール方法はこちら

cd ~/.vim/bundle
git clone https://github.com/Shougo/vimfiler.git
git clone https://github.com/Shougo/unite.vim.git
git clone https://github.com/Shougo/vimproc.git

vimshellを導入していない方は、ついでにダウンロードしましょう。vimfilerとも連携できます。

git clone https://github.com/Shougo/vimshell.git

vimprocのコンパイル

vimfiler, Unite, vimshellの非同期処理のため、vimprocを導入します。vimprocはgccでコンパイルを行います。

各環境における導入方法です。

Windowsの場合

下記の記事をご参照ください。

上記の記事でmsysをインストールする方法も紹介しています。msysにはls,cp,mvといったlinuxコマンドが入っており、Windowsでvimfilerやvimshellを動作させるために必要です。

Macの場合

事前にXCodeをインストールしておきます。XCodeにgccが含まれています。

下記コマンドでコンパイルします。

cd ~/.vim/bundle/vimproc/
make -f make_mac.mak

vimproc/autoload/vimproc_mac.so が作成されていればコンパイルは成功です。

Linuxの場合

gccをインストールします。ほとんどのLinuxではデフォルトで入っているのではないでしょうか。

下記コマンドでコンパイルします。

cd ~/.vim/bundle/vimproc/
make -f make_unix.mak

vimproc/autoload/vimproc_unix.so が作成されていればコンパイルは成功です。

vimfilerの起動方法

普通に起動

vimfiler-run

:VimFiler コマンドでvimfilerを起動します。

:e コマンドでデフォルトのエクスプローラの代わりにvimfilerを起動することもできます(.vimrcで設定が必要)

私は :VimFilerBufferDir コマンドで、カレントバッファのディレクトリを開くことが多いです。

IDE風に起動

vimfiler-run-ide

:VimFiler -split -simple -winwidth=35 -no-quit コマンドで、IDEのファイルエクスプローラのような見た目になります。長いので.vimrcでマップして呼び出しましょう。

他にも様々な起動方法やオプションがありますのでマニュアルを参照してお好みの設定を見つけてください。

vimfiler起動後は、Vimfiler上でディレクトリの移動や、ファイルの操作ができます。

以下より、私がよく使用するvimfilerの操作方法を紹介します。

カーソル移動

j
カーソルを下に移動。末尾行では先頭行に移動
k
カーソルを上に移動。先頭行では末尾行に移動
gg
カーソルを先頭行に移動
G
カーソルを末尾行に移動

カーソルの移動は、vimのカーソル移動と同じ感覚で行えます。

ディレクトリ移動

l
カーソルのディレクトリを開く
k
ひとつ上のディレクトリを開く
L
ドライブの切替
~
ホームディレクトリを開く
\
ルートディレクトリを開く

後述する、Uniteのbookmark機能を使用するとディレクトリ移動はさらに便利になります。

一覧表示

.
隠しファイル、フォルダの表示
C-L
ディレクトリの更新
t
カーソル上のディレクトリの1階層下をツリー形式で表示。ツリー表示を解除
T
カーソル上のディレクトリをツリー形式で表示。ツリー表示を解除
C-j
ディレクトリの履歴を表示
C-g
ファイル名を表示する
S
ファイルの並び替え

一覧の表示をフィルタリングしたい場合は、:UniteWithBufferDir file コマンドも併用するとよいでしょう。

ウィンドウの操作

TAB
別のvimfilerウィンドウへカーソルを移動する。ウィンドウが1つの場合は2つ目のvimfilerウィンドウを開く
q
vimfilerを隠す(バッファに残る)
Q
vimfilerを閉じる(バッファに残らない)

ファイル操作

e
カーソル上のファイルを編集
E
カーソル上のファイルを縦分割して編集
v
カーソル上のファイルをプレビューする
Space
カーソル上のファイルにマークをつける・マークをはずす
c
マークしたファイルをコピー
m
マークしたファイルを移動
d
マークしたファイルを削除
r
マークしたファイルの名前を変更
K
新規ディレクトリを作成
N
新規ファイルを作成
*
すべてのファイルにマークをつける・マークをはずす
U
すべてのファイルのマークをはずす

ファイルにマークをつけないとコピー・移動・削除を行うことができません。

ちなみに、マークが何もついていない時に限り、c, m, d キーで1ファイルにマークをつけることができます。dd キーでカーソル行のファイルを削除、cc キーでカーソル行のファイルをコピー、dd キーでカーソル行のファイルを削除することができます。

一括ファイル操作

行ビジュアルモードで複数行を選択してSpaceキーを押すと、複数ファイルいっぺんにマークをつけることができます。

複数のファイルにマークをつけて、c, m, d, r キーでファイルの一括操作ができます。特に、一括名前変更は爽快です。

以下、一括名前変更のスクリーンショットです。

vimfiler-rename1

複数ファイルにマークを付けて r キーを押すと画面が縦分割され、右ウィンドウにファイル名の一覧が表示されます。右ウィンドウのファイル名を変更します。

vimfiler-rename2

変更したら :wq コマンドで右ウィンドウを保存終了すると、ファイル名の変更が一括で行われます。

2画面を使用したファイル操作

TAB キーでvimfilerが2画面になります。

vimfiler-2window

左の画面から右の画面にファイルをコピーしたり移動したり、その逆もできます。

vimfilerが2画面になっているとき、ウィンドウ間の移動はTABキーで行います。

その他の便利機能

a
カーソル上のファイルに対して、様々なアクションを選択して実行
H
vimshellを開く
ge
vimfiler上のカレントディレクトリを、システムのエクスプローラで開く
x
カーソル上のファイルを、システムに関連付けされたアプリケーション(コマンド)で実行する
gr
grepコマンドを実行
gf
findコマンドを実行
yy
ファイルのフルパスをyank(コピー)
?
vimfilerのキーマップ一覧を開く

grep, findコマンドの実行

gr キーでgrep、gf キーでfindコマンドを実行することができます。a キーのアクションから実行することもできます。

結果はUniteに出力され、結果から該当箇所にジャンプできます。

Windows環境では、msysのfind.exeとシステム標準のfind.exeが競合します。msysのfind.exeが使用されるように、msysのpath設定を先頭に記述すると良いでしょう。


6月2日追記
unite.vimが修正され、下記の問題は解決しました。

Uniteから該当箇所にジャンプできるのは良いのですが、ジャンプした後に自動でUniteが閉じてしまうので困っています。grepした後は該当ファイルを連続で見ることが多いので。このあたりの挙動をカスタマイズしようと、:UniteResume -no-quitなど色々やってみたのですが、よい解決案が見つかっていません。

Unite bookmarkの利用

a キーでbookmarkアクションを選択して実行すると、vimfilerからUniteのbookmarkに追加することができます。ファイルを開いて :UniteBookmarkAddコマンドでbookmarkに追加することもできます。

追加したbookmarkは、:Unite bookmark コマンドで呼び出します。

追加されたbookmarkは、~/.unite/bookmark/default に格納されます。並び順を変えたりしたい場合は直接ファイルを編集します。


6月2日追記
下記は、私の環境でのみ発生していたようです。
Shougoさんにご対応いただき、下記の問題は解決しました。

注意点として、bookmarkアクションでbookmarkに追加するのはディレクトリだけにします。ファイルは、一度開いて :UniteBookmarkAddコマンドでbookmarkに追加します。ファイルをbookmarkアクションで追加すると、:Unite bookmark コマンドから開くときにエラーとなります。

私のvimfilerの使用例

私の日常的なvimfilerの使用例です。参考にどうぞ。

  • よく使用するファイルやディレクトリは予めbookmarkに登録しておき、bookmarkから目的のファイルにアクセスしています。bookmarkからディレクトリを開くときはvimfilerアクションを指定します。
  • ExcelやWordなどのファイルはvimfilerで x キーを押して開きます。ファイルのパスによっては開けないこともあるので、その時は ge キーでエクスプローラを呼び出してエクスプローラからファイルを開きます。
  • プログラミング時にファイル間を移動するときは、:VimFilerBufferDir、:Unite bookmark、:Unite file_mruなどで移動することが多いです。:Unite file もたまに使います。.vimrcでショートカットキーを割り当てています。
  • 2画面ファイラにして色々やっていると、気づかぬうちに2画面ファイラ状態ではなくなってしまう時があります。2画面ファイラ間でのファイルコピーができず、ファイルのコピー先のパスを入力を求められたりします。そうなった時、yy キーでフルパスを yank できる機能が便利です。.. ファイルにカーソルを合わせて yy するとそのディレクトリのパスを yank できます。
  • バージョン管理ツールを使うときや、ワイルドカードを使ってファイル操作したい時、VimShellを使用しています。

.vimrc

Uniteとvimfilerに関連する部分のみ抜粋しました。参考にどうぞ。

"unite {{{

"unite prefix key.
nnoremap [unite] <Nop>
nmap <Space>f [unite]

"インサートモードで開始しない
let g:unite_enable_start_insert = 0

" For ack.
if executable('ack-grep')
  let g:unite_source_grep_command = 'ack-grep'
  let g:unite_source_grep_default_opts = '--no-heading --no-color -a'
  let g:unite_source_grep_recursive_opt = ''
endif

"file_mruの表示フォーマットを指定。空にすると表示スピードが高速化される
let g:unite_source_file_mru_filename_format = ''

"data_directory はramdiskを指定
if has('win32')
  let g:unite_data_directory = 'R:\.unite'
elseif  has('macunix')
  let g:unite_data_directory = '/Volumes/RamDisk/.unite'
else
  let g:unite_data_directory = '/mnt/ramdisk/.unite'
endif

"bookmarkだけホームディレクトリに保存
let g:unite_source_bookmark_directory = $HOME . '/.unite/bookmark'


"現在開いているファイルのディレクトリ下のファイル一覧。
"開いていない場合はカレントディレクトリ
nnoremap <silent> [unite]f :<C-u>UniteWithBufferDir -buffer-name=files file<CR>
"バッファ一覧
nnoremap <silent> [unite]b :<C-u>Unite buffer<CR>
"レジスタ一覧
nnoremap <silent> [unite]r :<C-u>Unite -buffer-name=register register<CR>
"最近使用したファイル一覧
nnoremap <silent> [unite]m :<C-u>Unite file_mru<CR>
"ブックマーク一覧
nnoremap <silent> [unite]c :<C-u>Unite bookmark<CR>
"ブックマークに追加
nnoremap <silent> [unite]a :<C-u>UniteBookmarkAdd<CR>
"uniteを開いている間のキーマッピング
augroup vimrc
  autocmd FileType unite call s:unite_my_settings()
augroup END
function! s:unite_my_settings()
  "ESCでuniteを終了
  nmap <buffer> <ESC> <Plug>(unite_exit)
  "入力モードのときjjでノーマルモードに移動
  imap <buffer> jj <Plug>(unite_insert_leave)
  "入力モードのときctrl+wでバックスラッシュも削除
  imap <buffer> <C-w> <Plug>(unite_delete_backward_path)
  "sでsplit
  nnoremap <silent><buffer><expr> s unite#smart_map('s', unite#do_action('split'))
  inoremap <silent><buffer><expr> s unite#smart_map('s', unite#do_action('split'))
  "vでvsplit
  nnoremap <silent><buffer><expr> v unite#smart_map('v', unite#do_action('vsplit'))
  inoremap <silent><buffer><expr> v unite#smart_map('v', unite#do_action('vsplit'))
  "fでvimfiler
  nnoremap <silent><buffer><expr> f unite#smart_map('f', unite#do_action('vimfiler'))
  inoremap <silent><buffer><expr> f unite#smart_map('f', unite#do_action('vimfiler'))
endfunction

"}}}

"vimfiler {{{

"data_directory はramdiskを指定
if has('win32')
  let g:vimfiler_data_directory = 'R:\.vimfiler'
elseif  has('macunix')
  let g:vimfiler_data_directory = '/Volumes/RamDisk/.vimfiler'
else
  let g:vimfiler_data_directory = '/mnt/ramdisk/.vimfiler'
endif

"vimデフォルトのエクスプローラをvimfilerで置き換える
let g:vimfiler_as_default_explorer = 1
"セーフモードを無効にした状態で起動する
let g:vimfiler_safe_mode_by_default = 0
"現在開いているバッファのディレクトリを開く
nnoremap <silent> <Leader>fe :<C-u>VimFilerBufferDir -quit<CR>
"現在開いているバッファをIDE風に開く
nnoremap <silent> <Leader>fi :<C-u>VimFilerBufferDir -split -simple -winwidth=35 -no-quit<CR>

"デフォルトのキーマッピングを変更
augroup vimrc
  autocmd FileType vimfiler call s:vimfiler_my_settings()
augroup END
function! s:vimfiler_my_settings()
  nmap <buffer> q <Plug>(vimfiler_exit)
  nmap <buffer> Q <Plug>(vimfiler_hide)
endfunction


"}}}

終わりに

以上、私がよく使用するvimfilerの機能について紹介しました。

紹介していない機能もありますので、:help vimfiler して他の機能も試してみてください。

この記事をシェアする

vimfilerとUniteでVimをファイラとして使用する方法」への1件のフィードバック

  1. Shougo

    vimfilerの作者です。こんにちは。

    >Uniteから該当箇所にジャンプできるのは良いのですが、ジャンプした後に自動でUniteが閉じてしまうので困っています。grepした後は該当ファイルを連続で見ることが多いので。このあたりの挙動をカスタマイズしようと、:UniteResume -no-quitなど色々やってみたのですが、よい解決案が見つかっていません。

    これは、unite.vimのバグであることが判明しました。現在は修正されているため、unite.vimを更新してください。

    > 注意点として、bookmarkアクションでbookmarkに追加するのはディレクトリだけにします。ファイルは、一度開いて :UniteBookmarkAddコマンドでbookmarkに追加します。ファイルをbookmarkアクションで追加すると、:Unite bookmark コマンドから開くときにエラーとなります。

    このエラーはこちらで再現ができませんでした。エラーの再現方法と、発生したエラーメッセージの全文を教えてください。長くなりそうなら、unite.vimのIssuesに報告してもらえると助かります。

    これは、この記事へのブックマークコメントに対する回答です。

    > nyos0426
    > ネットワークドライブにいどうできたらなぁ

    ネットワークドライブへ移動することもできます。
    \\hoge\piyoの代わりに//hoge/piyoというディレクトリを参照するようにしてください。

コメントは停止中です。