dotfiles/.config/emacs/lisp/init-bookmark.el

89 lines
4.3 KiB
EmacsLisp

;;; init-bookmark.el -*- lexical-binding: t -*-
;; Bookmark
(use-package bookmark
:ensure nil ; emacs built-in
:config
(with-no-warnings
;; Display icons for bookmarks
(defun my-bookmark-bmenu--revert ()
"Re-populate `tabulated-list-entries'."
(let (entries)
(dolist (full-record (bookmark-maybe-sort-alist))
(let* ((name (bookmark-name-from-full-record full-record))
(annotation (bookmark-get-annotation full-record))
(location (bookmark-location full-record))
(file (file-name-nondirectory location))
(type (let ((fmt "%-8.8s"))
(cond ((null location)
(propertize (format fmt "NOFILE") 'face 'warning))
((file-remote-p location)
(propertize (format fmt "REMOTE") 'face 'mode-line-buffer-id))
((not (file-exists-p location))
(propertize (format fmt "NOTFOUND") 'face 'error))
((file-directory-p location)
(propertize (format fmt "DIRED") 'face 'warning))
(t (propertize (format fmt "FILE") 'face 'success)))))
(icon (if (icons-displayable-p)
(cond
((file-remote-p location)
(nerd-icons-codicon "nf-cod-radio_tower"))
((file-directory-p location)
(nerd-icons-icon-for-dir location))
((not (string-empty-p file))
(nerd-icons-icon-for-file file)))
"")))
(push (list
full-record
`[,(if (and annotation (not (string-equal annotation "")))
"*" "")
,icon
,(if (display-mouse-p)
(propertize name
'font-lock-face 'bookmark-menu-bookmark
'mouse-face 'highlight
'follow-link t
'help-echo "mouse-2: go to this bookmark in other window")
name)
,type
,@(if bookmark-bmenu-toggle-filenames
(list (propertize location 'face 'completions-annotations)))])
entries)))
(tabulated-list-init-header)
(setq tabulated-list-entries entries))
(tabulated-list-print t))
(advice-add #'bookmark-bmenu--revert :override #'my-bookmark-bmenu--revert)
(defun my-bookmark-bmenu-list ()
"Display a list of existing bookmarks.
The list is displayed in a buffer named `*Bookmark List*'.
The leftmost column displays a D if the bookmark is flagged for
deletion, or > if it is flagged for displaying."
(interactive)
(bookmark-maybe-load-default-file)
(let ((buf (get-buffer-create bookmark-bmenu-buffer)))
(if (called-interactively-p 'interactive)
(pop-to-buffer buf)
(set-buffer buf)))
(bookmark-bmenu-mode)
(bookmark-bmenu--revert))
(advice-add #'bookmark-bmenu-list :override #'my-bookmark-bmenu-list)
(define-derived-mode bookmark-bmenu-mode tabulated-list-mode "Bookmark Menu"
(setq truncate-lines t)
(setq buffer-read-only t)
(setq tabulated-list-format
`[("" 1) ;; Space to add "*" for bookmark with annotation
("" ,(if (icons-displayable-p) 2 0)) ;; Icons
("Bookmark" ,bookmark-bmenu-file-column bookmark-bmenu--name-predicate)
("Type" 9)
,@(if bookmark-bmenu-toggle-filenames
'(("File" 0 bookmark-bmenu--file-predicate)))])
(setq tabulated-list-padding bookmark-bmenu-marks-width)
(setq tabulated-list-sort-key '("Bookmark" . nil))
(add-hook 'tabulated-list-revert-hook #'bookmark-bmenu--revert nil t)'
(setq revert-buffer-function #'bookmark-bmenu--revert)
(tabulated-list-init-header))))
(provide 'init-bookmark)
;;; init.el ends here