1 คะแนน โดย GN⁺ 2023-12-11 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • แม้เดิมจะเป็นบทความวิจารณ์การเปลี่ยนแปลงของ ฟีเจอร์ registers ใน Emacs 30 แต่ในเนื้อหาที่เผยแพร่ปัจจุบัน ต้นฉบับถูกนำลงแล้ว
  • ต้นฉบับถูกลบเนื่องจากวิจารณ์การพัฒนา Emacs ในช่วงหลังอย่างรุนแรงเกินไป และ ไม่เป็นมิตรต่อบุคคลที่เกี่ยวข้อง
  • เหลือไว้เพียงคำแนะนำว่าหากต้องการดูเนื้อหาที่ถูกลบ ให้ไปค้นหา Git log ของเว็บไซต์ผู้เขียน
  • สาระสำคัญที่ยังเหลืออยู่คือ ผู้เขียนเริ่มใช้ branch ของ Emacs ที่แตกต่างออกไปเล็กน้อยสำหรับการใช้งานประจำวัน
  • จากเนื้อหาที่เผยแพร่ปัจจุบันเพียงอย่างเดียว จึงยากที่จะตรวจสอบรายละเอียดการเปลี่ยนแปลงหรือประเด็นทางเทคนิคของฟีเจอร์ registers ใน Emacs 30

บทความวิจารณ์ Emacs 30 ที่ถูกนำลง

  • ต้นฉบับเป็นบทความเกี่ยวกับการเปลี่ยนแปลงใน ฟีเจอร์ registers ของ Emacs 30 ที่ผู้เขียนมองว่าแย่ลง
  • ในเนื้อหาที่เผยแพร่ยังคงระบุเหตุผลของการลบไว้ว่า บทความเดิมวิจารณ์การพัฒนา Emacs ในช่วงหลังมากเกินไป และไม่เป็นมิตรต่อผู้คนที่เกี่ยวข้อง
  • ยังระบุด้วยว่า บทความนี้ได้รับความสนใจมากกว่าบล็อกโพสต์ก่อนหน้ามาก ซึ่งเป็นส่วนหนึ่งของเหตุผลเบื้องหลังการลบ

