autobm.el
author Oleksandr Gavenko <gavenkoa@gmail.com>
Mon, 20 Apr 2015 02:41:54 +0300
changeset 1286 bfbf02088de8
child 1287 3848ca89b2b6
permissions -rw-r--r--
Auto named bookmarks.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1286
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
     1
;;; autobm.el --- suggest bookmark name from local context
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
     2
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
     3
(defvar autobm-mode-handlers
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
     4
  '((emacs-lisp-mode . (autobm-try-semantic))
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
     5
    (semantic-decoration-mode . (autobm-try-semantic))
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
     6
    (t . (autobm-try-which-func autobm-try-thingatpt)))
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
     7
  "Alist of handlers by mode. Key is a mojor or minor mode name, or `t' as fallback.
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
     8
Value is a no-argument function or a list of such functions,
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
     9
which returns string or `nil'.")
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    10
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    11
(defun autobm-try-which-func ()
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    12
  (which-function))
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    13
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    14
(defvar autobm-try-thingatpt-things
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    15
  '(symbol url email))
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    16
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    17
(defun autobm-try-thingatpt ()
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    18
  (let ((things autobm-try-thingatpt-things) name)
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    19
    (while (and things (not name))
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    20
      (setq name (thing-at-point (car things)))
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    21
      (setq things (cdr things)))
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    22
    name))
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    23
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    24
(defun autobm-get-active-handlers ()
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    25
  (let ( h handlers (modes (list t)) )
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    26
    (dolist (m minor-mode-list)
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    27
      (when (and (boundp m) (symbol-value m))
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    28
        (push m modes)))
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    29
    (push major-mode modes)
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    30
    (dolist (m modes)
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    31
      (setq h (assoc m autobm-mode-handlers))
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    32
      (when h
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    33
        (setq h (cdr h))
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    34
        (cond
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    35
         ((symbolp h)
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    36
          (push h handlers))
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    37
         ((listp h)
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    38
          (setq handlers (append h handlers)))
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    39
         (t (error "autobm-mode-handlers isn't a list or a symbol")))))
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    40
    handlers))
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    41
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    42
(defvar autobm-try-semantic-type-alist
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    43
  '((variable . "var")
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    44
    (function . "fn")
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    45
    (type . "type")))
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    46
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    47
(defun autobm-try-semantic ()
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    48
  (let ( (tag (semantic-current-tag)) prefix )
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    49
    (when tag
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    50
      (setq prefix (assoc (cadr tag) autobm-try-semantic-type-alist))
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    51
      (when prefix
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    52
        (format "%s: %s" (cdr prefix) (car tag))))))
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    53
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    54
(defun autobm-suggest ()
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    55
  "Suggest bookmark name depending on buffer mode and local
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    56
context using `autobm-semantic-type-alist'. First checked major
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    57
mode then active minor modes."
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    58
  (let ((result  nil))
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    59
    (catch 'exit
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    60
      (dolist (h (autobm-get-active-handlers))
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    61
        (when (setq result (funcall h))
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    62
          (throw 'exit result))))))
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    63
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    64
;;;###autoload
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    65
(defun autobm (&optional no-overwrite)
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    66
  (interactive "P")
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    67
  (let ( (name (autobm-suggest)) )
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    68
    (when name
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    69
      (setq name (read-string "Set bookmark: "  name bookmark-minibuffer-read-name-map name)))
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    70
    (bookmark-set name no-overwrite)))
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    71
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    72
(global-set-key (kbd "C-x r m") 'autobm)