Ответ 1
Существует плагин, который позволяет иметь "множественные курсоры". Я сам не пробовал, но вы должны проверить, не решает ли ваша проблема:
У меня есть файл со строками:
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, чтобы сделать это? Или мне нужно записать макросы и применить их к строкам, которые мне нужны.
Существует плагин, который позволяет иметь "множественные курсоры". Я сам не пробовал, но вы должны проверить, не решает ли ваша проблема:
Если есть возможность выбрать эти строки с помощью регулярных выражений, мы могли бы сделать
: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'
также вы можете визуально выбрать текст и передать их внешней команде.
надеюсь, что это поможет.