したがって、私は通常、あるテキストを別の場所にコピーしているときに、新しいテキストが貼り付けられている古いテキストを上書きしていることに気づきます。
blah1
newtext
blah2
wrong1
blah3
wrong2
blah4
newtext
とy
ankを視覚的にマークするとします。次に、wrong1
(必ずしもWordだけでなく、何でもかまいません)を選択し、p
_newtext
を貼り付けます。ただし、wrong2
で同じことを行うと、newtext
ではなくwrong1
に置き換えられます。
では、バッファにあるテキストが現在上書きしているテキストと入れ替わらないようにするにはどうすればよいですか?
私はreigisterの提案をかなり気に入っていますが(:dis
コマンドを見つけたので、レジスターをさらに使い始めると思います)、 jinfield の答えを変更します。スワッピングモードは使用していません。
vnoremap p "0p
vnoremap P "0P
vnoremap y "0y
vnoremap d "0d
トリックを完璧に行います。
速すぎた。 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個です(各文字に1つ)。名前付きバッファにアクセスするには、二重引用符と文字を使用します。例:
"dyy
-現在の行をバッファdにヤンクします。"a7yy
-次の7行をバッファaにヤンクします。"dP
-バッファdの内容をカーソルの前に置きます。"ap
-バッファの内容をカーソルの後に置きます
小文字の代わりに大文字を使用する場合のもう1つのクールなこと、つまり"Dyy
現在の行は、バッファーdを置き換えるのではなく、バッファーdに追加されます。 O`Reillyブックの詳細: http://docstore.mik.ua/orelly/unix/vi/ch04_03.htm
ビジュアルモードでput
を使用すると、置換するテキストwrong1
は、「未対応」のレジスタの内容で上書きされます。
これは実際には、選択後にレジスタを「配置」してから選択を削除することで機能します。問題は、この削除がunnamed
レジスタに保存され、次のput
アクションに使用されることです。
:h v_p
による解決策は、"0y
などの名前付きレジスターにヤンクし、"0p
を使用して必要なだけ貼り付けます。これが頻繁に実行するものである場合、名前付きレジスタを使用するように<leader>y
および<leader>p
をマップすると役立つ場合があります。
:map <leader>y "0y
:map <leader>p "0p
詳細については、以下を参照してください。
:help v_p
:help map
"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<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".
名前のないレジスタ*にテキストをヤンクすると、コピーもレジスタ0に入れられます。選択したテキストを置き換えるたびに、0レジスタから貼り付けることができます。見る
:help registers
さらに、複数の単語を同じ単語で置き換える場合は、置き換える単語の先頭に移動して.
と入力します。最後の編集操作が繰り返されます。見る
:help single-repeat
*ヤンクしたり、そこから入れたりする保管場所は、レジスターと呼ばれます。バッファは編集するもので、通常はディスクからのファイルのコピーです。
vnoremap p "_dP
(私もx
またはc
を試しました)のような行の開始と終了に問題があるため、これを行うことになりました:vnoremap p :<C-U>let @p = @+<CR>gvp:let @+ = @p<CR>
thisは、既存のプラグイン(そのままではset clipboard=unnamedplus
でも機能しませんでした)。だからそれは何ですか:
C-U
)+
レジスター(unnamedplusにより、選択肢は"
および*
は構成によって異なります)からp
私はこれが頻繁に必要なので、そのためのプラグインを作成しました: ReplaceWithRegister 。
このプラグインは、{motion}、行全体、または現在の選択によってカバーされるテキストをレジスターの内容で置き換える2つのインgr
コマンドを提供します。古いテキストがブラックホールレジスタに削除されます。つまり、テキストは消えます。
多くの場合、以下が機能する可能性があります。 c+CtrlR++Esc。
あなたがする必要があるかもしれません
:set paste
自動インデントを禁止する前に。
これは、Windowsスタイルのコントロール+ Xカット/コントロール+ Cコピー/コントロール+ Vペースト/コントロール+ S保存/コントロール+ F検索/コントロール+ H置換の動作に使用するものです(文字どおり.vimrcからコピーされます)。
Smartpaste()関数には、目的のものが含まれている必要があります。つまり、選択されたものを同時にヤンクせずに、強調表示されたテキストの上に貼り付ける方法です。
" 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