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

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

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

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

Ответы [ 18 ]

2 голосов
/ 25 июля 2013

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

noremap H ddkkp
noremap N ddp

Так что теперь 'H' и 'N' перемещают текущую строку вверх и вниз соответственно.

1 голос
/ 12 июля 2010

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

" 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» - это клавиша «Command» в MacVim, для Windows попробуйте «C» (Control) или «A» (Alt) (например, будет 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>
1 голос
/ 14 октября 2018

Для меня ddkkp сделал это (вместо ddkP с прописной буквой P, что тоже сработало бы).

1 голос
/ 03 мая 2018

Когда вы нажимаете команду :help move в 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.

0 голосов
/ 24 сентября 2012

: м. + 1 или: м.-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
0 голосов
/ 31 мая 2018

Вот решение, которое работает на моей машине : MacBook Pro под управлением VIM 8.1

Эти команды не будут удалять ваши строки вверху или внизу буфера.

Использование фактических символов, которые выводят 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
0 голосов
/ 28 апреля 2018

Если вы хотите сделать это на нескольких строках, которые соответствуют определенному поиску:

  • Up: :g/Your query/ normal ddp или :g/Your query/ m -1
  • Вниз :g/Your query/ normal ddp или :g/Your query/ m +1
0 голосов
/ 18 мая 2012

плагин vim unimpaired.vim [e and] e

...