diff --git a/core/autoload/ui.el b/core/autoload/ui.el index e8d3673bc..35e84485a 100644 --- a/core/autoload/ui.el +++ b/core/autoload/ui.el @@ -9,21 +9,34 @@ (unless (frame-parameter nil 'fullscreen) 'fullboth))) +(defvar doom--line-number-style doom-line-numbers-style) ;;;###autoload -(defun doom/toggle-line-numbers (&optional arg) - "Toggle `linum-mode'." - (interactive "P") - (cond ((boundp 'display-line-numbers) - (setq display-line-numbers - (pcase arg - ('(4) 'relative) - (1 t) - (-1 nil) - (_ (not display-line-numbers))))) - ((featurep 'nlinum) - (nlinum-mode (or arg (if nlinum-mode -1 +1)))) - (t - (error "No line number plugin detected")))) +(defun doom/toggle-line-numbers () + "Toggle line numbers. + +Cycles through regular, relative and no line numbers. The order depends on what +`doom-line-numbers-style' is set to. + +Uses `display-line-numbers' in Emacs 26+ and `nlinum-mode' everywhere else." + (interactive) + (let* ((order (pcase doom-line-numbers-style + (`relative '(relative t nil)) + (`t '(t relative nil)) + (`nil '(nil t relative)))) + (queue (memq doom--line-number-style order)) + (next (if (= (length queue) 1) + (car order) + (car (cdr queue))))) + (setq doom--line-number-style next) + (cond ((boundp 'display-line-numbers) + (setq display-line-numbers next)) + ((featurep 'nlinum) + (pcase next + (`t (nlinum-relative-mode -1) (nlinum-mode +1)) + (`relative (nlinum-relative-mode +1)) + (`nil (nlinum-mode -1)))) + (t + (error "No line number plugin detected"))))) ;;;###autoload (defun doom-resize-window (window new-size &optional horizontal force-p) diff --git a/core/core-ui.el b/core/core-ui.el index 538947633..eda1a12ff 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -319,13 +319,15 @@ DEFAULT is non-nil, set the default mode-line for all buffers." ;; (defvar doom-line-numbers-style t - "The style to use for the line number display. + "The default styles to use for the line number display. -Accepts the same arguments as `display-line-numbers', which are: +Takes the same argument as `display-line-numbers' in Emacs 26, which are: -nil No line numbers -t Ordinary line numbers -'relative Relative line numbers") + nil No line numbers + t Ordinary line numbers + 'relative Relative line numbers + +Use `doom/toggle-line-numbers' to cycle between these line number styles.") (defun doom|enable-line-numbers (&optional arg) "Enables the display of line numbers, using `display-line-numbers' (in Emacs @@ -333,13 +335,9 @@ t Ordinary line numbers See `doom-line-numbers-style' to control the style of line numbers to display." (cond ((boundp 'display-line-numbers) - (setq display-line-numbers - (pcase arg - (+1 doom-line-numbers-style) - (-1 nil) - (_ doom-line-numbers-style)))) + (setq display-line-numbers (unless (eq arg -1) doom-line-numbers-style))) ((eq doom-line-numbers-style 'relative) - (if (= arg -1) + (if (eq arg -1) (nlinum-relative-off) (nlinum-relative-on))) ((not (null doom-line-numbers-style)) @@ -418,8 +416,7 @@ character that looks like a space that `whitespace-mode' won't affect.") (def-package! nlinum-relative :unless (boundp 'display-line-numbers) :commands nlinum-relative-mode - :config - (after! evil (nlinum-relative-setup-evil))) + :config (after! evil (nlinum-relative-setup-evil))) ;;