Переместить всю строку вверх и вниз в Vim - PullRequest
293 голосов
/ 12 апреля 2009

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

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

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

Ответы [ 18 ]

543 голосов
/ 12 апреля 2009

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

ddkP

Объяснение

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

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

Перемещение вверх и вниз: :m за ход

:m +1 - двигается вниз на 1 строку

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

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

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

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

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

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

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

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

77 голосов
/ 12 апреля 2009

Поместите следующее в ваш .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>
70 голосов
/ 23 февраля 2012

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

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

15 голосов
/ 13 марта 2010

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

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).

12 голосов
/ 28 января 2015

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

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

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

11 голосов
/ 17 сентября 2011

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

ddp

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

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

7 голосов
/ 08 ноября 2010

Просто добавьте этот код в .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
5 голосов
/ 18 июля 2017

A простое решение состоит в том, чтобы вставить в .vimrc эти строки:

nmap <C-UP> :m-2<CR>  
nmap <C-DOWN> :m+1<CR>
5 голосов
/ 21 октября 2011

Именно то, что вы ищете в этом удивительном плагине: https://github.com/vim-scripts/upAndDown

...