Vim에서 전체 라인을 위아래로 이동
메모장 ++에서는 Ctrl+ Shift+ Up/ Down를 사용 하여 현재 줄을 위아래로 이동할 수 있습니다 . Vim에서도 이와 비슷한 명령이 있습니까? 나는 끝없는 가이드를 보았지만 아무것도 찾지 못했습니다.
없는 경우 해당 키 조합에 작업을 어떻게 바인딩 할 수 있습니까?
편집 : Mykola의 대답은 버퍼의 시작과 끝을 제외한 모든 줄에 적용됩니다. 첫 번째 줄을 위로 올리거나 맨 아래 줄을 아래로 내리면 줄이 삭제되고 맨 아래 줄을 위로 올리면 처음에 폰처럼 두 칸씩 점프합니다! 누구나 개선을 제안 할 수 있습니까?
.vimrc에 다음을 넣어 작업을 수행하십시오.
noremap <c-s-up> :call feedkeys( line('.')==1 ? '' : 'ddkP' )<CR>
noremap <c-s-down> ddp
줄이 사라지면 Vim 버그처럼 보입니다. 나는 그것을 피하기 위해 핵을 두었다. 아마도 더 정확한 해결책이있을 것입니다.
최신 정보
Vim 조합 만 사용하면 설명 할 수없는 어려움이 많이 있습니다. 이것들은 라인이 누락되고 여분의 라인 점프입니다.
.vimrc 또는 ~ / .vim / plugin / swap_lines.vim 안에 배치 할 수있는 스크립팅 솔루션은 다음과 같습니다.
function! s:swap_lines(n1, n2)
let line1 = getline(a:n1)
let line2 = getline(a:n2)
call setline(a:n1, line2)
call setline(a:n2, line1)
endfunction
function! s:swap_up()
let n = line('.')
if n == 1
return
endif
call s:swap_lines(n, n - 1)
exec n - 1
endfunction
function! s:swap_down()
let n = line('.')
if n == line('$')
return
endif
call s:swap_lines(n, n + 1)
exec n + 1
endfunction
noremap <silent> <c-s-up> :call <SID>swap_up()<CR>
noremap <silent> <c-s-down> :call <SID>swap_down()<CR>
한 줄을 위의 줄로 바꾸려면 일반적으로 다음을 수행하십시오.
ddkP
설명
- dd는 행을 삭제하고 기본 레지스터에 추가합니다.
- k는 한 줄 위로 이동합니다 (j는 줄 아래로 이동합니다)
- P는 현재 줄 위에 붙여 넣습니다.
커서가 이동하려는 행에 있다고 가정합니다.
위아래 :m
로 이동 : 이동
:m +1
-한 줄 아래로 이동
:m -2
-한 줄 위로 이동
(위로 또는 아래로 이동하려는 행 수에 따라 +1을 임의의 숫자로 바꿀 수 있습니다. 즉, +2는 2 행 아래로 이동하고, -3은 2 행 위로 이동합니다)
특정 줄로 이동
:set number
-번호 줄 표시 (이동하는 위치를 쉽게 볼 수 있음)
:m 3
-세 번째 줄 다음으로 줄을 이동하십시오 (3을 원하는 줄로 바꾸십시오)
여러 줄 이동 :
V
(예 Shift- V) 상하 이동 준마는 VIM에서 여러 행을 선택합니다
히트를 선택하면 :위의 명령을 실행 m +1
등
줄을 위로 이동하십시오. ddkP
줄을 아래로 이동하십시오. ddp
이것은 나를 위해 일했다 :
http://vim.wikia.com/wiki/Moving_lines_up_or_down_in_a_file
BTW, ALT + some_key를 사용하고 터미널 (urxvt 가이 작업을 수행하지 않음)을 거부하려면 .vimrc에 다음과 같이 입력해야합니다.
" For moving lines (^] is a special character; use <M-k> and <M-j> if it works)
nnoremap ^]k mz:m-2<CR>`z==
inoremap ^]j <Esc>:m+<CR>==gi
inoremap ^]k <Esc>:m-2<CR>==gi
vnoremap ^]j :m'>+<CR>gv=`<my`>mzgv`yo`z
nnoremap ^]j mz:m+<CR>`z==
vnoremap ^]k :m'<-2<CR>gv=`>my`<mzgv`yo`z
여기서 ^]는 ALT 키를 나타내는 단일 문자 입니다. 해당 문자를 입력하려면 C+v, EscVim 에서 사용하십시오 ( C+q, EscWindows).
명령 모드에서 아래로 이동하려는 줄에 커서를 놓은 다음
ddp
설명 : dd는 현재 행을 일반 버퍼로 삭제합니다. p는 커서 위치 다음에 또는 전체 행의 경우 한 행 아래에 다시 넣습니다.
많은 문서에서 명령 p 및 P와 관련하여 약간의 혼동이 있습니다. 실제로 p는 AFTER 커서와 P AT 커서를 붙여 넣습니다.
~ / .vimrc 파일에 다음을 추가하십시오 (n, m에 대한 매핑이 없는지 확인하십시오)
nmap n :m +1<CR>
nmap m :m -2<CR>
이제 n
키를 누르면 줄이 아래 m
로 이동하고 줄이 위로 이동합니다.
이 코드를 .vimrc (또는 .gvimrc)에 추가하십시오.
nnoremap <A-j> :m+<CR>==
nnoremap <A-k> :m-2<CR>==
inoremap <A-j> <Esc>:m+<CR>==gi
inoremap <A-k> <Esc>:m-2<CR>==gi
vnoremap <A-j> :m'>+<CR>gv=gv
vnoremap <A-k> :m-2<CR>gv=gv
이 멋진 플러그인에서 정확히 찾고있는 것 : https://github.com/vim-scripts/upAndDown
간단한 해결책은 당신에 넣어하는 것입니다 .vimrc
이 라인 :
nmap <C-UP> :m-2<CR>
nmap <C-DOWN> :m+1<CR>
.vimrc 파일의 끝에 다음을 넣었습니다.
noremap H ddkkp
noremap N ddp
이제 'H'와 'N'은 각각 전류 라인을 위아래로 움직입니다.
다음은 Wikia 기사 예제를 사용하는 MacVim의 단순화 된 버전입니다 ( 총 주석의 링크 참조 ).
" Move selection up/down (add =gv to reindent after move)
:vmap <D-S-Up> :m-2<CR>gv
:vmap <D-S-Down> :m'>+<CR>gv
현재 행을 선택하는 데 Shift-V 만 사용하고 선택적으로 위 / 아래로 커서를 더 선택하여 더 많은 행을 선택하기 때문에 블록 선택 변형 만 사용하고 있습니다.
위의 단축키에 따라 Cmd-Shift-Up / Down을 누르면 블록 선택이 위 / 아래로 이동합니다. "D"는 MacVim의 Command 키입니다. Windows의 경우 "C"(Control) 또는 "A"(Alt)를 시도하십시오 (예 : <CAf>는 Control Alt f 임).
Wikia 아티클에 "= gv"를 추가하면 주변 텍스트를 기준으로 이동 후 블록의 들여 쓰기를 조정하는 효과가 있습니다. 이것은 혼란 스럽기 때문에 제거하고 선택 항목을 빠르게 들여 쓰기위한 바로 가기를 추가했습니다.
" Indent selection left/right (Cmd Shift Left/Right is used for Tab switching)
:vmap <D-A-Left> <gv
:vmap <D-A-Right> >gv
<< 및 >>로도 동일한 작업을 수행 할 수 있지만 선택 항목이 손실되므로 위의 바로 가기를 사용하면 여러 번 들여 쓰기를 할 수 있으며 선택이 유지되므로 블록을 계속 이동할 수 있습니다.
MacVim은 Cmd-Shift-Left / Right로 탭을 전환하도록 구성되어 있으므로 Cmd-Alt-Left / Right를 사용했습니다.
MacVim의 탭 전환은 다음과 같습니다 (위의 나머지 부분은 .gvimrc에 입력).
:macm Window.Select\ Previous\ Tab key=<D-S-Left>
:macm Window.Select\ Next\ Tab key=<D-S-Right>
:help move
에서 command를 누르면 vim
결과는 다음과 같습니다.
:[range]m[ove] {address} *:m* *:mo* *:move* *E134* Move the lines given by [range] to below the line given by {address}.
예 : 현재 줄을 한 줄 아래로 이동 => :m+1
.
예 : 숫자가 100 인 행을 숫자가 80 => 인 행 아래로 이동합니다 :100 m 80
.
예 : 숫자가 100 인 행을 숫자가 200 => 인 행 아래로 이동합니다 :100 m 200
.
예 : [100, 120] 내에 숫자가있는 행을 숫자 200 =>가있는 행 아래로 이동하십시오 :100,120 m 200
.
나를 위해, 대문자 P ddkkp
대신에 ddkP
작동했습니다.
vim 플러그인 unimpaired.vim [e and] e
한 줄을 이동하면 : m. + 1 또는 : m.-2가 수행합니다. 다음은 여러 줄을 이동하는 스크립트입니다. 비주얼 모드에서 Alt-up / Alt-down은 비주얼 선택을 포함하는 라인을 한 라인 씩 위 / 아래로 이동합니다. 삽입 모드 또는 일반 모드에서 카운트 접두사가 제공되지 않으면 Alt-up / Alt-down은 현재 행을 이동합니다. 카운트 접두사가 있으면 Alt-up / Alt-down은 현재 줄부터 시작하여 한 줄씩 많은 줄을 이동합니다.
function! MoveLines(offset) range
let l:col = virtcol('.')
let l:offset = str2nr(a:offset)
exe 'silent! :' . a:firstline . ',' . a:lastline . 'm'
\ . (l:offset > 0 ? a:lastline + l:offset : a:firstline + l:offset)
exe 'normal ' . l:col . '|'
endf
imap <silent> <M-up> <C-O>:call MoveLines('-2')<CR>
imap <silent> <M-down> <C-O>:call MoveLines('+1')<CR>
nmap <silent> <M-up> :call MoveLines('-2')<CR>
nmap <silent> <M-down> :call MoveLines('+1')<CR>
vmap <silent> <M-up> :call MoveLines('-2')<CR>gv
vmap <silent> <M-down> :call MoveLines('+1')<CR>gv
특정 검색과 일치하는 여러 줄에서이 작업을 수행하려는 경우 :
- 위로 :
:g/Your query/ normal ddp
또는:g/Your query/ m -1
- 아래로
:g/Your query/ normal ddp
또는:g/Your query/ m +1
내 컴퓨터에서 작동하는 솔루션은 다음과 같습니다 . VIM 8.1을 실행하는 MacBook Pro
이 명령은 버퍼의 맨 위나 맨 아래에있는 행을 삭제하지 않습니다.
Alt-J 및 Alt-K 출력의 실제 기호를 사용하면 내 환경에서 키 코드가 올바르게 매핑되지 않는 해결 방법이 있습니다.
이전 .vimrc에 이것을 던져서 당신에게 맞는지 확인하십시오.
" Maps Alt-J and Alt-K to macros for moving lines up and down
" Works for modes: Normal, Insert and Visual
nnoremap ∆ :m .+1<CR>==
nnoremap ˚ :m .-2<CR>==
inoremap ∆ <Esc>:m .+1<CR>==gi
inoremap ˚ <Esc>:m .-2<CR>==gi
vnoremap ∆ :m '>+1<CR>gv=gv
vnoremap ˚ :m '<-2<CR>gv=gv
참고 URL : https://stackoverflow.com/questions/741814/move-entire-line-up-and-down-in-vim
'development' 카테고리의 다른 글
Android Fragment 핸들 뒤로 버튼 누름 (0) | 2020.03.15 |
---|---|
node.js 해시 문자열? (0) | 2020.03.15 |
설치 스크립트가 오류와 함께 종료되었습니다 : 'x86_64-linux-gnu-gcc'명령이 종료 상태 1로 실패했습니다. (0) | 2020.03.15 |
정수가 다른 두 정수 사이에 있는지 확인 (0) | 2020.03.15 |
div가 표시 될 때 작업을 트리거하는 jQuery 이벤트 (0) | 2020.03.15 |