macvim: как вставить несколько раз одно и то же дерганное слово? - PullRequest
4 голосов
/ 08 октября 2011

Каждый раз, когда я копирую слово и хочу заменить его на несколько слов, я делаю:

  1. дергай слово
  2. войдите в визуальный режим, выберите слово для замены и вставьте восстановленное слово.

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

Может ли кто-нибудь рассказать мне о том, как эффективно достичь моей цели? Этого может быть достаточно, если мое дерганое слово не изменится.

Ответы [ 6 ]

7 голосов
/ 08 октября 2011

Я бы предложил явно использовать регистр для вашего рывка и вставить.

  1. "ayw или как бы вы ни выбрали, чтобы восстановить свое слово.
  2. "ap для вставки.

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

2 голосов
/ 09 октября 2011

Ответ был ранее: Vim: как вставить без перезаписи регистра .

В целом, грубое vnoremap p "_dP отображение почти приведет вас туда, но оно не будет хорошо работать в некоторых крайних случаях (например, если слово, которое вы заменяете, находится в конце строки).

Лучший подход - использовать этот безумно выглядящий фрагмент (хотелось бы, чтобы я знал Vimscript как минимум вдвое лучше, чем его автор):

" replace visual selection without overwriting default register
function! RestoreRegister()
    let @" = s:restore_reg
    return ''
endfunction
function! s:Repl()
    let s:restore_reg = @"
    return "p@=RestoreRegister()\<cr>"
endfunction
vnoremap <silent> <expr> p <sid>Repl()
1 голос
/ 09 октября 2011

Одно дополнение к ответу @Randy Morris: вместо того, чтобы явно указывать регистр в обоих случаях, вы можете указать его только во втором, см. :h quote0 («Нумерованный регистр 0 содержит текст из самой последней команды yank .. . »). В этом случае лучше использовать регистр a (так как его легче набирать), но если вы говорите, что заменяете слова, вы можете использовать ciw<C-r>0, а затем один . для каждого другого слова, которое вы хотите заменить.

1 голос
/ 08 октября 2011

Лично я предпочел бы сделать :s/word/replacement words/gc.

В качестве альтернативы, вы можете использовать "_de, чтобы удалить заменяемое слово. "_ говорит, что использует буфер "черной дыры", чтобы предотвратить потерю существующего содержимого буфера по умолчанию.

Возможно, немного лучше, чем это, - восстановить слова замены в альтернативном именованном буфере (например, "a3ye), затем вы можете удалить заменяемую работу (de) и вставить именованный буфер "ap.

0 голосов
/ 01 августа 2018

Я не использую янки, но ciw, а затем повторяю с .

Например:

Перейдите куда-нибудь внутри слова, которое хотите заменить.

До ciw <type new word> Esc

Перейдите куда-нибудь внутри следующего слова, которое вы хотите заменить.

Нажмите ., чтобы повторить последнюю замену.

Дополнительно:

Вы также можете сначала найти слово с помощью /<word>, а затем использовать ciw <new word>. Тогда вам не нужно самостоятельно переходить к слову перед нажатием ., но вы можете просто использовать n для перехода к следующему (или N для перехода к предыдущему).

0 голосов
/ 08 октября 2011

Я использую это сопоставление, чтобы заменить текущий выбранный текст регистром по умолчанию без его восстановления:

vnoremap <leader>p "_dP
...