2011-11-13 12 views
9

私はソースコードemacs save-excursionはポイントを復元していませんか?

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

を再フォーマットするために、この機能(対話式とフックで)を実行しているが、保存-遠足が動作するようには思えない、ポイントは常に1にジャンプ(シェルコマンドはしかし作品! )。私はここで何かを見逃していますか?

おかげで、 マリオ

EDIT:

は、だから私は最終的にそれを素朴な方法でした:

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

ちょっと愚かに、私は何をしたいん。誰かがより良い解決策を知っていれば、私は感謝します。 shell-command-on-regionため

+2

'setq'の代わりに' let'フォームはどうですか? –

答えて

10

ドキュメントは、部分的に言う:

、オプションの5番目の引数をREPLACE、非nilであれば、それはポイントとマークを入れて、STARTからENDまでのテキストの代わりに 出力を挿入意味しますその周辺の

REPLACEをtに設定すると、すべてのテキストが置換され、その周囲にポイントとマークが置き換えられ、point-minになります。さらに、以前にsave-excursionで保存された場所が削除されると、Emacsは削除された領域の先頭に戻って再びポイントアップすると思います。

あなたのソリューションは問題ないと思います。

3

私はこれが古い質問であることを知っていますが、私はこの同じ問題に遭遇しました。ここでは、ポイントとバッファを復元する簡単なマクロを紹介します。

(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 
    ) 
) 
関連する問題