原文位址: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)))