105
102

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Vimのマーク機能、使い方まとめ

Last updated at Posted at 2014-05-15

この記事は Vim Advent Calendar 2013 166日目の記事になります。

##はじめに

皆さん、vimのマーク機能使ってますか?

私はあまり使っていませんでした。

しかし、使う機会があったので、これを期に、vimのマーク機能についてまとめてみました。

ちなみに、マーク機能というのは、簡単に言うと、現在地の登録と登録したポイントへのジャンプ機能のことです。

マークを使うことで、現在地を登録しておき、必要になれば、そこにジャンプできます。

##基本

コマンド 内容
:marks mark一覧を表示する
m[a-zA-Z] カーソル位置をmarkする
`` 直前のマークへ移動
C-o 古いマークへ移動
C-i 新しいマークへ移動
`[a-zA-Z] 指定のマークに移動
'[a-zA-Z] 指定のマークの行頭に移動
:delmarks [a-zA-Z] マークの削除
:delmarks! マークの一括削除

http://vim.wikia.com/wiki/Using_marks

##viminfo

mark情報が保存される仕組みは、viminfoにあります。

mark情報は、viminfoを使わないとvimの終了と同時に失われます。

viminfoには、以下の様な情報が記録されます。

viminfoファイルにはこんなものを記憶できる:

  • コマンドラインの履歴
  • 検索文字列の履歴
  • 入力(|input()|)の履歴
  • レジスタの内容
  • 複数のファイルのマーク
    - ファイルの中の位置を指し示すマーク
  • 最後の検索/置換パターン('n' と '&' のため)
  • バッファのリスト
  • グローバル変数

http://vim-jp.org/vimdoc-ja/usr_21.html#21.3

##個人的な設定

個人的には、m,を押すと、uniteでマーク一覧を選択して移動できるようにしています。これは、unite-markを使用します。

あと、マークするには、mを押せば、自動でレジスタが選択されるようにしています。

マーク箇所をハイライトしたい場合などは、visualmark.vimを使えばできます。

~/.vimrc
NeoBundle 'Shougo/unite.vim'
NeoBundle 'tacroe/unite-mark'
NeoBundle 'visualmark.vim'
vimrc
" viminfo
" http://vimwiki.net/?%27viminfo%27
set viminfo='50,\"1000,:0,n~/.vim/viminfo

" unite mark
" https://github.com/tacroe/unite-mark
" http://d.hatena.ne.jp/tacroe/20101119/1290115586
nnoremap <silent> m, :Unite mark<CR>

" mark auto reg
" http://saihoooooooo.hatenablog.com/entry/2013/04/30/001908
if !exists('g:markrement_char')
    let g:markrement_char = [
    \     'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
    \     'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'
    \ ]
endif
nnoremap <silent>m :<C-u>call <SID>AutoMarkrement()<CR>
function! s:AutoMarkrement()
    if !exists('b:markrement_pos')
        let b:markrement_pos = 0
    else
        let b:markrement_pos = (b:markrement_pos + 1) % len(g:markrement_char)
    endif
    execute 'mark' g:markrement_char[b:markrement_pos]
    echo 'marked' g:markrement_char[b:markrement_pos]
endfunction

" visualmark.vim
" http://nanasi.jp/articles/vim/visualmark_vim.html
" map <unique> <C-F3> <Plug>Vm_toggle_sign

http://vimwiki.net/?%27viminfo%27
http://d.hatena.ne.jp/tacroe/20101119/1290115586
http://saihoooooooo.hatenablog.com/entry/2013/04/30/001908

##ヘルプ

###マーク

マーク mark-motions E20 E78

マークへジャンプするには2つの方法があります:

  1. ` (バッククォート)で : カーソルは指定された位置に置かれます。|exclusive|

  2. ' (シングルクォート)で: カーソルは指定された位置の行の最初の非空白文字に置
    かれ移動は行単位です。

       			*m* *mark* *Mark*
    

m{a-zA-Z} カーソル位置を{a-zA-Z}にマークします(これは移動コマン
ドではありません。ですのでカーソルは動きません)。

  				*m'* *m`*

m' or m` 直前位置マークをセットします。"''" もしくは "``" コマ
ンドでこの位置に移動できます。(移動コマンドではありま
せん。ですのでカーソルは動きません)。

  				*m[* *m]*

