Как заменить-вставлять yanked текст в vim, не выдергивая удаленные строки?
Поэтому я обычно копирую текст из одной точки в другую, переписывая старый текст, в который вставлено новое:
blah1 newtext blah2 wrong1 blah3 wrong2 blah4
Предположим, что я визуально newtext
и y
ank. Теперь я выбираю wrong1
(это может быть что угодно, а не просто слово), и newtext
. Однако, если я теперь сделаю то же самое с wrong2
он будет заменен на wrong1
вместо newtext
.
Итак, как мне сохранить текст, который находится в буфере, меняют местами с текстом, который я сейчас переписываю?
- Как запустить vim без выполнения / etc / vimrc?
- Как увидеть, какие плагины делают Vim медленным?
- Процесс Vim останавливается после выполнения внешней команды
- Что такое быстрый способ прокомментировать / раскомментировать строки в Vim?
- Поддержка цвета 256 для фона vim в tmux
Редактировать 1
Хотя мне очень нравятся предложения reigister (я думаю, что я начну использовать регистры больше, теперь, когда я обнаружил команду :dis
), я собираюсь изменить ответ jinfield , потому что я не использую режим подкачки.
vnoremap p "0p vnoremap P "0P vnoremap y "0y vnoremap d "0d
Делает трюк совершенно.
Изменить 2
Я был слишком быстрым; Решение romainl именно то, что я искал, без взлома в Edit 1 .
На самом деле, vnoremap p "_dP
достаточно!
Итак, меняя принятый ответ.
- Что может вызвать странных персонажей в Vim?
- Vim не окрашивает конец строк при работе внутри экрана
- Как использовать установленный Vim в Git Bash вместо того, который был с Git?
- Установка Vim в Cygwin
- Vim копирует / вставляет messing up indentaton
- Перейти к определению функции в vim
- Показать кол-во матчей в Vim
- Отправка клавиши F1 - F12 с внешней клавиатурой с отсутствующими клавишами на iPad Pro с использованием программного обеспечения эмуляции SSH
У меня есть эти сопоставления в моем .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