ag.el
changeset 1493 d242edfd1321
parent 1492 8ebcfb7fc718
child 1496 4b336f352950
equal deleted inserted replaced
1492:8ebcfb7fc718 1493:d242edfd1321
       
     1 ;;; ag.el --- Ag frontend
       
     2 
       
     3 ;;; Commentary:
       
     4 ;;
     1 
     5 
     2 (defun my/ag-goto ()
     6 (defun my/ag-goto ()
     3   (interactive)
     7   (interactive)
     4   (save-excursion
     8   (save-excursion
     5     (let ( lineno end )
     9     (let ( lineno end )
    15           (goto-char (point-min)))
    19           (goto-char (point-min)))
    16         (search-forward-regexp "^.*")
    20         (search-forward-regexp "^.*")
    17         (find-file-other-window (match-string 0))
    21         (find-file-other-window (match-string 0))
    18         (goto-line lineno)))))
    22         (goto-line lineno)))))
    19 
    23 
       
    24 (defun my/ag-kill-process ()
       
    25   (interactive)
       
    26   (let ( (proc (get-buffer-process (current-buffer))) )
       
    27     (if proc
       
    28 	(interrupt-process proc)
       
    29       (error "The %s process is not running" (downcase mode-name)))))
       
    30 
    20 (defvar my/ag-mode-map (make-sparse-keymap))
    31 (defvar my/ag-mode-map (make-sparse-keymap))
    21 
    32 
    22 (define-key my/ag-mode-map (kbd "RET") 'my/ag-goto)
    33 (define-key my/ag-mode-map (kbd "RET") 'my/ag-goto)
       
    34 (define-key my/ag-mode-map (kbd "C-c C-k") 'my/ag-kill-process)
    23 
    35 
    24 (defface my/ag-lineno-face
    36 (defface my/ag-lineno-face
    25   '((t :inherit warning))
    37   '((t :inherit warning))
    26   "Face for line number.")
    38   "Face for line number.")
    27 (defface my/ag-path-face
    39 (defface my/ag-path-face
    56         (set-marker (process-mark proc) (point)))
    68         (set-marker (process-mark proc) (point)))
    57       )))
    69       )))
    58 
    70 
    59 (defvar my/ag-regex-history nil)
    71 (defvar my/ag-regex-history nil)
    60 
    72 
       
    73 (defun my/ag-setup-buffer (dir)
       
    74   (setq my/ag-buffer (get-buffer-create my/ag-buffer-name))
       
    75   (with-current-buffer my/ag-buffer
       
    76     (setq default-directory dir)
       
    77     (erase-buffer)
       
    78     (my/ag-mode))
       
    79   (display-buffer my/ag-buffer))
       
    80 
       
    81 (defun my/ag-run (regex)
       
    82   (make-process
       
    83    :name "ag"
       
    84    :buffer my/ag-buffer
       
    85    :filter 'my/ag-filter
       
    86    :command (list "ag" "--group" "--nocolor" regex)))
       
    87 
       
    88 ;;;###autoload
    61 (defun my/ag (regex)
    89 (defun my/ag (regex)
    62   (interactive
    90   (interactive
    63    (let* ( (def (when my/ag-regex-history (car my/ag-regex-history)))
    91    (let* ( (def (when my/ag-regex-history (car my/ag-regex-history)))
    64            (part (when def (if (< (length def) 20)
    92            (part (when def (if (< (length def) 20)
    65                                def
    93                                def
    66                              (concat (substring def 0 20) "...")))) )
    94                              (concat (substring def 0 20) "...")))) )
    67      (list (read-string
    95      (list (read-string
    68             (if part (format "Regex [%s]: " part) "Regex: ")
    96             (if part (format "Regex [%s]: " part) "Regex: ")
    69             ""  'my/ag-regex-history  def  t))))
    97             ""  'my/ag-regex-history  def  t))))
    70   (let ( proc (dir default-directory) )
    98   (my/ag-setup-buffer (if current-prefix-arg default-directory (or (ignore-errors (vc-root-dir)) default-directory)))
    71     (setq my/ag-buffer (get-buffer-create my/ag-buffer-name))
    99   (my/ag-run regex))
    72     (with-current-buffer my/ag-buffer
   100 
    73       (setq default-directory dir)
   101 (provide 'ag)
    74       (erase-buffer)
   102 
    75       (my/ag-mode))
   103 ;;; ag.el ends here
    76     (display-buffer my/ag-buffer)
       
    77     (setq proc (make-process
       
    78                 :name "ag"
       
    79                 :buffer my/ag-buffer
       
    80                 :filter 'my/ag-filter
       
    81                 :command (list "ag" "--group" "--nocolor" regex))) ))