Как мне поменять местами две строки в vim?


94

У меня есть это:

pick 887b66f add 222 Dziewiecsil to flowers new title
pick dc331cb new name of beginning commit

И я хочу получить вот это:

pick dc331cb new name of beginning commit
pick 887b66f add 222 Dziewiecsil to flowers new title

Есть ли способ сделать это быстро с помощью сочетаний клавиш?


Вы можете рассмотреть возможность использования другого редактора, если вы не знакомы с vim. Вы можете настроить редактор для git только с помощью любого git config --global core.editor <whatever>или сразу для многих (включая git), включив export EDITOR=<whatever>в свой .bashrc.
Sven Marnach

Ответы:


160

Чтобы заменить текущую строку на следующую, введите ddpв командном режиме.

  • dd - удалить строку (в других редакторах она называется вырезать) и сохранить в регистре
  • p - вставить строку из регистра

3
Переместите курсор на первую строку, затем введите ddp. Если вы еще не находитесь в командном режиме, нажмите, Escчтобы перейти в командный режим.
Sven Marnach

32
ddудаляет текущую строку после копирования в "регистр". pкопирует («помещает») содержимое регистра в ваш буфер после текущей строки. Точно так же вы можете поменять местами два символа с помощью xpили два слова с помощью dwwP.
Кейт Томпсон

@KeithThompson, к сожалению, не так просто поменять местами два слова.
CS

@CS Вы имеете в виду тот факт, что dwwPэто не работает одинаково, если два слова находятся в конце строки? (И поменять местами последнее слово в одной строке на первое слово в следующей строке еще сложнее.)
Кейт Томпсон,

1
@KeithThompson, да, хотя я почувствовал себя немного плохо после своего комментария, потому что это буквальный крайний случай;)
CS

52

ddудаляет текущую строку, затем вы можете вставить удаленную строку с помощью p. Однако есть другой способ использования m. С помощью mвы можете перемещать строки, т.е.

:m 1 переместит текущую строку после строки 1

:m 0 переместит текущую строку наверх

:m $ переместит текущую строку вниз

В вашем примере поместите курсор в первую строку и введите :m $

Подробнее: http://vim.wikia.com/wiki/Moving_lines_up_or_down


1
Спасибо за объяснение для non vim "аборигенов" :-)
Бруно Бьери

1
Это ответ, который я также искал, чтобы расширить свои знания о vim.
Фемело Хето,

Благодарность! Это ответ, который я искал. Это может стать еще удобнее при одновременном проведении нескольких строк в визуальном режиме.
Карим Джеруди,

8

Несмотря на то , что вопрос довольно старый и помечено как ответили, я хотел бы расширить ответ, говоря , что вы можете использовать обычные команды режима, которые были предоставлены Sven Marnach с nnoremapпримерно так:

:nnoremap <C-Up> <Up>ddp<Up>
:nnoremap <C-Down> ddp

Это позволит вам перемещать строки с помощью Ctrl+ Upи Ctrl+ Downвнутри вашего файла. Однако это перезапишет @"регистр, в котором хранится ваша последняя скопированная строка / слово / буква / и т. Д. Итак, добавив "(reg) перед ddи pкоманды, мы можем исправить это:

:nnoremap <C-Up> <Up>"add"ap<Up>
:nnoremap <C-Down> "add"ap

Здесь мы добавляем "aперед удалением и вставкой команды для сохранения нашей строки в @aрегистре, поэтому ваш регистр копирования по умолчанию не будет перезаписан. Однако он может перезаписать содержимое @aрегистра (кто знает, но вы можете использовать его для чего-то важного в вашем случае использования, но этот шаг немного параноидален, вы можете пропустить его, если хотите), давайте исправим и это:

:nnoremap <silent><C-Up> :let save_a=@a<Cr><Up>"add"ap<Up>:let @a=save_a<Cr>
:nnoremap <silent><C-Down> :let save_a=@a<Cr>"add"ap:let @a=save_a<Cr>

( <silent>необходимо для предотвращения вывода наших команд в строку сообщений внизу.)

Теперь у нас есть два сопоставления, которые позволяют нам перемещать строки в файле с помощью сочетаний клавиш. Вы можете переопределить кнопки, я использую Alt+ j/ k, который был бы <A-j>и <A-k>для этих команд. Однако не все эмуляторы терминала поддерживают сопоставление клавиш Alt AFAIK.


3

Пример:

  1. one
> 2. two

с :m-2, переключатель (текущая строка - 2)

> 2. two
  1. one

с :m+1переключателем (текущая строка + 1)

  1. one
> 2. two

Вы можете нанести это на карту, если хотите.



1
Это лучший ответ, чем ответ по умолчанию
Алекс Бин Чжао,

0

Сопоставления, предлагаемые на странице викии Vim , на самом деле являются лучшим способом сопоставления комбинаций клавиш, которые имитируют то, как Sublime и другие редакторы реализуют эту функцию.

Это включает в себя действие отступа после хода, что тоже здорово (это двойные ==знаки равенства , если вы этого не хотите).

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

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

Я лично сопоставил их с моим Mac <D-J>и <D-K>на нем, а не <A-с Altключом. Таким образом я использую Cmd+ Shift+ j/ k, что кажется мне более естественным для кончиков пальцев.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.