--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ag.el Wed Feb 22 23:58:21 2017 +0200
@@ -0,0 +1,81 @@
+
+(defun my/ag-goto ()
+ (interactive)
+ (save-excursion
+ (let ( lineno end )
+ (forward-line 1)
+ (backward-char 1)
+ (setq end (point))
+ (forward-line 0)
+ (if (not (search-forward-regexp "^\\([1-9][0-9]*\\):" end t))
+ (message "Not at line number...")
+ (setq lineno (string-to-int (match-string 1)))
+ (if (search-backward-regexp "^$" nil t)
+ (forward-char)
+ (goto-char (point-min)))
+ (search-forward-regexp "^.*")
+ (find-file-other-window (match-string 0))
+ (goto-line lineno)))))
+
+(defvar my/ag-mode-map (make-sparse-keymap))
+
+(define-key my/ag-mode-map (kbd "RET") 'my/ag-goto)
+
+(defface my/ag-lineno-face
+ '((t :inherit warning))
+ "Face for line number.")
+(defface my/ag-path-face
+ '((t :inherit success))
+ "Face for line number.")
+
+(defvar my/ag-keywords
+ '(("[1-9][0-9]\\{0,3\\}:" . (0 'my/ag-lineno-face))
+ ("^[^:]\\{4\\}.*" . (0 'my/ag-path-face))))
+
+(defun my/ag-font-lock-extend-region ()
+ (save-excursion
+ (goto-char font-lock-beg)
+ (forward-line 2)
+ (setq font-lock-beg (point))))
+
+(define-derived-mode my/ag-mode fundamental-mode "Ag"
+ "Major mode for Ag parsing."
+ (setq font-lock-defaults '(my/ag-keywords t nil nil)) ; (font-lock-multiline . t)
+ ;; (add-hook 'font-lock-extend-region-functions 'my/ag-font-lock-extend-region)
+ (use-local-map my/ag-mode-map))
+
+(defvar my/ag-buffer-name "*ag*")
+(defvar my/ag-buffer nil)
+
+(defun my/ag-filter (proc str)
+ (when (buffer-live-p (process-buffer proc))
+ (with-current-buffer (process-buffer proc)
+ (save-excursion
+ (goto-char (process-mark proc))
+ (insert str)
+ (set-marker (process-mark proc) (point)))
+ )))
+
+(defvar my/ag-regex-history nil)
+
+(defun my/ag (regex)
+ (interactive
+ (let* ( (def (when my/ag-regex-history (car my/ag-regex-history)))
+ (part (when def (if (< (length def) 20)
+ def
+ (concat (substring def 0 20) "...")))) )
+ (list (read-string
+ (if part (format "Regex [%s]: " part) "Regex: ")
+ "" 'my/ag-regex-history def t))))
+ (let ( proc (dir default-directory) )
+ (setq my/ag-buffer (get-buffer-create my/ag-buffer-name))
+ (with-current-buffer my/ag-buffer
+ (setq default-directory dir)
+ (erase-buffer)
+ (my/ag-mode))
+ (display-buffer my/ag-buffer)
+ (setq proc (make-process
+ :name "ag"
+ :buffer my/ag-buffer
+ :filter 'my/ag-filter
+ :command (list "ag" "--group" "--nocolor" regex))) ))