Как заменить-вставлять yanked текст в vim, не выдергивая удаленные строки?

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

blah1 newtext blah2 wrong1 blah3 wrong2 blah4 

Предположим, что я визуально newtext и y ank. Теперь я выбираю wrong1 (это может быть что угодно, а не просто слово), и newtext . Однако, если я теперь сделаю то же самое с wrong2 он будет заменен на wrong1 вместо newtext .

Итак, как мне сохранить текст, который находится в буфере, меняют местами с текстом, который я сейчас переписываю?

Редактировать 1

Хотя мне очень нравятся предложения reigister (я думаю, что я начну использовать регистры больше, теперь, когда я обнаружил команду :dis ), я собираюсь изменить ответ jinfield , потому что я не использую режим подкачки.

 vnoremap p "0p vnoremap P "0P vnoremap y "0y vnoremap d "0d 

Делает трюк совершенно.

Изменить 2

Я был слишком быстрым; Решение romainl именно то, что я искал, без взлома в Edit 1 .
На самом деле, vnoremap p "_dP достаточно!
Итак, меняя принятый ответ.

У меня есть эти сопоставления в моем .vimrc:

 " delete without yanking nnoremap <leader>d "_d vnoremap <leader>d "_d " replace currently selected text with default register " without yanking it vnoremap <leader>p "_dP 

"_ Является« регистром черных дыр », согласно :help "_ :

«При записи в этот регистр ничего не происходит, это может быть использовано для удаления текста, не влияя на нормальные регистры. При чтении из этого регистра ничего не возвращается. {Не в Vi}

В дополнение к стандартным буферам вы можете выгружать текст в именованные буферы, а затем помещать из этих названных буферов. Можно использовать до 26 названных буферов (по одному для каждой буквы). Используйте двойные кавычки и букву для доступа к именованному буферу. Примеры:

"dyy – Текущая строка Yank в буфер d.
"a7yy – Янки следующие семь строк в буфер a.
"dP – Поместите содержимое буфера d перед курсором.
"ap – Поместить содержимое буфера a после курсора

