Emacs มีแบตเตอรี่ที่แถมมาให้มากขึ้น
(karthinks.com)- ฟีเจอร์พื้นฐานของ Emacs มีเครื่องมือจำนวนมากที่ใช้งานได้โดยไม่ต้องติดตั้งแพ็กเกจเพิ่มแต่ไม่ค่อยเป็นที่รู้จัก และแม้ใน Emacs สมัยใหม่ 28.1+ ก็ยังค้นพบฟีเจอร์ที่ใช้งานได้จริงซึ่งเรียนรู้ได้ภายใน 5 นาทีอยู่เรื่อย ๆ
- งานประจำวันอย่างการเปิดไฟล์ รวบรวม URL เปรียบเทียบ และติดตามการเปลี่ยนแปลง สามารถจัดการได้เป็นส่วนใหญ่ด้วยเพียง
find-file,dired,ffap-menu,compare-windows,highlight-changes-mode - ไฟล์สำรองและไฟล์จากระบบควบคุมเวอร์ชันสามารถถูกรวมเป็นโมเดลงานเดียวคือ เปรียบเทียบกับเวอร์ชันก่อนหน้า ได้ หากขยายการใช้คำสั่งตระกูล
vc-diff - งานแก้ไข นำทาง และการแสดงผล สามารถปรับปรุงได้อย่างรวดเร็วด้วยฟีเจอร์ที่มีมาให้อยู่แล้ว เช่น ตระกูล
apropos,find-function-on-key,kmacro-edit-lossage,subword-mode, และคีย์แมปจัดการรูปภาพ - takeaway สำคัญคือ แม้ไดเรกทอรี
lispของ Emacs จะไม่ได้ใหญ่โต แต่ก็ยังมีพื้นที่ให้ขยายเวิร์กโฟลว์ได้อีกมากด้วย ฟีเจอร์ที่มีมาในตัว เพียงอย่างเดียว
ภาพรวมและขอบเขต
- ฟีเจอร์ของ Emacs มีปัญหาเรื่องการค้นพบใช้งาน และบทความนี้เป็นความพยายามลดปัญหานั้นด้วยการค่อย ๆ แสดงฟีเจอร์ในตัวที่มีประโยชน์แต่ไม่ค่อยเป็นที่รู้จักทีละอย่าง
- บทความนี้เป็นตอนที่สามที่พูดถึงฟีเจอร์มีประโยชน์แต่ไม่ค่อยเป็นที่รู้จักซึ่งมาพร้อมกับ Emacs โดยค่าเริ่มต้น
- คำว่า “ไม่ค่อยเป็นที่รู้จัก” เป็นการประเมินแบบ主观 โดยคร่าว ๆ หมายถึงฟีเจอร์ที่ในช่วง 20 ปีที่ผ่านมา ผู้เขียนพบว่าถูกพูดถึงในบทสนทนาออนไลน์เกี่ยวกับ Emacs ไม่ถึงห้าครั้งหรือไม่เคยเห็นเลย
- ผู้ใช้ Emacs มือใหม่อาจไม่ควรเริ่มจากที่นี่ เพราะรายการนี้จะมีประโยชน์มากขึ้นหลังจากคุ้นเคยกับแนวคิดพื้นฐานและแพ็กเกจที่มักถูกแนะนำอย่างแพร่หลายแล้ว
- เกณฑ์คือใช้เฉพาะ Emacs แบบเดิมล้วน ๆ โดยไม่พึ่งแพ็กเกจ ไม่มีเส้นโค้งการเรียนรู้ที่ชัน ตัดฟีเจอร์เชิงเล่นสนุกและฟีเจอร์ที่ถูกพูดถึงบ่อยออกไป และอิงกับ Emacs สมัยใหม่ 28.1+
พจนานุกรมแบบเมาส์ชี้: M-x dictionary-tooltip-mode
- เมื่อเปิด
dictionary-tooltip-modeจะสามารถดูความหมายเป็นทูลทิปได้เมื่อนำเมาส์ไปชี้บนคำ - ต้องเปิด
tooltip-modeไว้ด้วย แต่โดยค่าเริ่มต้นจะเปิดใช้งานอยู่แล้ว - หากมีการตั้งค่าพจนานุกรมในเครื่องไว้ ระบบจะใช้พจนานุกรมนั้นก่อน และพจนานุกรมของ Emacs ก็มักค้นหาคำสมัยใหม่และสแลงผ่าน Wiktionary ได้ด้วย
ไวลด์การ์ดของ find-file และ dired
- แม้ใช้งาน
find-fileและdiredแบบโต้ตอบ ก็ยังสามารถใช้ ไวลด์การ์ด ได้ - ใน
find-fileหากใช้แพตเทิร์นอย่าง*foo*.txtก็สามารถเปิดหลายไฟล์พร้อมกันได้ - เมื่อเปิดไดเรกทอรีใน Dired หากระบุไวลด์การ์ดของชื่อไฟล์ ก็สามารถสร้างรายการแบบกำหนดเองที่รวมเฉพาะไฟล์บางประเภทได้
- ตัวอย่างเวิร์กโฟลว์คือใช้แพตเทิร์น
*/*_region_*เพื่อค้นหาไฟล์ชั่วคราวของ AucTeX ในไดเรกทอรีย่อย เลือกใน Dired แล้วลบ จากนั้นใช้ไวลด์การ์ดอีกครั้งเพื่อเปิดไฟล์ TeX หลายไฟล์ในไดเรกทอรีย่อย - ฟีเจอร์นี้แม้จะมองเห็นได้จาก function signature ในการเรียกใช้เชิงโปรแกรม แต่การที่ใช้ได้กับการใช้งานแบบโต้ตอบด้วยนั้น มักจะสังเกตได้ก็ต่อเมื่ออ่าน docstring ทั้งหมด
- ฟีเจอร์ไวลด์การ์ดของ Dired อาจถูกกลบด้วยเวิร์กโฟลว์ Dired แบบสมัยใหม่ที่สร้างจาก
consult-findและembark-exportแต่ข้อดีคือใช้งานได้ทันทีในสภาพเริ่มต้น
รายการ URI ภายในบัฟเฟอร์: M-x ffap-menu
ffapคือฟีเจอร์ find-file-at-point ที่ตรวจสอบว่าตำแหน่งเคอร์เซอร์เป็นพาธไฟล์หรือ URL ที่ใช้ได้หรือไม่ แล้วเปิดได้ทันทีffap-menuจะสแกนทั้งบัฟเฟอร์เพื่อค้นหารายการที่ดูเหมือนพาธไฟล์หรือ URL แล้วแสดงเป็นรายการให้เลือก- เนื่องจากใช้ส่วนติดต่อ
completing-readจึงสามารถส่งออกรายการตัวเลือกที่กรองแล้วไปยังบัฟเฟอร์ หรือคัดลอก เปิด หรือประมวลผลบางส่วนหรือทั้งหมดด้วย Embark ได้ -
แสดงรายการลิงก์ที่มีพร็อพเพอร์ตี
- แอปพลิเคชัน Emacs อย่าง EWW บางครั้งเก็บ URL เป็น text property ไม่ใช่ลิงก์ข้อความธรรมดา และ
ffap-menuจะมองข้ามลิงก์เหล่านี้ - เพื่อชดเชยจุดนี้ สามารถใช้คำสั่งที่ผู้ใช้กำหนดเองซึ่งได้แรงบันดาลใจจาก
ffap-menuเพื่อรวบรวม text propertyshr-urlได้ด้วย - คำสั่งตัวอย่าง
my/search-occur-browse-urlถูกตั้งให้ค้นหาทั้ง regex ของ URL แบบปกติและพร็อพเพอร์ตีshr-urlเพื่อสร้างตัวเลือก completion แล้วเปิด URL ที่เลือกด้วยbrowse-urlหรือbrowse-url-generic
- แอปพลิเคชัน Emacs อย่าง EWW บางครั้งเก็บ URL เป็น text property ไม่ใช่ลิงก์ข้อความธรรมดา และ
เปรียบเทียบหน้าต่าง: M-x compare-windows
- Emacs มีคำสั่งเปรียบเทียบจำนวนมาก เช่น
diff,diff-buffers,diff-backup,dired-diff,vc-diffและคำสั่งediff-*หลายตัว compare-windowsจะเปรียบเทียบข้อความตั้งแต่ตำแหน่งเคอร์เซอร์ของสองหน้าต่าง แล้วหยุดที่จุดแรกที่ไม่ตรงกันพร้อมรายงานผล- สิ่งที่ถูกเปรียบเทียบคือหน้าต่างที่ใช้งานอยู่กับหน้าต่างที่
other-windowจะเลือก แม้ความสามารถจะน้อยกว่า Ediff หรือ diff แต่เรียกใช้ได้ง่ายและรวดเร็วกว่า - คำสั่งนี้เปรียบเทียบเฉพาะข้อความจริงที่มองเห็นอยู่ในสองหน้าต่าง โดยไม่สนชนิดบัฟเฟอร์ สถานะการแก้ไข ไฟล์ หรือสถานะการควบคุมเวอร์ชัน
- หากแสดงส่วนต่าง ๆ ของบัฟเฟอร์เดียวกันในสองหน้าต่าง ก็สามารถเปรียบเทียบข้อความสองช่วงภายในบัฟเฟอร์เดียวกันได้เช่นกัน
- ยังใช้เปรียบเทียบรายการไดเรกทอรีได้ และในตัวอย่าง ความไม่ตรงกันแรกคือเวลาแก้ไขไฟล์
- หากใส่ prefix argument ก็สามารถละเว้นความแตกต่างของช่องว่างได้
เปรียบเทียบไดเรกทอรีด้วย Dired: M-x dired-compare-directories
dired-compare-directoriesจะถามหาไดเรกทอรีที่จะเปรียบเทียบใน Dired แล้วทำเครื่องหมายไฟล์ที่มีชื่อต่างกันในรายการ Dired ทั้งสองฝั่ง- วิธีนี้ครอบคลุมกรณีใช้งานการเปรียบเทียบไดเรกทอรีที่พบบ่อยที่สุดได้
- เนื่องจากเป็นการเปรียบเทียบระดับไฟล์ จึงสามารถกำหนดเงื่อนไขการจับคู่แบบกำหนดเองที่รวมคุณสมบัติไฟล์ เช่น เวลาแก้ไขหรือขนาดไฟล์ได้
- เงื่อนไข
(> mtime2 mtime1)สามารถใช้แสดงไฟล์ที่ถูกแก้ไขล่าสุดกว่าได้ - เงื่อนไข
(/= size1 size2)สามารถใช้แสดงไฟล์ที่ชื่อเหมือนกันแต่ขนาดต่างกันได้ - หากต้องการการเปรียบเทียบที่โต้ตอบได้มากกว่า ก็สามารถใช้
ediff-directoriesได้เช่นกัน
เน้นการเปลี่ยนแปลงในบัฟเฟอร์: M-x highlight-changes-mode
highlight-changes-modeเป็นฟีเจอร์สำหรับเน้นจุดที่ไฟล์มีการเปลี่ยนแปลง และสามารถใช้เป็นทางเลือกแบบ “สด” ของคำสั่ง diff เช่นdiff-buffer-with-file- พฤติกรรมเริ่มต้นคือจะเน้นการเปลี่ยนแปลงตั้งแต่ตอนเปิดโหมดจนถึงตอนปิด ไม่ได้เป็นการเน้นเฉพาะการเปลี่ยนแปลงที่ยังไม่ถูกบันทึกโดยอัตโนมัติ
- หากใช้
before-save-hookและafter-save-hookก็สามารถสร้างเวิร์กโฟลว์ที่ปิดการเน้นก่อนบันทึกแล้วเปิดใหม่หลังบันทึก เพื่อให้เน้นเฉพาะการเปลี่ยนแปลงก่อนบันทึกได้ - โค้ดตัวอย่างจะเปิด
highlight-changes-modeให้กับ file buffer ในtext-mode-hookและปรับสถานะการเน้นด้วย hook ก่อนและหลังบันทึก - หากทำให้อยู่ในรูป
highlight-unsaved-modeแบบแยกต่างหาก ก็จะกลายเป็นไมเนอร์โหมดที่เน้นทุกการเปลี่ยนแปลงจนกว่าจะบันทึก - สามารถย้ายไปยังจุดเปลี่ยนแปลงถัดไปหรือก่อนหน้าด้วย
highlight-changes-next-changeและhighlight-changes-previous-change - ใช้
highlight-changes-remove-highlightเพื่อลบการเน้นเชิงภาพออก และใช้เฉพาะการนำทางที่อิงจากการติดตามการเปลี่ยนแปลงได้
ทำให้ไฟล์สำรองมีประโยชน์จริง: ตระกูล vc-diff
-
ปัญหาของไฟล์สำรองใน Emacs
- โดยปกติ Emacs จะสร้างไฟล์สำรองของไฟล์ที่กำลังแก้ไขและบันทึกไว้เป็นระยะ
- ระบบสำรองนี้มักถูกพูดถึงว่าเป็นฟีเจอร์น่ารำคาญที่ควรปิดด้วย
make-backup-files - อาจมีความกังวลด้านความปลอดภัย เพราะไฟล์ที่มีข้อมูลอ่อนไหวถูกคัดลอกไปยังตำแหน่งอื่นบนดิสก์
- นอกเหนือจากนั้น ปัญหาหลักคือไฟล์สำรองกระจัดกระจายอยู่ในไดเรกทอรีทำงาน และยังขาด UI ที่สะดวกสำหรับการดูหรือจัดการไฟล์สำรอง
- สามารถปรับตำแหน่งและจำนวนที่เก็บของไฟล์สำรองได้ด้วยตัวเลือกผู้ใช้อย่าง
backup-directory-alist,kept-old-versions,kept-new-versions - แพ็กเกจภายนอก
backup-walkerมีอินเทอร์เฟซสำหรับสำรวจไฟล์สำรองแบบเหมือนย้อนเวลา
-
ขยายอินเทอร์เฟซ VC
- แพ็กเกจ VC ที่มาพร้อม Emacs มีอินเทอร์เฟซสำหรับดูไฟล์เวอร์ชันก่อนหน้าของไฟล์ที่อยู่ภายใต้ระบบควบคุมเวอร์ชัน
vc-diffใช้ diff ไฟล์กับเวอร์ชันก่อนหน้าทันทีหรือเวอร์ชันที่ระบุvc-ediffเรียกใช้ Ediff กับไฟล์และเวอร์ชันก่อนหน้าทันทีหรือเวอร์ชันที่ระบุvc-revision-other-windowแสดงเวอร์ชันก่อนหน้าหรือเวอร์ชันเก่าที่ระบุไว้ข้างไฟล์ปัจจุบัน- อินเทอร์เฟซนี้ไม่ได้จำกัดแค่ Git แต่จะไม่ทำงานกับไฟล์ที่ไม่ได้อยู่ภายใต้การควบคุมเวอร์ชัน
- หากโอเวอร์โหลดคำสั่ง VC ทั้งสาม ก็จะรวมทั้งบัฟเฟอร์ที่ยังไม่บันทึก ไฟล์ที่อยู่ภายใต้เวอร์ชันคอนโทรล และไฟล์สำรองของไฟล์ที่ไม่ได้อยู่ภายใต้เวอร์ชันคอนโทรล เข้าสู่โมเดลเดียวกันคือ “เปรียบเทียบกับเวอร์ชันก่อนหน้า”
- สำหรับไฟล์ที่ยังไม่บันทึก
vc-diffและvc-ediffจะเปรียบเทียบบัฟเฟอร์กับไฟล์ - สำหรับไฟล์ที่อยู่ภายใต้เวอร์ชันคอนโทรล จะเรียก
vc-diff,vc-ediff,vc-revision-other-windowเดิมตามปกติ - สำหรับไฟล์ที่ไม่ได้อยู่ภายใต้เวอร์ชันคอนโทรล จะเปรียบเทียบหรือแสดงไฟล์สำรองหมายเลขล่าสุด หรือไฟล์สำรองหมายเลขที่เลือกด้วย prefix argument
ตระกูล apropos
describe-keyหรือC-h kเป็นปุ่มช่วยเหลือที่มีประโยชน์มาก เพราะสามารถดูได้โดยตรงว่าการกดคีย์เรียกฟังก์ชันใด- ในฐานะฟีเจอร์ช่วยเหลือลำดับถัดไปที่ควรเรียนรู้
aproposทรงพลังมาก และเป็นทางเข้าสำหรับทำความเข้าใจการจัดวางฟังก์ชันต่าง ๆ ของ Emacs เมื่อตอนที่ยังไม่รู้ว่าควรค้นหาอะไร aproposไม่ใช่คำสั่งเดียว แต่เป็นตระกูลของคำสั่งค้นหาเฉพาะทางหลายตัว เช่นapropos-library,apropos-function,apropos-command,apropos-variable,apropos-user-option,apropos-documentation,info-apropos- การตั้งค่าตัวอย่างจะผูกคำสั่งเหล่านี้ไว้ในคีย์แมปใต้
C-h aเพื่อใช้แทนapropos - แม้ไม่มี prompt helper อย่าง
which-keyก็ยังกดC-hหลัง prefix keyC-h aเพื่อดูรายการคำสั่งที่ใช้ได้ customize-aproposจะรวบรวมตัวเลือก, face และ group ที่ตรงกับคำค้น แล้วสร้างบัฟเฟอร์ customize แบบเฉพาะขึ้นมาให้
เครื่องมือ find-func: M-x find-function-on-key, M-x find-function
- หากไม่ชอบคีย์ไบน์ดิงหรืออยากรู้ว่ามันทำงานอย่างไร คุณสามารถกระโดดไปยังนิยามของคำสั่งที่คีย์นั้นเรียกใช้ เพื่ออ่านหรือแก้ไขพฤติกรรมได้
- ขั้นตอนทั่วไปคือใช้
describe-keyหรือC-h kเพื่อตรวจดูว่าคีย์นั้นเรียกคำสั่งอะไร แล้วกดsเพื่อไปยังซอร์ส find-function-on-keyช่วยลดขั้นตอนที่สองนี้ โดยกระโดดจากคีย์ไบน์ดิงไปยังซอร์สของฟังก์ชันทันที- การตั้งค่าตัวอย่างผูก
C-h M-kในhelp-mapเข้ากับfind-function-on-key
copy-from-above-command และ duplicate-dwim
- ล่าสุด Emacs ได้เพิ่มคำสั่งคัดลอกข้อความที่ผู้ใช้หลายคนใช้กันมานานแล้ว
copy-from-above-commandจะคัดลอกข้อความจากบรรทัดแรกที่ไม่ว่างเหนือบรรทัดปัจจุบัน คล้ายกับC-yของ Vimduplicate-dwimจะคัดลอกบรรทัดปัจจุบันหรือช่วงที่เลือกไว้ไปไว้ใต้บรรทัดปัจจุบัน คล้ายกับyy<N>pของ Vimcopy-from-above-commandจะคัดลอกอักขระจากบรรทัดด้านบนตามจำนวน prefix argument แต่ advice ตัวอย่างจะเปลี่ยนC-uprefix argument ให้ทำงานเป็น “คัดลอกทั้งบรรทัดด้านบนแล้วใส่คอมเมนต์”- หากใช้ numeric prefix argument
C-<N>ก็ยังคัดลอกจำนวนอักขระที่กำหนดจากด้านบนได้แบบเดิม duplicate-dwimจำเป็นต้องเลือกว่าจะวางเคอร์เซอร์ไว้ที่ต้นฉบับหรือสำเนาหลังจากคัดลอกเสร็จ และสามารถกำหนดได้ด้วยตัวเลือกผู้ใช้- การตั้งค่าตัวอย่างกำหนด
duplicate-region-final-positionและduplicate-line-final-positionเป็น-1เพื่อให้เคอร์เซอร์และช่วงเลือกย้ายไปยังข้อความที่คัดลอกขึ้นมา
สร้างมาโครจากประวัติการกดคีย์: M-x kmacro-edit-lossage
- คีย์บอร์ดมาโครของ Emacs สามารถจับและเล่นซ้ำลำดับการทำงานทุกอย่างใน Emacs ได้ ไม่ใช่แค่การแปลงข้อความ แต่รวมถึงการคลิกเมาส์ด้วย
- คีย์บอร์ดมาโครทรงพลัง แต่มีภาระทางความคิดสูง เพราะต้องคาดการณ์ความเป็นไปได้ในการทำซ้ำก่อนเริ่มบันทึก และต้องทำให้การทำงานนั้นเป็นแบบทั่วไปที่ไม่มีข้อผิดพลาด
- คำสั่ง
.ของ Vim และแพ็กเกจdot-modeของ Emacs ช่วยบรรเทาปัญหาการทำซ้ำการแก้ไขได้ แต่ขอบเขตต่างจากคีย์บอร์ดมาโครเต็มรูปแบบ view-lossage(C-h l) จะแสดงประวัติการกดคีย์ล่าสุดราว 300 รายการkmacro-edit-lossageทำให้สามารถสร้างมาโครจากประวัติการกดคีย์นี้ได้ทุกเมื่อ- lossage สามารถแก้ไขได้จริง ดังนั้นตอนสร้างมาโครจึงสามารถใส่คำสั่งใหม่ลงไปในบันทึกได้
- มาโครที่นิยามไว้แล้วสามารถแก้ไขได้บ่อยกว่าด้วย
edit-kbd-macro(C-x C-k e) แต่kmacro-edit-lossageมีประโยชน์ในสถานการณ์ที่ไม่เกิดบ่อย เมื่อต้องการทำให้งานซับซ้อนที่เพิ่งทำไปสามารถทำซ้ำได้ - หากต้องการสร้างมาโครที่ทำให้เป็นแบบทั่วไปได้ มักจำเป็นต้องแทรกการเรียก
kbd-macro-queryลงใน lossage
subword-mode, superword-mode, ไวยากรณ์ของคำ
- คำสั่งนำทางและแก้ไขแบบอิงคำของ Emacs ใช้ syntax table ตาม major mode และผู้ใช้สามารถปรับได้ว่าจะถือว่าอะไรเป็นคำ
- ใน
subword-modeแต่ละองค์ประกอบของสัญลักษณ์แบบ CamelCase จะถูกมองเป็นคำ - ตัวอย่างเช่น
GtkWindowจะแบ่งเป็นGtkและWindow,EmacsFrameClassเป็นEmacs,Frame,Class,NSGraphicsContextเป็นNS,Graphics,Context - ใน
superword-modeสัญลักษณ์แบบ snake_case เช่นthis_is_a_symbolจะถูกมองเป็นคำเดียว - ในการใช้งานจริง การจัดการสัญลักษณ์ด้วยคำสั่ง
*-sexpรองรับได้ดีอยู่แล้ว ดังนั้นsuperword-modeจึงมีประโยชน์น้อยกว่าsubword-mode - เพียงแก้ syntax table ของ major mode ไม่กี่นาที ก็ช่วยลดความไม่สะดวกที่เจอระหว่างการนำทางเชิงโครงสร้างได้
- ในบริบทสาย Lisp หากกำหนดให้
:เป็นอักขระที่ประกอบเป็นคำ ก็จะจัดการคีย์เวิร์ดอย่าง:fooด้วยbackward-kill-wordได้ง่ายขึ้น - ใน Org mode ก็สามารถปรับให้ตัวคั่น
=และ~ถูกมองเป็นอักขระที่ประกอบเป็นคำได้ - วิธีระบุไวยากรณ์ของอักขระดูได้จาก
describe-syntax(C-h s) และmodify-syntax-entry
การควบคุมการแสดงภาพ
- แทบทุกที่ที่ Emacs แสดงภาพ คุณสามารถวางเคอร์เซอร์ไว้บนภาพแล้วกด
iเพื่อควบคุมการแสดงผลได้ - การควบคุมแบบเดียวกันนี้ใช้ได้กับภาพตัวอย่างจากลิงก์รูปภาพใน Org mode และภาพในบัฟเฟอร์รายการของ Elfeed
i +และi -มีประโยชน์สำหรับการซูมเข้าและซูมออก ส่วนi rจะหมุนภาพ 90 องศา- ยังสามารถครอปภาพได้ด้วย
i cและดูคีย์แบบละเอียดได้ที่M-x describe-keymap RET image-map - ยังใช้คีย์ลัด
C-<wheel>ที่คุ้นเคยจากเบราว์เซอร์และแอปอื่น ๆ ได้ด้วย - หากใช้
repeat-modeหลังการเรียกครั้งแรกก็สามารถทำซ้ำด้วย+,-,rได้โดยไม่ต้องใส่ prefixi - ฟีเจอร์นี้มาในรูปคีย์แมปที่วางอยู่บนภาพ จึงไม่ต้องเปิดใช้งานแยกต่างหาก
- สิ่งที่ถูกปรับเปลี่ยนมีเพียง สถานะการแสดงผล ไม่ใช่ไฟล์ภาพบนดิสก์
- ในหน้าเว็บและบัฟเฟอร์ HTML ที่เรนเดอร์แล้ว
z(shr-zoom-image) จะตัดภาพออกเป็นแถบแนวนอนหลายบรรทัดและวนขนาดภาพ เพื่อลดข้อจำกัดในการแสดงภาพขนาดใหญ่
แสดงข้อความทั้งหมด: M-x visible-mode
- Emacs สามารถทำให้ข้อความในบัฟเฟอร์มองไม่เห็นได้แบบเลือกเฉพาะส่วน และความสามารถนี้คือพื้นฐานของพฤติกรรมการพับใน Magit section, Outline mode และ Org mode
- โหมดที่มีฟีเจอร์พับมักมีคีย์ลัดสำหรับสลับสถานะการพับ โดยทั่วไป
TABมักใช้ได้ - หากเรียนรู้คีย์ลัดเฉพาะของแต่ละโหมดยาก หรือไม่ได้ใช้บ่อยพอ ก็สามารถใช้
visible-modeเพื่อดูข้อความที่ซ่อนอยู่ทั้งหมดได้ visible-modeจะปิดการทำให้ข้อความมองไม่เห็นทั้งบัฟเฟอร์ และเมื่อเรียกใช้อีกครั้งจะกู้สถานะการมองไม่เห็นก่อนหน้ากลับมา- ในบัฟเฟอร์ที่มี UI การพับแบบไดนามิก หน้าจออาจแสดงผลเพี้ยนระหว่างที่
visible-modeเปิดอยู่ - ฟีเจอร์นี้ใกล้เคียงกับมาตรการชั่วคราวหรือเครื่องมือดีบักมากกว่า แต่ช่วยเปิดเผยข้อความทั้งหมดในบัฟเฟอร์ได้อย่างสม่ำเสมอด้วยคำสั่งเดียว
ไม่สนใจข้อความที่มองไม่เห็น: isearch-toggle-invisible
- คำสั่งบางอย่างของ Emacs เช่น Isearch จะไม่สนใจการทำให้ข้อความมองไม่เห็นโดยปริยาย ทำให้ค้นหาได้ง่ายทั่วทั้งเอกสารจริง
- เมื่อสภาพที่มองเห็นของบัฟเฟอร์ทำหน้าที่เป็นแนวทางการนำทาง การค้นหาที่เปิดข้อความที่พับไว้อัตโนมัติอาจทำงานไม่ตรงกับที่คาด
- ถ้าใช้ Isearch เป็นเครื่องมือนำทางมากกว่าการค้นหา การย้ายไปยังผลลัพธ์ในส่วนที่พับอยู่จะกลายเป็นปัญหา
- ระหว่างใช้ Isearch สามารถสลับว่าจะค้นหาในข้อความที่มองไม่เห็นหรือไม่ด้วย
isearch-toggle-invisibleที่ผูกไว้กับM-s i - ในตัวอย่าง มีการค้นหา
zeroเพื่อย้ายไปยังหัวข้อสุดท้ายของเอกสาร Org แต่กลับข้ามไปยังผลลัพธ์ในส่วนที่พับอยู่ จากนั้นจึงค้นหาใหม่พร้อมกดM-s iเพื่อย้ายเฉพาะผลลัพธ์ในข้อความที่มองเห็น - คีย์สลับพฤติกรรมของ Isearch อยู่ใต้คีย์แมป
M-sที่สอดคล้องกับคีย์ลัดพื้นฐานC-s
ไม้บรรทัด: M-x ruler-mode
- Emacs ยังคงมีฟีเจอร์หลงเหลือจากความสามารถด้านเวิร์ดโปรเซสซิงแบบ WYSIWYG ในอดีต เช่นคำสั่ง
center-* - คำสั่ง
center-*จะจัดกึ่งกลางบรรทัด ย่อหน้า หรือช่วงที่เลือก โดยอิงจากfill-columnและใช้กับสิ่งอย่างคอมเมนต์ตกแต่งในโค้ดได้ - ความกว้างของ margin และ fringe บนหน้าจอเป็นพื้นที่ที่ใส่ฟีเจอร์ได้มาก แต่การเปลี่ยนความกว้างของ margin โดยตรงไม่ใช่งานที่ง่าย
set-left-marginและset-right-marginไม่ได้เป็นคำสั่งเปลี่ยนความกว้างของ margin ที่แสดงผล แต่ทำงานคล้ายคำสั่งตระกูลcenterที่เยื้องข้อความจริงในบัฟเฟอร์- การตั้งค่า margin ที่แสดงผลไม่มีคำสั่งตรง ๆ และยังมีปัญหาที่ผลจะไม่ถูกนำไปใช้จนกว่าหน้าต่างจะถูกแสดงผลใหม่อีกครั้ง
- เมื่อเปิด
ruler-modeสามารถดูวิธีใช้ได้จากทูลทิปบน header-line - ใช้
S-<mouse-1>และS-<mouse-3>เพื่อตั้งค่า margin ซ้ายและขวาของบัฟเฟอร์ - ใช้การลาก
<mouse-2>เพื่อตั้งค่าfill-columnได้ด้วย - หากต้องการเปลี่ยน margin เฉพาะหน้าได้ทันทีมากกว่าการสลับค่าความกว้างสำเร็จรูป
ruler-modeอาจเป็นมิตรกับผู้ใช้มากกว่าแพ็กเกจอย่างvisual-fill-columnหรือolivetti
จัดข้อความใหม่อัตโนมัติ: M-x refill-mode
- Emacs มีคำสั่ง
fill-*หลายตัวสำหรับจัดข้อความ และมีauto-fill-modeสำหรับจัดการการขึ้นบรรทัดใหม่ระหว่างพิมพ์ auto-fill-modeถูกยกมาอธิบายตั้งแต่ช่วงต้นของบทเรียน Emacs มากพอจะสะท้อนว่าการจัดข้อความเป็นความสามารถด้านการแก้ไขที่สำคัญauto-fill-modeไม่ได้อัตโนมัติเต็มที่ในทางปฏิบัติ เพราะจะตัดบรรทัดเฉพาะบรรทัดปัจจุบัน และความเพี้ยนของย่อหน้าก่อนหน้าที่เกิดจากการวางข้อความยังต้องแก้เองrefill-modeคือความสามารถจัดข้อความอัตโนมัติอย่างแท้จริงของ Emacs ที่ช่วยให้เอกสารถูกคงไว้ตามfill-column- สามารถใช้งานพฤติกรรมนี้ได้ด้วยการรัน
M-x refill-mode
เลื่อนทุกหน้าต่างพร้อมกัน: M-x scroll-all-mode
scroll-other-windowช่วยเลื่อนหน้าต่างอื่นที่ไม่ได้ถูกเลือกได้โดยไม่ต้องสลับไปยังหน้าต่างนั้น และมีประโยชน์เมื่อทำงานในหน้าต่างปัจจุบันพร้อมดูข้อมูลอ้างอิงในหน้าต่างถัดไปfollow-modeคือความสามารถในการดูบัฟเฟอร์เดียวต่อเนื่องข้ามหลายหน้าต่างscroll-all-modeเป็นฟีเจอร์ที่คนรู้จักน้อยกว่า แต่จะเลื่อนทุกหน้าต่างในเฟรมพร้อมกัน- มีประโยชน์เมื่อดูบัฟเฟอร์ที่ต้องลองซิงก์กัน โดยในตัวอย่างใช้เพื่อเปรียบเทียบไฟล์สองเวอร์ชันด้วยสายตาโดยไม่ต้องเข้าเซสชัน Ediff
- ลำดับการใช้งานในตัวอย่างคือเปิดแบ็กอัปก่อนหน้าบางเวอร์ชันของไฟล์ปัจจุบันด้วย
vc-revision-other-windowจากนั้นเปิดscroll-all-modeแล้วเลื่อนตามปกติ ซึ่งจะทำให้ทุกหน้าต่างขยับพร้อมกัน -
การเลื่อนหน้าต่างอื่นและ
master-mode- ปัญหาอาจเกิดขึ้นเมื่อมีหน้าต่างบนจอมากกว่าสองบาน และหน้าต่างที่ต้องการเลื่อนไม่ใช่
next-windowที่ Emacs เลือกให้ master-modeที่มีมาในตัวช่วยให้กำหนดล่วงหน้าหรือกำหนดทันทีได้ว่าบัฟเฟอร์ใดสามารถเลื่อนจากบัฟเฟอร์อื่นได้- วิธีที่ตรงไปตรงมามากกว่าคือกำหนดกลยุทธ์ในการหาหน้าต่างที่จะเลื่อน
(setq other-window-scroll-default #'get-lru-window)จะทำให้เลื่อนหน้าต่างที่ไม่ได้ใช้งานนานที่สุดเสมอ- วิธีนี้มีประโยชน์เมื่อต้องการเลื่อนหน้าต่างที่เก็บข้อมูลอ้างอิงและแทบไม่ได้เลือกใช้งาน
- ถ้ามีหน้าต่างที่แก้ไขบ่อยสองบานอยู่ท่ามกลางหลายหน้าต่าง ก็สามารถตั้งค่าฟังก์ชันแลมบ์ดาให้เลื่อนหน้าต่างที่ใช้งานล่าสุดเป็นหน้าต่างอื่นได้
- การผสมผสานการตั้งค่าเหล่านี้ช่วยให้
scroll-other-windowเลื่อนหน้าต่างที่ตั้งใจได้มากขึ้น
- ปัญหาอาจเกิดขึ้นเมื่อมีหน้าต่างบนจอมากกว่าสองบาน และหน้าต่างที่ต้องการเลื่อนไม่ใช่
ปฏิเสธการปิด: M-x emacs-lock-mode
- เมื่อมีไฟล์ที่ยังไม่ได้บันทึก Emacs จะปฏิเสธการปิดจนกว่าจะตอบว่าจะจัดการแต่ละไฟล์อย่างไร
emacs-lock-modeขยายแนวคิดนี้ต่อ โดยให้ผู้ใช้ล็อกบัฟเฟอร์ใดก็ได้ตามต้องการ- จนกว่าจะปลดล็อก บัฟเฟอร์นั้นจะปฏิเสธการ kill และแสดงข้อความอย่าง
Buffer "*scratch*" is locked and cannot be killed - หากมีบัฟเฟอร์ที่ถูกล็อก Emacs ก็จะปฏิเสธการปิดเช่นกัน พร้อมข้อความอย่าง
Emacs cannot exit because buffer "*scratch*" is locked - มีประโยชน์ในการป้องกันการสูญเสียข้อมูลในบัฟเฟอร์ที่ไม่ได้เปิดไฟล์อยู่โดยไม่ตั้งใจ หรือใช้เตือนว่ายังมีงานค้างในบัฟเฟอร์นั้น
- หลังจาก Org-capture ปัญหาแบบแรกพบได้น้อยลง แต่ก็ยังมีประโยชน์ในการไม่ทำเอาต์พุตหรือสถานะจากบัฟเฟอร์ shell, compilation, เว็บไซต์ หรือแอปพลิเคชันพิเศษอื่น ๆ หายไป
กู้คืนเฟรม: M-x undelete-frame-mode, M-x undelete-frame
- หากเผลอปิดเฟรม Emacs ที่จัดไว้อย่างประณีต สามารถกู้กลับได้ด้วย
undelete-frame - การใช้ฟีเจอร์นี้ต้องเปิด
undelete-frame-modeไว้ก่อน - มันทำกับเฟรมในแบบเดียวกับที่
winnerและtab-bar-historyที่มีมาในตัวทำกับหน้าต่าง - การเปิด
undelete-frame-modeไว้พร้อม Emacs ช่วยให้กังวลเรื่องปิดเฟรมน้อยลง - สามารถกู้คืนเฟรมที่ถูกลบได้สูงสุด 16 เฟรม
ฟีเจอร์ที่เหลือและฟีเจอร์ที่ถูกตัดออก
- จากฟีเจอร์ที่พบเจอตลอด 6 ปีที่ผ่านมา มี 20 ฟีเจอร์ที่ยังอยู่รอดในความเป็นจริงของการใช้ Emacs ปี 2026
- ไลบรารี Emacs หลายตัวที่เจอโดยบังเอิญให้อารมณ์น่าสนใจเชิงโบราณคดีมากกว่าจะเป็นทางออกที่มั่นคงสำหรับความต้องการของผู้ใช้ทั่วไป
allout-modeเป็นตัวจัดการ outline ในจักรวาลคู่ขนานที่คล้าย Org mode และมีฟีเจอร์อย่าง speed-key ของ Org และการเข้ารหัสแยกตาม subtreeshadowfileคือการทำunisonภายใน Emacs แต่ประโยชน์ใช้งานยังน่ากังขาdouble-modeเป็นวิธีป้อนอักขระที่ไม่ได้อยู่บนคีย์บอร์ดด้วยการแปลงคีย์ ซึ่งมาก่อนquail- ไลบรารี
bsเป็นความพยายามสร้างคำสั่งlist-buffersที่ฉลาดขึ้น แต่ibufferดีกว่า จึงแทบไม่มีเหตุผลให้ใช้ - แม้แต่ฟีเจอร์ที่ดูมีประโยชน์บนผิวหน้าอย่างการครอบช่วงที่เลือกด้วยตัวคั่นผ่าน
electric-pair-modeก็ถูกตัดออกเพราะประโยชน์ไม่คุ้มกับความจุกจิก - สำหรับงานลักษณะนี้ แพ็กเกจภายนอกอย่าง
wrap-region,smartparensและembraceดีกว่า - ไลบรารีที่มีมาในตัวซึ่งเกี่ยวกับ Org หรืออยู่ใกล้เคียงกับ Org อย่าง
apptก็น่าสนใจ แต่ขอบเขตกว้างพอที่จะต้องแยกไปเขียนอีกบทความ - ไลบรารีที่มีประโยชน์หลักกับนักพัฒนา Elisp อย่าง
thunkก็ต้องการการสรุปแยกต่างหากเช่นกัน - ไดเรกทอรี
lispที่มาพร้อม Emacs ไม่ได้ใหญ่เป็นพิเศษ แต่ก็ยังมีโอกาสค้นพบความสามารถพื้นฐานที่มีประโยชน์ได้ต่อไป
1 ความคิดเห็น
ความเห็นจาก Lobste.rs
การเปิดหลายไฟล์ด้วยไวลด์การ์ดอย่าง
*foo*.txtในfind-file(C-x C-f) มักเป็นความผิดพลาด เลยใส่advice-addไว้ที่find-file-noselectเพื่อให้เมื่อใช้ไวลด์การ์ดfind-fileเปิดdiredขึ้นมาทันทีวิธีคือถ้าผลของ
file-expand-wildcardsมีตั้งแต่ 2 รายการขึ้นไปก็ส่งต่อไปที่dired-noselectไม่อย่างนั้นก็เรียกfind-file-noselectตามเดิมruler-modeสนุกมาก ไม่เคยรู้มาก่อนเลยว่า Emacs มีความสามารถแบบ WYSIWYG ด้วย Emacs เป็นซอฟต์แวร์ที่ทั้งแปลกและน่าใช้จริง ๆใช้ Emacs แบบธรรมดามาตลอดและคิดว่าแทบจะดูครบหมดแล้ว แต่ยังมีอะไรให้ค้นพบอีกมาก
ruler-modeเจ๋งมากสำหรับงานเขียนเมื่อก่อนใช้ Magit บ่อยกว่ามาก แต่ตอนนี้ย้ายมาใช้
vc-modeและเครื่องมือdiffที่มีมาในตัวแล้ว และก็พอใจมากเพราะทั้งคู่ทำงานได้ดีมากชอบบทความแบบนี้ เวลาใช้เอดิเตอร์ที่ซับซ้อนและปรับแต่งได้อย่าง Emacs หรือ Neovim คนเรามักติดตั้ง ดิสโทรขนาดใหญ่ ก่อนและรีบไปไกลเกิน ทั้งที่ยังไม่เข้าใจว่าตัวแก้ไขพื้นฐานทำอะไรได้บ้าง
ถ้ามีเวลา การอ่านคู่มือและค่อย ๆ สร้างค่าตั้งเองตั้งแต่ต้นเป็นกระบวนการที่คุ้มค่ามาก มีฟังก์ชัน Emacs ที่ไม่ค่อยมีคนรู้จักชื่อ
finder-list-keywordsซึ่งเมื่อรันแล้วจะเปิดเมนูสำหรับสำรวจความสามารถของ Emacs ที่ปกติหาเจอยาก เช่น รู้ไหมว่าเกมที่มีมาในตัวมีตั้ง 24 เกม?