2012-08-23 28 views
3

我試圖取消映射<C-w>o它是執行:only:help :only)默認的命令,所以我想的第一件事就是:Vim的行爲

nmap <c-w>o <nop> 

這種-的作品,除非我按<c-w>,等待超過timeoutlen毫秒,然後按o,:only被調用。

我不明白爲什麼<c-w> -prefixed和其他默認命令不會在timeoutlen ms之後超時,這是恕我直言的意外。

以前我有ZoomWin插件,它定義了自己的映射:<c-w>o有效覆蓋:only命令,我不明白爲什麼有時:only command得到調用,而不是ZoomWin插件時,我意識到,它得到了調用時插件映射超時(在timeoutlen ms之後),然後按下o,改爲調用默認的<c-w>o命令。

那麼,是否有可能使默認命令超時,就像自定義映射一樣?

+1

':設置showcmd'將顯示填充鍵綁定。當您在底部看到「^ W」時,您可以按下'ESC'取消它。 – kev

回答

1

你不應該去想<C-w>o是一個命令,你應該考慮,而不是有關<C-w>像「啓動窗口操作子模式」:像任何其他多鍵VIM正常模式命令<C-w>{smth}(也g*z*Z*)不僅是免疫如果超時,<C-w>%<C-w>{any-key-not-mentioned-in-help})將不會執行任何操作(可能會發出嘟嘟聲,但在我的系統上,我看不到(用'visualbell')或聽到嘟嘟聲),而不切換到相應的括號(%的默認值)。

,您仍然可以禁用<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() 
0

你想<C-w>o什麼都不做,或者你想映射它到別的東西嗎?

<C-w>o似乎不明智<nop>:unmap,所以它看起來並不那麼容易使它消失。不過,我很難提出一個合理的理由。因爲反覆發指令而擺脫命令可能是是一個有效的原因(「可能」)但是<C-w>o不是很容易被偶然碰到,胖手指或不。

你可以,但是,很容易將其映射到別的東西,如:

nnoremap <C-w>o o 
+0

我曾經將它映射爲ZoomWin插件,但由於我注意到映射的超時和「超載」問題,因此我想將它映射到'',因爲我的手指對該映射是有用的,而且我碰巧沒有按下它意識到我改變了插件的映射。但是,真的,我只是想在'timeoutlen'之後讓''超時,因爲沒有理由不應該這樣做。 – molok

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'

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 0外,你想要映射到<Nop>),但它仍然很難看。