我希望 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
编辑:扔掉我最初的答案,因为它太杂乱了。这是一个更好的解决方案。
function! CenterSearch()
let cmdtype = getcmdtype()
if cmdtype == '/' || cmdtype == '?'
return "\<enter>zz"
endif
return "\<enter>"
endfunction
cnoremap <silent> <expr> <enter> CenterSearch()
其工作方式是将命令行模式下的 Enter 重新映射到自定义表达式。
如果命令行当前正在搜索中,该函数将执行当前搜索,然后按 zz。否则它只会执行正在执行的任何命令。
虽然不是很漂亮,但是
:nnoremap / :execute "normal! /\<lt>cr>zz"<c-left><right>
将会完成工作。 (在命令行上放置一个
:execute "normal! /"
命令,然后在其末尾添加一个 <cr>zz
,以便在发出该命令时自动 zz
。最后的 <c-left><right>
只是在正确的位置进入搜索模式
兰迪·莫里斯的解决方案,但作为一个单行者:
cnoremap <silent><expr> <enter> index(['/', '?'], getcmdtype()) >= 0 ? '<enter>zz' : '<enter>'
下面是我的
~/.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()
对我来说,这比搜索匹配始终垂直居中有用得多,后者很容易使编辑文件的导航变得很麻烦。
另请参阅此答案,这可能会提供一些额外的安慰。