2012-12-17 52 views
3

意图是使用git grep作为M-x grep的命令,以及随之而来的所有缓冲区优势。所需的功能:我该如何改进Emacs lisp功能?

  • 它读取点作为默认值的字/件事(做,那种)
  • 它读取当前区域作为缺省参数,如果区域设置。

以下是我到目前为止的代码:

(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)))) 

我觉得像interactive位有相当笨拙,可以作出更好的。

回答

4

其实它看起来不错。除了你应该使用default' argument of读取字符串,并且bw-read-string-at-point中的interactive不应该在那里。或者更好,只需使用grep-tag-default即可。 以下是我想调整它:

(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))) 
+0

'grep-tag-default'从哪里来?我在Emacs 24.2中找不到它。编辑:其实没关系,明白了。由于某些原因'C-h f'找不到它。 –

+0

啊,是的,你可能需要'(require'grep)'来确保定义了'grep-tag-default'。 – Stefan

1

我会用read-from-minibuffer代替read-string

(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是零,以避免grep附加/dev/null到您的命令(git似乎并不喜欢太多)

+0

我会建议反对:'读string'一般可取'读从-minibuffer',并在上面的例子中,'读 - 从 - 迷你缓冲区'没有任何好处。 – Stefan

+0

@Stefan我对read-string的完整界面并不是很熟悉,但你说得对:在这种情况下'read-from-minibuffer'没有任何好处。然而,我还没有在文档中发现任何暗示“read-string”比'read-from-minibuffer'更好的东西。你会有任何资料记录吗? – Francesco

+1

不,实际上它还没有很好的记录。但'read-from-minibuffer'是一个低级函数,其他'read- *'函数在其上实现。在'read-string'的情况下,主要区别在于处理'default',你没有使用它,但推荐在Emacs(而不是'initial')中提供默认的方式。 – Stefan