Silinen satırları bölmeden yanmış metni vim'de nasıl yapıştırırım?


39

Bu yüzden genellikle kendimi yeni yapıştırılan eski metnin üzerine yazarken kendimi bir noktadan diğerine kopyalarken buluyorum:

blah1
newtext
blah2
wrong1
blah3
wrong2
blah4

Diyelim ki görsel olarak işaretle newtextve işaretle y. Şimdi wrong1(bir şey olabilir, mutlaka sadece bir kelime değil) pseçimini yapıyorum newtext. Ancak şimdi aynısını yaparsam bunun yerine wrong2onunla değiştirilecektir .wrong1newtext

Öyleyse, arabellekte bulunan metnin şu anda üzerine yazdığım metnin yerine geçmesini nasıl önleyebilirim?

Düzenle 1

Her ne kadar kayıt önerilerini beğenmeme rağmen (kayıtları daha fazla kullanmaya başlayacağımı düşünüyorum, şimdi :diskomutu buldum), takas modunu kullanmadığım için jinfield'ın cevabını değiştireceğim.

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

hile mükemmel yapar.

Düzenle 2

Çok hızlıydım; romainl 'in çözümü tam da aradığım şeydi, Edit 1’deki kesmeksizin .
Aslında, vnoremap p "_dPyeter!
Yani değişen cevap kabul edildi.


2
Hey dostum, uzun zamandır bunu kullandım vnoremap p "_dP mapve satırdaki son kelime / karakter için iyi çalışmadığını fark ettim. Ben gittikten geri ettik vnoremap p "0p, vnoremap P "0Pve set clipboard=unnamed(OSX için)
Kache

vnoremap p "_dPmacun üzerindeki beyaz boşlukları kaldırır. Düzenleme 1 mükemmel çalışıyor.
Vaclav Kasal

Yanıtlar:


21

.Vimrc dosyasında şu eşlemelere sahibim:

" 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

"_göre "karadelik kayıt cihazı" dır :help "_:

"Bu sicile yazarken hiçbir şey olmuyor. Bu, normal sicilleri etkilemeden metni silmek için kullanılabilir. Bu sicilden okurken hiçbir şey döndürülmez."


1
Bunu kullandım vnoremap p "_dP mapve bir satırdaki son kelime / karakter için iyi çalışmadığını fark ettim. Ben gittikten geri ettik vnoremap p "0p, vnoremap P "0Pve set clipboard=unnamed(OSX için)
Kache

vnoremap p "_dPseçme modunda benim için çalışmayı bırak, ama vnoremap <leader>p "_dPişe yarıyor
whitesiroi 5:15

1
belki <leader>de bir şeyle değiştirmem gerektiğini bilmem gereken bir yer tutucudur, ancak bu yalnızca çıkardıysam benim için işe yaradı. Burada ne anlama geliyor?
Hashbrown

1
@Hashbrown :help mapleader,.
romainl

Küçük uyarı: vnoremap <leader>peşleme, tamponun son satırında düzgün çalışmaz, çünkü tamponun son satırını sildiğiniz anda, şimdi bir saniyelik-son satırındasınız ve Pbu satırın üzerine yapıştırılır. aşağıda yerine.
Kal

13

Standart arabelleğe ek olarak, metni adlandırılmış tamponlara yerleştirebilir ve ardından adlandırılmış tamponlara koyabilirsiniz. Kullanabileceğiniz en fazla 26 adlandırılmış arabellek vardır (her harf için bir tane). Adlandırılmış bir arabellek erişmek için çift tırnak işareti ve bir harf kullanın. Örnekler:

"dyy - Geçerli satırı tampon belleğe doldur.
"a7yy- Önümüzdeki yedi satırı Tampon a.
"dP- İmlecin önüne d tampon içeriğini koyun.
"ap- Tampon içeriğini imlecin arkasına yerleştirin

Başka bir şey, küçük harf yerine büyük harf kullanıyorsanız, yani "Dyygeçerli satır yerine d yerine arabellek eklenir. O`Reilly kitabında daha fazla ayrıntı: http://docstore.mik.ua/orelly/unix/vi/ch04_03.htm


3
Çok güzel bir şey. Tamponları biliyordum, ama onları bu problemle ilişkilendirmedim. Hala "aher şey için hantal , ama tamam.
bit maskesi

4

putGörsel modda kullanırken , değiştireceğiniz metnin wrong1üzerine 'isimsiz' yazmacının içeriği yazılır.

Bu aslında seçimden sonra kayıt defterini 'koyarak' ve ardından seçimi silerek çalışır. Sorun, bu silme işleminin şimdi unnamedkayıt defterinde saklanması ve bir sonraki putişlem için kullanılmasıdır .

