emacs - change face of current line number
[dotfiles.git] / emacs.d / config / init-linum.el
1 ;; refer to https://github.com/aaronbieber/dotfiles/blob/master/configs/emacs.d/lisp/init-linum.el
2 ;; Stuff for line numbers.
3 (defface linum-current
4 ;  '((t (:inherit linum :weight bold :underline "#555")))
5   '((t (:inherit linum :weight bold :foreground "Yellow")))
6   "The current line number.")
7
8 (defun my-linum-get-format-string ()
9  (let* ((width (min 4 (1+ (length (number-to-string
10                              (count-lines (point-min) (point-max)))))))
11          (format (concat "%" (number-to-string width) "d "))
12          (current-line-format (concat "%-" (number-to-string width) "d ")))
13     (setq my-linum-format-string format)
14 ;    (setq my-linum-current-line-format-string current-line-format)))
15     (setq my-linum-current-line-format-string format)))
16
17 (defvar my-linum-current-line-number 0)
18
19 (setq linum-format 'my-linum-relative-line-numbers)
20
21 (defun my-linum-relative-line-numbers (line-number)
22   (let* ((offset (abs (- line-number my-linum-current-line-number)))
23          (linum-display-value (if (= 0 offset)
24                            my-linum-current-line-number
25                                 offset))
26          (format-string (if (= my-linum-current-line-number line-number) my-linum-current-line-format-string my-linum-format-string))
27          (face (if (= my-linum-current-line-number line-number) 'linum-current 'linum)))
28     (propertize (format format-string linum-display-value) 'face face)))
29
30 (defadvice linum-update (around my-linum-update)
31   (let ((my-linum-current-line-number (line-number-at-pos)))
32     ad-do-it))
33 (ad-activate 'linum-update)
34
35 ;;; Set up relative line numbering to mimic `:set number relativenumber`.
36 (global-linum-mode t)
37 (add-hook 'linum-before-numbering-hook 'my-linum-get-format-string)
38
39 (provide 'init-linum)