これをどのようにしてVIMマクロにしますか?
-
22-07-2019 - |
質問
つまり、プログラマーとして行う一般的なタスクの1つは、ライブシステムのデバッグです。ライブシステムをデバッグする方法の1つは、コンソールから詳細なログをキャプチャすることです。
通常、ログファイルには、関心のある1行ごとに約20行の余分な行があります。
マクロスクリプトを最小化するために、興味のある20行のうち1行だけを取得するマクロを作成しました。 (私が望んでいないすべての行を20回置換するのとは対照的に、マクロは必要以上に20倍長くなります。)このマクロコードの残りは、その1行を* .csvに変換しますファイルを作成して、MatlabまたはExcelで数値を適切に再生できるようにします。
マクロのコードは次のとおりです(これらのコマンドはUltra Edit固有のコマンドです):
Clipboard 1
ClearClipboard
Loop
Find RegExp "{*}DBGLINE: STR1 ( * ) STR2 ( * )^p"
IfFound
CopyAppend
Else
ExitLoop
EndIf
EndLoop
SelectAll
Delete
Paste
Find RegExp "{*}DBGLINE: STR1( "
Replace All ""
Find RegExp " ) STR2 ( "
Replace All " , "
Find RegExp " )*^p"
Replace All "^p"
ClearClipboard
* FYI、を投稿しましたAPI /各コマンドがオンラインで行うことの説明。
このマクロが何をしているのか、より人間が読める擬似コードに分解してみましょう:
buffer = "";
// Keep finding $REGEX until EOF
while(1) {
if( Find $REGEX ) {
Select the text;
} else {
break;
}
buffer += selected piece of text;
}
// Now we can focus only on the selected lines from the log file
Select the entire text in the file;
Delete all selected text;
Paste the buffer into the text file;
// Convert the human readable text into a *.csv file
Parse out all the non-numerical content;
Replace with " , " commas;
マップを.vimrcファイルに追加することにより、VIMで簡単なマクロを作成する方法を知っています:
map $KEYBOARD :%s/$STR_A/$STR_B/gc<CR>
しかし、マクロ内でwhile(1)とCopyAppendを実行する方法があるかどうか疑問に思っていました。ある種の.vimrc定義関数のように:
function! CustomScript1()
...
" TODO: vim commands here
...
endfunction
map $KEYBOARD :call CustomScrip1()<CR>
では、上記のUltraEditマクロをVIM関数にどのように変更しますか?
現在、VIMでこの種のスクリプトを再作成する機能を取得する必要があります。現在、20の代替(場合によってはそれ以上)を行って交換しているためです。ログファイルを解析するためのソリューション!
解決
パターンの出現すべてに関心がある場合は、:v
を使用して他の行をすべて削除してみてください:
:v/pattern/d_
最初のものだけに興味があるなら、 /
または search()
を試してください。関数では、次のようになります。
function! CustomScript1()
" search where your pattern is
let l = search(pattern) " move to the line found -- i.e., no 'n' flag
" get rid of everything else
if l > 0
if l>1
:0,-d_
endif
if l != line(')
:+,$d_
endif
endif
" format as CSV
:s/\D\+/ , /g
endfunction