m[ or m] マーク |'[| or |']| をセットします。オペレータコマンド
が複数のコマンドでシミュレートされるときに便利です。
(移動コマンドではありません。ですのでカーソルは動きま
せん)。

  				*m<* *m>*

m< or m> マーク |'<| or |'>| をセットします。gv コマンドで選
択される範囲を変更するのに便利です。 (移動コマンドあり
ません。ですのでカーソルは動きません)。
Note ビジュアルモードは設定できません。開始と終了の位
置のみ設定できます。

  				*:ma* *:mark* *E191*

:[range]ma[rk] {a-zA-Z'}
[range]の範囲の最後の行番号の0桁目を{a-zA-Z}にマーク
します。デフォルトはカーソル行です。

  				*:k*

:[range]k{a-zA-Z'} :mark コマンドと同じですが、マーク名の前のスペースは挿
入しなくてもよいです。

  				*'* *'a* *`* *`a*

'{a-z} `{a-z} カレントバッファのマーク {a-z} へジャンプ。

  				*'A* *'0* *`A* *`0*

'{A-Z0-9} `{A-Z0-9} マーク {A-Z0-9} を含むファイル・位置へジャンプ。
(別のファイルにある場合は移動コマンドにはなりません)。
{Vi にはありません}

  				*g'* *g'a* *g`* *g`a*

g'{mark} g{mark} {mark} へジャンプするが、カレントバッファ内で移動する 場合にはジャンプリストを変更しない。例: > g"
< これはファイル内の最後の記憶している位置にジャンプする。
$VIMRUNTIME/vimrc_example.vim を参照。
|:keepjumps|も参照。
{Vi にはありません}

  				*:marks*

:marks 現在のマークを全てリストします(移動コマンドではありま
せん)。
|'(|, |')|, |'{| と |'}| マークはリストされません。
1桁目は桁番号0となります。
{Vi にはありません}

  				*E283*

:marks {arg} {arg} で指定されるマークをリストします(移動コマンドで
はありません)。例: >
:marks aB
< マーク 'a' と 'B' をリストします。{Vi にはありません}

  					*:delm* *:delmarks*

:delm[arks] {marks} 指定されたマークを削除します。削除できるマークはA-Zと
0-9などです。マーク'は削除できません。それらはダッシュ
で区切られたマーク名のリストを与えることで指定できます。
スペースは無視されます。例: >
:delmarks a マークaを削除する
:delmarks a b 1 マークa, b, 1を削除する
:delmarks Aa マークA, aを削除する
:delmarks p-z pからzまでのマークを削除する
:delmarks ^.[] マーク^ . [ ]を削除する
:delmarks " マーク"を削除する
< {Vi にはありません}

:delm[arks]! A-Z, 0-9を除くカレントバッファのすべてのマークを削除し
ます。
{Vi にはありません}

マークはどのようにしても見えません。マークは単に覚えておかれるファイル中の位置
に過ぎません。マークと名前付きレジスタを混同しないようにしてください、まったく
別のものです。

'a - 'z 小文字のマークです。1つのファイル中で有効です。
'A - 'Z 大文字のマークで、ファイルマークとも呼ばれます。ファイル間でも
有効です。
'0 - '9 番号マークです。.viminfo ファイルによってセットされます。

小文字のマーク 'a から 'z まではマークのあるファイルがバッファリストに存在す
る限り覚えておかれます。もしファイルをバッファリストから削除するとそのファイ
ルに関するマーク一は全て失われます。またマークを含んでいる行を削除するとその
マークは消されます。

小文字のマークはオペレータコマンドとともに使うことができます。例:
"d't" は現在のカーソル位置からマーク 't' までの行を削除します。アイディア:
マーク 't' をTop 位置に設定したり、'b' を Bottom 位置に設定したりします。小文
字のマークはアンドゥとリドゥによって復元することができます。

大文字のマーク 'A' から 'Z' はファイル名を含んでいます。{Vi: 大文字のマークは
ありません} ファイルからファイルに移動するのに使うことができます。大文字のマー
クをオペレータコマンドとともに使うにはマークは現在のファイルになければなりませ
ん。また大文字のマークの場合は行を挿入/削除したり一時的に他のファイルを編集し
たりしてもマークのある行番号は覚えておかれます。'viminfo' オプションの値が空で
なければ大文字のマークは .viminfo ファイルに保持されます。参照:
|viminfo-file-marks|

