2011-01-15 6 views
6

emacsでキーを設定して、バッファ内のファイルに対してシェルコマンドを実行し、プロンプトを表示せずにバッファを元に戻したいとします。シェルコマンドは次のとおりです。p4 edit 'currentfilename.ext'elisp:現在のファイルのコマンドを呼び出す

(global-set-key [\C-E] (funcall 'revert-buffer 1 1 1)) 
;; my attempt above to call revert-buffer with a non-nil 
;; argument (ignoring the shell command for now) -- get an init error: 
;; Error in init file: error: "Buffer does not seem to be associated with any file" 

完全に新しいelispです。 emacs manualから、ここで差し戻しバッファの定義は次のとおりです。

Command: revert-buffer &optional ignore-auto noconfirm preserve-modes 

ありがとう!

+0

バッファがすでに編集されているため、またはシェルコマンドがバッファの内容を壊すため、バッファを元に戻しますか? – zwol

+0

バッファは読み取り専用ではなく書き込みに変更され、バージョンコントロールに追加されるためです。 – ash

答えて

5

表示されている実際のエラーは、グローバルセットキーが間違って指定されたこと、つまり関数呼び出しが原因です。何が欲しいのです:

(global-set-key (kbd "C-S-e") '(lambda() (revert-buffer t t t))) 

あなたが実際にあなたの.emacsがエラーの原因である、ロードされたときに評価 funcallを持っていました。

その後、全体を取得するには、次のようなコマンドを作成することができます。

(defun call-something-on-current-buffers-file() 
    "run a command on the current file and revert the buffer" 
    (interactive) 
    (shell-command 
    (format "/home/tjackson/bin/dummy.sh %s" 
     (shell-quote-argument (buffer-file-name)))) 
    (revert-buffer t t t)) 
(global-set-key (kbd "C-S-e") 'call-something-on-current-buffers-file) 

明らかにコマンドをカスタマイズし、あなたがしたい場合は、エラーチェックを追加します。

+1

あなたはシェルのファイル名を何らかの形で引用する必要があります。 'comint-quote-filename' *は仕事をするように見えますが、残念ながらあなたが既にシェルバッファに入っている場合にのみ行います。それは私が持っている限りです。 – zwol

+0

@Zack 'comint-quote-filename'呼び出しが追加されました。 –

+0

お返事ありがとうございます。 'Symbolの関数定義は無効です:comint-quote-filename'です。私はそれを 'shell-quote-argument'に置き換えました。 [Ctrl] + [Shift] + [文字]:テキスト端末では、そのような組み合わせのシフトされたバージョンとシフトされていないバージョンを区別することはできません。環境。"そこで私はに変更し、キーを認識しました。 – ash

0

マイナーモードを使用している可能性があります。「自動復帰モード」はオプションです。 ただ、現在のバッファでそれを有効にします。

M-x "auto-revert-mode" 

、常にバッファが外部コマンドを実行する前に、保存されていることを確認。

+0

これはいいですが、デフォルトの自動復帰モードのタイミングは5秒です(遅すぎます)。その後、1秒に変更すると、1秒ごとにすべてのバッファがチェックされますが、これは不要です。 – ash

関連する問題