viを使う 5

viを使う 4
の続きです。

.vimrcを編集してviの設定をします。

cscopeに対する設定をします。

vimのバージョンは7.4と8.0を想定しています。

Macの最初から入っているvim、brewでインストールしたvim、さくらのレンタルサーバーのvimで動作確認しています。
Raspberry Piでも動作すると思います。

.vimrcを編集する 5 : cscopeに対する設定をする

cscopeに対する設定をします。

下記から設定を持ってきて、画面の垂直分割、水平分割、はしない、と決めて、簡単にします。
便利かもしれないですが、cscopeのジャンプ先が新しい画面で開く使い方をしない人も多い気がします。必要になったら追加してください。
CSCOPE settings for vim

cscopeの設定のどこかで失敗すると、失敗した行からそれ以降の設定の全てが読み込まれません。
立ち上げのときには.vimrcに対するデバッグが必要です。

Happy cscoping

.vimrcを編集して、viの設定をしていきます。
設定とその内容について説明します。

ホームディレクトリの.vimrcを編集します。


% vi ~/.vimrc

.vimrc


"" cscope

if has("cscope")

    " ------------------------------------------------------------------------------

    "" use both cscope and ctag for 'ctrl-]', ':ta', and 'vim -t'

    " set cscopetag

    "" check cscope for definition of a symbol before checking ctags: set to 1
    "" if you want the reverse search order.

    " set csto=0

    "" add any cscope database in current directory
    "" else add the database pointed to by environment variable

    " if filereadable("cscope.out")
          cs add cscope.out
    " elseif $CSCOPE_DB != ""
    "     cs add $CSCOPE_DB
    " endif

    "" show msg when any other cscope db added

    " set cscopeverbose

    " ------------------------------------------------------------------------------

    "   's'   symbol: find all references to the token under cursor
    "   'g'   global: find global definition(s) of the token under cursor
    "   'c'   calls:  find all calls to the function name under cursor
    "   't'   text:   find all instances of the text under cursor
    "   'e'   egrep:  egrep search for the word under cursor
    "   'f'   file:   open the filename under cursor
    "   'i'   includes: find files that include the filename under cursor
    "   'd'   called: find functions that function under cursor calls

    nmap <C-\>a :cscope add cscope.out<CR>

    nmap <C-\>s :cscope find s <C-R>=expand("<cword>")<CR><CR>
    nmap <C-\>g :cscope find g <C-R>=expand("<cword>")<CR><CR>
    nmap <C-\>c :cscope find c <C-R>=expand("<cword>")<CR><CR>
    nmap <C-\>t :cscope find t <C-R>=expand("<cword>")<CR><CR>
    nmap <C-\>e :cscope find e <C-R>=expand("<cword>")<CR><CR>
    nmap <C-\>f :cscope find f <C-R>=expand("<cfile>")<CR><CR>
    nmap <C-\>i :cscope find i ^<C-R>=expand("<cfile>")<CR>$<CR>
    nmap <C-\>d :cscope find d <C-R>=expand("<cword>")<CR><CR>

endif
参考にしたホームページから、画面の水平分割と垂直分割に対するmapを削除しています。デバッグ用にcscope addのmapを追加しています。
mapの前のどこかで失敗すると、それ以降の設定がされなくなるので、「なんだかよくわからないけどcscopeが使えない」となって、cscope -Rbで失敗してしまっているのか、.vimrcの記述が間違っているのかわからない状況となってしまう場合があります。上記では、色々とコメントアウトして、cs add cscope.outだけを有効にしています。
ctagsと一緒に使い、ctagsを優先させる使い方の場合は、set cscopetagはコメントアウトで、set csto=0を設定するのが正解と思います。期待の動作をしているので、どちらもコメントアウトしたままにしています。

まとめ

レガシーコードと戦う場合、特に開発の序盤は、ディレクトリの移動はやらずにソースコードの最上位のディレクトリからcd/pushdしない方が楽でした。git cloneして、cd XXXXXして、ctags -Rで1-2分待って、cscope -Rbで2-3分待って、vi YYYYY/ZZZZZ/AAAAA/BBBBB/CCCCC.c、という感じでした。なので、cscopeの出力cscope.outは一つとなり、余計なことを考える必要がなくなります。

レガシーコードと戦う場合で、ctagsと一緒に使う場合は、Ctrl-\ cばかりを使うことになると思います。最初に、ctagsのCtrl-]とCtrl-tと、cscopeのCtrl-\ cを覚えて、その後は必要に応じてCtrl-\ fあたりを覚える、という順序になると思います。

参考

CSCOPE settings for vim


コメントを残すために、Twitter OAuthを必要としています。ご了承ねがいます。
コメントは、Twitterに影響しません。

Twitter OAuth