3

揃えたい

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

することが

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

つまり、let 境界値は適切に配置する必要があります。

最初の 2 行を選択すると、次の関数が機能します。

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

ただし、align 機構にフックして align-current を機能させたいと考えています。つまり、最初の 2 行のどこかにポイントがあれば、3 行目に影響を与えずに正しい位置合わせが行われるはずです。

4

1 に答える 1

0

S式は再帰的にスキャンされるため、正規表現でスキャンすることはできません。

私はこのことを整列せずに書きました(整列機能で実行できるかどうかはよくわかりませんが、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)
            ))))))

ところで、どこで使うの?

更新:コメントまたは文字列に含まれているかどうかのチェックを追加しました。

更新:バグがあり、元の質問では必要ないため、強制フォーマットのものを削除しました。

于 2012-06-13T00:22:31.363 に答える