ag.el
author Oleksandr Gavenko <gavenkoa@gmail.com>
Wed, 22 Feb 2017 23:58:21 +0200
changeset 1492 8ebcfb7fc718
child 1493 d242edfd1321
permissions -rw-r--r--
Add own ag mode.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1492
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
     1
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
     2
(defun my/ag-goto ()
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
     3
  (interactive)
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
     4
  (save-excursion
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
     5
    (let ( lineno end )
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
     6
      (forward-line 1)
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
     7
      (backward-char 1)
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
     8
      (setq end (point))
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
     9
      (forward-line 0)
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    10
      (if (not (search-forward-regexp "^\\([1-9][0-9]*\\):" end t))
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    11
          (message "Not at line number...")
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    12
        (setq lineno (string-to-int (match-string 1)))
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    13
        (if (search-backward-regexp "^$" nil t)
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    14
            (forward-char)
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    15
          (goto-char (point-min)))
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    16
        (search-forward-regexp "^.*")
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    17
        (find-file-other-window (match-string 0))
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    18
        (goto-line lineno)))))
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    19
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    20
(defvar my/ag-mode-map (make-sparse-keymap))
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    21
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    22
(define-key my/ag-mode-map (kbd "RET") 'my/ag-goto)
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    23
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    24
(defface my/ag-lineno-face
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    25
  '((t :inherit warning))
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    26
  "Face for line number.")
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    27
(defface my/ag-path-face
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    28
  '((t :inherit success))
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    29
  "Face for line number.")
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    30
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    31
(defvar my/ag-keywords
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    32
  '(("[1-9][0-9]\\{0,3\\}:" . (0 'my/ag-lineno-face))
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    33
    ("^[^:]\\{4\\}.*" . (0 'my/ag-path-face))))
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    34
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    35
(defun my/ag-font-lock-extend-region ()
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    36
  (save-excursion
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    37
    (goto-char font-lock-beg)
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    38
    (forward-line 2)
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    39
    (setq font-lock-beg (point))))
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    40
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    41
(define-derived-mode my/ag-mode fundamental-mode "Ag"
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    42
  "Major mode for Ag parsing."
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    43
  (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
    44
  ;; (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
    45
  (use-local-map my/ag-mode-map))
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
(defvar my/ag-buffer-name "*ag*")
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    48
(defvar my/ag-buffer nil)
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    49
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    50
(defun my/ag-filter (proc str)
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    51
  (when (buffer-live-p (process-buffer proc))
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    52
    (with-current-buffer (process-buffer proc)
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    53
      (save-excursion
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    54
        (goto-char (process-mark proc))
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    55
        (insert str)
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    56
        (set-marker (process-mark proc) (point)))
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    57
      )))
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-regex-history nil)
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    60
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    61
(defun my/ag (regex)
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    62
  (interactive
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    63
   (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
    64
           (part (when def (if (< (length def) 20)
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    65
                               def
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    66
                             (concat (substring def 0 20) "...")))) )
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    67
     (list (read-string
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    68
            (if part (format "Regex [%s]: " part) "Regex: ")
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    69
            ""  'my/ag-regex-history  def  t))))
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    70
  (let ( proc (dir default-directory) )
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    71
    (setq my/ag-buffer (get-buffer-create my/ag-buffer-name))
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    72
    (with-current-buffer my/ag-buffer
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    73
      (setq default-directory dir)
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    74
      (erase-buffer)
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    75
      (my/ag-mode))
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    76
    (display-buffer my/ag-buffer)
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    77
    (setq proc (make-process
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    78
                :name "ag"
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    79
                :buffer my/ag-buffer
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    80
                :filter 'my/ag-filter
8ebcfb7fc718 Add own ag mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    81
                :command (list "ag" "--group" "--nocolor" regex))) ))