mylisp/autobm.el
author Oleksandr Gavenko <gavenkoa@gmail.com>
Sat, 02 Jan 2021 00:33:04 +0200
changeset 1666 06937ff1ec5f
parent 1598 autobm.el@09079d2df4af
permissions -rw-r--r--
Moved my elisp modes to dedicated directory to not mixt with init.el.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1591
dd81e33d0dd0 Marked file for lexical-binding.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 1590
diff changeset
     1
;;; autobm.el --- suggest bookmark name from local context -*- lexical-binding: t -*-
1286
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))
1598
09079d2df4af It is better to select hole word (including dashes/underscores, depending on mode).
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 1591
diff changeset
    11
    (rst-mode . (autobm-try-word))
1286
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    12
    (t . (autobm-try-which-func autobm-try-thingatpt)))
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    13
  "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
    14
Value is a no-argument function or a list of such functions,
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    15
which returns string or `nil'.")
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-which-func ()
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    18
  (which-function))
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    19
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    20
(defvar autobm-try-thingatpt-things
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    21
  '(symbol url email))
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    22
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    23
(defun autobm-try-thingatpt ()
1287
3848ca89b2b6 Simplify code.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 1286
diff changeset
    24
  (cl-some #'thing-at-point autobm-try-thingatpt-things))
1286
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    25
1598
09079d2df4af It is better to select hole word (including dashes/underscores, depending on mode).
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 1591
diff changeset
    26
(defun autobm-try-word ()
09079d2df4af It is better to select hole word (including dashes/underscores, depending on mode).
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 1591
diff changeset
    27
  (thing-at-point 'word))
09079d2df4af It is better to select hole word (including dashes/underscores, depending on mode).
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 1591
diff changeset
    28
1590
b117f393fd9a Added bookmark creation for RST mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 1524
diff changeset
    29
(defun autobm-try-line ()
b117f393fd9a Added bookmark creation for RST mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 1524
diff changeset
    30
  (let ( (line (thing-at-point 'line)) )
b117f393fd9a Added bookmark creation for RST mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 1524
diff changeset
    31
    (substring line 0 (min (1- (length line)) 30))))
b117f393fd9a Added bookmark creation for RST mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 1524
diff changeset
    32
1286
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    33
(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
    34
  (let ( h handlers (modes (list major-mode)) )
1286
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    35
    (dolist (m minor-mode-list)
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    36
      (when (and (boundp m) (symbol-value m))
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    37
        (push m modes)))
1319
d893dc8fe820 Fix: major-mode should have highest priority, default handlers - least.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 1318
diff changeset
    38
    (push t modes)
1286
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    39
    (dolist (m modes)
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    40
      (setq h (assoc m autobm-mode-handlers))
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    41
      (when h
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    42
        (setq h (cdr h))
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    43
        (cond
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    44
         ((symbolp h)
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    45
          (push h handlers))
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    46
         ((listp h)
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    47
          (setq handlers (append h handlers)))
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    48
         (t (error "autobm-mode-handlers isn't a list or a symbol")))))
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    49
    handlers))
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    50
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    51
(defvar autobm-try-semantic-type-alist
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    52
  '((variable . "var")
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    53
    (function . "fn")
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    54
    (type . "type")))
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    55
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    56
(defun autobm-try-semantic ()
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    57
  (let ( (tag (semantic-current-tag)) prefix )
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    58
    (when tag
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    59
      (setq prefix (assoc (cadr tag) autobm-try-semantic-type-alist))
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    60
      (when prefix
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    61
        (format "%s: %s" (cdr prefix) (car tag))))))
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    62
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    63
(defun autobm-suggest ()
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    64
  "Suggest bookmark name depending on buffer mode and local
1590
b117f393fd9a Added bookmark creation for RST mode.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 1524
diff changeset
    65
context using `autobm-try-semantic-type-alist'. First checked major
1286
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    66
mode then active minor modes."
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    67
  (let ((result  nil))
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    68
    (catch 'exit
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    69
      (dolist (h (autobm-get-active-handlers))
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    70
        (when (setq result (funcall h))
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    71
          (throw 'exit result))))))
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    72
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    73
;;;###autoload
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    74
(defun autobm (&optional no-overwrite)
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    75
  (interactive "P")
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    76
  (let ( (name (autobm-suggest)) )
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    77
    (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
    78
      (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
    79
    (bookmark-set name no-overwrite)))
bfbf02088de8 Auto named bookmarks.
Oleksandr Gavenko <gavenkoa@gmail.com>
parents:
diff changeset
    80
1288
6333a733046f Use new autobm mode!
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 1287
diff changeset
    81
;; (global-set-key (kbd "C-x r m") 'autobm)
6333a733046f Use new autobm mode!
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 1287
diff changeset
    82
6333a733046f Use new autobm mode!
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 1287
diff changeset
    83
(provide 'autobm)
6333a733046f Use new autobm mode!
Oleksandr Gavenko <gavenkoa@gmail.com>
parents: 1287
diff changeset
    84