如何改进此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标记默认值。