2017-05-24 8 views
1

私はEmacsのシーケンスでいくつかのコマンドを実行しようとしています。コマンドに引数(indent-region、untabify、delete-trailing-whitespace)が必要なものはありません。 、(2 3):私はemacs-key-binding-for-multiple-commandsに古いポストを追跡しようとしたと、次の解決策を考え出した:「引数の数が間違っ:emacsで複数のコマンドを実行するにはどうすればよいですか?

(defun format-properly() 
    "Run `indent-region', `untabify' and `delete-trailing-whitespace' in sequence." 
    (interactive) 
    (indent-region) 
    (untabify) 
    (delete-trailing-whitespace)) 

(global-set-key (kbd "C-c a b c") 'format-properly) 

これは私がそれを実行しようと、次のエラーメッセージを表示します0 "となる。

私はlispでの経験がないので、何をすべきか考えていないし、何か提案があれば幸いです。 :)

ありがとう! Julie

+3

関数が1つ以上の引数を必要とするかどうかを判断するには、関数を調べてヘルプウィンドウを調べるか、ソースコードを直接参照する必要があります。 'M-x describe-function RET indent-region RET'は引数が実際に存在することを示しています - 必須の2つと追加の1つはオプションです。各関数のdoc-stringを読む... '(when(region-active-p)...)'や 'region-beginning'や' region-end'などの関数が必要な場合があります'Mx find-function'と入力してください。 – lawlist

+0

[keyboard macros](http://wikemacs.org/wiki/Keyboard_macros)にも気づいていますか?セットアップが簡単な場合があります。 – Ehvince

答えて

4

対話的なコマンドは、明示的に指定しない場合でも、非オプションの引数を取ることがよくあります。領域を取る対話型コマンドを宣言する特別な方法があります:(interactive "r")、それはコマンドに領域を自動的に渡します。

(defun format-properly (b e) 
    "Run `indent-region', `untabify' and `delete-trailing-whitespace' in sequence." 
    (interactive "*r") 
    (when (use-region-p) 
    (save-restriction 
     (narrow-to-region b e) 
     (indent-region (point-min) (point-max)) 
     (untabify (point-min) (point-max)) 
     (delete-trailing-whitespace (point-min) (point-max))))) 

あなたはC-h odescribe-symbol)と興味を持っているinteractiveや他の関数や変数のためのドキュメントを見てみてください。

+0

ありがとう!それはまさに私が探していたものでした。これでもう実行されてもエラーは発生せず、最初のコマンド(インデント)が正しく実行されます。しかし、 ''インデント領域 ''自体が '' format-properly'を実行する前にマークした領域を破壊すると思うので、後続の '' untabify''と '' delete-trailing-whitespace''を適用しません。 – Julie

+0

@Julie 'deactivate-mark'を' nil'に設定すると、すべての関数が強制的に領域をアクティブに保つべきです。わたしにはできる。すべてのカスタマイズを無効にする 'emacs -q'で試してください。 – jpkotta

+0

@Julieまた、回答を受け入れる*(緑のチェックマーク) – yPhil

関連する問題