Quantcast
Channel: Vimタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 5608

vi[m] like file manager な vifm の紹介と vifmrc 設定例

$
0
0

本記事は Vim Advent Calendar 2019 - Qiitaの 17 日目の記事です。

この記事では vifmについてご紹介します。

capture_vifm_for_advent_calendar_2019.png

vifm とは

vifm とは ncurses ベースで vi[m] ライクな、ターミナル内で操作できるファイラ(ファイルマネージャ)の一つです。おそらく vi[m] (like) file manager の略で vifm なのだと思います。

ncurses は TUI (Text User Interface) を構築する際によく用いられるライブラリで、以前こちらで紹介した Tig など、多くのソフトウェアで使われています。

自分とファイラ

少しだけ自分の話をすると、昔から 2 画面ファイラと呼ばれるものを長年愛用していました。2 画面ファイラとは左右にファイル一覧が表示されるファイルマネージャで、コピーや移動などの操作を左のペインから右のペインに (あるいは右のペインから左のペインに) 向けて実行でき、高速なファイル操作が行えるのが特徴です。

以前 Windows 機をメインにしていた際は 2画面ファイラーKFだいなファイラーなどを愛用していました。

作業環境を Mac に変更してからは、Java で開発されている muCommanderを使用していました。その後メンテナンスが滞ったタイミングで、 GPL の muCommander のコードを fork して開発を継続している trolsoft の trolCommanderを使用していました。

trolCommander は概ね満足いくファイラでしたが 、GUI ソフトウェアなので自分の様に git 操作に Tig を使っていたり、普段からターミナルで作業することが多い人間は少し手間に感じていました。そのため、ターミナル内で実行できる 2 画面ファイラで、かつ操作性や拡張性がよいものを長年探していました。

そして数年前に vifm を使い始めてから、 trolCommander と同等以上に自分のニーズを満たしてくれることを確認できたので移行しました。今では手放せない存在になっています。

以下では、 vifm の初期設定での操作方法と、便利な設定について説明していきます。

ちなみに vim でのファイラは色々と有名なプラグインがあります(※)が、vifm 本体は vim を起動せずにスタンドアロンで起動します。それとは別に、プラグインで vim から呼び出す方法もあります (後述) 。起動は非常に速く、一瞬で立ち上がります。

※ 参考:mattn さんのファイラ記事

vifm のインストール方法

公式ページ (Vifm - Downloads) にバイナリがあります。また各種OSやディストリビューション向けにパッケージも用意されています。

Mac ユーザであれば

$ brew install vifm

で簡単にインストールできます。

基本的な操作方法

ここで紹介する内容はすべて公式マニュアルに書かれているので、詳細については本家ドキュメントをご確認ください。便利な Cheetsheet もあります。

終了方法

定番のコマンドですが、 vim と同じ操作で終了できます。

キー説明
:qvifm を終了する
ZZvifm を終了する
ZQエラーコードで vifm を終了する (後述)

(※ ただし毎回これを打つのは手間なので、自分は qに vifm 終了コマンドを割り当てています (後述))

カーソル移動

キー説明
jカーソルを下に移動
kカーソルを上に移動
hひとつ上のディレクトリに移動
lカーソル配下がディレクトリならそのディレクトリに移動する。ファイルならファイルをエディタで開く (デフォルトは vim )
ggカーソルを最上段に移動
Gカーソルを最下段に移動
[SPACE]反対側のペインに移動
[TAB]反対側のペインに移動
Ctrl-i反対側のペインに移動

その他のキーバインドは マニュアルの Basic Movementを参照してください。

ファイル操作

キー説明
yyファイルを vifm のクリップボードにコピー (yank) する
Yファイルを vifm のクリップボードにコピー (yank) する
Cファイルをクローンする (同じディレクトリに ファイル名(1).拡張子という名前で複製する)
pyank したファイルをコピーする。または ddで削除したファイルをコピーする
Pyank したファイルを移動する (元の場所からは消える)
ddファイルを vifm の trash ディレクトリに入れる (pで貼り付けられる)
DDファイルを完全に削除する
cwファイルをリネームする
cWファイルをリネームする (拡張子を除く)
alyank したファイルの symbolic link を絶対パスで作成する
rlyank したファイルの symbolic link を相対パスで作成する
tカーソル配下のファイル/ディレクトリを選択状態にする

trash ディレクトリについてはマニュアルの Trash directoryをご参照ください。筆者のデフォルトでは ~/.local/share/Trashでした。

カスタマイズ

上記のコマンドを覚えておけば最低限のファイル操作はできると思いますが、やはり手に馴染むようにカスタマイズしてこそのファイラなので、カスタマイズの方法をご紹介します。

