mylisp/autobm.el
author Oleksandr Gavenko <gavenkoa@gmail.com>
Wed, 16 Jun 2021 12:50:08 +0300
changeset 1734 ae2c6a001464
parent 1666 06937ff1ec5f
permissions -rw-r--r--
Add some standard places to PATH if they are not set by login script. Rearrange the order of paths so system's are first, user's are last. For Cygwin this helps with Cygwin's paths to be situated before "C:/Windows" (Emacs is not started from a login shell on Windows!).
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