天天看點

Emacs 中的查找

原文位址:http://emacser.com/ann77/Emacs/EmacsSearch.html

最基本的東西

C-s 開始正向查找

C-r 開始方向查找

這兩個指令進入了查找模式,在 Emacs 中的術語叫做 Incremental Search , 也就是在你輸入要 查找的字元的時候,同時高亮顯示找到的部分。

在查找模式下的一些操作

下面的操作都是先按 C-s 或者 C-r 後, 進入 Incremental Search Mode 之後的操作。

C-r , C-s , 分别是向前查找和向後查找目前輸入的内容。

如果目前内容是空的,也就是說你連續兩次輸入 C-s ,那麼就是 “查找下一個 (Find next)”的 操作。第一次是C-s 把你帶入了 Incremental Search Mode , 第二次的 C-s 表示查找上一次查 過的東西。 C-r 類似,隻不過方向相反。

C-w 查找光标除所在的單詞

例如, 你可以輸入 C-r 然後馬上輸入 C-w , 光标所在位置的單詞就自動變成了要查找的内容。

多次輸入 C-w 後面的單詞就會一個一個 的變成了查找内容一部分。

C-w 還可以和上面介紹的 C-s C-r 配合使用。C-s 進入 Incremental Search Mode. 然後輸入 void f 然後光标會停留在一個 void f 的單詞上,也許是 void far ,然後用 C-s 或者 C-r 找 到某個 void f 的地方,然後 C-w 就可以把 f 後面的單詞補全了。

C-y 把光标所在位置到行尾的部分作為查找内容

和 C-w 類似,隻不過輸入的不是一個單詞, 而是整整一行。

M-y 把 kill ring 中的東西輸入為目前要查找的内容

M-c 切換大小寫敏感。

M-r 切換是普通查找還是正規表達式查找。

M-e 編輯要查找的内容

Incremental Search 會随着使用者的輸入不斷的改變光标的位置,有的時候很讨厭,那麼就可以 M-e 編輯要查找的内容,然後按 Enter 回到 Incremetal Search 。

M-n M-p 浏覽查找曆史紀錄

可以查找以前 查找過的内容。

C-q C-j 查找多行文字。

如果你要的查找的内容是多行文字,也就是說,查找内容中含有換行字元 C-j 但是, Enter 鍵又 作為結束查找的操作,一按 Enter 就退出了查找模式了。那麼 C-q C-j 可以解決這個問題。 可 以檢視 如何輸入特殊的控制字元 。

用 Nonincremental Search 查找

如果不習慣 Incremetal Search 的方式,那麼可以 C-s <RET> ,也就是按了 C-s 之後,馬上按 一個回車,就用 Nonincremental Search 的方式查找,這種查找方式和普通的編輯器幾乎一樣。

使用 moccur 在所有打開的檔案内查找

本來 M-x occur 可以在一個 buffer 的查找某一個正規表達式。 moccur 提供更加強大 的功能。安裝了 moccur 之後 ,如果進入 incremetal 查找功能,除了上面介紹的一些 功能,有多了兩個新的功能。下面的操作都是先按 C-s 或者 C-r 後 進入 Incremental Search Mode 之後的操作。

M-o, 小寫的 o , 列出來目前 buffer 内的所有查找内容

M-O, 大寫的 O , 列出來所有打開的 buffer 中出現的查找内容。

安裝 moccur 的方法。下載下傳 color-moccur.el, 然後按照檔案頭的提示或者參考 Emacs 安裝一個擴充包的方法

在多個檔案中查找

find-dired

運作外部指令 find , 産生檔案清單,然後進入 dired 模式。

find-grep-dired

運作外部指令 find,用 grep 過濾檔案, ls 産生目錄清單,然後進入 dired 模式,這樣 列出所有包含某些字元的檔案清單。可以使用 dired-do-query-replace-regexp 在檔案列 表中查找并替換。可以遞歸所有子目錄。可以用各種條件過濾檔案,詳細可以檢視 find 命 令的幫助。

grep

在目前目錄中查找指定的 regexp 。

grep-find

