Отображения оцениваются в точности так, как они напечатаны. Такие вещи, как 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 также имеет надежную и универсальную реализацию (как и многие другие связанные).