Объединение последовательностей команд для повторения (.)

10

Рассматривать:

apple
pear

Поместите курсор на первую строку и введите Yp:

apple
apple
pear

Наведите курсор на pearстроку и введите, .чтобы повторить последнюю команду. Это повторяет только p(а не комбинацию Yp), производя:

apple
apple
pear
apple

Я хотел бы сказать способ .повторить последние N команд. Что-то вроде 2.повторения комбинации Ypдля получения:

apple
apple
pear
pear

Конечно, это не сработает - оно повторяется pдважды. Но идея заключается в том, чтобы «повторить последовательность последних 2 команд».

Я знаю, что могу qзаписывать последовательности команд и повторять их @@, но это решение не идеально, так как требует, чтобы вы все время планировали заранее, тогда как на практике вы часто не понимаете, что вам нужно что-то повторять до тех пор, пока ты сделал это

Есть ли способ добиться того, чего я хочу?

Утешительный приз: Если вышеперечисленное невозможно, можно ли повторить воспроизведение последнего макроса? Например, если я набрал текст @@для воспроизведения моего последнего макроса, я бы хотел, чтобы последующий .текст был эквивалентен @@повторному вводу - чего не происходит (например, если результат @@зависит от строки, на которой вы находитесь)

Ион
источник
Я не знаю решения для первой части вашей проблемы, но для второй части вы можете попробовать это сопоставление: nno <silent> @@ @@:sil! call repeat#set('@@', v:count1)<CR>Но чтобы оно работало, вам нужно установить этот плагин: github.com/tpope/vim-repeat
user9433424

Ответы:

4

Vim хранит только последнюю выполненную команду, и только она повторяется .; по моему мнению, с чем-либо еще будет трудно справиться.

Если вы чувствуете необходимость повторить Ypкомбо как единое целое, вы должны сделать его одной командой. Плагин Tim Pope repeat.vim позволяет легко это делать для пользовательских отображений. Конечно, если вы выберете короткий ключ [последовательность] для сопоставления, вы можете просто быстро набрать его (вместо .) и даже избежать интеграции repeat.vim.

Кстати, мой плагин LineJuggler предоставляет ]dотображение для дублирования текущей строки, и он поддерживает повторение через repeat.vim.

Инго Каркат
источник
2

В Yp, единственное «изменение», чтобы повторить это p. Единственный способ, которым я знаю, чтобы изменить поведение .в обычном режиме, это добавить yк cpoptionsопции:

set cpoptions+=y

что позволяет вам повторить как последний рывок, так и последнее изменение.

Но это ничего не меняет в вашей проблеме, потому что Ypэто все еще две команды: рывок, сопровождаемый изменением.

Я не думаю, что вы можете получить то, что вы хотите без некоторых нетривиальных сценариев. Вы смотрели на раздел сценариев vim.org ?

romainl
источник
1

Я часто использую mapдля достижения этого эффекта. Например:

map <F12> Yp

F12Повторное нажатие выполнит YpYpYpи т. Д. Если вы хотите переходить к следующей строке после каждой вставки, Yp+вместо этого сопоставьте клавишу .

user112358
источник
1

Замечательная штуковина, которая является плагином RepeatLast (от нашего собственного @joeytwiddle ), обеспечивает именно эту функциональность посредством нечестивого метода записи всего, что вы делаете в качестве макроса.

Он предоставляет ряд новых сопоставлений, но, если я правильно читаю документацию, для выполнения описанных вами правок вы можете использовать последовательность команд (предполагая, что вы используете значение <leader>по умолчанию \):

  • YpДерните и вставьте / вставьте строку apple,
  • jДвигайтесь вниз по линии, чтобы курсор находился на pearлинии,
  • \Dзабудь jкоманду,
  • 2\.Повторите две команды Yиp
Богатые
источник
Нечестивый, действительно! Но я ценю амбиции.
Иона