Как использовать относительные номера строк в режиме командной строки?

16

Недавно я узнал от Practical Vim способ копирования или перемещения блока строк без необходимости перемещать курсор из текущей позиции. Это делается в режиме командной строки. например

:123,133m.  # moves lines from 123 to 133 below the cursor position.

Хотя мне это нравится, набирать длинные номера строк очень сложно, особенно если в файле слишком много строк.

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

переместите 5 строк, которые на 10 строк выше текущей строки, сюда

Короче говоря, как использовать относительные числа в режиме командной строки (аналогично обычному режиму)?

rpattabi
источник

Ответы:

23

Предполагая, что ваши строки занимают от 15 до 10 строк выше текущей, вы можете достичь того, что вы запрашивали, используя относительные номера строк:

:-10,-15m.

К сожалению, при указании обратного диапазона Vim просит вас подтвердить, действительно ли вы этого хотели. Чтобы избежать шага подтверждения, вы можете набрать silentперед вашей командой или просто указать диапазон переадресации:

:-15,-10m.

Как и следовало ожидать, +можно использовать для ссылки на строки ниже текущей.

Подробная помощь может быть найдена с:

:help cmdline-ranges
joeytwiddle
источник
1
Но я никогда не использовал эту функцию. Я делаю 15k d5j 10j P.
Joeytwiddle
Разница в том, что 15k, 5j работает в командном режиме, а объясненный в ответе - в режиме вставки. Таким образом, в зависимости от режима мы можем выбрать подходящий. Команды в режиме вставки, как правило, являются критериями выбора для запуска других команд.
Soundararajan
12

Вы можете использовать жесткие числа в вашем диапазоне:

:200,300command

Или относительные числа:

:-27,+46command

Или ручные отметки:

:'a,'bcommand

Или автоматические отметки:

:'[,'>command

Или поиски:

:?foo?,/bar/command

Или сочетания клавиш:

:.,$command

Или любую комбинацию из уловок выше:

:?foo?,+46command
:'a,$command
...
romainl
источник
3

Вы можете использовать относительную адресацию (например .-10,.+3) с любой командой Ex, ср. :help :range,

В качестве альтернативы, посмотрите на мой плагин LineJuggler ; он предоставляет несколько коротких отображений для перемещения линий или дублирования их, и все эти отображения принимают относительное смещение линии как [count].

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