2

vimのsubstituteコマンドを使用して、タイプ固有のCコードをマクロコードに変換しようとしています。このサンプルスニペット

#define LIST_GEN_FUNCS(TYPE)
struct list_##TYPE* list_generate() {  
struct list_##TYPE* ret = malloc(sizeof(struct list));
ret->len = 0; ret->first = 0;
return ret;
}

そのように見える必要があります:

#define LIST_GEN_FUNCS(TYPE)                               
struct list_##TYPE* list_generate() {                     \
struct list_##TYPE* ret = malloc(sizeof(struct list));    \
ret->len = 0; ret->first = 0;                             \
return ret;                                               \
}                                                         \

これを行うには、固定行の長さまですべての列を空白で埋め、各行の終わりの後に「\」を追加する方法が必要です。

%s/$/\= submatch(0) . " " . repeat(" ", 78 - LENGTH_OF_LINE)

さて、これが私の問題です。一致した行の長さを取得する方法を見つけることができませんでした。LENGTH_OF_LINEとして何を挿入するか教えてもらえますか?

4

2 に答える 2

4

1つの解決策は、行の終わりにスペースを追加してから、特定の列に削除することです。例えば:

:%norm80A <C-v><Esc>d80|s\<cr>

リテラル文字を<C-v><Esc>挿入し、コマンドを終了します。^[<cr>

VimLで行の長さを検索する場合はstrlen(getline(6))、たとえば、行6の長さを取得する場合に使用できます。既存のソリューションにそれを実装する場合は、次のように実行できます。

:%s/$/\=repeat(" ", 79-strlen(getline(".")))."\\"

Zyxがコメントで述べているように、より良い方法は

:%s/$/\=repeat(" ", 80-virtcol("$"))."\\"
于 2012-11-10T17:19:42.597 に答える
1

私のAlignFromCursorプラグインを使用すると、コマンドまたはマッピングを使用して、カーソルの右側のテキストを特定の列に揃えることができます。このように、バックスラッシュを追加して、後で整列させることができます。

于 2012-11-11T12:01:18.823 に答える