ag.el
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--
(vc-root-dir) selectively work depending on buffer mode. I need root based on default-directory... Fix: switch to necessary directory before running process.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
     5
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
     6
(defun my/ag-goto ()
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
     7
  (interactive)
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
     8
  (save-excursion
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
     9
    (let ( lineno end )
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    10
      (forward-line 1)
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    11
      (backward-char 1)
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    12
      (setq end (point))
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    13
      (forward-line 0)
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    14
      (if (not (search-forward-regexp "^\\([1-9][0-9]*\\):" end t))
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    15
          (message "Not at line number...")
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    16
        (setq lineno (string-to-int (match-string 1)))
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    17
        (if (search-backward-regexp "^$" nil t)
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    18
            (forward-char)
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    19
          (goto-char (point-min)))
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    20
        (search-forward-regexp "^.*")
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    21
        (find-file-other-window (match-string 0))
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    22
        (goto-line lineno)))))
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    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
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    31
(defvar my/ag-mode-map (make-sparse-keymap))
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    32
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    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
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    35
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    36
(defface my/ag-lineno-face
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    37
  '((t :inherit warning))
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    38
  "Face for line number.")
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    39
(defface my/ag-path-face
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    40
  '((t :inherit success))
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    41
  "Face for line number.")
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    42
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    43
(defvar my/ag-keywords
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    44
  '(("[1-9][0-9]\\{0,3\\}:" . (0 'my/ag-lineno-face))
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    45
    ("^[^:]\\{4\\}.*" . (0 'my/ag-path-face))))
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    46
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    47
(defun my/ag-font-lock-extend-region ()
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    48
  (save-excursion
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    49
    (goto-char font-lock-beg)
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    50
    (forward-line 2)
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    51
    (setq font-lock-beg (point))))
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    52
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    53
(define-derived-mode my/ag-mode fundamental-mode "Ag"
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    54
  "Major mode for Ag parsing."
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    55
  (setq font-lock-defaults '(my/ag-keywords t nil nil)) ;  (font-lock-multiline . t)
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    56
  ;; (add-hook 'font-lock-extend-region-functions 'my/ag-font-lock-extend-region)
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    57
  (use-local-map my/ag-mode-map))
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    58
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    59
(defvar my/ag-buffer-name "*ag*")
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    60
(defvar my/ag-buffer nil)
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    61
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    62
(defun my/ag-filter (proc str)
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    63
  (when (buffer-live-p (process-buffer proc))
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    64
    (with-current-buffer (process-buffer proc)
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    65
      (save-excursion
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    66
        (goto-char (process-mark proc))
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    67
        (insert str)
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    68
        (set-marker (process-mark proc) (point)))
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    69
      )))
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    70
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    71
(defvar my/ag-regex-history nil)
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    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
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
   101
(defun my/ag (regex)
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
   102
  (interactive
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
   103
   (let* ( (def (when my/ag-regex-history (car my/ag-regex-history)))
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
   104
           (part (when def (if (< (length def) 20)
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
   105
                               def
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
   106
                             (concat (substring def 0 20) "...")))) )
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
   107
     (list (read-string
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
   108
            (if part (format "Regex [%s]: " part) "Regex: ")
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
   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