
繪圖員的一天很多時(shí)候不是被復(fù)雜的圖面難倒而是被一串重復(fù)無聊的操作拖垮。圖層開開關(guān)關(guān)、標(biāo)注換來換去、圖紙清理一遍又一遍這種機(jī)械性動(dòng)作一旦多了人就會(huì)煩躁一煩躁就容易出錯(cuò)。我在帶新人那幾年最常見的場景就是他們抱著各種教程、插件裝了一堆結(jié)果真正常用的功能還是那幾個(gè)反而把自己繞暈了。這次講的AutoLISP定制AutoCAD工具欄就是解決這個(gè)問題的推薦方案——它不依賴任何第三方環(huán)境也不用懂高級編程語言哪怕你只寫過幾行公式也能在半小時(shí)內(nèi)給自己的AutoCAD做一個(gè)“一鍵搞定”的專屬按鈕2023版實(shí)測同樣有效。它適合誰適合每天在CAD里畫圖、改圖、整理圖被重復(fù)命令拖慢速度的工程師和繪圖員。1. 整體設(shè)計(jì)與思路拆解1.1 為什么是AutoLISP而不是菜單宏或.NET插件很多第一反應(yīng)是現(xiàn)在都2023年了AutoCAD早就支持C#、Python這些現(xiàn)代語言為什么還要回頭學(xué)一個(gè)上世紀(jì)的語言這個(gè)想法我理解但實(shí)際落地的時(shí)候會(huì)發(fā)現(xiàn)C#和ObjectARX最大的問題是編譯和調(diào)試門檻。你寫一個(gè)底層功能光是配置Visual Studio環(huán)境、處理AutoCAD版本兼容、反復(fù)重啟軟件測試就夠折騰一上午。而AutoLISP是解釋型語言寫幾行文本加載進(jìn)CAD就能跑改完立刻生效迭代效率高得多。菜單宏是另一個(gè)選項(xiàng)錄制一段操作然后回放但宏有個(gè)致命弱點(diǎn)它只能做順序動(dòng)作無法判斷“如果這條線沒畫出來應(yīng)該怎么辦”也沒法讀圖里的數(shù)據(jù)。AutoLISP則完全不同它可以讀取圖中實(shí)體的屬性、根據(jù)條件分支處理、循環(huán)批量操作這才叫“編程”。比如你要把所有圖層的線寬統(tǒng)一改成0.3宏只能錄一次點(diǎn)選設(shè)置LISP則能遍歷所有圖層自動(dòng)修改。再加上AutoLISP從上世紀(jì)80年代就是AutoCAD的原生接口幾十年下來積累了海量現(xiàn)成代碼可參考語法本身又沒變過屬于投入產(chǎn)出比非常高的選擇。對大多數(shù)應(yīng)用場景AutoLISP的能力上限遠(yuǎn)超普通用戶需求你很難碰到它的瓶頸。1.2 工具欄按鈕的本質(zhì)界面與代碼之間的橋梁我剛接觸定制工具欄那會(huì)兒有個(gè)認(rèn)知卡了很久以為工具欄按鈕必須綁定某種特定程序。后來搞清楚了原理工具欄上的每個(gè)按鈕實(shí)質(zhì)上只是保存了一段字符串這段字符串叫作“宏”Macro。當(dāng)你點(diǎn)擊按鈕時(shí)AutoCAD做的唯一一件事就是把這段宏內(nèi)容當(dāng)作命令行輸入去執(zhí)行。這就串聯(lián)起來了你可以把宏寫成^C^C命令名意思是取消當(dāng)前命令后執(zhí)行某個(gè)命令。而這個(gè)命令名既可以是AutoCAD內(nèi)置功能也可以是你自己用AutoLISP定義的自定義函數(shù)。所以定制工具欄的完整鏈條是用AutoLISP寫一個(gè)defun函數(shù)函數(shù)名叫c:QTW把LSP文件加載進(jìn)當(dāng)前圖紙?jiān)贑UI自定義界面里新建一個(gè)工具欄按鈕按鈕的宏填成^C^CQTW點(diǎn)擊按鈕CAD解析宏調(diào)用QTW函數(shù)完成預(yù)定義操作。想通這個(gè)流程之后所謂“定制工具欄”就不再神秘了。你需要掌握的無非是兩件事怎么用LISP定義命令行能識別的命令怎么把按鈕和命令關(guān)聯(lián)起來。1.3 這套方案的適用人群與預(yù)期收益按我這些年帶團(tuán)隊(duì)的經(jīng)驗(yàn)AutoLISP定制工具欄最適合三類人長期畫圖的繪圖員每天重復(fù)操作幾十次以上哪怕一次省十秒鐘一天也能省出半小時(shí)設(shè)計(jì)團(tuán)隊(duì)的標(biāo)準(zhǔn)化負(fù)責(zé)人把公司圖紙規(guī)范固化成按鈕新人不需要背設(shè)置流程上手速度快出錯(cuò)率低想提升效率的CAD發(fā)燒友不需要學(xué)完整編程只要掌握幾個(gè)核心函數(shù)就能DIY自己的專屬功能。我的建議是如果你還沒寫過任何LISP先不要急著做復(fù)雜功能找兩個(gè)最頻繁的操作練手。等理解了加載和調(diào)用機(jī)制后面的路就很順了。2. 核心細(xì)節(jié)解析與實(shí)操要點(diǎn)2.1 AutoLISP最常用的語法模型先說結(jié)論一個(gè)LISP程序本質(zhì)就是一堆括號表達(dá)式。每個(gè)表達(dá)式以左括號開始執(zhí)行一個(gè)操作然后返回一個(gè)值。最常用的幾個(gè)基礎(chǔ)函數(shù)我列個(gè)表說明函數(shù)作用示例defun定義函數(shù)或命令(defun c:QX () ...)setq給變量賦值(setq layer_name 中心線)command調(diào)用AutoCAD命令(command line p1 p2 )getpoint讓用戶在屏幕上點(diǎn)選一個(gè)點(diǎn)(setq pt (getpoint 選擇起點(diǎn):))entsel讓用戶選擇一個(gè)實(shí)體(setq ent (entsel 選擇對象:))if條件判斷(if ( x 10) (do-a) (do-b))while循環(huán)執(zhí)行(while (setq pt (getpoint)) ...)這里面特別要留意defun的寫法如果函數(shù)名以c:開頭比如c:QXAutoCAD會(huì)自動(dòng)把它注冊成一個(gè)命令行命令你直接在命令行輸入QX就能調(diào)用。反過來如果函數(shù)名沒有c:前綴那它只是一段內(nèi)部子函數(shù)不能在命令行直接觸發(fā)。這是初學(xué)者最容易踩的坑。另一個(gè)容易誤解的是command函數(shù)。它的作用是模擬你在命令行手動(dòng)輸入命令所以必須按照命令行的提示順序傳遞參數(shù)。比如畫一條直線命令行提示依次是“指定第一點(diǎn)”“指定下一點(diǎn)”代碼就是(command line pt1 pt2 )那個(gè)空的是模擬空格或回車來結(jié)束命令。如果不補(bǔ)這個(gè)結(jié)束符命令會(huì)一直掛起等待輸入。2.2 一個(gè)能實(shí)際用的函數(shù)是怎么寫的空談理論沒有意義看一個(gè)真實(shí)應(yīng)用場景。假設(shè)你畫圖時(shí)需要經(jīng)常新建一個(gè)名為“中心線”的圖層并要求它顏色為紅色、線型為CENTER、線寬0.25。手動(dòng)操作至少要點(diǎn)四到五次菜單而且每次都要記住參數(shù)。用LISP寫(defun c:CL () ; 創(chuàng)建中心線圖層 (command _-layer new 中心線 color 1 中心線 ltype center 中心線 lweight 25 中心線 ) (princ \n中心線圖層已創(chuàng)建) (princ) )逐行拆解c:CL定義命令CL加載后你在命令行輸入CL就能觸發(fā)_-layer前面加下劃線是為了確保在非英文版AutoCAD中也能識別-LAYER命令減號表示使用命令行版本而非彈窗版本new 中心線新建圖層color 1 中心線把顏色設(shè)置為紅色顏色編號1ltype center 中心線設(shè)置線型前提是CENTER線型已經(jīng)在圖形中加載過lweight 25線寬設(shè)為0.25mm注意這里用的是整數(shù)25單位是百分之一毫米最后一個(gè)結(jié)束-LAYER命令。寫完保存為cl.lsp在AutoCAD命令行輸入APPLOAD加載它再輸入CL你的圖層設(shè)置就自動(dòng)完成了。不到十行代碼替代五次菜單點(diǎn)擊這就是實(shí)惠。2.3 環(huán)境準(zhǔn)備用什么工具寫、怎么加載很多教程讓初學(xué)者直接裝Visual Studio Code然后配一堆LISP插件這是把簡單問題復(fù)雜化了。從零開始我用一個(gè)純文本工具就夠比如Windows自帶的記事本或者NotePad、VS Code也可以。關(guān)鍵在于兩點(diǎn)文件編碼必須保存為ANSI在非英文系統(tǒng)上推薦ANSI/GBK如果你的LISP文件里有中文提示保存為UTF-8編碼會(huì)被AutoCAD讀成亂碼這是個(gè)極其常見的坑后綴名必須是.lsp。加載方式分兩種臨時(shí)加載和自動(dòng)加載。臨時(shí)加載就是在命令行執(zhí)行APPLOAD在彈出的對話框里選中你的LSP文件點(diǎn)“加載”。這種方式只在當(dāng)前打開的圖紙會(huì)話中有效重啟CAD后需要重新加載適合測試用。要想一勞永逸應(yīng)該加入“啟動(dòng)組”。在APPLOAD對話框下方有個(gè)“啟動(dòng)組”區(qū)域點(diǎn)“內(nèi)容”把你的LSP添加進(jìn)去AutoCAD以后每次啟動(dòng)都會(huì)自動(dòng)加載它。這個(gè)操作只需要做一次。2023版本里這個(gè)功能位置沒變依然在應(yīng)用加載對話框中。有人會(huì)問那如果LSP文件路徑變了怎么辦啟動(dòng)組記錄的是絕對路徑移動(dòng)了文件就要重新添加。所以建議在放LSP文件的文件夾固定下來之前先規(guī)劃好目錄結(jié)構(gòu)例如專建一個(gè)MyLisp文件夾把所有自定義腳本集中管理。3. 實(shí)操過程與核心環(huán)節(jié)實(shí)現(xiàn)5步把按鈕掛上工具欄3.1 第一步編寫一個(gè)安全完整的LSP文件剛才的圖層創(chuàng)建函數(shù)是單個(gè)命令但實(shí)際使用中我們經(jīng)常需要一組函數(shù)互相配合。比如我先定義一個(gè)“設(shè)置常用圖層”的函數(shù)再定義一個(gè)“批量清理空圖層”的函數(shù)放在同一個(gè)LSP文件里一次加載全部生效。這里分享一個(gè)編寫時(shí)的細(xì)節(jié)每個(gè)命令函數(shù)的末尾都放一行(princ)。(princ)的作用是讓函數(shù)正常結(jié)束時(shí)不返回一個(gè)多余的值否則你在命令行調(diào)用后會(huì)顯示nil或者一堆數(shù)據(jù)雖然不影響功能但界面不干凈。好的LISP腳本應(yīng)該有禮貌不打擾用戶。如果你準(zhǔn)備發(fā)布給同事使用建議加一段防錯(cuò)邏輯(if (not (tblsearch LAYER 中心線)) (command _-layer new 中心線 color 1 中心線 ltype center 中心線 ) (princ \n圖層已存在跳過創(chuàng)建。) )用tblsearch檢查圖層是否已經(jīng)存在避免重復(fù)創(chuàng)建報(bào)錯(cuò)。這是一個(gè)非常典型的專業(yè)細(xì)節(jié)好的LISP不僅追求功能還要考慮重復(fù)執(zhí)行的安全性。3.2 第二步把LSP文件加入自動(dòng)加載這一步值得認(rèn)真做。先在電腦某個(gè)固定位置建一個(gè)目錄比如D:\CAD_Tools把剛才的代碼保存為MyTools.lsp。然后打開AutoCAD命令行輸入APPLOAD彈出對話框后點(diǎn)“內(nèi)容”按鈕把MyTools.lsp加進(jìn)“啟動(dòng)組”。確認(rèn)后關(guān)閉對話框重啟AutoCAD。注意啟動(dòng)組相當(dāng)于每次啟動(dòng)時(shí)自動(dòng)加載文件但如果你的LSP文件里存在語法錯(cuò)誤AutoCAD啟動(dòng)時(shí)會(huì)直接報(bào)錯(cuò)并中斷加載后面的命令全都沒注冊成功。所以建議新文件先在命令行用APPLOAD手動(dòng)加載測試確認(rèn)無誤后再加入啟動(dòng)組。另外如果你的電腦安裝了殺毒軟件有些不太知名的殺軟會(huì)檢測LSP文件認(rèn)為它是可疑腳本。這都是正常的誤報(bào)但如果你在別人電腦上分發(fā)工具要提前做好解釋工作不然對方殺軟把文件給隔離了你排查半天還找不到原因。3.3 第三步在CUI中創(chuàng)建新工具欄現(xiàn)在LSP文件里的命令CL已經(jīng)被AutoCAD識別了接下來要做的是給它“穿一件按鈕的外衣”。在命令行輸入CUI打開“自定義用戶界面”窗口。左側(cè)是“自定義”選項(xiàng)卡列出了所有已加載的功能區(qū)面板、工具欄、菜單。在“工具欄”上右鍵選“新建工具欄”給它起個(gè)直觀的名字比如“我的常用工具”。這時(shí)候界面上會(huì)多出一個(gè)空的小浮動(dòng)工具欄。關(guān)鍵一步來了在CUI窗口上方有一個(gè)“命令列表”區(qū)域。點(diǎn)擊“新建”按鈕創(chuàng)建一個(gè)新命令。在這個(gè)新命令的屬性里你需要設(shè)置名稱自定義工具說明可選內(nèi)容宏^C^C^PCL這里^C^C的意思是連續(xù)發(fā)送兩次取消確保上一個(gè)命令徹底終止。^P讓命令行保持干凈執(zhí)行完命令后不打印額外提示。最后CL就是我們LISP里定義的命令名。這樣按鈕點(diǎn)擊時(shí)CAD執(zhí)行的就是CL命令。3.4 第四步把宏綁定到按鈕命令創(chuàng)建好之后它還在“命令列表”里躺著你要把它拖拽到剛才新建的工具欄上。在CUI對話框中間把剛才新建的命令直接用鼠標(biāo)拖到“我的常用工具”下一個(gè)帶文字的按鈕就出現(xiàn)在工具欄上了。默認(rèn)按鈕是個(gè)“笑臉”圖標(biāo)這顯然不專業(yè)。選中這個(gè)按鈕在下方的“按鈕圖像”區(qū)域可以編輯圖標(biāo)。AutoCAD自帶了很龐大的圖標(biāo)庫選擇合適的就行如果想畫一個(gè)獨(dú)特圖標(biāo)也可以點(diǎn)“編輯”打開簡單的位圖編輯器逐像素調(diào)整。這里有個(gè)非常實(shí)用的操作細(xì)節(jié)如果你編輯的是按鈕的宏而不是LISP本身修改后不需要重啟軟件CUI對話框點(diǎn)“應(yīng)用”“確定”按鈕就能立即生效。但如果你改了LISP函數(shù)則必須重新加載LSP文件否則按鈕執(zhí)行的是舊代碼。3.5 第五步測試、調(diào)整與打包分發(fā)測試分三步走命令行直接輸入CL確認(rèn)命令本身能正常工作點(diǎn)擊工具欄按鈕確認(rèn)宏傳遞無誤、結(jié)果和命令行一致重啟AutoCAD確認(rèn)LSP自動(dòng)加載和工具欄布局都保持正常。測試通過后如果想分發(fā)給同事你有兩種方式一種是把CUIX文件導(dǎo)出發(fā)給他們同時(shí)提供LSP文件另一種更推薦把LSP文件放到一個(gè)固定共享路徑比如公司服務(wù)器上讓所有人引用同一個(gè)路徑后續(xù)更新只需替換服務(wù)器上的文件大家重啟CAD就拿到最新版。這個(gè)思路對于團(tuán)隊(duì)標(biāo)準(zhǔn)化特別重要避免每個(gè)同事本地存一份最終代碼不一致的混亂情況。導(dǎo)出CUIX的方法在CUI對話框左上角右鍵你的工作空間選“導(dǎo)出”即可生成一個(gè).cuix文件。對方拿到后在CUI中“加載部分自定義文件”導(dǎo)入即可。4. 常見問題與排查技巧實(shí)錄4.1 命令找不到、函數(shù)未定義明明寫了defun c:CL也加載了文件但輸入CL提示未知命令。排查思路先看命令行有沒有報(bào)錯(cuò)。如果加載時(shí)報(bào)“語法錯(cuò)誤”或“列表已結(jié)束”最常見的原因是括號沒配對。AutoLISP所有括號都必須成對出現(xiàn)你可以用帶括號高亮的編輯器檢查或者在文件最末尾加一個(gè)(princ)作為安全結(jié)尾。再看函數(shù)名有沒有拼寫錯(cuò)誤。命令行輸入(C:CL)注意帶前綴C:和括號如果能返回#SUBR就說明函數(shù)已存在問題出在宏或輸入方式上。另外要注意defun定義的函數(shù)名區(qū)分大小寫嗎不區(qū)分但建議統(tǒng)一小寫避免混亂。4.2 按鈕點(diǎn)擊后沒有反應(yīng)按鈕宏是^C^C^PCL點(diǎn)擊后命令行沒有任何動(dòng)靜。這時(shí)候不要懷疑LISP先用命令行手動(dòng)輸入CL如果正常執(zhí)行說明宏有問題。常見的宏問題有三個(gè)^C寫成了^^C或^c必須是大寫C命令名前后有不可見的空格^P位置放錯(cuò)了如果放在CL后面會(huì)導(dǎo)致CL被^P吞掉。提示編寫宏時(shí)盡量讓宏內(nèi)容簡單干凈。我見過很多人喜歡在宏里塞一大串參數(shù)其實(shí)那種復(fù)雜宏完全沒有必要因?yàn)閰?shù)完全可以放進(jìn)LISP函數(shù)內(nèi)部。宏只需要干凈地調(diào)用一個(gè)命令復(fù)雜性一律交給代碼去處理。這個(gè)原則能幫你省下大量排查時(shí)間。4.3 不同版本AutoCAD的兼容性陷阱AutoLISP的語法非常穩(wěn)定從上世紀(jì)90年代到2023版核心函數(shù)幾乎沒有變化這一點(diǎn)優(yōu)勢巨大。但有兩個(gè)地方需要注意一是setvar系統(tǒng)變量不同版本默認(rèn)值不同。比如LTSCALE線型比例在新版本可能有不同初始值你的LISP如果依賴某個(gè)系統(tǒng)變量的默認(rèn)值在別人電腦上可能失效。標(biāo)準(zhǔn)做法是在腳本開始時(shí)(setvar CMDECHO 0)明確關(guān)閉命令回顯結(jié)束時(shí)恢復(fù)避免影響全局設(shè)置。二是工具欄自定義文件.cuix在不同版本之間可以導(dǎo)入但有些按鈕圖標(biāo)可能出現(xiàn)位移。通常不影響點(diǎn)擊使用只是看起來有點(diǎn)錯(cuò)位重設(shè)一下圖標(biāo)即可。特別說明我寫這篇內(nèi)容時(shí)測試環(huán)境是AutoCAD 2023中文版同樣的代碼在2014版、2016版、2020版上都跑過沒有遇到兼容性問題。但要提醒你如果你用的是某個(gè)非官方修改版AutoCAD的文件保護(hù)機(jī)制可能不完整CUI寫入可能會(huì)出問題這類環(huán)境我只能建議優(yōu)先使用官方版本。4.4 權(quán)限與安裝環(huán)境問題很多同事在公司電腦上使用時(shí)會(huì)遇到一類怪問題在自己電腦上很正常到了別人電腦上要么工具欄加載不出來要么按鈕點(diǎn)了沒反應(yīng)要么CAD像卡死了一樣。這種情況九成是權(quán)限問題。公司IT策略下普通用戶的“AppData”目錄有時(shí)候是受限的而AutoCAD的CUIX和啟動(dòng)組默認(rèn)寫入位置就在用戶配置目錄下。如果用戶對這些目錄沒有寫權(quán)限加載就會(huì)靜默失敗。解決方法有三種將LSP文件放到一個(gè)所有用戶都有讀權(quán)限的公共路徑例如C:\ProgramData\MyLisp通過啟動(dòng)組指向該路徑把CUIX文件放到公共路徑用“加載部分自定義文件”方式導(dǎo)入如果你的IT環(huán)境有統(tǒng)一的軟件分發(fā)機(jī)制用軟件部署工具批量下發(fā)配置這是最省事的方案。另一個(gè)環(huán)境問題是系統(tǒng)變量ACAD指向的支持路徑。如果你的LISP文件用了相對路徑調(diào)用其它文件比如需要讀取同目錄下的外部TXTAutoCAD不一定能在當(dāng)前目錄下找到。建議在LISP開頭動(dòng)態(tài)獲取當(dāng)前文件路徑用(getvar ACADPREFIX)拼接完整路徑再用findfile檢查文件是否存在這樣無論移動(dòng)到哪里都不會(huì)失靈。5. 一些容易忽略但能明顯提升體驗(yàn)的加分項(xiàng)5.1 按鈕的圖標(biāo)與提示文字默認(rèn)的按鈕就是一張笑臉放在工具欄上一眼望去看不出功能用久了還得靠記憶。好的工具欄設(shè)計(jì)應(yīng)該讓按鈕圖標(biāo)本身就能傳達(dá)功能。AutoCAD圖標(biāo)庫里有一個(gè)“圖層”分類可以直接借用如果我需要更精準(zhǔn)的表達(dá)我通常用系統(tǒng)自帶的圖標(biāo)編輯器把幾個(gè)基礎(chǔ)圖形拼起來比如“中心線”就畫一條紅色虛線直觀高效。按鈕的“說明”屬性也值得認(rèn)真填。鼠標(biāo)懸停在按鈕上時(shí)CAD底部狀態(tài)欄會(huì)顯示這段說明文字對剛接手你工具的同事來說是很大的幫助。我一般會(huì)在說明里寫清楚這個(gè)按鈕“做什么”、“在什么情況下使用”、“有沒有副作用”內(nèi)容控制在兩行以內(nèi)簡潔明了。5.2 給命令加一個(gè)安全兜底測試過很多次之后我發(fā)現(xiàn)真正的老手寫的LISP往往不是功能有多酷炫而是防御有多嚴(yán)密。比如一個(gè)批量打印的LISP剛加載時(shí)先檢查當(dāng)前是否處于模型空間如果用戶在布局里執(zhí)行就提示“請?jiān)谀P涂臻g運(yùn)行”如果當(dāng)前圖檔是只讀的就提示“以只讀模式打開禁止修改”。這些檢查邏輯其實(shí)很簡單關(guān)鍵是有沒有這個(gè)意識。最通用的兜底寫法是(if (and (setq ss (ssget ((0 . LINE))))) (progn ;; 這里執(zhí)行批量操作 ) (princ \n未選擇任何直線操作取消。) )其中ssget是選擇集的函數(shù)返回所有符合條件的實(shí)體。加一個(gè)if判斷結(jié)果是否為空集為空就提示取消用戶不會(huì)莫名其妙發(fā)現(xiàn)操作沒生效。5.3 構(gòu)建自己的函數(shù)庫而不是一次性腳本當(dāng)你寫了十幾個(gè)LISP后建議把通用功能抽取出來形成一個(gè)函數(shù)庫。比如“獲取用戶選擇的圖層名”“批量設(shè)置線寬”“檢測重復(fù)實(shí)體”這些功能幾乎每個(gè)工具都會(huì)用到。把它們單獨(dú)放進(jìn)一個(gè)Common.lsp放在啟動(dòng)組里第一個(gè)位置加載其它腳本加載時(shí)檢查是否有這些公共函數(shù)沒有就自動(dòng)加載。這樣做的理由很簡單你的腳本數(shù)量越多公共部分重復(fù)維護(hù)的成本越高。一個(gè)函數(shù)庫只改一處所有工具同時(shí)受益。這是我在經(jīng)歷了十幾份LSP文件各寫一份設(shè)置圖層邏輯的教訓(xùn)后總結(jié)出來的經(jīng)驗(yàn)一次重構(gòu)后面舒服很多。如果實(shí)在需要批量分發(fā)記得把LSP文件放到每臺(tái)電腦的Application Plugins目錄或者用CUIX打包成插件統(tǒng)一管理。我的個(gè)人習(xí)慣是在啟動(dòng)組里放一個(gè)init.lsp由它負(fù)責(zé)定位所有其他LSP文件并依次加載。這樣以后新增工具只需要改init.lsp里的一個(gè)列表不用去動(dòng)啟動(dòng)組配置也方便版本管理。