Emacs 如何使用align.el和“align current”轻松对齐let表单

Emacs 如何使用align.el和“align current”轻松对齐let表单,emacs,elisp,Emacs,Elisp,我想保持一致 (让((废话) (asdfasdf asdasdfafd)) (信息“foo”)) 将来 换句话说,let绑定值应该正确对齐 如果我选择前两行,则此功能有效: (defun align-try-1 (beg end) (interactive "r") (align-regexp beg end "^\\s-*+\\(?:(let\\S-*\\|\\)\\s-*(+\\S-+\\(\\s-+\\)" 1 1 nil)) 但是,我希望通过挂接到align中使align当前

我想保持一致

(让((废话)
(asdfasdf asdasdfafd))
(信息“foo”))
将来

换句话说,let绑定值应该正确对齐

如果我选择前两行,则此功能有效:

(defun align-try-1 (beg end)
  (interactive "r")
  (align-regexp beg end "^\\s-*+\\(?:(let\\S-*\\|\\)\\s-*(+\\S-+\\(\\s-+\\)" 1 1 nil))
但是,我希望通过挂接到align中使align当前工作
机械i、 e.当点位于前两行的任意位置时,应在不影响第三行的情况下进行正确对齐。

您不能在regexps中扫描sexp,因为它们是递归扫描的

我写这篇文章时没有使用align(我不确定是否可以使用align函数来完成,但坚持sexp移动、gotos和插入对我来说更容易)

(取消对齐-try-1(beg结束)
(交互式“r”)
(goto char beg)
(让((结束标记(移动标记(使标记)结束)))
(接球:休息
(而t
(捕获:继续
(let((实际开始(向前搜索)(\\([[:space:][n]*\\)let\([:space:][n]*\\)([endmarker t))
(第0列最大值)
(除非实际开始(投掷:断零))
(when(或)(in-string-p)
(eq(获取字符属性实际开始'face'字体锁定注释face))
(掷:继续零)
(while(和(<(点)endmarker)(忽略错误(下拉列表)t)(忽略错误(向前sexp)t))
(当(查看“[[:空格:]\n]+”(删除区域(匹配开始0)(匹配结束0))时)
(插入“”)
(当(<最大列(当前列))
(设置最大列(当前列)))
(倒排列表)
(前进性别)
(转到字符实际开始)
(while(和(<(点)endmarker)(忽略错误(下拉列表)t)(忽略错误(向前sexp)t))
(当(查看“[[:空格:]\n]+”(删除区域(匹配开始0)(匹配结束0))时)
(dotimes(i(-max列(当前列)))(插入“”)
(倒排列表)
(前进性别)
(转到字符实际开始)
))))))
顺便问一下,你在哪里用它

更新:添加了注释或字符串中的检查


更新:删除了强制格式化内容,因为它有缺陷,在原始问题中不需要。

这个问题是为了更好地理解
align
机制。我可以破解一个与
align regexp
一起工作的函数,但不确定如何连接它,以便
align current
wWorks。
(defun align-try-1 (beg end)
  (interactive "r")
  (align-regexp beg end "^\\s-*+\\(?:(let\\S-*\\|\\)\\s-*(+\\S-+\\(\\s-+\\)" 1 1 nil))
(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)
            ))))))