функция vim для глобального поиска и вставки на место - PullRequest
0 голосов
/ 03 августа 2020

Работая с HTML файлами из vim, я привык иметь дело с фиктивными якорями, такими как <a id="@"></a>, например, я могу проверить свой прогресс в моем браузере с помощью <url>#@ привязки.

Обычно я начать сеанс записи макроса:

mz
:g;<a id="@"></a>;d<CR>
'z
p

Этот макрос в основном отмечает мою текущую позицию, глобальный / удаляет мой шаблон и вставляет в исходное местоположение.

Теперь я хотел бы повернуть это в функцию; это моя попытка:

function! PprojLoc()
    " get current location for further paste
    let rownb=line(".")
    " define dummy anchor to work on
    let pattern='^<a id="@"></a>$'
    " build the global command to search and delete
    " '/' separator is changed to ';'
    let cmd=":g;".pattern.";d<CR>"
    " delete pattern <DOESN'T WORK>
    execute cmd
    " back to initial location
    execute "normal! ".rownb."G"
    " paste...
    execute "normal! p"  
endfunction

К сожалению, команда normal! cmd вообще не работает. есть подсказки?

1 Ответ

0 голосов
/ 05 августа 2020

Я прибил его в одной команде.

:execute "normal! mz" | execute "g;<a id="@"></a>;m'z"

Одно наблюдение: чтобы использовать символ вертикальной черты -> |, как в обычных, так и в глобальных командах вы должны использовать нотацию выполнения как показано выше, потому что они рассматривают этот символ как часть команды, а не как другую команду.

Итак, мы создаем метку «z», как если бы мы были в нормальном режиме, это установит текущую позицию курсора на z знак. Глобальная команда сопоставит нужные строки и переместит их «m» на метку z.

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

" If mark "a" is set it will return a positive value
:ec getpos("'a")[1]

Создавая функцию, мы можем передать поиск в качестве аргумента функции, что сделает код более переносимым.

...