在 Vim 中搜索后居中光标位置

问题描述 投票:0回答:4

我希望 Vim 在搜索后将光标放在屏幕中间。我已经在 .vimrc 中使用以下几行实现了

*
#
n
N
命令

nmap * *zz
nmap # #zz
nmap n nzz
nmap N Nzz

我的问题是:如何以相同的方式映射

/
?
? IE。我想在使用

找到一些文本后定位光标
/some-text-to-find-forward
?some-text-to-find-backward
vim
4个回答
4
投票

编辑:扔掉我最初的答案,因为它太杂乱了。这是一个更好的解决方案。

function! CenterSearch()
  let cmdtype = getcmdtype()
  if cmdtype == '/' || cmdtype == '?'
    return "\<enter>zz"
  endif
  return "\<enter>"
endfunction

cnoremap <silent> <expr> <enter> CenterSearch()

其工作方式是将命令行模式下的 Enter 重新映射到自定义表达式。

如果命令行当前正在搜索中,该函数将执行当前搜索,然后按 zz。否则它只会执行正在执行的任何命令。


1
投票

虽然不是很漂亮,但是

:nnoremap / :execute "normal! /\<lt>cr>zz"<c-left><right>

将会完成工作。 (在命令行上放置一个

:execute "normal! /"
命令,然后在其末尾添加一个
<cr>zz
,以便在发出该命令时自动
zz
。最后的
<c-left><right>
只是在正确的位置进入搜索模式


1
投票

兰迪·莫里斯的解决方案,但作为一个单行者:

cnoremap <silent><expr> <enter> index(['/', '?'], getcmdtype()) >= 0 ? '<enter>zz' : '<enter>'

0
投票

下面是我的

~/.vimrc
的摘录,它修改了搜索,使匹配项垂直居中,但前提是跳转到匹配项的上升或下降超过实际窗口高度的 3/4 (75%)。这对于保留上下文很有帮助。

这是vimscript代码;我知道,有相当多的代码,但它的作用也很多:

" Center the window vertically at the last search match if the search ends up
" scrolling the window up or down at least 75% (3/4) of the actual window height,
" which preserves the context and makes search navigation much easier
"
function! CenterSearch(command = v:null)
  set lazyredraw
  if a:command isnot v:null
    let winstartold = line("w0")
    let winendold   = line("w$")
    try
      execute "normal! " .. a:command
    catch
      echohl ErrorMsg
      echo substitute(v:exception, "^Vim(.*):", "", "")
      echohl NONE
    endtry
  else
    let winstartold = s:winstartold
    let winendold   = s:winendold
  endif
  let winstartnew = line("w0")
  let winendnew   = line("w$")
  let winframe    = float2nr(winheight(0) * (1.0 - 0.75))
  if (winendnew - winstartnew + 1 > 0 && winendold - winstartold + 1 > 0)
  \  && ((winstartnew < winstartold && winendnew < winendold
  \       && winendnew <= winstartold + winframe)
  \      || (winstartnew > winstartold && winendnew > winendold
  \          && winstartnew >= winendold - winframe))
    execute "normal zz"
  endif
  redraw
  set nolazyredraw
endfunction

nnoremap <silent> n :call CenterSearch("n")<CR>
nnoremap <silent> N :call CenterSearch("N")<CR>

" Execute the search as usual, while remembering the resulting window position
" and possibly centering the window vertically at the resulting match
"
function! ExecuteSearch()
  let cmdtype = getcmdtype()
  if cmdtype ==# "/" || cmdtype ==# "?"
    let s:winstartold = line("w0")
    let s:winendold   = line("w$")
    return "\<CR>\<Esc>:call CenterSearch()\<CR>"
  endif
  return "\<CR>"
endfunction

cnoremap <silent> <expr> <CR> ExecuteSearch()

对我来说,这比搜索匹配始终垂直居中有用得多,后者很容易使编辑文件的导航变得很麻烦。

另请参阅此答案,这可能会提供一些额外的安慰。

© www.soinside.com 2019 - 2024. All rights reserved.