Найти тему
Блокнот математика

Рубрика "Секреты Вим". TMTOWTDI

Привет, друзья. TMTOWTDI - это из философии Перл, There's More Than One Way To Do It, то есть "Есть более одного способа сделать что угодно". Задачи имеют, как правило, множество решений. В Виме тоже.

Вот пример. Подписчик написал про такую задачу: есть список слов в строках, нужно записать их в одну строку через запятую. Он предложил такое решение: записать клавиши-команды в регистр и выполнить его как макрос.

Например. У вас такой файл:

Оля

Юля

Аля

Аня

Яна

А хотите вы получить строку

Оля, Юля, Аля, Аня, Яна,

Вариант подписчика я не привожу, ибо нахожу его излишне сложным: вводить что-то вроде $a, ^[<80><fd>aJ мне бы не хотелось.

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

qq$a, <esc>Jq

Первая пара нажатий включает (q) запись макроса в регистр q (может быть любой другой). Далее переход в конец строки ($), вставка (а), печатаем текст из запятой и пробела, нажимаем клавишу ESCAPE, чтобы выйти из режима вставки. Команда J соединит строки, и, кстати, она сама могла добавить пробел после запятой! Запись завершается повторным нажатием q.

Теперь можно повторить действия сколько угодно раз: 500@q.

Вы можете посмотреть, что у вас за макрос получился, выведя содержимое регистра. Например, так: "qp

Подписчик предлагал это вручную ввести.

Можно не записывать действия, а повторить. Например, так: Вы нажимаете A, <del><esc> - это переместит курсор в конец строки, включит режим вставки; вы введете запятую и пробел, потом удалите символ конца строки клавишей <DEL>, покинете режим вставки. Ну и повторяйте это действие командой "точка"! Можно многократно: 500. Здесь точка - часть команды.

Но есть и ещё варианты решить поставленную задачу. Например, так:

:%s/\s*\n/, /

Замена пробелов на конце строки и символа конца строки на пробел и запятую. Всё.

Или так:

:%s/$/,/ | %join

Можно разделить на две команды:

:%s/$/,/

:%join

Первая заменит конец строки на запятую, вторая соединит строки.

А можно так:

:%s/\_s\+/, /

Пробелы и конец строки объединены в класс \_s Только важно, что квантификатор теперь \+, берущий от одного вхождения. Использование звездочки - грубая ошибка, так как такое совпадение найдется везде, и ничего хорошего вы не получите.

Если у вас только одиночные слова, без пробелов, то можно просто выделить всё (ggVG) и нажать J, чтобы соединить строки в одну, а потом s/\s/, /g или, лучше, s/\s\+/, /g - чтобы разделить слова запятыми.

Так что, TMTOWTDI!