到LSP實(shí)戰(zhàn))
簡(jiǎn)介Sublime Text 是一款面向程序員與文本編輯愛(ài)好者的高效代碼編輯器資源包適用于 Web 前端、Python、Java、C 等多語(yǔ)言開(kāi)發(fā)場(chǎng)景能幫助初學(xué)者快速上手、資深開(kāi)發(fā)者提升編碼效率。壓縮包共收錄 2000 個(gè)文件約 15.8MB以 798 個(gè) sublime-snippet 代碼片段、275 張 png 界面截圖、140 個(gè) py 腳本、114 個(gè) sublime-package 插件包為主另含 tmlanguage 語(yǔ)法定義、sublime-settings 配置、sublime-keymap 快捷鍵映射、tmtheme 主題及 psd 設(shè)計(jì)源文件等覆蓋插件、主題、語(yǔ)法與配置多個(gè)維度。目前已有 210 人學(xué)習(xí)下載。借助這些片段、插件與主題素材讀者可快速搭建個(gè)性化編輯環(huán)境體驗(yàn)多列編輯、Goto Anything、分割對(duì)比與正則搜索替換等核心功能并參考現(xiàn)成配置與腳本理解插件機(jī)制適合希望系統(tǒng)掌握 Sublime Text 工作流的開(kāi)發(fā)者查閱使用。1. Sublime Text 到底適合誰(shuí)從「秒開(kāi)」到「可編程編輯器」的真實(shí)定位如果你還在用 Sublime Text 只是因?yàn)樗鼏?dòng)快、界面干凈那其實(shí)只用了它三成能力。我見(jiàn)過(guò)太多人裝了 Sublime 之后插件一個(gè)沒(méi)配快捷鍵一個(gè)沒(méi)改最后抱怨「不就是個(gè)高級(jí)記事本嗎」。問(wèn)題不在工具在于沒(méi)搞懂它的定位Sublime Text 本質(zhì)是一個(gè)可編程的文本處理引擎啟動(dòng)快只是它的入場(chǎng)券真正拉開(kāi)差距的是多光標(biāo)、Goto Anything、命令面板和插件生態(tài)這套組合拳。這篇內(nèi)容面向三類人一是剛從記事本或 IDE 遷移過(guò)來(lái)、想搞清楚 Sublime 到底能干什么的新手二是天天要處理日志、配置、批量文本替換卻還在手動(dòng)重復(fù)操作的運(yùn)維和測(cè)試三是想給團(tuán)隊(duì)統(tǒng)一一套輕量編輯規(guī)范、又不想背 IDE 資源包袱的工程師。我會(huì)按「裝完先配什么 → 高頻操作怎么落地 → 插件怎么選不翻車(chē) → 出問(wèn)題怎么排查」的順序講每一步都給可復(fù)制的配置和命令不堆概念。2. 裝完 Sublime Text 先做這四件事配置、包管理、編碼與快捷鍵2.1 為什么第一件事是裝 Package Control 而不是調(diào)主題Sublime Text 原生功能已經(jīng)夠用但真正讓它變成生產(chǎn)力工具的是插件。而所有插件的入口是 Package Control。沒(méi)有它你只能手動(dòng)往Packages目錄丟文件升級(jí)和卸載全靠記憶這是血淚經(jīng)驗(yàn)。安裝方式用官方推薦的控制臺(tái)命令。打開(kāi) Sublime按CtrlMac 是Cmd調(diào)出控制臺(tái)粘貼對(duì)應(yīng)版本的安裝腳本。由于腳本內(nèi)容會(huì)隨版本更新我一般直接去 Package Control 官網(wǎng)復(fù)制當(dāng)前 Python 3 版本的那段代碼粘貼回車(chē)即可。安裝完成后CtrlShiftP輸入Install Package能彈出列表就說(shuō)明成功。裝完之后我建議立刻裝三個(gè)基礎(chǔ)插件PackageResourceViewer查看和覆蓋默認(rèn)配置、Terminus內(nèi)置終端省得來(lái)回切窗口、LSP語(yǔ)言服務(wù)后面講 Markdown 和代碼補(bǔ)全都靠它。安裝命令統(tǒng)一在命令面板里搜Package Control: Install Package然后輸入插件名回車(chē)。提示插件裝多了會(huì)拖慢啟動(dòng)。我的習(xí)慣是每裝一個(gè)插件重啟一次 Sublime觀察啟動(dòng)時(shí)間有沒(méi)有明顯變化超過(guò)兩秒就要排查。2.2 用戶配置該改哪幾項(xiàng)把默認(rèn)設(shè)置和用戶設(shè)置分開(kāi)Sublime 的配置分兩層Preferences → Settings打開(kāi)的是用戶設(shè)置Preferences → Settings - Default是默認(rèn)設(shè)置。永遠(yuǎn)只改用戶設(shè)置這樣升級(jí)不會(huì)丟配置。下面是我每臺(tái)機(jī)器必改的一份最小配置直接抄{ // 保存時(shí)自動(dòng)去除行尾空格避免 git diff 里全是空白變更 trim_trailing_white_space_on_save: true, // 確保文件末尾有換行很多 linter 會(huì)檢查這一條 ensure_newline_at_eof_on_save: true, // 顯示制表符和空格混用縮進(jìn)一眼就能看出來(lái) draw_white_space: all, // 字體和行高長(zhǎng)時(shí)間看代碼不累 font_size: 13, line_padding_top: 4, line_padding_bottom: 4, // 自動(dòng)換行寫(xiě) Markdown 和日志時(shí)很有用 word_wrap: auto, // 高亮當(dāng)前行 highlight_line: true, // 關(guān)閉自動(dòng)更新檢查內(nèi)網(wǎng)環(huán)境避免卡頓 update_check: false }參數(shù)說(shuō)明trim_trailing_white_space_on_save和ensure_newline_at_eof_on_save是團(tuán)隊(duì)協(xié)作的后悔藥能省掉大量無(wú)意義的 diff 爭(zhēng)論。draw_white_space設(shè)成all后Tab 和空格會(huì)顯示成小點(diǎn)Python 項(xiàng)目里混用縮進(jìn)導(dǎo)致的IndentationError基本一眼定位。update_check在內(nèi)網(wǎng)或代理環(huán)境建議關(guān)掉否則每次啟動(dòng)都會(huì)嘗試聯(lián)網(wǎng)拖慢速度。2.3 編碼與換行符跨平臺(tái)協(xié)作最容易翻車(chē)的地方Windows 默認(rèn) GBK、Linux 和 Mac 默認(rèn) UTF-8換行符 CRLF 和 LF 混用是團(tuán)隊(duì)協(xié)作里最隱蔽的坑。Sublime 右下角會(huì)顯示當(dāng)前文件的編碼和換行符點(diǎn)一下就能切換。但更穩(wěn)妥的做法是在用戶設(shè)置里固定{ default_encoding: UTF-8, default_line_ending: unix }default_encoding設(shè)成 UTF-8 后新建文件默認(rèn)就是 UTF-8不用每次手動(dòng)轉(zhuǎn)。default_line_ending設(shè)成unix表示 LFWindows 上如果必須用 CRLF改成windows即可。注意這兩個(gè)設(shè)置只影響新建文件已有文件還是按原編碼打開(kāi)需要手動(dòng)File → Save with Encoding轉(zhuǎn)換。2.4 必改的五個(gè)快捷鍵把重復(fù)操作壓到一次按鍵Sublime 默認(rèn)快捷鍵已經(jīng)不錯(cuò)但有幾個(gè)高頻操作我建議重映射減少手指移動(dòng)距離。打開(kāi)Preferences → Key Bindings在右側(cè)用戶鍵位里加[ // CtrlD 選中下一個(gè)相同詞默認(rèn)就有這里保留 { keys: [ctrld], command: find_under_expand }, // CtrlShiftK 刪除整行比默認(rèn)的 CtrlShiftK 更順手 { keys: [ctrlshiftk], command: run_macro_file, args: {file: res://Packages/Default/Delete Line.sublime-macro} }, // CtrlAltDown 向下復(fù)制當(dāng)前行 { keys: [ctrlaltdown], command: duplicate_line }, // CtrlShiftP 命令面板默認(rèn)就有強(qiáng)調(diào)一下 { keys: [ctrlshiftp], command: show_overlay, args: {overlay: command_palette} } ]邏輯說(shuō)明find_under_expand就是多光標(biāo)的核心按一次選中當(dāng)前詞再按一次選中下一個(gè)相同詞可以同時(shí)編輯多處。duplicate_line在寫(xiě)重復(fù)結(jié)構(gòu)比如批量生成配置項(xiàng)時(shí)非常高效。鍵位沖突時(shí) Sublime 會(huì)提示按提示調(diào)整即可。3. 多光標(biāo)與 Goto Anything把批量文本處理壓進(jìn)三秒3.1 多光標(biāo)的四種進(jìn)入方式與適用場(chǎng)景多光標(biāo)是 Sublime 的招牌但很多人只會(huì)CtrlD。實(shí)際有四種進(jìn)入方式對(duì)應(yīng)不同場(chǎng)景第一種CtrlD逐個(gè)選中相同詞適合變量重命名、批量替換少量重復(fù)項(xiàng)。第二種CtrlShiftL把當(dāng)前選中的多行拆成多光標(biāo)適合給每行加前綴后綴。第三種按住Ctrl用鼠標(biāo)點(diǎn)選多個(gè)位置適合不連續(xù)的零散編輯。第四種AltShift方向鍵做列選擇適合對(duì)齊表格或批量改縮進(jìn)。我處理日志時(shí)最常用的是CtrlShiftL先用正則選中所有匹配行再拆成多光標(biāo)一次性加時(shí)間戳前綴。比如把一堆 IP 地址批量改成deny ip;格式選中所有 IP 行CtrlShiftL然后輸入deny和;三秒搞定。3.2 Goto Anything 的三個(gè)前綴、#、:CtrlP打開(kāi) Goto Anything這是 Sublime 里最被低估的功能。它支持三個(gè)前綴輸入跳轉(zhuǎn)到當(dāng)前文件的符號(hào)函數(shù)、類、Markdown 標(biāo)題寫(xiě)長(zhǎng)文件時(shí)比滾動(dòng)快十倍。輸入#在當(dāng)前文件內(nèi)搜索文本相當(dāng)于輕量級(jí)查找。輸入:跳轉(zhuǎn)到指定行號(hào)比如:128直接到第 128 行。組合用法更狠文件名符號(hào)名可以跨文件跳轉(zhuǎn)。比如輸入configdatabase直接跳到config.py里的database函數(shù)。這個(gè)功能在大型項(xiàng)目里定位代碼比 IDE 的跳轉(zhuǎn)還快因?yàn)樗灰蕾囁饕兾谋酒ヅ洹?.3 用正則做批量替換一個(gè)真實(shí)日志清洗例子假設(shè)你有一份 Nginx 日志格式如下想提取所有狀態(tài)碼為 500 的請(qǐng)求路徑192.168.1.10 - - [10/Jan/2025:12:00:01] GET /api/user/1 HTTP/1.1 500 1234 192.168.1.11 - - [10/Jan/2025:12:00:02] POST /api/order HTTP/1.1 200 567 192.168.1.12 - - [10/Jan/2025:12:00:03] GET /api/user/2 HTTP/1.1 500 890按CtrlH打開(kāi)替換勾選左下角.*啟用正則查找框輸入.*(GET|POST) (\S).* 500 .*替換框輸入$2點(diǎn)Replace All就能把所有 500 請(qǐng)求的路徑提取出來(lái)。邏輯說(shuō)明(GET|POST)捕獲方法(\S)捕獲路徑$2引用第二個(gè)捕獲組。注意 Sublime 的正則默認(rèn)是貪婪匹配.*會(huì)盡量多吃字符所以模式要寫(xiě)精確否則容易匹配錯(cuò)行。注意正則替換前先CtrlZ能撤銷但批量替換后建議立刻CtrlS保存前先看一眼結(jié)果避免誤替換。4. 插件怎么選不翻車(chē)Markdown、LSP 與配置同步4.1 查看 Markdown 文件原生預(yù)覽與插件方案熱搜里「sublime text 查看markdown文件」是高頻需求。Sublime 原生不提供 Markdown 渲染預(yù)覽但有兩種成熟方案。第一種用MarkdownPreview插件。裝完后按CtrlShiftP輸入Markdown Preview: Preview in Browser會(huì)在瀏覽器里打開(kāi)渲染后的 HTML。它支持 GitHub 風(fēng)格和標(biāo)準(zhǔn) Markdown配置項(xiàng)在Preferences → Package Settings → Markdown Preview → Settings里可以設(shè)github_flavored: true啟用 GFM。第二種用LSP加marksman語(yǔ)言服務(wù)器獲得實(shí)時(shí)語(yǔ)法檢查和補(bǔ)全但不做渲染預(yù)覽。我一般兩個(gè)都裝寫(xiě)的時(shí)候用 LSP 檢查語(yǔ)法要看效果時(shí)用 MarkdownPreview 開(kāi)瀏覽器。配置 MarkdownPreview 的關(guān)鍵參數(shù){ github_flavored: true, enable_mathjax: true, enable_uml: true, browser: default }enable_mathjax支持 LaTeX 公式enable_uml支持 PlantUML 圖。browser設(shè)成default用系統(tǒng)默認(rèn)瀏覽器也可以指定 Chrome 路徑。4.2 LSP 配置讓 Sublime 擁有接近 IDE 的補(bǔ)全LSP 插件本身只是客戶端需要配合各語(yǔ)言的 language server。以 Python 為例先確保系統(tǒng)裝了pyrightpip install pyright然后在 Sublime 里CtrlShiftP輸入LSP: Enable Language Server Globally選pyright。之后打開(kāi).py文件底部狀態(tài)欄會(huì)顯示 LSP 狀態(tài)補(bǔ)全、跳轉(zhuǎn)定義、查看引用都能用。LSP 的配置文件在Preferences → Package Settings → LSP → Settings常用參數(shù){ clients: { pyright: { enabled: true, command: [pyright-langserver, --stdio], selector: source.python } }, log_stderr: true }log_stderr設(shè)為 true 時(shí)LSP 的報(bào)錯(cuò)會(huì)輸出到 Sublime 控制臺(tái)排查 language server 啟動(dòng)失敗時(shí)必開(kāi)。selector決定哪些文件類型觸發(fā)這個(gè) serverPython 就是source.python。4.3 配置同步換機(jī)器不丟設(shè)置Sublime 沒(méi)有官方云同步但可以用Sync Settings插件把配置同步到 Git 倉(cāng)庫(kù)或網(wǎng)盤(pán)。裝完后在命令面板搜Sync Settings: Create Backup它會(huì)打包Packages/User目錄。恢復(fù)時(shí)用Sync Settings: Restore Backup。我一般直接手動(dòng)把Packages/User目錄軟鏈到 Dropbox 或 Git 倉(cāng)庫(kù)這樣所有機(jī)器共享同一份配置。路徑在Preferences → Browse Packages里能找到。注意Package Control.sublime-settings里記錄了已裝插件列表同步這個(gè)文件后新機(jī)器上裝好 Package Control 會(huì)自動(dòng)提示安裝缺失插件。5. 避坑與排查Sublime Text 最常見(jiàn)的五個(gè)翻車(chē)現(xiàn)場(chǎng)5.1 插件裝完不生效命令面板搜不到現(xiàn)象Package Control: Install Package顯示安裝成功但命令面板里搜不到插件命令。原因通常是插件依賴的 Python 包沒(méi)裝或者插件本身不兼容當(dāng)前 Sublime 版本比如只支持 ST3 的插件裝在 ST4 上。解決先看控制臺(tái)有沒(méi)有報(bào)錯(cuò)Ctrl如果有ImportError手動(dòng)pip install缺失的包如果插件明確標(biāo)注只支持 ST3去 GitHub 找 ST4 分支或替代插件。5.2 中文亂碼打開(kāi)文件全是問(wèn)號(hào)或方塊現(xiàn)象打開(kāi) GBK 編碼的中文文件顯示亂碼。原因Sublime 默認(rèn)按 UTF-8 解碼遇到 GBK 就翻車(chē)。解決右下角點(diǎn)擊編碼選Reopen with Encoding → GBK文件正常顯示后再File → Save with Encoding → UTF-8轉(zhuǎn)成統(tǒng)一編碼。批量處理時(shí)可以用ConvertToUTF8插件它能自動(dòng)檢測(cè)編碼并轉(zhuǎn)換。5.3 多光標(biāo)編輯后撤銷不回去現(xiàn)象用CtrlShiftL批量編輯后按CtrlZ只撤銷了最后一次輸入前面的改動(dòng)還在。原因多光標(biāo)編輯在 Sublime 里算一次操作但如果你中途切換了選擇方式歷史記錄會(huì)斷開(kāi)。解決批量操作前先CtrlS保存一次出問(wèn)題直接File → Revert回滾到保存點(diǎn)。這是最穩(wěn)的后悔藥。5.4 啟動(dòng)越來(lái)越慢打開(kāi)文件卡頓現(xiàn)象Sublime 啟動(dòng)要五六秒打開(kāi)大文件卡住。原因插件裝太多或者某個(gè)插件在啟動(dòng)時(shí)掃描全項(xiàng)目。解決Preferences → Settings里加index_files: false關(guān)閉文件索引或者用Package Control: Disable Package逐個(gè)禁用插件排查。大文件超過(guò) 10MB建議用View → Syntax → Plain Text打開(kāi)避免語(yǔ)法高亮拖慢渲染。5.5 快捷鍵沖突按了沒(méi)反應(yīng)現(xiàn)象自定義快捷鍵后按下去沒(méi)反應(yīng)或觸發(fā)了別的命令。原因和默認(rèn)鍵位或其他插件鍵位沖突。解決Preferences → Key Bindings里搜沖突的鍵位看哪個(gè)命令先綁定。Sublime 的規(guī)則是用戶鍵位覆蓋默認(rèn)鍵位但插件之間沒(méi)有優(yōu)先級(jí)后加載的插件可能覆蓋前面的。用CtrlShiftP輸入Key Bindings打開(kāi)默認(rèn)鍵位表對(duì)照排查。6. 用 Project 和 Build System 把 Sublime 變成輕量工作臺(tái)6.1 Project 配置一個(gè)窗口管理多目錄Sublime 的 Project 功能能把多個(gè)不相關(guān)目錄放進(jìn)同一個(gè)窗口適合微服務(wù)或前后端分離項(xiàng)目。Project → Add Folder to Project添加目錄后Project → Save Project As存成.sublime-project文件。這個(gè)文件是 JSON 格式可以手動(dòng)編輯{ folders: [ { path: /home/user/backend, folder_exclude_patterns: [__pycache__, .git, node_modules] }, { path: /home/user/frontend, folder_exclude_patterns: [dist, .git] } ], settings: { tab_size: 4, translate_tabs_to_spaces: true } }folder_exclude_patterns把不需要索引的目錄排除能明顯加快 Goto Anything 的搜索速度。settings里的配置只對(duì)當(dāng)前項(xiàng)目生效不污染全局設(shè)置。我一般把.sublime-project提交到 Git團(tuán)隊(duì)共享同一套目錄結(jié)構(gòu)和縮進(jìn)規(guī)則。6.2 Build System一鍵跑腳本和測(cè)試Tools → Build System → New Build System可以自定義構(gòu)建命令。比如一個(gè) Python 項(xiàng)目的測(cè)試命令{ cmd: [python, -m, pytest, -v, $file], selector: source.python, working_dir: $project_path, file_regex: ^(.?):(\\d):(\\d): (.*)$ }cmd是執(zhí)行的命令$file表示當(dāng)前文件。working_dir設(shè)成$project_path保證在項(xiàng)目根目錄運(yùn)行。file_regex解析報(bào)錯(cuò)輸出按F4能直接跳到出錯(cuò)行。保存為PythonTest.sublime-build然后Tools → Build System選中它按CtrlB就能跑測(cè)試。6.3 一個(gè)我用了五年的習(xí)慣用 Snippet 固化重復(fù)代碼Sublime 的 Snippet 功能能把常用代碼片段變成快捷輸入。Tools → Developer → New Snippet寫(xiě)一個(gè) Python 日志初始化片段snippet content![CDATA[ import logging logging.basicConfig( levellogging.INFO, format%(asctime)s [%(levelname)s] %(message)s ) logger logging.getLogger(__name__) ${0} ]]/content tabTriggerloginit/tabTrigger scopesource.python/scope /snippet保存到Packages/User/snippets/目錄后綴.sublime-snippet。之后在 Python 文件里輸入loginit按 Tab整段代碼就出來(lái)了。${0}是光標(biāo)最終位置${1}、${2}可以做多位置跳轉(zhuǎn)。這個(gè)習(xí)慣幫我省掉了大量重復(fù)敲日志初始化的時(shí)間也保證了團(tuán)隊(duì)日志格式統(tǒng)一。我踩過(guò)最大的坑是早期把 Snippet 和插件混在一起管理升級(jí) Sublime 時(shí)全丟了。后來(lái)養(yǎng)成習(xí)慣所有自定義內(nèi)容都放在Packages/User下并且用 Git 管理這個(gè)目錄。換機(jī)器時(shí) clone 下來(lái)十分鐘恢復(fù)全部環(huán)境。希望幫到你。本文還有配套的精品資源點(diǎn)擊獲取