Як я можу використовувати режим завершення вставки в макросі?


11

Я намагаюся визначити макрос, який швидко формує список випадкових результатів слів.
Я хочу, щоб макрос перетворив це на такий собі список

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а`
  • <C-p>виберіть останній пункт у списку завершень, який з’являється, у моїй системі його слово arezzo. (Примітка. Я longestвключив у свою 'completeopt'установку, яка необхідна для <C-p>роботи таким чином під час завершення:) 'set completeopt=longest,menuone,preview'.
  • <C-y> прийняти завершення
  • ^[^[ вихід в режим вставки
  • j перехід до наступного рядка, готовий зробити таку ж операцію на наступному рядку
  • q припинити запис

коли я створюю макрос і виконую кроки вручну, все працює добре, але коли я виконую макрос, я бачу повідомлення, що в командному рядку блимає щось на кшталт:

сканування файлу словника

і нічого не відбувається, команд у макросі jвиконується тільки , тобто курсор рухається вниз по рядку, але жодна з команд завершення не виконується.
Чи можна використовувати завершення режиму вставки в макросі, і якщо так, то як це зробити?


Я не розумію вашого <C-p>кроку ... коли я роблю це у своєму vim, воно просто дає повідомлення back at original- не вибирає останній елемент. Я двічі використовував клавішу зі стрілкою вгору, щоб вибрати останнє слово (мій випадок azures), натиснув клавішу Enter і то Esc+j+q.. тоді воно працює чудово на виконанні макросу
Sundeep

1
@spasic ах добре, я мав би зазначити, але я використовую set completeopt=longest,menuone,previewйого longestваріант, який викликає <C-p>негайне вставлення. Якщо я видаляю longestз completeoptрядка, я отримую таку ж поведінку, як і ви. Крім того, так спрацювали клавіші зі стрілками! дякую (я забув, що ви можете використовувати їх для навігації по списку завершень)
the_velour_fog

Можливо, спливаюче меню заважає. Можливо, спробуйте :set completeopt=і a<c-x><c-k><esc>jяк ваш макрос.
Антоній

@Antony Я не впевнений, чому <Cp> не працював, але клавіші зі стрілками працювали.
the_velour_fog

Відповіді:


2

EDIT : Дійсно, ви закінчите словник; для цього вам не обов’язково потрібен режим вставки (режим Ctrl + X). Як ви виявили, це робить роботу з макросами справжнім болем. Наведений нижче сценарій можна використовувати для завершення словника без режиму вставки, щоб ви могли легко повторити його всередині макросу.

Додайте нижченаведений код у свій .vimrcфайл, закрийте та повторно відкрийте будь-які вікна Windows, щоб відкрити нову функцію, а потім запишіть себе по черзі, натискаючи, <C-k>щоб виконати завершення та jперейти до наступного рядка. Я додав чек на longestопцію, і якщо він відключений, він вибирає випадковий запис, використовуючи системний випадковий час. Якщо він знайде longestпараметр, він вручну шукає найдовший запис зі словника і вставляє його.

Якщо вам не подобається <C-k>картографування, сміливо змінюйте його, як вважаєте за потрібне. Він повинен працювати з будь-яким картуванням, яке вам подобається.

Також команда повернути вираз для відображення для оцінки додає \<esc>символ до кінця, так що ми залишаємо режим вставки автоматично після кожної вставки, а 0cwна передній панелі вводимо режим вставки для початку і переконаймося, що ми перезаписали все слово правильно. Залежно від конкретної поведінки, яку ви хочете (якщо ваші слова знаходяться не в передній частині кожного рядка), ви можете скористатись bcwзамість цього, щоб знайти власне слово початку. Однак тоді ви побачите деякі дивацтва, повертаючись до слів, які починаються з рядка. Напевно, є більш досконала команда ігнорувати закінчення рядка та робити обидва відразу, але я не зміг його знайти.

map <expr> <C-k> CompleteDictionary()
fun! CompleteDictionary()
    let cword = expand(“<cword>”)
    let res = []
    for m in readfile(&dictionary)
        if m =~ '^' . cword
            call add(res, m)
        endif
    endfor
    if &completeopt =~ 'longest'
        let max = 0
        let maxindex = 0
        let index = 0
        for item in res
            if strlen(item) > max
                let max = strlen(item)
                let maxindex = index
            endif
            let index = index + 1
        endfor
        return "0cw" . res[maxindex] . "\<esc>"
    else
        return "0cw" . res[system('@echo %RANDOM%') % len(res)] . "\<esc>"
    endif
endfun

Крім того, було б непросто розширити тут логіку для створення альтернативних відображень (використовуючи, наприклад, параметри функції), які виконують будь-яку функцію, яку надає режим вставки. Я буду радий допомогти з будь-якими подібними вимогами та оновити цей сценарій, коли встигну.


Це здається правдоподібним поясненням проблеми, але я спробував обидва запропоновані вами рішення, і жодне не здавалося, що допоможе.
Багатий

Ви також спробували sleepкоманду?
Тім

Так, хоча лише із запропонованим значенням 5 секунд. Чи вдалося вам отримати рішення для роботи? Чи можете ви опублікувати повний перелік кроків?
Багатий

Я не та людина, яка написала запитання. Тим НЕ менше, я можу відтворити проблему: ви повинні додати довгий , щоб , completeoptяк описано в коментарях (знову - таки, не мною). редагувати : На жаль, 'longest'для ctrl-pкроку потрібно: ні ctrl-y. Але кроки, описані запитувачем, працюють для мене vim -Nu NONEз completeoptредактором.
Багатий

Я думаю, що я знайшов рішення, дайте мені кілька хвилин, щоб оновити свою відповідь на нього.
Тім
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.