Как бы вы превратили это в макрос VIM? - PullRequest
0 голосов
/ 30 октября 2009

Итак, одна из общих задач, которую я выполняю как программист, - это отладка работающей системы. И одним из способов отладки работающей системы является захват подробного журнала с консоли.

Обычно в файле журнала содержится около 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

* К вашему сведению, Я опубликовал 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;

Я знаю, как создавать простые макросы в VIM, добавляя карту в мой файл .vimrc:

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 Ответ

4 голосов
/ 30 октября 2009

Если вас интересуют все вхождения вашего шаблона, попробуйте использовать :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
...