อยากหัด emacs

มีคำถามมากมาย แต่ไม่รู้จะถามใคร ได้โอกาสถามคนแถวนี้

  1. ผมใช้ Ubuntu Edgy Eft ควรลงอะไรดี เป็นมี nox x gtk ยังไม่นับ 21 snapshot อีกนะเนี่ย
  2. เซ็ตยังไงถึงจะพิมพ์ไทยอ่านไทยได้
  3. ขอคีย์พื้นฐานซักนิดนึงครับ สำหรับมือใหม่แท้ๆ
  4. เห็นว่ามี mode สำหรับไฟล์แต่ละฟอร์แมต ผมจะเปิดใช้มันยังไงดี อย่าง xml html python เป็นต้น

ผมพยายามมาตั้งแต่สมัยเมื่อสิบปีก่อน ผ่านมาสิบปีก็ยังใช้ vi เหมือนเดิม ไม่เคยรอดเกิน 2 วันเลยครับ ตอน btd1 กลับมาก็ลง ใช้ไม่รอดวัน btd2 กลับมาลองอีกรอบ คราวนี้ได้แค่ครึ่งวันเอง

บน edgy ผมลงไว้อยุ่ 2 ตัว คือ gtk กับ emacs23
(ตัว emacs23 ต้อง compile จาก source code เอง)

ปุ่ม short-cut ในการสลับภาษาคือ ctrl-\
ซึ่งในการกดครั้งแรก มันจะถาม input-method ก่อน
ซึ่งเราจะตอบว่า thai-kesmanee (พิมพ์แค่บางส่วนแล้วกด tab เพื่อให้มัน autocomplete ก็ได้)

ที่ปุ่มสลัดภาษามันใช้คนละตัวกับ os ก็เพราะว่า
มันจะได้จัดการกับ short-cut อื่นๆได้ถูกต้อง
แม้ว่าจะอยู่ระหว่างการเลือกใช้ภาษานั้น
เช่นใช้ภาษาไทยอยู่ แต่ผมก็ยังกด ctrl-a ได้ (ไม่กลายเป็น ctrl-ฟ)

พิมพ์ไทยได้แล้ว แต่บางทีก็แสดงผลไม่ถูก
อันนี้ให้เลือก font
โดยเลือก menu options -> set font -> misc - 7x13
แต่ละเครื่องคงไม่เหมือนกัน ลองดูครับ
(emacs gtk ของผมมีปัญหาเรื่อง font thai ผมก็เลยใช้ emacs23)
เรื่อง font นี่ คุณ poonlap แกเขียนไว้เยอะเหมือนกัน ต้องไปลองค้นดูครับ

key พื้นฐาน
1. เปิด file ctrl-x ctrl-f
2. ปิด file ctrl-x k
3. save file ctrl-x ctrl-s
4. help
4.1 ต้องการดู tutorial F1 ตามด้วย t หรือ ctrl-h t
4.2 ดูว่า key binding มีอะไรบ้าง F1 b
4.3 สงสัยว่า key นี้กดแล้วได้อะไร F1 k แล้วตามด้วยการ short-cut ที่ต้องการ
4.4 สงสัยว่า function นี้คืออะไร กด F1 f ตามด้วยชื่อ function
5. กด short-cut ผิดไว้ครึ่งๆกลาง แล้วต้องการยกเลิก
พยายามกด ESC เข้าไว้ (สูงสุดคือ 3 ที)
6. alt-x กดเพื่อเรียก function โดยการพิมพ์ชื่อ function เอง (แทนที่จะใช้ short-cut)

เล่นตาม tutorial ดีที่สุดครับ
ถ้าเลือก options->mule->language environment->thai
หรือ locales เป็น ไทย
tutorial ก็จะเป็นภาษาไทยด้วย

ตัว mode
โดยปกติ มันจะมีจุด hook ให้ config ว่า
ถ้าเปิด file นามสกุลนี้ ให้ใช้ mode นี้
แต่ในกรณีที่ไม่ได้ใส่ hook ไว้
เราสามารถเลือก mode ได้โดยกด alt-x ตามด้วยชื่อ mode
เช่น ruby-mode, haskell-mode, python-mode

