1

nnoremapfor ntoがあるのは好きnzzですが、次の一致が現在の一致のすぐ下、または 2 行下にある場合、 を押すと混乱しnます。zzカーソルが現在中央の10行にない場合にのみ、何をするかをコマンドで実行したいと思います。手伝って頂けますか?

4

4 に答える 4

3
nmap            n                          <Plug>VimrcSearch<Plug>VimrcZZifnotinmiddle
nnoremap        <Plug>VimrcSearch          n
nnoremap <expr> <Plug>VimrcZZifnotinmiddle (abs(winline()-winheight(0)/2)>5 ? 'zz' : '')."\<C-l>"

上記の3行は、次の回避策の結果です。

  1. 1<Plug>行目と2行目は、a)再マッピングを回避するため(再マッピング可能なマッピングの一部が再マッピングされない場合を思い出さないようにするため)b)「再マッピング可能なマッピングを使用する場合、{rhs}の各シンボルは既知の方法で再マッピングする必要がある」というルールに従います。 」。
  2. 新しい位置に切り替えた後にマッピングを開始する必要があるため、 2行目<Plug>と3行目があります。新しい位置に切り替える前に条件の2番目の部分が評価されるため、マッピングを入れることができません。<expr>n<expr>zz

別の方法があります:

    nnoremap <silent> n n:if abs(winline()-winheight(0)/2)>5<bar>execute 'normal! zz'<bar>endif<CR>

、しかし、<expr>マッピングが最初に頭に浮かんだので、それを維持します。

于 2012-10-15T17:19:38.440 に答える
2

簡単な解決策として'scrolloff'、何か大きなものに設定することを検討することをお勧めします。これは実際にあなたの質問を正確に解決するわけではありませんが、非常に単純なものなので、最初にこれを試してみることをお勧めします.

それが満足のいくものでない場合は、より複雑なアプローチを試して、関数を に入れることができます~/.vimrc

nnoremap <silent> n :call Recenter('n', 10)<cr>
nnoremap <silent> N :call Recenter('N', 10)<cr>

function! Recenter(cmd, tolerance)
  let ws = line('w0')
  let distance = line('w$') - ws
  exe 'norm! ' . a:cmd
  let tolerance = a:tolerance / 2
  let current_offset = line('.') - line('w0')
  if line('w0') != ws || (current_offset < (distance/2-tolerance) || current_offset > (distance/2+tolerance))
    norm! zz
  endif
endfunction

詳細については、次を参照してください。

:h 'scrolloff'
:h line()
:h zz
于 2012-10-15T17:20:56.613 に答える
1

http://vim.wikia.com/wiki/Make_search_results_appear_in_the_middle_of_the_screen

于 2012-10-15T17:50:22.307 に答える
-1
function! CenterWhenNotAtTheMiddle()
    let currentLine = winline() 
    let offsetFromMiddleLine = 5
    let lineBeforeTenMiddleLines = winheight(0) / 2 - offsetFromMiddleLine
    let lineAfterTenMiddleLines = winheight(0) / 2 + offsetFromMiddleLine
    if currentLine < lineBeforeTenMiddleLines 
        normal zz
    else
        if currentLine > linesAfterTenMiddleLines
            normal zz
        endif
    endif
endfunction

nnoremap n n:call CenterWhenNotAtTheMiddle()<Cr>
nnoremap N N:call CenterWhenNotAtTheMiddle()<Cr>
于 2012-10-15T17:49:07.827 に答える