Самая деструктивная последовательность «забыли войти в режим вставки» в Vim


10

Представьте, что у вас есть произвольный текстовый файл (который вы можете выбрать).

Дайте последовательность нажатий клавиш, которая является наиболее разрушительной (*), если она была предназначена для вставки в текст, но вместо этого была введена в обычном режиме (то есть i/ aне была нажата). Вы не можете войти в визуальный режим и не выйти из Vim.

Деструктивный определяется следующим образом: отношение количества измененных / удаленных символов к числу необходимых нажатий клавиш.
Вы получаете бонусные баллы, если ваши изменения не могут быть отменены фиксированным числом uопераций.


Пример: входной файл без разрывов строк. Входная последовательность: dfs.


Тег [code-golf] означает, что выигрывает меньшее количество персонажей. Вы бросаете вызов более сложным, поэтому я изменил тегирование.
dmckee --- котенок экс-модератора

Ответы:


3
: 0,0 w 
:r

все разрушает


1
Я не понимаю, как это все разрушает! когда я запускаю этот скрипт, он дублирует содержимое моего файла и отменяет работу! могли бы вы объяснить? Спасибо :)
saeedn

@saeedn :0,0 wдолжен написать строки от 0 до 0 и :rзатем прочитать их (теперь пустые) обратно, хотя у меня нет никакого vim, чтобы проверить это
ratchet freak

1
Ну, во-первых, : 0,0 wпишет частичный буфер, поэтому (мой) Vim отказывается сохранять его, я должен сказать, w!вместо w. Пока все хорошо, сейчас :rне открывается файл. Вместо этого вы должны сказать, :eчто будет читать в файле из файловой системы. Однако, хотя с этими модификациями он меняет буфер, буфер далеко не пуст. Он содержит первую строку (потому что вы сохранили «0,0»). По крайней мере, uотмена не работает.
битовая

3
:set ul=-1
ggdG
:w

Это очищает содержимое файла и сохраняет его. Отмена невозможна, потому что undolevelустановлено отрицательное число, которое отключает операцию отмены.

Редактировать: лучше писать :g/^/dвместо ggdG, потому что в последнем случае вы можете использовать p(положить) для отката изменений.


ggdGможно заменить на:%d
kenorb

@kenorb Да, это короче, но у него также есть проблема ggdG, которая может быть инвертирована с помощью put ( p), так что, :g/^/dкажется, все еще лучший вариант :)
saeedn

@saeedn :%d_короче, :g/^/dа также решает putпроблему.
Rich

Кроме того, за пределами возможного контекста написания этого ответа, я не уверен, что кто-нибудь случайно введет эти нажатия клавиш, думая, что они находятся в режиме вставки. ;)
Rich

2
:set ul=-1
:%s///g
:r!head -c1G</dev/urandom
:w
  1. Отключает отмену
  2. Удаляет персонажей
  3. Читает 1G данных из / dev / urandom
  4. Сохраняет

Изменение правил, потому что я добавляю символы (символ, которого нет и есть сейчас, означает, что символ был изменен). Я могу добавить столько символов, сколько захочу, так что эта оценка теоретически бесконечна.


0

5 байтов:

:bd!

с последующим нажатием Enter.

Выбрасывает текущее состояние редактируемого файла из памяти, поэтому все несохраненные изменения в этом файле теряются. Если у вас есть другие открытые файлы, они не затрагиваются. Это не завершает работу vim, даже если у вас открыт только один файл.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.