Как использовать v: count в Vim для переключения строк с n строк? - PullRequest
0 голосов
/ 02 сентября 2018

Я хотел бы создать отображение в vim, которое будет переключать текущую строку на линию, которая находится на расстоянии n строк.

Пока у меня есть что-то вроде этого:

:nnoremap gl:<C-U> dd{v:count1}jO<Esc>pjdd{v:count1}o<Esc>p

Но это не работает. Как я могу использовать переменную v: count в этом контексте?

1 Ответ

0 голосов
/ 03 сентября 2018

Отображения оцениваются в точности так, как они напечатаны. Такие вещи, как v:count, являются специальными переменными Vimscript, поэтому его значение нужно каким-то образом интерполировать в ключи правой части. С отображениями есть две возможности:

выполнить

С помощью :execute вы можете выйти из обычного режима (запущенного :nnoremap) в режим Ex и собрать команду; вам нужно :normal!, чтобы запустить команды нормального режима, которые ранее были просто помещены в правую часть. Поскольку Vim автоматически переводит любые значения [count], заданные для сопоставления, в диапазон Ex, необходимо <C-u>, чтобы очистить это.

nnoremap <silent> gl :<C-u>execute 'normal! yyma' . v:count1 . "jVp'aVp"<CR>

карта-выр

Модификатор <expr> добавляет слой косвенности к отображениям: правая часть вычисляется, и в качестве команд для выполнения принимается только результат. Здесь схожее осложнение с [count]; предыдущая команда <Esc> отменяет ее (поэтому вы можете извлечь только одну строку).

nnoremap <expr> gl '<Esc>yyma' . v:count1 . "jVp'aVp"

ваша реализация

Полагаю, вы выбрали gl в качестве левой стороны, а :<C-U> - это попытка сбежать, как я сделал с моим первым заходом. Там отсутствует пробел, отделяющий левую сторону от правой, и :normal тоже.

Я внес следующие изменения в реализацию:

  • Удаление и вставка рядом с ним усложняет подсчет; вместо этого я использовал вставку поверх визуального выделения (Vp); это автоматически помещает удаленный текст в безымянный регистр (так что его можно использовать повторно для второй части свопа).
  • Вместо того, чтобы использовать счетчик второй раз для возврата назад, я установил отметку (ma) для простоты. Для этого вы также можете использовать список переходов (<C-o>).

другие реализации

Для простых перестановок вашей реализации может быть достаточно, но она далека от совершенства. Может возникнуть желание поменять несколько (например, визуально выбранных) строк, повторить обмен в другом месте с помощью . и проверить, что линия назначения действительно существует.

Плагин unimpaired.vim имеет сопоставление подкачки [e. Мой плагин LineJuggler также имеет надежную и универсальную реализацию (как и многие другие связанные).

...