設定ファイルのロード順についてはマニュアルの Startupに書かれています。最優先は ~/.vifm/vifmrcファイルですが、インストール直後にはこのファイルは存在しないので ~/.config/vifm/vifmrcファイルが読み込まれていると思います。このファイルは以下のいずれかがインストールされています。

まずはこのディレクトリをコピーしてカスタマイズを始めてみます。

$ cp -a ~/.config/vifm ~/.vifm

表示変更

デフォルトの画面だと情報量が少なすぎるので、だいたい以下のようにしています。それぞれの詳細については マニュアルの :set optionsをご確認ください。

~/.vifm/vifmrc
set timefmt=" %Y/%m/%d %H:%M:%S"
set statusline="  %t  [%T]%= %A %10u:%-7g %15s %20d [%a free]"
set viewcolumns=-45%{name}..,-{ext},10{size},12{perms},21{mtime}
set sizefmt=units:iec,precision:3

また、執筆当時最新の ver 0.10.1 を入れてみたところ、カラースキームが微妙になっていたので修正しています。カラースキームはデフォルトでは colorscheme Defaultが指定されているため ~/.vifm/colors/Default.vifmが読まれます(前述の ~/.config/vifmディレクトリをコピーしている場合)。

カラースキームは color_scheme.cで動的に作られているようですが、自分の場合 OtherWinの設定値が目立ちすぎていたのでコメントアウトしています。

~/.vifm/colors/Default.vifm
" highlight OtherWin cterm=bold,underline,reverse,standout ctermfg=default ctermbg=default

本記事の最初にも貼りましたが、上記を設定した際の筆者の iTerm2 (色調整した Solarized Dark テーマ) での vifm のスクリーンショットはこのような感じです。(右下のカレントパーティションの空き容量 [%a free]の値はうまくとれていないようですが)

capture_vifm_for_advent_calendar_2019.png

ちなみに vifm-colors というサブプロジェクトにも各種カラースキームが置かれています。

これらのカラースキームごとのサンプルは公式サイトに一覧があります。

エディタ/ビューア変更

lでファイルをチラ見するときに毎回 vim が開くと閉じるのが手間なので lessに変えています。

~/.vifm/vifmrc
set vicmd='less -N'

(-N--LINE-NUMBERSのことで行数表示のオプションです)

また、 hキーで lessを抜けられるように、 lesskey.confを以下のように書いて

lesskey.conf
h   quit
$ lesskey -o ~/.lesskey lesskey.conf

を実行することで lesshキーで抜けられるようになります。

コマンド定義

マニュアルの Commandsに書かれているコマンドを(ノーマルモードの)キーにバインドする場合は、 vim の .vimrcと同様に

~/.vifm/vifmrc
nnoremap C :copy

の様に書きます(デフォルトの Cキーを上書きしています)。 :copyは組み込みコマンドで、反対側のペインにコピーを行います。

前述した、 qで vifm を抜けるようにするには

~/.vifm/vifmrc
nnoremap q :quit<cr>

と書きます。(<cr>はコマンド行で確認せずに Enter します)

外部コマンド呼び出し

組み込みコマンド以外をシェル経由で実行するには、 !をつけます (%引数については後述します)

~/.vifm/vifmrc
nnoremap Z :!zip -r %D/%c:r.zip %f

また、コマンドを定義しておいて、内部コマンドの様に読み出すこともできます。

~/.vifm/vifmrc
command! zip -r %D/%c:r.zip %f
nnoremap Z :zip

コマンド引数

例えば unzip コマンドを Uに割り当てたい場合、

~/.vifm/vifmrc
nnoremap U :!unzip %f -d %D

と書くことでコマンド引数を展開することができます。ここで %fはカーソル配下のファイルパス、 %Dは反対側ペインのディレクトリを指します。このあたりの変数の詳細は マニュアルの Command macrosや、設定ファイル ~/.vifm/vifmrcに書かれています。

仮想ディレクトリ

一般にファイラは、 zip などのアーカイブも展開せずに中を開くことができるのが一般的です。vifm で zip ファイルを仮想ディレクトリとして開くには FUSEを利用します。

Mac OS の場合は、Home - FUSE for macOSからダウンロード&インストールするか、 Homebrew Cask が利用可能な場合は以下のコマンドでインストールできます。

$ brew cask install osxfuse

さらに zip ファイルを開くために fuse-zip を入れます。 公式サイトからダウンロード&インストールするか、Mac では Homebrew でインストールできるので、以下のコマンドでインストールしてください。

$ brew install fuse-zip

そして *.zipやその他の対応ファイルタイプに対して fuse-zip を割り当てます。

~/.vifm/vifmrc
filetype *.zip,*.jar,*.war,*.ear FUSE_MOUNT|fuse-zip %SOURCE_FILE %DESTINATION_DIR

