ใน Emacs ทุกอย่างดูเหมือนบริการ
(yummymelon.com)- Emacs ไม่ได้เป็นตัวระบบปฏิบัติการเอง แต่ทำหน้าที่ ประสานแอปพลิเคชันและยูทิลิตีบนเคอร์เนล พร้อมใช้ระบบไฟล์ เครือข่าย และโปรแกรมภายนอกเพื่อเป็นไคลเอนต์ของบริการหลากหลายรูปแบบ
- สามารถประกอบ UI, ชั้นการสื่อสาร และที่เก็บข้อมูลภายในเครื่อง ที่ไคลเอนต์ต้องใช้ได้ด้วยไลบรารีที่มีมาในตัว เช่น minibuffer, buffer, URL, TCP/UDP, JSON และ SQLite
- Emacs Lisp (Elisp) ซึ่งเป็นภาษาที่มีความเป็นไดนามิก สามารถผสานฟังก์ชัน Elisp กับคำสั่งเชลล์ระหว่างรันไทม์ เพื่อประสานความสามารถต่าง ๆ ที่ Emacs เข้าถึงได้อย่างยืดหยุ่น
- ตัวอย่างคำสั่ง
wttrจะรับตำแหน่งที่ตั้ง ส่งคำขอ HTTP ไปยัง wttr.in ดึงข้อมูลภูมิภาค อุณหภูมิ และสภาพอากาศจาก JSON มาแสดงใน minibuffer และบันทึกลง kill ring ด้วย wttr.elทั้งไฟล์มีเพียง 67 บรรทัด ตามการวัดของclocและถ้ามอบหมายการเรียกเครือข่ายกับการจัดการ JSON ให้เครื่องมือบรรทัดคำสั่งอย่าง Python ก็ยังสร้างไคลเอนต์ Elisp ที่สั้นกว่านั้นได้ โดยถือให้คำสั่งเชลล์เป็นบริการตัวหนึ่ง
Emacs ที่ประสานบริการอยู่เหนือระบบปฏิบัติการ
- การเรียก Emacs ว่าเป็นระบบปฏิบัติการอาจไม่แม่นยำนัก แต่การเปรียบเทียบนี้เกิดขึ้นเพราะความสามารถในการ ประสานแอปพลิเคชันและยูทิลิตีบนเคอร์เนลของระบบปฏิบัติการ
- มันเข้าถึงบริการของระบบปฏิบัติการอย่างระบบไฟล์และเครือข่ายผ่านความสามารถที่มีมาในตัว และยังเรียกใช้โปรแกรมอื่นได้ จึงประกอบพฤติกรรมแบบไคลเอนต์ขึ้นมาใน Emacs ได้อย่างรวดเร็ว
- เพราะจัดการงานคอมพิวติ้งได้มากมายผ่านโหมดไคลเอนต์หลายแบบ แนวคิดที่ว่าผู้ใช้ “ใช้ชีวิตอยู่แค่ใน Emacs” จึงพอฟังขึ้น
โมเดลไคลเอนต์-เซิร์ฟเวอร์ในมุมของคำขอและคำตอบ
- โมเดลไคลเอนต์-เซิร์ฟเวอร์ คือรูปแบบปฏิสัมพันธ์ที่แบ่งงานระหว่าง บริการ ที่ให้ทรัพยากร กับ ไคลเอนต์ ที่ร้องขอทรัพยากรนั้น
- ไคลเอนต์ส่งคำขอ
- เซิร์ฟเวอร์ประมวลผลคำขอแล้วส่งคำตอบกลับ
- ธุรกรรมที่ประกอบด้วยคำขอและคำตอบนี้อาจเกิดผ่านเครือข่ายหรือทำแบบภายในเครื่องเดียวกันก็ได้
- โมเดลแบบเครือข่ายถูกพัฒนาต่ออย่างกว้างขวางใน สถาปัตยกรรมซอฟต์แวร์สไตล์ REST
สามส่วนที่ประกอบเป็นไคลเอนต์ใน Emacs
- โดยทั่วไปไคลเอนต์จะรับผิดชอบสามส่วนต่อไปนี้
- UI: จัดการอินพุตและเอาต์พุตของผู้ใช้ตามความจำเป็น
- ขอบเขตไคลเอนต์ (Client Edge): สื่อสารกับบริการ โดยในไคลเอนต์เครือข่าย ระบบย่อยด้านเครือข่ายจะทำหน้าที่นี้
- ฐานข้อมูลภายในเครื่อง: ใช้แทนข้อมูลที่จะแลกเปลี่ยนหรือซิงก์กับเซิร์ฟเวอร์ ซึ่งวิธีจัดการขึ้นอยู่กับความต้องการของการใช้งาน
-
การประกอบส่วนติดต่อผู้ใช้
- Emacs มีความสามารถในตัวหลายอย่างสำหรับสร้าง UI ของไคลเอนต์
- Minibuffers
- Buffers
- Completion
- Tabulated List Mode
- Variable Pitch Table(vtable)
- Transient
-
การสื่อสารกับบริการและการแปลงข้อมูล
- สำหรับ ขอบเขตไคลเอนต์ ที่เชื่อมต่อกับบริการ สามารถใช้ความสามารถต่อไปนี้ได้
- การ serialize และ deserialize ข้อมูล ใช้ parser ที่มีมาในตัว
-
การจัดการข้อมูลภายในเครื่อง
- สำหรับตัวแทนข้อมูลของเซิร์ฟเวอร์ในเครื่อง สามารถใช้ collection ของ Elisp ได้
- หากต้องการที่เก็บข้อมูลถาวรในเครื่อง สามารถใช้ SQLite
- ความซับซ้อนของไคลเอนต์จริงขึ้นอยู่กับความต้องการ และถ้ามียูทิลิตีบรรทัดคำสั่งเดิมที่จัดการงานหนักได้อยู่แล้ว ก็สามารถจัดวางใหม่ให้เป็น บริการที่เข้าถึงผ่านการเรียกเชลล์ ได้
วิธีผสานความสามารถด้วย Elisp
- ไลบรารีทั้งหมดข้างต้นเข้าถึงได้จาก Emacs Lisp (Elisp)
- Elisp เป็น ภาษาโปรแกรมแบบไดนามิก ที่เปิดให้ประกอบสิ่งต่าง ๆ ระดับสูงได้อย่างยืดหยุ่นระหว่างการทำงาน
- สามารถผสานพฤติกรรมที่ Emacs ใช้งานได้ ตั้งแต่ฟังก์ชัน Elisp ไปจนถึงคำสั่งเชลล์ เพื่อประสานลำดับการทำงานที่ซับซ้อน
การสร้างไคลเอนต์สภาพอากาศ wttr.in
- wttr.in คือเว็บบริการพยากรณ์อากาศที่เน้นคอนโซล และรองรับ เอาต์พุตแบบ JSON
- คำสั่ง
wttrสำหรับ Emacs ทำงานตามลำดับดังนี้- รับตำแหน่งที่ตั้งจากผู้ใช้
- สร้าง URL สำหรับร้องขอไปยัง wttr.in
- ส่งคำขอ HTTP
- ประมวลผลคำตอบแบบ JSON
- แสดงผลใน minibuffer และบันทึกลง kill ring
- หากเกิดข้อผิดพลาดระหว่างประมวลผล จะแสดงข้อความผิดพลาดใน minibuffer
-
การสร้าง URL สำหรับคำขอ
wttr--request-urlใช้https://wttr.inเป็น URL พื้นฐาน- จะแทนช่องว่างในตำแหน่งที่ตั้งด้วย
+และสร้าง query ในรูป/<location>?0&format=j1 - URL ที่ได้จะถูกส่งต่อไปยัง ฟังก์ชันดึง JSON
-
คำขอ HTTP และการ parse JSON
fetch-json-as-hash-tableดึง URL แบบ synchronous ด้วยurl-retrieve-synchronously- หากไม่ได้รับข้อมูล จะโยนข้อผิดพลาด
Failed to fetch data from <URL> - จากนั้นจะเลื่อนไปหลัง HTTP metadata header ใน response buffer แล้วใช้
json-parse-bufferแปลงเนื้อหาที่เหลือเป็นhash-tableของ Elisp - เมื่อประมวลผลเสร็จ จะลบ network buffer ที่ดาวน์โหลดมาออกเสมอเพื่อป้องกัน memory leak
-
การประกอบข้อความรายงานสภาพอากาศ
wttr--report-messageดึงค่าต่อไปนี้ออกมาจากข้อมูล JSON- ชื่อพื้นที่ที่ใกล้ที่สุด
- ภูมิภาค
- ประเทศ
- อุณหภูมิเซลเซียสปัจจุบัน
temp_C - อุณหภูมิฟาเรนไฮต์ปัจจุบัน
temp_F - คำอธิบายสภาพอากาศ
weatherDesc
- จากนั้นจะนำองค์ประกอบตำแหน่งที่ไม่ว่างมาเชื่อมด้วยจุลภาค และสร้างผลลัพธ์ในรูป
ตำแหน่ง: เซลเซียส, ฟาเรนไฮต์ คำอธิบายสภาพอากาศ - ดูการติดตั้งใช้งานทั้งหมดได้ใน ซอร์ส
wttr.el
ใช้เครื่องมือบรรทัดคำสั่งเป็นบริการได้เช่นกัน
- API ของ Emacs ให้ abstraction ในระดับสูง และ
wttr.elที่เขียนคำขอ HTTP กับการจัดการ JSON เองก็มีเพียง 67 บรรทัด ตามการวัดของcloc - ทางเลือกที่ง่ายกว่าคือย้ายงานร้องขอเครือข่ายและจัดการ JSON จริงไปให้สคริปต์ Python ชื่อ
weather- คำสั่ง
weatherฝั่ง Elisp รับตำแหน่งที่ตั้งจากผู้ใช้ - ประกอบคำสั่งเชลล์
weatherโดยใส่ตำแหน่งที่ตั้งเป็นอาร์กิวเมนต์ - รันคำสั่งด้วย
shell-command-to-string - บันทึกผลลัพธ์ที่ได้ลง kill ring และแสดงใน minibuffer
- คำสั่ง
- ในโครงสร้างนี้ คำสั่งเชลล์คือบริการที่รับคำขอ และฟังก์ชัน Elisp ทำหน้าที่เป็นไคลเอนต์
- ด้วยธรรมชาติแบบไดนามิกของ Elisp จึงสามารถผสานไลบรารี Elisp และยูทิลิตีบรรทัดคำสั่งเข้าด้วยกันได้ตามต้องการ และความสามารถในการบูรณาการแบบนี้เองที่ทำให้ทุกอย่างใน Emacs ถูกมองเหมือนเป็นบริการได้
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
ที่ Emacs ดูเหมือนระบบปฏิบัติการก็เพราะตระกูล Lisp Machine ไม่ได้กลายเป็นกระแสหลัก
“Symbolics Lisp Machine demo”
https://www.youtube.com/watch?v=o4-YnLpLgtk
“Emacs and Lisp”
https://funcall.blogspot.com/2025/04/emacs-and-lisp.html
Lucid เคยฟอร์ก Emacs เป็น XEmacs เพื่อพยายามทำให้แนวคิด LSP ยุคแรก ๆ เป็นจริง และความสามารถส่วนใหญ่ในตอนนั้นก็ถูกรวมกลับเข้า Emacs แล้วในปัจจุบัน
https://dreamsongs.com/Cadillac.html
“Lucid Energize Demo”
https://www.youtube.com/watch?v=pQQTScuApWk
ถ้านิยาม
client,server,requestให้กว้างพอ ก็จับอะไรก็ได้มายัดเป็น สถาปัตยกรรมไคลเอนต์/เซิร์ฟเวอร์ คล้ายกับที่เคยมีคนพยายามอธิบายว่า Emacs ทำตามปรัชญา Unix เพียงเพราะฟังก์ชัน LISP ทำงานอย่างหนึ่งได้ดีคนส่วนใหญ่น่าจะพอเห็นด้วยว่า Emacs รับแนวคิดมาจาก Lisp machine และบนมันแทบจะสร้างอะไรก็ได้ตามต้องการ มันเชื่อมกับเครื่องมือ CLI ได้ดีมาก แต่ก็ยังไม่ชัดว่าการนิยามสิ่งนี้ว่าเป็นไคลเอนต์/เซิร์ฟเวอร์ช่วยอะไร
มันดูดซับฟีเจอร์ตามกระแสนิยมมาหลายสิบปี และข้างในยังมี CEDET semantic analysis engine ที่ตอนนี้แทบไม่มีใครใช้แล้ว ต่อมาก็มี LSP โผล่มา และตอนนี้เข้าสู่ยุคเอเจนต์ ซึ่ง Emacs ก็เป็นฟรอนต์เอนด์สำหรับเอเจนต์ได้ดีพอสมควร
ใช้ Emacs มานานกว่า 25 ปี แต่บริษัทที่ย้ายไปเมื่อปีที่แล้วไม่ยอมให้ใช้ แม้แต่งานที่ Emacs เหมาะมาก โดยให้เหตุผลว่าทุกคนในทีมต้องใช้เครื่องมือเดียวกัน และก็ไม่สามารถเปลี่ยนคนอื่นให้มาใช้ Emacs ได้
ตอนนี้เลยต้องใช้ เครื่องมือเฉพาะทางแบบงานเดียวจบ แยกกันไปในแต่ละงานอย่างไม่มีประสิทธิภาพ แถมยังต้องเรียนรู้ UI และการแมปปุ่มใหม่ ๆ อยู่เรื่อย ๆ
ผู้จัดการคงจะบอกว่าโปรเจ็กต์ใหม่ต้องใช้ Visual Studio Code ทั้งหมด แต่โมเดลการใช้งานที่เราใช้กันอยู่ VSCode ก็ยังไม่รองรับ จริง ๆ แล้วถ้าขั้นตอน Git กับการ deploy ตรงกัน แต่ละคนก็ควรเลือก editor ที่ตัวเองถนัดได้ ทว่าคำตอบที่น่าจะได้กลับมาคือ Microsoft ไม่รองรับ มันเป็นโอเพนซอร์สที่เสี่ยง และเป็นซอฟต์แวร์ที่บริษัทยังไม่ได้ตรวจสอบ
Emacs เป็นเครื่องมือหลักที่ใช้ทุกวัน ถ้าถูกห้ามใช้ก็คงลาออก ผู้จัดการไม่ได้พยายามจะเข้าใจหรือใช้เหตุผล แค่ทำตามคำสั่งจากแผนก IT อื่นเท่านั้น
ถ้าบริษัทระบุเพียง text editor ทั่วไป การเปิด Notepad จะมีปัญหาด้วยหรือไม่ หรือบริษัทกำหนดแม้แต่เครื่องมือจัดการงานส่วนตัวหรือเปล่า ลองหาหมวดงานที่ Emacs ทำได้แต่บริษัทยังไม่ได้กำหนดเครื่องมือ แล้วติดตั้งเพื่อใช้ในจุดนั้น
Emacs คือ แพลตฟอร์ม และระบบปฏิบัติการเองก็เป็นเพียงหนึ่งในหลายแพลตฟอร์ม แพลตฟอร์มคือชั้นซอฟต์แวร์ที่ถูกออกแบบมาเพื่อให้สร้างสิ่งใหม่บนมันได้ ดังนั้นคำถามคือ แพลตฟอร์ม X เหมาะกับการสร้าง Y ที่ต้องการหรือไม่
สำหรับผม X มักเป็น Emacs แต่บางครั้งก็อาจเป็น Racket หรือ Rust ถ้าเป็นเครื่องมือที่ทั้งเป็นแอปพลิเคชันและเป็นแพลตฟอร์มที่ดีด้วย ก็คุ้มค่าที่จะลงทุนเรียนรู้มากกว่าแอปธรรมดา
การใช้ Emacs มากพอจนเข้าใจคำว่า “Emacs คือระบบปฏิบัติการ” แบบไม่ใช่มุก แต่เป็นแนวคิดที่เชื่อได้จริง กลายเป็นจุดเปลี่ยนสำคัญในอาชีพ
เริ่มใช้ Emacs เมื่อหลายปีก่อนเพราะอยากลอง org mode และก็ใช้ต่อมาเรื่อย ๆ เพราะมันยืดหยุ่นสูงแบบสุดโต่ง
init.elของตัวเองอย่างจริงจังEmacs ใกล้เคียงกับ สภาพแวดล้อมการเขียนโปรแกรม ที่มี text editor ฝังมาด้วยมากกว่า ถ้ามองว่าคล้าย Smalltalk image บางแบบก็จะเป็นเครื่องมือที่น่าสนใจมาก
Emacs ไม่ใช่ระบบปฏิบัติการ แต่ใกล้กับ เชลล์ มากกว่า เพียงแต่แนวคิดเรื่องเชลล์เองก็ไม่ได้เป็นที่เข้าใจกันอย่างแพร่หลาย
viอาจใกล้กับเชลล์มากกว่า เพราะต้องพึ่ง:.!เพื่อโยนงานจำนวนมากให้โปรแกรม Unix มาตรฐานตัวอื่นทำในทางกลับกัน Emacs กลับรวมความสามารถสารพัดไว้เหมือนระบบปฏิบัติการในดิสทริบิวชันขนาดใหญ่เพียงชุดเดียว
เพิ่งเจอ วิดีโอแนะนำสั้น ๆ ที่เหมาะจะเอาไปให้คนที่ไม่ใช้ Emacs ดู
https://www.youtube.com/watch?v=mJZDmO5yOxE
init.elของ Anon Emoose จริง ๆตัว Emacs เองก็รันแบบ ไคลเอนต์และเซิร์ฟเวอร์ ได้ โดยเริ่มเซิร์ฟเวอร์ด้วย
emacs --daemonแล้วเชื่อมผ่านemacsclientจากนั้นทุกอินสแตนซ์ทั้งแบบเทอร์มินัลและ GUI จะใช้เซิร์ฟเวอร์เดียวกันและแชร์ไฟล์กับบัฟเฟอร์ที่เปิดอยู่น่าเสียดายที่มันทำงานได้แค่ในเครื่องโลคัล และแม้จะพยายามส่งต่อ Emacs server socket ผ่าน ssh เพื่อให้ไคลเอนต์ระยะไกลมาเชื่อมต่อ ก็ไม่สำเร็จ
emacsclientก็ไม่ค่อยดีนัก คนที่เพิ่งมาเจอ Emacs ครั้งแรกในปี 2026 อาจคาดหวังว่ามันจะซิงก์สถานะการทำงานของไคลเอนต์กับเซิร์ฟเวอร์ผ่านเครือข่ายเหมือน REST clientแต่ในที่นี้ไคลเอนต์กับเซิร์ฟเวอร์หมายถึงโครงสร้างบน Unix local domain หรือก็คือ file system socket ที่ไคลเอนต์ส่งคำสั่งควบคุมง่าย ๆ ไปให้ หลังจากนั้นแม้จะรองรับ network socket เพิ่มแล้ว สิ่งที่ไคลเอนต์ส่งก็ยังเป็นเพียงคำสั่งควบคุมพื้นฐานเท่านั้น
ssh -Xเพื่อเปิดเฟรมของ Emacs ระยะไกลบน X server ในเครื่องโลคัลได้ แต่อย่าลืมว่าใน บิลด์ GTK ที่ไม่ใช่ PGTK การปิดเฟรมใหม่อาจทำให้ Emacs ฝั่งรีโมตล่มได้