
Emacs là gì: Trình soạn thảo lập trình mở rộng bằng ngôn ngữ Lisp
Emacs không đơn giản là một trình soạn thảo văn bản. Nó là một trình thông dịch ngôn ngữ Lisp đeo trình soạn thảo bên ngoài — theo đúng mô tả của trang dự án, “ở lõi của nó là một trình thông dịch Emacs Lisp”. Chính kiến trúc đó biến Emacs thành công cụ lập trình mở rộng tới mức người dùng có thể viết tính năng mới bằng chính ngôn ngữ cấu hình của trình soạn thảo. Bài viết này phân tích kiến trúc, các thành phần chính, hệ sinh thái tiện ích, và lý do Emacs vẫn được nhiều lập trình viên chọn dùng hàng ngày.

Emacs đến từ đâu
Emacs là một trong những phần mềm lâu đời nhất của thế giới mã nguồn mở. Dự án GNU bắt đầu vào năm 1983, và vào tháng 3/1985, Richard Stallman công bố GNU Manifesto tuyên bố khởi động dự án nhằm xây dựng một hệ điều hành tự do kiểu Unix. Emacs được viết ra như một phần của lý tưởng đó: mã nguồn mở, quyền sửa và chia sẻ bản sao, không thuộc vào phạm vi công cộng.
Điểm khác biệt cốt lõi so với các trình soạn thảo khác nằm ở thiết kế kiến trúc. Vim tập trung vào tốc ưu thao tác gõ trong một chế độ đầu vào riêng. Emacs chọn hướng khác: nó là một môi trường thực thi ngôn ngữ, và giao diện soạn thảo chỉ là một trong rất nhiều tính năng được viết bằng ngôn ngữ đó.

