[완료] Emacs 셋 이상의 input method를 토글하는 방법이 있나요?

slomo의 이미지

Emacs에서 셋 이상의 input method를 토글하는 방법이 있나요?

예를 들어, 한국어, 영어, 일본어가 섞여있는 문서를 작성할 때
Shift-Space를 눌러서 세 언어 자판이 번갈아 바뀌면 편리할
것 같습니다.

slomo의 이미지

아무리 검색해 봐도 그런 기능이 따로 없더군요. 간단하게 한번 만들어봤습니다.
한 문서에서 한국어, 영어, 일본어를 동시에 입력해야 하는 경우 등에 편리합니다.

자주 사용하는 IME와 단축키를 설정하면 여러개의 IME 사이를 간편하게 전환할
수 있습니다. IME의 목록을 ring이라고 하면 다음처럼 작동합니다.

  • S-Space : ring의 가장 앞에 있는 두 IME 사이에서 전환이 됩니다.
  • C-\ : ring에 있는 IME들이 회전하며 하나씩 나타납니다.
  • C-| : 현재 IME를 고정한 상태에서 나머지 IME들만 회전합니다. 이것을 이용하여 Shift-Space로 전환할 수 있는 두 IME 짝을 설정할 수 있습니다.
  • rofime-pop: 현재 IME를 ring에서 제거합니다.
  • rofime-message: 현재 ring를 메시지 창에 보여줍니다.
  • 다른 방법을 통해 ring에 없는 IME를 현재 사용하다가 전환하는 경우 자동으로 ring에 추가됩다.

;; RoFIME: Ring of Favorite Input MEthods
 
;; Set your favorite input methods
(setq favorite-input-methods 
      '(nil "korean-hangul3" "japanese" "TeX" "ucs"))
(setq default-input-method "korean-hangul3")
 
;; Set key bindings
(global-set-key [?\C-\\] 'toggle-input-method-ring)
(global-set-key [?\S- ] 'toggle-the-other-input-method)
(global-set-key [?\C-|] 'rofime-rotate-the-others)
 
 
;; load settings
(cond 
 ((boundp 'favorite-input-methods)
  (setq input-method-ring favorite-input-methods))
 (T (setq input-method-ring ())))
(cond 
 ((boundp 'default-input-method)
  (add-to-list 'input-method-ring default-input-method)))
 
;; functions
(defun rofime-swap-heads (ring)
  (cons (cadr ring)
	(cons (car ring)
	      (cddr ring))))
 
(defun rofime-swap-the-ends (ring)
  (append (last ring) 
	  (append (reverse (cdr (reverse (cdr ring)))) 
		  (list (car ring)))))
 
(defun rofime-reverse (ring)
  (reverse ring))
 
(defun rofime-rotate (ring)
  (if (< (length ring) 2) ring
    (append (cdr ring) (list (car ring)))))
 
(defun rofime-add (ime)
  (add-to-list 'input-method-ring ime))
 
 
(defun rofime-pop () (interactive)
  (pop input-method-ring)
  (set-input-method (car input-method-ring)))
 
(defun rofime-message () (interactive)
  (message "%S" input-method-ring))
 
 
(defun toggle-the-other-input-method() (interactive)
  (rofime-add current-input-method)
  (setq input-method-ring
	(rofime-swap-heads input-method-ring))
  (set-input-method (car input-method-ring))
  (rofime-message))
 
(defun toggle-input-method-ring() (interactive)
  (rofime-add current-input-method)
  (if (equal (car input-method-ring) current-input-method)
      (setq input-method-ring 
	    (rofime-rotate input-method-ring)))
  (set-input-method (car input-method-ring))
  (rofime-message))
 
(defun rofime-rotate-the-others () (interactive)
  (setq input-method-ring
	(cons (car input-method-ring)
	      (rofime-rotate (cdr input-method-ring))))
  (rofime-message))

====
No one asks you for change or directions.
-- Slo-Mo, J. Krokidas

====
No one asks you for change or directions.
-- Slo-Mo, J. Krokidas

primewizard의 이미지

할 수 없어서 아쉽습니다.

oppor의 이미지

이분... 영어, 일본어가 가능함은 물론... elisp까지...

완전 능력자시네요.

xbroyw의 이미지

plus 1

잘쓰고 있습니다. :)

-------
good job :)
-------

-------
good job :)
-------

hwiorb의 이미지

세벌 최종, 드보락 쓰고 있으면서 버그도 있고, 좀 필요해서 약간 수정했습니다.
만들어주셔서 감사합니다.

1. default-input-method가 있음에도 emacs 기본 ime로 설정됩니다.
L.17

(cond 
 ;; ((boundp 'default-input-method)
 ;;  (add-to-list 'input-method-ring default-input-method)))
 ((boundp 'default-input-method)
  (add-to-list 'input-method-ring default-input-method) ;;default-input-method
  (set-input-method default-input-method)))

2. 기본 ime가 설정되어 있는 상태이기 때문에 shift-space를 사용하게 되면, nil값이 들어가게 되서, 의도치 않는 ime전환이 생깁니다
아래와 같이 변경해주면 좋습니다

(defun toggle-the-other-input-method() (interactive)
 ;;(rofime-add current-input-method)  ;;BUG: nil 값이 들어가는 문제 있음
  (when current-input-method 
    (rofime-add current-input-method))

3. 그 외에 shift-space 바인딩이 toggle-korean-input-method로 되어 있고, rofime로 동작을 안하는 경우,
dot emacs의 (require 'rofime) 뒤에

(global-set-key [remap toggle-korean-input-method] 'toggle-the-other-input-method)

를 넣어주면 정상 동작합니다.

nil.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.