Привет, друзья. 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!