Lõi là một trình thông dịch Lisp
GNU Emacs lõi là một trình thông dịch Emacs Lisp (elisp), theo tài liệu chính thức tại trang dự án Emacs. Mọi thứ bạn thấy trong Emacs — từ cách di chuyển con trỏ, đến menu, đến chế độ chỉnh sửa, đến các lệnh bạn tự định nghĩa — đều là hàm viết bằng elisp. Trình soạn thảo không phải là một module được viết bằng C gắn vào đó; nó là một chương trình elisp chạy trên trình thông dịch.
Điều này giải thích vì sao Emacs tự thân: bạn không cần chờ bản phát hành mới để có một tính năng. Bạn viết một hàm elisp, lưu vào một file, nạp vào Emacs, và tính năng đó dùng được ngay lập tức. Toàn bộ hệ sinh thái lớn của Emacs — hàng nghìn gói mở rộng — hoạt động theo đúng cơ chế này.
Elisp được biên dịch động thành byte-code để tốc ưu tốc độ thực thi, và trong các phiên bản gần đây, Emacs bổ sung khả năng biên dịch native để tạo mã máy trực tiếp, giảm thêm chi phí gọi hàm. Cơ chế này được giải thích chi tiết trong sổ tay Elisp Introduction.
Các thành phần cần biết
Để dùng Emacs hiệu quả, bạn cần hiểu một số khái niệm nền tảng:
| Khái niệm | Ý nghĩa |
|---|---|
| Buffer | Vùng nhớ nội dung đang chỉnh sửa. Mỗi file, mỗi shell, mỗi kết quả tìm kiếm đều là một buffer riêng. |
| Window và frame | Cách chia màn hình để hiển thị nhiều buffer cùng lúc, không phải tab trình duyệt. |
| Mode | Lớp hành vi áp dụng cho một buffer: chỉnh sửa văn bản, chỉnh sửa mã C, chế độ Org, hay chế độ dịch. |
| Minibuffer | Dòng lệnh nhỏ ở đáy màn hình, dùng cho mọi lệnh và tìm kiếm. |
| Key binding | Ánh xạ tổ hợp phím tới một hàm elisp. Đây là nơi phần lớn tính cá nhân hoá của Emacs nằm. |
| Echo area | Vùng hiển thị thông báo, thường nằm cùng dòng với minibuffer. |
Cấu hình cá nhân của bạn nằm trong file khởi tạo, thường là ~/.emacs.d/init.el. File này chính là mã elisp, được nạp mỗi khi Emacs khởi động.
Phím tắt cơ bản
Emacs dùng quy ước phím tắt rất nhất quán: C- nghĩa là giữ phím Ctrl, M- nghĩa là giữ phím Alt (Meta), và dấu gạch ngang là phím tiếp theo.
C-x C-f mở một file
C-x C-s lưu file
C-x b chuyển sang buffer khác
C-x C-k xóa cả dòng
M-x mở dấu nhắc, gõ tên lệnh bất kỳ
C-g huỷ lệnh đang chạy
Phím mạnh nhất của Emacs là M-x: nó mở minibuffer để bạn gõ tên bất kỳ lệnh nào. Bạn không cần nhớ toàn bộ phím tắt — bạn nhớ tên lệnh và gõ một phần, Emacs tự hoàn thành.
Chạy shell, REPL và quản lý file ngay trong Emacs
Emacs không phải trình soạn thảo tách rời khỏi terminal. Gõ M-x shell để mở một buffer shell, hoặc M-x run-python để mở REPL Python ngay trong Emacs. Giao diện đồ hoạ với trình soạn thảo vẫn hoạt động khi bạn ở trong buffer lệnh. Thao tác C-c C-c gửi tín hiệu ngắt tới tiến trình con.
Emacs cũng có Dired — trình quản lý file tích hợp. Gõ M-x dired để liệt kê thư mục, sau đó dùng C-x để mở, đổi tên, hay xóa file mà không cần rời Emacs. Với người dùng thích dòng lệnh, Dired thường nhanh hơn cả ls và cd khi cần xem nhiềi thư mục cùng lúc.
Hệ sinh thái tiện ích
Sức mạnh thật sự của Emacs nằm ở hệ sinh thái mở rộng. Một số gói nổi bật với lập trình viên:
- Magit: giao diện Git chạy ngay trong Emacs, hiển thị trạng thái, staging, commit và lịch sử trong một buffer. Đây là lý do nhiều người chọn Emacs chính vì Git. Xem tại kho mã nguồn Magit.
- Org mode: hệ thống ghi chú và soạn thảo tài liệu tích hợp, hỗ trợ xuất PDF, quản lý tác vụ, tính toán, và lập trình văn xuôi (literate programming). Xem tại orgmode.org.
- Doom Emacs và Spacemacs: framework cấu hình đóng gói hàng trăm gói thành một bộ thiết lập hoàn chỉnh, có hệ thống phím thống nhất và chủ đề giao diện dễ nhìn. Xem tại doomemacs.org.
- Flycheck và các linter: kiểm tra lỗi ngay khi gõ, hiển thị cảnh báo trong gutter.
- Company: hoàn thành mã theo ngữ cảnh, dựa trên nội dung file hiện tại thay vì chỉ dựa trên tên.

Emacs phù hợp với ai
Emacs có chi phí học ban đầu cao hơn hẳn so với một trình soạn thảo đơn giản: hệ thống phím tắt và cấu hình elisp đòi hỏi thời gian làm quen. Đổi lại, người dùng có được một công cụ tùy biến gần như không giới hạn mà không cần chờ đợi bản phát hành mới.
Emacs rất hợp với lập trình viên làm việc nhiều với Git, viết tài liệu kỹ thuật, hoặc cần một môi trường thống nhất trên nhiều máy. Người muốn một trình soạn thảo nhẹ để gõ nhanh thì các lựa chọn khác hợp lý hơn. Cần lưu ý rằng bản Emacs phổ biến nhất ngày nay là GNU Emacs, do dự án GNU duy trì; sổ tay đầy đủ nằm tại gnu.org.
Tóm lại, Emacs là một ví dụ kinh điển của triết lý “lập trình bằng công cụ”: thay vì chờ một tính năng mới, bạn tự viết nó bằng đúng ngôn ngữ mà trình soạn thảo đang chạy. Đó là lý do Emacs vẫn là một lựa chọn lâu dài cho lập trình viên.
