2012-02-22 5 views
11

モードの現在の状態にかかわらずflyspell-modeを有効にするEmacs Lisp関数を書きたいと思っています。機能flyspell-mode-onは推奨されていません。私は接頭引数でflyspell-modeを呼び出す方法を見つけ出すことができれば別のEmacs Lisp関数の対話的なEmacs Lisp関数を接頭辞引数で呼び出す方法は?

Wrong number of arguments: (lambda (flyspell-mode 1)), 0 

:ドキュメントには、正の接頭引数はflyspell-modeを回すが、残念ながら

(flyspell-mode 1) 

エラーメッセージで結果を実行しているだろうことを示唆しています私はこの問題を解決できると信じています。

Emacs Lispのマニュアルで最も関連性の高いセクションは、「対話型コール」と題されたセクションです。このセクションでは、call-interactivelyなどのコマンドについて説明しています。これは私が欲しいものではありません。

(私が解決しようとしています究極の問題は関係なく、現在の状態のモードをオンモードフックを作成することです。)

N.B.質問emacs lisp call function with prefix argument programmaticallyのタイトルは関連しているように見えますが、その質問は対話型コマンドの作成方法を尋ねていましたが、問題は最終的にcall-interactivelyを使用して解決されました。


EDIT:この質問は議論の余地があります。私は私の元の問題への代替解決策を発見した:

(add-hook 'text-mode-hook 
      (function (lambda() 
         (require 'flyspell) 
         (if flyspell-mode nil (flyspell-mode))))) 

をしかし、私はまだインタラクティブ何もで、他のEmacs Lispの関数から、接頭引数でEmacs Lispの関数を呼び出す方法を知っていただきたいと思います。


UPDATE:私はそのエラーメッセージが出た理由おそらく、私が求めている必要があります...

答えて

9

それは、あなたが(name-of-mode t)または任意の正の接頭引数でマイナモードをオンにすることを必要とminor mode conventionsを、続く(name-of-mode 0)で任意の負の接頭引数を、それをオフにせず、フライスペル(flyspell)モードのバージョンのように見えます(name-of-mode nil)で切り替えます。

最新のFlyspellをお持ちの場合は、バグレポートが必要な場合があります。私はマシンにGNU Emacs 23.2を同梱したバージョンを持っており、それは規約を尊重しています。私のバージョンでは、turn-on-flyspellturn-off-flyspellという2つの関数が定義されています。どちらも普通のラッパーで、flyspell-modeです。そのような名前の関数は一般的ですが、公式の規則はありません。機能flyspell-mode-onflyspell-mode-offは明らかに内部使用を意図しています。

一般的に、コマンドは、current-prefix-arg変数から現在のプレフィックス引数を読み取ります。それを次のコマンドの値であるprefix-argと混同しないでください(universal-argumentのようなコマンドはこの変数に触れます)。したがって、関数を呼び出すときに接頭引数を渡す必要がある場合は、current-prefix-argをバインドまたは設定します。 Emacsの-21以来の少なくともFWIW、 `フライスペル(flyspell)モード」機能は、(『)フライスペル(flyspell)モード1(』のように)引数を受け入れた

(let ((current-prefix-arg t)) 
    (flyspell-mode)) 
+0

emacsen 22と23は私が使用しているが、もはや維持されていないいくつかのレガシーモードでは何らかの損失を引き起こしたので、私はemacs 21を実行しています。 –

+1

@NormanRamseyうわー、それは古くなってきています。このエラーメッセージが表示される理由は、あなたのバージョンで 'flyspell-mode'関数が何も引数を取っておらず、' current-prefix-arg'を直接読んでいないことです。これは、後のバージョンで修正された設計上の欠陥です。 – Gilles

4

あなたが対話的関数を呼び出していない場合は、その後、(interactive)宣言は、引数を取得するために使用されていません。

大部分の場合、引数が非対話型コールの「プレフィックス引数」になるかどうかを心配する必要はありません。関数のドキュメントをチェックし、必要な値を渡してください。

何らかの理由で非対話コンテキストでプレフィックス引数を送信する必要がある場合は、その関数の(interactive)宣言をチェックし、その引数をどのように使用しているかを正確に判断し、その動作を複製する必要がありますあなたが渡す引数のために。詳細について

、参照:

  • C-H
  • M- RET interactive F:より複雑なケースで(info "(elisp) Prefix Command Arguments")RET

ワットここで関数はcurrent-prefix-arg変数に基づいて動作を変更するため、その変数を直接設定することができます。

(let ((current-prefix-arg '(4))) 
    (foo current-prefix-arg)) 
0

私はEmacsとelispのマスターじゃない(まだ;))が、私はこのケースで考えるyou may useCtrlキー - U1Altキー - Xflyspell-mode

+5

これは対話的な呼び出しです。 – phils

2
私は考えることができ

は...より良いはずです

(call-interactively '(lambda() 
         (interactive) 
         (flyspell-mode '(4)))) 

UPDATE: 私は..何が私は質問から行方不明ですこれを直接実行することができますか。?

(flyspell-mode '(4)) 
+0

'(flyspell-mode '(4))'は私の仕事です。 – jiahut

1

ので、私はあなたがそのエラーを得たのか分かりません。

私がここにいる間、Emacs-24では、(add-hook 'text-mode-hook' flyspell-mode)の意味が変わったと指摘するかもしれません。 「テキストモードでは、フライスペルモードを有効にする」という意味になります。後方互換性のない変更ですが、潜在的なバグを修正すると思います。

関連する問題