Еще одна интересная вещь, если вы используете заглавную букву вместо нижнего регистра, т. Е. «Dyy текущая строка будет добавлена ​​в буфер d вместо замены. Подробнее в книге O`Reilly: http: //docstore.mik. иа / orelly / Unix / VI / ch04_03.htm

При использовании put в визуальный режим текст, который вы заменяете, wrong1 , перезаписывается содержимым «unamed» register.

Это фактически работает путем «размещения» регистра после выбора и последующего удаления выбора. Проблема в том, что это удаление теперь сохраняется в unnamed регистре и будет использоваться для следующего действия put .

Решение, в соответствии с :h v_p , состоит в том, чтобы вынуть в именованный регистр, например "0p а затем вставить с помощью "0p столько раз, сколько вам нужно». Может быть полезно отобразить <leader>y и <leader>p чтобы использовать именованный регистр, если это часто вы делаете.

 :map <leader>y "0y :map <leader>p "0p 

Для получения дополнительной помощи см .:

 :help v_p :help map 

Когда вы держите текст в неназванный регистр *, копия также помещается в регистр 0. Каждый раз, когда вы заменяете выделенный текст, вы можете просто вставить из регистра 0. Видеть

 :help registers 

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

 :help single-repeat 

* Место хранения, в которое вы вставляете и выкладываете, называется регистром. Буфер – это то, что вы редактируете, обычно это копия файла с диска.

Вставка из регистра "0 важна, но вы часто хотите многократно заменять. Если вы делаете это повторяемым действием, вы можете использовать оператор., О чем упоминается garyjohn. Это объясняется на vim wiki :

 yiw yank inner word (copy word under cursor, say "first". Same as above). ... Move the cursor to another word (say "second"). ciw<Cr>0 select "second", then replace it with "first" If you are at the start of the word then cw<Cr>0 is sufficient. ... Move the cursor to another word (say "third"). . select "third", then replace it with "first". 

Мне нужно это так часто, я написал для этого плагин: ReplaceWithRegister .

Этот плагин предлагает команду «два-в-одном», которая заменяет текст, охватываемый {motion}, целая строка (строки) или текущий выбор содержимым регистра; Старый текст удаляется в регистр черных дыр, т. Е. Он ушел.

Как-то вроде vnoremap p "_dP (я также пробовал x или c ) имеет проблемы с началом и концом строки, я закончил это: vnoremap p :<CU>let @p = @+<CR>gvp:let @+ = @p<CR> который я нашел более простым, чем существующие плагины (который также не работал с set clipboard=unnamedplus из коробки). Так что он делает:

  • Переключиться в режим команд
  • Удалить диапазон ( CU )
  • Backup + register (из-за unnamedplus, альтернативы " и * зависимости от вашей конфигурации) к p
  • Восстановить выбор и вставить
  • Снова переключиться в режим команд
  • Восстановить регистр

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

Примечание. Кодекс, представленный здесь, сокращен. Полный список с возможностью отладки и другими комментариями и кредитами см .: http://pastebin.com/aBEsm5mV

 function! SmartCut() execute 'normal! gv"+c' if visualmode() != "\<Cv>" " If not Visual-Block mode " Trim the last \r\n | \n | \r character in the '+' buffer " Note: This messes up Visual-Block pasting. let @+ = substitute(@+,'\(\r\?\n\|\r\)$','','g') endif endfunction function! SmartCopy() execute 'normal! gv"+y' if visualmode() != "\<Cv>" " If not Visual-Block mode " Trim the last \r\n | \n | \r character in the '+' buffer " Note: This messes up Visual-Block pasting. let @+ = substitute(@+,'\(\r\?\n\|\r\)$','','g') endif endfunction function! SmartPaste() let mode = 'gv' let delete = '"_d' let reg = '"+' let currentLine = line(".") let lastLineOfBuffer = line("$") let selectionEndLine = line("'>") let selectionEndLineLength = len(getline(selectionEndLine)) let nextLineLength = len(getline(currentLine + 1)) let selectionEndColumn = col("'>") " If selection does not include or go beyond the last visible character of the line (by also selecting the invisible EOL character) if selectionEndColumn < selectionEndLineLength let cmd = 'P' " If attempting to paste on a blank last line elseif selectionEndLineLength == 0 && selectionEndLine == lastLineOfBuffer let cmd = 'P' " If selection ends after the last visible character of the line (by also selecting the invisible EOL character) and next line is not blank and not the last line elseif selectionEndColumn > selectionEndLineLength && nextLineLength > 0 && selectionEndLine != lastLineOfBuffer let cmd = 'P' " If selection ends after the last visible character of the line (by also selecting the invisible EOL character), or the line is visually selected (Shift + V), and next line is the last line elseif selectionEndColumn > selectionEndLineLength && selectionEndLine == lastLineOfBuffer let cmd = 'p' call append(selectionEndLine, "") else let cmd = 'p' endif if visualmode() != "\<Cv>" " If not Visual-Block mode " Trim the last \r\n | \n | \r character in the '+' buffer " Note: This messes up Visual-Block pasting. let @+ = substitute(@+,'\(\r\?\n\|\r\)$','','g') endif execute 'normal! ' . mode . delete . reg . cmd " Move caret one position to right call cursor(0, col(".") + 1) endfunction 

Применение:

 " p or P delete to black hole register before pasting vnoremap <silent>p :<Cu>call SmartPaste()<CR> vnoremap <silent>P :<Cu>call SmartPaste()<CR> " MiddleMouse delete to black hole register before pasting nmap <MiddleMouse> "+p " Changes default behavior from 'P' mode to 'p' mode for normal mode middle-mouse pasting vmap <silent><MiddleMouse> :<Cu>call SmartPaste()<CR> imap <MiddleMouse> <Cr><Co>+ " Disable weird multi-click things you can do with middle mouse button map <2-MiddleMouse> <Nop> imap <2-MiddleMouse> <Nop> map <3-MiddleMouse> <Nop> imap <3-MiddleMouse> <Nop> map <4-MiddleMouse> <Nop> imap <4-MiddleMouse> <Nop> if os !~ "mac" " NOTE: MacVim provides Command+C|X|V|A|S and undo/redo support and also can Command+C|V to the command line by default " Copy and paste for the command line cmap <Cc> <Cy> cmap <Cv> <Cr>+ " TODO: Is their a select-all for the command line??? vmap <silent><Cx> :<Cu>call SmartCut()<CR> vmap <silent><Cc> :<Cu>call SmartCopy()<CR> vmap <silent><Cv> :<Cu>call SmartPaste()<CR> imap <Cv> <Cr><Co>+ " Select-all support for normal, visual, and insert mode " http://vim.wikia.com/wiki/Using_standard_editor_shortcuts_in_Vim nmap <Ca> ggVG vmap <Ca> ggVG imap <Ca> <Esc>ggVG " Save file support for normal, visual, and insert mode " If the current buffer has never been saved, it will have no name, " call the file browser to save it, otherwise just save it. command -nargs=0 -bar Update if &modified | \ if empty(bufname('%')) | \ browse confirm write | \ else | \ confirm write | \ endif | \endif nmap <Cs> :update<CR> vmap <Cs> <Esc>:update<CR>V imap <Cs> <Co>:update<CR> " Undo and redo support for normal, visual, and insert mode nmap <Cz> <Esc>u nmap <Cy> <Esc><Cr> vmap <Cz> <Esc>uV vmap <Cy> <Esc><Cr>V imap <Cz> <Esc>uI imap <Cy> <Esc><Cr>I " Find and Find/Replace support for normal, visual, and insert mode nmap <Cf> :promptfind<CR> nmap <Ch> :promptrepl<CR> vmap <Cf> <Esc>:promptfind<CR> vmap <Ch> <Esc>:promptrepl<CR> imap <Cf> <Co>:promptfind<CR> imap <Ch> <Co>:promptrepl<CR> endif 
  • Mac OS X Terminal: поддержка мыши?
  • Сделать Vim показать ВСЕ пробелы как символ
  • Можно ли заменить несколько элементов в одном регулярном выражении в VIM или Perl?
  • Стоит ли тратить время на обучение Emacs?
  • Специальная подсветка синтаксиса Vim, включая синтаксис другого языка в указанном диапазоне
  • Как изменить существующий буфер на новой вкладке в vim?
  • Как заменить экранный буфер vim предыдущей активностью bash после выхода?
  • Патоген не загружает плагины
  • Как скопировать в буфер обмена в Vim?
  • Nerdtree и текущий каталог
  • Прокрутка внутри Vim в терминале Mac
  • Давайте будем гением компьютера.