2

emacs 21.4.1にlua-mode(バージョン20110428)をインストールしようとしていますが、問題が発生しています。私の.emacsファイルには次のものがあります。

(add-to-list 'load-path "~/.emacs.d/lua-mode/")
...
(setq auto-mode-alist (cons '("\\.lua$" . lua-mode) auto-mode-alist))
(autoload 'lua-mode "lua-mode" "Lua editing mode." t)

ここからインストール手順を使用しました:http://lua-mode.luaforge.net/ また、私の.emacs.d / dirには、lua-mode.elを含むlua-mode/があります。これらのファイルはすべて正しい権限を持っています。

今を除いて、emacsを使用して新しいファイル「test.lua」を開くと、スクラッチバッファーに次のメッセージが表示されます。

「ファイルモード指定エラー:(void-function called-interactively-p)」

RHEL5を実行しています。私はオンラインで調べましたが、あまり助けが見つかりませんでした。誰か提案はありますか?私はLISPを知らないので(lua-mode.elをデバッグするのは難しいです)、いくつかのショートカットを除けば、emacsについてはあまり知りません。

ありがとう。

4

4 に答える 4

4

1つの引数を取る「called-interactively-p」関数のバージョンを持たないバージョンのEmacsを使用しています(以前のバージョンの関数は引数を取りませんでした)。これを回避するには、この回避策(ここに投稿:http://paste.lisp.org/display/115598/raw)をEmacsのinitファイルに入れます。

(condition-case nil (called-interactively-p 'interactive)
  (error
   ; Save reference to called-interactively-p in
   ; inglorion-system-called-interactively-p
   (fset 'inglorion-system-called-interactively-p
         (symbol-function 'called-interactively-p))
   ; Define called-interactively-p so that it discards
   ; its arguments and calls inglorion-system-called-interactively-p
   (fset 'called-interactively-p
         (lambda (&rest args)
           (inglorion-system-called-interactively-p)))))

しかし、これを行ってEmacs 22でテストしようとすると、特定の関数が存在しないために他のエラーも発生したため、lua-modeを使用する場合はEmacsのバージョンをアップグレードする必要があります。

Emacs 23および24では、「lua-mode.el」は既存のluaファイルで機能するように見えますが(私はluaプログラマーではないため、適切にテストできませんでした)、新しいluaファイルを作成しようとすると機能しなくなります。これは実際には、新しいluaファイルを開こうとしたときに発生する「lua-mode.el」コードのバグです(既存のluaファイルを開こうとしても発生しません)。問題は、行番号1218での「remove-text-properties」呼び出し(「lua-unmark-multiline-literals」関数内)が、開始値「1」で「remove-text-properties」関数を呼び出していることです。終了値は「0」です(新しいファイルの場合、バッファサイズが「0」であるため「0」です。これを修正するには、行番号1218を次のように変更します。

    (remove-text-properties (or begin 1) (or end (buffer-size)) '(syntax-table ()))

に:

    (remove-text-properties (or begin 1)
                            (or end
                                (if (> (buffer-size) 0)
                                    (buffer-size)
                                  (or begin 1)))
                            '(syntax-table ()))

「lua-mode.el」の開発者にバグについて知らせ、場合によっては以前のEmacsバージョンのサポートもリクエストする必要があります。

于 2011-07-27T18:08:40.653 に答える
2

私はたまたまlua-modeのメンテナーです。インターネットでネットサーフィンをしているときにあなたの問題に遭遇したのは幸運でした。誰かがcalled-interactively-p関数のバックアップ実装を惜しみなく提供した後、問題は解決しました。

called-interactivelyその間、私はemacs23の前にロジックがどこかで変更されたことをよく知っていたことを認めなければなりませんが、誰かがそれをバグとして提出するまで、私はそれを変更しませんでした。最近Emacsで多数の内部APIの変更があり、それらを先制的に修正することは私のスケジュールに合わないため、これは単なる努力の最適化です。

結論は次のとおりです。

  1. 近い将来、lua-mode内でcalled-interactively-pのバックアップ実装を提供します。これは次のリリースになります。
  2. そして、バグレポートなどの誤動作をここに提出することをお勧めします。私はそれらを定期的に読んでおり、あなたのレポートとあなた自身のハックは上流で歓迎されています。

乾杯、没頭。

于 2011-09-14T13:14:00.403 に答える
1

関数`called-interactively-p'はEmacs21.4には存在しなかったと思います。

しかし実際には、GNU Emacsではなく、XEmacsについて話していると思います。これらは2つの異なるプロジェクトであることに注意してください。

XEmacsを21.5ベータ以上(YMMV)にアップグレードする必要があります。おそらく、GNUEmacs23を使用してください。

于 2011-07-27T16:19:39.007 に答える
0

私もこの問題を抱えていました。私はそれを次のように変更することで修正することができました:

(add-to-list 'auto-mode-alist '("\\.lua\\'" . lua-mode))

これがなぜ違いを生むのかを知ることはできません。他のロジックから外挿して、ファイル拡張子を記述するために同様の構文を使用するjavascriptモードをロードしました。

于 2011-07-27T13:56:49.190 に答える