เรื่องมันยาวครับ แต่รับรองคุณสุกรีต้องชอบแน่นอน (ถ้าใช้เป็นแล้ว)
เราเปิด thread นี้ไว้เป็นเรื่องของการหัดใช้ emacs กันดีกว่าครับ

sugree's picture

โอ้วกระจ่างครับ ctrl-\ ไม่เคยเจอมาก่อน ถึงว่างมไม่เจอเข็มซะที ขอไปฝึกก่อน แล้วจะกลับมาถามต่อ

หนุก ๆ ถ้าเลือก mode แล้ว กด tab แล้วมันจัด indent ให้เลย มันส์มาก
ที่ผมชอบมาก ๆ คือ alt-/ เป็นการขอ autocomplete มันจะค้นมาจากที่เราพิมพ์ ๆ นั่นเอามาเติมให้ ถ้าไม่ใช่ก็กด ซ้ำ ๆ ไป มันก็จะไล่ไปหามาให้เรื่อย ๆ ใช้จนติดเลย

veer's picture

ผมเล่น Emacs.app บน OS X แล้วติดอกติดใจ (ถึงจะพิมพ์ไทยไม่ออกอยู่ดีก็ตาม) พยายามลง Emacs.app บน GNUstep มาเนิ่นนานแต่ก็ยังไม่ได้ซักที

sugree's picture

สำหรับ Ubuntu Edgy ผมเจอ The Consciousness Repository ที่มี emacs ใหม่สุดๆ จะได้ไม่เหนื่อยคอมไพล์เอง

sugree's picture

รอดแล้วครับ ภาษาไทยสวยงาม Emacs 23 สวยกว่าตัวเก่าจนเทียบไม่ได้ ฟอนต์นิ่มนวลชวนอ่าน พิมพ์ไทยสมบูรณ์แบบ ทีนี้ขั้นถัดไปก็ทำความคุ้นเคยกับปุ่ม

veer's picture

ลง Emacs23 มั่งดีกว่า
ตั้งแต่ lulu เล่าให้ฟัง สลับ control กับ cap lock อาการบาดเจ็บจากการใช้ emacs ของผมก็ทุเลาลง

sugree's picture

สลับยังไงวานบอก

veer's picture

ใช้ tool ของ gnome อะครับ (gnome-keyboard-properties ถ้าจำไม่ผิด)

sugree's picture

เจอละ

  • System -> Preferences -> Keyboard
  • Ctrl key position = Swap Ctrl and CapsLock.

นี่มันออกแบบมาสำหรับ Emacs รึเปล่านี่

sugree's picture

ตอนนี้พิมพ์ได้ใช้ได้เป็นปกติ เริ่มอยากรู้ว่า

  1. มันปรับแต่งยังไง เช่น เขียน mode เอง ติดตั้ง mode เอง
  2. อย่าง python-mode นี่เหมือนว่า ubuntu จะมีมาให้แยกต่างหาก ผมควรจะใช้ตัวนั้น หรือว่าหามาลงใน home
  3. mode ยอดนิยมที่ควรมี โดยเฉพาะอย่างยิ่งตอนออกนอกสถานที่ไม่มีเน็ตให้พึ่งพิง
  4. ผมเจอตอเข้าซะแล้ว พอดีกำลังทำตาม tutorial จนมาถึงปุ่ม M-< ก็หมดปัญญากด เพราะว่าพอกด alt-shift มันก็เปลี่ยนภาษาให้เสร็จ พอกด < ก็ได้ M-ฒ มาแทน นี่ผมต้องปรับอะไรอีกรึเปล่าครับ ผมไม่อยากเปลี่ยนปุ่มภาษา alt-shift ซะด้วยซิ
  5. แย่แล้วครับ ผมอ่าน tutorial ภาษาไทยแล้วมัน crash ตลอด จริงๆ แค่กดเปิด tutorial แบบเลือกภาษาได้ไม่ถึง 3 วินาทีก็ไปซะแล้ว segmentation fault
  6. ผมอยาก indent เป็น block ทั้ง left right น่ะครับ เจอ C-x TAB แต่มันไปทีละตัว แล้วก็ไปเฉพาะ right ด้วย พอจะมีหนทางมั๊ยครับ เหมือนว่า indent-rigidly จะใส่ count ได้แต่ใส่ไม่เป็น
sugree's picture

