USENET เป็นระบบส่งข้อความแบบกระจายศูนย์ (decentralized) ระดับโลก ถือเป็นเครือข่ายสังคมโลกแรกที่มีเกิน 100,000 กรุ๊ปที่พูดคุยเกี่ยวกับหัวข้อและสาขาต่างๆ ทำให้ USENET เป็นที่เก็บความรู้และการอภิปรายที่ดีสำหรับผู้สนใจ
Gnus คืออะไร?
แม้ USENET จะลดน้ำเสียงลงในช่วงไม่กี่ปีที่ผ่านมา แต่ยังมีผู้ใช้งานเพื่อการอภิปรายและแชร์ข่าว ส่วนใหญ่เข้า USENET ผ่านเว็บไซต์ Google Groups แต่หากคุณใช้ Emacs สามารถดูกรุ๊ปข่าว USENET ผ่าน Emacs ได้
Gnus เป็นแพ็กเกจ Emacs ที่ออกแบบมาเพื่ออ่านนิวส์กรุ๊ป (newsgroups) เป็นโปรแกรมที่มีคุณสมบัติมากมาย ทำให้การอ่านข่าวสะดวกและมีประสิทธิภาพ เพราะอยู่ภายใน Emacs ผู้ใช้จึงสามารถจัดการข้อความในโพสต์และนำไปใช้กับส่วนอื่นๆ ของระบบ Emacs ได้
ทำไมต้องใช้นิวส์รีเดอร์ใน Emacs?
Emacs โดนขานว่าเป็น "ครัวอินทอร์นิท" (kitchen sink) ของความสามารถในการขยาย ไม่เพราะมีแพ็กเกจและฟีเจอร์เยอะอย่างเดียว แต่ยังง่ายต่อการขยายฟังก์ชันพื้นฐานนอกเหนือจากการแก้ไขข้อความ
Emacs ทำงานบนแนวคิดของการทำงานร่วมกัน (interoperability) ทำให้แพ็กเกจต่างๆ สามารถสร้างสภาพแวดล้อมที่สมบูรณ์ขึ้นได้ ซึ่งคุณสามารถสร้างข้อความและเปลี่ยนแปลงได้หลายวิธี
ตัวอย่างเช่น Emacs มาพร้อมตัวจัดการไฟล์ชื่อ dired ซึ่งแสดงผลเป็นข้อความ ถ้าคุณใช้ Org Mode สำหรับบันทึกประจำวัน สามารถคัดลอกข้อความจาก dired ไปสร้างลิงก์ใน Org Files ได้
ด้วยความสามารถของ Emacs ที่นำเอาต์พุตข้อความของแพ็กเกจหนึ่งไปเป็นอินพุตของอีกแพ็กเกจหนึ่ง ทำให้โปรแกรมอ่านข่าวอย่าง Gnus มีคุณค่ามากต่อระบบนิเวศ Emacs
เช่น คุณสามารถคัดลอกข้อความจากโพสต์ข่าว แล้วนำไปใส่ใน Org Mode เป็นบันทึก จดหมายเตือน หรือบันทึกไอเดีย
การติดตั้ง Gnus
Gnus มาพร้อมกับการติดตั้ง Emacs เริ่มต้นตั้งแต่เวอร์ชัน 19.32 หากคุณใช้ Emacs เวอร์ชันใหม่ โอกาสสูงที่จะมี Gnus อยู่แล้ว
ตรวจสอบว่าติดตั้ง Gnus แล้วหรือไม่ โดยกด Alt + X แล้วพิมพ์ gnus จะโหลด Gnus เวอร์ชันดิบที่ยังไม่ได้ตั้งค่า
ตั้งค่า Gnus เพื่ออ่าน USENET Groups
การตั้งค่าเริ่มต้นของ Gnus ค่อนข้างตรงไปตรงมา ต้องตั้งค่าบางอย่างในไฟล์ init.el เพื่อสร้างไฟล์ .newsrc
ไฟล์ .newsrc เป็นไฟล์มาตรฐานสำหรับโปรแกรมอ่านนิวส์กรุ๊ป ตั้งอยู่ในไดเรกทอรีบ้าน (home directory) บทบาทหลักคือบันทึกกรุ๊ปที่มีอยู่และที่สมัครสมาชิกในเซิร์ฟเวอร์ USENET รวมถึงทำหน้าที่เป็นไฟล์สถานะ (state file) ติดตามโพสต์ที่อ่านแล้ว
สร้างไฟล์ .newsrc ด้วยคำสั่ง:
touch /home/$USER/.newsrc
การตั้งค่าเริ่มต้น
เมื่อสร้างไฟล์เสร็จ ให้เริ่มตั้งค่าไฟล์ init.el (ไฟล์การตั้งค่า Emacs) ซึ่งโดยปกติอยู่ที่ "/home/$USER/.emacs.d/" หรือ "/home/$USER/.config/emacs"
เพื่อเริ่มต้น Gnus ให้เพิ่มบรรทัดต่อไปนี้ใน init.el:
(setq user-full-name "yourusername") (setq user-mail-address "yourname@email.invalid") (setq gnus-select-method '(nntp "news.eternal-september.org"))
- user-full-name: ตั้งชื่อผู้ใช้ใน Emacs จะแสดงในหัวข้อ "From" เมื่อส่งโพสต์ข่าว
- user-mail-address: ตั้งอีเมลในหัวข้อ "From" (ตัวอย่างใช้อีเมลไม่ถูกต้อง)
- gnus-select-method: ตั้งค่าเฉพาะ Gnus บอกว่าจะเชื่อมต่อบริการและเซิร์ฟเวอร์ไหน (ตัวอย่างใช้ nntp กับ news.eternal-september.org)
การยืนยันตัวตน USENET แบบระยะไกล
หากใช้ผู้ให้บริการ USENET ที่ต้องการการยืนยันตัวตน ต้องใส่รายละเอียดบัญชีในไฟล์ authinfo ซึ่ง Gnus จะอ่านรายละเอียดเซิร์ฟเวอร์ ชื่อผู้ใช้ และรหัสผ่านจากที่นี่
สร้างไฟล์ .authinfo ใน Emacs โดยกด Ctrl + X, Ctrl + F แล้วพิมพ์ /home/$USER/.authinfo จะสร้างไฟล์และเปิดในบัฟเฟอร์
รูปแบบไฟล์ .authinfo:
machine news.domain.name login yourusername force yes password yourpasswordgoeshere
- machine: ระบุว่าเชื่อมต่อกับเครื่อง/เซิร์ฟเวอร์อื่น
- domain name: ที่อยู่ของเครื่องที่ต้องการเชื่อมต่อ
- login: ชื่อผู้ใช้บัญชี USENET
- "force yes": บังคับให้ยืนยันตัวตนแม้เซิร์ฟเวอร์ไม่ต้องการ
- password: รหัสผ่านบัญชี USENET
การใช้เซิร์ฟเวอร์ USENET ท้องถิ่น
Gnus ยังสามารถใช้แหล่งที่มาจากไฟล์ spool ท้องถิ่นได้ เหมาะหากมีบริการดาวน์โหลดนิวส์กรุ๊ปมาที่เครื่องโดยอัตโนมัติ
เปลี่ยนการตั้งค่า nntp ใน "gnus-select-method":
(setq gnus-select-method '(nnspool ""))
หากใช้ Leafnode เป็นเซิร์ฟเวอร์ USENET ท้องถิ่น ต้องตั้งค่าเป็น NNTP server เพราะ Leafnode ทำงานคล้ายเซิร์ฟเวอร์ USENET มากกว่าไดเรกทอรีทั่วไป
ใช้ Leafnode บนเครื่องเดียวกัน:
(setq gnus-select-method '(nntp "localhost"))
เมื่อเสร็จแล้ว รัน Gnus โดยกด Alt + x พิมพ์ gnus จะโหลด Gnus และดึงกรุ๊ปทั้งหมดจากเซิร์ฟเวอร์ USENET ระยะไกล
การใช้งานพื้นฐาน
เมื่อ Gnus โหลดเสร็จ จะเห็นหน้าจอว่าง เพราะค่าเริ่มต้นซ่อนนิวส์กรุ๊ปที่ยังไม่สมัครและอ่านแล้ว
ดูรายการนิวส์กรุ๊ปทั้งหมดโดยกด Shift + 6 จะแสดงหน้าจอ Server ของ Gnus (ตัวอย่างแสดงกรุ๊ปจาก Eternal September)
การสมัครสมาชิกนิวส์กรุ๊ป USENET
กด U เพื่อสมัครหรือยกเลิกการสมัครนิวส์กรุ๊ปใดๆ จะทำให้กรุ๊ปนั้นปรากฎในหน้าจอหลักเมื่อเริ่ม Gnus
ตัวอย่าง สมัคร "alt.religion.emacs" และ "alt.folklore.computers" ในหน้าจอ Server เมื่อโหลด Gnus ใหม่ กรุ๊ปทั้งสองจะอยู่ในหน้าจอหลัก
การเคลื่อนที่ในบัฟเฟอร์
กด Enter เพื่อเข้าไปในนิวส์กรุ๊ป ใช้ปุ่มเคลื่อนที่มาตรฐาน Emacs เช่น Ctrl + N และ Ctrl + P เพื่อเลื่อนโพสต์ต่างๆ
กด Enter หรือ Tab เพื่อเปิดโพสต์ และ Backspace และ Space เพื่อเลื่อนขึ้น-ลงในโพสต์
ใช้ค้นหาของ Emacs (Ctrl + S และ Ctrl + R) เพื่อหาโพสต์ที่ต้องการเร็วขึ้น
การโพสต์และตอบกลับโพสต์ USENET
สร้างโพสต์ใหม่ในนิวส์กรุ๊ป กด A จะเปิดตัวแก้ไขข้อความ ใส่รายละเอียด แล้วกด Ctrl + C สองครั้ง เพื่อส่งข้อความ
ตอบกลับโพสต์ในกรุ๊ป กด Shift + S, Shift + F จะเปิดบัฟเฟอร์ "Followup" พร้อมโพสต์ต้นฉบับถูกอ้างอิงไว้แล้ว กด Ctrl + C สองครั้งเพื่อส่ง
การกรองด้วย Scorefiles
Gnus มีระบบกรองที่ทรงพลังแต่ใช้ง่ายด้วย Scorefiles แตกต่างจาก killfile ทั่วไปที่ "ฆ่า" โพสต์ทันทีเมื่อเจอรูปแบบที่กำหนด
Scorefiles ให้ผู้ใช้เพิ่มหรือลดคะแนนภายในของโพสต์ทีละนิด บอก Gnus ว่าโพสต์ไหนควรให้ความสำคัญ โพสต์ไหนควรซ่อนหรือไม่ดึงจากเซิร์ฟเวอร์
ประเภทการกรอง
Gnus มีระบบกรองที่ละเอียด ให้ควบคุมและปรับแต่งส่วนต่างๆ ของตัวกรองได้
ตัวอย่าง: ต้องการลดคะแนนโพสต์ใดโพสต์หนึ่ง ไฮไลท์โพสต์นั้น แล้วกด L จะแสดงเมนูเล็กในคอมมานด์บัฟเฟอร์ ถามว่าจะกำหนดคะแนนจากคุณสมบัติไหนของโพสต์ คุณสมบัติสำคัญมี:
- A: กรองจากชื่อผู้เขียน
- S: กรองจากข้อความหัวข้อ (Subject)
- L: กรองจากจำนวนบรรทัด
- B: กรองจากเนื้อหาข้อความ (Body)
ตัวอย่าง กรองจากผู้เขียน กด A
วิธีการจับคู่ตัวกรอง
Gnus จะถามว่าต้องการการจับคู่สตริงแบบไหน: exact, substring, fuzzy, regexp
- Exact: ใช้สตริงทั้งหมดจับคู่
- Substring: ใช้ส่วนของสตริงจับคู่ (ไม่ต้องจับคู่ทั้งหมด)
- Fuzzy: ใช้โมเดลทำนายจากโพสต์ก่อนหน้า เหมาะกับผู้โพสต์ที่พยายามหลีกเลี่ยง substring
- Regexp: ใช้ regular expressions แบบดั้งเดิม
ตัวอย่าง เลือก substring กด S
ระยะเวลาของตัวกรอง
Gnus ถามว่าต้องการให้คะแนนนี้เป็น temporary, permanent, หรือ immediate
- Temporary: คะแนนหมดอายุในวันที่กำหนด เหมาะสำหรับกรองชั่วคราว
- Permanent: คะแนนไม่หมดอายุ เหมาะกรองสแปมเมอร์ถาวร
- Immediate: ใช้คะแนนกับบัฟเฟอร์ปัจจุบันโดยไม่บันทึกลง scorefile เหมาะกรองตอนนี้อย่างเดียว
ตัวอย่าง ต้องการถาวร กด P
ยินดีด้วย! ตอนนี้คุณเข้าใจพื้นฐานการใช้ Gnus เป็นนิวส์รีเดอร์ใน Emacs รวมถึงการเชื่อมต่อเซิร์ฟเวอร์ USENET ที่ต้องยืนยันตัวตน และการใช้ scorefiles กรองข่าว
หากสนใจเรียนรู้ Emacs เพิ่มเติม ควรศึกษาการติดตั้ง Doom Emacs
คำถามที่พบบ่อย
1. เขียนข้อความเสร็จแต่ไม่ muốnส่งแล้ว ยกเลิกโพสต์หรือ followup ยังไง?
ไม่แน่ใจแน่ชัด แต่อาจเป็นไปได้ กด Ctrl + C, Ctrl + D เพื่อยกเลิก
2. เพิ่มเซิร์ฟเวอร์ USENET หลายตัวใน Gnus ได้ไหม?
ได้! เพิ่มตัวแปร "gnus-select-method" อีกตัวใน init.el
ตัวอย่าง init.el:
(setq user-full-name "ramcesred") (setq user-mail-address "ramcesred@email.invalid") (setq gnus-select-method '(nntp "news.eternal-september.org")) (setq gnus-select-method '(nntp "nntp.aioe.org")) (setq gnus-select-method '(nntp "localhost"))
เสร็จแล้ว รีโหลด Emacs เพื่อโหลดการตั้งค่า Gnus ใหม่
3. อ่านบทความเสร็จ แล้วหายจากรายการหน้าจอหลัก ピン留め (pin) โพสต์เฉพาะได้ไหม?
ได้! ใช้ฟังก์ชัน gnus-summary-tick-article-forward โดยกด U ขณะเลือกโพสต์นั้น
โปรดทราบ: จะ "pin" แค่บทความนั้นอย่างเดียว ตอบกลับในเธรดเดียวกันจะไม่แสดงโดยค่าเริ่มต้น หากต้องการแสดงเธรดทั้งหมด กด Shift + A, Shift + T เพื่อสร้างเธรดใหม่สำหรับหัวข้อนั้น