Как предоставить параметр в макросе vim - PullRequest
5 голосов
/ 14 ноября 2011

Можно ли предоставить какой-либо параметр при записи макроса в vim через приглашение или каким-либо другим способом?

Редактировать: У меня есть такой код:

foo
bar

И я бы хотелокружить каждый блоком ruby:

expect do
  foo
end.to raise_error(CustomClass)

expect do
  foo
end.to raise_error(OtherCustomClass)

Итак, легко создать макрос, который будет выглядеть так: ожидайте do foo end.to повысить_error ()

expect do
  foo
end.to raise_error()

Но это будетбыло бы неплохо иметь подсказку, которая будет использоваться для установки параметра метода lift_error.При каждом использовании макроса этот параметр будет разным.

Ответы [ 4 ]

6 голосов
/ 15 ноября 2011

Хотя я согласен со всеми остальными, что если вам нужна эта функция, вы, вероятно, решаете проблемы неэффективно, но можно вставить переменную текстовую строку в документ как часть макроса.Хитрость заключается в том, чтобы сохранить текст, который вы хотите использовать в макросе, в регистре.

  1. вставить некоторый текст в именованный регистр, например "xyw, чтобы вставить слово в регистр x
  2. запишите ваш макрос, qq, когда вы хотите поместить переменный текст, поместите его, например, "xp, чтобы поместить текст в регистре x в документ, где курсор находится
  3. теперь, когда вы играете свой макрос q, @q, он будет использовать все, что в настоящее время в регистре x, так что вы можете вставить другой текст в регистр x, воспроизвести ваш макрос q и недавно восстановленныйтекст будет использоваться.
6 голосов
/ 14 ноября 2011

Если вы говорите о записи макроса с qx...q, это невозможно.

Однако вы все равно можете сделать: :let @y = substitute(@x, 'old_pattern', 'replacement', 'g') и затем использовать @y.

Youтакже может определить функцию:

function Play(myArg)
   execute 'normal sequence_of_characters' . a:myArg . 'other_sequence_of_characters'
endfunction

call Play('foo')
2 голосов
/ 31 октября 2017

Особенно в ситуации ОП, где у вас действительно есть только два переменных фрагмента контента, я считаю, что самым простым методом является бастардизация @ mkomitee * подход выше .

Вместо того, чтобы вручную сохранять два «параметра» в регистрах перед каждым использованием макроса, я предпочитаю набирать «первый параметр», визуально выбрать его, оценить макрос, а затем ввести «второй параметр». Для достижения затем я запускаю макрос с помощью команды удаления (простой d , при условии, что вы всегда будете вызывать макрос, например, в визуальном режиме); затем завершите его командой, которая переключается в режим вставки (например, c или i ), и, наконец, находясь в режиме вставки, a Ctrl-O q , чтобы макрос также оставлял Vim в режиме вставки после завершения.

В качестве слегка простого примера, если два «параметра» являются отдельными словами, здесь приведены нажатия клавиш для создания (а затем вызова) макроса для манипулирования widget.snog() параметризованным widgetFoo.fooSnog(bar):

  • foo b qq "zdw - мы сейчас записываем в регистр q с первым аргументом ' в z

  • "aP - префикс-вставка из фиксированного регистра, используемого в другом месте документа

    widget.snog()‸
    
  • * * ^ тысячу пятьдесят-два * ** 1 054 тысяча пятьдесят-три * е * ** 1056 тысяча пятьдесят пять * a␣ * 1 057 * Ctrl-R Esc * +1061 ** +1062 * б ~ hx - вставьте первый аргумент и используйте

    widget‸Foo.snog()
    
  • 2w ~ b "zP - использовать существующее слово с заглавной буквы, затем снова вставить первый аргумент

    widgetFoo.fo‸oSnog()
    
  • $ Ctrl-O q - перейти в последнюю позицию, войти в режим вставки и завершить макрос

    widgetFoo.fooSnog(‸)
    

После завершения первого экземпляра с bar мы можем использовать его несколько раз:

  • o баз Esc b - установить наш первый аргумент,

    widgetFoo.fooSnog(bar)
    ‸baz
    
  • @ q quux Esc - вызвать макрос и завершить работу со вторым

    widgetFoo.fooSnog(bar)
    widgetBaz.bazSnog(quux‸)
    
  • o corge Esc b @@ grault Esc - повторить a третий раз

    widgetFoo.fooSnog(bar)
    widgetBaz.bazSnog(quux)
    widgetCorge.corgeSnog(grault‸)
    
  • o garply Esc b @@ waldo Esc - … и и так далее

    widgetFoo.fooSnog(bar)
    widgetBaz.bazSnog(quux)
    widgetCorge.corgeSnog(grault)
    widgetGarply.garplySnog(waldo‸)
    

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


tl; dr : введите первый аргумент; введите макро-запись до , удалив ее в регистр; манипулировать вашим текстом по желанию; затем оставьте vim в режиме вставки в позиции второго аргумента с Ctrl-O q .

0 голосов
/ 06 октября 2015

Если вам нужно сгенерировать код, в таком случае лучше всего использовать vim snippets .Вы можете настроить сниппет, чтобы поместить курсор туда, куда вам нужно, когда вы [вкладка].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...