autobm.el
author Oleksandr Gavenko <gavenkoa@gmail.com>
Wed, 11 Oct 2017 00:28:06 +0300
changeset 1541 dca10cecc9e2
parent 1524 6d4fee1f7cb0
child 1590 b117f393fd9a
permissions -rw-r--r--
Set font size depending on DPI.
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
1287
3848ca89b2b6 Simplify code.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 1286
diff changeset
     3
(require 'cl-lib)
1318
a37d43074061 Fix: Symbol's value as variable is void: bookmark-minibuffer-read-name-map.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 1288
diff changeset
     4
(require 'bookmark)
1524
6d4fee1f7cb0 Fix: Warning: the following functions are not known to be defined:
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 1319
diff changeset
     5
(require 'which-func)
6d4fee1f7cb0 Fix: Warning: the following functions are not known to be defined:
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 1319
diff changeset
     6
(require 'semantic/find)
1287
3848ca89b2b6 Simplify code.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 1286
diff changeset
     7
1286
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
     8
(defvar autobm-mode-handlers
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
     9
  '((emacs-lisp-mode . (autobm-try-semantic))
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    10
    (semantic-decoration-mode . (autobm-try-semantic))
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    11
    (t . (autobm-try-which-func autobm-try-thingatpt)))
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    12
  "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
    13
Value is a no-argument function or a list of such functions,
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    14
which returns string or `nil'.")
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    15
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    16
(defun autobm-try-which-func ()
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    17
  (which-function))
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    18
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    19
(defvar autobm-try-thingatpt-things
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    20
  '(symbol url email))
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    21
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    22
(defun autobm-try-thingatpt ()
1287
3848ca89b2b6 Simplify code.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 1286
diff changeset
    23
  (cl-some #'thing-at-point autobm-try-thingatpt-things))
1286
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    24
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    25
(defun autobm-get-active-handlers ()
1319
d893dc8fe820 Fix: major-mode should have highest priority, default handlers - least.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 1318
diff changeset
    26
  (let ( h handlers (modes (list major-mode)) )
1286
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    27
    (dolist (m minor-mode-list)
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    28
      (when (and (boundp m) (symbol-value m))
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    29
        (push m modes)))
1319
d893dc8fe820 Fix: major-mode should have highest priority, default handlers - least.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 1318
diff changeset
    30
    (push t modes)
1286
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    31
    (dolist (m modes)
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    32
      (setq h (assoc m autobm-mode-handlers))
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    33
      (when h
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    34
        (setq h (cdr h))
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    35
        (cond
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    36
         ((symbolp h)
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    37
          (push h handlers))
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    38
         ((listp h)
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    39
          (setq handlers (append h handlers)))
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    40
         (t (error "autobm-mode-handlers isn't a list or a symbol")))))
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    41
    handlers))
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    42
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    43
(defvar autobm-try-semantic-type-alist
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    44
  '((variable . "var")
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    45
    (function . "fn")
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    46
    (type . "type")))
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    47
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    48
(defun autobm-try-semantic ()
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    49
  (let ( (tag (semantic-current-tag)) prefix )
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    50
    (when tag
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    51
      (setq prefix (assoc (cadr tag) autobm-try-semantic-type-alist))
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    52
      (when prefix
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    53
        (format "%s: %s" (cdr prefix) (car tag))))))
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    54
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    55
(defun autobm-suggest ()
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    56
  "Suggest bookmark name depending on buffer mode and local
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    57
context using `autobm-semantic-type-alist'. First checked major
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    58
mode then active minor modes."
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    59
  (let ((result  nil))
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    60
    (catch 'exit
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    61
      (dolist (h (autobm-get-active-handlers))
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    62
        (when (setq result (funcall h))
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    63
          (throw 'exit result))))))
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    64
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    65
;;;###autoload
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    66
(defun autobm (&optional no-overwrite)
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    67
  (interactive "P")
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    68
  (let ( (name (autobm-suggest)) )
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    69
    (when name
1318
a37d43074061 Fix: Symbol's value as variable is void: bookmark-minibuffer-read-name-map.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 1288
diff changeset
    70
      (setq name (read-string "Set bookmark: " name bookmark-minibuffer-read-name-map name)))
1286
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    71
    (bookmark-set name no-overwrite)))
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    72
1288
6333a733046f Use new autobm mode!
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 1287
diff changeset
    73
;; (global-set-key (kbd "C-x r m") 'autobm)
6333a733046f Use new autobm mode!
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 1287
diff changeset
    74
6333a733046f Use new autobm mode!
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 1287
diff changeset
    75
(provide 'autobm)
6333a733046f Use new autobm mode!
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 1287
diff changeset
    76