2012-12-27 48 views
2

我正在嘗試爲某些PLSQL函數/過程參數實現智能全向完成。每一個這樣的函數都可能被重載,所以在一開始就提供所有重載版本的所有參數。例如,假設我們有這樣的:從完成彈出菜單中獲取所選項目

procedure test(param1 varchar2, param2 varchar2); <= overload 1 
    procedure test(p1 integer, p2 integer); <= overload 2 
    procedure test(p1 date, p2 date, p3 date); <= overload 3 

當我輸入exec test(|<=cursor here我公司提供的名單是:

param1 [o1] 
param2 [o1] 
p1 [o2] 
p2 [o2] 
p1 [o3] 
p2 [o3] 
p3 [o3] 

如果用戶從完成彈出菜單我想記住他的選擇和選擇"p1 [o2]",對於下一次完成嘗試,提供僅使用[o2]參數過濾的列表或對其進行不同的排序,以便首先顯示[o2]項目。

問題是,我無法弄清楚如何獲得用戶從完成彈出式菜單中選擇和接受的項目。有沒有一種乾淨的方式來實現它?有趣的是,我記住了整個用戶案例情景,但在我開始之前就陷入了困境。不知道用戶從列表中選擇了什麼,很難實現這種「自學習/自適應」代碼完成系統。

回答

1

最近Vim補丁7.3.598引入了CompleteDone事件,但您也可以使用CursorMovedI事件,該事件在插入完成候選項後觸發。

光標前的關鍵字(matchstr(strpart(getline('.'), 0, col('.') - 1), '\k\+$'))是插入完成;將它保存在一個變量中,並在下一次完成時考慮這一點。 (您可能需要保存光標位置(通過getpos()),以避免考慮何時發生全新的,不相關的另一個地方完成

+0

非常感謝您的回答!我不知道新的CompleteDone事件。乍一看,它看起來是最好的選擇,除了它是非常新的,並且據我所知,界面還沒有完全定義。 CursorMovedI方法可能有效,但我仍然無法確定用戶是選擇了「p1 [o2]」還是「p1 [o3]」。尾部的[o1],[o2]作爲完成項目詞典的「kind」屬性提供。 – talek

+0

我自己使用'CursorMovedI'。你是對的,這種「善良」財產已經喪失;完成菜單並不意味着這樣的事情。你必須實現你自己的完成查詢(用':echo'和'input()')。 –

+0

這就是我所害怕的。我向Bram發佈了一條建議,也許所選項目的索引號可以作爲此新CompleteDone活動的一部分提供:https://groups.google.com/forum/?fromgroups = #!topic/vim_dev/XDFDQ8rkBII – talek

3

從Vim 8.0和neovim 0.1.5開始(至少,我不確定這是什麼時候添加的)現在有一個v:completed_item變量,它包含與上次完成相關的匹配對象(請參見complete-items幫助頁面)(具體而言,最後一個CompleteDone事件)。該變量包含一個空字典if完成失敗或當您離開並重新進入插入模式時

但是,爲了使用它來確定是否明確選擇了完成項目,您必須設置completeopt+=noinsert否則,v:completed_item將在打開後始終設置爲完成菜單中的第一項,即使您沒有明確選擇它。