1 คะแนน โดย GN⁺ 4 시간 전 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • ฟีเจอร์พื้นฐานของ 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 property shr-url ได้ด้วย
    • คำสั่งตัวอย่าง my/search-occur-browse-url ถูกตั้งให้ค้นหาทั้ง regex ของ URL แบบปกติและพร็อพเพอร์ตี shr-url เพื่อสร้างตัวเลือก completion แล้วเปิด URL ที่เลือกด้วย browse-url หรือ browse-url-generic

เปรียบเทียบหน้าต่าง: 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 key C-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 ของ Vim
  • duplicate-dwim จะคัดลอกบรรทัดปัจจุบันหรือช่วงที่เลือกไว้ไปไว้ใต้บรรทัดปัจจุบัน คล้ายกับ yy<N>p ของ Vim
  • copy-from-above-command จะคัดลอกอักขระจากบรรทัดด้านบนตามจำนวน prefix argument แต่ advice ตัวอย่างจะเปลี่ยน C-u prefix 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 ได้โดยไม่ต้องใส่ prefix i
  • ฟีเจอร์นี้มาในรูปคีย์แมปที่วางอยู่บนภาพ จึงไม่ต้องเปิดใช้งานแยกต่างหาก
  • สิ่งที่ถูกปรับเปลี่ยนมีเพียง สถานะการแสดงผล ไม่ใช่ไฟล์ภาพบนดิสก์
  • ในหน้าเว็บและบัฟเฟอร์ 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 และการเข้ารหัสแยกตาม subtree
  • shadowfile คือการทำ unison ภายใน Emacs แต่ประโยชน์ใช้งานยังน่ากังขา
  • double-mode เป็นวิธีป้อนอักขระที่ไม่ได้อยู่บนคีย์บอร์ดด้วยการแปลงคีย์ ซึ่งมาก่อน quail
  • ไลบรารี bs เป็นความพยายามสร้างคำสั่ง list-buffers ที่ฉลาดขึ้น แต่ ibuffer ดีกว่า จึงแทบไม่มีเหตุผลให้ใช้
  • แม้แต่ฟีเจอร์ที่ดูมีประโยชน์บนผิวหน้าอย่างการครอบช่วงที่เลือกด้วยตัวคั่นผ่าน electric-pair-mode ก็ถูกตัดออกเพราะประโยชน์ไม่คุ้มกับความจุกจิก
  • สำหรับงานลักษณะนี้ แพ็กเกจภายนอกอย่าง wrap-region, smartparens และ embrace ดีกว่า
  • ไลบรารีที่มีมาในตัวซึ่งเกี่ยวกับ Org หรืออยู่ใกล้เคียงกับ Org อย่าง appt ก็น่าสนใจ แต่ขอบเขตกว้างพอที่จะต้องแยกไปเขียนอีกบทความ
  • ไลบรารีที่มีประโยชน์หลักกับนักพัฒนา Elisp อย่าง thunk ก็ต้องการการสรุปแยกต่างหากเช่นกัน
  • ไดเรกทอรี lisp ที่มาพร้อม Emacs ไม่ได้ใหญ่เป็นพิเศษ แต่ก็ยังมีโอกาสค้นพบความสามารถพื้นฐานที่มีประโยชน์ได้ต่อไป

1 ความคิดเห็น

 
GN⁺ 4 시간 전
ความเห็นจาก 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 เจ๋งมากสำหรับงานเขียน

    • น่าทึ่งที่ฟีเจอร์พวกนี้มีอยู่ในตัว Emacs เอง ปกติมักเผลอคิดว่า Emacs แค่ให้ elisp API มาสำหรับสร้างของแบบนี้ แต่จริง ๆ ผมพลาดเครื่องมือพื้นฐานไปเยอะ
      เมื่อก่อนใช้ Magit บ่อยกว่ามาก แต่ตอนนี้ย้ายมาใช้ vc-mode และเครื่องมือ diff ที่มีมาในตัวแล้ว และก็พอใจมากเพราะทั้งคู่ทำงานได้ดีมาก
  • ชอบบทความแบบนี้ เวลาใช้เอดิเตอร์ที่ซับซ้อนและปรับแต่งได้อย่าง Emacs หรือ Neovim คนเรามักติดตั้ง ดิสโทรขนาดใหญ่ ก่อนและรีบไปไกลเกิน ทั้งที่ยังไม่เข้าใจว่าตัวแก้ไขพื้นฐานทำอะไรได้บ้าง
    ถ้ามีเวลา การอ่านคู่มือและค่อย ๆ สร้างค่าตั้งเองตั้งแต่ต้นเป็นกระบวนการที่คุ้มค่ามาก มีฟังก์ชัน Emacs ที่ไม่ค่อยมีคนรู้จักชื่อ finder-list-keywords ซึ่งเมื่อรันแล้วจะเปิดเมนูสำหรับสำรวจความสามารถของ Emacs ที่ปกติหาเจอยาก เช่น รู้ไหมว่าเกมที่มีมาในตัวมีตั้ง 24 เกม?