10

ctags が C で複数行の関数プロトタイプを処理する方法はありますか?

私は周りを検索しました--fields=+Sが、複数行のプロトタイプを実行することになっていますが、動作させることができません:

ctags -x --c-kinds=pf --fields=+S file

ファイル:

int 
foo(int
    x, int y
    );

ctags のみが返されます:

foo(int

(戻り型も欠落していることに注意してください)

最終的に、次のような出力を得たいと思います

int foo(int x, int y);

また

int foo(int x, int y

--fields=+S正しい方法ではありませんか?欠落している ctags フィールドの一部はありますか? 一般的な指針はありますか?

ctags でそれを行う方法がない場合、推奨されるプログラムはありますか? (私は現在uncrustifyを見ています)

4

4 に答える 4

1

コードにも同じ問題がありましたが、変更できませんでした。--fields = + Sパラメータを使用すると、タグファイルに追加の行が追加されるため、機能しているように見えます。シグニチャ:部分には、関数のすべてのパラメータが含まれています。

CopyToTX26 D:\ BiseL \ My Dropbox \ Work \ 0_BSW \ PKG_CMD \ Memory.c / ^ void CopyToTX26(uint16 memory_ID、uint32 ** pt_data_address、uint32 nb_recover、$ /; "f sign:(uint16 memory_ID、uint32 ** pt_data_address、 uint32 nb_recover、uint32 * nb_copied、uint32 max_length)

于 2011-10-17T06:10:43.043 に答える
1

--_xformat オプションが役立つ場合があります。

[jet@localhost ~]$ cat /tmp/foo.h
int 
foo(int
    x, int y
    );
[jet@localhost ~]$ ~/var/ctags/ctags -x --c-kinds=pf --_xformat="%-16N %4n %-16F %C %S" /tmp/foo.h
foo                 2 /tmp/foo.h       foo(int (int x,int y)
于 2017-02-16T17:28:10.407 に答える
0

ctagsで何も見つからなかったので、ctagsがプロトタイプをキャプチャできるようにファイルを再配置するPythonスクリプトを作成しました。

注:私のコードにはコメントがあり、これの多くはコメントを削除することに注意を払っています(そうしないと、ctagsの邪魔になります)。

操作は次の順序で行われました。

# concat to one line
file_str = ''
for line in read_from.readlines():
    file_str += line

# remove all /* */ comments
file_str = re.sub('/\*(.|[\r\n])*?\*/', '', file_str)

# remove '//' comments
file_str = re.sub('//.*', '', file_str)

# split on '\n'
file_as_list = file_str.splitlines(True)

# strip everything
for index in range(len(file_as_list)):
    file_as_list[index] = file_as_list[index].strip()

# add in newlines where appropriate
for line in file_as_list:
    # if the line ends in ';' or '}'
    if line.endswith(';') or line.endswith('}'):
        # append a newline to the stripped line
        write_to.write(line.strip() + '\n')
    else:
        # append a space to the stripped line
        write_to.write(line.strip() + ' ')
于 2011-07-27T23:35:19.710 に答える
-1

単純なフィルターを使用して、不要な改行を削除できます。

 tr '\n' ' '  | sed 's/\([{};]\)/\1\n/g'
于 2011-07-25T19:32:08.300 に答える