development

Vim에서 전체 라인을 위아래로 이동

big-blog 2020. 3. 15. 09:37
반응형

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

반응형