author | Oleksandr Gavenko <gavenkoa@gmail.com> |
Thu, 23 Feb 2017 08:19:21 +0200 | |
changeset 1496 | 4b336f352950 |
parent 1493 | d242edfd1321 |
child 1498 | e8ad022540d4 |
permissions | -rw-r--r-- |
1493
d242edfd1321
Function for killing process. Simplify code. Limit search for current
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
1492
diff
changeset
|
1 |
;;; ag.el --- Ag frontend |
d242edfd1321
Function for killing process. Simplify code. Limit search for current
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
1492
diff
changeset
|
2 |
|
d242edfd1321
Function for killing process. Simplify code. Limit search for current
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
1492
diff
changeset
|
3 |
;;; Commentary: |
d242edfd1321
Function for killing process. Simplify code. Limit search for current
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
1492
diff
changeset
|
4 |
;; |
1492 | 5 |
|
6 |
(defun my/ag-goto () |
|
7 |
(interactive) |
|
8 |
(save-excursion |
|
9 |
(let ( lineno end ) |
|
10 |
(forward-line 1) |
|
11 |
(backward-char 1) |
|
12 |
(setq end (point)) |
|
13 |
(forward-line 0) |
|
14 |
(if (not (search-forward-regexp "^\\([1-9][0-9]*\\):" end t)) |
|
15 |
(message "Not at line number...") |
|
16 |
(setq lineno (string-to-int (match-string 1))) |
|
17 |
(if (search-backward-regexp "^$" nil t) |
|
18 |
(forward-char) |
|
19 |
(goto-char (point-min))) |
|
20 |
(search-forward-regexp "^.*") |
|
21 |
(find-file-other-window (match-string 0)) |
|
22 |
(goto-line lineno))))) |
|
23 |
||
1493
d242edfd1321
Function for killing process. Simplify code. Limit search for current
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
1492
diff
changeset
|
24 |
(defun my/ag-kill-process () |
d242edfd1321
Function for killing process. Simplify code. Limit search for current
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
1492
diff
changeset
|
25 |
(interactive) |
d242edfd1321
Function for killing process. Simplify code. Limit search for current
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
1492
diff
changeset
|
26 |
(let ( (proc (get-buffer-process (current-buffer))) ) |
d242edfd1321
Function for killing process. Simplify code. Limit search for current
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
1492
diff
changeset
|
27 |
(if proc |
d242edfd1321
Function for killing process. Simplify code. Limit search for current
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
1492
diff
changeset
|
28 |
(interrupt-process proc) |
d242edfd1321
Function for killing process. Simplify code. Limit search for current
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
1492
diff
changeset
|
29 |
(error "The %s process is not running" (downcase mode-name))))) |
d242edfd1321
Function for killing process. Simplify code. Limit search for current
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
1492
diff
changeset
|
30 |
|
1492 | 31 |
(defvar my/ag-mode-map (make-sparse-keymap)) |
32 |
||
33 |
(define-key my/ag-mode-map (kbd "RET") 'my/ag-goto) |
|
1493
d242edfd1321
Function for killing process. Simplify code. Limit search for current
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
1492
diff
changeset
|
34 |
(define-key my/ag-mode-map (kbd "C-c C-k") 'my/ag-kill-process) |
1492 | 35 |
|
36 |
(defface my/ag-lineno-face |
|
37 |
'((t :inherit warning)) |
|
38 |
"Face for line number.") |
|
39 |
(defface my/ag-path-face |
|
40 |
'((t :inherit success)) |
|
41 |
"Face for line number.") |
|
42 |
||
43 |
(defvar my/ag-keywords |
|
44 |
'(("[1-9][0-9]\\{0,3\\}:" . (0 'my/ag-lineno-face)) |
|
45 |
("^[^:]\\{4\\}.*" . (0 'my/ag-path-face)))) |
|
46 |
||
47 |
(defun my/ag-font-lock-extend-region () |
|
48 |
(save-excursion |
|
49 |
(goto-char font-lock-beg) |
|
50 |
(forward-line 2) |
|
51 |
(setq font-lock-beg (point)))) |
|
52 |
||
53 |
(define-derived-mode my/ag-mode fundamental-mode "Ag" |
|
54 |
"Major mode for Ag parsing." |
|
55 |
(setq font-lock-defaults '(my/ag-keywords t nil nil)) ; (font-lock-multiline . t) |
|
56 |
;; (add-hook 'font-lock-extend-region-functions 'my/ag-font-lock-extend-region) |
|
57 |
(use-local-map my/ag-mode-map)) |
|
58 |
||
59 |
(defvar my/ag-buffer-name "*ag*") |
|
60 |
(defvar my/ag-buffer nil) |
|
61 |
||
62 |
(defun my/ag-filter (proc str) |
|
63 |
(when (buffer-live-p (process-buffer proc)) |
|
64 |
(with-current-buffer (process-buffer proc) |
|
65 |
(save-excursion |
|
66 |
(goto-char (process-mark proc)) |
|
67 |
(insert str) |
|
68 |
(set-marker (process-mark proc) (point))) |
|
69 |
))) |
|
70 |
||
71 |
(defvar my/ag-regex-history nil) |
|
72 |
||
1493
d242edfd1321
Function for killing process. Simplify code. Limit search for current
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
1492
diff
changeset
|
73 |
(defun my/ag-setup-buffer (dir) |
d242edfd1321
Function for killing process. Simplify code. Limit search for current
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
1492
diff
changeset
|
74 |
(setq my/ag-buffer (get-buffer-create my/ag-buffer-name)) |
d242edfd1321
Function for killing process. Simplify code. Limit search for current
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
1492
diff
changeset
|
75 |
(with-current-buffer my/ag-buffer |
d242edfd1321
Function for killing process. Simplify code. Limit search for current
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
1492
diff
changeset
|
76 |
(setq default-directory dir) |
d242edfd1321
Function for killing process. Simplify code. Limit search for current
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
1492
diff
changeset
|
77 |
(erase-buffer) |
d242edfd1321
Function for killing process. Simplify code. Limit search for current
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
1492
diff
changeset
|
78 |
(my/ag-mode)) |
d242edfd1321
Function for killing process. Simplify code. Limit search for current
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
1492
diff
changeset
|
79 |
(display-buffer my/ag-buffer)) |
d242edfd1321
Function for killing process. Simplify code. Limit search for current
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
1492
diff
changeset
|
80 |
|
d242edfd1321
Function for killing process. Simplify code. Limit search for current
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
1492
diff
changeset
|
81 |
(defun my/ag-run (regex) |
1496
4b336f352950
(vc-root-dir) selectively work depending on buffer mode. I need root based on
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
1493
diff
changeset
|
82 |
(let ( (default-directory (buffer-local-value 'default-directory my/ag-buffer)) ) |
4b336f352950
(vc-root-dir) selectively work depending on buffer mode. I need root based on
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
1493
diff
changeset
|
83 |
(make-process |
4b336f352950
(vc-root-dir) selectively work depending on buffer mode. I need root based on
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
1493
diff
changeset
|
84 |
:name "ag" |
4b336f352950
(vc-root-dir) selectively work depending on buffer mode. I need root based on
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
1493
diff
changeset
|
85 |
:buffer my/ag-buffer |
4b336f352950
(vc-root-dir) selectively work depending on buffer mode. I need root based on
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
1493
diff
changeset
|
86 |
:filter 'my/ag-filter |
4b336f352950
(vc-root-dir) selectively work depending on buffer mode. I need root based on
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
1493
diff
changeset
|
87 |
:command (list "ag" "--group" "--nocolor" regex)))) |
4b336f352950
(vc-root-dir) selectively work depending on buffer mode. I need root based on
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
1493
diff
changeset
|
88 |
|
4b336f352950
(vc-root-dir) selectively work depending on buffer mode. I need root based on
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
1493
diff
changeset
|
89 |
(defun my/ag-project-root () |
4b336f352950
(vc-root-dir) selectively work depending on buffer mode. I need root based on
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
1493
diff
changeset
|
90 |
(let ( (backend (vc-responsible-backend default-directory)) ) |
4b336f352950
(vc-root-dir) selectively work depending on buffer mode. I need root based on
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
1493
diff
changeset
|
91 |
(if backend |
4b336f352950
(vc-root-dir) selectively work depending on buffer mode. I need root based on
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
1493
diff
changeset
|
92 |
(condition-case err |
4b336f352950
(vc-root-dir) selectively work depending on buffer mode. I need root based on
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
1493
diff
changeset
|
93 |
(vc-call-backend backend 'root default-directory) |
4b336f352950
(vc-root-dir) selectively work depending on buffer mode. I need root based on
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
1493
diff
changeset
|
94 |
(vc-not-supported |
4b336f352950
(vc-root-dir) selectively work depending on buffer mode. I need root based on
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
1493
diff
changeset
|
95 |
(unless (eq (cadr err) 'root) |
4b336f352950
(vc-root-dir) selectively work depending on buffer mode. I need root based on
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
1493
diff
changeset
|
96 |
(signal (car err) (cdr err))) |
4b336f352950
(vc-root-dir) selectively work depending on buffer mode. I need root based on
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
1493
diff
changeset
|
97 |
nil)) |
4b336f352950
(vc-root-dir) selectively work depending on buffer mode. I need root based on
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
1493
diff
changeset
|
98 |
default-directory))) |
1493
d242edfd1321
Function for killing process. Simplify code. Limit search for current
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
1492
diff
changeset
|
99 |
|
d242edfd1321
Function for killing process. Simplify code. Limit search for current
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
1492
diff
changeset
|
100 |
;;;###autoload |
1492 | 101 |
(defun my/ag (regex) |
102 |
(interactive |
|
103 |
(let* ( (def (when my/ag-regex-history (car my/ag-regex-history))) |
|
104 |
(part (when def (if (< (length def) 20) |
|
105 |
def |
|
106 |
(concat (substring def 0 20) "...")))) ) |
|
107 |
(list (read-string |
|
108 |
(if part (format "Regex [%s]: " part) "Regex: ") |
|
109 |
"" 'my/ag-regex-history def t)))) |
|
1496
4b336f352950
(vc-root-dir) selectively work depending on buffer mode. I need root based on
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
1493
diff
changeset
|
110 |
(my/ag-setup-buffer (if current-prefix-arg default-directory (my/ag-project-root))) |
1493
d242edfd1321
Function for killing process. Simplify code. Limit search for current
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
1492
diff
changeset
|
111 |
(my/ag-run regex)) |
d242edfd1321
Function for killing process. Simplify code. Limit search for current
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
1492
diff
changeset
|
112 |
|
d242edfd1321
Function for killing process. Simplify code. Limit search for current
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
1492
diff
changeset
|
113 |
(provide 'ag) |
d242edfd1321
Function for killing process. Simplify code. Limit search for current
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
1492
diff
changeset
|
114 |
|
d242edfd1321
Function for killing process. Simplify code. Limit search for current
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
1492
diff
changeset
|
115 |
;;; ag.el ends here |