有什么方法可以将光标移动到当前行的中间吗? (文本行的中间位置-而不是屏幕宽度的中间位置)

我想知道是否存在类似于M的快捷方式将光标移动到屏幕中间。

编辑:在括号内添加了说明

评论

那是整行的中间还是屏幕宽度的中间?

@muru正在考虑整行的中间

您也可以将其添加到问题中吗?您希望包裹处理会发生什么?

#1 楼

我不知道有任何内置方法可以执行此操作,但是,您可以轻松地制作一个地图:

nnoremap µ :exe 'normal! '.(virtcol('$')/2).'\|'<cr>


@Ingo Karkat提出了以下可行的变体在VISUAL模式下。

noremap <expr> gM (virtcol('$') / 2) . '<Bar>'


不幸的是,它也在SELECT模式下触发。因此,我更喜欢这对夫妇:

nnoremap <expr> gM (virtcol('$') / 2) . '<Bar>'
xnoremap <expr> gM (virtcol('$') / 2) . '<Bar>'


评论


此变体也将在可视模式下正常工作:noremap gM(virtcol('$')/ 2)。 '<酒吧>'

– Ingo Karkat
15年5月13日在18:16

#2 楼

内置的gm可以做到这一点。

评论


请注意,这会将您带到相对于控制台宽度(而不是相对于线长)的中间位置。因此,如果一行包含10个字符,并且控制台的宽度为80个字符,则光标将最终显示在该行的第10个字符上(因为它是“尝试”到第40个字符),而不是第5个字符。

– Apnorton
2015年3月10日14:29



是的从这个问题来看,不清楚是在寻找行的中间还是在屏幕的中间。基于与M的类比,我假设是屏幕。

–tommcdo
2015年3月10日14:32

实际上,我只是在宽屏幕(约180个字符)上尝试了此操作,并显示了80个字符的文本。光标移至该行的末尾。似乎不是一个非常有用的命令。

–本
15年3月12日在13:47

@Ben是否到达了行尾,或者是否尽可能靠近屏幕宽度的中心?尝试使用比屏幕宽50%以上的线,或使用:set virtualedit = all尝试。

– 8bittree
17年9月21日在19:51

是的,但是OP要求跳转到行文本中间而不是屏幕中间的命令。因此它无法回答问题。

–本
17年9月22日在4:21

#3 楼

为了增加Luc的答案,还提供Easymotion插件,该插件使轻而易举地快速移动到特定位置。按<Leader><Leader>w将突出显示您可以按哪个键移动到特定单词。这样,您可以轻松地移至当前行中间的单词。

#4 楼

gM将光标移至行文本的一半:
https://vimhelp.org/motion.txt.html#gM

这已于2019年10月实现:
https://github.com/manuelschiller/vim/commit/a267c57acdd8843a91eed2cede6ef02d970147fd

#5 楼

如果您想转到文本的中间(不考虑行首的空白),则可以使用:

function! s:Gm()
  execute 'normal! ^'
  let first_col = virtcol('.')
  execute 'normal! g_'
  let last_col  = virtcol('.')
  execute 'normal! ' . (first_col + last_col) / 2 . '|'
endfunction
nnoremap <silent> gm :call <SID>Gm()<CR>


我不认为这在可视模式下不会起作用。