Есть ли способ «передать» текст из регистра в другой регистр или набор регистров? Например, перейти "q
к регистрам "1
через "5
.
Я часто хочу создать несколько разные версии одного и того же макроса, поэтому полезно иметь возможность скопировать макрос «шаблона» в несколько регистров, а затем изменить каждый из них на месте.
Чтобы привести практический пример, вот проблема, которая вызвала этот вопрос для меня.
Мне нужно превратить следующую строку из языка описания оборудования во множество повторяющихся блоков,
RAM64(in=in, load=load0, address=address[0..5], out=out1);
в
RAM64(in=in, load=load1, address=address[0..5], out=out2);
RAM64(in=in, load=load2, address=address[0..5], out=out3);
RAM64(in=in, load=load3, address=address[0..5], out=out4);
RAM64(in=in, load=load4, address=address[0..5], out=out5);
У меня есть макрос, который выполняет это, используя функцию приращения, yypW^At)^A
которую я сохранил в регистре "a
.
Иногда мне нужно, чтобы шаблон приращения был немного другим, например,
RAM512(in=in, load=load1, address=address[0..8], out=out2);
RAM512(in=in, load=load2, address=address[0..8], out=out4);
RAM512(in=in, load=load3, address=address[0..8], out=out6);
RAM512(in=in, load=load4, address=address[0..8], out=out8);
где макрос в реестре "b
будет yypW^At)^A^A
.
Я хочу, чтобы регистр сделал это, но для каждого приращения от 1-5. Регистр "a
можно было (как-то) скопировать в регистры с b по e. Затем я вставлял каждый регистр в буфер, вносил необходимые изменения (добавлял больше терминов, изменял символ, следующий за t
движением и т. Д.) И возвращал измененное выражение обратно в регистр. В идеале этот последний шаг может быть даже включен в команду (ы) для копирования регистров
Это избавляет меня от повторения всех символов в макросе, которые НЕ требуют изменения. Для моего примера это может быть тривиально, но я могу предвидеть времена, когда было бы очень полезно сделать то, что я прошу.
источник
Ответы:
Макросы - это просто текст.
Откройте новый пустой буфер и поместите туда свой макрос. Вы можете дублировать строки, изменить одну вещь здесь и что-то еще в другом месте, затем восстановить строку и сразу же использовать ее
@"
.Нет необходимости загрязнять ваши регистры, особенно регистры номеров, которые служат совершенно другой цели.
-- редактировать --
Теперь ваш вопрос легче понять, когда вы добавили какое-то объяснение.
Оказывается, вам нужно только изменить исходную запись, чтобы достичь цели, не играя с регистрами, как если бы они были переменными:
Чтобы создать 5 копий текущей строки с последним увеличением числа на 2:
или 12 копий с последним увеличением числа на 23:
источник
abcde
в@q
, то я хочу@x="bcdea"
,@y="abcde"
и@z="eabcd"
. Я мог бы начать с разрешения@x
,@y
и@z
все равны,@q
а затем изменить их по мере необходимости. Очевидно, что я только что сделал это, но кажется , что там может быть некоторые случаи , когда что - то подобное может быть полезным.Использование
getreg
иsetreg
Копировать из
q
в регистры1
-5
:Чтобы скопировать в более общий список:
С помощью
execute
Копировать из
q
в регистры1
-5
:Чтобы скопировать в более общий список:
Объяснение. Команду
let
можно использовать какlet @x=@y
, которая копирует регистрy
для регистрацииx
. По сути, мы просто строим эти команды в цикле (изменяя значениеx
в приведенной выше форме) иexecute
вводим их.источник
:exe
здесь. Функцииgetreg()
иsetreg()
были бы чище.Чтобы напрямую ответить на вопрос, если вы хотите быстро и легко скопировать содержимое одного регистра в другой, вы можете поместить следующее в ваш .vimrc. Затем вы можете выполнить
<leader>rcab
копирование содержимого регистраa
для регистрацииb
. В качестве примера я выбрал<leader>rc
«регистрационную копию»источник
getreg(sourceReg, 1)
.