LINUX.ORG.RU

Ответ на: комментарий от aptyp

я сам вимер, поэтому 100% не скажу, но когда-то на подобное решение такой проблемы натыкался для собственно вима. Так что думаю должно работать

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

там несколько решений. Я раньше использовал то, которое с ibus, но ibus жирный, щас переехал на xxkb(заставляет окна емакса юзать свою, отдельную раскладку) + xmodmap (для третьей раскладки меняет значение клавиши переключения)

в автозагрузке что-то типа

setxkbmap us,ru,us -option "ctrl:nocaps,menu:compose" -model microsoft4000

xmodmap -e "keysym Alt_R = ISO_Last_Group ISO_First_Group ISO_First_Group ISO_Last_Group F13 F14"

xxkb&

переключается, как видно, по правому Alt

ну и в самом емаксе внутреннюю переключалку вешаем на F13

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

т.е. вручную переключаться всё равно?Всё понял. Спасибо.

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

О. Внутренняя переключалка это круто!

aptyp ★★★★ ()

во, для емакс24:

(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))))

(defadvice read-passwd (around my-read-passwd act)
  (let ((local-function-key-map nil))
    ad-do-it))

(defun rev-inp-m-init (f)
  "asadasd."
  (lexical-let ((frame f))
    (run-at-time nil nil
                 #'(lambda () (when (or (and (daemonp)
                                             (not (string= (frame-parameter frame 'name) "F1")))
                                        (not (daemonp)))
                                (reverse-input-method "russian-computer")
                                (remove-hook 'after-make-frame-functions #'rev-inp-m-init))))))

(add-hook 'after-make-frame-functions #'rev-inp-m-init)

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

хотя странно, после этого для ввода пороля в tramp'e, например, почему-то перестают работать кнопки — backspace, enter, del(не смотря на advice read-passwd).
Ну во всяком случае работает так: для backspace — С-backspace, для enter — C-j.

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

Опа, а у меня c-сочетания работают при любой раскладке (ru, en), а m- только в английской. Странно...

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

Небольшой фикс. Вот так работает и с даемоном и без:

(if (not (daemonp))
    (reverse-input-method 'russian-computer)
  (defun rev-inp-m-init (f)
    (lexical-let ((frame f))
      (run-at-time nil nil
                   #'(lambda () (unless (string= (frame-parameter frame 'name) "F1")
                                  (reverse-input-method 'russian-computer)
                                  (remove-hook 'after-make-frame-functions #'rev-inp-m-init))))))
  (add-hook 'after-make-frame-functions #'rev-inp-m-init))

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

ну мне он, например, не понравился тем, что его надо хитро запускать. Т.е. например, если просто в конфиг прописать (reverse-input-method 'russian-computer) и запустить даемон — нифига не работает, вот повесил эту фигню на создание фрейма(исключая начальный даемоновский) — работает.
Но остаётся проблема с read-passwd.

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

да и вообще это какой-то хитрый хак. Так что xxkb - наше всё

lazyklimm ★★★★★ ()
24 апреля 2014 г.
Ответ на: комментарий от Bad_ptr

некролисп на марше

если интересно - нашёл работающий хак для read-passwd:

(setq read-passwd-map
       (let ((map read-passwd-map))
         (set-keymap-parent map minibuffer-local-map)
         (define-key map [return] #'exit-minibuffer)
         (define-key map [backspace] #'delete-backward-char)
         map))
lazyklimm ★★★★★ ()
Ответ на: Списаибо! от Bad_ptr

И чтобы уж совсем для полной картины - ещё надо на server-switch-hook вешать

(lambda () (reverse-input-method 'russian-computer))

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

так подожди. Хочешь сказать что надо постоянно реверсить чтоли, а не один раз?

//
Тогда надо просто вот эту строку убрать

(remove-hook 'after-make-frame-functions #'rev-inp-m-init)

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

кстати, remove-hook пришлось-таки убрать, иначе при закрытии последнего окна оно переставало работать (до открытия следующего)

lazyklimm ★★★★★ ()
23 ноября 2014 г.
Ответ на: комментарий от Bad_ptr

А у меня в 24.3 не работает. Только если руками M-x reverse-input-method RET russian-computer делать, но это ж муторно. Функция лежит в ~/.emacs.d/little_things/code_snippets.el, а в init.el собственно загружается

(load "~/.emacs.d/little_things/code_snippets.el")
Фикс ниже по тексту поставил. ЧЯДНТ?

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

на гитхабе у тебя этой функции не нашёл
помимо загрузки, функцию надо ещё выполнить). Как запускаешь emacs демоном или нет?

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

на гитхабе у тебя этой функции не нашёл

Естессно, если она не работает — зачем я её коммитить буду?!

помимо загрузки, функцию надо ещё выполнить).

Это я прнимаю, да. Если один раз после запуска emacs выполнить

M-x reverse-input-method RET russian-computer

то работает. Но до следущего запуска. Я не могу в лисп и потому решил, что код внизу твоего поста и должен её вызывать сразу после определения автоматом, разве не так?

Как запускаешь emacs демоном или нет?

Демоном же.

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

Ну, а ошибок в буфер *Messages* оно тебе не пишет?
У меня там, например, lexical-let, который перед тем как использовать нужно сделать (require 'cl).
//
в новых емаксах правильнее (require 'cl-lib) и вместо lexical-let обычный let и в первую строку файла ;; -*- lexical-binding: t; -*-
для 24.3 cl-lib вроде как не идёт в поставке(но могу ошибаться) и нужно ставить из gnu-elpa.

если это не помогает, можешь попробовать добавить задержку: run-at-time 2 nil

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

Ну, а ошибок в буфер *Messages* оно тебе не пишет?

Судя по тому, что он неоткрывается автоматически, ошибок нет. Вот выхлоп начиная с загрузки code_snippets.el. Вроде всё чисто. http://pastie.org/pastes/9738653/text

lexical-let

Я даже не знат, чтоэта.

run-at-time 2 nil

Это для lexical-let или reverse-input?

ну и зачем тогда мучиться с эмаксом? ☺

Vim не понравился, а лучше ничего нет. -_-

если хошь поломать мозги: вот мой конфиг https://github.com/Bad-ptr/.emacs.d

http://images.netbynet.ru/imgs/7c01a10bbb7635b37ef3224042199106.jpg

deterenkelt ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.