这段时间在熟悉一套系统的代码,经常要查找某个变量或函数名在哪些文件中被引用到了 ,虽然在linux下面grep一下就行了,但要查看每处的上下文,还是得打开文件.还好用的是emacs,有什么不爽就自己扩展
刚用elisp时倒郁闷了一把,elisp貌视不支持尾递归(??还需查证) ,我一上来就用在scheme中惯用的过程自调用的方式来进行递归查找目录中的文件,结果很轻易就会超过elisp的最大求值嵌套深度,改为用elisp中的while则正常.
实现了search-direct和search-file二个函数,分别是查找指定目录和指定文件,查找结果会加上文件名和行号,内容在结果窗口显示,在结果行上回车则会自动打开相应文件并跳到相应行.不足还有很多,忙过这段时间再扩展了 :-) 保存下面的代码自己本地目录,再在.emacs中添加(require 'file-search) 就可以了
效果图:
file-search.el
;;; file-search.el
(defconst fs-file-search-buffer-name "*file-search*")
(defvar fs-file-list-length 0)
(defvar fs-file-search-str "")
(defvar fs-match-regexp "")
(defvar fs-file-search-keymap (make-sparse-keymap))
(define-key fs-file-search-keymap (kbd "RET") 'fs-result-choose)
(defface fs-file-name-face '((t (:foreground "red" :bold t :underline t)))
"Face used to highlight the file name")
(defface fs-line-face '((t (:foreground "green" :bold nil :underline nil)))
"Face used to highlight the line number")
;;查找列表中所有文件
(defun fs-search-list-file (list)
(while list
(let ((file-name (car list)))
(if (not (fil