2012-12-17 103 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