番号マーク '0 から '9 まではこれらとはまったく異なります。直接セットすることは
できず、viminfo ファイル |viminfo-file| を使っている場合にのみ存在します。基本
的に '0 は最後に Vim を終了したときのカーソル位置であり、'1 は最後から1個前の
位置、などなどです。特定のファイルを番号マークに保存しないようにするには
'viminfo' の "r" フラグを使ってください。参照: |viminfo-file-marks|

  					*'[* *`[*

'[ `[ 直前に変更またはヤンクされたテキストの最初の文字
へ移動します。
{Vi にはありません}

  					*']* *`]*

'] `] 直前に変更またはヤンクされたテキストの最後の文字
へ移動します。
{Vi にはありません}

なんらかのオペレータコマンドを実行した後は、カーソルはオペレータを施したテキス
トの初めに置かれます。プットコマンド("p" もしくは "P")の後は、カーソルは挿入さ
れた最初の行に位置する場合と最後に挿入された文字に位置する場合があります。上の
4つのコマンドはカーソルをどちらかの終わりに位置させます。例: 10行ヤンクした後、
その行の内の最後の行に移動したい場合は: "10Y']"。数行を "p" コマンドで挿入した
後、1番下に挿入された行に移動したい場合は: "p']"。これはすでに挿入済みのテキス
トに関しても動作させることができます。

Note: 矩形ビジュアルモードを使っているのでない限り、テキストの削除の後は始めと
終わりの位置は同じです。これらのコマンドは、現在のファイルに対してまだ変更がさ
れていない場合は動作しません。

  					*'<* *`<*

'< < 現在のバッファで最後に選択されたビジュアルエリアの最初 の行('<)または最初の文字(<)に移動します。ブロックモー
ドでは最初の行の最後の文字になる場合もあります(選択の
開始位置による)。{Vi にはありません}

  					*'>* *`>*

'> > 現在のバッファで最後に選択されたビジュアルエリアの最後 の行('<)または最後の文字(<)に移動します。ブロックモー
ドでは最後の行の最初の文字になる場合もあります(選択の
'selection' が適用され、位置はビジュアルエリアの直後に
開始位置による)。{Vi にはありません}

  					*''* *``*

'' `` カーソルがジャンプする直前にいた、もしくは最後の "m'"
か "m`" コマンドが行われた位置に移動します。
|:keepjumps| コマンドモディファイヤが使われた場合には
セットされません。
|restore-position| も参照。

  					*'quote* *`quote*

'" `" 現在のバッファを最後に終了した時のカーソル位置に
移動します。デフォルトで最初の行の最初の文字に移動しま
す。それぞれの開いたファイルでこれをどのようにして使う
かについては |last-position-jump|をご覧下さい。
ウィンドウごとに1つではなく、バッファに対して1つの位
置が記憶されます。バッファがあるウィンドウに表示されて
いる間はその位置は変わりません。
{Vi にはありません}

  					*'^* *`^*

'^ `^ 最後に挿入モードが終了したときのカーソル位置に移動しま
す。これは |gi| コマンドで使われます。
|:keepjumps| コマンドモディファイヤが使われたときは
セットされません。
{Vi にはありません}

  					*'.* *`.*

'. `. 最後に変更された場所に移動します。変更が始まった場所
かその近くです。1つのコマンドが複数の変更をすることも
あります。その場合は、変更の最後の近くになります。例え
ば、単語を入力をしたときは、最後の文字の上になります。
{Vi にはありません}

  					*'(* *`(*

'( `( |(| コマンドのように、現在の文の最初に移動します。
{Vi にはありません}

  					*')* *`)*

') `) |)| コマンドのように、現在の文の最後に移動します。
{Vi にはありません}

  					*'{* *`{*

'{ `{ |{| コマンドのように、現在の段落の最初に移動します。
{Vi にはありません}

  					*'}* *`}*

'} `} |}| コマンドのように、現在の段落の最後に移動します。
{Vi にはありません}

