解決vscode插件path-autocomplete有多個相同前綴別名路徑下無法正常使用

背景

前幾天在搞一個前端的新項目, 使用到webpack中的一個alias(別名)可以避免引用路徑的混亂, 但是vscode無法很好地支持別名的路徑提示

參考了網(wǎng)上某篇博客的介紹, 算是基本滿足了自身的要求

其中介紹使用了一個path-autocomplete的插件, 簡單介紹就是可以設置好別名對應的實際路徑, 然后再推斷路徑提示的時候?qū)e名替換為設置好的路徑.

// src\features\PathAutocompleteProvider.ts
// configuration.data.pathMappings 即為一個 key為別名, value為真實路徑的對象
Object.keys(configuration.data.pathMappings || {})
            .map((key) => {
                var candidatePaths = configuration.data.pathMappings[key];
                if (typeof candidatePaths == 'string') {
                    candidatePaths = [candidatePaths];
                }
                return candidatePaths.map(candidatePath => {
                    if (workspaceRootPath) {
                        candidatePath = candidatePath.replace('${workspace}', workspaceRootPath);
                    }
    
                    if (workspaceFolderPath) {
                        candidatePath = candidatePath.replace('${folder}', workspaceFolderPath);
                    }
    
                    candidatePath = candidatePath.replace('${home}', configuration.data.homeDirectory);
    
                    return {
                        key: key,
                        path: candidatePath
                    };
                });
            })
            .some((mappings) => {
                var found = false;

                mappings.forEach(mapping => {
// 關(guān)鍵的地方在這里, insertedPath 為當前編輯器輸入的路徑
// 判斷輸入的路徑是否是以某個key值開頭的, 如果是則將key進行替換成設置好的路徑, 并返回
                    if (insertedPath.startsWith(mapping.key) || (mapping.key === '$root' && !insertedPath.startsWith('.'))) {
                        items.push({
                            // 該別名對應的路徑
                            currentDir: mapping.path,
                            // 從路徑中去掉別名
                            insertedPath: insertedPath.replace(mapping.key, '')
                        });
                        found = true;
                    }
                });

                // stop after the first mapping found
                return found;
            });

大部分情況下, 該插件是可以正常使用, 但是當配置中的key有相同前綴時, 就會出現(xiàn)問題了

比如我的設置是這樣

// .setting.json
"path-autocomplete.pathMappings": {
    "@": "${folder}/src",
    "@view": "${folder}/src/components"
  },

而此時輸入insertedPath = '@view', 我的本意應該是去尋找"${folder}/src/components", 但是根據(jù)上述代碼, 因為Object.keys()返回的順序是按照屬性創(chuàng)建的先后順序來的, 故@排在@view前面, 又因為@滿足insertedPath.startsWith(mapping.key)這個條件, 導致插件誤認為找到正確對應的路徑, 造成錯誤, 無法顯示正確路徑

解決

解決辦法很簡單, 只要讓路徑匹配到有最長的有相同前綴的key就行了润讥, 即如果路徑是@view, 則讓@view排前面, 路徑是@則讓key@排前面, 只需在Object.keys()后多加一個sort(), 按匹配前綴長度大小排列

// .src\features\PathAutocompleteProvider.ts
Object.keys(configuration.data.pathMappings || {})
           // 插上這個即可
            .sort((key1, key2) => {
                const f1 = insertedPath.startsWith(key1) ? key1.length : 0;
                const f2 = insertedPath.startsWith(key2) ? key2.length : 0;
                return f2 - f1;
            })
            .map((key) => {
                // ... 省略, 與前面一樣
            })
            .some((mappings) => {
               // ... 省略, 與前面一樣
            });

提交的PR

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市盘寡,隨后出現(xiàn)的幾起案子楚殿,更是在濱河造成了極大的恐慌,老刑警劉巖宴抚,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件勒魔,死亡現(xiàn)場離奇詭異,居然都是意外死亡菇曲,警方通過查閱死者的電腦和手機冠绢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來常潮,“玉大人弟胀,你說我怎么就攤上這事。” “怎么了孵户?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵萧朝,是天一觀的道長。 經(jīng)常有香客問我夏哭,道長检柬,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任竖配,我火速辦了婚禮何址,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘进胯。我一直安慰自己用爪,他們只是感情好,可當我...
    茶點故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布胁镐。 她就那樣靜靜地躺著偎血,像睡著了一般。 火紅的嫁衣襯著肌膚如雪盯漂。 梳的紋絲不亂的頭發(fā)上颇玷,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天,我揣著相機與錄音宠能,去河邊找鬼亚隙。 笑死磁餐,一個胖子當著我的面吹牛违崇,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播诊霹,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼羞延,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了脾还?” 一聲冷哼從身側(cè)響起伴箩,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎鄙漏,沒想到半個月后嗤谚,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡怔蚌,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年巩步,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片桦踊。...
    茶點故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡椅野,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情竟闪,我是刑警寧澤离福,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站炼蛤,受9級特大地震影響妖爷,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜理朋,卻給世界環(huán)境...
    茶點故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一赠涮、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧暗挑,春花似錦笋除、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至烹看,卻和暖如春国拇,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背惯殊。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工酱吝, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人土思。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓务热,卻偏偏與公主長得像,于是被迫代替她去往敵國和親己儒。 傳聞我的和親對象是個殘疾皇子崎岂,可洞房花燭夜當晚...
    茶點故事閱讀 44,781評論 2 354

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn)闪湾,斷路器冲甘,智...
    卡卡羅2017閱讀 134,656評論 18 139
  • 1.ios高性能編程 (1).內(nèi)層 最小的內(nèi)層平均值和峰值(2).耗電量 高效的算法和數(shù)據(jù)結(jié)構(gòu)(3).初始化時...
    歐辰_OSR閱讀 29,383評論 8 265
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴謹 對...
    cosWriter閱讀 11,101評論 1 32
  • 文/柚柚 題記:炭山窩,是我去過后還想再去一次的地方途样,也是我去過后很有寫作沖動的地方江醇,卻因為懶惰而耽擱下來。今天何暇,...
    柚柚yy閱讀 651評論 3 1
  • “我們的愛情到這剛剛好陶夜,剩不多也不少”薛之謙的一首《剛剛好》唱出了我的心聲。每個人都渴望得到一份屬于自己...
    胖悅悅閱讀 670評論 3 5