と書いてみて気づきましたが、執筆当時最新の vifm v0.10.1 の初期設定ファイルには fuse-zip がある場合は自動で上記設定が有効になるようになってたので、現状では特に設定は不要となっているようです。

その他の FUSE Mount

その他、 sshfscurlftpfsなどの FUSE mount の記述が 初期設定にあります。

sshfs については、

$ brew install sshfs

のようにインストールしたのち、

hoge_server.ssh
username@hoge.example.com:/home/username

.sshと拡張子を持つファイルに sshfsに渡す接続情報を書いておけば、 lキーでそのファイルを開こうとすると透過的に ssh 先のサーバを手元の vifm で開くことができます。ローカルのコンテナの接続情報を書いていても便利だと思います。

vifm 起動ショートカット

ターミナルでは vifm か tig かエディタを開いて生活しているので、コマンド一つで vifm が開けると便利です。

zsh の場合は ~/.zshrcに以下の設定を入れておけば Alt-jで vifm をカレントディレクトリですぐに開けます。

~/.zshrc
bindkey -s'\ej''^a vifm . \n'

(history に残さないように、頭に空白を入れています。これを有効にするには setopt hist_ignore_space.zshrcに記載しておいてください)

起動シェルのカレントディレクトリ変更

vifm を抜けた際に、最後のディレクトリを呼び出したシェルのカレントディレクトリとして欲しいケースが多いと思います。
公式マニュアルにその設定が紹介されています。

以下は ~/.zshrcの例です。(公式マニュアルには .bashrcの設定が載っています)

~/.zshrc
function vicd(){local dst="$(command vifm $1$2--choose-dir -)"if[-z"$dst"];then
        echo'Directory picking cancelled/failed'return 1
    fi
    cd"$dst"}

これで vicdコマンドで実行された vifm が正常終了 (:q or ZZ) の場合は、 vifm の最後のディレクトリがカレントディレクトリに設定されます。

こちらを普段使うため、上記 Alt-jコマンドは vicd に書き換えています。

~/.zshrc
bindkey -s'\ej''^a vicd . \n'

また、 ZQで抜けた場合は起動時のディレクトリのままになります。

ちなみに自分の場合、qQをそれぞれに割り当て直しています。

~/.vifm/vifmrc
nnoremap q :quit<cr>
nnoremap Q :cquit<cr>

その他便利なコマンドのキー割り当て

以下は筆者が設定しているキー割り当ての一部です。これまでに説明していないもののうち、特に設定しておいたほうが便利だと思うものを挙げてみます。(キーバインドはお好みのものに変更してください)

~/.vifm/vifmrc
" ディレクトリを作成する
nnoremap K :mkdir<space>

" カレントファイルを関連付けられたデフォルトのアプリケーションで開く。フォルダの場合は Finder で開く (Mac)
nnoremap X :!open %f<cr>

" 反対側のペインをカレントペインと同期する
nnoremap , :sync!<cr>

" スペースキーを「カレントファイルを選択して、カーソルを1つ下に移動」にする
nnoremap <space> t<down>

(上記以外については筆者の vifmrcを参照してください)

その他

AFP (Mac のファイル共有プロトコル) でマウントしたサーバに対して :moveコマンドによるファイルの移動をすると更新日時が保持されないバグ(仕様?)があったので(現バージョンで解消されているかは未確認ですが)リモートサーバを操作する場合は事前に動作検証をしておくとよいと思います。

Vim 連携

ここまではスタンドアロンの vifm について説明してきましたが、 vim から vifm を呼び出すプラグインも存在しています。

Vundle の場合、 call vundle#begin() ~ call vundle#end()間に以下の指定をして :PluginInstallでインストールされます。

~/.vimrc
Plugin 'vifm/vifm.vim'

プラグインのドキュメントによると以下のコマンドが定義されています。(マニュアルの Pluginにも同様の説明があります)

Commands:

                                               *vifm-:EditVifm*
  :EditVifm   select a file or files to open in the current buffer.
                                               *vifm-:Vifm*
  :Vifm       alias for :EditVifm.
                                               *vifm-:SplitVifm*
  :SplitVifm  split buffer and select a file or files to open.
                                               *vifm-:VsplitVifm*
  :VsplitVifm vertically split buffer and select a file or files to open.
                                               *vifm-:DiffVifm*
  :DiffVifm   select a file or files to compare to the current file with
              :vert diffsplit.
                                               *vifm-:TabVifm*
  :TabVifm    select a file or files to open in tabs.

上記設定例で vicmd変数を lessにして lキーを lessで開くようにしていましたが、 vim plugin から呼び出すと、 lessではなく vim で開かれるようになります。

まとめ

本記事では、 Vim ベースのファイルマネージャ vifm をご紹介しました。皆様のターミナル生活の一助になれば幸いです。

最後までお読みいただきありがとうございました。


Viewing all articles
Browse latest Browse all 5608

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>