Швидший спосіб переміщення блоку тексту


25

Ось як я зазвичай копіюю текст або код:

  1. Виберіть блок у режимі Visual ( V) та видаліть його d; або якщо це лише один рядок, просто використовуйте dd.
  2. Перейдіть туди, де я хочу, щоб текст був, я занадто дурний, щоб пам’ятати різницю між pі P, тому я розумію це близько 50% часу. (якщо я помиляюсь: скасуйте спробу знову).
  3. Іноді відступ потребує коригування, тому я Vзнову переходжу в режим «Візуальний» і вибираю той самий блок, і використовую >або <виправляю це.

Чи є простіший спосіб? У деяких редакторах я бачив, що ви можете «підібрати» текст тексту як би і перемістити його; ось приклад від Emacs (але я це бачив і в інших редакторах):

Emacs

А може, є ще один (ще кращий) спосіб?


Про проблему відступу ви можете вирішити, вставивши з ]pабо [pзамість pабо P. Таким чином блок, який ви вставляєте, буде автоіндексованим.
Гонсало Рібейро,

Можливо, ви захочете переглянути ефір екрану за текстом Drew Neil Bubbling Text, який рекомендує використовувати vim-unmapaired .
Хоцке

Відповіді:


13

Для цього є плагін: dragvisuals.vim .

Він не прив'язує жодних клавіш за замовчуванням, тому вам доведеться робити це самостійно. Мені подобається відображати їх у Control+ Arrow key:

xmap <expr> <C-Left> DVB_Drag('left')
xmap <expr> <C-Right> DVB_Drag('right')
xmap <expr> <C-Down> DVB_Drag('down')
xmap <expr> <C-Up> DVB_Drag('up')

Він також постачається з бонусним ключем для дублювання поточного вибору:

xmap <expr> D DVB_Duplicate()

Переваги цього плагіна перед іншими відповідями:

  • Не зникає жоден текст, якщо ви намагаєтесь рухатись далі, ніж перший рядок.
  • Він розширить файл, якщо переміститися нижче останнього рядка.
  • Переміщення вліво / вправо працює трохи краще.

Ще одним корисним трюком для доповнення до цього є такі ключові зв’язки:

xnoremap > >gv
xnoremap < <gv

Після повторного вибору візуального вибору після використання >у візуальному режимі ви зможете легше налаштувати вирівнювання (ви також можете використовувати клавіші зі стрілками, але це перемістить його одним символом, а не одним shiftwidth).


1
Для цього є ще один плагін, який автор мого запропонованого плагіна описує як "значно покращену переробку мого власного dragvisuals.vim": github.com/zirrostig/vim-schlepp
Джей Томпсон,

8

Для кроку 3 можна скористатися gv=замість цього ( =означає відступ та gvозначає "повторний вибір останнього візуального вибору").

Для поведінки Emacs було б досить просто додати кілька відображень у свій .vimrc:

vnoremap <down> dpV`]
vnoremap <up> dkPV`]

Потім ви можете використовувати клавіші зі стрілками вгору та вниз для переміщення по візуальному вибору лінії. (Звичайно, ви також можете зіставити різні клавіші, якщо ненавидите стрілки.)

(Ви можете це зробити за допомогою звичайних візуальних виділень і переміщення їх також вліво та вправо: vnoremap <left> dhPgvhohoі vnoremap <right> dpgvlolo.)


gvпереходить до останнього візуального відбору, який у цьому випадку буде абзацом, який було видалено. Що я пропускаю?
Роберт Сміт

4

Можна переміщувати деякі клавіші для переміщення ліній. Наприклад, стрілки вгору і вниз, якщо ви звикли пересуватися по всьому hjkl.

Наприклад, на .vimrc

nnoremap <down> :m .+1<CR>==
nnoremap <up> :m .-2<CR>==
vnoremap <down> :m '>+1<CR>gv=gv
vnoremap <up> :m '<-2<CR>gv=gv

:m, звичайна команда для переміщення рядка

+1або -2для позначення лінії вгору або вниз (-1 зберігає лінію на тому самому місці)

gvщоб знову вибрати той самий текст у VISUALрежимі

Це рішення не заважає регістрам, тому будь-який скопійований текст все ще буде доступний, а також переформатуйте код для встановлення належного відступу тощо.


Це приємно, але не для мене, оскільки я не люблю використовувати =(це часто змінює занадто непов'язане для мене форматування).
Martin Tournoij

4

Найпростіший спосіб, який я знайшов це зробити, задокументований тут: http://vimrcfu.com/snippet/77

Помістіть у своєму .vimrc наступне

vnoremap J :m '>+1<CR>gv=gv
vnoremap K :m '<-2<CR>gv=gv



3

Є кілька плагінів для цього , але я віддаю перевагу Тіма тата ВІМ-незачепленим ( GitHub ) (Ingo Karkat LineJuggler аналогічно).

Ви візуально вибираєте блок тексту, а потім виконайте ]e(e для обміну), щоб перемістити блок вниз ( [eдля іншого напрямку). Використовуйте .для повторення дії (у вас інстальований повтор.вім, чи не так). Якщо ви зайшли занадто далеко, тоді просто скасуйте u.

Зараз особисто я думаю pі Pє такими загальними командами, що найкраще було б навчитися їх, перш ніж створювати шкідливі звички. Потім можна використовувати ]pдля вклеювання в один і той же відступ. Якщо ви користуєтесь непереробленими, ви можете зробити, >pщоб вставити рівень відступу глибше або =pвставити та переформатувати.

Якщо у вас є проблеми згадування pі Pто це може допомогти вам думати про них з точки зору oі Oкоманд, є свого роду симетрії.

Як зазначають інші, ви можете скористатися gvдля вибору візуального вибору. Однак якщо ви просто помістили / вставили текст, ви втратили візуальний вибір. Не хвилюйтесь, оскільки кожна зміна (і янки!) Встановить '[і ']навколо зміненої області. Таким чином, ви можете зробити відступ через >'](читання: зсув праворуч до кінця останньої зміни) і використовувати .для повторення відступу, поки текст не знайдеться в потрібному місці.

Докладнішу інформацію див.

:h p
:h P
:h ]p
:h o
:h O
:h .
:h u
:h >
:h ']
:h gv

2

Якщо ви знаєте номер рядка, до якого потрібно перемістити блок тексту, тоді ви можете використовувати діапазон або візуальний вибір за допомогою :moveкоманди, щоб перемістити блок туди.

Наприклад, якщо у мене є такий файл:

1 aaa
2 bbb
3 ccc
4 ddd

і я хочу перемістити рядок a до рядка c, я кладу курсор на рядок a і вводить :m3, а лінія потім зміщується.

Це також працює з +/- компенсаціями. У наведеному вище прикладі такий же результат можна досягти і :m+2для переміщення лінії 2 лінії вниз.

Для текстових блоків єдина відмінність - додавання в діапазоні чи виділенні. Щоб перемістити рядки aaa та bbb до кінця файлу, використовуйте команду типу :1,2m$($ = останній рядок) або візуально виберіть рядки та :m$.


1
Для отримання додаткових порад :moveдив. Також vim.wikia.com/wiki/Moving_lines_up_or_down або Пораду 29 Дублікат або переміщення ліній за допомогою команд ': t' і ': m' у книзі « Практичний Vim» від D. Neil.
Хоцке

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