Vim具有一个内部变量textwidth
,它确定在添加<EOL>
字符将文本换行到下一行之前,屏幕上将打印多少字符。
我想创建一个映射,比如<c-j>
,我想让光标向右移动一些字符,等于textwidth
中存储的值。这将模拟当文本被包装时"向下走一行"。
我认为一个简单的方法是:
nnoremap <c-j> {textwidth}l
然而,我还没有找到一种评估textwidth
值的方法,因此它不能用作命令l
的count
。
欢迎任何帮助!
有两种方法:一种是&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>