Emacs lisp imlecinde bir char nasıl değiştirilir


4

Tay dili karakterini girmeye yardımcı olan küçük bir mod oluşturmak istiyorum. İşte yazdığım şey:

(defvar thai-input-mode-map
  (let ((map (make-sparse-keymap)))
    (define-key map "2" (lambda () (interactive)
              (replace-string "o" "ô")
              ))
    map)
  "Keymap used by `thai-input-mode'.")
(easy-mmode-define-minor-mode thai-input-mode
                              "Input mode for Thai"
                              nil  " TH" thai-input-mode-map)
(global-set-key "\C-x\C-t" 'thai-input-mode)

Tabii ki daha fazla ayrıntı uygulamalıyım, ama zaten sorun yaşıyorum. Öncelikle, replace-stringişlev obir arabellekte olsa bile çalışmaz . İkincisi, sadece imleçteki bir karakterin nasıl değiştirileceğini çözemedim.

Bu tür bir işlevi uygulamak için nasıl yazabilirim?

Düzenle

Gilles'in tavsiyelerine uyarak şöyle yazdım:

(defvar thai-tone-conversion-list
    '(("o" . "ô") ("u" . "û")))
(defun thai-add-tone ()
  (interactive "*")
  (when (let ((case-fold-search t))
          (looking-back "[ou]"))
    (replace-match (assoc (match-string 0) (thai-tone-conversion-list)))))
(defvar thai-input-mode-map
  (let ((map (make-sparse-keymap)))
    (define-key map "2" 'thai-add-tone)
    map)
  "Keymap used by `thai-input-mode'.")
(easy-mmode-define-minor-mode thai-input-mode
                              "Input mode for Thai"
                              nil  " TH" thai-input-mode-map)
(global-set-key "\C-x\C-t" 'thai-input-mode)

Ama olsun assoc: Symbol's function definition is void: thai-tone-conversion-listben koyduğunuzda, hata 2içinde thai-input-mode.

Yanıtlar:


2

(replace-string "o" "ô")ogeçici işaret kipinde, imlecin ardındaki bir sonraki yerini değiştirir, geçici işaret kipinde, işaretli bölgedeki ilk ismin yerini aldığı durumda aktif işaret ile değiştirir.

Bu, imleçten sonraki karakteri değiştirmek için çalışır, ancak elbette eğer değilse, odaha sonra bir karakteri değiştirebilir. replace-stringDeğiştirme kapsamını sınırlamak için START ve END argümanlarını kullanabilirsiniz , ancak bu ölçeklenmez. Kullanım char-afterimleç sonra karakteri almak için, ve char-beforeimlecin önce karakteri almak için. Bu fonksiyon o, yazdıktan sonra kullanılması amaçlanmış gibi görünüyor , bu yüzden bence char-beforearadığınız şey.

(require 'cl)
(defun thai-add-tone ()
  (interactive "*")
  (case (char-before)
   ((?o)
    (delete-backward-char 1)
    (insert "ô"))
   ((?u)
    (delete-backward-char 1)
    (insert "û"))))

Alternatif bir yaklaşım ( looking-atimleçten başlayan metin için) veya looking-back( imlecin sonunda gelen metin için ) ile bir test (veya bir dizi test) yapmaktır . Daha sonra replace-matchmetni değiştirmek için arayabilirsiniz ; Bu, bazı otomasyonlara izin verir, örneğin Emacs, küçük harfleri küçük harf ve büyük harfleri büyük harf olarak değiştirir.

(defvar thai-tone-conversion-list
    '(("o" . "ô") ("u" . "û")))
(defun thai-add-tone ()
  (interactive "*")
  (when (let ((case-fold-search t))
          (looking-back "[ou]"))
    (replace-match (cdr (assoc (match-string 0) thai-tone-conversion-list)))))

Emacs'in Tayland için zaten bir desteğinin bulunduğunu, üzerine inşa etmenin tekerleği yeniden icat etmekten daha kolay olabileceğini unutmayın. set-input-method( C-x RET C-\) İle iki Taylandca giriş yönteminden birini seçebilirsiniz . Kaynak kodun ötesinde İngilizce olarak herhangi bir belge bulunmuyor .

Ac Emacs terminolojisinde, düzenlemelerin yapıldığı konumdaki “imleç” nokta olarak adlandırılır . İmleç kelimesi , noktanın konumunu belirten ekrandaki görsel eser için ayrılmıştır.


Sağol Gilles! Tavsiyene uydum ama düzeltemediğim bir hata var. Soruma sorumu ekledim. Bana yardım eder misin?
ironsand

Ve lisp/language/thai.elbir giriş yöntemi Tay karakteri gibi görünüyor. Taylandca telaffuz alfabesi girmek istiyorum. İkisi farklı.
ironsand

@Tetsu Benim hatam, etrafındaki parantezleri kaldırın thai-tone-conversion-list.
Gilles

Hala bir hata alıyorum progn: Wrong type argument: stringp, ("o" . "ô"). Ben de ilk yöntemi denedim, thai-add-toneböyle bir hata alıyorum cond: Wrong number of arguments: #[(n &optional killflag) "¨.
ironsand

1
@Tetsu Düzenlememe bak. Kodu bu sefer test ettim.
Gilles,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.