如何改进此Emacs lisp函数?

如何改进此Emacs lisp函数?,emacs,elisp,Emacs,Elisp,其目的是使用git grep作为M-x grep的命令,以及随之而来的所有缓冲区好处。所需功能: 它读取点处的单词/事物作为默认值(完成,排序) 如果设置了区域,它将当前区域作为默认参数读取 以下是我目前掌握的代码: (defun bw-read-string-at-point () (interactive) (let ((word (word-at-point))) (set-text-properties 0 (length word) nil word) wo

其目的是使用
git grep
作为
M-x grep
的命令,以及随之而来的所有缓冲区好处。所需功能:

  • 它读取点处的单词/事物作为默认值(完成,排序)
  • 如果设置了区域,它将当前区域作为默认参数读取
以下是我目前掌握的代码:

(defun bw-read-string-at-point ()
  (interactive)
  (let ((word (word-at-point)))
    (set-text-properties 0 (length word) nil word)
    word))

(defun bw-git-grep (search-str)
  "Uses `git-grep` to find `search-str`"
  (interactive
   (list
    (read-string (format "Search for (%s): " (bw-read-string-at-point)))))
  (let ((search-str (if (= (length search-str) 0)
                        (bw-read-string-at-point) search-str)))
    (grep (concat "git --no-pager grep -i -I -nH --no-color --extended-regexp " search-str))))

我觉得那里的
交互式
位相当笨拙,可以做得更好。

我会使用
从微型缓冲区读取
,而不是
读取字符串

(defun bw-git-grep (pattern)
  (interactive
   (list
    (read-from-minibuffer
     "Search for: "
     (if (region-active-p)
         (buffer-substring-no-properties (region-beginning) (region-end))
       (thing-at-point 'word)))))

  (let* ((grep-command "git --no-pager grep -i -I -nH --no-color --extended-regexp ")
         (command      (concat grep-command pattern))
         (grep-use-null-device nil))
    (grep command)))

另外,您可能需要确保
grep use null device
为nil,以避免
grep
/dev/null
附加到您的命令中(这
git
似乎不太喜欢)

实际上,它看起来相当不错。除非您应该使用
read string的
default”参数,并且点
处的
bw read string中的
交互式
。或者更好,只需使用
grep-tagdefault
。 下面是我如何调整它的:

(defun bw-git-grep (search-str)
  "Uses `git-grep` to find `search-str`"
  (interactive
   (let ((default (grep-tag-default)))
    (list
     (read-string (format "Search for (default %s): " default)
                  nil nil default))))
  (grep (concat "git --no-pager grep -i -I -nH --no-color --extended-regexp " search-str)))

我建议不要这样做:
read string
通常比
read from minibuffer
更可取,在上面的例子中,“read from minibuffer”没有任何好处。@Stefan我不太熟悉
read string
的完整界面,但你是对的:
从minibuffer读取
在这种情况下没有任何好处。然而,我在文档中没有发现任何暗示
读取字符串
从minibuffer读取更可取的内容。你有没有资料可以证明这一点?没有,事实上,它还没有很好的证明。但是从微型缓冲区读取
是一个低级函数,其他
读取-*
函数都是在该函数之上实现的。在
读取字符串
的情况下,主要区别在于处理
默认值
,您没有使用它,但这是在Emacs中提供默认值的推荐方法(而不是
初始值
)。感谢
grep使用空设备
提示!
grep标签default
来自哪里?我在Emacs24.2中找不到它。编辑:其实没关系,明白了。由于某种原因,
C-h f
找不到它。啊,是的,您可能需要
(需要'grep)
,以确保定义了
grep标记默认值。