phoenix-powerこの記事はVim Advent Calendar 2014の10日目の記事です!Vimのマークについて最近試してみたプラグインなどを紹介します。

Vimのマークとは

ここで言う、Vimのマークとは、Vimで使う:markコマンド、またはそれに類する機能のことを言います。

マークした箇所への移動を提供します。

皆さん、この機能って使ってますか。

多分、使ってない方が多いと思われるのですが、巨大なファイルを扱うことが多い時は、この機能は結構便利なのです。

ここで、特徴的なのは、指定する文字列である[a-z],[A-Z],[0-9]で内容が異なることです。

例えば、:mark aとするのと、:mark Aとするのとでは、ファイル間の移動を実現するか否かに違いが出てきます。

具体的には、小文字はマークの移動できませんが、大文字は移動できます。

また、前回終了時の行は、0にマークされていますので、'0で飛ぶことができたりします。

ただし、マークを残すかどうかは、set viminfoの設定にもよりますので注意してください。

マークした箇所は、:marksで確認できるようになっています。

最近使いはじめたプラグイン

vim-showmarks

このプラグインは、マークを行番の横に表示してくれたりします。

NeoBundle 'jacquesbh/vim-showmarks'
~/.vimrc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
nn [Mark] <Nop>
nm <leader>m [Mark]

" jacquesbh/vim-showmarks {{{
" 最初からマークを表示する
aug show-marks-sync
        au!
        au BufReadPost * sil! ShowMarksOnce
aug END

" マークと表示の更新を同時に行う
nn [Mark] :<C-u>call <SID>AutoMarkrement()<CR><CR>:ShowMarksOnce<CR>
" マークの全削除を行うコマンドを設定する
com! -bar MarksDelete sil :delm! | :delm 0-9A-Z | :wv! | :ShowMarksOnce
" マークの削除
nn <silent>[Mark]d :MarksDelete<CR>
" }}}

現在の設定

最終的に、マーク関連の設定は以下のようになりました。

<leader>mでマークし、<leader>mmで飛びます。<leader>mdで削除です。

NeoBundle 'jacquesbh/vim-showmarks'
NeoBundle 'tacroe/unite-mark'
~/.vimrc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
" marks {{{
set viminfo='50,\"1000,:0,n~/.vim/viminfo
set foldmethod=marker
let g:showmarks_marks_notime = 1
let g:unite_source_mark_marks = '01abcABCDEFGHIJKLNMOPQRSTUVWXYZ'
let g:showmarks_enable       = 0
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',
    \     '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'
    \ ]
en

fu! 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)
    en
    exe 'mark' g:markrement_char[b:markrement_pos]
    echo 'marked' g:markrement_char[b:markrement_pos]
endf

aug show-marks-sync
        au!
        au BufReadPost * sil! ShowMarksOnce
aug END

nn [Mark] <Nop>
nm <leader>m [Mark]
nn <silent> [Mark]m :Unite mark<CR>
nn [Mark] :<C-u>call <SID>AutoMarkrement()<CR><CR>:ShowMarksOnce<CR>
com! -bar MarksDelete sil :delm! | :delm 0-9A-Z | :wv! | :ShowMarksOnce
nn <silent>[Mark]d :MarksDelete<CR>
" }}}