VIM: возможно ли добавить пользовательское поведение при использовании / c с командой замены?

224
Steve Vermeulen

Было несколько случаев, когда было бы удобно подключиться к поиску и заменить поведение для определенных вещей. Например, у меня есть следующее отображение в моем vimrc:

nnoremap n nzzzv

Который центрирует экран каждый раз, когда вы переходите к следующему матчу. Это хорошо работает, но не применяется при выполнении команды% s // c. Есть ли способ подключиться, когда пользователь выбирает один из вариантов подтверждения y / n / q / q / l / etc. так что вы можете запускать команды?

2

3 ответа на вопрос

2
Ingo Karkat

К сожалению нет. Обычный способ подключиться к этому будет через

:autocmd CursorMoved * ... 

но это событие не запускается в :substitute///cцикле запросов. Думайте об этом как о особой моде со многими ограничениями; было бы очень трудно разрешить использование пользовательских функций при сохранении правильного состояния поиска.

Вам бы пришлось переопределить :substituteфункциональность самостоятельно. Может быть, вы можете использовать :help sub-replace-expressionс запросом там; Я еще не пробовал, возможно ли тогда взаимодействие с пользователем.

2
Ingo Karkat

Обходной путь для вашего конкретного случая использования центрирования текущей замещенной строки заключается в

:set scrolloff=999 

перед :substituteкомандой. Это имеет тот же эффект центрирования текущей строки, что и ваша zzкоманда.

1
Steve Vermeulen

Основываясь на предложении Инго Карката использовать опцию прокрутки, я закончил с этим:

command! -nargs=1 CC set scrolloff=999|exec <f-args>|set scrolloff=0 

Теперь вы можете просто запустить «CC% s // c», и он временно отцентрирует курсор во время выполнения команды. Соблазнительно найти аббревиатуру или что-то для этого, но я не мог придумать ничего, что бы работало надежно.