当移动多行时(例如 `5j`),按行号移动光标;当移动单行时(例如 `j`),按显示行移动光标

当移动多行时(例如 `5j`),按行号移动光标;当移动单行时(例如 `j`),按显示行移动光标

在 Vim 中,我进行了以下设置以使行右侧软换行不均匀:

set linebreak
set wrap

当一次遍历多行时,一个令人讨厌的副作用是它5j不会将光标向下移动 5 行,而是会将其向下移动 5 个显示行。如果我有一行被软换行成 6 行,如果我的光标在第一行并且我输入,5j我不会向下移动 5 个实际行,而是移动到当前行的底部,向下移动 5 个显示行。

我怎样才能停止这种行为,以便j将光标向下移动 1 个显示行(软换行或其他),同时5j将光标向下移动 5 个实际行?

答案1

默认情况下,jk移动总是沿着物理线而不是屏幕线移动。所以我认为你nmap j gj的 .vimrc 中一定有一个类似的地图。

对于您想要的行为,我的 .vimrc 中有以下内容:

" Map j and k to gj/gk, but only when no count is given
" However, for larger jumps like 6j add the current position to the jump list
" so that you can use <c-o>/<c-i> to jump to the previous position
nnoremap <expr> j v:count ? (v:count > 5 ? "m'" . v:count : '') . 'j' : 'gj'
nnoremap <expr> k v:count ? (v:count > 5 ? "m'" . v:count : '') . 'k' : 'gk'

相关内容