Vim выбирает/редактирует сразу несколько не последовательных строк

У меня есть файл со строками:

 8 deb http://ftp.de.debian.org/debian/ stable main contrib non-free
 9 deb http://ftp.de.debian.org/debian/ stable main contrib non-free
10 deb http://ftp.de.debian.org/debian/ testing main contrib non-free
11 deb http://ftp.de.debian.org/debian/ testing main contrib non-free
12 deb http://ftp.de.debian.org/debian/ sid main contrib non-free
13 deb http://ftp.de.debian.org/debian/ sid main contrib non-free
14 deb http://ftp.de.debian.org/debian/ experimental main contrib non-free
15 deb http://ftp.de.debian.org/debian/ experimental main contrib non-free

Мне нужно изменить адрес только по строкам 9,11,13,15. Мне просто интересно, есть ли какой-нибудь простой хак (например, выберите только эти строки и замените в выбранном диапазоне) в vim, чтобы сделать это? Или мне нужно записать макросы и применить их к строкам, которые мне нужны.

Ответ 1

Существует плагин, который позволяет иметь "множественные курсоры". Я сам не пробовал, но вы должны проверить, не решает ли ваша проблема:

http://www.vim.org/scripts/script.php?script_id=4523

Ответ 2

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

:g/pattern/s/foo/bar/

Если это невозможно, вам нужно написать небольшую функцию. Функция не сложна, просто getline (с линиейNO в вашем списке), затем выполните подстановку, наконец setline назад. Однако я не знаю, относится ли это к вашему "простому взлому".

С помощью функции вы также можете сделать следующее:

do substitution on lines with  10 <line number <50 and line number is odd.

чтобы вам не приходилось вводить эти числа.

Вы можете понять, что командам оболочки легче обрабатывать подобные вещи. У вас есть возможность вызвать внешнюю команду для обработки вашего текста в vim.

например:

%!awk 'NR==3||NR==5{gsub(/deb/,"foo")}1'

или сделать замену вышеприведенным примером, номер нечетной строки между: 10-50

%!awk 'BEGIN{for(i=11;i<50;i+=2)l[i]}NR in l{gsub(/foo/,"bar")}1'

также вы можете визуально выбрать текст и передать их внешней команде.

надеюсь, что это поможет.