Написание простой функции переключения с помощью Elisp (метод ввода)

Итак, я пробовал следующее

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

Теперь, в основном, я хочу писать либо на китайском, либо на пиньине. Я не нашел простого способа использовать переключение между нестандартными входами. Поэтому я решил написать эту функцию и привязать ее к ключу.

Ok. Моя проблема: возникает ошибка (void-variable chinese-py). Я не знаю, как приравнять текущий метод к указанному методу. Как мне это сделать?

-- РЕДАКТИРОВАТЬ

Эта версия функциональна. Можно поместить список других входных данных в условное выражение, и вы будете переключаться между кольцами языков. Наконец, привяжите его к какому-нибудь ключу.

Это более простой способ сделать это, чем предполагается здесь: Можно ли в Emacs чередовать два метода ввода?

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

person BuddhiLW    schedule 17.03.2021    source источник
comment
Попробуйте заключить в кавычки и chinese-py, и chinese-sisheng, как в выражении (equal...).   -  person Drew    schedule 17.03.2021


Ответы (1)


Вы передаете chinese-py или chinese-sisheng в качестве переменной функции set-input-method. Lisp оценивает аргументы функции перед вызовом функции. Он пытается оценить эту переменную, но этот символ не имеет значения как переменная.

Вместо этого вы хотите передать символ chinese-py или chinese-sisheng, а не его значение в виде переменной (у него его нет).

Попробуйте процитировать и chinese-py, и chinese-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)))
person Drew    schedule 17.03.2021
comment
Хорошо, просто документировать. Я очень ценю вашу помощь. Чтобы заставить его работать, необходимо внести изменение, а именно (equal (car input-method-history) "chinese-py"), потому что input-method-history будет списком языков с двойными кавычками. current-input-method не используется для хранения названия языка. - person BuddhiLW; 18.03.2021
comment
Понимаю. Я ничего не знаю о методах ввода - я просто использовал ваш код для этой части. Я отредактировал ответ в соответствии с вашим комментарием. - person Drew; 18.03.2021
comment
Понимаю. Я тоже не знал. Я только что узнал и добавил эту информацию в нашу дискуссию. У меня все еще проблемы с переключением... Я не могу понять, почему. Иногда это работает. Это зависит от того, какой у меня метод ввода, когда я использую переключатель. Если я зайду из внешних модов (он же latin-1 или utf-8), то работать будет. Если я происхожу из chinese-py или chinese-sisheng, этого не будет. - person BuddhiLW; 20.03.2021
comment
Я предлагаю вам задать отдельный вопрос, который спрашивает что-то о помощи, которая вам нужна сейчас. Этот вопрос может служить вопросом о цитировании символов. Чтобы заставить ваш код делать то, что вы хотите, может потребоваться задать несколько вопросов и ответить на них. Задавайте только один конкретный вопрос на каждый вопрос. - person Drew; 21.03.2021