これらのコマンドは、それ自身はマークではなく、マークへジャンプします:

  					*]'*

]' カーソルがある行から [count] 個先の小文字のマークがあ
る行の最初の非空白文字へ移動します。
{Vi にはありません}

  					*]`*

]` カーソル位置以降の [count] 個先の小文字のマークへ移動
します。
{Vi にはありません}
['
[' カーソルがある行から [count] 個前の小文字のマークがあ
る行の最初の非空白文字へ移動します。
{Vi にはありません}

  					*[`*

[` カーソル位置より [count] 個前の小文字のマークへ移動し
ます。
{Vi にはありません}

:loc[kmarks] {command} :loc :lockmarks
マークを調整することなく {command} を実行します。
{訳注: 普通にコマンドを実行したときはマーク位置が調整
される}
これは、完了したときの行数が実行前と変わらないような変
更をするときに便利です。
警告:行数が変わった場合には、変更箇所以降のマークは以
前の行番号を持ち続けるので、別の行に移動することになり
ます。
以下のものが行の削除・挿入後に調整されません:
- 小文字のマーク 'a - 'z
- 大文字のマーク 'A - 'Z
- 番号マーク '0 - '9
- 最後の挿入箇所 '^
- 最後の変更箇所 '.
- ビジュアルエリア '< と '>
- 目印が設置された行の番号
- quickfix 箇所の行番号
- |jumplist| 内の位置
- |tagstack| 内の位置
以下のものは調整されます:
- 直前の文脈マーク ''
- カーソル位置
- the view of a window on a buffer
- 折り畳み
- diffs

:kee[pmarks] {command} :kee :keepmarks
現在のところ、フィルターコマンド |:range!| にだけ効果
があります:
- フィルタリングの後の行数が実行前以上の場合、全ての
マークは同じ行番号を持ち続けます。
- 行数が減る場合、削除された行中のマークは削除されま
す。
どちらの場合にも、フィルタされたテキスト以降のマークは
通常通りテキストに一致するよう調整されます。
'cpoptions' オプション中に 'R' フラグがない場合、これ
は ":keepmarks" を使うのと同じ効果があります。

  					*:keepj* *:keepjumps*

:keepj[umps] {command}
{command}の実行中の移動でマーク |''|, |'.|, |'^| と
|jumplist| や |changelist|を変更しないようにします。
自動的に変更やテキストの挿入を行い、ユーザーがその位置
に行きたくないという場合に便利です。例:タイムスタンプ
"Last change" を更新するとき: >

  		:let lnum = line(".")
  		:keepjumps normal gg
  		:call SetLastChange()
  		:keepjumps exe "normal " . lnum . "G"

<
Note ":keepjumps" はコマンドごとに使わねばなりません。
関数を呼び出すとその関数の中のコマンドはジャンプリスト
を変えてしまいます。また、":keepjumps exe 'command '"
とすると、この "command" はジャンプリストを変えてしま
います。そうでなくて ":exe 'keepjumps command'" として
ください。

###ジャンプ

ジャンプ jump-motions

「ジャンプ」とは次のコマンドのどれかを意味します: 新しいファイルの編集を始める
コマンドと、"'", "`", "G", "/", "?","n", "N", "%", "(", ")", "[[", "]]",
"{","}", ":s", ":tag", "L", "M", "H" です。これらのコマンドのうちのどれかを
使ってカーソルを「ジャンプ」させた場合、ジャンプする前のカーソルの位置は覚えて
おかれます。その位置を含む行を削除したり変更したりしていなければ、"''" と
"``" コマンドを使ってその位置に戻ることができます。

  					*CTRL-O*

CTRL-O ジャンプリストの中の [count] だけ古いカーソル位置に移
動します(移動コマンドではありません)。
{Vi にはありません}
{|+jumplist| 機能なしのときは使用できない}

or CTRL-I
CTRL-I ジャンプリストの中の [count] だけ新しいカーソル位置に
移動します(移動コマンドではありません)。
{Vi にはありません}
{|+jumplist| 機能なしのときは使用できない}

  					*:ju* *:jumps*

:ju[mps] ジャンプリストを表示させます(移動コマンドではありませ
ん)。{Vi にはありません}
{|+jumplist| 機能なしのときは使用できない}

  					*jumplist*

ジャンプはジャンプリストに覚えておかれ、CTRL-O と CTRL-I コマンドで前の古い位
置に移動し、そして再び新しい位置に戻ることができます。このようにしてジャンプリ
ストの中を上下に移動することができます。ジャンプリストはそれぞれのウィンドウで
分かれており、エントリの最大の数は50に固定されています。
{|+jumplist| 機能なしのときは使用できない}

例えば、3回ジャンプを行った後ではジャンプリストは次のようになっています:

jump line col file/text ~
3 1 0 some text ~
2 70 0 another line ~
1 1154 23 end. ~

~

"file/text" 欄はファイル名か現在のファイルであればジャンプするテキストを表示し
ています(インデントは取り除かれ、そして長い行はウィンドウに合うように短くカッ
トされます)。

現在1167行目にいるとして、CTRL-O コマンドを使うとカーソルは1154行目に移動しま
す。結果として次のようになります:

jump line file/text ~
2 1 some text ~
1 70 another line ~

0 1154 end. ~
1 1167 foo bar ~

ポインターは最後に使われたジャンプ位置にセットされます。次の CTRL-O コマンドは
エントリの上に、次の CTRL-I コマンドはエントリの下に移動するのに使います。ポイ
ンターが最後のエントリの下に位置している場合、このことは前に CTRL-I もしくは
CTRL-O を使っていないことを意味します。この場合 CTRL-O コマンドを使うとカーソ
ル位置がジャンプリストにくわえられます。そうしてその CTRL-O コマンドを使う前の
位置に戻ることもできます。この場合は1167行目です。

さらに CTRL-O コマンドを実行することで70行目と1行目に移動し、CTRL-I コマンドを
使うことで再び1154行目と1167行目に戻ることができます。"jump" 欄の数はこの場所
に移動するのに何回の CTRL-O もしくは CTRL-I コマンドが必要なのかを示しているこ
とも覚えておいてください。

ジャンプコマンドを使うと現在の行がジャンプリストの最後に加えられます。同じ行が
すでにジャンプリストにあった場合はそれは削除され、結果としては CTRL-O を繰り返
していると以前の場所には一度だけ戻ることになります。

|:keepjumps|コマンド修飾子が使われた場合、ジャンプ操作はリストに記憶されませ
ん。また、他の場合にもジャンプ操作は記憶されません。例. |:global|の中。
明示的にジャンプリストに追加するにはマーク'を設定します。

CTRL-O コマンドを行って1154行目に移動した後、他のジャンプコマンド(例えば: "G")
を実行したとするとジャンプリストは次のようになります:

jump line col file/text ~
4 1 0 some text ~
3 70 0 another line ~
2 1167 0 foo bar ~
1 1154 23 end. ~

~

行が削除されたり挿入された場合は行番号も調整されますが、保存しないで(":n!" コ
マンドなどを使って)編集を中断した場合は失敗します。

ウィンドウを分割すると、ジャンプリストは新しいウィンドウにコピーされます。

'viminfo' オプションに項目 ' を含めていると、viminfo ファイルにジャンプリスト
が保存され、Vim を起動したときに復元されます。

変更リストへのジャンプ changelist change-list-jumps E664

変更がなされたとき、カーソル位置が記憶されます。アンドゥできる全ての変更に対
し、それが前の変更に近くない限り、1つの位置が記憶されます。変更点やアンドゥさ
れた位置へジャンプするのに、以下の2つのコマンドを使うことができます。

  					*g;* *E662*

g; 変更リスト中の [count] 個前の位置に移動します。
[count] が前の変更箇所の数より大きければ、最も古い変更
箇所へ移動します。
それ以上古い変更が無ければエラーメッセージが表示されま
す。(移動コマンドではありません)
{Vi にはありません}
{|+jumplist| 機能なしのときは使用できない}

  					*g,* *E663*

g, 変更リスト中の [count] 個後の位置に移動します。
|g;| の逆方向で、あとは同様です。
(移動コマンドではありません)
{Vi にはありません}
{|+jumplist| 機能なしのときは使用できない}

count を使うと、可能な限り前/後にジャンプできます。つまり、"999g;" とすると
履歴に残っている最初の変更箇所へジャンプできます。変更リストのエントリの数は固
定されていて、|jumplist| のものと同じです。

アンドゥ可能な変更が2回、同じ行の 'textwidth' よりも小さい桁で行われたときは、
後者だけが記憶されます。これは "xxxxx" のような一連の小さな変更をリストに残す
のを避けるためです。'textwidth' が 0 のときは 'wrapmargin' が使われます。
'wrapmargin' もセットされていないときは 79 となります。詳細:速度が落ちるのを
避けるため、計算には文字数でなくバイト数が使われます (これはマルチバイトエン
コーディングに対してのみ関係します)。

テキストが挿入または削除されると、カーソル位置が変更箇所と少しずれるかもしれま
せん。(特に行が削除されたときは)

|:keepjumps| コマンドモディファイヤが使われたときは変更箇所は記憶されません。

  					*:changes*

:changes 変更リストを表示します。文字 ">" のついているエントリ
は現在の位置であることを示しています。変更が行われると
">" は最新のエントリの下になり、"g;" で最新のエントリ
の場所に移動できることを表します。1列目はその場所に移
動するのに必要な count を示しています。例:

  		change line  col text ~
  		    3     9    8 bla bla bla
  		    2    11   57 foo is a bar
  		    1    14   54 the latest changed line
  		>

  	"3g;" とすると9行目に移動します。すると次の ":changes"
  	の出力はこうなります:

  		change line  col text ~
  		>   0     9    8 bla bla bla
  		    1    11   57 foo is a bar
  		    2    14   54 the latest changed line

  	この状態で "g," とすると11行目に移動し、"2g," とすると
  	14行目に移動します。

###viminfoファイル

viminfoファイル viminfo viminfo-file E136
E575 E576 E577

いったんVimを終了させ、後に再び起動する時には、通常多くの情報が失われてしま
う。viminfoファイルは終了する時の情報を保存しておくのに使用され、それにより再
起動した時には同じ状態で編集セッションを続けることができる。

ユーザーマニュアルの|21.3|で簡単に紹介されている。

viminfoファイルにはこんなものを記憶できる:

  • コマンドラインの履歴
  • 検索文字列の履歴
  • 入力(|input()|)の履歴
  • レジスタの内容
  • 複数のファイルのマーク
  • ファイルの中の位置を指し示すマーク
  • 最後の検索/置換パターン('n' と '&' のため)
  • バッファのリスト
  • グローバル変数

コンパイル時に|+viminfo|機能が無効にされていたら、viminfoファイルはサポートさ
れない。

セッションファイルも使用することができる。viminfoファイルは「している仕事」に
依存しない、という点で異なる。通常viminfoファイルは一つしか存在しない。セッ
ションファイルは、ある特定の編集作業の状態を保存するのに使う。セッションファイ
ルは、作業しているプロジェクト毎に複数作成することが可能である。Viminfoもセッ
ションファイルどちらも、Vimをスタートしてすぐに好みの設定を行うという目的のた
めに、効果的に使用できる。 |session-file|

  					*viminfo-read*

Vimが起動した時に 'viminfo' オプションが空でなかったら、viminfoファイルが読み
込まれ、その情報は適切に使用される。変数 |v:oldfiles| がセットされる。起動時に
はマークは読み込まれない(しかしファイルマークは読み込まれる)。起動時に
'viminfo' オプションをどうやって設定するのかは|initialization|を参照。

  					*viminfo-write*

Vimが終了する時に 'viminfo' が空でなかったら、情報がviminfoファイルに保存され
る(もし既に存在した場合には、それと合併(マージ)される)。'viminfo' オプション
は、どのような情報を保存するか、またどのくらいの量を保存するべきかその限界を指
定する為の情報を含む文字列である。('viminfo' 参照)。

Note: Unixにおける注意点:

  • viminfoファイルには入力したテキストや、使用したコマンドが記載されているの
    で、他人に覗かれないように保護(パーミッション設定)したほうが良い。
  • 複数のユーザーでviminfoファイルを共有したい時(例えば他のユーザーへ "su" する
    時など)には、グループもしくは全員にviminfoファイルへの書き込み権限を与える。
    Vimが新しくviminfoファイルを保存するときに、その設定を維持する。しかし、誰に
    でもviminfoファイルを読ませたり書かせたりすべきではないし、注意が必要。
  • 現在の "本当" のユーザーによって書き込み不能なviminfoファイルは、Vimは決して
    上書きしない。これは "su" でrootユーザーになった時、しかし$HOMEがまだ通常ユー
    ザーのホームディレクトリのままの時の支援となる。そうでないとVimはroot所有の、
    他の誰にも読めないviminfoファイルを作成してしまう。
  • viminfo ファイルはシンボリックリンクであってはならない。セキュリティ上の問題
    を避けるためである。

マークは個々のファイルに対して別々に保存される。ファイルが読み込まれ 'viminfo'
が空でない場合、viminfoファイルからマーク情報が読み込まれる。NOTE: マークはVim
が正常に終了したときにだけ保存される。また、Vimの起動中に開かれた ":bdel" され
ていないファイル全てのマークが記録される。もしも ":bdel" で破棄したファイルに
ついてマークを保存しておきたいのならば、":wv" を使う。'[' と ']' のマークは保
存されないが、'"' は保存される。'"' マークはファイルを開いたときに前回のカーソ
ル位置を復元するのに非常に便利である。'viminfo' に文字 "r" が与えられた時には、
一切のマーク情報は記録されない。これはリムーバブルメディア上のファイルのマーク
が保存されるのを避ける場合に使う(MS-DOSでは "ra:,rb:" を、Amigaでは
"rdf0:,rdf1:,rdf2:" を使う)。viminfo ファイルにマークが記録されているファイル
の名前が |v:oldfiles| のリストに追加される。

  					*viminfo-file-marks*

大文字のマーク ('A から 'Z) はviminfoファイルが書かれるときに、保存される。数
字のマーク ('0 から '9) はちょっと特別である。viminfoファイルが書き込まれる時
(終了時、もしくは ":wviminfo" コマンド実行時)に、'0 が現在のファイルの現在の
カーソル位置に設定される。古い '0 は '1 になり、'1 は '2 になり、以下同様。"1
から "9 の削除レジスタに起こることに似ている。'0 に記憶する位置が '1 から '9
に既出であった時には、同じ位置が2度記憶されるのではなく、そのレジスタが '0 に
浮き上がってくる。結果として "'0" を使用すると、最後にVimを終了した時のファイ
ルとその行に戻ることができる。起動後直ちにそれを行うには、次のコマンドを試す: >

vim -c "normal '0"

csh 互換なシェルではエイリアスをこんな風に使用して: >

alias lvim vim -c '"'normal "'"0'"'

bash ライクなシェルでは: >

alias lvim='vim -c "normal '''0"'

特定のファイルのマークを保存しないようにするには 'viminfo' に "r" フラグを追加
する。

Viminfoファイルの名前 viminfo-file-name

  • viminfoファイルの名前を特に指定しない時は、UnixとOS/2では "$HOME/.viminfo"
    に、Amigaでは "s:.viminfo" に、MS-DOSとWin32では "$HOME_viminfo" になる。
    MS-DOSとWin32で、$HOMEが設定されていない時には、"$VIM_viminfo" になる。$VIM
    も設定されていない時には "c:_viminfo" が使われる。OS/2では、$HOMEが設定され
    ず$VIMが設定されていれば "$VIM/.viminfo" となる。
  • 'viminfo' オプションの 'n' フラグは、別の名前のviminfoファイルを使うために、
    そのファイル名を指定するのに使用される|'viminfo'|。
  • Vimの起動引数 "-i" も、viminfoとして別のファイルを指定するのに使用できる|-i|。
    ファイル名として "NONE" (全て大文字)が与えられると、viminfoファイルは使用(読
    み込みも書き込みも)されない。
  • 起動後に、コマンドで別の名前を与えると、デフォルト名や 'viminfo' や "-i" で
    与えた名前を上書きすることができる("-i" はNONEが指定されていない時に限る)。

文字エンコーディング viminfo-encoding

viminfoファイルのテキストはオプション 'encoding' で指定したエンコーディングで
保存される。通常は 'encoding' の設定はいつも同じなので、問題なく機能する。しか
しながら、もしもviminfoファイルを読み込むときに、'encoding' の設定がviminfoファ
イルを保存したときとは違うエンコーディングに設定されていると、いくつかのテキス
ト(ASCII以外の文字)は不正な文字になってしまう。それを回避するには、オプション
'viminfo' に 'c' フラグを追加する: >
:set viminfo+=c
そうするとVimは、viminfoファイルを保存したときの 'encoding' から現在の
'encoding' へとテキストを変換する。これを利用するには|+iconv|が有効になってい
る必要がある。ファイル名は変換されない。

viminfoファイルを手動で読み書きする viminfo-read-write

viminfoファイルを手動で読み書きするのに2つのコマンドが用意されている。これは同
時に起動している複数のVim間で、レジスタの内容を交換するのに利用できる: まず片
方で ":wv" してから、もう片方で ":rv" する。既にレジスタに何かを記憶している場
合には、":rv!" する必要があることに注意。またこれを行うとコマンドラインの履歴
を含む全ての情報が、送り側のVimのもので上書きされてしまうことにも注意。

viminfoファイル自体を手で編集することもできるが、Vimによって作られる正しい
フォーマットのviminfoを元にすることを推奨する。一度試してみればどういう構造に
なっているかよく分かるだろう。これを覚えておけば、Vimを起動したときにいつでも
設定しておきたい内容を、"~/.my_viminfo" というようなファイルに用意しておくとき
に重宝する。例としては、あるデータをレジスタに予め読み込んでおくとか、コマンド
ライン履歴に特定のコマンドをいれるとか、そういう使い方がある。.vimrcファイルに
次の一行を入れておけば >
:rviminfo! ~/.my_viminfo
その情報を読み込むことができる。ファイルの種類によって(Cコードだとかvimスクリ
プトだとか)、異なるviminfoを持ち、":autocmd" を組み合わせることでファイル名に
基づいたりしながら、それらを使用することもできる(|:autocmd|)参照。

  					*viminfo-errors*

Vimがviminfoファイルを読み込み中にエラーを検出すると、ファイルの上書きはされな
くなる。もしも10個以上のエラーがある場合には、それ以上viminfoファイルを読み込
むのを止める。こうするのはviminfoファイル内のファイル名が間違っている場合、突
発的にそのファイルを破壊してしまうのを避けるためである。これは "vim -R file"
としたいときに、誤って "vim -i file" とタイプしてしまうと起こり得る(そう、偶然
何人かが実際にそうしてしまったよ!!)。viminfoファイルにエラーがあったけれども
viminfoを上書きしたいのならば、エラーを修正するか、またはファイルを消すかのど
ちらかが必要(Vimの実行中は、ほとんどの情報が回復してしまう)。

  				   *:rv* *:rviminfo* *E195*

:rv[iminfo][!] [file] viminfoファイルを fileから読込
む。[!]が与えれらた場合、既に設定されている情報(レジス
タ、マーク、|v:oldfiles|、その他)は上書きされる。{Vi
にはない}

  			*:wv* *:wviminfo* *E137* *E138* *E574*

:wv[iminfo][!] [file] viminfoファイルを fileとして保
存する。まず既存のファイルの(古い)情報が読み込まれ、
Vim内部の(新しい)情報とマージ(合併)されてから、ファイ
ルに保存される。[!]を指定すると古い情報は読み込まれ
ず、Vim内部の情報だけが保存される。'viminfo' が空("")
に設定されている場合は、100個のファイルのマークが書き
出される。
"E138: Can't write viminfo file" ("E138: viminfoファイ
ルを保存できません") というエラーが出たときには古い一
時ファイル (例えば~/.viminf*) が残っていないことを確か
め、.viminfoファイルを保存するディレクトリの書込み権限
を確認すること。
{Vi にはない}

  				*:ol* *:oldfiles*

:ol[dfiles] viminfo ファイルにマークが記録されているファイルのリス
トを表示する。起動時にこのリストが読み込まれ、
":rviminfo!" を行った後でのみ変更される。|v:oldfiles|
も参照。このリストで表示される番号は |c_#<| で使うこと
ができる。
{Vi にはない。|+eval| 機能付きでコンパイルされたときの
み有効}

:bro[wse] ol[dfiles][!]
|:oldfiles| と同じようにファイルのリストを表示し、番号
の入力を待つ。有効な番号が入力されると、リスト中のその
ファイルを開く。
|press-enter| プロンプトが表示されたときは "q" を押す
とファイル番号を入力するプロンプトに戻れる。
! をつけると変更中のバッファを破棄する。|abandon|
{tiny または small でコンパイルされたときは利用できな
い}

105
102
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
105
102

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?