Як легко переміщувати лінію?


47

Яка команда (або ярлик) для переміщення рядка вгору чи вниз у vim? Мій поточний робочий процес полягає в тому, щоб витягнути (скопіювати) рядок і видалити цей рядок, а потім поставити (вставити) цей рядок.


8
Так як видалення фактично порізи, ви можете пропустити ривок: ddkP, рухаючись вниз простіше: ddp.
muru

Відповіді:


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, щоб перемістити блок вгору.

Дивитися також:


2
+1 для посилання Vim wikia. Вивчила кілька речей там.
Гонсало Рібейро

Не знаю чому, але вони дуже добре працюють у Gvim, але не працюють так, як очікувалося у терміналі vim. (Здається, це проблема tmux)
CodyChan

11

Якщо я хочу поміняти один рядок на рядок вище, зазвичай роблю наступне

ddkP

Пояснення

  • dd видалить рядок і додасть її до реєстру за замовчуванням.
  • k переміститься вгору по лінії (j переміститься вниз по лінії)
  • P вставить над поточним рядком

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