Я недавно понял, как vim отлично подходит для игры в гольф, особенно для колмогоровских сложностей . Кроме того, в соответствии с мета vim, по крайней мере, является вполне приемлемым «языком программирования», то есть для сферы действия этого сайта.
Какие общие советы у вас есть для игры в гольф в Vim? Я ищу идеи, которые могут быть применены к задачам кода-гольфа и которые, по крайней мере, несколько специфичны для Vim (например, «удалить комментарии» - это не ответ).
Пожалуйста, оставьте один совет за ответ.
Ответы:
Помните о прописных вариантах общих команд. Это может легко сохранить одно нажатие клавиши во многих контекстах. Например:
Другой - использовать
G
вместоgg
, но только если вы используете счет! Например, без подсчета,gg
перемещается в начало, иG
перемещается в конец. Однако при подсчете они оба перемещаются в указанную вами строку, поэтому они5G
короче, чем эквивалентны5gg
.Другой - использовать
H
вместоgg
, но важно отметить, что это работает только в том случае, если вы можете гарантировать, что любой ввод не будет занимать больше, чем количество строк по умолчанию (я считаю, что это 24, но оно может варьироваться).источник
$
впрочем, и так, по крайней мере, что-тоC
иD
сохранится).G
иgg
не эквивалентны. Первый идет в конец буфера, а второй - в начало.5G
, эквивалентно5gg
. Я добавлю еще несколько деталей об этом.Каждый раз, когда команда терпит неудачу, она издает дежурный шум, который отменяет текущий макрос. Вы можете (ab) использовать это, чтобы создать грубую форму цикла. Например, если вы хотите повторять нажатия клавиш,
<foobar>
пока в вашем буфере не будет менее 3 строк. Ты можешь сделатьчто значит:
Важно отметить, что если вы тестируете это в сеансе vim, это
@q
может привести к непреднамеренным побочным эффектам, поскольку макросы загружаются из.vim_profile
. Вы можете обойти это несколькими способами. Вероятно, лучший обходной путь - запустить Vim сВы также можете удалить свой
.viminfo
.Если вы уже запустили vim, вы можете набрать
в начале обнулить макрос.
Другие условия вы можете заменить 3G с
или
источник
Есть более укороченные версии бывших команд, которые вы думаете. Например, вы, вероятно, уже знали, что
:global
может быть сокращено до:g
, но знаете ли вы, что:nnoremap
эквивалентно:nn
?Это хорошая идея, чтобы запустить
:h :foo
все команды ex, которые вы используете в своем ответе, чтобы увидеть, если есть более короткая версия.источник
это всегда эквивалентно
что также эквивалентно
достаточно удивительно. (Как правило, без каких-либо флагов последняя косая черта в
:s
выражении никогда не требуется.)источник
:%s/x
, не удаляет все вхождения x, только первое в каждой строке.:&&
чтобы повторить команду замены и ее флаги.Допустим, вы находитесь в режиме вставки и хотите сделать одну команду в обычном режиме. Вы могли бы написать это так:
Не делай так. Вместо этого используйте
<C-o>
, который выполняет одну обычную команду, а затем немедленно возвращается в режим вставки.источник
<CR>
после,<foobar>
чтобы отправить команду?:
,/
или?
)Есть три оператора "изменения регистра",
Так как это операторы, они принимают движение, поэтому для преобразования текущего символа в нижний регистр вы должны использовать
Вот тут-то и начинается забавный трюк. :) Если вы хотите изменить регистр отдельного символа или текущей строки, в визуальном режиме он будет на байт короче. Например
gul
, эквивалентноИ
gu_
(_ текущая строка) эквивалентноЭтот трюк не работает для переключения, потому что
v?
запускает поиск в обратном направлении в визуальном режиме (так же, как иv/
в обратном направлении), так что вам нужноvg?
вместо этого. Однако здесь вы можете использовать~
оператор, чтобы сэкономить еще больше байтов! (Спасибо @Doorknob за указание на это)Вы можете увидеть этот трюк в действии на моем ответе vim здесь , и на эквивалентном ответе V на и.
источник
~
, что переключает регистр символа под курсором и перемещает один вправо!Алфавит в 10 нажатий клавиш
Вся заслуга в этой технике принадлежит Линн, которая впервые использовала его в этом ответе . Я пишу это здесь для потомков.
Используйте следующие десять нажатий клавиш, чтобы восстановить строчный алфавит:
(Где
␍
возврат каретки, т. Е. Клавиша ввода.)объяснение
:h<_␍
открывает раздел справкиv_b_<_example
(пример визуального блочного выделения), в котором содержится текстabcdefghijklmnopqrstuvwyxz
.jjY
перемещается вниз к этой строке и дергает ее, затемZZ
закрывает окно справки.источник
Знай свои регистры
Смахивание или удаление текста в конкретном регистре (например
"aY
), чтобы использовать его позже, не всегда необходимо. Vim имеет несколько регистров, которые автоматически заполняются субъектами различных команд. Напечатайте,:help registers
чтобы увидеть их все, но вот несколько конкретных замечаний:Безымянный регистр:
""
- последний текст, который был вырван или удален.Нумерованный регистр
"0
- последний текст, который был вырван.Нумерованные регистры
"1
-"9
- последний текст, который был удален, если в нем не было менее одной строки. При каждом"1
заполнении его предыдущее содержимое сдвигается на"2
и т. Д.Маленький регистр удаления:
"-
- последний текст короче, чем одна строка, которая была удалена.Последний вставленный текст:
".
В частности,
"-
и"1
регистры могут быть Полезен, что позволяет удалить текст с , например ,dd
в"1
реестр и удалить какой - либо другой текст сD
в"-
(конечно, семантика не идентичны, но часто они не должны быть ).Все регистры могут быть немного сложными для отслеживания, но вы можете увидеть содержимое всех своих регистров в любое время, набрав
:registers
.источник
Это появилось в чате раньше, поэтому я подумал, что я мог бы также опубликовать его как полный совет.
<C-a>
и<C-x>
увеличивать и уменьшать следующий номер в строке. Это чрезвычайно полезная функция для простой математики, но она также позволяет аккуратно взломать.Допустим, вам нужно перейти к следующему номеру. Например, нам нужно изменить
в
Очевидный способ - перейти к 2, а затем выполнить:
Так как это короче
Есть много разных способов перейти к 2. Например,
Как и многие другие способы.
Это все 2 (или более) нажатия клавиш. Однако, так
<C-a>
и<C-x>
не только цифры увеличения / уменьшения, но и перейти к следующему номеру, мы можем взять байты выключения систочник
Гольф движений
Часто, если вы работаете с блоком текста (особенно в задачах ascii-art ), вам необходимо перейти к первому или последнему символу в буфере.
G
иgg
довольно хорошо, но есть некоторые раздражающие вещи. Например, чтобы получить последний символ, вам нужноG$
иgg
не обязательно ставить вас в первый столбец, если есть начальные пробелы. Вот некоторые более приятные движения, хотя обратите внимание, что они работают, только если ваш текст не имеет пустых строк в середине:Первый символ буфера:
{
лучше чемgg0
. Если в середине текста есть пустые строки, вы также можете использовать,go
что приведет вас к первому символу в буфере, несмотря ни на что.Последний символ буфера:
}
лучше чемG$
Они также работают в качестве аргумента для оператора, но обратите внимание, что это движения персонажа, а не движения линии!
источник
H
Гольф больше, чемgg
H
, не является надежным. Его поведение зависит от размера видимого окна и от того, где вы находитесь в буфере. (Это переназначено в V, чтобы избежать этой путаницы)Делать вычисления с регистром выражений
Вы можете делать расчеты как в обычном режиме, так и в режиме вставки.
Нормальный режим
В обычном режиме, если вы печатаете
@=
курсор переместится в командную строку, где вы можете ввести любое выражение. Когда вы нажмете ввод, результат выражения будет выполнен как команды нормального режима.Например, предположим, что вы хотите перейти к среднему столбцу текущей строки. Вызов функции
col('$')
возвращает количество столбцов в строке, поэтому мы можем сделать это, набрав следующее:Когда вы нажимаете ввод, курсор возвращается в буфер, и vim ждет оператора (например
|
), как будто вы только что ввели число. В качестве альтернативы, вы могли бы ввести это:... но, конечно, это больше байтов.
Режим вставки
Вы также можете использовать регистр выражений в режиме вставки, нажав
<Ctrl-r>=
вместо@=
. Он работает так же в обычном режиме, за исключением того, что результат ввода выражения будет выполняться в режиме вставки. Например, если вы набрали<Ctrl-r>=col('$')<CR>
, число столбцов в текущей строке будет вставлено в курсор, как если бы вы ввели его.Для получения дополнительной информации о регистре выражений введите
:help "=
.Повторное использование выражений
Последнее использованное вами выражение сохраняется в регистре выражений
"=
. Ввод@=<CR>
в обычном режиме или<Ctrl-r>=<CR>
в режиме вставки оценит выражение снова, что позволит вам использовать их так же, как макросы.Делать расчеты в подстановках
Вы также можете оценивать выражения при выполнении подстановок регулярных выражений. Все, что вам нужно сделать, это начать замену
\=
. Например, предположим, что вы хотите пронумеровать строки в этом файле:Вызов функции
line('.')
возвращает текущий номер строки, поэтому задание легко. Ввод этого:... дает желаемый результат:
Чтобы использовать захваченные группы в таком выражении, вы можете использовать
submatch()
функцию, которая, напримерsubmatch(0)
, эквивалентна\0
обычной замене,submatch(1)
эквивалентна и\1
т. Д. Это, к сожалению, израсходует много нажатий клавиш.Для получения дополнительной информации о замене выражений введите
:help sub-replace-expression
.источник
i1 <esc>bqqywjPb<C-a>@qq@q
, это чисто нормальное решение, которое на 5 байт короче. И если вы на Unix, вы могли бы даже сделать:%!nl
. Тем не менее, хорошие советы, хотя!Вы можете напрямую изменить текст макроса, который может быть значительно короче, чем сложный условный. Например, допустим, вы хотите вставить что-то n раз, где n - пользовательский ввод. Сначала я попытался сделать это:
Объяснение:
Это 18 нажатий клавиш, и это очень уродливый способ сделать это. Вместо этого перейдите к местоположению этого номера и сделайте следующее:
Объяснение:
Это 9 нажатий клавиш, огромное улучшение.
Редактировать:
Еще короче - запустить макрос для вашего номера, а затем набрать вашу команду. Например:
Объяснение:
7 нажатий клавиш.
источник
D
, а неdd
. 2. Если команда не включает регистры, вы можете сделать ее еще короче. Например, если вы хотите , чтобы повторить символx
столько раз , как число под курсором, а"qD@qix<esc>
, использованияD@"ix<esc>
.