【问题标题】:How to use align.el and `align-current` to align let forms easily如何使用 align.el 和 `align-current` 轻松对齐 let 表单
【发布时间】:2012-05-28 12:21:42
【问题描述】:

我要对齐

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

成为

(let ((blah     foo)
      (asdfasdf asdasdfafd))
  (message "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-current 工作 机械。即前两行中的任意点,正确的对齐应该发生而不影响第三行。

【问题讨论】:

    标签: emacs elisp


    【解决方案1】:

    您无法扫描正则表达式中的 sexps,因为它们是递归扫描的。

    我在没有 align 的情况下编写了这个东西(我不确定是否可以使用 align 函数来完成,但坚持使用 sexp 移动、goto 和插入对我来说更容易)。

    (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)
                ))))))
    

    顺便问一下,你在哪里使用它?

    更新:添加了检查是否在评论或字符串中。

    更新: 删除了强制格式化的东西,因为它有问题并且在原始问题中不需要。

    【讨论】:

    • 这个问题是为了更好地理解align机械。我可以组合一个与align-regexp 一起使用的函数,但不知道如何连接它,所以align-current 可以工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-30
    • 2011-07-13
    • 1970-01-01
    • 1970-01-01
    • 2021-09-10
    • 2012-01-18
    • 1970-01-01
    相关资源
    最近更新 更多