幫你精通Emacs:兩枚核彈級的應用及求問英雄帖
多年以后,面對臺下五彩斑斕的Jetbrain和Vscode用戶,這位曾經的資深的vim追隨者將會回想起在本論壇里見識Emacs核彈級應用的這個遙遠的下午(北京時間)。
一、第一枚核彈
幾個月前讀到下面的帖子,內心的激蕩似乎至今余波未平。
- counsel-rg 出結果之后,按 C-c C-o 進入 ivy-occur,然后按 w 進入編輯模式,然后 M-x % 批量替換,然后 C-x C-s 保存。
- 這是大招。被稱為核武器級別的技巧(
- https://sam217pa.github.io/2016/09/11/nuclear-power-editing-via-ivy-and-ag/)。值得深入鉆研。可以見 https://blog.binchen.org/posts/emacs-is-easy-if-you-read-code.html 研究相關的occur的技術。
沖破當時思維藩籬的有三點:
第一點: counsel-rg 搜索結果的mini-buffer,不能全屏展示。

在 mini-buffer 中 按鍵 C-0 1,什么都不會發生,這個痛點困擾許久。不曾想,ivy-occur輕松解決。按鍵 C-c C-o 之后,mini-buffer立刻懸停住,當時停在下面的界面中,端玩了好久。
這是一種怎樣的體驗呢?你想象一下“大鬧天宮”中的蟠桃園,孫悟空朝著前來采摘蟠桃的七仙女,口揭咒語,念一聲“定!”,接著這只沒教養的野猴子飛身上去,將這七位神仙姐姐挨個挨個,仔仔細細瞧得個清楚,看得個明白。
然后,便可以 C-0 1 全屏。

image961×721 189 KB
第二點:竟然能對搜索結果二次編輯,在mini-buffer窗口中按鍵 w h或者 C-x C-q 調用
ivy-wgrep-change-to-wgrep-mode,能夠直接對結果作修改。

以我有限的認知,感覺似乎一道閃電劈下,無機的機械體與有機的生命體之間的界限徹底打破,上一回類似的感受還是在dired中用這個模式的那一刻。
- 項目 步步為營,零秒精通Emacs 的第三章“03.God’
- s-Eyes-and-Hands-by-Dired-and-Bookmarks” 宕延半年多,遲遲寫出來。因為始終沒有思路,怎樣寫好司空見慣簡單,而往往不見其革命性突破的Dired。 我希望別人從這篇文章的視角審視dired的時候,會第一時間發出“哇!”的一聲。就如每時每刻的呼吸,在幼兒園的某一天,我們突然知道“哇,原來空氣存在”。 Take everything for granted 的朋友請務必忍耐不要留言。 亙古以來,有機世界與無機世界之間有一道無法跨越的鴻溝。上帝吹入生命而成有機,而礦物則是沒有“活力”的無機物。因此,無機物與有機物毫不相干,無機物只能制造無機物,似乎正如石頭原料只能制造出更加精美的石頭,卻萬萬不能生產出“天價豬肉”。 然而,公元1828年,上帝改變了主意,人類跨越天塹。 1.跨越鴻溝
第三點,在編輯模式下,執行 replace-regex替換。

搜索出來的結果立即完成替換。這一點,平淡無奇,常見常用,我可能就此復制粘帖出來,用在別處。
神奇的是,當 C-c C-c 保存之后,所有源文件中的關鍵詞同時被修改好。
這一點震撼,就如我從上海黃浦江口,舀了一瓢水喝,哪曾想,竟然影響到萬里之外寧夏的三江源地區干涸了。
以上三點,就是個人對multi-editing這項核彈級應用,彼時彼刻的直覺感受。
這一項能在對Emacs傳道布教的時候用到,一拿出手,核彈之下,灰飛煙滅,焦土不存。
二、第二枚核彈
前兩天讀到另外的帖子,簡單的設置時候就能從wsl2-gui-emacs打開原生的windows程序。
- # 先設置 ~/.zshrc
- # fix interop
- fix_wsl2_interop() {
- for i in $(pstree -np -s $ | grep -o -E '[0-9]+'); do
- if [[ -e "/run/WSL/${i}_interop" ]]; then
- export WSL_INTEROP=/run/WSL/${i}_interop
- fi
- done
- }
- ~/.emacs.d/bin/doom env > /dev/null 2>&1
- # 然后定義自動打開的函數
- # autoload
- (defmacro wsl--open-with (id &optional app dir)
- (defun (intern (format "wsl/%s" id)) ()
- (interactive)
- (wsl-open-with ,app ,dir)))
- (defun wsl-open-with (&optional app-name path)
- "Send PATH to APP-NAME on WSL."
- (interactive)
- (let* ((path (expand-file-name
- (replace-regexp-in-string
- "'" "\\'"
- (or path (if (derived-mode-p 'dired-mode)
- (dired-get-file-for-visit)
- (buffer-file-name)))
- nil t)))
- (command (format "%s `wslpath -w %s`" (shell-quote-argument app-name) path)))
- (shell-command-to-string command)))
- (wsl--open-with open-in-default-program "explorer.exe" buffer-file-name)
- (wsl--open-with reveal-in-explorer "explorer.exe" default-directory)
這項配置對我的核彈轟炸余波,現在還嗡嗡作響。
三、求更多核彈轟炸
基于以上兩枚核彈,請教諸位,您覺得,您正在用的 emacs 功能,哪些是核彈級別的呢?
只要你自己覺得就行,哪怕 1+1 =2,簡要說明下理由,咱也感激不盡。
這些收集起來的核彈,日后就是我們布道Emacs的彈藥庫。
另外,感謝捧場,Master-Emacs這個小小的repo眼看著要破200stars了。
- https://github.com/AbstProcDo/Master-Emacs-From-Scratch-with-Solid-Procedures
【編輯推薦】