パーソナルツール

vimエディタから、いろいろなパターンの方法でファイルを開く

作者: 小見 拓 最終変更 2012年01月08日 11時58分

本記事では、vimエディタで利用できる様々なパターンのファイルの開き方、保存の仕方を紹介します。 中にはあまり利用しない方法もあるでしょうが、読んでみてください。 (Windows, Mac)

概要

本記事では、vimエディタで利用できる様々なパターンのファイルの開き方、保存の仕方を紹介します。
中にはあまり利用しない方法もあるでしょうが、読んでみてください。

ファイルパスの操作

ファイルパスを取得する

ファイルの保存 :write など一部のvimエディタのコマンドで「%」「#」「#{数値}」を使用すると、
「%」「#」「#{数値}」がファイルのパスに置き換えられてから、コマンドが実行されます。

キーワード 説明
% 今開いているファイルのパス。
# 代替ファイルのパス。多くの場合、一つ前に開いていたファイルのパスになります。
#{数値} 指定したバッファ番号のファイルのパス。

ファイルのパーミッションが足りない時の一時的なファイルの作成時や
ファイルをバックアップする時などに、この機能は便利です。

" カレントファイルのファイル名に拡張子「.txt」を付けて保存
" hello.html → hello.html.txt
:w %.txt

" 5番のバッファのファイル名に拡張子「.bk」を付けたバックアップを作成
" hello.html → hello.html.bk
:w #5.bk

" カレントファイルのバックアップファイルを開く
" hello.html → hello.html.bk
:e %.bk

既存の拡張子を取り除く

前章で説明した「%」「#」「#{数値}」に「<」を付けて、「%<」「#<」「#{数値}<」とすると、
拡張子無しのファイルのパスを取得できます。

キーワード 説明
%< 今開いているファイルのパス(拡張子無し)。
#< 代替ファイルのパス(拡張子無し)。多くの場合、一つ前に開いていたファイルの拡張子無しのパスになります。
#{数値}< 指定したバッファ番号のファイルのパス(拡張子無し)。

この機能は、同じディレクトリに拡張子だけが違う一組のファイルがある、あるいは作成する 場合に利用できます。

" C言語のヘッダファイルを開く(同じディレクトリにある場合)
" hello.c → hello.h
:e %<.h

" 拡張子を「.bk」に置き換えて保存
" hello.c → hello.bk
:w %.bk

ファイルパスの置換

「%」「#」「#{数値}」に「:s?{置換前テキスト}?{置換後テキスト}?」を付けると、
パスの一部を変換できます。

キーワード 説明
%:s?{置換前テキスト}?{置換後テキスト}? 今開いているファイルのパスの一部を変換。
#:s?{置換前テキスト}?{置換後テキスト}? 代替ファイルのパスの一部を変換。
#{数値}:s?{置換前テキスト}?{置換後テキスト}? 指定したバッファ番号のファイルのパスの一部を変換。
%:gs?{置換前テキスト}?{置換後テキスト}? 今開いているファイルのパスの一部を変換。
#:gs?{置換前テキスト}?{置換後テキスト}? 代替ファイルのパスの一部を変換。
#{数値}:gs?{置換前テキスト}?{置換後テキスト}? 指定したバッファ番号のファイルのパスの一部を変換。
" カレントファイルのパスに含まれる「abc」を「xyz」に変換する
" abc_abc_abc.txt → xyz_abc_abc.txt
:e %:s?abc?xyz?

" 「:s」の代わりに、「:gs」を使用すると、マッチするテキスト全てを置換する
" abc_abc_abc.txt → xyz_xyz_xyz.txt
:e %:gs?abc?xyz?

この置換機能を多用することはあまりないでしょうが、
たとえば、連番ファイルなど、ファイル名のほんの一部だけが違うファイルを開く時には
覚えておくと役に立つことがあります。

" ap350xu419.pl

:e %:s?419?420?
" ↓ (419を420に置換)
" ap350xu420.pl が開かれる

:e %:s?420?421?
" ↓ (420を421に置換)
" ap350xu421.pl が開かれる

:e %:s?421?422?
" ↓ (421を422に置換)
" ap350xu422.pl が開かれる

ディレクトリの操作

