Emacs là phần mềm mở rộng cực kỳ linh hoạt. Nó có thể là trình soạn thảo văn bản, trình khách email, thậm chí trình đọc USENET. Với Elfeed, bạn cũng có thể dùng Emacs làm trình đọc nguồn cấp RSS.
Elfeed là gì?
Elfeed là trình đọc RSS nhẹ nhưng mạnh mẽ viết cho Emacs. Nó dùng hệ thống dựa trên thẻ (tag) đơn giản để sắp xếp nguồn RSS. Không chỉ vậy, nó còn có hệ thống gắn thẻ dựa trên "hook" mạnh mẽ, cho phép tự động gắn thẻ nguồn dựa trên nội dung.
Điều này làm Elfeed hữu ích cho người theo dõi nhiều nguồn RSS và tìm cách tự động sắp xếp chúng.
Tại sao dùng trình đọc RSS trong Emacs?
Emacs hoạt động dựa trên khái niệm tương tác tương thích (interoperability), vì Emacs lấy dữ liệu và cho phép nó được giải thích theo nhiều cách khác nhau.
Mặc dù bạn có thể dùng Emacs chỉ để soạn thảo văn bản, nhưng việc truy cập email trong khi soạn thảo, ví dụ, cho phép bạn sử dụng liền mạch văn bản đang viết trong email đang soạn.
Đây là lý do tích hợp trình đọc RSS vào Emacs rất hấp dẫn. Nó cho phép bạn dùng khả năng soạn thảo mạnh mẽ của Emacs để thao tác nguồn cấp và các hàm khác trong Emacs.
Cài đặt Elfeed trên Emacs
Cài đặt Elfeed rất đơn giản. Nó có sẵn trong kho GNU ELPA, nên truy cập được mà không cần sửa file init.el.
Để cài Elfeed, nhấn Alt + X để mở bộ đệm lệnh, gõ package-install. Bạn phải cung cấp elfeed làm tên gói và nhấn Enter. Emacs sẽ tải mã nguồn Elfeed và biên dịch ngay lập tức.
Thiết lập nguồn RSS đầu tiên trong Emacs
Đã cài xong, truy cập Elfeed bằng Alt + X và gõ elfeed trong bộ đệm lệnh. Điều này tải bộ đệm Elfeed trống.
Có hai cách thêm nguồn RSS vào Elfeed:
- Chỉnh sửa thủ công file init.el
- Trong chính Emacs
Thêm nguồn RSS thủ công trong Elfeed
Bạn dễ dàng điền Elfeed bằng cách thêm URL nguồn vào file init.el thủ công, vì Elfeed theo dõi biến "elfeed-feeds". Biến này báo cho Elfeed biết nguồn nào cần tải và hiển thị trên màn hình tổng quan.
Ví dụ, đây là đoạn từ file init.el của tôi:
(setq elfeed-feeds '("https://feeds.maketecheasier.com/MakeTechEasier" "https://solar.lowtechmagazine.com/feeds/all-en.atom.xml" "https://old.reddit.com/r/f1technical.rss"))
Setq là hàm Emacs đặt giá trị cho biến cụ thể. Ở đây, nó đặt biến elfeed-feeds với ba liên kết nguồn làm giá trị.
Sau đó, Elfeed tự động thêm các liên kết vào cơ sở dữ liệu nội bộ, tải lần sau bạn chạy chương trình.
Thêm nguồn RSS trong Emacs
Cách khác điền Elfeed là cung cấp liên kết nguồn khi nó đang chạy. Cho phép bạn cập nhật danh sách nguồn RSS chủ động mà không cần tải lại Emacs.
Để làm vậy, nhấn Alt + X mở bộ đệm lệnh. Gõ elfeed-add-feed và nhấn Enter. Elfeed sẽ yêu cầu URL nguồn bạn muốn tải.
Trong trường hợp tôi, cung cấp URL nguồn của chúng tôi để nhận cập nhật bài viết công nghệ hàng ngày.
Tôi sao chép URL nguồn và nhấn Ctrl + Y tại dấu nhắc URL để dán liên kết vào Emacs. Sau khi dán, chỉ cần nhấn Enter để xác nhận URL nguồn cho Elfeed.
Cách tự động gắn thẻ và lọc nguồn trong Emacs
Ngoài liệt kê và xem nguồn RSS, Elfeed còn thực hiện nhiều hàm cho phép tinh chỉnh danh sách nguồn.
Một trong những hàm hay là gắn thẻ tự động. Tính năng này cho phép gắn thẻ ngay lập tức cho các mục RSS đến từ một nguồn cụ thể.
Ví dụ, nếu bạn có nhiều nguồn về chủ đề nhất định, có thể thiết lập để tất cả có cùng thẻ, giúp dễ dàng, trực quan sắp xếp qua nhiều nguồn trên màn hình tóm tắt.
Để làm vậy, chỉnh sửa nguồn RSS trong file init.el. Xem ví dụ ngắn sau:
(setq elfeed-feeds '("(https://feeds.maketecheasier.com/MakeTechEasier" tech news) ("https://solar.lowtechmagazine.com/feeds/all-en.atom.xml" tech) ("https://old.reddit.com/r/f1technical.rss" tech f1)))
Để tự động gắn thẻ nguồn RSS, cần làm hai việc với định dạng elfeed-feeds mặc định:
- Bao quanh liên kết nguồn bằng dấu ngoặc đơn. Điều này báo cho
elfeed-feedsrằng mục cụ thể này trong biến có nhiều phần. - Cung cấp từ làm thẻ cho liên kết cụ thể đó. Có thể bao gồm nhiều thẻ miễn là tách nhau bằng dấu cách.
Lọc nguồn RSS trong Elfeed
Các thẻ này hoạt động cùng với hệ thống lọc mạnh mẽ của Elfeed. Cho phép nhóm nguồn RSS chỉ dựa trên thẻ.
Ví dụ, nếu có nguồn RSS gắn thẻ "news", "news tech" và "news gaming", Elfeed cho phép nhóm tất cả dưới thẻ "news".
Để lọc danh sách nguồn, nhấn S trong Elfeed để mở dấu nhắc lọc. Mặc định dấu nhắc chứa:
@6-months-ago +unread
- Ký hiệu @ chỉ phạm vi ngày. Có thể là ngày tuyệt đối như "2022-02-22" hoặc tương đối như "3-days-ago".
- Ký hiệu "+" là toán tử thẻ báo cho Elfeed bao gồm rõ ràng tất cả nguồn có thẻ này.
Với điều đó, xét nguồn RSS sau:
[0](setq elfeed-feeds [1] '(("https://feeds.maketecheasier.com/MakeTechEasier" tech news) [2] ("https://solar.lowtechmagazine.com/feeds/all-en.atom.xml" tech) [3] ("https://old.reddit.com/r/f1technical.rss" tech f1) [4] ("https://www.autosport.com/rss/f1/photos/" f1) [5] ("https://www.philstar.com/rss/world" news)))
Để lọc thẻ "tech", gõ "+tech" trong dấu nhắc lọc Elfeed để hiển thị ba liên kết đầu trong bộ đệm tóm tắt Elfeed. Tuy nhiên, nếu thêm "+news", Elfeed sẽ hiển thị thẻ đầu và thứ năm.
Biết điều này, bạn có thể cụ thể hơn với logic lọc. Ví dụ, muốn bao gồm tất cả liên kết tech nhưng loại trừ "f1", gõ:
+tech -f1
Cách tự động gắn thẻ nguồn dựa trên URL
Cách khác tự động gắn thẻ mục RSS trong Elfeed là sắp xếp dựa trên URL. Hữu ích nếu bạn dùng Elfeed đăng ký nguồn RSS có cấu trúc URL tương tự.
Để làm vậy, dùng elfeed-new-entry-hook của Elfeed. Đây là hàm hook thực hiện lệnh tùy chỉnh dựa trên điều kiện cụ thể. Hàm này chạy lệnh tùy chỉnh mỗi khi mục được thêm bằng lệnh elfeed-add-feed.
Bạn có thể dùng hàm elfeed-make-tagger trong hook đó. Đây là hàm chung gắn thẻ liên kết dựa trên tùy chọn bạn đặt. Kết hợp hai hàm để tạo gắn thẻ tự động trông như sau:
(add-hook 'elfeed-new-entry-hook (elfeed-make-tagger :feed-url "medium\\.com" :add '(medium)))
Hàm này sẽ tự động gắn thẻ bất kỳ liên kết nào chứa slug "medium.com".
Bạn cũng có thể cụ thể hơn với tùy chọn đặt cho elfeed-make-tagger. Ví dụ, vừa gắn thẻ dựa trên URL vừa lọc bỏ mục cũ hơn ba tháng:
(add-hook 'elfeed-new-entry-hook (elfeed-make-tagger :feed-url "medium\\.com" :before "3 months ago" :add 'medium))
Cách tạo màu sắc và font tùy chỉnh cho thẻ
Ngoài gắn thẻ tự động, bạn cũng có thể tùy chỉnh giao diện Elfeed dựa trên thẻ đang xử lý. Hữu ích nếu muốn nguồn với thẻ cụ thể nổi bật.
Để làm vậy, cần định nghĩa lại hàm elfeed-search-face-alist. Đây là lệnh Elfeed dùng để thay đổi giao diện bộ đệm tóm tắt. Để định nghĩa lại, dùng hàm defface và push:
- Hàm defface tạo "face" mới cho Emacs. "Face" là tập giá trị có thể chứa cả font ký tự và màu nền.
- Hàm push thêm định nghĩa vào lệnh hiện có trong Emacs.
Với điều đó, kết hợp các hàm để tạo "face" tùy chỉnh cho Elfeed. Ví dụ, face tùy chỉnh này làm nổi bật thẻ f1 bằng màu đỏ:
(defface elfeed-face-tag-f1 '((t :foreground "#f00")) "This is a custom font face for the F1 tag in Elfeed.") (push '(f1 elfeed-face-tag-f1) elfeed-search-face-alist)
Chúc mừng! Bạn giờ biết cách dùng Emacs làm trình đọc RSS với Elfeed. Hơn nữa, bạn cũng có ý tưởng cơ bản cách tùy chỉnh và tự động hóa Elfeed cho nhu cầu nguồn RSS của mình.
Nếu thảo luận này khiến bạn nghĩ đến những gì có thể làm thêm với Emacs, xem bài viết về các gói năng suất tốt nhất cho Emacs.
Câu hỏi thường gặp
1. Làm sao xóa nguồn trong Elfeed?
Bạn có thể xóa nguồn theo hai cách: xóa mục nguồn trong file init.el hoặc dùng hàm customize của Emacs để xóa.
Với cách trước, xóa nguồn chỉ việc xóa URL nguồn trong biến elfeed-feeds. Với cách sau, nhấn Alt + X mở bộ đệm lệnh. Gõ customize. Mở cửa sổ customize cho Emacs.
Tại đó, gõ elfeed-feeds trong ô tìm kiếm. Sẽ hiện tất cả nguồn bạn đang đăng ký.
Điều này cho phép xóa nguồn bằng cách nhấn nút DEL bên cạnh liên kết nguồn. Xong rồi, nhấn nút Apply và Save dưới thanh tìm kiếm để cập nhật nguồn.
2. Làm sao nếu thêm tất cả nguồn vào Elfeed mà chúng không làm mới?
Elfeed không tự động làm mới liên kết nguồn cho bạn. Để tải mục mới nhất trong nguồn, nhấn Shift + G để khởi động cập nhật tất cả nguồn đang đăng ký.
Hơn nữa, nếu chỉ muốn cập nhật một nguồn RSS cụ thể, chạy hàm elfeed-update-feed.
3. Thẻ tự động không hoạt động. Làm sao khắc phục?
Có thể do bạn có thẻ xung đột cho cùng một nguồn RSS. Điều đó xảy ra nếu bạn đưa cùng một URL nguồn vào cả nguồn thủ công và tự động.
Để giải quyết, phải xóa mục thủ công trong file init.el hoặc mục nguồn tự động trong bộ đệm customize của Emacs.