Emacs 小技巧 高亮 修改所有同名符號

2022-04-28 22:18:22 字數 3597 閱讀 9130

(此篇面向初級使用者,寫的比較囉嗦,請中高階使用者見諒。

其實這篇的草稿是9月初寫的,躺在草稿箱裡面3個月了,最近工作和生活都比較忙,沒時間來整理格式 :-( )

emacs自帶hi-lock-mode (hi-lock.el),裡面提供了一下幾個很有用的命令:

使用時直接輸入上面命令或快捷鍵即可,不用先開啟 hi-lock-mode ,emacs會自動開啟。

使用時emacs會先問你要高亮什麼內容,如果你不想手工輸入的話,得事先拷貝好內容再在這裡貼上。

然後emacs會問你使用那種風格(face)來顯示高亮,除了hi-lock.el提供的 hi-yellow, hi-pink, hi-green 等顏色之外,你也可以使用emacs裡面其它的face。

要去除高亮,用 m-x unhighlight-regexp (m-s h u),它會自動提供當前已有條目(剛才通過上 述三個命令輸入的內容)供你選擇。

這個第三方庫其實是對hi-lock-mode的封裝,使得使用者用起來更方便:

這就跟vim使用者很喜歡的*和#鍵功能差不多了,我繫結的快捷鍵也是沿用了這兩個符號:

(require 'highlight-symbol) ;;use autoload' oridle-require' if you like

(global-set-key (kbd "m-s j") 'highlight-symbol-at-point)

(global-set-key (kbd "後兩個(c-*

, c-#)是為了應付連續按的場景的,單次按鍵比多次要方便一點。不過這兩個組合鍵在term(console, gnome-terminal, putty等)下面是沒法用的(我比較少有在term下用emacs,如果用得比較多,倒是可以考慮繫結到m-*和m-# 上)。

很多朋友很喜歡能夠自動高亮當前焦點所在的符號,當焦點移開之後又自動取消高 亮, idle-highlight.el 就是幹這個的。

將idle-highlight.el放到load-path內,然後在dotemacs裡面加入:

(autoload 'idle-highlight-mode "idle-highlight" "highlight the word the point is on" t)

使用時只要m-x idle-highlight-mode ret 就可以了。

如果想開啟檔案時自動開啟該功能 如果要自動對所有檔案都開啟該功能,在dotemacs裡面加入:

(add-hook 'find-file-hook 'idle-highlight-mode)

如果只對某些主模式開啟,則加入:

(add-hook 'emacs-lisp-mode-hook 'idle-highlight-mode) 

(add-hook 'python-mode-hook 'idle-highlight-mode)

(add-hook 'js-mode-hook 'idle-highlight-mode)

emacs 24裡面將所有程式語言的major mode做了變更,都變成繼承自prog-mode了,這種情況下只 需要這樣就可以對所有程式語言新增此功能(而其它文字編輯不受影響):

(add-hook 'prog-mode-hook 'idle-highlight-mode)

cedet裡面提供了乙個 semantic-idle-local-symbol-highlight-mode ,跟idle-highlight功能類 似,但依賴於cedet的語法解析功能。我不怎麼用cedet,所以不能給出評價。有興趣的可以看看emacs中文網的這篇 [用cedet瀏覽和編輯c++**] 裡面的 [相應說明]。

修改**的時候嚐嚐需要對函式名、變數名進行修改,這就需要對同一符號的多次出現 (occurrence)進行批量替換(這個活兒在重構裡面叫做rename method

或者rename field。

iedit.el可以部分實現這個目標。之所以說"部分"是因為它只是個編輯功能,只能應付單一檔案的 情況,做不到基於工程或者語法來修改所有呼叫到的地方。

iedit.el提供的iedit-mode是個臨時模式,使用方法如下:

1. 載入iedit.el,將iedit.el放到site-lisp目錄下,然後

a). 動態載入: m-x load-library ret iedit.el ret

b). emacs啟動時載入: 在dotemacs裡面加入:

(autoload 'iedit-mode "iedit" 

"edit multiple regions with the same content simultaneously." t)

2. 需要修改某個符號(函式名、變數名)時,將游標移動到該符號上,然後 m-x iedit-mode ret (或者按c-; 這是預設配置的快捷鍵)即可進入批量修 改模式,使用該符號的所有地方會被高亮。通過編輯修改該符號的名稱,所做改動會即時反饋到所有高亮的地方。

3. 修改完成後,重新輸入 m-x iedit-mode ret 退出此模式。

如前所說,iedit比較簡單,沒有語法分析能力,所以如果你乙個檔案裡有兩個類用了同名的變 量,它也區分不了,解決辦法是結合emacs narrowing來實現: emacs narrowing功能使得我們可以只編輯乙個檔案的一部分,而其它部分並不在可編輯範圍內。所以實現上述目標的方法是:

1. 選擇(mark)要修改的函式(c-m-h)或者類;

2. 輸入 m-x narrow-to-region (或者 c-x n n), 如果你是第一次使用這個功能,emacs 會問你是否要啟用該功能(因為這個功能會導致初學者暈頭,所以為防止誤入,預設被禁用了);

3. 好了,emacs現在只顯示你選中的那一塊**了,你現在做全buffer的替換,並不會影響檔案的其它部分:用上面的 m-x iedit-mode ret 來做替換吧;

4. 修改完成,再用c-; 退出iedit-mode

5. 用 m-x widen ret (或者 c-x n w) 回到編輯整個檔案的模式

參考: - emacs-fu: interactive replacement

* auto-highlight-symbol-mode

這是寫這篇文章時翻到的乙個擴充套件,看說明它用乙個el檔案把上述幾個功能都包含了,並不需要三個檔案:

我還沒有試過,有興趣的朋友自己試試吧。

* occur: 列出所有包含某個符號的行

用 m-x list-matching-lines ret (預設繫結到了m-s o) 然後輸入要查詢的符號即可。emacs會在乙個新的視窗列出結 果,可以用 m-g n和m-g p 跳轉到下一次、上一次出現的地方。(注: 此命令有個比較簡短的別名: occur ),

如果想將當前符號作為輸入,免去每次輸入的麻煩,可以用下面這個函式:

(require 'thingatpt)

(defun occur-at-point (nlines)

(interactive "p")

(occur (format "%s" (thing-at-point 'symbol)) nlines))

(define-key search-map "o" 'occur-at-point)

要深入研究一下occur的話:

ios修改textField的小技巧

textfield setvalue uicolor redcolor forkeypath placeholderlabel.textcolor textfield setvalue uifont boldsystemfontofsize 16 forkeypath placeholderlabe...

OpenCL優化小技巧 預建立所有Kernel

最近做了一些影象處理的演算法,跑在高通的開發板上,其中使用了opencl進行加速。在此過程中,也總結了幾個加速的小技巧。今天就來談其中乙個不太有用的小技巧 預建立所有kernel。第一次進行opencl加速時,我注意到,建立cl kernel時,會耗費幾毫秒到二十幾毫秒的時間。如果演算法中需要建立幾...

懶人的小技巧, 批處理修改IP

相信很多人都有這樣的麻煩,工作單位的ip網段與住的不一致,自己的筆記本在單位和回家的時候每次都要更改ip,很麻煩,菜鳥小羅偷個懶,做了個批處理來修改ip,方便一點.還有就是可以把工作的時候才需要啟動的服務 比如資料庫服務特別是oracle sqlserver 設定為手動,只有更換為單位ip的時候才啟...