February 17, 2010

Emacs Turkish mode

This is for people trying to type Turkish documents on a U.S. keyboard using Emacs. The program provides a turkish-mode in which the correct Turkish accents are added to the ascii version of the last word typed each time the user hits space. The latest version is available here.

It was inspired by Gökhan Tür's deasciifier:
http://www.hlst.sabanciuniv.edu/TL/deascii.html

The program uses decision lists (included at the end of this file) which was created based on 1 million words of Turkish news text using the GPA algorithm. For more information on GPA see the Greedy prepend algorithm for decision list induction.

To activate the program first load this file into emacs:
M-x load-file ENTER turkish.el ENTER
Then turn on the turkish mode:
M-x turkish-mode

When Turkish mode is enabled, the space, tab, and enter keys correct the previous word by adding Turkish accents. For corrections use C-t to toggle the accent of the character under the cursor.

Related link

29 comments:

ustunozgur said...

Bu modda Enter tusu calismiyorsa:

(if (= ?\r last-input-event)

satirini

(if (= ?\r last-command-event)

ile degistirin.

ustunozgur said...

Bu mod Emacs 23'te calismiyor maalesef. Sanirim emacs'te yapilan unicode degisiklikler buna sebep oldu.

turkish-char-alist'in birinci ve ucuncu sutunlarini degistirince bazi karakterler icin sorun cozuluyor (ascii kodu olanlar icin - ü, ç ve ö gibi) ama digerleri icin farklı karakterler geliyor.

Bunu düzeltmenin bir yolu var mı acaba?

Deniz Yuret said...

Yukarida bahsi gecen iki problem de duzeltildi. En son version (2.5) post'taki linkten indirilebilir. Simdi bir de biri bunu browser extension'a cevirse de bu comment'ler duzgun ciksa :)

Emre Sevinc said...

Tekrar teşekkürler hocam. Dün benim de aklımdan geçiyordu bunu
Firefox'a nasıl entegre ederiz diye. Emacs Lisp kodunu biraz daha
inceleyeyim, belki Jetpack ile Firefox'a kolayca entegre etmek mümkün
olabilir [1].

Not: Bu yazıdaki Türkçeye özgü harfler turkish-mode ile otomatik
olarak üretilmiştir ;-)

1- https://jetpack.mozillalabs.com/

ustunozgur said...

Güncelleme için teşekkürler. Google Chrome'un Edit in Emacs eklentisi ile çok
güzel çalışıyor. .emacs dosyama şu satırı ekledim:

(add-hook 'edit-server-text-mode-hook 'turkish-mode)

Native bir eklenti yapılana kadar bu oldukça iyi bir çözüm gibi duruyor.

ustunozgur said...

Bu eklentinin bir güzel yanı da emacs'ta yazmayı unutup, doğrudan tarayıcıda yazarsak, edit tuşuna bastığımızda şu ana kadar yazdığımız metni de emacs'e göndermesi. Bu şekilde turkish-mode'daki turkish-correct-region ile önceden yazdığımız metni göndermeden önce Türkçe'ye uygun hale getirebiliyoruz. Aslında moda basit bir turkish-correct-buffer da eklenebilir.

Deniz Yuret said...

Browser'a entegrasyon yerine browser'dan emacs'ın çağırılabileceği hiç aklıma gelmemişti. Firefox için de araştırdım ve aşağıdaki kaynakları buldum:

* mozex
* conkeror
* It's all text

Bu yorumu son linkteki "It's all text" eklentisini kullanarak Firefox'tan açtığım Emacs ile yazıyorum. MacOS biraz uğraştırdı. Emacs olarak emacsformacosx kullandım. Ayarlarda uygulama olarak "/Applications/Emacs.app/Contents/MacOS/Emacs" kullanmasını söyledim. Bu arada Emacs'ın eski versionlarını test etmedim, hala çalışması lazım programın ama birşeylerin bozulduğunu farkederseniz lütfen haber verin.

ustunozgur said...

(defun turkish-correct-buffer ()
"Adds necessary accents to the words in the whole buffer."
(interactive)
(turkish-correct-region (point-min) (point-max))
)

Tüm bufferi düzeltmek için bu fonksiyonu kullanılabilirsiniz.

Deniz Yuret said...

turkish-correct-buffer 2.6 versionunda eklendi, link update edildi.

ustunozgur said...

Son yapilan degisikligi geri almak icin (daha dogrusu son sozcugu asciiye donusturmek icin) bunu kullanabilirsiniz.

(defun turkish-asciify-last-word ()
"Asciifies the last word, so that one can undo the last correction without losing place"
(interactive)
(save-excursion
(let ((p (point)))
(turkish-backward-word)
(turkish-asciify-region (point) p))))


Keybindinglere de

("\C-c\C-t" . turkish-asciify-last-word)

satirini ekledim, bu sayede C-c C-t ile son kelime asciiye donusturulebiliyor, yaziya kalindigi yerden devam edilebiliyor.

Deniz Yuret said...

Yukarıdakine benzer bir komutu (turkish-toggle-last-word) son version'a (2.6) ekledim. Tekrar tekrar basıldığında ascii ile türkçe kelime arasında gidip geliyor. Key binding olarak M-t seçtim: Standart emacs'te C-t ve M-t transpose-chars ve transpose-words komutlarını (hiç kullanmama gerek kalmadı bugüne kadar) biz turkish-toggle-accent ve turkish-toggle-last-word ile değiştirmiş olduk. Son olarak 2.5'te yaptığım eklemeler bazı eski version'larda çalışmasını bozmuş turkish.el'in, 2.6'daki düzeltmelerle 21, 22, ve 23 çalışıyor durumda olmalı.

ustunozgur said...

Bu son komut çok kullanışlı oldu, teşekkür ederim. turkish-correct-buffer yanlışlıkla silinmiş ama sanırım.

Deniz Yuret said...

Haklısın. turkish-correct-buffer ve turkish-asciify-buffer eklendi (v2.7).

Emre Sevinc said...

Python implementasyonu eklendi: Turkish deasciifier in Python and state of the art in deasciification

Emre Sevinc said...

> Şimdi bir de biri bunu browser
> extension'a çevirse de bu comment'ler
> düzgün çıksa :)

