你会如何将它变成VIM宏?

时间:2009-10-30 14:20:16

标签: regex vim scripting vim-macros

因此,我作为程序员执行的一项常见任务是调试实时系统。我调试实时系统的方法之一是从控制台捕获详细日志。

通常,日志文件对我感兴趣的每一行都有大约20条额外的行。

为了最小化我的宏脚本,我开始创建一个宏,它只能抓住我感兴趣的20行中的一行! (与我不想要的所有行进行20次替换相反...这将使宏的长度超过它所需的20倍。)此宏代码的其余部分将把这一行转换为* .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

*仅供参考,I have posted the API/description of what each command does online.

让我在一个更易读的伪代码中分解这个宏正在做什么:

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替换(有时更多)并取代......而且这让我疯狂地浪费时间做这样的不优雅解析日志文件的解决方案!

1 个答案:

答案 0 :(得分:4)

如果您对模式的所有出现感兴趣,请尝试使用: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