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!).
;;; autobm.el --- suggest bookmark name from local context -*- lexical-binding: t -*-
(require 'cl-lib)
(require 'bookmark)
(require 'which-func)
(require 'semantic/find)
(defvar autobm-mode-handlers
'((emacs-lisp-mode . (autobm-try-semantic))
(semantic-decoration-mode . (autobm-try-semantic))
(rst-mode . (autobm-try-word))
(t . (autobm-try-which-func autobm-try-thingatpt)))
"Alist of handlers by mode. Key is a mojor or minor mode name, or `t' as fallback.
Value is a no-argument function or a list of such functions,
which returns string or `nil'.")
(defun autobm-try-which-func ()
(which-function))
(defvar autobm-try-thingatpt-things
'(symbol url email))
(defun autobm-try-thingatpt ()
(cl-some #'thing-at-point autobm-try-thingatpt-things))
(defun autobm-try-word ()
(thing-at-point 'word))
(defun autobm-try-line ()
(let ( (line (thing-at-point 'line)) )
(substring line 0 (min (1- (length line)) 30))))
(defun autobm-get-active-handlers ()
(let ( h handlers (modes (list major-mode)) )
(dolist (m minor-mode-list)
(when (and (boundp m) (symbol-value m))
(push m modes)))
(push t modes)
(dolist (m modes)
(setq h (assoc m autobm-mode-handlers))
(when h
(setq h (cdr h))
(cond
((symbolp h)
(push h handlers))
((listp h)
(setq handlers (append h handlers)))
(t (error "autobm-mode-handlers isn't a list or a symbol")))))
handlers))
(defvar autobm-try-semantic-type-alist
'((variable . "var")
(function . "fn")
(type . "type")))
(defun autobm-try-semantic ()
(let ( (tag (semantic-current-tag)) prefix )
(when tag
(setq prefix (assoc (cadr tag) autobm-try-semantic-type-alist))
(when prefix
(format "%s: %s" (cdr prefix) (car tag))))))
(defun autobm-suggest ()
"Suggest bookmark name depending on buffer mode and local
context using `autobm-try-semantic-type-alist'. First checked major
mode then active minor modes."
(let ((result nil))
(catch 'exit
(dolist (h (autobm-get-active-handlers))
(when (setq result (funcall h))
(throw 'exit result))))))
;;;###autoload
(defun autobm (&optional no-overwrite)
(interactive "P")
(let ( (name (autobm-suggest)) )
(when name
(setq name (read-string "Set bookmark: " name bookmark-minibuffer-read-name-map name)))
(bookmark-set name no-overwrite)))
;; (global-set-key (kbd "C-x r m") 'autobm)
(provide 'autobm)