Как я могу легко переместить линию?

48

Что такое команда (или ярлык) для перемещения строки вверх или вниз в vim? Мой текущий рабочий процесс состоит в том, чтобы выдернуть (скопировать) строку и затем удалить эту строку, а затем поставить (вставить) эту строку.

Вейдер
источник
8
Так как удаление фактически порезы, вы можете пропустить рывок: ddkP, двигаясь вниз проще: ddp.
Муру
См. Также: vi.stackexchange.com/questions/598/…
Рич

Ответы:

52

Во-первых, вам не нужно дергать и удалять; последний также помещает удаленное содержимое в регистр (по умолчанию или указанный). Поэтому ddp/ ddkP- это общие команды для перемещения на одну строку вверх / вниз.

В качестве альтернативы вы можете использовать :moveкоманду, т.е. :move +1/ :move -2; это не загромождает регистр, и вы также можете перемещать целые диапазоны. Вы можете легко определить сопоставления клавиш, чтобы сократить это.

Если вы не возражаете плагинов (и дополнительный комфорт , который часто приходит с ними), и Тим папы незатронутым плагин и мой плагин LineJuggler обеспечивают ]e/ [eотображения для перемещения строк (и еще несколько, Тим для различных целей, мое внимание на обработке линии (ы)).

Инго Каркат
источник
36

Самый простой из них: :m+или :m-2это аббревиатура, :moveкак предложил Инго.

Или используя визуальный режим ( V), обрезав линию ( d/ x), затем вставьте ее ( p- под курсором, Pнад курсором) после перемещения курсора в нужное место перед вставкой (так что в итоге это Vxp/ Vdp).

При перемещении нескольких строк в визуальном режиме вам необходимо использовать :m '>+1(для перемещения на одну строку вниз) или :m '<-2(для перемещения на одну строку вверх).


Вот пример полезного отображения ( Shift+ ↑/ Shift+↓):

nnoremap <S-Up> :m-2<CR>
nnoremap <S-Down> :m+<CR>
inoremap <S-Up> <Esc>:m-2<CR>
inoremap <S-Down> <Esc>:m+<CR>

который похож на Sublime Text ( Win / OSX ).

Вот некоторые из предложенных на vim wikia :

nnoremap <A-j> :m .+1<CR>==
nnoremap <A-k> :m .-2<CR>==
inoremap <A-j> <Esc>:m .+1<CR>==gi
inoremap <A-k> <Esc>:m .-2<CR>==gi
vnoremap <A-j> :m '>+1<CR>gv=gv
vnoremap <A-k> :m '<-2<CR>gv=gv

В обычном режиме или в режиме вставки нажмите Alt-j, чтобы переместить текущую строку вниз, или нажмите Alt-k, чтобы переместить текущую строку вверх.

После визуального выбора блока линий (например, нажав V, затем переместив курсор вниз), нажмите Alt-j, чтобы переместить весь блок вниз, или нажмите Alt-k, чтобы переместить блок вверх.

Смотрите также:

kenorb
источник
2
+1 для ссылки Vim викия. Узнал несколько вещей там.
Гонсалу Рибейру
Не знаю почему, но они работают очень хорошо в Gvim, но не работают должным образом в Terminal Vim. (Кажется, это проблема tmux)
CodyChan
12

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

ddkP

объяснение

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

FWIW, вот то, что я использовал в течение многих лет. Он перемещает текущую строку вверх и вниз в обычном режиме или выделение в визуальном режиме, одновременно настраивая отступ.

nnoremap ,<Up>   :<C-u>silent! move-2<CR>==
nnoremap ,<Down> :<C-u>silent! move+<CR>==
xnoremap ,<Up>   :<C-u>silent! '<,'>move-2<CR>gv=gv
xnoremap ,<Down> :<C-u>silent! '<,'>move'>+<CR>gv=gv
romainl
источник