2013-10-21 211 views
1

今天,我將Vim從7.3升級到7.4。但是,下面的函數CleverTab()似乎不起作用。 (我不知道如果這件事是更新。)該功能無法正常工作

function! CleverTab() 
    if strpart(getline('.'), 0, col('.')-1) =~ '^\s*$' 
     return "\<Tab>" 
    endif 
    if pumvisible() 
     return "\<C-N>" 
    endif 
    return "hello" 
endfunction 

inoremap <silent><tab> <C-R>=CleverTab()<CR> 

該功能的目的是根據當標籤按目前的情況做不同的事情:

  1. 如果當前行充滿空間,然後只需添加一個選項卡。
  2. 如果出現彈出式菜單,請向下移動。
  3. 否則,添加字符串「hello」。

(說實話,我要在方案3中做的是調用另一個函數,但是,不管 - 。使問題容易了,我只是想證明在這種情況下字符串)

假設我通過Vim編輯我的文件並輸入了字符串「123」(例如)。目前,當我按標籤時,實際結果是添加了<tab>。預期的結果是流程應該符合條件3並添加字符串「hello」。我今天下午花了它。

那麼,誰能幫我弄明白嗎?不勝感激!

+1

測試了你的函數和映射,「hello」打印在我的vim 7.4上。順便說一句,你可以創建一個''地圖而不是' =',這是專爲這種情況而設計的。 – Kent

+0

感謝您的回覆。但它仍然適用於我。所以你可以請幫助讓我知道是否有什麼封鎖我的函數CloverTab()? – kevin

+0

抱歉錯字錯誤。它仍然不起作用! – kevin

回答

2

您的CleverTab()功能是全球範圍內的。如果另一個插件定義了相同的函數,則前者將被覆蓋。爲避免這種衝突,應避免全局功能。而是使用腳本本地功能s:CleverTab(),通過<SID>CleverTab()的映射或自動裝入功能myplugin#CleverTab()來調用。

如果問題是另一個插件重寫<Tab>映射,則必須選擇另一個映射鍵,或者爲其中一個選擇另一個。只有當你的函數是原文的擴展(並提供兼容的返回類型)時,你可以從你的內部調用另一個函數(假設你使用了不同的函數名稱,如我的第一段所述)。