ファイルのディレクトリを取得する

「%」「#」「#{数値}」に「:h」を付けて、「%:h」「#:h」「#{数値}:h」とすると、
ファイルのあるディレクトリまでのパスを取得できます。

キーワード 説明
%:h 今開いているファイルのディレクトリのパス。
#:h 代替ファイルのディレクトリのパス。
#{数値}:h 指定したバッファ番号のファイルのディレクトリのパス。

これを覚えておくと、指定ファイルのディレクトリに移動する時などに便利です。

" カレントディレクトリをファイルのディレクトリに変更する
:cd %:h

" 3番のバッファと同じディレクトリにsample.txtファイルを作成
:w #3:h/sample.txt

Note

Kaoriyaパッチ入りのvimエディタには、

  • カレントファイルと同じディレクトリに移動する :CdCurrent コマンドと、
  • コマンドラインモードで Control-x を押すと、カレントファイルのディレクトリまでのパスを補完する機能

が用意されています。

" 下2つのコマンドはどちらも同じ機能
:CdCurrent

:cd %:h

参考: cmdex.vim : Kaoriyaパッチ ユーティリティコマンド集

別のディレクトリに同じ名前のファイルを作成する

「%」「#」「#{数値}」に「:t」を付けるとファイルの名前だけ、 「:r」を付けると拡張子無しのファイルパスを取得できます。
両方を組み合わせて、同時に使用することもできます。

キーワード 説明
%:t 今開いているファイルのファイル名。
#:t 代替ファイルののファイル名。
#{数値}:t 指定したバッファ番号のファイルのファイル名。
%:t:r 今開いているファイルのファイル名(拡張子無し)。
#:t:r 代替ファイルののファイル名(拡張子無し)。
#{数値}:t:r 指定したバッファ番号のファイルのファイル名(拡張子無し)。

たとえば、同じファイル名のファイルを別のディレクトリに作成したい場合などで、 この方法を利用できます。

" fooディレクトリに同じファイル名のファイルを作成
" 例) sample.txt → foo/sample.txt
:w foo/%:t

" fooディレクトリに同じファイル名で、拡張子「.bk」のファイルを作成
" 例) sample.txt → foo/sample.bk
:w foo/%:t:r.bk

ワイルドカード

ファイルを検索して開く

ワイルドカードを使用すると、 まずパターンに合うファイルを検索し、ファイルが見つかったら開く、 といった処理を行えます。

キーワード 説明
* 0文字以上の全ての文字にマッチする。
? 1文字にマッチする。
[ABC] Aか、Bか、Cにマッチする。
" abcで始まる拡張子「.txt」のファイルを開く
" 例) abcdef.txt
:e abc*.txt

" abcで始まり、次に1文字続く、拡張子「.txt」のファイルを開く
" 例) abcd.txt
:e abc?.txt

" abcで始まり、次にoか、pの文字がくる、拡張子「.txt」のファイルを開く
" 例) abco.txt
:e abc[op].txt

Note

:edit コマンドでは複数のファイルを開けないので、
複数のファイルを開きたい場合は :args コマンドを使用すると良い。

" abcで始まる拡張子「.txt」のファイルを全て開く
" 例) abcd.txt、abcdef.txt、abc.txt
:args abc*.txt

参考: :args」コマンドで一度に複数のファイルを開く。

下位ディレクトリからファイルを検索する

「**」を使用すると、下位ディレクトリ全てから、 パターンにマッチするファイルを検索できます。

キーワード 説明
** 下位ディレクトリ全てに再帰的にマッチする。

この機能は、単純なファイル検索以外にも、
:vimgrep コマンドによるファイル検索時に便利に利用できます。

" 下位ディレクトリにあるhoge.txtを開く
:e **/hoge.txt

" src以下のディレクトリで拡張子「.java」のファイルに、「getVar」のgrep実行
:vimgrep getVar src/**/*.java
" ↓ grep検索結果の確認は「:copen」コマンドを使用する。
:copen

入力の手間を省くためにワイルドカードを使用する

例えば、あるディレクトリに

  • access_log.20080426
  • access_log.20080427
  • access_log.20080428
  • access_log.20080429
  • access_log.20080430