เจออีกหน่อยนึง C-u 4 C-x TAB ก็พอทน map key ยังไงครับเนี่ย

1. file หลักๆ ที่เรา custom คือ ~/.emacs
ลองดูตัวอย่าง file ผม

;; ส่วนใหญ่มักเริ่มด้วย load path
;; load path คือ directory ที่เรามี script elisp file เก็บไว้
(add-to-list 'load-path "/Users/pphetra/dev/emacs/util")
;; ใน directory ข้างล่างนี้ ผมเก็บ rails-xx.el
(add-to-list 'load-path "/Users/pphetra/dev/emacs/rails")
 
;; ระบุว่าให้ load package rails ให้ด้วยนะ
(require 'rails)
 
;; เจอ file ที่นามสกุล rhtml ก็ให้ใช้ html-mode นะ
(add-to-list 'auto-mode-alist '("\\.rhtml$" . html-mode))
 
;; map key เพิ่มเติม
(define-key ruby-mode-map "\C-c\C-r" 'ruby-send-region)
 
;; user define function
;; เวลาใช้ ก็กด M-x แล้วก็พิมพ์ dos2unix
;; ====================
;; custom command
(defun dos2unix ()
  "Convert this entire buffer from MS-DOS text file format to UNIX."
  (interactive)
  (save-excursion
    (goto-char (point-min))
    (replace-regexp "\r$" "" nil)
    (goto-char (1- (point-max)))
    (if (looking-at "\C-z")
        (delete-char 1))))
 
;; default program
;; พวก mode ต่างๆ มักมี assumption ว่า external program อยู่ที่ไหนบ้าง
;; ถ้าเราลงไว้ไม่ตรงกับเขา ก็ต้อง set override ลงไป
(setq sql-mysql-program "/Users/pphetra/bin/mysql")
 
;; อันนี้ไม่รู้เครื่องคนอื่นเป็นหรือเปล่า
;; แต่ของผมบางที มันมีปัญหาการ copy/paste ข้ามโปรแกรม
(setq x-select-enable-clipboard t)

2. ต้องลอง check version ของ python-mode.el ดูครับ ว่าใหม่กว่ากันมากไหม
(ดูที่ comment ใน file)

3. ของผมที่ขาดไม่ได้คือ
+ ido mode ทำให้เปิด file, switch buffer ได้ง่ายครับ
+ recentf mode ช่วยเปิด file เก่าๆ ได้เร็ว
+ eshell ใช้ sh ใน emacs เลย

4. M-<
เปลี่ยนวิธีกด Meta จากเดิมที่ใช้ alt ไปเป็น ESC ครับ
pattern การกดก็คือ
กด ESC แล้วปล่อย จากนั้นก็กด <

5. emacs23 ผม แค่เปิด tutorial thai ก็ hang แล้วครับ

pittaya's picture

อ่า... บน mac ใช้ emacs ตัวไหนดีครับ
อยากลองมั่ง

บน mac ผมใช้ตัวนี้
Aquamacs

veer's picture

ผมใช้ Emacs.app ไม่รู้ตัวเดียวกันหรือเปล่า?

มันมีอีกตัวชื่อ
http://homepage.mac.com/zenitani/emacs-e.html

เดิมผมใช้ตัวนี้ แต่จำไม่ได้ว่าทำไม่ถึงไม่ใช้ต่อ

rerngrit's picture

ตามมาเล่นด้วย ความพยายามของผมเท่าคุณสุกรีเป๊ะเลย :-P

sugree's picture

คราวนี้ถามเทคนิคการกดปุ่มหน่อยครับเท่าที่ผมเข้าใจ

  1. ใช้ Emacs ควรสลับ ctrl กับ capslock
  2. สิ่งที่ใช้บ่อยคือ C x กับ M x
  3. ตอน autocomplete ใช้ M TAB

ผมเจอปัญหามือติดขัด

  1. ตอนกด alt-x เลยอยากรู้เทคนิคการกดว่าใช้นิ้วอะไรมืออะไร
  2. M TAB ผมเลี่ยงไปใช้กด ESC TAB พบว่าไม่สะดวกอย่างมาก ไม่ทราบว่าเค้าใช้วิธีกัน
  3. ผมเอา php-mode มาลอง ปรากฏว่ามันใช้ autocomplete ไม่ได้เพราะยังไม่ได้โหลด tags ไม่ทราบว่าต้องทำยังไง

1. ผมใช้ นิ้วโป้ง กด alt กับนิ้วนาง กด x
แต่มีอยู่ช่วงที่ผม map เป็น M-return แทน (alt-enter)

2. ผมใช้ M-/ แทนครับ เราสามารถใช้
http://emacs.traduc.org/fusion/info/autotype/Hippie-Expand.html
เพื่อร้อยวิธีการ autocomplete ต่างๆเข้าด้วยกัน

3. เรื่อง tags นี่ไม่เคยใช้เหมือนกันครับ

veer's picture

ผมใช้นิ้วโป้งกด alt ใช้ นิ้วชี้กด x
พยายามจะใช้นิ้วโป้งทาบดูบ้างแต่ก็ไม่สำเร็จ :-P

keyboard ของแต่ละคนก็อาจจะหน้าตาไม่เหมือนกันอีกต่างหาก

กดเหมือน veer เลย

อย่างสมมติผมใช้ python-mode
ตัว auto-complete ของ python อยู่ที่ M-tab
ซึ่งไม่ถนัดเลย
ผมก็เลย set อย่างนี้แทน

(setq hippie-expand-try-functions-list
      '(try-complete-abbrev
	try-complete-file-name
	python-try-complete
	try-expand-dabbrev))

(define-key global-map "\M-/" 'hippie-expand)

จะเห็นว่าผมร้อย python-try-complete เข้าไป
ซึ่งตัวนี้มันจะไปเรียกใช้ function ตัวเดียวกับ M-tab

แล้วก็เปลี่ยน M-/ ซ๎่งปกติ จะ map อยุ่กับ dabbrev-expand
ไปเป็น hippie แทน
ซึ่งใน hippie..-list เรากำหนดให้ try-expand-dabbrev เป็นตัวสุดท้าย
ถ้าหาตัวต้นๆไม่เจอ ก็จะตก dabbrev เหมือนเดิม (fallback)

sugree's picture

มันบอกว่าไม่รู้จัก try-complete-abbrev ผมเลยใส่เพิ่มเข้าไป

(defun try-complete-abbrev (old)
  (if (expand-abbrev) t nil))

ถูกรึเปล่าครับ

อ้อ ผมตกไป
ถูกครับ

emacs23 ถ้าต้องการให้ font สวยงาม
สามารถระบุ font เป็น parameter ได้
emacs -fn "Bitstream Vera Sans Mono-12"

sugree's picture

ความตั้งใจวันนี้

เขียนรายงาน 30 หน้าโดยไม่ใช้เมาส์ด้วย Emacs

veer's picture

อ.วิรัช บอกว่าใช้ อ่านเมล ด้วย

sugree's picture

ขอใช้ Thunderbird ไปอีกซักพักนะ

ของผมตอนนั้นตั้งเป้าไว้ว่า
demo blognone tech day ด้วย emacs

sugree's picture

ตอนนั้นพึ่งหัดใช้เหรอครับ โอ้ว

ซ้อมอยู่นานเลยครับ

sugree's picture

คำถามใหม่ shortcut บางอย่างมันมี arg ด้วยน่ะครับ อย่าง C-x f หรือว่า C-x TAB แล้วมันกำหนด arg ยังไงเหรอครับ

C-x f runs the command set-fill-column
  which is an interactive compiled Lisp function in `simple.el'.
It is bound to C-x f.
(set-fill-column arg)

Set `fill-column' to specified argument.
Use C-u followed by a number to specify a column.
Just C-u as argument means to use the current column.

C-u ตามด้วยตัวเลข แล้วก็ C-x f

กรณีเลขน้อยๆ พวก 0-9 สามารถใช้ M-ตัวเลข หรือ C-ตัวเลข ได้เลย
อย่างผมต้องการ 5 column ผมก็กด
C-5 C-x f

สะดวกกว่า C-u หน่อย

sugree's picture

โอ้ เยี่ยม เอาไปใช้กับอย่างอื่นได้ด้วย

sugree's picture

คราวที่แล้วถามปุ่ม M x ไปแล้วคราวนี้ถามวิธีกด C x บ้างครับ แบบมือโปรเค้ากดกัน รวมไปถึงปุ่มอื่นๆ ใกล้ capslock ด้วยครับ อย่าง C a เนี่ย

veer's picture

C x ผมใช้ นิ้วก้อยกด control (caplock; อยากลอง happy hacking keyboard) แล้วก็นิ้วชี้กด x ครับ

C-a
a ผมใช้นิ้วนาง
(ถ้าไม่ใช้ caps-lock เป็น control เจอตัวนี้เข้าไป
คิดว่าคงเลิกใช้ emacs ไปแล้วครับ)

C-x
กดเหมือน veer ครับ

keng's picture

หลัง btd1 ผมลองเอา Emacs.app มาลง เปิดโปรแกรมแล้วก็ cmd+q เพราะไปไหนไม่เป็น สุดท้่ายไปอยู่ใน Trash

คราวนี้จะเอาใหม่่ :D

keng's picture

พี่ป๊อก - ปกติ aquaemacs ต้องเลือก font ไหนพวกวรรณยุกต์มันถึงจะตรงน่ะครับ -_-"

เออใช่ ภาษาไทย emacs บน mac มันเพี้ยนนี่หว่า
สารภาพว่า บน mac ไม่เคยใช้ emacs กับภาษาไทยเลย

sugree's picture

ภารกิจเสร็จสิ้น เกือบจะคุ้นกับวิธีกดปุ่มแล้ว เจอปัญหาใหม่ ผมไม่ค่อยคุ้นกับการเล่นเคอร์เซอร์เอาซักเท่าไหร่ พอจะมีคำแนะนำมั๊ยครับ

  1. อย่างใน vi จะไปที่ตัวอักษรแรกของบรรทัดที่ไม่ใช่ space ก็กด ^ ไปที่ตัวแรกจริงๆ ใช้ 0 อันหลังนี่ใช้ C a ได้แล้ว แต่ ^ ยังหาตัวแทนไม่ได้
  2. ปกติผมจะไปข้างหน้าทีละคำใน vi ก็ w มันจะไปที่ต้นทำถัดไป แต่ M f ดันไปโผล่ช่องว่างระหว่างคำ ซึ่งทำอะไรต่อลำบากจัง ในขณะที่ M b ดันมาโผล่ที่ตัวอักษรแรกของคำ สงสัยผมจะยังไม่เข้าใจจุดประสงค์ของมัน
  3. ใน vi ผมจะชอบใช้ f เพื่อกระโดดไปตัวอักษรที่ต้องการในบรรทัดนั้น เช่น f( แต่ใน Emacs ผมจนปัญญา

ตัวที่เหมือน ^ ผมไม่แน่ใจว่ามีหรือเปล่า
แต่ถ้าเป็นผม ถ้าเกิดอยากให้มีแบบนั้นขึ้นมา ผมก็เขียน elisp แบบนี้ครับ

(defun my-move-beginning-of-line ()
  (interactive)
  (move-beginning-of-line nil)
  (skip-chars-forward " "))

แล้วก็อาจจะ define C-^ ให้ไปใช้ตัวนี้แทน (แต่ C-^ มันกดยากไปหน่อยครับ)

ข้อ 2 ก็อาจจะเขียนแบบนี้ครับ

(defun my-forward-word()
  (interactive)
  (forward-word)
  (skip-chars-forward " ")
  (set-mark-command nil)
  (forward-char))
sugree's picture

มาขอคำแนะนำเรื่อง mode เนื่องจากผมชอบ markdown เป็นชีวิตจิตใจเลยอยากได้ markdown-mode เป็นอย่างมาก แล้วก็ไปเจอต้นฉบับดีๆ เอามาแก้อีกนิดหน่อย มันก็ทำงานพอใช้ได้ แต่อยากรู้ว่าคนปกติเค้าทำแบบนี้กันรึเปล่า

มันแบนแต๋ด้วย ใน lisp นี่เค้า indent แบบไหนถึงจะสวยเนี่ย

;;; markdown-mode.el starts here
 
(defvar markdown-mode-hook nil)
 
(defconst section-header "^#+ .*$" "RE for ### header")
(defconst teaser-break "<\\(!--\\)?break\\(--\\)?>" "RE for <break")
(defconst bold-word-star "\\*\\*.+?\\*\\*" "RE for a **word**")
(defconst italic-word-star "\\*.+?\\*" "RE for a *word*")
(defconst bold-word-us "__.+?__" "RE for a __word__")
(defconst italic-word-us "_.+?_" "RE for a _word_")
(defconst inline-code "`.+?`" "RE for a `code`")
(defconst inline-link "\\(\\[.+?\\]\\)\\((.+?)\\)" "RE for a [link](text)")
(defconst cited-link "\\(\\[.+?\\]\\)\\(\\[.*?\\]\\)" "RE for a [link][]")
(defconst def-link "^\s*\\(\\[.+?\\]\\):\s*\\([^\s]+\\)\s*\\(.*\\)$" "RE for a [link]: ...")
(defconst wiki-link "\\[\\[.+?\\]\\]" "RE for a [[a]]")
 
(defconst markdown-font-lock-keywords-1
(list
; Should match section headers
(cons section-header 'font-lock-builtin-face)
(cons teaser-break 'font-lock-keyword-face)
(cons inline-code 'font-lock-constant-face)
(cons inline-link '(1 'font-lock-string-face t))
(cons inline-link '(2 'font-lock-constant-face t))
(cons cited-link '(1 'font-lock-string-face t))
(cons cited-link '(2 'font-lock-constant-face t))
(cons def-link '(1 'font-lock-constant-face t))
(cons def-link '(2 'font-lock-variable-name-face t))
(cons def-link '(3 'font-lock-string-face t))
(cons wiki-link 'font-lock-string-face)
; Should match bold words
(cons bold-word-star 'font-lock-type-face)
(cons bold-word-us 'font-lock-type-face)
; Should match italic words
(cons italic-word-star 'font-lock-variable-name-face)
(cons italic-word-us 'font-lock-variable-name-face))
"Minimal highlighting expressions for MARKDOWN mode.")
 
(defvar markdown-font-lock-keywords markdown-font-lock-keywords-1
"Default highlighting expressions for MARKDOWN mode.")
 
(define-derived-mode markdown-mode text-mode "Markdown"
"Major mode for editing markdown files."
(set (make-local-variable 'font-lock-defaults)
'(markdown-font-lock-keywords)))
 
(provide 'markdown-mode)
 
;;; markdown-mode.el ends here

เรื่อง indent ของ lisp
ปกติ mode จะจัดการให้หมดครับ เรากด tab อย่างเดียว

แต่ถ้ามัน flat อยู่อย่างนี้
ลองเปิดด้วย mode emacs-lisp-mode
แล้วสั่ง indent region (อยู่ใน menu "emacs-lisp") ดูครับ

sugree's picture

reference card ผมแปะไว้หลังจอ นึกไม่ออกบอกไม่ถูกก็เงยหน้าดู

sugree's picture

มือเริ่มคล่องมากขึ้นเรื่อยๆ ช่วงนี้อยากรู้เรื่อง minibuffer กับ registers ครับ เหมือนกับจะคล้ายๆ กัน แต่ใช้ไม่เป็นทั้งคู่ ตอนนี้ใช้แต่ buffers ธรรมดาเลยอยากรู้ว่ามันเอาไว้ใช้ทำอะไรได้บ้าง

เราจะใช้ font TlwgMono ได้ไหมไหมครับใน emacs แล้วจะไปเพิ่มยังไง

ผมลองสั่ง emacs -fn "TlwgMono-12"
ก็เห็นมันขึ้นมาได้นะ ดูเหมือนว่าจะใช้ font Tlwg
แต่ลองพิมพ์ไทยดู ปรากฎว่า font ที่เป็น thai มันไม่ใช่ Tlwg เสีย

Note: ต้อง emacs-23 นะ

ย้าย Codenone

ประกาศย้าย Codenone ไปใช้ Forum ของ Blognone แทนครับ ตามไปตั้งกระทู้ต่อได้ที่ Codenone Forum (รายละเอียดอ่านจากกระทู้ ย้าย Codenone ไปรวมกับ Blognone)

กระทู้เก่าๆ จะย้ายตามไปในภายหลัง ตอนนี้ปิดการโพสต์กระทู้ไว้ เหลือไว้เฉพาะอ้างอิงเท่านั้น