Перемещение всей линии вверх и вниз в Vim

В Notepad ++ я могу использовать Ctrl + Shift + Up/Down для перемещения текущей строки вверх и вниз. Есть ли в Vim аналогичная команда? Я просмотрел бесконечные гиды, но ничего не нашел.

Если этого не происходит, как я могу связать действие с этой комбинацией клавиш?

Изменить: ответ Миколы работает для всех строк, кроме тех, которые находятся в начале и в конце буфера. Перемещение первой строки или нижней строки удаляет строку, а при перемещении нижней строки она сначала перепрыгивает на два пространства, как пешка! Может ли кто-нибудь предложить какие-либо уточнения?

Ответ 1

Поместите следующее на ваш .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>

Ответ 2

Если я хочу поменять одну строку на строку выше, я обычно делаю следующее

ddkP

Объяснение

  • dd удалит строку и добавит ее в регистр по умолчанию.
  • k будет двигаться вверх по линии (j будет двигаться вниз по линии)
  • P будет вставляться поверх текущей строки

Ответ 3

Предполагая, что курсор находится в строке, которую вы хотите переместить.

Перемещение вверх и вниз: :m для перемещения

:m +1 - перемещается вниз на 1 строку

:m -2 - перемещение вверх на 1 строку

(Обратите внимание, что вы можете заменить +1 на любые числа, в зависимости от того, сколько строк вы хотите переместить вверх или вниз, т.е. +2 сдвинет его на две линии, -3 переместит его на 2 строки)

Чтобы перейти к определенной строке

:set number - отобразить числовые линии (проще видеть, куда вы его перемещаете)

:m 3 - переместите строку после третьей строки (замените 3 на любую нужную строку)

Перемещение нескольких строк:

V (т.е. Shift - V) и перемещайте курсор вверх и вниз, чтобы выбрать несколько строк в VIM

после выбранного удара : и выполните приведенные выше команды, m +1 и т.д.

Ответ 4

Переместите строку вверх: ddkP

Переместите строку вниз: ddp

Ответ 5

Это сработало для меня:

http://vim.wikia.com/wiki/Moving_lines_up_or_down_in_a_file

Кстати, если вы хотите использовать 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, Esc в Vim (C+q, Esc в Windows).

Ответ 6

В командном режиме установите курсор на строку, которую вы хотите переместить вниз, а затем

ddp

Объяснение: dd удаляет текущую строку в общий буфер p ставит его назад ПОСЛЕ положения курсора или в случае целых строк, одна строка ниже.

Существует некоторая путаница в отношении команд p и P во многих документах. В действительности p вставляет ПОСЛЕ курсора и курсор P AT.

Ответ 7

добавьте следующее в файл ~/.vimrc(убедитесь, что у вас нет сопоставления для n, m)

nmap n :m +1<CR>
nmap m :m -2<CR>

теперь нажатие клавиши n переместит строку вниз, а m переместит линию вверх.

Ответ 8

Просто добавьте этот код в .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

Ответ 10

Вот упрощенная версия для MacVim, использующая примеры статей Wikia (см. ссылку из комментария к пистолету).

" 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, для Windows попробуйте "C" (Control) или "A" (Alt) (например, < C-A-f > будет 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.

Здесь переключение Tab для MacVim (добавьте в .gvimrc с остальным выше):

:macm Window.Select\ Previous\ Tab key=<D-S-Left>
:macm Window.Select\ Next\ Tab key=<D-S-Right>

Ответ 11

В конце моего .vimrc файла я поставил следующее:

noremap H ddkkp
noremap N ddp

Итак, теперь "H" и "N" перемещают текущую линию вверх и вниз соответственно.

Ответ 12

A простое решение состоит в том, чтобы вставить .vimrc следующие строки:

nmap <C-UP> :m-2<CR>  
nmap <C-DOWN> :m+1<CR>

Ответ 13

: m. + 1 или: m.-2, если вы перемещаете одну строку. Здесь my script для перемещения нескольких строк. В визуальном режиме Alt-up/Alt-down будет перемещать строки, содержащие визуальный выбор вверх/вниз, на одну строку. В режиме вставки или в обычном режиме Alt-up/Alt-down перемещает текущую строку, если префикс счетчика не задан. Если есть префикс count, 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

Ответ 14

В обычном режиме вы можете нажать: Shift + j

Ответ 15

vim plugin unimpaired.vim [e и] e

Ответ 16

Режим VIM в Sublime Text 2

Не VIM, но я нашел здесь способ сделать это в Vintage Mode ST2, поэтому он может быть полезен другим.

Для тех, кто использует Sublime Text 2, вы можете использовать...

Control + Command + Up/Down

... для перемещения строки вверх или вниз соответственно.