gVim覚書

(最終更新日 11/08/14-11:33:31)


vim の設定

.vimrc

vi の設定は .exrc に記述する。vim では .vimrc が使える。 互換性を考えれば .vimrc に記述したほうが良い。 例えば、起動時に行番号表示を行う設定にするには .vimrc に
set number
と記述しておく。 他にもいろいろな設定が出来るがここでは自分が設定している内容を示す。 Linuxとcygwin(cygterm)さらにはWindows用の vim で共通で使えるようにしてある。
" -----------------
"  vimrc for janus
" -----------------

" Source other vim command
if has("gui_win32")
	if $TERM == ""
		set shell=$BASHPATH\ --login
	else
		set shell=$BASHPATH
	endif
	set shellslash

	" Add .vim directory to runtimepath
	set runtimepath+=$HOME\.vim

	" Windows setting for Access permissions
	set backupcopy=yes
	set nobackup
endif

" Common options
syntax on
"set incsearch
"set nobk
"set number
"set smartcase
"set wildmode=list
set autoindent
set backspace=indent,eol,start
set encoding=japan
set grepprg=search\ $*
set hlsearch
set iminsert=0
set imsearch=0
set listchars=eol:$,tab:>-
set nowrap
set ruler
set shiftwidth=4
set shortmess+=I
set showcmd
set tabstop=4
set visualbell
set scrolloff=2

if has("gui_win32")
	set guifont=MS_ゴシック:h12:cSHIFTJIS
	set printfont=MS_ゴシック:h10:cSHIFTJIS
	" autocmd GUIEnter * simalt ~x
	" autocmd GUIEnter * winpos 100 0
	autocmd GUIEnter * winsize 80 52
else
	au BufNewFile,BufRead fstab setf fstab
	if has("gui_running")
		if $LANG == "ja_JP.eucJP"
			inoremap   :set iminsert=0
			if $HOSTNAME == "vaio"
				" set guifontset=-alias-fixed-medium-r-normal-*-*-160-*-*-c-*-jisx0201.1976-0
				set printfont=-alias-fixed-medium-r-normal-*-*-160-*-*-c-*-jisx0201.1976-0
				set guifont=gothic\ Medium\ 14
			else
				set guifontset=-alias-fixed-medium-r-normal-*-*-160-*-*-c-*-jisx0201.1976-0
				set printfont=-alias-fixed-medium-r-normal-*-*-160-*-*-c-*-jisx0201.1976-0
			endif
			set imactivatekey=S-space
		endif
		autocmd GUIEnter * winsize 80 45 
	else
		set mouse=a
	endif
endif
colorscheme jancol

" Key mapping for search
vnoremap  y/\V=substitute(escape(@",'/'),"\n","\\\\n","g")/
vnoremap  y?\V=substitute(escape(@",'/'),"\n","\\\\n","g")?
nnoremap  /
nnoremap  ?

" for autocmd
if has("autocmd")
	filetype plugin indent on
	autocmd FileType text setlocal textwidth=78
	autocmd BufReadPost *
				\ if line("'\"") > 0 && line("'\"") <= line("$") |
				\   exe "normal g`\"" |
				\ endif
	autocmd BufEnter * :cd %:p:h
endif

" for local setting
set tags+=../tags,../../tags,../../../tags

.bashrc

vi のエイリアスを作成し、CUI/GUI の vi が自動で起動されるようにする。
alias vi='vifunc'

function vifunc()
{
    if [ $OSTYPE == cygwin ]; then
        if [ $TERM == cygwin ]; then
            env HOME=$DHOME LANG=ja gvim `dospath.pl $@`
        else
            if [ $CYGTERM ]; then
                env HOME=$DHOME LANG=ja gvim `dospath.pl $@`
            else
                env LANG=ja vi $@
            fi
        fi
    else
        if [ -z $SSH_TTY ]; then
            env LANG=ja_JP.eucJP gvim $@
        else
            command vi $@
        fi
    fi
}

プログラミングで便利な機能

make

プログラムを作るとき、特に統合環境で無い場合は Makefile を使用します。 Makefile があればコマンドラインで make とタイプすることでコンパイル・リンクなど依存関係に応じて行ってくれます。 コンパイルエラーなどがあればエラーファイルと行番号とエラー情報が表示されます。 エラーが多くて表示がスクロールしてしまったときなんかは make 2>&1 | less とかで エラー行を確認して修正を行います。 vim では :make で同一の動作が行えます。 viを終了することなく make が行えるので非常に有効なコマンドです。 エラー情報は :cw で別ウインドウで表示可能です。 そこに表示されているエラー行でエンターキーを押せばエラー位置にジャンプします。 他に cc,cp,cn コマンドを使えばエラー発生行(前後)にジャンプ可能です。 ちなみに、ウインドウ移動は <C-w>-<C-w> です。

grep

テキストファイル内の文字列を検索する場合は grep を使用します。 コマンドラインから grep hoge * とタイプすればカレントファイル内から hoge という文字列を検索してくれます。 vim でも同様に :grep hoge * とタイプすれば grep を実行してくれます。 make の時と同様で結果は :cw でウインドウが表示されます。 さて、検索範囲をカレントディレクトリ以下に拡張したい場合はどうするか? 私は search というスクリプトを組んでいます。
#!/bin/bash

function usage()
{
    echo "usage : search [-option] string"
    echo "サブディレクトリを含めて string を検索します"
    echo "  -f         シンボリックリンクをたどります."
    echo "  -g         grepコマンドと同じにします."
    echo "  -n PATTERN ファイル名パターンを指定します."
    echo "  -C DIR     検索対象パスを指定します."
    exit
}

OPT_PATH=.
while getopts ":fgn:C:" option
do
    case $option in
        f ) OPT_FL="-follow"
            ;;
        g ) OPT_GREP=YES
            ;;
        n ) OPT_PTN=$OPTARG
            ;;
        C ) OPT_PATH=$OPTARG
            ;;
        ? )
            usage
            ;;
    esac