Buna göre çözüm, daha sonra istediğiniz kadar kullanarak yapıştırmak :h v_pgibi adlandırılmış bir kayıt cihazına yazmaktır . Sık sık yaptığınız bir şeyse, haritalandırmak ve adlandırılmış bir sicil kullanmak yardımcı olabilir ."0y"0p<leader>y<leader>p

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

Daha fazla yardım için bkz:

:help v_p
:help map

Bu çözüm en çok kullanışlı görünmektedir, vim kendisinden zekice bir şey çıkana kadar.
Yugal Jindle,

4

"0Kayıt defterinden yapıştırma işlemi bilmek önemlidir, ancak çoğu zaman birçok kez değiştirmek istersiniz. Bunu tekrarlanabilir bir işlem yaparsanız, .operatörü garyjohn tarafından belirtildiği gibi kullanabilirsiniz. Vim wiki'de açıklandı :

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

3

Metni adsız kayıt defterine * soktuğunuzda, bir kopya da kayıt 0'a eklenir. Seçilen metni her değiştirdiğinizde, yalnızca 0 kayıt defterinden yapıştırabilirsiniz. Görmek

:help registers

Ek olarak, aynı kelimeyle birkaç kelimeyi değiştiriyorsanız, sadece değiştirilecek kelimenin başına geçebilir ve yazabilirsiniz .. Bu son düzenleme işlemini tekrarlayacaktır. Görmek

:help single-repeat

* İstediğiniz ve içine koyduğunuz depolama konumlarına kayıtlar denir. Arabellek, düzenlediğiniz, genellikle bir dosyanın diskten bir kopyasıdır.


1

Buna çok sık ihtiyacım var, bunun için bir eklenti yazdım: ReplaceWithRegister .

Bu eklenti, bir gr{motion}, tüm satır (lar) ın kapsadığı metnin veya mevcut seçimin bir yazıcının içeriği ile değiştirildiği ikisini bir arada bir komut sunar ; eski metin karadelik kaydına silinir, yani gitti.


1

