我如何設定 Emacs 來寫 Perl 程式

作者:   發佈於: ,更新於:   #perl #emacs

偶然讀到 ~nicholasbhubbard 的文章,發現在調整 Emacs 方面跟我最近的做法有點類似。至少主要幾項重點都一樣。

使用 Emacs 28 內附的 cperl-mode.el

如果系統內的 Emacs 比 28 還舊,就取 emacs.git 抓一份新的 cperl-mode.el 回來用。

縮排以四格爲單位

且避免讓跨行的 () 內容過度縮排。如果一樣是以四格爲單位,寫 lisp 時的慣例是跨行 S-exp 的內容縮到比其左括號更進一級的位置。如果左括號位置在 n,那下一行至少是 n + 4。但這條規則用來替 C / Perl 縮排的話真的會怪怪的。總合起來最少需要調整三個變數:

(setq cperl-indent-level 4)
(setq cperl-indent-parens-as-block t)
(setq cperl-close-paren-offset (- cperl-indent-level))

在排程式碼之時基本上都是讓 cperl 以其自己的規則去排。但最近在試用 format-all + perltidy。perltidy 似乎對不少特定類型的程式碼沒轍,也太好調整(個人意見),雖然斷斷續續有在用,但是一直沒有調出一組夠好的參數。最近在考慮於 CI 中讓 reviewdog 去跑 perltidy,試著讓縮排風格不同的大家至少能避免在這件事上花去太多討論時間。以滿足協作這個目的而言,也有採用 editorconfig。

format-all 的好處它一律依靠外部工具來縮排,完全不依靠 Emacs 本體。而那外部工具基本上就是個社群已經熟悉的工具。若是 cperl-mode 則用 perltidy,若是 kotlin-mode 則用 ktlint。所以如果有人用 vim,也不會在縮排設定這件事情上面產生不必要的變更。

(use-package format-all
  :config
  (add-hook 'prog-mode-hook 'format-all-mode))

在專案內遊走(code navigation)

目前覺得最好用的是 rg + dumb-jump。有嘗試使用 language server,不過還沒讓它成功過。至少依照原文件來弄的話,無法直接在我的系統中管用。猜想是跟 perlbrew 環境慣例不太合拍。但尚無仔細除錯下去的打算。rg + dumb-jump 基本上就又快又好用了。

我用 use-package,與 dumb-jump 相關的設定就這幾行:

(use-package dumb-jump
  :config (add-hook 'xref-backend-functions #'dumb-jump-xref-activate)
  :custom (dumb-jump-selector 'ivy))

而目前在以檔名找檔案是使用 fzf:

(use-package fzf
  :bind ("C-c f" . my/fzf-current-project))

開終端機

要跑指令時,目前是用 vterm + vterm-toggle 與系統上的隨便甚麼終端機混用。vterm 相關的設定爲這幾行:

(use-package vterm)
(use-package vterm-toggle
  :bind
  ("s-'" . 'vterm-toggle)
  ("H-'" . 'vterm-toggle)
  :custom (vterm-toogle-fullscreen-p t))

綁了兩組不同的呼叫鍵給 vterm-toggle 函式的原因是讓 macOS 與 Linux 上都能通用。在同一把 Atreus 鍵盤 上,s-'H-' 都是代表同樣的兩個鍵。只是同一個鍵碼在 Linux 上被抓成 s-',在 macOS 上則對應到 H-'

結論

跟許多人一樣,我有點用不慣那種會主動在畫面上提供一大堆提示的編輯器 / IDE。我覺得那很讓人分心,如果不小心點到,還得想辦法恢復原狀。因此在 Emacs 的設定方面,一向都也是維持精簡。長年下來這套設定大致上很管用。雖然不見得能讓電腦提供最大程度的協助,但是能夠把一些瑣瑣碎碎的小問題變不見就很有幫助了。