Я пытаюсь определить макрос, который быстро генерирует список случайных слов.
Я хочу, чтобы макрос превратил это в список вроде
a
b
c
d
e
в это
arezzo
bywords
czars
détente
eyrie
Что у меня так далеко:
- наведите курсор на букву
a
- начать запись макроса
qq
a
войти в режим вставки<C-x><C-k> - perform dictionary completion on the character before cursor - in this case the letter
a`<C-p>
выберите последний элемент в списке завершения, который появляется, в моей системе это словоarezzo
. (Примечание: яlongest
включил в свои'completeopt'
настройки, которые необходимы для<C-p>
работы таким образом во время завершения:)'set completeopt=longest,menuone,preview'
.<C-y>
принять завершение^[^[
выход из режима вставкиj
перейти на следующую строку, готовый сделать ту же операцию на следующей строкеq
остановить запись
когда я создаю макрос и выполняю шаги вручную, все работает нормально, однако когда я выполняю макрос, я вижу сообщение, вспыхивающее в командной строке, что-то вроде:
сканирование файла словаря
и ничего не происходит, из команд в макросе только j
выполняется, то есть курсор перемещается вниз по линии, но ни одна из команд завершения не выполняется.
Можно ли использовать завершение режима вставки в макросе, и если да, то как я могу это сделать?
autocompletion
macro
the_velour_fog
источник
источник
<C-p>
шаг ... когда я делаю это в моем vim, он просто выдает сообщениеback at original
- не выбирает последний элемент ... Я дважды использовал клавишу со стрелкой вверх, чтобы выбрать последнее слово (мой случайazures
), нажал Enter и тогдаEsc+j+q
.. тогда он работает довольно хорошо при выполнении макросаset completeopt=longest,menuone,preview
егоlongest
вариант, который вызывает<C-p>
немедленную вставку. Если я удалюlongest
изcompleteopt
строки, я получу то же поведение, что и вы. Кроме того, да, клавиши со стрелками работали! спасибо (я забыл, что вы можете использовать их для навигации по списку завершения):set completeopt=
иa<c-x><c-k><esc>j
как ваш макрос.Ответы:
РЕДАКТИРОВАТЬ : На самом деле вы после завершения словаря; вам не обязательно нужен режим вставки (режим Ctrl + X), чтобы сделать это. Как вы обнаружили, это делает работу с макросами настоящей болью. Приведенный ниже скрипт можно использовать для завершения словаря без режима вставки, чтобы вы могли легко повторить его внутри макроса.
Добавьте приведенный ниже код в свой
.vimrc
файл, закройте и снова откройте все окна vim, чтобы получить новую функцию, а затем запишите себя поочередно, нажимая,<C-k>
чтобы выполнить завершение иj
перейти к следующей строке. Я добавил проверку дляlongest
опции, и если она отключена, она выбирает случайную запись, используя системное случайное время. Если он находитlongest
опцию, он вручную ищет самую длинную подходящую запись в словаре и вставляет ее.Если вам не нравится
<C-k>
отображение, не стесняйтесь менять его по своему усмотрению. Он должен работать с любым отображением, которое вам нравится.Кроме того, команда, возвращающая выражение для сопоставления для оценки, добавляет
\<esc>
символ в конец, чтобы мы автоматически выходили из режима вставки после каждой вставки, и0cw
впереди, чтобы перейти в режим вставки для начала, и убедитесь, что мы перезаписали все слово. правильно. В зависимости от того, какое именно поведение вы хотите (если ваши слова неbcw
находятся в начале каждой строки), вы можете использовать вместо этого фактическое начало слова. Однако тогда вы увидите некоторые странности, когда вернетесь к словам, начинающим строку. Вероятно, есть более продвинутая команда, чтобы игнорировать окончание строки и выполнить оба сразу, но я не смог найти ее.Кроме того, не составит труда расширить здесь логику для создания альтернативных отображений (используя, например, параметры функции), которые выполняют любую функцию, которую обеспечивает режим вставки. Я буду рад помочь с любыми такими требованиями и обновить этот скрипт, как у меня есть время.
источник
sleep
тоже пробовал команду?completeopt
как описано в комментариях (опять - таки, не мной). редактировать : К сожалению,'longest'
требуется дляctrl-p
шага: нетctrl-y
. Тем не менее шаги , описанные в вопрос-Аскер работы для меня вvim -Nu NONE
сcompleteopt
изм.