spacemacs/layers/+spacemacs/spacemacs-evil/packages.el
bmag 8f82486154 Add support for native line numbers in Emacs 26
Emacs 26.1 will introduce a new native line numbers feature:
"display-line-numbers". It includes relative line numbers, is faster than
current linum-mode, and doesn't use the margin area (it has its own area). So
yeah, we want to use the new feature when possible.

No changes are required on the user side, except for Emacs 26 users are
recommended to remove nlinum layer from their configuration (if they have
enabled it).

With this change:
- Emacs 26:
  - uses display-line-numbers by default.
  - linum and linum-relative packages are excluded.
- Emacs 25:
  - does NOT use display-line-numbers.
  - continues to use linum and linum-relative.
- nlinum layer:
  - can still be used as before in Emacs 25.
  - is NOT recommended in Emacs 26, but can be used.
  - when enabled, excludes display-line-numbers.

Also contains some bug fixes:

Fixes a bug where setting `dostpacemacs-line-numbers` to `t` or `relative`
enabled line numbers in every buffer, instead of only in buffers that derive
from prog-mode and text-mode.

Likewise fixes a bug where specifying `:enabled-for-modes nil` (or not
specifying `:enabled-for-modes` at all) in `dotspacemacs-line-numbers` settings
meant "enable in all modes" instead of "enable in modes derived from prog-mode
or text-mode".

Because of this change, also adds a way for users to enable line numbers
in *all* buffers.

Removes check for special buffer. All our current checks should be enough to
enable line numbers only where it makes sense. Disabling in all special buffers
is not necessary.
2018-05-28 19:29:15 +03:00

346 lines
13 KiB
EmacsLisp

