2013-11-27 46 views
2

我有以下代码,我使用的代码更新了我正在使用的一些遗留代码的编码风格。它现在可以正常工作,但令人烦恼的是,在某个区域执行该命令后,缓冲区会滚动,因此该区域的顶部位于窗口的顶部。我怎样才能解决这个问题?恢复Emacs中的垂直缓冲区位置

(defun mkm/cleanup() 
    (interactive) 
    (let (start end doit) 
    (if (region-active-p) 
     (setq start (region-beginning) end (region-end) doit t) 
     (progn (setq start (point-min) end (point-max)) 
      (setq doit (y-or-n-p "Really cleanup whole buffer? ")))) 
    (if doit 
     (save-excursion 
      (save-restriction 
      (narrow-to-region start end) 
      (replace-regexp "\([[:alpha:]]\)[ ]+" "\1 " nil (point-min) (point-max)) 
      (replace-regexp " *&" " &" nil (point-min) (point-max)) 
      (replace-regexp "[ ]*\\*" " *" nil (point-min) (point-max)) 
      (replace-regexp "(+" "(" nil (point-min) (point-max)) 
      (replace-regexp " +)" ")" nil (point-min) (point-max)) 
      (replace-regexp "{ +" "{" nil (point-min) (point-max)) 
      (replace-regexp "} +" "}" nil (point-min) (point-max)) 
      (replace-regexp " +]" "]" nil (point-min) (point-max)) 
      (replace-regexp "\s*,\s*" ", " nil (point-min) (point-max)) 
      (replace-regexp "\s*->\s*" "->" nil (point-min) (point-max)) 
      (replace-regexp "\\[ +" "\\[" nil (point-min) (point-max)) 
      (replace-regexp " += +" " = " nil (point-min) (point-max)) 
      (replace-regexp "\([[:alpha:]]\)[ ]+>" "\1>" nil (point-min) (point-max)) 
      (replace-regexp "<\s+" "<" nil (point-min) (point-max)) 
      (replace-regexp "<<\([^\s]\)" "<< \1" nil (point-min) (point-max)))) 
     (message "Cleanup aborted.")))) 

回答

2

下面是代码,相关功能是save-window-excursion

(defun mkm/cleanup() 
    (interactive) 
    (let (start end doit) 
    (if (region-active-p) 
     (setq start (region-beginning) 
       end (region-end) 
       doit t) 
     (setq start (point-min) 
      end (point-max) 
      doit (y-or-n-p "Really cleanup whole buffer? "))) 
    (if doit 
     (save-window-excursion 
      (save-excursion 
      (save-restriction 
       (narrow-to-region start end) 
       (mapc 
       (lambda(x) 
       (replace-regexp 
        (car x) (cdr x) 
        nil (point-min) (point-max))) 
       '(("\([[:alpha:]]\)[ ]+" . "\1 ") 
       (" *&" . " &")("[ ]*\\*" . " *") 
       ("(+" . "(")(" +)" . ")")("{ +" . "{") 
       ("} +" . "}")(" +]" . "]")("\s*,\s*" . ", ") 
       ("\s*->\s*" . "->")("\\[ +" . "\\[") 
       (" += +" . " = ") 
       ("\([[:alpha:]]\)[ ]+>" . "\1>") 
       ("<\s+" . "<")("<<\([^\s]\)" . "<< \1")))))) 
     (message "Cleanup aborted.")))) 
+0

大,这个工作!我认为你的意思是'save-window-excursion'是相关的函数。感谢您提出重新分解,我认为这样更好:) – mkm

0

不要使用save-excursionsave-excursion说,“做这个东西,但后来回到这里。”这听起来像是你想要它而不是“做这个东西,只是留在你最终的地方。”

0

您可能只需要:

(let ((windowstart (window-start))) 
    ;; ... 
    (set-window-start (selected-window) windowstart))