done
shift $(($OPTIND-1))

if [ $# -eq 0 ]; then
    usage
fi

if [ "$OPT_GREP" = "YES" ]; then
    if [ $# -eq 1 ]; then
        grep -n $1 *
    else
        grep -n $@
    fi
else
    if [ ! -z "$OPT_PTN" ]; then
        find $OPT_PATH $OPT_FL -name "$OPT_PTN" -exec grep -nH "$1" {} \;
    else
        find $OPT_PATH $OPT_FL -exec grep -nH "$1" {} \;
    fi
fi
このスクリプトを vim の grep コマンドに対応させることが可能です。 .vimrc に次の行を記述してます。search スクリプトは $HOME/bin にあるとします。
set grepprg=$HOME/bin/search\ $*
すると :grep で使用されるコマンドは search になります。 サブディレクトリ以下のファイルを対象に文字列検索も vim のみで簡単に行えるようになります。

タグジャンプ

プログラムを作っていて関数が複数のファイルに分散しているときってコードを追うのが大変な場合があります。 そんな時はコマンドラインで ctags -R . とします。(Makefileに記述するほうが無難) カレントディレクトリ以下のファイルを再帰的に検索し tags という名前のタグファイルを作成してくれます。 これがある時、関数の上で C-[ ([ + <C-d>) を行うとその関数の定義位置にジャンプしてくれます。 戻るときは <C-o> または <C-t> です。#define などの定義値を参照する場合は [ + d です。 この場合はジャンプするのでなく最下段に定義情報を表示してくれます。

キーのレコード

キーの繰り返しは . (ドット)が有名です。 1アクションを繰り返しに使うのが便利ですが、もっと多くのキー操作を覚えることが出来ます。 q[a-z] です。例えば qzi"<ESC>a"<ESC>0jq で z に記録されます。 再生は @z です。 この例は行を " で括ります。 5@z とすると 5 行を " で括ることが出来ます。 <C-a> や <C-x> と組み合わせると強力な使い方が出来ます。

検索

検索は / です。これは検索文字を入力後に文字列を検索してくれます。 他に単語の上で * を押せば単語を検索してくれます。 表示されている文字から検索文字を取得することもできます。 これはチョット複雑なので私の場合ファンクションキーに登録しています。
vmap <F3> y/\V<C-R>=substitute(escape(@",'/'),"\n","\\\\n","g")<CR>/<CR>
ビジュアル選択時(v)に F3 を押すとその文字を検索します。^@ などキー入力が困難なコントロール文字を 検索(もしくは置換)対象にするときに重宝します。 この場合、y でヤンクし /\V で 検索対象を正規表現無しに設定しています。 <C-r>= で内部関数を呼び出します。@" にはヤンクされた文字列が格納されていて / をエスケープし 改行をエスケープ後の文字で置換した結果を検索文字にしています。 特に <C-r>= は置換のときも使える技で重宝します。

検索(その2)

ヤンクしてる文字を検索文字として使用したい場合は、検索状態で(最下段に / が表示されている状態)で <C-r>を押した後、ヤンクしているレジスタを指定します。例えば Y でヤンクした場合、 <C-r>" です。

taglistの使用

taglist.vimというスクリプトがあります。 これをインストールすると :Tlist とコマンドを打つだけで ウインドウ分割され様々なソースに対応したタグ情報を表示してくれます。例えば C 言語だと 関数、変数、マクロの一覧が表示されます。もちろん、このウインドウで関数をダブルクリックすれば 一発でその関数にジャンプします。WindowsでもLinuxでも動作するのでとっても便利です。

cppcompleteの使用

VisualC++等を使っていると、あるクラス(構造体)の変数を使用している際、そのクラスのメンバ変数や関数名は ドットやアローを使用した瞬間に選択可能となります。この機能ってコーディングを楽にさせてくれますよね。 これに似たことも gVim では可能です。スクリプト cppcomplete をインストールしましょう。 ctags を利用しますが同等の機能が使用できます。さすがに、ドットを打った瞬間に反応とは行きませんが ファンクションキーを押せば補完機能に似たイメージで候補が出てきます。

ssh でネットワーク先のファイル編集

ネットワーク先のファイルを編集したい場合があります。ログインして編集を行っても良いのですが、 単純な参照やコピペ元ネタとして使用したい場合などは vi で開いた方が何かと便利です。 ネットワーク先のホストが sshd を起動している場合は :sp scp://user@host/path を実行してみましょう。 gVim ならパスワード入力のダイアログのあと、既存 vi でファイルを編集できるようになります。 ssh 以外でも rcp, ftp 等が使える模様です。詳しくは :help scp

差分表示

テキストファイルの差分表示には diff コマンドを使います。 結果は人にあまり優しくないですが・・・(サイドバイサイドでもちょっと・・)。 しかし、vi で差分表示を行うと結構見やすいです。使用方法は :diffsp xxxx と打てば現在開いているファイルと xxxx の差分を vi 上で表示されます。一致部分はフォールド状態です。フォールドは za コマンドで開閉可能です。 垂直で分割する場合は :vert diffsp を使用します。もちろんファイル名には scp://user@host/path なんかも 指定できます。
[トップページ]