2011-11-13 26 views
9

Tôi đang chạy chức năng này (tương tác và trong một cái móc) để định dạng lại mã nguồnemacs lưu-tham quan không khôi phục điểm?

(defun a-style()                                               
    (interactive)                                               
    (save-excursion                                               
    (shell-command-on-region (point-min) (point-max) "/usr/local/bin/astyle -A10 -s4 -m0 -M40 -k1 -W0 -z2 -xd -CSKNLwYfpHjJcn" t t))) 

nhưng tiết kiệm-tham quan dường như không làm việc, điểm luôn nhảy đến 1 (lệnh shell làm việc mặc dù!). Tôi có thiếu thứ gì đó hiển nhiên ở đây không?

Cảm ơn, Mario

EDIT:

Vì vậy, cuối cùng tôi đã làm điều đó một cách ngây thơ:

(defun a-style()                                               
    (interactive)                                               
    (setq temp-point (point))                                            
    (shell-command-on-region (point-min) (point-max) "/usr/local/bin/astyle -A10 -s4 -m0 -M40 -k1 -W0 -z2 -xd -CSKNLwYfpHjJcn" t t)                   
    (goto-char temp-point)) 

Kinda ngu ngốc, nhưng những gì tôi muốn. Nếu có ai biết về một giải pháp tốt hơn, tôi sẽ biết ơn.

+2

Làm thế nào về biểu mẫu 'let' thay vì' setq'? –

Trả lời

10

Các tài liệu cho shell-command-on-region nói trong phần:

Nếu REPLACE, đối số thứ năm bắt buộc, là phi nil, có nghĩa là chèn đầu ra ở vị trí của văn bản từ đầu đến cuối, đặt điểm và đánh dấu xung quanh nó.

Vì bạn có REPLACE được đặt thành t, nó thay thế tất cả văn bản và đặt điểm và đánh dấu xung quanh nó, và do đó trỏ tới điểm-phút. Hơn nữa, tôi nghĩ rằng khi điểm được lưu trước đó bởi save-excursion được xóa, Emacs sẽ sao lưu vào đầu vùng bị xóa, một lần nữa là điểm-phút.

Tôi nghĩ giải pháp của bạn là tốt.

3

Tôi biết đây là câu hỏi cũ nhưng tôi đã gặp phải vấn đề tương tự này. Đây là một macro đơn giản khôi phục điểm và vùng đệm:

(defmacro my-save-excursion (&rest forms) 
    `(let* (
    (oldp (point)) 
    (oldbuff (current-buffer)) 
    (retval (progn ,@forms)) 
    ) 

    (unless (eq (current-buffer) oldbuff) (switch-to-buffer oldbuff)) 
    (goto-char oldp) 
    retval 
    ) 
) 
Các vấn đề liên quan