スパム対策として書込み時にID/PWを要求されますが、ローマ字で ほげ/ホゲ で書き込めるようになります。

GNU GLOBALを利用してタグジャンプ

  • ページ: scripts
  • カテゴリー: utility
  • 投稿日: 2007-02-02 01:04:08 (金)
  • 配布元URL:

メッセージ

GLOBAL(tips/40参照)はctags形式を吐き出せるのでそれを利用してタグジャンプを試みるスクリプト

準備

以下を_vimrcや.vimrcにコピーしてください。 ちなみにホームパスにglobaltagsや.globaltagsを勝手に生成します。

" gnu global でタグジャンプ
if has("win32")
    set tags+=$HOMEPATH/globaltags
else
    set tags+=$HOME/.globaltags
endif

function! GtagToCtag(pat)
    " C, C++のファイルのみ
    let ext = expand("%:e")
    if ext !=? "h" && ext !=? "c" && ext !=? "cc" && ext !=? "cpp"
	return
    endif

    " 現在行から10行読み込み
    let lnum = line('.')
    let tenline = ""

    let loop = 0
    while loop < 10
	let tenline = tenline . getline(lnum + loop)
	let loop = loop + 1
    endwhile

    " globalから取得したタグの格納場所指定
    if has("win32")
	" for vim command
	let file = expand("$HOMEPATH/globaltags")
	" for filer
	let ffile = '"' . file . '"'
    else
	let file = expand("$HOME/.globaltags")
	let ffile = expand("$HOME/.globaltags")
    endif
    call delete(file)

    let gopt = "-atq"

    " 関数の実体からは -r で取得
    let chk1 = '\%(^\|\s*\)' . a:pat . '\s*([^;&=+\-|~]\+\w[[:blank:]*]\+\w[^;&=+\-|~]\+)\s*{'
    let chk2 = '\%(^\|[ \t]*\)' . a:pat . '\s*(\%(\s*\a\w*,\)*\%(\s*\a\w*\)\s*)[[:blank:][:alnum:]*_;[\]]\+;\s*{'
    if tenline =~ chk1
	let gopt = "-artq"
    elseif tenline =~ chk2
	let gopt = "-artq"
    else
	" defineは宣言箇所では -r で取得
	let chk = '^[ \t]*#[ \t]*define[ \t]\+' . a:pat
	if tenline =~ chk
	    let chk = '#define\s\+\a\w*[([:blank:]]'
	    if strpart(getline("."), 0, col(".")) !~ chk
		let gopt = "-artq"
	    endif
	endif
    endif
    execute "silent !global " . gopt . " " . a:pat . " > " . ffile

    " 以上の判定でみつかんなければ -s で取得
    if getfsize(file) <= 0
	execute "silent !global -astq " . a:pat . " > " . ffile
    endif
endfunction

command! -nargs=1 GtagsToCtags call GtagToCtag(<f-args>)

nnoremap    <c-]>   :GtagsToCtags <c-r><c-w><cr><c-]>
nnoremap    <c-w>]   :GtagsToCtags <c-r><c-w><cr><c-w>]

使い方

GLOBALが使える状態かつCのファイル上で<c-]>または<c-w>]を押すと、関数やdefineの定義箇所なら使用箇所へ、使用箇所なら定義箇所へというふうにタグジャンプします。なので<c-t>で戻れます。

その他

それぞれの環境にあうように適当に改造してください。 うまくいかない場合は、:Gtags で緊急回避!





トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2014-10-14 (火) 01:13:17 (1467d)