Я изменяю некоторый код elisp из linum.el:
(custom-set-variables '(linum-format 'dynamic))
(defadvice linum-update-window (around linum-dynamic activate)
(let* ((w (length (number-to-string
(+ (count-lines (point-min) (point-max)) 1))))
(linum-format (concat " %" (number-to-string w) "d ")))
ad-do-it))
Я смог исправить ошибку, когда отступ был один за другим, изменив (count-lines (point-min) (point-max))
на (+ (count-lines (point-min) (point-max)) 1)
. Это было легко.
Но теперь я хочу изменить его так, чтобы минимальная ширина равнялась 2, добавляя условное условие (concat " %" (number-to-string w) "2d ")
if, если число строк равно <10.
Это должно быть легко! Добавьте одно условие и скопируйте / вставьте конкат. Кусок пирога, верно? Я имею в виду, я знаю, что я должен делать, но я редко прикасаюсь к elisp, и я всегда пугаюсь, когда мне нужно что-то изменить с большим количеством скобок.
«Правильный» стиль, насколько я понимаю, состоит в том, чтобы структурировать код на основе отступа и обернуть завершающие скобки в конце строки, а не самостоятельно. Исходя из других языков стиля C, я борюсь с чтением и написанием кода таким образом. Итак, мой вопрос: что я делаю не так? Как я должен редактировать elisp и перемещаться по коду так, чтобы мне не приходилось сидеть там и считать все скобки?
Когда я работаю с чем-то в elisp, которое становится слишком глубоким, мне приходится закрывать дверь, открывать жалюзи и начинать располагать скобки в стиле K & R, чтобы я мог не только читать, но и изменять чертову вещь, не сходя с ума.
Очевидно, я делаю все это неправильно. Как я могу без страха дотронуться до elisp?
Обратите внимание, что мой вопрос заключается в том, как перемещаться и редактировать elisp, а не как вопрос стиля. В качестве руководства по стилю я уже использую следующее: https://github.com/bbatsov/emacs-lisp-style-guide
Обновления:
Как правильно отформатировать elisp перед тем, как смущать себя на emacs.stackexchange:
Отметьте свой elisp и выполните M-x indent-region
.
Решение проблемы:
Для тех, кто хочет знать, как выполнить выравнивание по правому краю для linum с минимальной шириной два, вот решение:
(defadvice linum-update-window (around linum-dynamic activate)
(let* ((w (length (number-to-string
(+ (count-lines (point-min) (point-max)) 1))))
(linum-format (if (> w 1)
(concat " %" (number-to-string w) "d ")
" %2d ")))
ad-do-it))
%2d
потому что, как только ширина переходит к 3 или более символам, она переходит от «выровнять по правому краю» к «выровненному по левому краю»
highlight-parentheses
; rainbow-delimiters
; и т.д. Вот моя собственная упрощенная версия, highlight-parentheses
которая разрешает прокрутку без удаления скобок, которые были раскрашены в последний раз: stackoverflow.com/a/23998965/2112489 В будущем это один вопрос для каждого клиента / потока.