用 Elisp(输入法)写一个简单的切换函数

Writing a simple toggle function with Elisp (input-method)

所以,我尝试了以下方法

(defun toggle-input-chinese ()
   (if (equal current-input-method 'chinese-py)
       (set-input-method chinese-sisheng)
     (set-input-method chinese-py)))

现在,基本上,我想写中文或拼音。我发现没有简单的方法可以在非标准输入之间进行切换。因此,我决定写这个函数并绑定一个键。

好的。我的问题是:它引发了错误 (void-variable chinese-py)。我不知道如何将当前方法等同于列出的方法。我该怎么做?

-- 编辑

此版本可正常使用。 可以在条件中放入其他输入的列表,然后您将在语言环中切换。最后,将它绑定到某个键。

这是一种比这里设想的更简单的方法: Is it possible to alternate two input methods in Emacs?

(defun toggle-input-chinese ()
  (interactive)
  (if (equal (car input-method-history) "chinese-py")
      (set-input-method 'chinese-py)
    (set-input-method 'chinese-sisheng)))

您正在将 chinese-pychinese-sisheng 作为变量传递给函数 set-input-method。 Lisp 在调用函数之前评估函数的参数。它尝试评估该变量,但该符号没有作为变量的值。

您要做的是传递 符号 chinese-pychinese-sisheng,而不是将其值作为变量(它有 none).

尝试同时引用 chinese-pychinese-sisheng:

(defun toggle-input-chinese ()
   (interactive) ; If you want to use it as a command
   (if (equal (car input-method-history) "chinese-py")
       (set-input-method 'chinese-sisheng)
     (set-input-method 'chinese-py)))

这是一样的:

(defun toggle-input-chinese ()
   (interactive) ; If you want to use it as a command
   (set-input-method (if (equal (car input-method-history) "chinese-py")
                         'chinese-sisheng
                       'chinese-py)))