Firefox add-on eklendi: https://addons.mozilla.org/en-US/firefox/addon/204311/. Bu yazıyı hiç Türkçe harf kullanmadan yazıyorum ve birazdan sağ tuşla tıklayıp Türkçe harfli hale çevirmeye çalışacağım. Bakalım nasıl olacak hep birlikte göreceğiz.

Emre Sevinc said...

Mustafa Emre Acer'in yaptığı Chrome extension da fırından yeni çıktı: https://chrome.google.com/extensions/detail/nhfdmlgglfmcdheoabgklabmgjklgofk

Emre Sevinc said...

Benim Python implementasyonunun web arayüzünü de hazırladım: http://turkceyap.appspot.com/

Emre Sevinc said...

Java versiyonu da tamam.

Emre Sevinc said...

Firefox add-on halinin 0.2 versiyonu çıktı, buraya yazıyorum çünkü henüz otomatik güncelleme özelliği yok, elle güncellemek gerekiyor aşağıdaki adrese giderek. Bu sürümle özgün turkish-mode'a biraz daha yaklaşmış durumda, mesela: Cümle içinde yok kullanınca sorun yok artık. Yani iyi oldu gibi, olmuş gibi: https://addons.mozilla.org/en-US/firefox/addon/204311/

Anonymous said...

Arkadaşlar, Python versiyonunu kullanarak bir Adium plugin'i yaptım. Eğer Mac & Adium kullananınız varsa, ilginizi çekebilir.

Not Defteri said...

Selamlar,
Sabancinin sitesi calismiyor oldugundan, google aramalarimda sayfanizi buldum, tum thread'i ve sonudaki mozzilla application'i bilmeden teker teker okudum, pek program yaziciligindan anlamiyorum, ama super bir olay, ikinize de cok tesekkurler, harika bir application olmus

Emre Sevinc said...

> Arkadaşlar, Python versiyonunu
> kullanarak bir Adium plugin'i yaptım.
> Eğer Mac & Adium kullananınız varsa,
> ilginizi çekebilir.

Adresi var mi download etmek için?

Bilge said...

Son derece yararli bir calisma. Latex dokumanlari hazirlarken de ise yariyor, oldugu gibi kullanilsa bile. Ama belki Latex icin biraz daha uyarlanabilir. Cok tesekkurler.

Emre Sevinc said...

Ruby ile yapilmis hali de surada: https://github.com/berkerpeksag/ruby-turkish-deasciifier

Emre Sevinc said...

Perl sürümü de çıkmış. Firefox add-on'un da 0.2.1 sürümü çıktı.

selin said...

Bunun Mac'te calisan versiyonuna nasil ulasabilirim?

selin said...
This comment has been removed by a blog administrator.
Emre Sevinc said...

Firefox 4.0 ve üzeri için uyumlu olan Turkish Deasciifier add-on yayımlandı: https://addons.mozilla.org/en-US/firefox/addon/turkish-deasciifier/. Daha detaylı bilgi için: http://goo.gl/BY3DW

Anonymous said...

Emacs ve Firefox'ta artık gerçekten mutluyum. Sağolun.