;;; packages.el --- Spacemacs Evil Layer packages File
;;
;; Copyright (c) 2012-2018 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-evil-packages
'(evil-anzu
evil-args
evil-cleverparens
evil-ediff
evil-escape
evil-exchange
evil-iedit-state
evil-indent-plus
evil-lion
evil-lisp-state
;; for testing purpose, contribute by reporting bugs and sending PRs
;; to https://github.com/gabesoft/evil-mc
;; To enable it add `(global-evil-mc-mode)' to user-config function
evil-mc
evil-nerd-commenter
evil-matchit
evil-numbers
evil-search-highlight-persist
evil-surround
;; Temporarily disabled, pending the resolution of
;; https://github.com/7696122/evil-terminal-cursor-changer/issues/8
;; evil-terminal-cursor-changer
evil-tutor
(evil-unimpaired :location (recipe :fetcher local))
evil-visual-mark-mode
evil-visualstar
(hs-minor-mode :location built-in)
(linum-relative :toggle (version< emacs-version "26"))
vi-tilde-fringe
))
(defun spacemacs-evil/init-evil-anzu ()
(use-package evil-anzu
:init
(global-anzu-mode t)
:config
(progn
(spacemacs|hide-lighter anzu-mode)
(setq anzu-search-threshold 1000
anzu-cons-mode-line-p nil)
;; powerline integration
(when (configuration-layer/package-used-p 'spaceline)
(defun spacemacs/anzu-update-mode-line (here total)
"Custom update function which does not propertize the status."
(when anzu--state
(let ((status
(cl-case anzu--state
(search (format "(%s/%d%s)"
(anzu--format-here-position here total)
total (if anzu--overflow-p "+" "")))
(replace-query (format "(%d replace)" total))
(replace (format "(%d/%d)" here total)))))
status)))
(setq anzu-mode-line-update-function
'spacemacs/anzu-update-mode-line)))))
(defun spacemacs-evil/init-evil-args ()
(use-package evil-args
:init
(progn
;; bind evil-args text objects
(define-key evil-inner-text-objects-map "a" 'evil-inner-arg)
(define-key evil-outer-text-objects-map "a" 'evil-outer-arg))))
(defun spacemacs-evil/init-evil-cleverparens ()
(use-package evil-cleverparens
:defer t
:init
(progn
(setq evil-cleverparens-use-regular-insert t)
(eval `(spacemacs|add-toggle evil-safe-lisp-structural-editing
:if (memq dotspacemacs-editing-style '(vim hybrid))
:mode evil-cleverparens-mode
:documentation "Enable evil-cleverparens."
:evil-leader-for-mode
,@(mapcar (lambda (x) (cons x "Ts"))
evil-lisp-safe-structural-editing-modes)))
(spacemacs|diminish evil-cleverparens-mode " 🆂" " [s]"))))
(defun spacemacs-evil/init-evil-ediff ()
(use-package evil-ediff
:after (ediff)
:if (memq dotspacemacs-editing-style '(hybrid vim))))
(defun spacemacs-evil/init-evil-escape ()
(use-package evil-escape
:init (progn
(spacemacs|hide-lighter evil-escape-mode)
(spacemacs//evil-escape-deactivate-in-holy-mode dotspacemacs-editing-style)
(add-hook 'spacemacs-editing-style-hook #'spacemacs//evil-escape-deactivate-in-holy-mode))))
(defun spacemacs-evil/init-evil-exchange ()
(use-package evil-exchange
:init (evil-exchange-install)))
(defun spacemacs-evil/init-evil-iedit-state ()
(use-package evil-iedit-state
:commands (evil-iedit-state evil-iedit-state/iedit-mode)
:init
(progn
(setq iedit-current-symbol-default t
iedit-only-at-symbol-boundaries t
iedit-toggle-key-default nil)
(spacemacs/set-leader-keys "se" 'evil-iedit-state/iedit-mode))
:config
;; activate leader in iedit and iedit-insert states
(define-key evil-iedit-state-map
(kbd dotspacemacs-leader-key) spacemacs-default-map)
(spacemacs//iedit-insert-state-hybrid dotspacemacs-editing-style)
(add-hook 'spacemacs-editing-style-hook
#'spacemacs//iedit-insert-state-hybrid)))
(defun spacemacs-evil/init-evil-indent-plus ()
(use-package evil-indent-plus
:init (evil-indent-plus-default-bindings)))
(defun spacemacs-evil/init-evil-lion ()
(use-package evil-lion
:init
(progn
;; Override the default keys, as they collide
(setq evil-lion-left-align-key nil
evil-lion-right-align-key nil)
(spacemacs/set-leader-keys
"xal" 'evil-lion-left
"xaL" 'evil-lion-right)
(evil-lion-mode))))
(defun spacemacs-evil/init-evil-lisp-state ()
(use-package evil-lisp-state
:init (setq evil-lisp-state-global t)
:config (spacemacs/set-leader-keys "k" evil-lisp-state-map)))
(defun spacemacs-evil/init-evil-mc ()
(use-package evil-mc
:defer t
:init
(progn
;; evil-mc is not compatible with the paste transient state
(define-key evil-normal-state-map "p" 'spacemacs/evil-mc-paste-after)
(define-key evil-normal-state-map "P" 'spacemacs/evil-mc-paste-before)
(setq evil-mc-one-cursor-show-mode-line-text nil)
(when (or (spacemacs/system-is-mac) (spacemacs/system-is-mswindows))
(setq evil-mc-enable-bar-cursor nil)))))
;; other commenting functions in funcs.el with keybinds in keybindings.el
(defun spacemacs-evil/init-evil-nerd-commenter ()
(use-package evil-nerd-commenter
:commands evilnc-comment-operator
:init
(progn
;; double all the commenting functions so that the inverse operations
;; can be called without setting a flag
(defun spacemacs/comment-or-uncomment-lines-inverse (&optional arg)
(interactive "p")
(let ((evilnc-invert-comment-line-by-line t))
(evilnc-comment-or-uncomment-lines arg)))
(defun spacemacs/comment-or-uncomment-lines (&optional arg)
(interactive "p")
(let ((evilnc-invert-comment-line-by-line nil))
(evilnc-comment-or-uncomment-lines arg)))
(defun spacemacs/copy-and-comment-lines-inverse (&optional arg)
(interactive "p")
(let ((evilnc-invert-comment-line-by-line t))
(evilnc-copy-and-comment-lines arg)))
(defun spacemacs/copy-and-comment-lines (&optional arg)
(interactive "p")
(let ((evilnc-invert-comment-line-by-line nil))
(evilnc-copy-and-comment-lines arg)))
(defun spacemacs/quick-comment-or-uncomment-to-the-line-inverse
(&optional arg)
(interactive "p")
(let ((evilnc-invert-comment-line-by-line t))
(evilnc-comment-or-uncomment-to-the-line arg)))
(defun spacemacs/quick-comment-or-uncomment-to-the-line (&optional arg)
(interactive "p")
(let ((evilnc-invert-comment-line-by-line nil))
(evilnc-comment-or-uncomment-to-the-line arg)))
(defun spacemacs/comment-or-uncomment-paragraphs-inverse (&optional arg)
(interactive "p")
(let ((evilnc-invert-comment-line-by-line t))
(evilnc-comment-or-uncomment-paragraphs arg)))
(defun spacemacs/comment-or-uncomment-paragraphs (&optional arg)
(interactive "p")
(let ((evilnc-invert-comment-line-by-line nil))
(evilnc-comment-or-uncomment-paragraphs arg)))
(define-key evil-normal-state-map "gc" 'evilnc-comment-operator)
(define-key evil-normal-state-map "gy" 'spacemacs/copy-and-comment-lines)
(spacemacs/set-leader-keys
";" 'evilnc-comment-operator
"cl" 'spacemacs/comment-or-uncomment-lines
"cL" 'spacemacs/comment-or-uncomment-lines-inverse
"cp" 'spacemacs/comment-or-uncomment-paragraphs
"cP" 'spacemacs/comment-or-uncomment-paragraphs-inverse
"ct" 'spacemacs/quick-comment-or-uncomment-to-the-line
"cT" 'spacemacs/quick-comment-or-uncomment-to-the-line-inverse
"cy" 'spacemacs/copy-and-comment-lines
"cY" 'spacemacs/copy-and-comment-lines-inverse))))
(defun spacemacs-evil/init-evil-matchit ()
(use-package evil-matchit
:defer t))
(defun spacemacs-evil/init-evil-numbers ()
(use-package evil-numbers
:config
(progn
(spacemacs|define-transient-state evil-numbers
:title "Evil Numbers Transient State"
:doc
"\n[_+_/_=_] increase number [_-_] decrease [0..9] prefix [_q_] quit"
:bindings
("+" evil-numbers/inc-at-pt)
("=" evil-numbers/inc-at-pt)
("-" evil-numbers/dec-at-pt)
("q" nil :exit t))
(spacemacs/set-leader-keys
"n+" 'spacemacs/evil-numbers-transient-state/evil-numbers/inc-at-pt
"n=" 'spacemacs/evil-numbers-transient-state/evil-numbers/inc-at-pt
"n-" 'spacemacs/evil-numbers-transient-state/evil-numbers/dec-at-pt))))
(defun spacemacs-evil/init-evil-search-highlight-persist ()
(use-package evil-search-highlight-persist
:init
(progn
(global-evil-search-highlight-persist)
;; (set-face-attribute )
(define-key evil-search-highlight-persist-map
(kbd "C-x SPC") 'rectangle-mark-mode)
(spacemacs/set-leader-keys "sc" 'spacemacs/evil-search-clear-highlight)
(evil-ex-define-cmd "nohlsearch" 'spacemacs/evil-search-clear-highlight)
(spacemacs//adaptive-evil-highlight-persist-face)
(add-hook 'spacemacs-post-theme-change-hook
'spacemacs//adaptive-evil-highlight-persist-face))))
(defun spacemacs-evil/init-evil-surround ()
(use-package evil-surround
:init
(progn
(global-evil-surround-mode 1)
;; `s' for surround instead of `substitute'
;; see motivation for this change in the documentation
(evil-define-key 'visual evil-surround-mode-map "s" 'evil-surround-region)
(evil-define-key 'visual evil-surround-mode-map "S" 'evil-substitute))))
(defun spacemacs-evil/init-evil-terminal-cursor-changer ()
(use-package evil-terminal-cursor-changer
:if (not (display-graphic-p))
:init (setq evil-visual-state-cursor 'box
evil-insert-state-cursor 'bar
evil-emacs-state-cursor 'hbar)))
(defun spacemacs-evil/init-evil-tutor ()
(use-package evil-tutor
:commands (evil-tutor-start
evil-tutor-resume)
:init
(progn
(setq evil-tutor-working-directory
(concat spacemacs-cache-directory ".tutor/"))
(spacemacs/set-leader-keys "hT" 'evil-tutor-start))))
(defun spacemacs-evil/init-evil-unimpaired ()
;; No laziness here, unimpaired bindings should be available right away.
(use-package evil-unimpaired))
(defun spacemacs-evil/init-evil-visual-mark-mode ()
(use-package evil-visual-mark-mode
:defer t
:init
(spacemacs|add-toggle evil-visual-mark-mode
:mode evil-visual-mark-mode
:documentation "Enable evil visual marks mode."
:evil-leader "t`")))
(defun spacemacs-evil/init-evil-visualstar ()
(use-package evil-visualstar
:commands (evil-visualstar/begin-search-forward
evil-visualstar/begin-search-backward)
:init
(progn
(define-key evil-visual-state-map (kbd "*")
'evil-visualstar/begin-search-forward)
(define-key evil-visual-state-map (kbd "#")
'evil-visualstar/begin-search-backward))))
(defun spacemacs-evil/init-hs-minor-mode ()
(add-hook 'prog-mode-hook 'spacemacs//enable-hs-minor-mode))
(defun spacemacs-evil/init-linum-relative ()
(use-package linum-relative
:commands (linum-relative-toggle linum-relative-on)
:init
(progn
(when (spacemacs/relative-line-numbers-p)
(add-hook 'spacemacs-post-user-config-hook 'linum-relative-on))
(spacemacs/set-leader-keys "tr" 'spacemacs/linum-relative-toggle))
:config
(setq linum-relative-current-symbol "")))
(defun spacemacs-evil/init-vi-tilde-fringe ()
(spacemacs|do-after-display-system-init
(use-package vi-tilde-fringe
:init
(progn
(global-vi-tilde-fringe-mode)
(spacemacs|add-toggle vi-tilde-fringe
:mode global-vi-tilde-fringe-mode
:documentation
"Globally display a ~ on empty lines in the fringe."
:evil-leader "T~")
;; don't enable it on some special buffers
(with-current-buffer spacemacs-buffer-name
(spacemacs/disable-vi-tilde-fringe))
(add-hook 'which-key-init-buffer-hook 'spacemacs/disable-vi-tilde-fringe)
;; after a major mode is loaded, check if the buffer is read only
;; if so, disable vi-tilde-fringe-mode
(add-hook 'after-change-major-mode-hook
'spacemacs/disable-vi-tilde-fringe-read-only)
;; TODO move this hook if/when we have a layer for eww
(spacemacs/add-to-hooks 'spacemacs/disable-vi-tilde-fringe
'(eww-mode-hook)))
:config
(spacemacs|hide-lighter vi-tilde-fringe-mode))))