2012-02-22 92 views
11

我想編寫一個Emacs Lisp函數,無論當前模式的狀態如何,它都會打開flyspell-mode。功能flyspell-mode-on已棄用。該文件表明,一個正數前綴的說法將變成flyspell-mode,但不幸的是運行如何從另一個Emacs Lisp函數調用具有前綴參數的交互式Emacs Lisp函數?

(flyspell-mode 1) 

導致的錯誤消息:

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

如果我能想出如何調用flyspell-mode前綴說法,我相信我可以解決這個問題。

我可以在Emacs Lisp手冊中找到的最相關的部分是標題爲「Interactive Call」的部分,它描述了call-interactively等命令。這強調不是我想要的。

(我試圖解決的問題最終是創造一個模式掛鉤,在模式將需要考慮其當前的狀態。)

注:問題emacs lisp call function with prefix argument programmatically的標題使其看起來似乎是相關的,但是該問題詢問如何創建交互式命令,並且問題最終通過使用call-interactively來解決。


編輯:這個問題是沒有實際意義;我已經找到一個替代的解決方案,以我原來的問題:

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

但我仍想知道如何調用的Emacs Lisp函數前綴的說法,從其他的Emacs Lisp功能,具有什麼互動。


UPDATE:也許我應該問爲什麼我得到的是錯誤信息......

回答

9

它看起來像你的Flyspell模式的版本不遵循minor mode conventions,這需要你可以打開一個小的模式(name-of-mode t)或任何正數前綴的說法,與(name-of-mode 0)將其關閉任何負面的前綴參數,切換到(name-of-mode nil)

如果您擁有最新版本的Flyspell,可能會提供錯誤報告。我在我的機器上安裝了GNU Emacs 23.2的版本,並遵守約定。我的版本還定義了兩個函數turn-on-flyspellturn-off-flyspell,這兩個函數都是flyspell-mode左右的簡單包裝;具有這種名稱的職能是常見的,但不是官方慣例。功能flyspell-mode-onflyspell-mode-off明顯用於內部使用。

作爲一般事項,命令從current-prefix-arg變量讀取當前前綴參數。不要將它與prefix-arg混淆,後者是下一個命令的值(只有幾個命令,如universal-argument觸及此變量)。因此,如果您在調用函數時需要傳遞前綴參數,請綁定或設置current-prefix-arg

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

我正在運行emacs 21,因爲emacsen 22和23在我使用但不再維護的一些傳統模式下造成了一些損失。 – 2012-02-24 02:56:07

+1

@NormanRamsey哇,變老了。至於爲什麼你會得到這個錯誤信息,沒有什麼比你的版本中的'flyspell-mode'函數沒有直接讀取任何參數和讀取'current-prefix-arg';這是在更高版本中修復的設計缺陷。 – Gilles 2012-02-24 09:14:46

4

如果不調用功能交互,那麼(interactive)聲明不被用於獲取參數。

在絕大多數情況下,您不必擔心參數是否可以成爲非交互式調用的「前綴參數」只需檢查功能文檔,並將所需的值傳遞給您想要執行的任何操作。

如果由於某種原因,您確實需要複製在非交互式上下文中發送前綴參數,則需要檢查該函數的(interactive)聲明並確定它是如何使用該參數的,並確保您複製該行爲因爲你通過的論點。

有關詳情,請參閱:

  • C-H˚FinteractiveRET
  • M-:(info "(elisp) Prefix Command Arguments")RET

在更復雜的情況下,w ^這裏函數根據current-prefix-arg變量改變其行爲,您可以直接設置該變量。

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

我不是Emacs和elisp的主(;)),但我認爲在這種情況下you may use按Ctrl - ü1Alt鍵 - Xflyspell-mode

+5

這將是一個互動電話。 – phils 2012-02-22 02:49:16

2

我能想到的這個..應該是越多越好

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

更新: 我可以直接運行這個..我是什麼,我從這個問題缺少?

(flyspell-mode '(4)) 
+0

'(flyspell-mode'(4))'適合我。 – jiahut 2014-09-22 01:15:45

1

FWIW,在`flyspell模式」功能已經接受一個參數(如‘(flyspell模式1)’)至少從Emacs的-21,所以我不知道你是怎麼得到這個錯誤。但是,當我在這裏時,我不妨指出在Emacs-24中(加入鉤子'text-mode-hook'flyspell-mode)已經改變了含義:代替含義「toggle flyspell-mode in文本模式「,現在它意味着」在文本模式下啓用flyspell模式「。這是一個落後的不兼容的變化,但我相信它會解決比它會引入更多的潛在錯誤。

相關問題