Gibi bir şey vnoremap p "_dP(ben de denedim xya da c) satır başında ve sonu ile ilgili sorunlar olduğu gibi, ben bunu bitirdim: vnoremap p :<C-U>let @p = @+<CR>gvp:let @+ = @p<CR>Ben mevcut eklentileri daha basit buldum (aynı zamanda set clipboard=unnamedpluskutu dışında işe yaramadı ). Öyleyse ne yapıyor:

  • komut moduna geç
  • aralığı kaldır ( C-U)
  • yedekleme +kaydı (adsız artı nedeniyle, alternatifler "ve *yapılandırmanıza bağlı olarak)p
  • seçimi kurtar ve yapıştır
  • tekrar komut moduna geç
  • kayıt kurtarma

Mükemmel! Bu benim için beklendiği gibi çalışan bu seçeneklerden ilki. Teşekkürler!
Jamis Charles,

1

Bu, Windows tarzı Control + X kesme / Control + C kopyala / Control + V yapıştırma / Control + S kaydet / Kontrol + F bul / Kontrol + H yerine koyma davranışını kullanmam.

Smartpaste () işlevi aradığınızı, yani aynı anda seçili olanı eşleştirmeden vurgulanan metnin üzerine yapıştırmanın bir yolunu içermelidir.

" Windows common keyboard shortcuts and pasting behavior {{{

" Uncomment to enable debugging.
" Check debug output with :messages
let s:debug_smart_cut = 0
let s:debug_smart_copy = 0
let s:debug_smart_paste = 0

function! SmartCut()
    execute 'normal! gv"+c'

    if visualmode() != "\<C-v>" " 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

    if exists("s:debug_smart_cut") && s:debug_smart_cut
        echomsg "SmartCut '+' buffer: " . @+
    endif
endfunction

function! SmartCopy()
    execute 'normal! gv"+y'

    if visualmode() != "\<C-v>" " 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

    if exists("s:debug_smart_copy") && s:debug_smart_copy
        echomsg "SmartCopy '+' buffer: " . @+
    endif
endfunction

" Delete to black hole register before pasting. This function is a smarter version of "_d"+P or "_dp to handle special cases better.
" SOURCE: http://stackoverflow.com/questions/12625722/vim-toggling-buffer-overwrite-behavior-when-deleting
function! SmartPaste()
    let mode = 'gv'

    let delete = '"_d'

    let reg = '"+'

    " See :help '> for more information. Hint: if you select some text and press ':' you will see :'<,'>
    " SOURCE: http://superuser.com/questions/723621/how-can-i-check-if-the-cursor-is-at-the-end-of-a-line
    " SOURCE: http://stackoverflow.com/questions/7262536/vim-count-lines-in-selected-range
    " SOURCE: https://git.zug.fr/config/vim/blob/master/init.vim
    " SOURCE: https://git.zug.fr/config/vim/blob/master/after/plugin/zzzmappings.vim
    let currentColumn = col(".")
    let currentLine = line(".")
    let lastVisibleLetterColumn = col("$") - 1
    let lastLineOfBuffer = line("$")
    let selectionEndLine = line("'>")
    let selectionEndLineLength = len(getline(selectionEndLine))
    let nextLineLength = len(getline(currentLine + 1))
    let selectionStartColumn = col("'<")
    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 exists("s:debug_smart_paste") && s:debug_smart_paste
            echomsg "SmartPaste special case #1"
        endif

    " If attempting to paste on a blank last line
    elseif selectionEndLineLength == 0 && selectionEndLine == lastLineOfBuffer
        let cmd = 'P'

        if exists("s:debug_smart_paste") && s:debug_smart_paste
            echomsg "SmartPaste special case #2"
        endif

    " 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 exists("s:debug_smart_paste") && s:debug_smart_paste
            echomsg "SmartPaste special case #3"
        endif

    " 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
        " SOURCE:  http://vim.wikia.com/wiki/Quickly_adding_and_deleting_empty_lines

        " Fixes bug where if the last line is fully selected (Shift + V) and a paste occurs, that the paste appears to insert after the first character of the line above it because the delete operation [which occurs before the paste]
        " is causing the caret to go up a line, and then 'p' cmd causes the paste to occur after the caret, thereby pasting after the first letter of that line.
        " However this but does not occur if there's a blank line underneath the selected line, prior to deleting it, as the cursor goes down after the delete in that situation.
        call append(selectionEndLine, "")

        let cmd = 'p'

        if exists("s:debug_smart_paste") && s:debug_smart_paste
            echomsg "SmartPaste special case #4"
        endif

    else
        let cmd = 'p'

        if exists("s:debug_smart_paste") && s:debug_smart_paste
            echomsg "SmartPaste default case"
        endif
    endif

    if exists("s:debug_smart_paste") && s:debug_smart_paste
        echomsg "SmartPaste debug info:"
        echomsg "    currentColumn: " . currentColumn
        echomsg "    currentLine: " . currentLine
        echomsg "    lastVisibleLetterColumn: " . lastVisibleLetterColumn
        echomsg "    lastLineOfBuffer: " . lastLineOfBuffer
        echomsg "    selectionEndLine: " . selectionEndLine
        echomsg "    selectionEndLineLength: " . selectionEndLineLength
        echomsg "    nextLineLength: " . nextLineLength
        echomsg "    selectionStartColumn: " . selectionStartColumn
        echomsg "    selectionEndColumn: " . selectionEndColumn
        echomsg "    cmd: " . cmd
        echo [getpos("'<")[1:2], getpos("'>")[1:2]]
        echo "visualmode(): " . visualmode()
        echo "mode(): " . mode()
    endif

    if visualmode() != "\<C-v>" " 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

    try
        execute 'normal! ' . mode . delete . reg . cmd
    catch /E353:\ Nothing\ in\ register\ +/
    endtry

    " Move caret one position to right
    call cursor(0, col(".") + 1)
endfunction

" p or P delete to black hole register before pasting
" NOTE: <C-u> removes the '<,'> visual-selection from the command line. See :h c_CTRL-u
vnoremap <silent> p :<C-u>call SmartPaste()<CR>
vnoremap <silent> P :<C-u>call SmartPaste()<CR>

" MiddleMouse delete to black hole register before pasting
nnoremap <MiddleMouse> "+p " Changes default behavior from 'P' mode to 'p' mode for normal mode middle-mouse pasting
" NOTE: <C-u> removes the '<,'> visual-selection from the command line. See :h c_CTRL-u
vnoremap <silent> <MiddleMouse> :<C-u>call SmartPaste()<CR>
inoremap <MiddleMouse> <C-r><C-o>+

" Disable weird multi-click things you can do with middle mouse button
" SOURCE: http://vim.wikia.com/wiki/Mouse_wheel_for_scroll_only_-_disable_middle_button_paste
noremap <2-MiddleMouse> <Nop>
inoremap <2-MiddleMouse> <Nop>
noremap <3-MiddleMouse> <Nop>
inoremap <3-MiddleMouse> <Nop>
noremap <4-MiddleMouse> <Nop>
inoremap <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
    " SOURCE: https://opensource.apple.com/source/vim/vim-62.41.2/runtime/macmap.vim.auto.html
    " NOTE: Only copy and paste are possible in the command line from what i can tell.
    "       Their is no undo for text typed in the command line and you cannot paste text onto a selection of text to replace it.
    cnoremap <C-c> <C-y>
    cnoremap <C-v> <C-r>+
    " TODO: Is their a select-all for the command line???

    " Cut, copy, and paste support for visual and insert mode (not for normal mode)
    " SOURCE: http://superuser.com/questions/10588/how-to-make-cut-copy-paste-in-gvim-on-ubuntu-work-with-ctrlx-ctrlc-ctrlv
    " NOTE: <C-u> removes the '<,'> visual-selection from the command line. See :h c_CTRL-u
    vnoremap <silent> <C-x> :<C-u>call SmartCut()<CR>
    vnoremap <silent> <C-c> :<C-u>call SmartCopy()<CR>
    vnoremap <silent> <C-v> :<C-u>call SmartPaste()<CR>
    inoremap <C-v> <C-r><C-o>+

    " Select-all support for normal, visual, and insert mode
    " http://vim.wikia.com/wiki/Using_standard_editor_shortcuts_in_Vim
    nnoremap <C-a> ggVG
    vnoremap <C-a> ggVG
    inoremap <C-a> <Esc>ggVG

    " Save file support for normal, visual, and insert mode
    " SOURCE: http://vim.wikia.com/wiki/Map_Ctrl-S_to_save_current_or_new_files
    " 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
    nnoremap <silent> <C-s> :update<CR>
    " NOTE: <C-u> removes the '<,'> visual-selection from the command line. See :h c_CTRL-u
    vnoremap <silent> <C-s> :<C-u>update<CR>V
    " NOTE: <C-o> executes a normal-mode command without leaving insert mode. See :help ins-special-special
    "inoremap <silent> <C-s> <C-o>:update<CR>
    "
    " <C-o> doesn't seem to work while also using the "Open the OmniCompletion menu as you type" code while the menu is visible.
    " Doing "call feedkeys("\<C-x>\<C-o>", "n")" to perform omni completion seems to be the issue.
    " However doing "call feedkeys("\<C-x>\<C-i>", "n")" to perform keywork completion seems to work without issue.
    "
    " Workaround will exit insert mode to execute the command and then enter insert mode.
    inoremap <silent> <C-s> <Esc>:update<CR>I

    " Undo and redo support for normal, visual, and insert mode
    nnoremap <C-z> <Esc>u
    nnoremap <C-y> <Esc><C-r>

    " NOTE: <C-u> removes the '<,'> visual-selection from the command line. See :h c_CTRL-u
    vnoremap <C-z> :<C-u>uV
    vnoremap <C-y> :<C-u><C-r>V

    inoremap <C-z> <Esc>uI
    inoremap <C-y> <Esc><C-r>I

    function! Find()
        let wordUnderCursor = expand('<cword>')
        if len(wordUnderCursor) > 0
            execute 'promptfind ' . wordUnderCursor
        else
            execute 'promptfind'
        endif
    endfunction

    function! Replace()
        let wordUnderCursor = expand('<cword>')
        if len(wordUnderCursor) > 0
            execute 'promptrepl ' . wordUnderCursor
        else
            execute 'promptrepl'
        endif
    endfunction

    " Find and Find/Replace support for normal, visual, and insert mode
    nnoremap <C-f> :call Find()<CR>
    nnoremap <C-h> :call Replace()<CR>

    " NOTE: <C-u> removes the '<,'> visual-selection from the command line. See :h c_CTRL-u
    vnoremap <C-f> :<C-u>call Find()<CR>
    vnoremap <C-h> :<C-u>call Replace()<CR>

    " NOTE: <C-o> executes a normal-mode command without leaving insert mode. See :help ins-special-special
    inoremap <C-f> <C-o>:call Find()<CR>
    inoremap <C-h> <C-o>:call Replace()<CR>
endif

" }}} Windows common keyboard shortcuts and pasting behavior

-1

tl; dr - vnoremap p "_c *

İşte tam eşleşmelerimin bir listesi:
"Kayıt defterini kopyala / yapıştır
nnoremap DD düzelt " * dd
nnoremap D "* d
vnoremap D" d
nnoremap d "_d
nnoremap dd" _dd
vnoremap d "_d
nnoremap s" _s
vnoremap s "_s
nnoremap c "_c
vnoremap c" _c
nnoremap x "_x
vnoremap x" _x
vnoremap p "_c


Msgstr "" "Yeni satırın üzerine yapıştır nnoremap, p op
nnoremap, P Op

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.