40

約 15000 行の大きな C、C++、または Java ファイルを、約 400 行のかなり長い関数定義で編集します。カーソルが関数定義の途中にある場合、Vim ステータス ラインに関数名が表示されると便利です。

Vim で設定:set ls=2すると、ファイル パス (現在のディレクトリからの相対パス)、行番号などを取得できます。関数名も表示できれば、非常にクールです。それを取得する方法はありますか?

現在[[、関数の先頭に移動し、編集中の行に戻るために使用しCtrlOいます。

4

8 に答える 8

15

これにはctags.vimを使用できます。タイトルまたはステータス バーに現在の関数名が表示されます。

ソース: https://superuser.com/questions/279651/how-can-i-make-vim-show-the-current-class-and-method-im-editing

于 2012-11-29T22:28:03.400 に答える
1

ステータス ラインまたはマッピングを使用したオンデマンド用のプラグインがいくつかあります。

于 2012-11-30T08:17:20.657 に答える
1

私の解決策は次のとおりです。

set stl=%f%h%m%r\ %{Options()}%=%l,%c-%v\ %{line('$')}
fu! PlusOpt(opt)
  let option = a:opt
  if option
    return "+"
  else
    return "-"
  endif
endf

fu! Options()
  let opt="ic".PlusOpt(&ic)
  let opt=opt." ".&ff
  let opt=opt." ".&ft
  if &ft==?"cpp" || &ft==?"perl"
    let text = " {" . FindCurrentFunction() . "}"
    let opt= opt.text
  endif
  return opt

fu! FindCurrentFunction()
  let text =''

  let save_cursor = getpos(".")

  let opening_brace = searchpair('{','','}','bWr', '', '', 100)
  if opening_brace > 0
    let oldmagic = &magic
    let &magic = 1

    let operators='operator\s*\%((\s*)\|\[]\|[+*/%^&|~!=<>-]=\?\|[<>&|+-]\{2}\|>>=\|<<=\|->\*\|,\|->\|(\s*)\)\s*'
    let class_func_string = '\(\([[:alpha:]_]\w*\)\s*::\s*\)*\s*\%(\~\2\|'.operators
    let class_func_string = class_func_string . '\|[[:alpha:]_]\w*\)\ze\s*('

    let searchstring = '\_^\S.\{-}\%('.operators
    let searchstring = searchstring.'\|[[:alpha:]_]\w*\)\s*(.*\n\%(\_^\s.*\n\)*\_^{'

    let l = search(searchstring, 'bW', line(".")-20 )

    if l != 0
      let line_text = getline(l)
      let matched_text = matchstr(line_text, class_func_string)
      let matched_text = substitute(matched_text, '\s', '', 'g')
      let text = matched_text
    endif

    call setpos('.', save_cursor)

    let &magic = oldmagic
  endif

  return text
endfunction

私は実際に、C/C++/Java で許可されている関数の名前を一致させようとしています。これは通常、(オーバーロードされた演算子を含む) 私にとってはうまくいきますが、開始 { が行の 0 列目にあることを前提としています。

今日、名前空間 {} に含まれていると、それ以外の場合は期待どおりにフォーマットされていても失敗することに気付きました。

于 2013-04-11T18:06:34.880 に答える