2012-05-28 40 views
3

我要對齊如何使用align.el和`ALIGN-current`對齊讓形式容易

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

(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 機械進行對齊,當前的工作。即前兩行中的任何位置的點,正確的對齊應該發生而不影響第三行。

回答

0

你不能在regexps中掃描sexps,因爲它們是遞歸掃描的。我不確定是否可以使用對齊功能來完成,但只是堅持sexp動作,gotos和插入使我更容易)。

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

順便說一下,你在哪裏使用它?

更新:添加了在評論或字符串中的檢查。

更新:刪除強制格式化thingy,因爲它的bug,並不需要在原來的問題。

+0

這個問題是爲了更好地理解'align'機械的練習。我可以在一起使用'align-regexp'工作的函數,但不知道如何將它連接起來,以便'align-current'起作用。 –