spacemacs/layers/+spacemacs/spacemacs-ui/packages.el

305 lines
11 KiB
EmacsLisp

;;; packages.el --- Spacemacs UI Layer packages File
;;
;; Copyright (c) 2012-2016 Sylvain Benner & Contributors
;;
;; Author: Sylvain Benner <sylvain.benner@gmail.com>
;; URL: https://github.com/syl20bnr/spacemacs
;;
;; This file is not part of GNU Emacs.
;;
;;; License: GPLv3
(setq spacemacs-ui-packages
'(ace-link
(centered-cursor :location local)
desktop
(doc-view :location built-in)
flx-ido
info+
open-junk-file
paradox
restart-emacs
window-numbering))
;; Initialization of packages
(defun spacemacs-ui/init-ace-link ()
(use-package ace-link
:commands spacemacs/ace-buffer-links
:init
(progn
(define-key spacemacs-buffer-mode-map "o" 'spacemacs/ace-buffer-links)
(with-eval-after-load 'info
(define-key Info-mode-map "o" 'ace-link-info))
(with-eval-after-load 'help-mode
(define-key help-mode-map "o" 'ace-link-help))
(with-eval-after-load 'eww
(define-key eww-link-keymap "o" 'ace-link-eww)
(define-key eww-mode-map "o" 'ace-link-eww)))
:config
(progn
(defvar spacemacs--link-pattern "~?/.+\\|\s\\[")
(defun spacemacs//collect-spacemacs-buffer-links ()
(let ((end (window-end))
points)
(save-excursion
(goto-char (window-start))
(while (re-search-forward spacemacs--link-pattern end t)
(push (+ (match-beginning 0) 1) points))
(nreverse points))))
(defun spacemacs/ace-buffer-links ()
"Ace jump to links in `spacemacs' buffer."
(interactive)
(let ((res (avy-with spacemacs/ace-buffer-links
(avy--process
(spacemacs//collect-spacemacs-buffer-links)
#'avy--overlay-pre))))
(when res
(goto-char (1+ res))
(widget-button-press (point))))))))
(defun spacemacs-ui/init-centered-cursor ()
(use-package centered-cursor-mode
:commands (centered-cursor-mode
global-centered-cursor-mode)
:init
(progn
(spacemacs|add-toggle centered-point
:mode centered-cursor-mode
:documentation
"Keep point at the center of the window."
:evil-leader "t-")
(spacemacs|add-toggle centered-point-globally
:mode global-centered-cursor-mode
:documentation
"Keep point at the center of the window globally."
:evil-leader "t C--"))
:config
(progn
(setq ccm-recenter-at-end-of-file t
ccm-ignored-commands '(mouse-drag-region
mouse-set-point
widget-button-click
scroll-bar-toolkit-scroll
evil-mouse-drag-region))
(spacemacs|diminish centered-cursor-mode "" " -"))))
(defun spacemacs-ui/init-desktop ()
(use-package desktop
:defer t
:init
(setq desktop-dirname spacemacs-cache-directory)
:config
(push spacemacs-cache-directory desktop-path)))
(defun spacemacs-ui/init-doc-view ()
(use-package doc-view
:defer t
:init
(evilified-state-evilify doc-view-mode doc-view-mode-map
"/" 'spacemacs/doc-view-search-new-query
"?" 'spacemacs/doc-view-search-new-query-backward
"gg" 'doc-view-first-page
"G" 'spacemacs/doc-view-goto-page
"gt" 'doc-view-goto-page
"h" 'doc-view-previous-page
"j" 'doc-view-next-line-or-next-page
"k" 'doc-view-previous-line-or-previous-page
"K" 'doc-view-kill-proc-and-buffer
"l" 'doc-view-next-page
"n" 'doc-view-search
"N" 'doc-view-search-backward
(kbd "C-d") 'doc-view-scroll-up-or-next-page
(kbd "C-k") 'doc-view-kill-proc
(kbd "C-u") 'doc-view-scroll-down-or-previous-page)
:config
(progn
(defun spacemacs/doc-view-search-new-query ()
"Initiate a new query."
(interactive)
(doc-view-search 'newquery))
(defun spacemacs/doc-view-search-new-query-backward ()
"Initiate a new query."
(interactive)
(doc-view-search 'newquery t))
(defun spacemacs/doc-view-goto-page (&optional count)
(interactive (list
(when current-prefix-arg
(prefix-numeric-value current-prefix-arg))))
(if (null count)
(doc-view-last-page)
(doc-view-goto-page count)))
;; fixed a weird issue where toggling display does not
;; swtich to text mode
(defadvice doc-view-toggle-display
(around spacemacs/doc-view-toggle-display activate)
(if (eq major-mode 'doc-view-mode)
(progn
ad-do-it
(text-mode)
(doc-view-minor-mode))
ad-do-it)))))
(defun spacemacs-ui/init-flx-ido ()
(use-package flx-ido
:init (flx-ido-mode 1)))
(defun spacemacs-ui/init-info+ ()
(use-package info+
:defer t
:init
(progn
(with-eval-after-load 'info
(require 'info+))
(setq Info-fontify-angle-bracketed-flag nil))))
(defun spacemacs-ui/init-open-junk-file ()
(use-package open-junk-file
:defer t
:commands (open-junk-file)
:init
(setq open-junk-file-format (concat spacemacs-cache-directory "junk/%Y/%m/%d-%H%M%S."))
(defun spacemacs/open-junk-file (&optional arg)
"Open junk file using helm or ivy.
Interface choice depends on whether the `ivy' layer is used or
not.
When ARG is non-nil search in junk files."
(interactive "P")
(let* ((fname (format-time-string open-junk-file-format (current-time)))
(rel-fname (file-name-nondirectory fname))
(junk-dir (file-name-directory fname))
(default-directory junk-dir))
(cond ((and arg (configuration-layer/layer-usedp 'ivy))
(spacemacs/counsel-search dotspacemacs-search-tools nil junk-dir))
((configuration-layer/layer-usedp 'ivy)
(require 'counsel)
(counsel-find-file rel-fname))
(arg
(require 'helm)
(let (helm-ff-newfile-prompt-p)
(spacemacs/helm-files-smart-do-search)))
(t
(require 'helm)
(let (helm-ff-newfile-prompt-p)
(helm-find-files-1 fname))))))
(spacemacs/set-leader-keys "fJ" 'spacemacs/open-junk-file)))
(defun spacemacs-ui/init-paradox ()
(use-package paradox
:commands paradox-list-packages
:init
(progn
(setq paradox-execute-asynchronously nil)
(defun spacemacs/paradox-list-packages ()
"Load depdendencies for auth and open the package list."
(interactive)
(require 'epa-file)
(require 'auth-source)
(when (and (not (boundp 'paradox-github-token))
(file-exists-p "~/.authinfo.gpg"))
(let ((authinfo-result (car (auth-source-search
:max 1
:host "github.com"
:port "paradox"
:user "paradox"
:require '(:secret)))))
(let ((paradox-token (plist-get authinfo-result :secret)))
(setq paradox-github-token (if (functionp paradox-token)
(funcall paradox-token)
paradox-token)))))
(paradox-list-packages nil))
(evilified-state-evilify paradox-menu-mode paradox-menu-mode-map
"H" 'paradox-menu-quick-help
"J" 'paradox-next-describe
"K" 'paradox-previous-describe
"L" 'paradox-menu-view-commit-list
"o" 'paradox-menu-visit-homepage)
(spacemacs/set-leader-keys
"ak" 'spacemacs/paradox-list-packages))))
(defun spacemacs-ui/init-restart-emacs()
(use-package restart-emacs
:defer t
:init
(defun spacemacs/restart-emacs (&optional args)
"Restart emacs."
(interactive)
(setq spacemacs-really-kill-emacs t)
(restart-emacs args))
(defun spacemacs/restart-emacs-resume-layouts (&optional args)
"Restart emacs and resume layouts."
(interactive)
(spacemacs/restart-emacs (cons "--resume-layouts" args)))
(defun spacemacs/restart-emacs-debug-init (&optional args)
"Restart emacs and enable debug-init."
(interactive)
(spacemacs/restart-emacs (cons "--debug-init" args)))
(defun spacemacs/restart-stock-emacs-with-packages (packages &optional args)
"Restart emacs without the spacemacs configuration, enable
debug-init and load the given list of packages."
(interactive
(progn
(unless package--initialized
(package-initialize t))
(let ((packages (append (mapcar 'car package-alist)
(mapcar 'car package-archive-contents)
(mapcar 'car package--builtins))))
(setq packages (mapcar 'symbol-name packages))
(let ((val (completing-read-multiple "Packages to load (comma separated): "
packages nil t)))
`(,val)))))
(let ((load-packages-string (mapconcat (lambda (pkg) (format "(use-package %s)" pkg))
packages " ")))
(spacemacs/restart-emacs-debug-init
(append (list "-q" "--execute"
(concat "(progn (package-initialize) "
"(require 'use-package)"
load-packages-string ")"))
args))))
(spacemacs/set-leader-keys
"qd" 'spacemacs/restart-emacs-debug-init
"qD" 'spacemacs/restart-stock-emacs-with-packages
"qr" 'spacemacs/restart-emacs-resume-layouts
"qR" 'spacemacs/restart-emacs)))
(defun spacemacs-ui/init-window-numbering ()
(use-package window-numbering
:config
(progn
(when (configuration-layer/package-usedp 'spaceline)
(defun window-numbering-install-mode-line (&optional position)
"Do nothing, the display is handled by the powerline."))
(setq window-numbering-auto-assign-0-to-minibuffer nil)
(spacemacs/set-leader-keys
"0" 'select-window-0
"1" 'select-window-1
"2" 'select-window-2
"3" 'select-window-3
"4" 'select-window-4
"5" 'select-window-5
"6" 'select-window-6
"7" 'select-window-7
"8" 'select-window-8
"9" 'select-window-9)
(window-numbering-mode 1))
;; make sure neotree is always 0
(defun spacemacs//window-numbering-assign ()
"Custom number assignment for neotree."
(when (and (boundp 'neo-buffer-name)
(string= (buffer-name) neo-buffer-name)
;; in case there are two neotree windows. Example: when
;; invoking a transient state from neotree window, the new
;; window will show neotree briefly before displaying the TS,
;; causing an error message. the error is eliminated by
;; assigning 0 only to the top-left window
(eq (selected-window) (window-at 0 0)))
0))
(setq window-numbering-assign-func #'spacemacs//window-numbering-assign)))