« PHPで2MB以上のファイルをアップロード | トップページ | 特定の拡張子のファイルだけをコピーするrsyncのパラメータ »

2012年10月 1日

vim起動時に「E568: duplicate cscope database not added」

vimでcscopeを使うために.vim/plugin/cscope_maps.vimをインストールし、環境変数CSCOPE_DBにcscopeデータベースのパスを設定したら、vim起動時にエラーが出てしまった。

Error detected while processing /homes/shini/.vim/plugin/cscope_maps.vim:
line   45:
E568: duplicate cscope database not added

cscope_maps.vim以外にcs addを実行しているところは他に見当たらない。試しにcscope_maps.vimを削除してvimを起動し、「:cs show」を実行しても、接続されているデータベースは出てこないから、やはりcs addしているのはこのプラグインだけである。まるで「cs add $CSCOPE_DB」の行を2回実行しているようにみえる。

いろいろ調べて、.vimrcの次の行が原因だと判明した。

set runtimepath+=~/.vim/

もともとUNIXのvimで$HOME/.vimはruntimepathの先頭に入っているのに、末尾に再び付加することによって、pluginディレクトリ内のvimスクリプトを二重に読み込んでいた。他の人の.vimrcを参考にカスタマイズしていたとき、自分の環境では必要がないのに気付かず、そのままコピーしたらしい。

ちなみにRHELでは、/etc/vimrcの中でcscope_maps.vimと同じようなことをやっており、さらにRHEL付属のvimはシステムvimrcが/etc/vimrcに固定されている。pluginディレクトリの実行が1回だけでも、やはり「E568: duplicate cscope database not added」が起きる。この場合は

  • cscope_maps.vimを編集して/etc/vimrcと重複する部分を削除する。
  • 必要な部分(nonmapなど)を.vimrcにコピーする。
  • 必要な部分(nonmapなど)を別ファイルにして、.vimrcからsourceで読み込む、
  • 「set nocsverb」を指定して、メッセージを抑止する対症療法。

という対策がある。set nocsverbは以下の箇所(3行目)に挿入する。

" Set nocsverb not to print "E568: duplicate cscope database not added" message.
" See :help cscope or http://vimdoc.sourceforge.net/htmldoc/if_cscop.html
    set nocsverb
"   " add any cscope database in current directory
    if filereadable("cscope.out")
"        cs add cscope.out
   " else add the database pointed to by environment variable
    elseif $CSCOPE_DB != ""
        cs add $CSCOPE_DB
    endif

viimのヘルプに、データベースを追加する前にcsverbをリセットし、追加後にセットしろと書いてあり、/etc/vimrcはそうなっている。もっとも、これは別の理由かもしれない。

Ideally, you should reset this option in your |.vimrc| before adding any cscope databases, and after adding them, set it. From then on, when you add more databases within Vim, you will get a (hopefully) useful message should the database fail to be added.


|

« PHPで2MB以上のファイルをアップロード | トップページ | 特定の拡張子のファイルだけをコピーするrsyncのパラメータ »

コメント

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



« PHPで2MB以上のファイルをアップロード | トップページ | 特定の拡張子のファイルだけをコピーするrsyncのパラメータ »