1492
|
1 |
|
|
2 |
(defun my/ag-goto ()
|
|
3 |
(interactive)
|
|
4 |
(save-excursion
|
|
5 |
(let ( lineno end )
|
|
6 |
(forward-line 1)
|
|
7 |
(backward-char 1)
|
|
8 |
(setq end (point))
|
|
9 |
(forward-line 0)
|
|
10 |
(if (not (search-forward-regexp "^\\([1-9][0-9]*\\):" end t))
|
|
11 |
(message "Not at line number...")
|
|
12 |
(setq lineno (string-to-int (match-string 1)))
|
|
13 |
(if (search-backward-regexp "^$" nil t)
|
|
14 |
(forward-char)
|
|
15 |
(goto-char (point-min)))
|
|
16 |
(search-forward-regexp "^.*")
|
|
17 |
(find-file-other-window (match-string 0))
|
|
18 |
(goto-line lineno)))))
|
|
19 |
|
|
20 |
(defvar my/ag-mode-map (make-sparse-keymap))
|
|
21 |
|
|
22 |
(define-key my/ag-mode-map (kbd "RET") 'my/ag-goto)
|
|
23 |
|
|
24 |
(defface my/ag-lineno-face
|
|
25 |
'((t :inherit warning))
|
|
26 |
"Face for line number.")
|
|
27 |
(defface my/ag-path-face
|
|
28 |
'((t :inherit success))
|
|
29 |
"Face for line number.")
|
|
30 |
|
|
31 |
(defvar my/ag-keywords
|
|
32 |
'(("[1-9][0-9]\\{0,3\\}:" . (0 'my/ag-lineno-face))
|
|
33 |
("^[^:]\\{4\\}.*" . (0 'my/ag-path-face))))
|
|
34 |
|
|
35 |
(defun my/ag-font-lock-extend-region ()
|
|
36 |
(save-excursion
|
|
37 |
(goto-char font-lock-beg)
|
|
38 |
(forward-line 2)
|
|
39 |
(setq font-lock-beg (point))))
|
|
40 |
|
|
41 |
(define-derived-mode my/ag-mode fundamental-mode "Ag"
|
|
42 |
"Major mode for Ag parsing."
|
|
43 |
(setq font-lock-defaults '(my/ag-keywords t nil nil)) ; (font-lock-multiline . t)
|
|
44 |
;; (add-hook 'font-lock-extend-region-functions 'my/ag-font-lock-extend-region)
|
|
45 |
(use-local-map my/ag-mode-map))
|
|
46 |
|
|
47 |
(defvar my/ag-buffer-name "*ag*")
|
|
48 |
(defvar my/ag-buffer nil)
|
|
49 |
|
|
50 |
(defun my/ag-filter (proc str)
|
|
51 |
(when (buffer-live-p (process-buffer proc))
|
|
52 |
(with-current-buffer (process-buffer proc)
|
|
53 |
(save-excursion
|
|
54 |
(goto-char (process-mark proc))
|
|
55 |
(insert str)
|
|
56 |
(set-marker (process-mark proc) (point)))
|
|
57 |
)))
|
|
58 |
|
|
59 |
(defvar my/ag-regex-history nil)
|
|
60 |
|
|
61 |
(defun my/ag (regex)
|
|
62 |
(interactive
|
|
63 |
(let* ( (def (when my/ag-regex-history (car my/ag-regex-history)))
|
|
64 |
(part (when def (if (< (length def) 20)
|
|
65 |
def
|
|
66 |
(concat (substring def 0 20) "...")))) )
|
|
67 |
(list (read-string
|
|
68 |
(if part (format "Regex [%s]: " part) "Regex: ")
|
|
69 |
"" 'my/ag-regex-history def t))))
|
|
70 |
(let ( proc (dir default-directory) )
|
|
71 |
(setq my/ag-buffer (get-buffer-create my/ag-buffer-name))
|
|
72 |
(with-current-buffer my/ag-buffer
|
|
73 |
(setq default-directory dir)
|
|
74 |
(erase-buffer)
|
|
75 |
(my/ag-mode))
|
|
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))) ))
|