linum-mode plays more nicely with other margin-setting extensions
linum.el will only modify the left margin if it needs to, and will only reset the it back to 0 if it guesses that no-one has touched that margin in the meantime. As such, this is a more of a workaround than an actual fix, but fixes the problems described in bug#20674 regarding the interaction with modes such as darkroom-mode and olivetti-mode. A similar fix was commited to nlinum.el in ELPA.git's e7f5f549fbfb740b911fb7f33b42381ecece56d8 * linum.el (linum-delete-overlays): Restore margins more criteriously. (linum-update-window): Set margins more criteriously.
This commit is contained in:
parent
58e6235007
commit
b92307f670
1 changed files with 18 additions and 5 deletions
|
@ -120,7 +120,15 @@ Linum mode is a buffer-local minor mode."
|
|||
(mapc #'delete-overlay linum-overlays)
|
||||
(setq linum-overlays nil)
|
||||
(dolist (w (get-buffer-window-list (current-buffer) nil t))
|
||||
(set-window-margins w 0 (cdr (window-margins w)))))
|
||||
;; restore margins if needed FIXME: This still fails if the
|
||||
;; "other" mode has incidently set margins to exactly what linum
|
||||
;; had: see bug#20674 for a similar workaround in nlinum.el
|
||||
(let ((set-margins (window-parameter w 'linum--set-margins))
|
||||
(current-margins (window-margins w)))
|
||||
(when (and set-margins
|
||||
(equal set-margins current-margins))
|
||||
(set-window-margins w 0 (cdr current-margins))
|
||||
(set-window-parameter w 'linum--set-margins nil)))))
|
||||
|
||||
(defun linum-update-current ()
|
||||
"Update line numbers for the current buffer."
|
||||
|
@ -143,10 +151,10 @@ Linum mode is a buffer-local minor mode."
|
|||
|
||||
(defun linum--face-width (face)
|
||||
(let ((info (font-info (face-font face)))
|
||||
width)
|
||||
width)
|
||||
(setq width (aref info 11))
|
||||
(if (<= width 0)
|
||||
(setq width (aref info 10)))
|
||||
(setq width (aref info 10)))
|
||||
width))
|
||||
|
||||
(defun linum-update-window (win)
|
||||
|
@ -170,7 +178,7 @@ Linum mode is a buffer-local minor mode."
|
|||
(visited (catch 'visited
|
||||
(dolist (o (overlays-in (point) (point)))
|
||||
(when (equal-including-properties
|
||||
(overlay-get o 'linum-str) str)
|
||||
(overlay-get o 'linum-str) str)
|
||||
(unless (memq o linum-overlays)
|
||||
(push o linum-overlays))
|
||||
(setq linum-available (delq o linum-available))
|
||||
|
@ -193,7 +201,12 @@ Linum mode is a buffer-local minor mode."
|
|||
(setq width (ceiling
|
||||
(/ (* width 1.0 (linum--face-width 'linum))
|
||||
(frame-char-width)))))
|
||||
(set-window-margins win width (cdr (window-margins win)))))
|
||||
;; open up space in the left margin, if needed, and record that
|
||||
;; fact as a the window-parameter `linum--set-margins'
|
||||
(let ((existing-margins (window-margins win)))
|
||||
(when (> width (or (car existing-margins) 0))
|
||||
(set-window-margins win width (cdr existing-margins))
|
||||
(set-window-parameter win 'linum--set-margins (window-margins win))))))
|
||||
|
||||
(defun linum-after-change (beg end _len)
|
||||
;; update overlays on deletions, and after newlines are inserted
|
||||
|
|
Loading…
Add table
Reference in a new issue