Чи можу я повторити макрос із "оператором точок"?


15

Чи можу я повторити макрос із .командою? Наприклад, я хотів би мати можливість вводити:

@q...

і ефективно його телефонувати @q4 рази. З поведінкою за замовчуванням, це працює тільки тоді , коли «д» має одну команду, наприклад dw, xабо iHello<esc>. (Це має сенс, оскільки "." Повторює останню зміну , а не останні клавіші / команди)

Я також хотів би, щоб ця робота була рахунком. Наприклад, набравши:

3@q.

було б ефективно таким же, як і біг @q6 разів. Як я можу налаштувати таку поведінку?


1
Не зовсім те, що ви просите, але, можливо, це буде корисним github.com/wincent/replay . Цей запис остаточно записаний макрос і відтворює його при натисканніEnter
grodzik

FYI, @@повторює останній макрос, тому якщо ви запитуєте це заради відображень і подібних, воно повинно працювати для вас.
Шахбаз

Відповіді:


7

Спробуйте це. Він перевстановлюється @так, що g@(плюс фіктивний рух l) використовується потім, стаючи таким чином останнім оператором і підлягає повторенню ..

" When . repeats g@, repeat the last macro.
fun! AtRepeat(_)
    " If no count is supplied use the one saved in s:atcount.
    " Otherwise save the new count in s:atcount, so it will be
    " applied to repeats.
    let s:atcount = v:count ? v:count : s:atcount
    " feedkeys() rather than :normal allows finishing in Insert
    " mode, should the macro do that. @@ is remapped, so 'opfunc'
    " will be correct, even if the macro changes it.
    call feedkeys(s:atcount.'@@')
endfun

fun! AtSetRepeat(_)
    set opfunc=AtRepeat
endfun

" Called by g@ being invoked directly for the first time. Sets
" 'opfunc' ready for repeats with . by calling AtSetRepeat().
fun! AtInit()
    " Make sure setting 'opfunc' happens here, after initial playback
    " of the macro recording, in case 'opfunc' is set there.
    set opfunc=AtSetRepeat
    return 'g@l'
endfun

" Enable calling a function within the mapping for @
nno <expr> <plug>@init AtInit()
" A macro could, albeit unusually, end in Insert mode.
ino <expr> <plug>@init "\<c-o>".AtInit()

fun! AtReg()
    let s:atcount = v:count1
    let c = nr2char(getchar())
    return '@'.c."\<plug>@init"
endfun

nmap <expr> @ AtReg()

Я намагався впоратися з якомога більшою кількістю кутових справ. Ви можете повторити @:з .. Залічується до @або .утримується для наступних пресів ..

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

Особисто я добре маю різницю між дрібнозернистими повторами .останньої зміни та макро повторами @@.

EDIT

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

fun! QRepeat(_)
    call feedkeys('@'.s:qreg)
endfun

fun! QSetRepeat(_)
    set opfunc=QRepeat
endfun

fun! QStop()
    set opfunc=QSetRepeat
    return 'g@l'
endfun

nno <expr> <plug>qstop QStop()
ino <expr> <plug>qstop "\<c-o>".QStop()

let s:qrec = 0
fun! QStart()
    if s:qrec == 1
        let s:qrec = 0
        return "q\<plug>qstop"
    endif
    let s:qreg = nr2char(getchar())
    if s:qreg =~# '[0-9a-zA-Z"]'
        let s:qrec = 1
    endif
    return 'q'.s:qreg
endfun

nmap <expr> q QStart()

Це працює фантастично! З моменту розміщення цього питання мій робочий процес змінився, тому я не хочу більше повторювати макроси з крапкою. Однак це працює дуже добре, тому я все одно прийму його (хоча, мабуть, не додаю його до свого .vimrc)
Джеймс,

Не хвилюйтесь, цікава проблема незалежно!
Антоній

1
Редагувати: дозволити відтворення макросу .відразу після запису.
Антоній

Думаю, \<plug>qstopмає бути раніше qу функції QStart
Стів Вермеулен

6

Щоб повторити свій останній макрос, ви можете використовувати @@так, 3@@що по суті виконується @q 3 рази. Однак натискання клавіш @ можуть бути непростими, тому у своєму .vimrc у мене є рядки:

  "- Lazy macro repeat
  nmap <leader>m @@

Це дозволяє мені використовувати свій лідерський ключ (,) плюс m для запуску останнього макросу. Потім ви можете передувати цьому числу, щоб повторити макрос.

Зараз 3,mеквівалентно 3@@. Однакові загальні клавіші і не потрібно утримувати зміну.

EDIT : Після переосмислення цього я придумав новий макрос. nmap <leader>. @@ Це також працює, коли йому передує число, тому 3,.зараз 3@@хотілося б побачити цю роботу, щоб я міг передати макрос літеру і повторити цей макрос замість останнього макросу.


ОП хочуть 3@q.працювати @q6 разів. Це не робить цього.
користувач41805

Читаючи ваше запитання, я не впевнений, що це відповідає на нього. Чи можете ви навести приклад, коли б ви використовували 3@q.? Здавалося б, ви могли б просто доповнити його рахунком. Я схильний встановлювати пошук перед початком макросу, а потім використовувати nв макросі, щоб перейти до початку, де він може бути відтворений.
Shadoath

5

Ви можете записати використання макросу в інший макрос і повторити це.

qqdwq
qr2@qq

Зараз 3@rце як бігати @qшість разів.


1

За замовчуванням spacevim - це "переміщення праворуч 1 символ", яке вже охоплене l, тому я перезавантажив простір для повторного запуску макросу з буфера q:

noremap <Space> @q

Для використання просто запишіть макрос qqспочатку, зупиніть запис із, qа потім натисніть spaceдля відтворення.


FYI, з тієї причини, яку ви заявляєте (це не обов'язковий ключ), багато людей використовують простір як свій лідерський ключ, тому може бути не так багато людей з ним безкоштовно, як ви думаєте. :)
B Layer

0

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

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