author | Oleksandr Gavenko <gavenkoa@gmail.com> |
Sat, 25 Mar 2017 11:09:24 +0300 | |
changeset 1511 | fc1d9169d134 |
parent 1502 | 72c63cea35d3 |
child 1515 | a28c181c1412 |
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 |
|
1501
636e49ed6d27
Prevent error if there is no repository. Fix highlighting of line numbers.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
1498
diff
changeset
|
44 |
'(("^[1-9][0-9]\\{0,5\\}:" . (0 'my/ag-lineno-face)) |
1498
e8ad022540d4
Number of lines can be greater then I assumed initially.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
1496
diff
changeset
|
45 |
("^[^:]\\{6\\}.*" . (0 'my/ag-path-face)))) |
1492 | 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 () |
1501
636e49ed6d27
Prevent error if there is no repository. Fix highlighting of line numbers.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
1498
diff
changeset
|
90 |
(condition-case err |
636e49ed6d27
Prevent error if there is no repository. Fix highlighting of line numbers.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
1498
diff
changeset
|
91 |
(let ( backend ) |
636e49ed6d27
Prevent error if there is no repository. Fix highlighting of line numbers.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
1498
diff
changeset
|
92 |
(setq backend (vc-responsible-backend default-directory)) |
636e49ed6d27
Prevent error if there is no repository. Fix highlighting of line numbers.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
1498
diff
changeset
|
93 |
(if backend |
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
|
94 |
(vc-call-backend backend 'root default-directory) |
1501
636e49ed6d27
Prevent error if there is no repository. Fix highlighting of line numbers.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
1498
diff
changeset
|
95 |
default-directory)) |
636e49ed6d27
Prevent error if there is no repository. Fix highlighting of line numbers.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
1498
diff
changeset
|
96 |
(error default-directory))) |
1493
d242edfd1321
Function for killing process. Simplify code. Limit search for current
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
1492
diff
changeset
|
97 |
|
1502
72c63cea35d3
It much easy to call ag for current directory via modifier then prefix argument.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
1501
diff
changeset
|
98 |
(defun my/ag-read-regex () |
72c63cea35d3
It much easy to call ag for current directory via modifier then prefix argument.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
1501
diff
changeset
|
99 |
(let* ( (def (when my/ag-regex-history (car my/ag-regex-history))) |
72c63cea35d3
It much easy to call ag for current directory via modifier then prefix argument.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
1501
diff
changeset
|
100 |
(part (when def (if (< (length def) 20) |
72c63cea35d3
It much easy to call ag for current directory via modifier then prefix argument.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
1501
diff
changeset
|
101 |
def |
72c63cea35d3
It much easy to call ag for current directory via modifier then prefix argument.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
1501
diff
changeset
|
102 |
(concat (substring def 0 20) "...")))) ) |
72c63cea35d3
It much easy to call ag for current directory via modifier then prefix argument.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
1501
diff
changeset
|
103 |
(read-string |
72c63cea35d3
It much easy to call ag for current directory via modifier then prefix argument.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
1501
diff
changeset
|
104 |
(if part (format "Regex [%s]: " part) "Regex: ") |
72c63cea35d3
It much easy to call ag for current directory via modifier then prefix argument.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
1501
diff
changeset
|
105 |
"" 'my/ag-regex-history def t))) |
72c63cea35d3
It much easy to call ag for current directory via modifier then prefix argument.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
1501
diff
changeset
|
106 |
|
1493
d242edfd1321
Function for killing process. Simplify code. Limit search for current
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
1492
diff
changeset
|
107 |
;;;###autoload |
1492 | 108 |
(defun my/ag (regex) |
1502
72c63cea35d3
It much easy to call ag for current directory via modifier then prefix argument.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
1501
diff
changeset
|
109 |
"Search in 'ag' recursively from VCS root directory and fall to |
72c63cea35d3
It much easy to call ag for current directory via modifier then prefix argument.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
1501
diff
changeset
|
110 |
current directory if VCS root is not defined." |
72c63cea35d3
It much easy to call ag for current directory via modifier then prefix argument.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
1501
diff
changeset
|
111 |
(interactive (list (my/ag-read-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
|
112 |
(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
|
113 |
(my/ag-run regex)) |
d242edfd1321
Function for killing process. Simplify code. Limit search for current
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
1492
diff
changeset
|
114 |
|
1502
72c63cea35d3
It much easy to call ag for current directory via modifier then prefix argument.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
1501
diff
changeset
|
115 |
;;;###autoload |
72c63cea35d3
It much easy to call ag for current directory via modifier then prefix argument.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
1501
diff
changeset
|
116 |
(defun my/ag-default-directory (regex) |
72c63cea35d3
It much easy to call ag for current directory via modifier then prefix argument.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
1501
diff
changeset
|
117 |
"Search in 'ag' recursively from current directory." |
72c63cea35d3
It much easy to call ag for current directory via modifier then prefix argument.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
1501
diff
changeset
|
118 |
(interactive (list (my/ag-read-regex))) |
72c63cea35d3
It much easy to call ag for current directory via modifier then prefix argument.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
1501
diff
changeset
|
119 |
(my/ag-setup-buffer default-directory) |
72c63cea35d3
It much easy to call ag for current directory via modifier then prefix argument.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
1501
diff
changeset
|
120 |
(my/ag-run regex)) |
72c63cea35d3
It much easy to call ag for current directory via modifier then prefix argument.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
1501
diff
changeset
|
121 |
|
72c63cea35d3
It much easy to call ag for current directory via modifier then prefix argument.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
1501
diff
changeset
|
122 |
|
1493
d242edfd1321
Function for killing process. Simplify code. Limit search for current
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
1492
diff
changeset
|
123 |
(provide 'ag) |
d242edfd1321
Function for killing process. Simplify code. Limit search for current
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
1492
diff
changeset
|
124 |
|
d242edfd1321
Function for killing process. Simplify code. Limit search for current
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
1492
diff
changeset
|
125 |
;;; ag.el ends here |