nnoremap
for n
toがあるのは好きnzz
ですが、次の一致が現在の一致のすぐ下、または 2 行下にある場合、 を押すと混乱しn
ます。zz
カーソルが現在中央の10行にない場合にのみ、何をするかをコマンドで実行したいと思います。手伝って頂けますか?
質問する
87 次
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
<Plug>
行目と2行目は、a)再マッピングを回避するため(再マッピング可能なマッピングの一部が再マッピングされない場合を思い出さないようにするため)b)「再マッピング可能なマッピングを使用する場合、{rhs}の各シンボルは既知の方法で再マッピングする必要がある」というルールに従います。 」。 - 新しい位置に切り替えた後にマッピングを開始する必要があるため、 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
于 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 に答える