といったファイルがある場合は、

:e *0429

とコマンド入力して「access_log.20080429」ファイルを開けます。

この場合は、ファイルを検索するためではなく、 重複部分「access_log.」の入力の手間を省くために、ワイルドカードを使用しています。
Unixに慣れた人はよくこういったワイルドカードの使い方をするので、覚えておくと良いでしょう。

カーソル下に記述されたファイルを開く

直接ファイルを開く

ノーマルモードで gf コマンドを実行すると、 カーソル下に記述されているテキストと同じ名前のファイルを開けます。
ウィンドウを新しく開き、そのウィンドウでファイルを開くには、 gf ではなく、代わりに Control-w f と実行します。

いくつかバリエーションがありますが、 いずれの方法もファイルが見つからない場合はエラーになります。

モード コマンド 説明
ノーマル gf カーソル下に書かれたテキストと同じ名前のファイルを開く
ノーマル gF
gf と同じだが、ファイルを開くときに行数も指定できる
ビジュアル gf 選択したテキストと同じ名前のファイルを開く
ノーマル Control-w f カーソル下に書かれたテキストと同じ名前のファイルを、新しいウィンドウで開く
ビジュアル Control-w f 選択したテキストと同じ名前のファイルを、新しいウィンドウで開く

一度コマンドラインにファイルパスを読み込んでから開く

コマンドを実行したら、即、カーソル下に書かれたファイルを開くのではなく、
一度、コマンドラインにカーソル下のテキストを読み込んでから、 改めてファイルを開く方法もあります。

この方法は作業が1手多い代わりに、
・ファイルが無くてもエラーにならない(新規ファイルとして開く)
・テキストを読み込んだ後、コマンドライン上で編集してからファイルを開ける、
という利点があります。

やり方は次のとおりです。
まず、コマンドラインモードになり、 :e と入力します。

"(eと半角スペース)
:e

次に、 Control-r Control-w と実行し、カーソル下のテキストを読み込みます。

" カーソル下に「sample.txt」と書いてあったと想定
:e sample.txt

最後に、そのファイルを開くので良ければ、 Enter キーを押してファイルを開きます。

その他のTips

ファイル区切り文字として「/」も使える

Windows環境のファイル区切り文字は「\(バックスラッシュ)」だが、
Unix系環境と同じように「/(スラッシュ)」を使用しても問題ない。

" バックスラッシュ
:e C:\Users\foo\Desktop\sample.txt

" ↑↓ どちらの方法でもファイルを開ける。

" スラッシュ
:e C:/Users/foo/Desktop/sample.txt

ホームディレクトリ、親ディレクトリのファイルを開く

ホームディレクトリは「~」、カレントディレクトリの親ディレクトリは「..」で参照できる。

" ホームディレクトリにあるファイルを開く
:e ~/sample.txt

" カレントディレクトリの上のディレクトリにあるファイルを開く
:e ../parent.txt

環境変数を使う

${変数名}で、ファイルを開く際に環境変数を利用できます。

" 環境変数「HOME」の示すディレクトリにあるファイルを開く
:e $HOME/sample.txt

特別な設定をしない場合、一般的なvimエディタ環境では、次の3つの環境変数を利用できます。

変数 説明
$HOME ホームディレクトリ
$VIM vimエディタのインストールディレクトリ
$VIMRUNTIME vimエディタのランタイムファイルのあるディレクトリ

環境変数を新たに用意したい場合、上書きしたい場合は、
:let コマンドを使用すれば、環境変数を設定できます。

" 環境変数「DESKTOP」を設定する。
" バックスラッシュを使う場合はエスケープが必要。
" スラッシュを使うか、シングルクォーテーションで囲むとエスケープしなくていい。
:let $DESKTOP = "C:/Users/foo/Desktop"

" ↓

" 環境変数「DESKTOP」の示すディレクトリにあるファイルを開く
:e $DESKTOP/sample.txt

注意事項など

今回紹介した方法を使わないで、普通にファイルを開いたり、
いくつかのファイルを一度に読み込んでからバッファ管理系プラグインで ファイルを選択した方が早い事があります。
状況に応じて使い分けてください。

ドキュメントアクション
コメント
blog comments powered by Disqus