LINUX.ORG.RU

(defun reverse-input-method (input-method)
  "Build the reverse mapping of single letters from INPUT-METHOD."
  (interactive
   (list (read-input-method-name "Use input method (default current): ")))
  (if (and input-method (symbolp input-method))
      (setq input-method (symbol-name input-method)))
  (let ((current current-input-method)
	(modifiers '(nil (control) (meta) (control meta))))
    (when input-method
      (activate-input-method input-method))
    (when (and current-input-method quail-keyboard-layout)
      (dolist (map (cdr (quail-map)))
	(let* ((to (car map))
	       (from (quail-get-translation
		      (cadr map) (char-to-string to) 1)))
	  (when (and (characterp from) (characterp to))
	    (dolist (mod modifiers)
	      (define-key local-function-key-map
		(vector (append mod (list from)))
		(vector (append mod (list to)))))))))
    (when input-method
      (activate-input-method current))))

;; Hotkeys on russian layout
(reverse-input-method 'russian-computer)
Deleted ()

Какой метод вы используете, чтобы Emacs для keybinding'ов игнорировал расскладку?

Оконный диспетчер. То есть при когда фокус на окнах Емакса, иксовая раскладка всегда американская.

Zmicier ★★★★★ ()
Ответ на: комментарий от Evgueni

Использую встроенную в emacs переключалку.

Все бы с ней хорошо, но лично я начинаю путаться в переключалках.

Nervous ★★★★ ()
Ответ на: комментарий от Nervous

В начале тоже так было, но в какой-то момент привык и перестал искать другие решения. И ещё у меня в .emacs есть следующие функции (подсказанные на LOR):


(defun lat<->rus (beg end &optional arg)
  "Recode region that contains russain text typed in english into russian.
With ARG given recode region in the other direction."
  (interactive "*r\nP")
  (save-excursion
    (goto-char beg)
    (do () ((>= (point) end))
      (let* ((en-char (char-after (point)))
             (ru-char (if arg
                          (car (rassoc en-char usr:*en/ru-table*))
                        (cdr (assoc en-char usr:*en/ru-table*)))))
        (delete-char 1)
        (insert (if ru-char ru-char en-char))))))

(defun rus<->lat (beg end &optional arg)
  "Recode region that contains russain text typed in english into russian.
With ARG given recode region in the other direction."
  (interactive "*r\nP")
  (save-excursion
    (goto-char beg)
    (do () ((>= (point) end))
      (let* ((en-char (char-after (point)))
             (ru-char (if arg
                          (cdr (assoc en-char usr:*en/ru-table*))
                        (car (rassoc en-char usr:*en/ru-table*)))))
        (delete-char 1)
        (insert (if ru-char ru-char en-char))))))

Evgueni ★★★★★ ()
Последнее исправление: Evgueni (всего исправлений: 1)
Ответ на: комментарий от Zmicier

Оконный диспетчер

Игнорировал раскладку для хоткеев, но не для ввода в буффер. Т.е. пишу я значит киррилицей и тут бах без всяких переключалок сохранился на C-ч-ы.

BceM_IIpuBeT ★★★★ ()
(use-package reverse-im
  :config
  (reverse-im-activate "russian-computer"))

Пакет reverse-im можешь установить с MELPA. Работает с русской иксовой раскладкой.

feofan ★★★★★ ()
Ответ на: комментарий от spijet

Плохой способ, работают только сочетания с модификаторами, а префиксные не работают. То есть C-m сработает, а C-x a b c — нет.

Мне больше всего подходит использовать вот такой костыль для переключения:
https://github.com/liaonau/emxkb
http://paul.elms.pro/blog/2013/04/11/pieriekliuchieniie-raskladok-v-emacs/

Но это только для xorg. В macOS я это делал через Hammerspoon. А в винде… не использую Emacs, хотя уверен что через AHK это легко сделать.

vyazovoi ★★ ()
Ответ на: комментарий от vyazovoi

В Spacemacs префиксные почти не используются, так что и такой вариант работает, но всё равно спасибо! :)

spijet ★★★ ()
Ответ на: комментарий от Zmicier

Та же фигня.

Если окно емакса, то через emacsclient для буфера зовётся toggle-input-method, а если не емакса - переключалка.

Hoodoo ★★★★★ ()
Ответ на: комментарий от BceM_IIpuBeT

Сложно

Хорошо, об’ясняю. Эта штука может быть пригодна только для пар раскладок типа вьетнамской и американской, при смене которых одну на другую одни и те же знаки не перебираются на другие клавиши. ЙЦУКЕН и американская к таким парам не относятся.

Zmicier ★★★★★ ()
Ответ на: комментарий от BceM_IIpuBeT

Игнорировал раскладку для хоткеев, но не для ввода в буффер.

Так у Емакса для ввода собственные раскладки. Вот тут т. Hoodoo напоминает, что можно еще использовать emacsclient(1), но у меня примитивнее — оконный диспетчер просто пропускает клавиши смены раскладки насквозь, когда активно окно Емакса (и перехватывает сам в остальных).

Единственное — в Емаксе из коробки почему-то не к чему привязывать нормальные безусловное переключение, есть только круговое. Так что пригодится немного букв:

(defun set-default-input-method ()
  "Activate `default-input-method' for the current buffer."
  (interactive)
  (unless current-input-method
    (activate-input-method default-input-method)))

(defun unset-input-method ()
  "Deactivate any input method for the current buffer."
  (interactive)
  (activate-input-method nil))

(defun isearch-activate-input-method (input-method)
  "Switch to input method INPUT-METHOD for the isearch mode.
If some other input method is already active, turn it off first.
If INPUT-METHOD is nil, deactivate any current input method."
  (let ((overriding-terminal-local-map nil))
    (activate-input-method input-method))
  (setq isearch-input-method-function input-method-function
	isearch-input-method-local-p t)
  (setq input-method-function nil)
  (isearch-update))

(defun isearch-set-default-input-method ()
  "Activate `default-input-method' for the isearch mode."
  (interactive)
  (isearch-activate-input-method default-input-method))

(defun isearch-unset-input-method ()
  "Deactivate any input method for the isearch mode."
  (interactive)
  (isearch-activate-input-method nil))

И уже тогда можно:

(define-key global-map (kbd "<f13>")   #'unset-input-method)
(define-key global-map (kbd "<S-f13>") #'set-default-input-method)

(define-key isearch-mode-map (kbd "<f13>")   #'isearch-unset-input-method)
(define-key isearch-mode-map (kbd "<S-f13>") #'isearch-set-default-input-method)

Т.е. пишу я значит киррилицей и тут бах без всяких переключалок сохранился на C-ч-ы.

Так и делаю.

Zmicier ★★★★★ ()
Последнее исправление: Zmicier (всего исправлений: 1)
Ответ на: комментарий от Zmicier

О, спасибо, это тема.

Дело в том что после ребута возникает затык, когда емакс запрашивает, на что менять дефолтный инпут метод. Утащу к себе.

Hoodoo ★★★★★ ()
Ответ на: комментарий от Hoodoo

затык, когда емакс запрашивает, на что менять дефолтный инпут метод

Дык:

(setq default-input-method "russian-computer")
Zmicier ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.