1

flexを使用して字句解析プログラムを構築しようとしています。以下は、正規表現とそれに対応するアクションを示す行です。

[0-9] {printf("yada yada \n");} //regex1

vimのオートコンプリート機能によってregex1から再利用する方法はあり{printf("yada yada \n");}ますか?そうすれば、regex2を書いている間に全部を書き直す必要はありませんか?

例えば

.* {printf("yada yada \n");} //regex2

これは単語の補完を超えているので、これはvimで実行できるのだろうかと思いました。

TIA

4

4 に答える 4

3

:h complete-functions詳細については、を参照してください:h 'completefunc'

または、以下のコードに飛び込みます。

" Scan current buffer for everithing in { }.
fun! GetRegexes()
  let rx = '{.\+}'
  let res = []
  for line in getline(1, '$')
    if line =~ rx
      call add(res, matchstr(line, rx))
    endif
  endfor
  return res
endfun

fun! MyComplete(findstart, base)
  if a:findstart
    " locate the start of the completion
    let line = getline('.')
    let start = col('.') - 1
    while start > 0 && line[start] !~ '{'
      let start -= 1
    endwhile
    return start
  else
    let res = []
    for m in GetRegexes()
      if m =~ '^' . a:base
        call add(res, m)
      endif
    endfor
    return res
  endif
endfun
set completefunc=MyComplete
finish

[0-9] {printf("yada yada \n");}
[0-9] {printf("yada \n");}

このファイルを名前を付けて保存し、コマンドcompl.vimでソースすると、入力を開始して- , -を押して、2 つの要素を持つ補完メニューを呼び出す:so %ことができます。{priCtrlXCtrlU

{printf("yada yada \n");}
{printf("yada \n");}

ニーズに合わせて調整できると思います。

2 つの関数を .vimrc に保存し、MyComleteそのような補完が必要なバッファーに対して completefunc を設定できます。

于 2010-02-11T11:12:44.573 に答える
1

mymeの答えとはわずかに異なります:

  1. 最初の中かっこに移動します{
  2. でビジュアルモードに入りますv
  3. を押し%て、最後のブレースまで、ブロックの最後に移動します}
  4. yアンクします。
  5. pどこでも食べてください。:-)
于 2010-02-11T07:46:35.030 に答える
1

オートコンプリートではありませんが、略語を定義できます。

:iab yada {printf("yada yada \n");} 

次に、入力すると挿入モードになります

[0-9] yada<SPACE>

に即座に置き換えyadaられ{printf("yada yada \n");}ます。

:h abbreviations完全なスクープについては、を参照してください。

于 2010-02-11T07:42:53.600 に答える
0

オートコンプリートではないかもしれませんが、うまくいくかもしれません。そのアクション/印刷ステートメントをvimのコピーレジスタに保存し、適切なときに貼り付けることができます。

  1. アクションの先頭に移動します。
  2. ビジュアルモードに移動: v
  3. コピー/ヤンクするテキストの部分に移動します。
  4. レジスタ '1' にヤンクするには、次のように入力します。

これで、アクションがレジスタ番号 1 に格納されます。

  1. 次のようにしてコンテンツを貼り付けます: "1p (p は任意の貼り付けコマンド)。

これが役に立つことを願っています:)

于 2010-02-11T07:25:04.790 に答える