ข้อมูลที่ตรวจสอบได้ในปัจจุบัน

  • หากต้องการอ่านบทความที่ถูกลบจริง ๆ สามารถตรวจสอบ Git log ของเว็บไซต์นี้ได้
  • ผู้เขียนระบุว่าเริ่มใช้ branch ของ Emacs ที่แตกต่างออกไปเล็กน้อยสำหรับการใช้งานประจำวัน
  • เนื้อหาที่เผยแพร่ปัจจุบันไม่มีรายละเอียดปัญหา ตัวอย่าง หรือเนื้อหาแพตช์ที่เฉพาะเจาะจงเกี่ยวกับการเปลี่ยนแปลงฟีเจอร์ registers ใน Emacs 30

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

 
GN⁺ 2023-12-11
ความเห็นจาก Hacker News
  • ใน branch พัฒนาของ Emacs ต่อให้มีการนำ การเปลี่ยนแปลงที่ทำลายความเข้ากันได้ เข้ามาไม่ว่าจะตั้งใจหรือไม่ และแม้ผู้ใช้บางส่วนจะแสดงความกังวล ก็ไม่ได้หมายความว่าจะต้องรีบย้อนกลับทันที
    จำเป็นต้องมีขั้นตอนในการถกข้อดีข้อเสีย ทดลองและปรับปรุงวิธีแก้หลายแบบ แล้วค่อยหาจุดประนีประนอม ตอนนี้เพิ่งผ่านไปแค่ 3 วันนับจากที่ผู้ใช้เริ่มแสดงความกังวล จึงยากจะบอกว่ากระบวนการนี้ควรเสร็จสิ้นไปแล้ว
    คำตอบล่าสุดของ Eli ก็มีใจความว่า “สองคนแรกที่เข้าร่วมการถกเถียงมองว่าพฤติกรรมใหม่สมเหตุสมผลกว่าพฤติกรรมเดิมมาก แต่ตอนนี้มีความเห็นคัดค้านเข้ามาแล้ว จึงควรถกเรื่องพฤติกรรมนี้กันต่อ แล้วค่อยคุยเรื่องค่าเริ่มต้นภายหลัง”
    แม้จะมองว่าวิธีพัฒนาของ Emacs มีปัญหาร้ายแรง แต่การที่ผู้ใช้ปกติคอยตำหนิคนหัวแข็งใน emacs-devel แล้วพอมีการเปลี่ยนแปลงที่ตัวเองไม่ชอบกลับทำเหมือนโลกจะแตก ก็เป็นปัญหาเช่นกัน เพราะจะยิ่งทำให้ผู้ดูแลรักษาตั้งการ์ดป้องกันตัว

    • การใช้ branch พัฒนาแล้วโวยวายเมื่อเกิด การเปลี่ยนแปลงที่ทำลายความเข้ากันได้ นั้นไม่ถูกต้อง เพราะเรื่องแบบนี้เป็นสิ่งที่คาดหมายได้ใน branch พัฒนา
      ถ้าอ่าน mail thread จะดูเหมือนเป็นความเห็นต่างอย่างรุนแรงมากกว่าจะเป็น “ความหยิ่งยโส” และการหาฉันทามติก็ย่อมต้องใช้เวลา การที่ใครสักคนไม่ยอมถอยทันทีตามมุมมองของตน ไม่ควรถูกเรียกต่อหน้าสาธารณะว่า “หยิ่งยโส” และการพยายามปลุกคนหมู่มากที่ไม่ได้อ่าน thread ให้เข้ามารุมตำหนิก็ดูใกล้เคียงกับการคุกคาม
      อีกทั้งการบอกว่า patch ที่ทำให้การเปลี่ยนแปลงนี้เป็นทางเลือกถูกเพิกเฉยก็ไม่ซื่อตรงนัก เพราะ patch นั้นไม่ได้แค่เพิ่มตัวเลือก แต่ยังเอาการเปลี่ยนแปลงอื่นออกไปด้วย จึงถูกปฏิเสธ และการโยนความรับผิดไปที่คนคนเดียวแบบนั้นก็ยากจะยอมรับได้
    • การพูดว่า “เสียงตอบรับจากผู้ใช้คือข้อมูลสำคัญของการตัดสินใจขั้นสุดท้าย” แต่ในเวลาเดียวกันกลับวิจารณ์เสียงตอบรับเชิงลบของผู้ใช้ว่า “เกินจริง” ก็ดูเป็นเรื่องขัดแย้ง
      หากผู้ใช้ไม่ออกมาแสดงปฏิกิริยา ตามขั้นตอนที่อธิบายไว้ การเปลี่ยนแปลงเดิมที่พวกเขาคัดค้านก็น่าจะถูกนำเข้าไปตามเดิม ในกรณีของ clojure-mode ก็เคยมีตอนที่ rms พยายามนำชื่อของผู้เขียนจากชุมชน Clojure ที่ดูแลมานานมาใช้แล้วเขียนใหม่ คนจำนวนมากต้องออกมาประท้วงใน mailing list จึงหยุดไว้ได้ แต่สุดท้ายคนเหล่านั้นกลับถูกบอกว่าทำเกินจริง ดังนั้นคำวิจารณ์ว่า “เกินจริง” จึงดูไม่มีความหมายมากนัก
    • นี่คือ กระบวนการที่ไม่ดี การทบทวนฟีเจอร์ควรเริ่มก่อน merge เข้า main branch ไม่ใช่หลัง merge แล้ว
      ถ้านำฟีเจอร์ที่ทำให้ user flow พังเข้า main branch โดยไม่คุยกับชุมชนวงกว้างก่อน ก็เป็นเรื่องธรรมดาที่ผู้คนจะไม่พอใจ การ merge แบบนี้คือวิธีที่เครื่องมือเก่าแก่ค่อย ๆ สูญเสียแรงสนับสนุนจากชุมชน
    • อย่างน้อยในเชิงประวัติศาสตร์ ชุมชน Emacs ให้ความสำคัญกับ backward compatibility สูงมากมาโดยตลอด การทำให้ผู้ใช้เดิมใช้งานต่อไม่ได้ถือเป็นหนึ่งในสิ่งที่แย่ที่สุดสำหรับ Emacs
      หากไม่มีการพิจารณาอย่างจริงจังที่จะย้อนกลับการเปลี่ยนแปลงที่ทำลายความเข้ากันได้ในทันที นั่นก็เป็นสัญญาณว่านักพัฒนา Emacs ไม่ได้ให้ความสำคัญกับ backward compatibility เท่าเดิมอีกต่อไป และเท่ากับว่ากำลังทอดทิ้งผู้ใช้เดิมจำนวนมาก
      https://www.murilopereira.com/the-values-of-emacs-the-neovim...
      คุณค่าหลักเป็นสิ่งสำคัญ ผู้ดูแลรักษา Emacs ได้ละเมิดคุณค่าหลักนั้น และการที่ชุมชนรู้สึกไม่พอใจก็เป็นเรื่องสมเหตุสมผล
    • หากเป็นไปตามคำอธิบายในบทความนี้ ก็ชวนให้กังวลต่อสุขภาพของ Emacs เพราะมีข้อถกเถียงตั้งแต่ก่อน merge เข้า master แล้ว แต่ก็ยัง merge เข้าไปอยู่ดี
      การทำลาย workflow ของผู้ใช้โดยไม่ทำให้เป็นตัวเลือก ไม่ใช่แค่ไม่ opt-in เท่านั้น แต่ถึงขั้นปิดไม่ได้เลย ดูเหมือนเป็นการเพิกเฉยต่อ ประสบการณ์ผู้ใช้ อย่างไม่ใส่ใจ
  • ถ้าสรุปจากที่เข้าใจ ล่าสุดมีการรับคอมมิตใน Emacs ที่เปลี่ยนพฤติกรรมของ register ซึ่งเป็นกลไกทั่วไปกว่าการคัดลอก
    ตอนนี้ Emacs จะเปิด minibuffer เพื่อแสดงว่าเกิดอะไรขึ้น และต้องกด Enter หรืออินพุตที่เทียบเท่าเพื่อยืนยันการเปลี่ยนแปลง ผู้เขียนต้นฉบับมองว่านี่เป็นการทำลายความเข้ากันได้อย่างร้ายแรง เพราะเปลี่ยนพฤติกรรมพื้นฐาน อาจปิดด้วยการตั้งค่าได้ไม่ง่าย และยังไม่มีการถกเถียงกันมากพอ
    ถ้าเปรียบกับ Vim ก็เหมือนตอนพิมพ์ \"dyy เพื่อคัดลอกบรรทัดปัจจุบันไปยัง register d แล้วจู่ ๆ ก็เปิด scratch buffer ขึ้นมา แสดงข้อความกับบัฟเฟอร์ และบังคับให้กดปุ่มเพื่อปิด สำหรับผู้ใช้ Vim ทั่วไปที่เข้าใจ register อยู่แล้วคงรู้สึกแย่มาก แต่ก็อาจมีคนที่ชอบพฤติกรรมแบบ “แสดงให้ชัดว่ากำลังคัดลอกอะไร” เหมือนคนที่คัดลอกผ่าน visual mode
    ส่วนที่เหลือของบทความเป็นเรื่องที่ผู้เขียนต้นฉบับพยายามจุดประเด็นอภิปราย แต่ Thierry กันไว้ และโดยนัยก็โทษชุมชนนักพัฒนา Emacs ที่เหลือด้วย

    • register เป็นฟีเจอร์ค่อนข้างขั้นสูง และใช้หลัก ๆ กับการ แก้ไขอย่างรวดเร็ว เป็นฟีเจอร์สำหรับคนที่พิมพ์งานซับซ้อนได้เร็ว มากกว่าจะเป็นผู้ใช้ใหม่ที่ใช้เมาส์
      แม้จะใช้ Emacs มาหลายสิบปี แต่ก็ไม่เคยลงลึกกับ register มากนัก โดยส่วนตัวใช้ kill/yank สำหรับคัดลอก และใช้ multiple cursors หรือคีย์บอร์ดแมโครแบบครั้งเดียวสำหรับงานแก้ไขที่ซับซ้อนกว่า ถึงอย่างนั้น Emacs ก็มีฟีเจอร์แก้ไขขั้นสูงแบบเลือกใช้จำนวนมากสำหรับคนที่อยากพึ่งพา muscle memory
      การเพิ่มการกดยืนยันเข้ามาตรงนี้จึงดูแปลก คล้ายเอา “แป้นเหยียบยืนยันคอร์ดแปลก ๆ” ไปติดกับเปียโนไฟฟ้า เท่ากับเพิ่มอีกหนึ่งขั้นให้กับการป้อนข้อมูลที่ต้องเร็วและซับซ้อน
      Emacs มีระบบ undo ที่ยอดเยี่ยมอยู่แล้ว ดังนั้นแทนที่จะถามว่า “จะวางเนื้อหาจาก register d ไหม?” ก็น่าจะแค่วางไปเลย แล้วถ้าผู้ใช้เลือกผิดก็ค่อย undo
      เพราะอย่างนั้นการทำลายความเข้ากันได้ตรงนี้จึงดูประหลาด และถ้าไม่มีทางปิดได้ ผู้ใช้จำนวนมากก็คงไม่พอใจ Emacs เป็นเครื่องมือที่เก่ากว่าธรรมเนียม GUI สมัยใหม่ จึงไม่มีทางทำให้ผู้ใช้ใหม่คุ้นเคยได้เท่า vscodium ดังนั้นแนวคิดที่จะเน้นตอบโจทย์ power user ให้ดีที่สุดก็ฟังขึ้นเหมือนกัน
    • สำหรับคนที่ไม่ได้ใช้ Emacs ควรย้ำให้ชัดว่า standard copy อย่าง kill-ring-save หรือค่าเริ่มต้น M-w ไม่ได้รับผลกระทบ สิ่งที่เปลี่ยนมีแค่ การบันทึกลง register ซึ่งเป็นฟีเจอร์ที่ล้ำขึ้นไป
      register ไม่ใช่ซูเปอร์เซ็ตของ clipboard หรือ kill ring
      อีกอย่าง คนที่บอกว่าการเปลี่ยนนี้จะตั้งค่าไม่ได้ ดูเหมือนจะไม่ค่อยเข้าใจความปรับแต่งได้ของ Emacs นัก “การตั้งค่า” มีไว้เพื่อความสะดวกเท่านั้น ถ้าต้องการจริง ๆ ก็แก้โค้ดทั้งก้อนได้ นี่คือส่วน Elisp ของ Emacs และถึงจะถูกรวมเข้าไปตามเดิม ก็น่าจะมีแพ็กเกจออกมาเปลี่ยนพฤติกรรมได้ภายในไม่กี่นาที ไม่ถึงขั้นต้อง fork และการพูดถึงการ fork ในกรณีนี้ก็แทบเป็นแค่ท่าทีเชิงสัญลักษณ์มากกว่า
    • ถ้าการเปลี่ยนนี้เข้ามาใน v30 ก็น่าจะน่าหงุดหงิดพอสมควร ไม่รู้ Lisp เลย แต่เก็บรายการลง register ตลอด
      ถ้าไม่ย้อนกลับ ก็หวังว่าจะหา ชิ้นส่วนแมโคร ที่ช่วยจัดการการกดปุ่มเพิ่มให้อัตโนมัติได้ Emacs ทุกวันนี้ก็ต้องกดปุ่มเยอะอยู่แล้วแม้กับงานง่าย ๆ และก็ไม่ได้เชี่ยวชาญพอจะทำแมโครสำหรับการเปลี่ยนนี้เอง
    • ในฐานะสรุปบทความถือว่าใช้ได้ แต่ถ้าไปอ่านถึงระดับเมลลิงลิสต์แล้ว มันยังไม่พอจะสรุปปัญหา
      ดูเหมือนเรื่องนี้เริ่มจาก Thierry พบปัญหาบางอย่างในพฤติกรรมของ register แล้วพยายามแก้
      ข้อบกพร่องที่สำคัญที่สุดคือ เมื่อกด C-x r SPC เพื่อเรียก save-to-register หลังจากนั้นไม่ว่าจะกดปุ่มอะไรต่อ ข้อความก็จะถูกบันทึกลง register ที่ตรงกับปุ่มนั้น โดยเฉพาะ C-g ซึ่งปกติเป็นปุ่มยกเลิกสากลของ Emacs กลับใช้ไม่ได้ในที่นี้ และจะกลายเป็นการบันทึกข้อความหรือตำแหน่งลง register ^g แทน แม้เผลอกด jump-to-register หรือ insert-register ผิด ก็ยกเลิกด้วย C-g หรืออย่างอื่นไม่ได้ ต้องเลือก register ให้ได้ก่อนเสมอ
      ประการที่สอง register สามารถเก็บข้อความ ตำแหน่ง หรือค่าว่างได้อย่างใดอย่างหนึ่ง jump-to-register ใช้งานได้เฉพาะกับ register ที่เก็บตำแหน่ง ส่วน insert-register คาดหวังข้อความ Emacs มีพรีวิวของ register ที่ไม่ว่างตอนรันคำสั่งอยู่แล้ว แต่ไม่ได้แยกประเภทให้ชัด เช่น เอา register ที่มีสตริงไปแสดงเป็นตัวเลือกของ jump-to-register ด้วย
      Thierry พยายามแก้ปัญหาเหล่านี้พร้อมกับ feedback จาก code review และผู้รีวิวก็มองว่านี่เป็นการเปลี่ยนที่สำคัญ แม้จะเพิ่มการโต้ตอบขึ้นมาก็ตาม พวกเขาเห็นว่าการทำลายความเข้ากันได้ เช่น ต้องกด RET เพิ่มหลังเลือก register ปกติ หรือเมื่อต้องการบันทึกลง register แปลก ๆ อย่าง ^g ก็เป็นราคาที่ยอมรับได้เมื่อเทียบกับประโยชน์ที่ได้
      ผู้เขียนต้นฉบับขอให้มีสวิตช์สลับระหว่างพฤติกรรมใหม่กับเก่า และได้รับคำตอบให้ส่งแพตช์มา แต่แพตช์ที่ส่งกลับไปนั้นดันย้อนการปรับปรุงทั้งหมดที่กล่าวมา และไปทำฟีเจอร์คนละอย่างคือ “ยืนยันก่อนเขียนทับ register ที่ไม่ว่าง” แบบอิงแฟลก Thierry ลองนำไปใช้และให้ feedback สั้น ๆ แต่ผู้เขียนตอบกลับประมาณว่า “ของแบบนั้นไม่จำเป็น”
      ต่อมาพอมีคนใช้งานฟีเจอร์นี้มากขึ้น ก็เห็นชัดว่าความเชื่อของ Thierry และผู้รีวิวช่วงแรกที่ว่าผลกระทบของการเปลี่ยนแบบทำลายเดิมจะน้อยนั้นไม่ถูกต้อง Thierry จึงเริ่มทำแฟลกที่คงงานใหม่ไว้ แต่ก็ยอมให้ใช้โฟลว์แบบเดิมได้ด้วย โดยเฉพาะการตัด RET เพิ่มออกดูจะไม่ใช่แก่นหลัก แต่เป็นผลข้างเคียงมากกว่า
      โดยรวมแล้วกระบวนการดูเหมือนทำงานได้ค่อนข้างดี และคนที่พยายามผลักการถกเถียงไปในทางไม่สนบริบท พร้อมท่าทีต่อต้านแฮ็กเกอร์แบบ “ถ้ามันพอใช้งานได้แล้วก็ห้ามเปลี่ยนไม่ว่าทางไหน” ดูจะใกล้เคียงกับฝ่ายผู้เขียนต้นฉบับมากกว่า
    • ถ้ามองจากมุมผู้เริ่มต้นใช้ Vim ก็น่าจะเดาว่า dyy หมายถึงการลบบรรทัดปัจจุบัน
      แต่อีกมุมหนึ่ง นั่นอาจเป็นหลักฐานว่าเป็นมือใหม่ก็ได้
  • จากเมลลิงลิสต์เธรดนี้ ดูเหมือนว่าจะมี ตัวเลือก สำหรับย้อนพฤติกรรมดังกล่าว: https://yhetil.org/emacs/87h6kr9817.fsf@posteo.net/#t
    ดูเหมือนว่าตัวเลือกนี้ถูกพูดถึงแล้วตั้งแต่ก่อนโพสต์ต้นฉบับจะถูกเผยแพร่ แต่อาจเป็นไปได้ว่าผู้เขียนไม่เห็น เรื่องนี้น่าจะแก้ปัญหาได้ แต่อาจยังมีบางจุดที่พลาดไป
    แก้ไข: จากคำตอบของ ginko ด้านล่าง ดูเหมือนว่ายังต้องกดปุ่ม RETURN อยู่ดี

    • ถึงอย่างนั้นก็ดูเหมือนว่ายังต้องกด RET เพิ่ม หากต้องยืนยันการเขียนทับ register
      https://yhetil.org/emacs/87a5qi1vui.fsf@posteo.net/
    • จากเธรดนั้น register-use-previews ดูเหมือนจะเป็น ตัวสลับ ของพฤติกรรมนี้
      แต่ก็มีการพูดถึงบั๊กว่าต่อให้ตั้งเป็น never ในบาง workflow ก็ยังมีหน้าต่างยืนยันเด้งขึ้นมา ถ้ามันเป็นตัวเลือกจริง ความกังวลส่วนใหญ่ก็น่าจะคลี่คลายได้
  • สำหรับ Emacs ควรยกระดับ muscle memory ให้เป็นเรื่องสำคัญระดับต้น ๆ

    • เคยมี file manager ที่ชอบมากตัวหนึ่งออกรุ่นใหม่แล้วเปลี่ยน key binding จำชื่อไม่ได้แล้ว แต่ยังจำความโกรธตอนนั้นได้ติดใจ ถึงขั้นตอนนั้นยังรู้สึกเองเลยว่าโกรธเกินเหตุ
      เพราะ muscle memory ที่สั่งสมไว้พังหมด กว่าจะใจเย็นลงได้ก็มีความคิดร้าย ๆ แวบมาไม่น้อย เรื่องนี้อาจดูเล็กน้อย แต่ก็พอเข้าใจได้ว่าทำไมอาชญากรรมอย่าง “ทรยศต่อ muscle memory” ถึงทำให้ปฏิกิริยาบานปลายไปถึงระดับ “fork you”
    • ไม่ใช่เรื่องของ Emacs อย่างเดียว ถึงจะไม่ได้สนใจ Emacs เลย แต่เรื่องนี้สำคัญเพราะมันแสดงให้เห็นถึง ความหยิ่งผยอง ของนักพัฒนาที่พยายาม “ปรับปรุง” อะไรบางอย่างโดยไม่คำนึงถึงความคาดหวังที่มั่นคงของผู้ใช้
      ใช้ได้กับทั้ง Google Maps หรือ iOS ไม่ต่างจาก Emacs
    • ในภาพกว้างกว่านั้น ซอฟต์แวร์ที่ใช้บ่อยควรถูกออกแบบให้ สร้าง muscle memory ได้ และไม่ควรทำลายมันในเวอร์ชันถัดไปโดยไม่มีเหตุผลอันสมควร
      muscle memory ช่วยให้เราควบคุมซอฟต์แวร์แบบกึ่งอะซิงก์ได้โดย “ไม่ต้องมอง” และไม่ต้องคอยยืนยันด้วยสายตาทุกปฏิสัมพันธ์เล็ก ๆ น่าเสียดายที่ซอฟต์แวร์เดสก์ท็อปกลับมีแนวโน้มทำให้การใช้คีย์บอร์ดยุ่งยากขึ้นเรื่อย ๆ หรือถึงขั้นใช้ไม่ได้เลย
    • อย่างน้อยที่สุด การเปลี่ยนผ่านที่ทำลาย muscle memory ก็ควรเป็น toggle ที่ค่าเริ่มต้นคือ “คงการตั้งค่าของฉันไว้แบบเดิม”
  • เป็น rant ที่ดี แต่การไม่อธิบายเลยว่าจริง ๆ แล้วกำลังพูดถึงฟีเจอร์อะไร ไม่ได้ช่วยให้โน้มน้าวได้มากนัก
    Emacs register เป็น abstraction ที่เก่าแก่มาก register ทำงานเหมือนคลิปบอร์ดแยกต่างหากสำหรับเก็บและดึงค่าออกมาได้ และมี 62 ตัวที่ผูกกับสัญลักษณ์ ASCII หลัก [a-zA-Z0-9] จึงให้คีย์บอร์ดอินเทอร์เฟซที่ทั้งยืดหยุ่นและรวดเร็ว ยังมีเรื่องสนุกอย่างการรัน keyboard macro จาก register ได้ด้วย มีคนใช้เยอะเหมือนกัน แต่ส่วนตัวผมไม่ใช้
    เหตุผลที่ผู้เขียนโกรธคือ default binding ถูกเปลี่ยน ทำให้งานที่เดิมทำได้ด้วยคีย์บอร์ดล้วน ๆ และใช้แค่ home row ตอนนี้มี modal UI มาแทรกอยู่ข้างหน้า ฟังดูเป็นข้อบ่นที่สมเหตุสมผล และถ้าฟีเจอร์ที่ฝังอยู่ใน muscle memory ของผมถูกเปลี่ยนแบบนี้ ผมก็คงหงุดหงิดเหมือนกัน

    • เลิกใช้ Emacs มานานแล้ว แต่พึ่งพา X11 selection buffer มาก หรือก็คือการ paste ด้วยคลิกกลาง เลยอินกับเรื่องนี้
      ถ้ามี modal dialog ยืนยันโผล่มาคั่นทุกครั้งระหว่างการเลือกกับการวาง และไม่มี setting ให้ย้อนกลับไปใช้พฤติกรรมเดิม ก็คงน่าหงุดหงิดแน่ ๆ แค่ทำพฤติกรรมเดิมเป็นตัวเลือกก็พอแล้ว เอาจริง ๆ ใช้โค้ดไม่กี่บรรทัดก็ทำได้
    • register มีมากกว่า 62 ตัว หนึ่งในข้อบ่นคือ minibuffer ทำให้การเข้าถึง register อย่าง C-a ใช้ไม่ได้ตามเดิม
      ผมรู้จักคนที่ใช้ตัวอักษรธรรมดากับตำแหน่ง และใช้ C-ตัวอักษร กับข้อความ สำหรับบางคนอาจเป็นเคสประหลาดมาก แต่คนพวกนั้นน่าจะโกรธมากจริง ๆ
    • ดูเหมือน Eli ไม่ได้พยายามตรึงสิ่งนี้ให้เป็นพฤติกรรมปริยายถาวร ผมเองก็ไม่ใช่แฟนมันเหมือนกัน
      ใน https://yhetil.org/emacs/8334wawfvg.fsf@gnu.org/ Eli บอกว่า “มีเสียงคัดค้านเข้ามาแล้ว เลยยังคุยกันต่อว่าพฤติกรรมที่เหมาะสมควรเป็นแบบไหน และพอได้ข้อสรุปแล้วค่อยคุยเรื่องค่าเริ่มต้น”
    • พอพูดว่า “default binding” ก็ฟังเหมือนเปลี่ยนตั้งค่าได้ แต่จริง ๆ ทำได้หรือเปล่า?
    • มันแทบไม่ต่างจากการเปิด global uac-mode ที่ปิดแทบไม่ได้ในทุกบัฟเฟอร์ ถ้าไม่จริงก็ถือว่าอ่านขำ ๆ ไป
  • การตีความของผู้เขียนต้นฉบับไม่ค่อยดีนัก ถ้าผู้ใช้ต้องการความเสถียร ก็ควรอยู่บน release branch หรือ pin commit ของ master ไว้
    ควรคาดหวังว่า development branch มีไว้ใช้พัฒนาฟีเจอร์ที่กำลังทำอยู่ และฟีเจอร์แบบนี้อาจต้องใช้เวลาขัดเกลา ถ้าตาม master ก็ต้องเจอการเปลี่ยนแปลงที่ทำลายความเข้ากันได้บ่อย ๆ และถ้ามันทำให้ workflow พัง ก็ควรชินกับการย้อนกลับไป commit ก่อนหน้า ทางเลือกที่ดีกว่าคืออยู่กับ release

  • หัวใจของ Emacs คือมันเป็น แพลตฟอร์มที่ปรับแต่งได้อย่างสุดขีด ดังนั้นถ้าไม่ชอบพฤติกรรมของฟีเจอร์ใด ก็แก้เองได้ด้วย Lisp ไม่กี่บรรทัด
    การจะ fork ทั้งโปรเจกต์เพราะการเปลี่ยนฟีเจอร์ obscure อันเดียวมันไม่สมเหตุสมผลเลย ผมใช้ Emacs มาตั้งแต่ราวปี 1981 ตอนที่ยังทำด้วย TECO macro และก็ไม่เคยใช้ register

    • ถ้าจะเป็นแพลตฟอร์มที่ปรับแต่งได้อย่างสุดขีด ตัวแพลตฟอร์มเองก็ต้อง เสถียรมาก ด้วย
      ไม่อย่างนั้นทุกครั้งที่แพลตฟอร์มเปลี่ยน ทุกคนก็ต้องคอยเขียนหรือซ่อมการปรับแต่งของตัวเองใหม่ทุกครั้ง
    • ผมไม่ค่อยเข้าใจว่าความต่างระหว่าง “แก้เอง” กับ “fork” คืออะไร
      ถ้า patch นี้อยู่ต่อไปและมีใครอยากใช้แบบเดิมเป๊ะ ๆ ก็เท่ากับต้องเอา revert patch ไปใช้กับ Emacs local repository ของตัวเอง แล้วค่อยวางการเปลี่ยนแปลงของตัวเองทับลงไป ถ้าจะดึงการเปลี่ยนแปลงใหม่จาก upstream Emacs ทุกครั้งที่มันเปลี่ยน ก็ต้อง rebase
      นั่นแหละคือ private fork ต้อง fork ไปตลอดและ rebase ไปตลอดกาล
      จะใช้ monkey patch แบบหยาบ ๆ โดยโหลดไฟล์ของตัวเองแทนหรือหลังไฟล์ที่ shipped มาเพื่อ override function ก็ได้ แต่นั่นก็ยังเป็น fork แบบหนึ่งอยู่ดี ต้องเก็บสิ่งนี้ไว้เป็นโปรเจกต์ที่ไหนสักแห่ง และต้องพร้อมปรับเวลา monkey patch พังเพราะการเปลี่ยนแปลง
    • ดูเหมือนคุณจะพลาดประเด็นที่ว่าการเปลี่ยนแปลงนี้ไม่ได้มี ความสามารถในการย้อนกลับไปใช้พฤติกรรมเดิม ผ่าน setting ใด ๆ เลย
  • เลิกใช้ Emacs มา 20 ปีแล้ว แต่ก็เข้าใจได้ว่าการเปลี่ยนนี้ค่อนข้างทำลายล้าง
    สิ่งที่ไม่เข้าใจคือทำไม Emacs ที่ชอบอวดว่ามี “everything including the kitchen sink” ถึงไม่เพิ่มตัวเลือกให้ย้อนกลับไปใช้พฤติกรรมเดิม

    • มีโอกาสสูงว่าพวกเขาจะเพิ่มตัวเลือกนั้น ผู้เขียนต้นฉบับคงแค่โกรธที่ patch ของตัวเองไม่ถูกรับเข้าไป
      patch นั้นเพิ่ม flag เข้ามา แต่ก็ลบการปรับปรุงอื่น ๆ ออกไปด้วยทั้งหมด
  • น้ำเสียงของบทความค่อนข้างให้ความรู้สึกแบบ “neckbeard” มาก มันเป็นฟีเจอร์ obscure มาก ๆ ที่มี nerd ใช้กันอยู่แค่สามคน ไม่ใช่บันไดที่ขยับไม่ได้ของสุสานบรรพบุรุษ
    แค่ผู้ดูแลที่ไม่ได้รับค่าจ้างเปลี่ยนมันนิดหน่อยโดยไม่ได้มาถามคุณก่อน ก็ไม่ได้แปลว่า “ทำ master พัง” เสมอไป ที่พูดถึงอยู่นี่คือ master ไม่ใช่ stable หรือ tagged release

  • แน่นอนว่าทางแก้เดียวที่เป็นไปได้คือต้องลองทำ Emacs fork หรือ reimplementation ขึ้นมาอีกตัว
    รอบนี้ต้องสำเร็จแน่ ๆ และจะไม่กลายเป็นอะไรที่ไม่เกี่ยวข้องไปเลยเหมือนตัวอื่น ๆ แน่นอน

    • ผลกระทบของ fork แบบนี้คือมันค่อย ๆ กัดกร่อนชุมชนรอบโปรเจกต์หลัก
      แต่จะดึงโปรเจกต์หลักมานั่งโต๊ะเจรจาได้หรือไม่นั้นอาจไม่สำคัญนัก ผู้เขียนต้นฉบับมีทั้งความสามารถและความตั้งใจจะถือ patch นี้ไว้ใน local repository ของตัวเองไปจนสุดทาง สิ่งเดียวที่ยังขาดในการทำ fork ให้เสร็จคือการเผยแพร่ local repository นั้นออกสู่สาธารณะ
    • ดูจากแค่โพสต์บล็อก ยังบอกไม่ได้ชัดว่าผู้เขียนมีเจตนาระยะยาวกับ fork อย่างไร
      บางทีอาจมีไว้เพื่อพยายามโน้มน้าวผู้ดูแล mainline ก็ได้