이것은 중복이 아닙니다vi에서 줄 삭제, 다양한 질문을 합니다. 줄을 자르지 않고(클립보드에 넣기) 삭제하고 싶습니다.
행의 일부를 복사하고 한 행을 삭제한 다음 행의 해당 부분을 다른 곳에 붙여넣고 싶습니다. 전체 줄을 사용하여 v3w
붙여 dd
넣 습니다.p
답변1
당신이 찾고있는블랙홀 레지스터(:help quote_
). 삭제 명령을 추가하면 "_
내용이 사라집니다. 따라서 다음 세 단어를 제거하고 유지한 다음 전체 줄을 삭제하려면 를 사용할 수 있습니다 d3w"_dd
.
고급 도면
줄의 일부를 유지하지만 전체 줄을 제거하는 사용 사례가 일반적입니다. 이에 대한 매핑 세트를 작성했습니다.
"["x]dDD Delete the characters under the cursor until the end
" of the line and [count]-1 more lines [into register x],
" and delete the remainder of the line (i.e. the
" characters before the cursor) and possibly following
" empty line(s) without affecting a register.
"["x]dD{motion} Delete text that {motion} moves over [into register x]
" and delete the remainder of the line(s) and possibly
" following empty line(s) without affecting a register.
"{Visual}["x],dD Delete the highlighted text [into register x] and delete
" the remainder of the selected line(s) and possibly
" following empty line(s) without affecting a register.
function! s:DeleteCurrentAndFollowingEmptyLines()
let l:currentLnum = line('.')
let l:cnt = 1
while l:currentLnum + l:cnt < line('$') && getline(l:currentLnum + l:cnt) =~# '^\s*$'
let l:cnt += 1
endwhile
return '"_' . l:cnt . 'dd'
endfunction
nnoremap <expr> <SID>(DeleteCurrentAndFollowingEmptyLines) <SID>DeleteCurrentAndFollowingEmptyLines()
nnoremap <script> dDD D<SID>(DeleteCurrentAndFollowingEmptyLines)
xnoremap <script> ,dD d<SID>(DeleteCurrentAndFollowingEmptyLines)
function! s:DeleteCurrentAndFollowingEmptyLinesOperatorExpression()
set opfunc=DeleteCurrentAndFollowingEmptyLinesOperator
let l:keys = 'g@'
if ! &l:modifiable || &l:readonly
" Probe for "Cannot make changes" error and readonly warning via a no-op
" dummy modification.
" In the case of a nomodifiable buffer, Vim will abort the normal mode
" command chain, discard the g@, and thus not invoke the operatorfunc.
let l:keys = ":call setline('.', getline('.'))\<CR>" . l:keys
endif
return l:keys
endfunction
function! DeleteCurrentAndFollowingEmptyLinesOperator( type )
try
" Note: Need to use an "inclusive" selection to make `] include the last
" moved-over character.
let l:save_selection = &selection
set selection=inclusive
execute 'silent normal! g`[' . (a:type ==# 'line' ? 'V' : 'v') . 'g`]"' . v:register . 'y'
execute 'normal!' s:DeleteCurrentAndFollowingEmptyLines()
finally
if exists('l:save_selection')
let &selection = l:save_selection
endif
endtry
endfunction
nnoremap <expr> dD <SID>DeleteCurrentAndFollowingEmptyLinesOperatorExpression()
답변2
명명된 버퍼에서 사용하려는 부분을 복사하여 거기에서 붙여넣을 수 있습니다. 예를 들면 다음과 같습니다.
"ay3w
그러면 명명된 버퍼 a에서 3개의 단어가 추출됩니다.
"ap
나중에 명명된 버퍼에서 붙여넣을 것입니다. 먼저 3개 단어를 삭제한 다음 모든 줄을 삭제하고 붙여넣을 수도 있습니다.
"2p
이것은 삭제 버퍼에서 마지막으로 삭제된 두 번째 항목을 붙여넣습니다. 이는 VIM 플래그 문제이므로 주석 제안을 따릅니다. 이 문제에 대한 기본 VIM 솔루션이 있습니다(Vi에서는 작동하지 않음).
y3w then in new place "0p
VIM에는 마지막 복사본을 0 레지스트리에 보관하는 기본 기능이 있습니다.