vscode插件快餐教程(5) - 代碼補全

vscode插件快餐教程(5) - 代碼補全

上節(jié)我們介紹了lsp的基本框架和協(xié)議的三次握手胚宦。
下面我們先學(xué)習(xí)一個最簡單的功能協(xié)議:給vscode發(fā)送一條通知弦撩。

LSP窗口消息

在LSP協(xié)議中枪芒,跟窗口相關(guān)的協(xié)議有三條:

  • window/ShowMessage Notification
  • window/showMessage Request
  • window/logMessage Notification

我們可以使用Connection.window.sendxxxMessage函數(shù)來向客戶端發(fā)送消息贺奠。
根據(jù)消息程度的不同竣稽,分為Information, Warning和Error三個級別撩穿。

舉個例子试吁,我們可以在onInitialized棺棵,也就是客戶端與服務(wù)端三次握手一切就緒之后,向客戶端發(fā)一個消息熄捍。

connection.onInitialized(() => {
    connection.window.showInformationMessage('Hello World! form server side');
});

顯示結(jié)果如下:


showMessage

代碼補全

我們用窗口通知熱熱身烛恤,測試一下鏈路通不通。下面我們就直奔我們最感興趣的主題之一:代碼補全余耽。

代碼補全的形式其實也很簡單缚柏,輸入是一個TextDocumentPositionParams,輸出是一個CompletionItem的數(shù)組碟贾,這個函數(shù)注冊到connection.onCompletion中:

connection.onCompletion(
    (_textDocumentPosition: TextDocumentPositionParams): CompletionItem[] => {});

代碼補全中用到的主要數(shù)據(jù)結(jié)構(gòu)如下圖所示:


代碼補全.png

其中kind屬性由一個枚舉定義:


CompletionItemKind.png

大家不要被嚇到币喧,我們通過一個簡單的例子看一下,其實基本實現(xiàn)方法還是很簡單的:

connection.onCompletion(
    (_textDocumentPosition: TextDocumentPositionParams): CompletionItem[] => {
        connection.console.log('[xulun]Position:' + _textDocumentPosition.textDocument);

        return [
            {
                label: 'TextView',
                kind: CompletionItemKind.Text,
                data: 1
            },
            {
                label: 'Button',
                kind: CompletionItemKind.Text,
                data: 2
            },
            {
                label: 'ListView',
                kind: CompletionItemKind.Text,
                data: 3
            }
        ];
    }
)

補全的詳細信息

除了補全信息textDocument/completion之外袱耽,lsp還支持completionItem/resolve請求杀餐,輸入和輸出都是CompletionItem,返回進一步的信息朱巨。
通過connection.onCompletionResolve方法可以注冊對于completionItem/resolve請求的支持:

connection.onCompletionResolve(
    (item: CompletionItem): CompletionItem => {
        if (item.data === 1) {
            item.detail = 'TextView';
            item.documentation = 'TextView documentation';
        } else if (item.data === 2) {
            item.detail = 'Button';
            item.documentation = 'JavaScript documentation';
        } else if (item.data === 3) {
            item.detail = 'ListView';
            item.documentation = 'ListView documentation';
        }
        return item;
    }
)

運行效果如下:


ListView

使用參數(shù)中的補全位置信息

輸入?yún)?shù)中會帶有發(fā)出補全申請的位置信息史翘,我們可以根據(jù)這個信息來控制補全的信息。
我們以一個例子來說明下:

connection.onCompletion(
    (_textDocumentPosition: TextDocumentPositionParams): CompletionItem[] => {
        
        return [
            {
                label: 'TextView' + _textDocumentPosition.position.character,
                kind: CompletionItemKind.Text,
                data: 1
            },
            {
                label: 'Button' + _textDocumentPosition.position.line,
                kind: CompletionItemKind.Text,
                data: 2
            },
            {
                label: 'ListView',
                kind: CompletionItemKind.Text,
                data: 3
            }
        ];
    }
)

我們此時不光補全一個控件名冀续,還將當(dāng)前的行號或列號增加其中琼讽。
下面是補全Button的運行情況,會增加當(dāng)前的行號到補全信息中洪唐,我們在934行觸發(fā)補全钻蹬,于是補全提示的信息變成Button933:


補全帶列號
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市凭需,隨后出現(xiàn)的幾起案子问欠,更是在濱河造成了極大的恐慌桂敛,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件溅潜,死亡現(xiàn)場離奇詭異,居然都是意外死亡薪伏,警方通過查閱死者的電腦和手機滚澜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來嫁怀,“玉大人设捐,你說我怎么就攤上這事√潦纾” “怎么了萝招?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長存捺。 經(jīng)常有香客問我槐沼,道長,這世上最難降的妖魔是什么捌治? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任岗钩,我火速辦了婚禮,結(jié)果婚禮上肖油,老公的妹妹穿的比我還像新娘兼吓。我一直安慰自己,他們只是感情好森枪,可當(dāng)我...
    茶點故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布视搏。 她就那樣靜靜地躺著,像睡著了一般县袱。 火紅的嫁衣襯著肌膚如雪浑娜。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天式散,我揣著相機與錄音棚愤,去河邊找鬼。 笑死杂数,一個胖子當(dāng)著我的面吹牛宛畦,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播揍移,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼次和,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了那伐?” 一聲冷哼從身側(cè)響起踏施,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤石蔗,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后畅形,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體养距,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年日熬,在試婚紗的時候發(fā)現(xiàn)自己被綠了棍厌。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡竖席,死狀恐怖耘纱,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情毕荐,我是刑警寧澤束析,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站憎亚,受9級特大地震影響员寇,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜第美,卻給世界環(huán)境...
    茶點故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一丁恭、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧斋日,春花似錦牲览、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至兔港,卻和暖如春庸毫,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背衫樊。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工飒赃, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人科侈。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓载佳,卻偏偏與公主長得像,于是被迫代替她去往敵國和親臀栈。 傳聞我的和親對象是個殘疾皇子蔫慧,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,724評論 2 354

推薦閱讀更多精彩內(nèi)容

  • vscode插件快餐教程(4) - 語言服務(wù)器協(xié)議lsp 語言服務(wù)器協(xié)議lsp是vscode為了解決語言擴展中的痛...
    Jtag特工閱讀 2,616評論 0 0
  • 簡介 用簡單的話來定義tcpdump,就是:dump the traffic on a network权薯,根據(jù)使用者...
    JasonShi6306421閱讀 1,240評論 0 1
  • 一. Java基礎(chǔ)部分.................................................
    wy_sure閱讀 3,811評論 0 11
  • 簡介 用簡單的話來定義tcpdump姑躲,就是:dump the traffic on a network睡扬,根據(jù)使用者...
    保川閱讀 5,956評論 1 13
  • 我一直覺得雖然有的當(dāng)紅小鮮肉很火,但是自己的實力自己是知道的黍析,他們看到自己的腦殘粉們天天為了維護自己把自己往死里吹...
    大Ci閱讀 231評論 0 0