Как использовать align.el и `align-current` для простого выравнивания форм let

я хочу выровнять

(let ((blah  foo)
      (asdfasdf asdasdfafd))
  (message "foo"))

to be

(let ((blah     foo)
      (asdfasdf asdasdfafd))
  (message "foo"))

Другими словами, допустимые значения должны быть правильно выровнены.

Если я выберу первые две строки, то эта функция сработает:

(defun align-try-1 (beg end)
  (interactive "r")
  (align-regexp beg end "^\\s-*+\\(?:(let\\S-*\\|\\)\\s-*(+\\S-+\\(\\s-+\\)" 1 1 nil))

Однако я хочу заставить align-current работать, подключившись к механизму align. то есть с точкой в ​​любом месте первых двух строк правильное выравнивание должно произойти, не затрагивая третью строку.


person event_jr    schedule 28.05.2012    source источник


Ответы (1)


Вы не можете сканировать секспсы в регулярных выражениях, так как они сканируются рекурсивно.

Я написал эту вещь без выравнивания (я не совсем уверен, что это можно сделать с помощью функции выравнивания, но просто придерживаясь sexp-перемещений, переходов и вставок, мне становится легче).

(defun align-try-1 (beg end)
  (interactive "r")
  (goto-char beg)
  (let ((endmarker (move-marker (make-marker) end)))
    (catch :break
      (while t
        (catch :continue
          (let ((actual-begin (re-search-forward "(\\([[:space:]\n]*\\)let\\([[:space:]\n]*\\)(" endmarker t))
                 (max-column  0))
            (unless actual-begin (throw :break nil))
            (when (or (in-string-p)
                    (eq (get-char-property actual-begin 'face) 'font-lock-comment-face))
              (throw :continue nil))
            (while (and (< (point) endmarker) (ignore-errors (down-list) t) (ignore-errors (forward-sexp) t))
              (when (looking-at "[[:space:]\n]+") (delete-region (match-beginning 0) (match-end 0)))
              (insert " ")
              (when (< max-column (current-column))
                (setq max-column (current-column)))
              (backward-up-list)
              (forward-sexp))
            (goto-char actual-begin)
            (while (and (< (point) endmarker) (ignore-errors (down-list) t) (ignore-errors (forward-sexp) t))
              (when (looking-at "[[:space:]\n]+") (delete-region (match-beginning 0) (match-end 0)))
              (dotimes (i (- max-column (current-column))) (insert " "))
              (backward-up-list)
              (forward-sexp))
            (goto-char actual-begin)
            ))))))

Кстати, а где вы его используете?

Обновление: добавлены проверки на присутствие в комментарии или строке.

Обновление: удалено принудительное форматирование, потому что оно содержит ошибки и не требуется в исходном вопросе.

person desudesudesu    schedule 13.06.2012
comment
Этот вопрос был попыткой лучше понять align механизмы. Я могу собрать функцию, которая работает с align-regexp, но не знал, как подключить ее, чтобы работала align-current. - person event_jr; 15.06.2012