![当移动多行时(例如 `5j`),按行号移动光标;当移动单行时(例如 `j`),按显示行移动光标](https://linux22.com/image/1581592/%E5%BD%93%E7%A7%BB%E5%8A%A8%E5%A4%9A%E8%A1%8C%E6%97%B6%EF%BC%88%E4%BE%8B%E5%A6%82%20%605j%60%EF%BC%89%EF%BC%8C%E6%8C%89%E8%A1%8C%E5%8F%B7%E7%A7%BB%E5%8A%A8%E5%85%89%E6%A0%87%EF%BC%9B%E5%BD%93%E7%A7%BB%E5%8A%A8%E5%8D%95%E8%A1%8C%E6%97%B6%EF%BC%88%E4%BE%8B%E5%A6%82%20%60j%60%EF%BC%89%EF%BC%8C%E6%8C%89%E6%98%BE%E7%A4%BA%E8%A1%8C%E7%A7%BB%E5%8A%A8%E5%85%89%E6%A0%87.png)
在 Vim 中,我进行了以下设置以使行右侧软换行不均匀:
set linebreak
set wrap
当一次遍历多行时,一个令人讨厌的副作用是它5j
不会将光标向下移动 5 行,而是会将其向下移动 5 个显示行。如果我有一行被软换行成 6 行,如果我的光标在第一行并且我输入,5j
我不会向下移动 5 个实际行,而是移动到当前行的底部,向下移动 5 个显示行。
我怎样才能停止这种行为,以便j
将光标向下移动 1 个显示行(软换行或其他),同时5j
将光标向下移动 5 个实际行?
答案1
默认情况下,j
和k
移动总是沿着物理线而不是屏幕线移动。所以我认为你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'