Vim键映射,用于移动与"textwidth"内部变量中包含的值一样多的字符



Vim具有一个内部变量textwidth,它确定在添加<EOL>字符将文本换行到下一行之前,屏幕上将打印多少字符。

我想创建一个映射,比如<c-j>,我想让光标向右移动一些字符,等于textwidth中存储的值。这将模拟当文本被包装时"向下走一行"。

我认为一个简单的方法是:

nnoremap <c-j> {textwidth}l

然而,我还没有找到一种评估textwidth值的方法,因此它不能用作命令lcount

欢迎任何帮助!

有两种方法:一种是&textwidth的插值(&sigil将选项名称变成一个包含其值的变量;cp.:help :let-option),如@RuslanOsmanov的回答:

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'等选项,这些选项会进一步减少实际显示的字符数量),否则建议只使用(并可能重新映射)内置程序。

您可以通过在选项值的名称前加一个"与"来引用它,例如&textwidth

向右移动&textwidth字符可以运行如下:

:execute "normal!" &textwidth 'l'

其中自变量("normal!"&textwidth'l')与空格连接,并作为Ex命令执行。

所以你的地图可能看起来像这样:

:nnoremap <silent> <c-j> :execute "normal!" &textwidth 'l'<cr>

最新更新