運作 find , grep ,然後産生類似于 compile 的結果,可以檢視哪些檔案在什麼地方包含 了比對了指定的 regexp 。用 C-x ` 浏覽結果。可以遞歸所有子目錄。,詳細可以檢視 find 指令的幫助。

dired-do-query-replace-regexp

在任何 dired 模式下,對于所有帶有标記的檔案進行查找替換。

替換

在 transient mode 下,如果 region 是激活狀态下,那麼就調用 query-replace-selection , 這個函數和 query-replace 幾乎完全一樣,不同的是, query-replace-selection 用目前選擇的 region 作為被替換的部分,而不是等使用者輸入。

(defun query-replace-selection (to-string &optional delimited start end)

"query reqlace the current selection in transient mark mode."

(interactive (list

(read-from-minibuffer (format "Query replace %s with: "

(buffer-substring (point) (mark)))

nil nil nil

query-replace-to-history-variable

(buffer-substring (point) (mark))

t)

nil nil nil

))

(perform-replace (buffer-substring (point) (mark)) to-string t nil delimited nil nil start end))

(wcy-define-2bind-transient-mode

wcy-query-replace-or-query-replace-selection

'query-replace-selection

'query-replace)

(global-set-key (kbd "M-%") 'wcy-query-replace-or-query-replace-selection)

wcy-define-2bind-transient-mode 的定義參見 其他編輯技巧 中的 C-w 部分。

;; 在 C-s 進入 incremental search 的時候, 按 M-i , 替換目前查找内容

(define-key isearch-mode-map (kbd "M-i") 'isearch-query-replace-current)

(defun isearch-query-replace-current ()

"replace current searching string."

(interactive)

(let ((case-fold-search isearch-case-fold-search)

(from-string isearch-string))

(if (not isearch-success)

(message "search string not found")

(progn

(isearch-exit)

(goto-char (min (point) isearch-other-end)))

;;(isearch-abort)

(perform-replace

from-string

(read-from-minibuffer (format "Query replace %s with: "

from-string)

from-string nil nil

query-replace-to-history-variable

from-string

t)

t ; query flag

isearch-regexp

nil))))

;; 進入 incremental search mode 之後,有些指令可以根據光标所在位置補全要查找内容,

;; 例如 C-w 可以補全一個詞。但是如果按多了 C-w 就不能回退了,而且不能精确定位,

;; 下面的鍵綁定重新定義了一些常用的光标移動指令,根據光标移動,自動補齊查找内容,

;; 例如 C-f 自動補齊光标處的一個字元。

(define-key isearch-mode-map (kbd "C-e") 'isearch-move-point)

(define-key isearch-mode-map (kbd "C-a") 'isearch-move-point)

(define-key isearch-mode-map (kbd "M-e") 'isearch-move-point)

(define-key isearch-mode-map (kbd "M-a") 'isearch-move-point)

(define-key isearch-mode-map (kbd "C-M-e") 'isearch-move-point)

(define-key isearch-mode-map (kbd "C-M-a") 'isearch-move-point)

(define-key isearch-mode-map (kbd "C-f") 'isearch-move-point)

(define-key isearch-mode-map (kbd "C-b") 'isearch-move-point)

(define-key isearch-mode-map (kbd "M-f") 'isearch-move-point)

(define-key isearch-mode-map (kbd "M-b") 'isearch-move-point)

(define-key isearch-mode-map (kbd "C-M-f") 'isearch-move-point)

(define-key isearch-mode-map (kbd "C-M-b") 'isearch-move-point)

(defun isearch-move-point ()

(interactive)

(when isearch-success

(save-excursion

(let ((overriding-terminal-local-map nil)

(old-point (or isearch-other-end (point))))

(call-interactively (key-binding (this-command-keys)))

(setq isearch-string (buffer-substring-no-properties old-point

(point))

isearch-message

(mapconcat 'isearch-text-char-description

isearch-string "")

;; Don't move cursor in reverse search.

isearch-forward (cond

((< old-point (point)) t)

((> old-point (point)) nil)

((= old-point (point)) isearch-forward))

)))

(isearch-search-and-update)))