Захват команды прерывания / прерывания - PullRequest
4 голосов
/ 20 сентября 2011

Я пытаюсь прервать цикл for, как показано в коде ниже,

for num in buffer_number_list
    " Select the buffer
    exe 'buffer' num
    " Run the command that's passed as an argument
    exe a:command
    " Save if necessary
    update
endfor

вместо прерывания только строки exe a:command, когда a:command является :s/// command.

Цель состоит в том, чтобы изменить код в ответ на Как выполнить поиск и заменить ack в vim?

Я пытался окружить линию exe a:command блоком try / catch, но это не сработало, возможно потому что команда обработала прерывание сигнал без повторного выброса.

Попытка переназначения CTRL-c для изменения некоторой переменной (которая будет проверена внутри цикла), но это не сработало:

let original_Ctrl_c = maparg('<c-c>', 'n')
exe 'nnoremap <c-c> :call <SID>BreakLoop()<CR>' . original_Ctrl_c

Кажется, что отображение не сработало, когда сигнал прерывания пойманы.

Есть идеи?

EDIT:

Кажется, что эта проблема возникает только в gVim (спасибо @ib.)

1 Ответ

1 голос
/ 04 октября 2011

Пытаясь воспроизвести описанное вами поведение, я построил следующий контрольный пример.Он включает в себя два идентичных файла, созданных с помощью команды

$ echo -e "skip\npat\npat" | tee tmp1 >tmp2

и открытых в Vim без какой-либо инициализации, кроме получения файла, содержащего реализацию команды :QFDo:

$ vim -u NONE -S qfdo.vim

или

$ gvim -u NONE -U NONE -S qfdo.vim

При поиске шаблона в этих двух файлах

:vimgrep /pat/ tmp{1,2}

заполняет содержимое окна быстрого исправления, которое можно использовать для запуска рассматриваемой команды,

:QFDo v/skip/s/pat/rep/gce

Прерывание этой команды с помощью Ctrl + C после первой замены, которая содержится в файле tmp1, завершает всю команду :QFDo и, следовательно, файлtmp2 остается нетронутым.Этот факт означает, что поведение, которое вы пытаетесь преодолеть, вызвано некоторой .vimrc настройкой или плагином.Чтобы определить фактическую конфигурацию, нарушающую поведение Ctrl + C , отключите все плагины и попробуйте включить их один за другим, каждый раз выполняя приведенный выше тестовый пример.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...