Назначение клавиш Vim для перемещения на столько символов, сколько содержится во внутренней переменной `textwidth` - PullRequest
0 голосов
/ 21 января 2019

Vim имеет внутреннюю переменную textwidth, которая определяет, сколько символов будет напечатано на экране перед добавлением символа <EOL> для переноса текста на следующую строку.

Я хотел бы создатьотображение, скажем, <c-j>, для которого я бы хотел, чтобы курсор переместил количество символов в вправо , равное значению, сохраненному в textwidth.Это имитировало бы «движение вниз по строке», когда текст обернут.

Я предполагаю, что простой подход будет выглядеть следующим образом:

nnoremap <c-j> {textwidth}l

Однако я не нашелспособ оценки значения textwidth, чтобы его нельзя было использовать в качестве count для команды l.

Любая помощь приветствуется!

Ответы [ 2 ]

0 голосов
/ 21 января 2019

Существует два способа: один - интерполяция &textwidth (символ & превращает имя опции в переменную, содержащую ее значение; ср. :help :let-option), как в @ Ответ Руслана Османова:

nnoremap <silent> <C-j> :execute "normal!" &textwidth . 'l'<CR>

Другим является :help :map-expression, который автоматически оценивает правую часть сопоставления как выражение Vimscript. Я бы предпочел этот, так как он короче:

nnoremap <expr> <C-j> &textwidth . 'l'

Дальнейшие улучшения

Вы, вероятно, должны подумать, что делать, если 'textwidth' не установлено, то есть ноль. Без обработки это приведет к движению 0l, то есть к второму символу в строке. Вы можете использовать условное выражение, чтобы превратить это, например, в запрет. (Или сделайте звуковой сигнал, вернув '<Esc>' вместо '').

nnoremap <expr> <C-j> (&textwidth == 0 ? '<Esc>' : &textwidth . 'l')

Действительно нужно?

Vim имеет встроенную команду :help gj (и варианты для других направлений), которая делает нечто похожее на то, что вы пытаетесь реализовать. Если вы не пытаетесь решить особый случай (например, игнорируя такие параметры, как 'showbreak', которые еще больше уменьшают количество отображаемых символов), было бы целесообразно просто использовать (и, возможно, переназначить) встроенные модули.

0 голосов
/ 21 января 2019

Вы можете обратиться к значению параметра, поставив перед его именем префикс амперсанда, например, &textwidth.

Перемещение &textwidth символов вправо может быть выполнено следующим образом:

:execute "normal!" &textwidth 'l'

где аргументы ("normal!", &textwidth и 'l') объединяются с пробелом и выполняются как команда Ex.

Таким образом, ваше отображение может выглядеть примерно так:

:nnoremap <silent> <c-j> :execute "normal!" &textwidth 'l'<cr>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...