4

( )<C-w>oを実行するデフォルトのコマンドであるマップを解除しようとしているので、最初に試したのは次のとおりです。:only:help :only

nmap <c-w>o <nop>

この種の機能は、 を押してミリ秒<c-w>以上待ってから を押した場合を除き、呼び出されます。timeoutleno:only

<c-w>-prefixed やその他のデフォルト コマンドがtimeoutlenミリ秒後にタイムアウトしない理由がわかりません。これは予想外のことです。

以前は、独自のマッピングを定義する ZoomWin プラグインがありました。コマンドを<c-w>o効果的に上書きしたため、 ZoomWinプラグインの代わりに が呼び出される:onlyことがある理由を理解できませんでした。次に を押して、代わりにデフォルトのコマンドを呼び出しました。:only commandtimeoutleno<c-w>o

では、カスタム マッピングのようにデフォルト コマンドをタイムアウトにすることは可能ですか?

4

4 に答える 4

2

<C-w>o1 つのコマンドであると考えるべきではなく、代わりに「ウィンドウ操作サブモードを開始する」のように考えるべきです<C-w>: 他のマルチキー vim 通常モード コマンドと同様に(<C-w>{smth}またg*、ビープ音が鳴りますが、私のシステムでは ('visualbell' で) 表示されず、ビープ音が聞こえません)、対応する括弧 (のデフォルト) に切り替わりません。z*Z*<C-w>%<C-w>{any-key-not-mentioned-in-help}%

次の方法で<C-w>o再マッピングすることにより、引き続き を無効にすることができます。<C-w>

function s:CtrlW()
    let char=getchar()
    if type(char)==type(0) | let char=nr2char(char) | endif

    if char is# 'o'
        return ''
    endif
    return "\<C-w>".char
endfunction
nnoremap <expr> <C-w> <SID>CtrlW()
于 2012-08-23T14:58:06.333 に答える
1

'timeout'また、組み込みコマンドが;の後に中止されない理由もわかりません。これはより一貫性があると思いますが、これまでのところ気になりませんでした。

あなたが望むものを達成する方法を見つけたと思いますが、面倒です。Ctrl-W 自体を無力化する必要があります。Ctrl-\ Ctrl-N は に似<Esc>ていますが、ビープ音はありません。を使用すると<Nop>、間に別のコマンドを発行するまで、後続のコマンドが何らかの形で機能しませんでした。

:nnoremap <C-w> <C-\><C-n>

ただし、これによりすべての組み込みコマンドも無効になるため、それらをそれら自体にマップする必要があります。

:nnoremap <C-w><C-w> <C-w><C-w>
:nnoremap <C-w>s     <C-w>s
...

これはループを介して自動化できますが ( にマップしたい Ctrl-W o を除いて<Nop>)、それでも醜いです。

于 2012-08-23T14:14:12.207 に答える
0

デフォルトのコマンドは、マッピングとして処理されない可能性があるため、タイムアウトしません。で説明されているように'timeoutlen'、キーがマッピングにアタッチされていない場合:h ttimeout

'timeout'    'ttimeout'     action  ~
   off      off     do not time out
   on       on or off   time out on :mappings and key codes
   off      on      time out on key codes

If both options are off, Vim will wait until either the complete
mapping or key sequence has been received, or it is clear that there
is no mapping or key sequence for the received characters.  For
example: if you have mapped "vl" and Vim has received 'v', the next
character is needed to see if the 'v' is followed by an 'l'.
When one of the options is on, Vim will wait for about 1 second for
the next character to arrive.  After that the already received
characters are interpreted as single characters.

したがって、上のキー<C-w>oは単一の文字として解釈され、デフォルトのコマンドをトリガーします。あなたは出発'timeout'とを検討するかもしれません'ttimeout'

于 2012-08-23T12:54:08.103 に答える
0

何もしたく<C-w>oないですか、それとも何か他のものにマップしたいですか?

<C-w>o<nop>やに敏感な:unmapようではないので、簡単に消すことはできないようです。とはいえ、その正当な理由を思いつくのは難しい。ファットフィンガーリングを繰り返したためにコマンドを削除することは正当な理由 ( "may" )かもしれ<C-w>oませんが、ファットフィンガーであろうとなかろうと、誤ってヒットするのはそれほど簡単ではありません。

ただし、次のように簡単に別のものにマップできます。

nnoremap <C-w>o o
于 2012-08-23T12:48:03.627 に答える