
Мне нравится создавать ASCII-арт в Vim. Я не пользуюсь никакими плагинами: в Vim уже есть множество встроенных фич, очень полезных при рисовании ASCII!
_ _/_Z _ / |// / |/ \ \__/_/_/_/_/
Эта статья предназначена для тех, кто уже занимался ASCII-артом и хочет исследовать новые инструменты. А если вы никогда не пробовали создавать ASCII-арт, то рекомендую не читать эту статью! Вам не нужна вся эта информация для создания текстовой графики. Просто откройте любимый текстовый редактор и начинайте писать. А если не знаете, с чего начать, то изучайте работы мастеров и практикуйтесь. И уже после этого, если вам всё ещё будет интересно, возвращайтесь и прочитайте статью.
Vim — редактор не для всех. Я пользуюсь им просто потому, что знаю его. Если вы тоже прокляты этим знанием, то продолжайте чтение!
Рекомендую сначала освоить основы (например, открытие файла, переключение между режимами, сохранение и выход). Если вы новичок в Vim, то можете обучиться основам при помощи vimtutor!
Перемещение курсора за конец строки
.--. .--. .--. .--. |@ @ | |@ @ | |@ @ | |o o | | | | | | | |~~~ | '^^^^' '^^^^' '^^^^' '^^^^'
При рисовании ASCII-арта часто приходится перемещать курсор в открытое пространство. Большинство текстовых редакторов не позволяет этого сделать, если только предварительно не заполнить буфер пробелами, и Vim по умолчанию ведёт себя так же. Но выполните такую команду:
:set virtualedit=all
Теперь вы сможете перемещать курсор за конец строки. После вставки символа Vim автоматически заполнит все нужные пробелы слева. Стоит отметить, что для перемещения туда курсора там не нужен обязательно должен быть символ, но строка всё равно должна быть. Подробную информацию см. командой
:help virtualedit
Также вполне допустимо не пользоваться этой фичей и в начале работы заполнять буфер пробелами; просто знайте, что в Vim без этого можно обойтись. Если же вы всё-таки хотите использовать пробелы, Vim и тут может помочь: перед командами i и p можно указать число для повторения символа соответствующее количество раз. Например, можно 42 раза повторить символ пробела:
42i<space><esc>
А затем скопировать текущую строку и вставить её 5 раз:
yy5p
Как бы то ни было, важно, чтобы курсор двигался предсказуемо и указываемом вами направлении, иначе некоторые другие техники из моей статьи будут работать не так хорошо.
Многострочная вставка
Допустим, у нас есть nyan cat:
,----------. | ` .` `. | | `. ` `,^----^. \| . `. | @ w @| `v-v----"-v-v-"
И мы хотим нарисовать за ней закорючки, но слева недостаточно места, поэтому надо сдвинуть кошку вправо. Как бы вы это сделали?
Вот один из способов: нажмите Ctrl+v для перехода в режим Visual Block и выберите столбец за спиной nyan cat. Затем нажмите Shift+i и введите закорючки. Вы заметите, что при вводе вставка выполняется только в первой строке, но это вполне ожидаемо. Только после нажатия на клавишу Escape вы увидите, что на самом деле вставили все строки в выделение!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ,----------. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ` .` `. | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | `. ` `,^----^. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\| . `. | @ w @| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ `v-v----"-v-v-"
В этом случае я ввёл такую команду:
<ctrl+v>jjjj32I~<esc>
Должен признать, что это довольно искусственный пример. Обычно пользуюсь этой техникой для вставки пробелов в несколько строк для расширения поля или перемещения чего-нибудь вправо.
Заполнение/удаление прямоугольной области
Допустим, у нас есть вот такая грязная коробка и нам нужно её очистить.
+--------+ | ` ~ | | * ` .` | | . ^ . | +--------+
Вот один из способов: перейдите в режим Visual Block нажатием Ctrl+v. Выберите область внутри коробки, нажмите r, а затем пробел.
+--------+ | | | | | | +--------+
Готово! Я часто пользуюсь этой техникой для стирания части изображения (например, если хочу переделать её), не задев случайно другую часть рисунка. Если бы я нажал d вместо r, то получил бы следующее:
+--------+ || || || +--------+
Иногда нужен и такой результат, но в данном случае мне нужно было другое.
Копирование и вставка прямоугольных областей
+----+ +----+ | +----+ | | +-| +----+ +----+ +-| | +----+
В режиме Visual Block можно также выполнять копирование и вставку. Чтобы скопировать текущее выделение в буфер обмена, нажмите y (так вы перейдёте в Normal mode). Для вставки нажмите p или P.
Вставка блока в Normal «подставляет» его: всё, что находится справа, перемещается ещё дальше вправо.
.----. | @ @ | | .--. | +---------+ .--` <> '--. | | `--. <> .--' +---------+ / <> \ / .--. \ `-' `-'
Обычно мне нужно вставлять «поверх» уже существующего, ничего не сдвигая. Для этого после копирования блока нужно переместить курсор в другое место и попробовать такую команду:
1vP
Это должно переписать всё, что там было ранее. Объясню: 1v — это особый вариант v , создающий выделение с размерами последней операции в Visual mode. После этого P выполняет два действия: удаляет всё выбранное, а затем вставляет. Рекомендую использовать P, а не p, потому что так вы не меняете буфер обмена, поэтому при необходимости можете повторить вставку. Подробнее об их различиях см.
:help v_P .----. | @ @ | | \__/ | +---------+ .--` <> '--. | | `--. <> .--' +---------+ / <> \ / .--. \ `-' `-'
Макросы
Vim позволяет записывать последовательность нажатий и многократно их воспроизводить. Эта функция может быть более мощной, чем нажатие на клавишу ., которая может лишь повторять отдельные команды.
Начать освоение макросов можно с комбинирования вставки и перемещения. Позвольте показать, что я имею в виду. В этом примере у меня есть вот такая фигура 7x3, которую я хочу повторить по диагонали.
,.-~. +-----+ ` _+" --> | 7x3 | o;.- +-----+
Она должна располагаться так:
+-----+ | 1 |+-----+ +-----+| 2 |+-----+ +-----+| 3 | ... +-----+
Если забыть о макросах, то я бы сделать это, скопировав область в обычном режиме Visual Block, переместил бы курсор, вставил, снова переместил курсор и вставил ещё раз. Результат:
,.-~. ` _+" ,.-~. o;.-` _+" ,.-~. o;.-` _+" o;.-
В такой ситуации вполне разумно делать это без макроса, но что, если я хочу вставить изображение десять или сто раз? Наверно, в этом случае действительно стоит попробовать макрос.
Сначала я скопирую изображение в буфер обмена. Затем я помещу курсор в то место, где хочу начать вставку. Теперь начну запись макроса в регистр w (w выбран произвольно, вы можете выбрать любой удобный):
qw
Вставим, а потом переместимся в следующую точку вставки:
1vP<esc>7lj
Дальше я заканчиваю запись:
q
Отлично, теперь у нас есть повторяющийся макрос. Для его воспроизведения достаточно выполнить
@w
И теперь это макрос, который можно повторить n раз:
8@w ,.-~. ` _+" ,.-~. o;.-` _+" ,.-~. o;.-` _+" ,.-~. o;.-` _+" ,.-~. o;.-` _+" ,.-~. o;.-` _+" ,.-~. o;.-` _+" ,.-~. o;.-` _+" o;.-
Честно говоря, я не особо часто пользуюсь макросами при создании ASCII-арта. Мне редко приходится повторять паттерн так много раз. Плюс при программировании макроса легко ошибиться и в результате потратишь больше времени, чем если бы делал всё вручную.
Вот ещё один пример:
/\ /\/\/ \ /\ / \ / \/\ / \ /\ /\ / \/\ / \/ \/\/\ /\/\/ \ \/\/ \/\ / \ \ / \/
Для создания этого изображения я использовал два макроса, немного облегчивших мне жизнь.
Первый макрос рисует / и перемещает курсор вверх и вправо:
r/kl
Второй макрос перемещает курсор вниз, рисует \ и перемещает курсор вправо:
jr\l
Благодаря этим макросам мой курсор всегда находится в самом правом краю строки, готовый к отрисовке следующего сегмента.
Подробнее о макросах см.
:help q
Поддержка мыши
. :`. : `. : .:. :.'\\ ` \\ `
Под поддержкой мыши я подразумеваю то, что можно нажать на любое место окна Vim, чтобы переместить туда курсор. Полезно для рисования изображений! Наверно, вы знали об этом, по умолчанию эта функция включена. Если она отключена, то можно включить её такой командой:
:set mouse=a
Это работает и в терминале! Вас это может удивить, если вы не пользовались Vim с 1994 года или изначально работали с vi.
Делаем пробелы видимыми
В процессе создания ASCII-арта вы можете потерять свои пробелы. Не такая уж большая проблема, но если по какой-то причине вы хотите знать, как выглядят ваши пробелы, то можете попросить Vim сделать их видимыми:
:set list
Вы должны увидеть символы доллара $, отмечающие концы строк. Можно сделать так, чтобы Vim визуализировал и другие пробелы, см.
:help listchars
В заключение
Когда великой ASCII-художнице Джоан Старк задали вопрос: «Нужны ли какие-то специальные программы или ПО для создания ASCII-арта?», она ответила:
Достаточно текстового редактора с моноширинным шрифтом.
И я склонен с этим согласиться. Для рисования хорошего ASCII-арта не нужны никакие трюки. Если вы решили творить искусство, вас не остановит отсутствие инструментов. Этой статьёй я не имел в виду, что в подобных инструментах есть какой-то секретный ингредиент, всё мастерство у вас внутри.
(___) (ovo) /vvv\ ayc |vvv| ======w=w===