Як поміняти місцями два рядки у 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

Відповіді:


161

Щоб поміняти поточний рядок наступним, введіть, 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
Дякуємо за пояснення для "не тутешніх" жителів :-)
Бруно Бієрі

1
Це відповідь, яку я також шукав, щоб розширити свої знання про vim.
Фемело Кето

Дякую! Це відповідь, яку я шукав. Це може стати ще зручнішим при одночасному проведенні декількох рядків за допомогою візуального режиму.
Карім Джейруді,

8

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

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

Це дозволить вам переміщати рядки з Ctrl+ Upі Ctrl+ Downу вашому файлі. Однак це призведе до перезапису @"реєстру, в якому зберігається ваш останній скопійований рядок / слово / лист / тощо. Отже, додавши "(reg) before 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 wikia , насправді є найкращим способом зіставлення комбінацій клавіш, які імітують спосіб, як Sublime та інші редактори реалізують цю функцію.

Сюди входить дія відступу після ходу, що також чудово (це подвійні ==знаки рівності , якщо ви цього не хочете).

Він також підтримує візуальні і вставку режимів, так що ви можете переміщати рядки при редагуванні або fulblocks.

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

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.