瀏覽代碼

org-table: Do not modify buffer needlessly when aligning table

* lisp/org-table.el (org-table-align): Compare new table with old one
  before replacing it.  Only replace modified lines.
Nicolas Goaziou 10 年之前
父節點
當前提交
6d60138260
共有 1 個文件被更改,包括 11 次插入12 次删除
  1. 11 12
      lisp/org-table.el

+ 11 - 12
lisp/org-table.el

@@ -723,7 +723,7 @@ When nil, simply write \"#ERROR\" in corrupted fields.")
 	 (colpos (org-table-current-column))
 	 (winstart (window-start))
 	 (winstartline (org-current-line (min winstart (1- (point-max)))))
-	 lines (new "") lengths l typenums ty fields maxfields i
+	 lines lengths l typenums ty fields maxfields i
 	 column
 	 (indent "") cnt frac
 	 rfmt hfmt
@@ -796,7 +796,7 @@ When nil, simply write \"#ERROR\" in corrupted fields.")
     (setq emptystrings (make-list maxfields ""))
     ;; Check for special formatting.
     (setq i -1)
-    (while (< (setq i (1+ i)) maxfields)   ;; Loop over all columns
+    (while (< (setq i (1+ i)) maxfields) ;; Loop over all columns
       (setq column (mapcar (lambda (x) (or (nth i x) "")) fields))
       ;; Check if there is an explicit width specified
       (setq fmax nil)
@@ -820,7 +820,7 @@ When nil, simply write \"#ERROR\" in corrupted fields.")
 		  (setq f1 (min fmax (or (string-match org-bracket-link-regexp xx) fmax)))
 		  (unless (> f1 1)
 		    (user-error "Cannot narrow field starting with wide link \"%s\""
-			   (match-string 0 xx)))
+				(match-string 0 xx)))
 		  (setq f2 (length xx))
 		  (if (= (org-string-width xx)
 			 f2)
@@ -882,16 +882,15 @@ When nil, simply write \"#ERROR\" in corrupted fields.")
     (setq rfmt (concat rfmt "\n")
 	  hfmt (concat (substring hfmt 0 -1) "|\n"))
 
-    (setq new (mapconcat
-	       (lambda (l)
-		 (if l (apply 'format rfmt
-			      (append (pop fields) emptystrings))
-		   hfmt))
-	       lines ""))
     (move-marker org-table-aligned-begin-marker (point))
-    (insert new)
-    ;; Replace the old one
-    (delete-region (point) end)
+    ;; Replace modified lines only.
+    (dolist (l lines)
+      (let ((line (if l (apply #'format rfmt (append (pop fields) emptystrings))
+		    hfmt)))
+	(if (equal (buffer-substring (point) (line-beginning-position 2)) line)
+	    (forward-line)
+	  (insert line)
+	  (delete-region (point) (line-beginning-position 2)))))
     (move-marker end nil)
     (move-marker org-table-aligned-end-marker (point))
     (when (and orgtbl-mode (not (derived-mode-p 'org-mode)))