Vẫn còn ai dùng Emacs không?
(jmmv.dev)- Sau khi bắt đầu làm quen với Linux vào năm 1997, tác giả đã qua lại giữa Vim và Emacs, rồi chuyển sang VSCode và IntelliJ vào năm 2015, trước khi quay trở lại Doom Emacs vào năm 2022 trong môi trường Linux VM từ xa tại Snowflake
- VSCode giúp việc học và phát triển dễ dàng hơn nhờ UI hiện đại, quy mô gọn nhẹ, cấu hình dựa trên JSON và tích hợp LSP cho Go và Rust; còn với phát triển Java thì IntelliJ là lựa chọn thực tế hơn
- Trên Linux VM cũ ở Snowflake, công việc chủ yếu là viết shell script và Bazel build file; vì làm việc qua SSH phù hợp hơn môi trường đồ họa từ xa nên Emacs lại trở nên cần thiết
- Doom Emacs mang lại cảm giác Emacs giống như một IDE nhờ các mặc định hợp lý, tích hợp ngôn ngữ, key binding kiểu Vim, menu bật lên dựa trên phím space và cấu trúc file cấu hình đơn giản
- Lý do cốt lõi khiến tác giả tiếp tục dùng Emacs là có thể duy trì cùng một môi trường phát triển ở bất cứ đâu chỉ với shell, tmux và Emacs: trên MacBook, laptop Linux, cloud workstation Linux hay máy chủ FreeBSD
Từ IDE trên DOS/Windows sang trình soạn thảo trên Linux
- Khoảng năm 1997, tác giả bắt đầu làm quen với Linux qua Caldera OpenLinux 1.1
- Trước đó, tác giả dùng nhiều Borland Turbo C++ và Visual Basic, nên đã quen với những IDE hoàn thiện cao ở thời điểm đó
- Qua hai cuốn sách nhập môn Linux, tác giả biết đến Vim và Emacs; cả hai đều được giới thiệu là lựa chọn nâng cao
- Dù những IDE từng dùng trước đó có vẻ hoàn chỉnh hơn, tác giả vẫn học cách sử dụng cơ bản và làm các tutorial của cả Vim lẫn Emacs
- Cho đến khoảng năm 2015, tác giả thay phiên dùng Vim và Emacs
- Emacs phù hợp hơn cho các phiên lập trình kéo dài
- Vim mạnh hơn khi cần di chuyển nhanh giữa nhiều file và chỉnh sửa, như trong công việc với pkgsrc
Vì sao chuyển sang VSCode và IntelliJ
- Dù Vim và Emacs hoạt động đủ tốt, tích hợp ngôn ngữ của chúng còn yếu nên tác giả bắt đầu quan tâm đến các trình soạn thảo hiện đại hơn
- Khi chuyển sang macOS, tác giả cũng thử Atom và Brackets, nhưng cảm thấy chúng mong manh và nặng nề vì có quá nhiều tính năng và thiết lập
- VSCode xuất hiện vào năm 2015 và ngay từ đầu đã cho cảm giác là công cụ phù hợp
- Giao diện hiện đại và tương đối gọn nhẹ
- Trình chỉnh sửa cấu hình khi đó dựa trên file JSON thay vì bảng điều khiển cài đặt, nên tác giả thấy dễ kiểm soát hơn
- Khi bắt đầu học Go và Rust, tích hợp LSP của VSCode cho từng ngôn ngữ đã giúp ích rất nhiều
- Tự động hoàn thành mã
- Tô sáng lỗi theo thời gian thực
- Tăng tốc độ học tập
- Khi làm việc với dự án Java dùng Bazel ở Google, IntelliJ là lựa chọn tự nhiên
- Tác giả từng thử phát triển Java bằng Emacs, nhưng IntelliJ quá tốt nên về thực tế chỉ có IntelliJ là lựa chọn hợp lý
- Khi làm việc với codebase C++ và máy Windows từ xa ở Microsoft, tác giả vẫn tiếp tục dùng VSCode cùng plugin Vim
- Nhiều người làm việc trực tiếp trên máy từ xa qua RDP
- Tác giả thích cách chạy VSCode trên desktop cục bộ rồi kết nối đến máy từ xa qua SSH hơn
Điều đưa tác giả trở lại Doom Emacs ở Snowflake
- Sau khi chuyển sang Snowflake vào năm 2022, việc phát triển diễn ra bên trong một Linux VM cũ, và công việc hằng ngày là viết shell script cùng Bazel build file
- Trong môi trường đó, VSCode hay IntelliJ không giải quyết được vấn đề gì; tác giả cũng không thích các giới hạn của môi trường đồ họa từ xa nên quay lại cách truy cập local VM qua SSH
- Tác giả lại cần một trình soạn thảo phù hợp cho các phiên làm việc dài, và lựa chọn đó là Emacs
- File
init.elcũ có hàng trăm dòng cấu hình tích lũy qua nhiều năm, nhưng tác giả không thật sự hiểu hết nội dung, nên muốn bỏ toàn bộ và bắt đầu lại từ đầu - Đúng lúc này, tác giả biết đến Doom Emacs
- Doom Emacs là một “bản phân phối” cấu hình sẵn Emacs ngay từ đầu
- Cung cấp các mặc định hợp lý
- Cung cấp tích hợp ngôn ngữ được định nghĩa sẵn
- Mang lại trải nghiệm quen thuộc cho người từng dùng Vim
- Không tự nhận là IDE, nhưng trải nghiệm thực tế lại giống một IDE
Doom Emacs đã thay đổi trải nghiệm sử dụng như thế nào
- Sau khi thiết lập Doom Emacs, Emacs lại cho cảm giác là “công cụ phù hợp”, giống như VSCode đã từng vào năm 2015
- Nhiều tính năng của Emacs trở nên dễ khám phá hơn nhờ các menu bật lên tương tác xuất hiện sau phím tắt dựa trên space
- Nó cùng tồn tại với key binding kiểu Vim, đồng thời mang lại luồng phím tắt ít gây áp lực lên cổ tay hơn
- Cấu hình được chia thành ba file đơn giản
config.el: chỉ định các thiết lập toàn cục như theme, fontinit.el: chọn các module riêng của Doom cần kích hoạtpackages.el: cài các gói không đi kèm trong Doom
- Các mặc định đều hợp lý, và những chi tiết đáng tinh chỉnh đều có chú thích đầy đủ
- Nhờ sự phát triển của LSP và các tính năng hiện đại như tree-sitter, Emacs giờ đây mang lại cảm giác như một IDE
- Có được tích hợp ngôn ngữ đúng nghĩa cho hầu hết các ngôn ngữ cần xử lý
Giá trị của việc dùng cùng một môi trường phát triển ở mọi nơi
- Tính năng mạnh nhất là có được cùng một môi trường phát triển bất kể đang làm việc trên máy nào
- Các thiết bị bao gồm MacBook, laptop Linux, cloud workstation Linux và cả máy chủ FreeBSD cá nhân
- Thứ cần thiết chỉ là shell, tmux và Emacs
- Khi làm việc trên nhiều loại máy khác nhau, cùng một môi trường và trí nhớ cơ bắp mang lại giá trị trực tiếp cho năng suất
- Chính nhu cầu này khiến Emacs trở thành công cụ còn quan trọng hơn trước đây
Doom Emacs có làm quá nhiều việc không?
- Có những phàn nàn rằng Doom Emacs “làm quá nhiều việc”, nhưng trên thực tế chính vì nó làm nhiều việc nên nó hữu ích
- Tác giả cũng tự hỏi liệu một ngày nào đó có nên giản lược cấu hình để học sâu hơn về chính Emacs hay không
- Việc ngày càng nhiều module bên thứ ba hiện đại được đưa vào các gói Emacs mặc định cũng khiến băn khoăn này lớn hơn
- Gần đây, tác giả cũng muốn thử các bản phân phối như Bedrock hoặc Emacs Solo
- Tuy vậy, năng lượng kích hoạt cần để chuyển đổi là khá cao, và ngay cả nếu đi theo hướng đó thì cuối cùng tác giả vẫn sẽ lại phải tự hỏi vì sao không đi luôn đến Emacs “raw”
Khoảng cách với Elisp, Org mode và Magit
- Tác giả vẫn chưa hoàn toàn hiểu việc Emacs dựa trên Elisp đã thay đổi workflow của mọi người sâu sắc đến mức nào
- Dù có thể hiện thực thêm nhiều logic và workflow ngay trong Emacs, tác giả vốn đã có thể xử lý gần như mọi thứ khá dễ dàng bằng shell script
- Từ góc nhìn “Unix is my IDE”, script vẫn mang cảm giác đúng chất Unix hơn
- Tác giả không thích việc Org mode và Magit không phải là ứng dụng độc lập mà bị gắn phía sau Emacs
- Chừng nào nhu cầu tiếp tục làm việc trên nhiều máy từ xa khác nhau vẫn còn, Emacs vẫn sẽ là một công cụ quan trọng
1 bình luận
Ý kiến trên Lobste.rs
Tôi viết bài này vì chủ đề quá buồn cười
Không phải vì một câu hỏi cụ thể nào, mà vì đang thấy những người cấp bậc cao trong công ty dùng coding agent dựa trên CLI rồi “khám phá” ra các công cụ dòng lệnh, sau đó cố cho thấy khám phá mới đó hữu ích đến mức nào
Từ trước đến nay ví dụ tiêu biểu là tmux, và giờ tôi đang chờ họ sớm nhận ra là còn có cả Vim và Emacs nữa
Những công cụ này đã ở bên cạnh chúng ta từ rất lâu, và nếu hỏi các “lập trình viên 10x cao cấp” trong công ty thì có lẽ họ sẽ nói là mình vẫn dùng
Ấy vậy mà chúng thường bị đối xử kiểu “haha, đồ cổ đại đó mà. Lên web đi!!11” Có lẽ những lập trình viên đó vẫn tiếp tục dùng các công cụ này là có lý do ;P
Bao gồm cả việc CLI trở nên phổ biến hơn, và rất nhiều tri thức trước đây chỉ truyền miệng giờ được ghi chép thành tài liệu. Tất nhiên điều đó cần tiền đề là tri thức do con người tạo ra
Mong là ngay cả khi vượt qua giai đoạn khó xử hiện tại thì những phần tốt đẹp này vẫn sẽ còn lại
Tôi cũng thuộc nhóm chỉ mới bắt đầu học gần đây
Vài năm trước tôi đã thử Doom Emacs, nhưng nó chậm đến mức độ trễ gây khó chịu nên tôi bỏ luôn. Không rõ nhờ native compilation mà giờ chuyện đó đã là quá khứ chưa; hiện tôi vẫn đang dùng Emacs mặc định chưa cấu hình gì nên khó cảm nhận rõ. Tôi đang dùng 30.2 từ Nixpkgs, và có vẻ native compilation được bật sẵn theo mặc định
Tôi không quá quan tâm đến những thứ như chức năng viết email trong Emacs; thứ tôi cần là một trình soạn thảo có thể nắn theo ý mình. Cũng sẽ tốt nếu sau này có thể dùng nó khi tôi muốn học Lisp, và có lẽ sẽ là Janet. Helix hiện vẫn chưa có plugin nên phía Lisp gần như không có lựa chọn. Tôi cũng thích triết lý “mọi thứ đều là văn bản”, nhưng có hợp mình thật không thì còn phải xem
Học nó vào năm 2026 cũng có phần nặng nề. Vì tri thức ngầm tích lũy qua hàng chục năm, cứ đọc bài viết là tên package, tên lệnh văng ra liên tục, trong khi tôi chỉ muốn làm
$THINGthôi mà đã thấy ngợp. Vì vậy tôi chọn con đường học có hướng dẫn và cầm Mastering Emacs lên đọcCác key binding mặc định cũng khá kỳ quặc. Tôi biết là có thể bind lại toàn bộ, nhưng như thế lại thêm việc. Hơn nữa tôi còn tự làm bàn phím công thái học dạng tách rời, và cũng đã chỉnh firmware để hợp với lối làm việc kiểu Vim/Helix, nơi không dùng phím bổ trợ làm luồng chính
Vì tôi luân phiên dùng MacBook Pro, PC và cả bàn phím custom, nên cần tìm một bộ key binding nhất quán để đầu óc không bị chảy ra.
hjklở cùng một vị trí trên mọi bàn phím, nhưng các phím nhưCtrlthì khôngBạn có thể sẽ bị răn dạy rằng evil là dành cho dân tị nạn Vim không muốn học “phúc âm chân chính của Emacs”, nhưng phúc âm chân chính của Emacs® là dùng nó theo cách hợp với bản thân nhất
Tôi đã dùng Emacs từ năm 1998 và hoàn toàn không phải người hâm mộ Vim. Khoảng năm 2011 tôi bắt đầu gặp một chút vấn đề chấn thương do lặp lại ở cổ tay, nên thử những package giúp giảm chuyện đó; tôi đã dùng god mode khá nhiều trong vài năm nhưng vẫn thấy gượng
Rồi để “chứng minh là nó không ổn”, tôi thử evil dù cả đời chưa từng dùng Vim, và chỉ sau một tuần đã thành thạo ngang với god mode, còn sau một tháng thì nhanh hơn cả lúc dùng key binding Emacs chính thức
Điều đó không có nghĩa key binding mặc định là sai. Chỉ là cổ tay tôi không tốt nên trải nghiệm có thể khác. boon hay meow cũng có thể hợp với bạn
Chỉ là nếu evil hợp với bạn thì hoàn toàn không cần cảm thấy tội lỗi. Emacs có thể thay đổi người dùng, nhưng còn thường xuyên hơn nhiều là Emacs thay đổi vì người dùng
Tốt nhất vẫn là tự tay cấu hình, nhưng sẽ rất nhiều việc, và các dự án như Doom thực sự giúp người dùng mới nhập môn dễ hơn hẳn
Trước đây tôi cũng biết khá nhiều key binding mặc định của Emacs, nhưng chưa bao giờ thấy chúng tự nhiên, đặc biệt là rất khó khám phá
Doom Emacs dùng phím tiền tố SPC cho gần như mọi tác vụ, và nếu dừng lại một chút thì sẽ hiện menu tạm thời giải thích các khả năng hoàn tất, nên khá hay. Bạn có thể tìm ra các tính năng mình chưa biết, mà cũng không xung đột với modal mode của Vim
Vì vậy cấu hình kiểu chỉnh sửa văn bản bằng Vim mode, còn tác vụ Emacs thì bằng tổ hợp SPC có cảm giác là một sự cân bằng tốt
Key binding mặc định của Emacs cũng có điểm mạnh riêng. Các phím thao tác văn bản cơ bản được chia sẻ với readline, thậm chí cả macOS nữa. Các phím quản lý văn bản kiểu Emacs trên macOS còn lan sang cả VSCode mà không xung đột với các phím clipboard tiêu chuẩn, nên VSCode trên macOS khá ổn
Sau khi chuyển sang Windows và Linux, tôi gần như không thể chịu nổi VSCode nếu không có plugin Vim
Tôi nghe nói nó cung cấp sẵn những tính năng tương tự Kakoune và Helix, và có xu hướng ít can thiệp hơn. Tôi chưa trực tiếp dùng cả hai, nên đây là nhận xét dựa trên điều tôi nghe được
Tôi thấy package evil được giới thiệu ở trên có vấn đề là nó chiếm quyền quá nhiều key binding và không hòa hợp tốt với các package bên ngoài, nên cần khá nhiều package “adapter”
meow là kiểu sau khi cấu hình một lần thì về sau khá ít phải động tay vào
Tôi đã dùng nó 33 năm rồi, và nó làm được mọi thứ tôi cần ở một editor hay IDE
Tôi cứ qua lại giữa Doom và (n)vim, nhưng gần đây thì chủ yếu đã ổn định với Neovim
Vấn đề cốt lõi tôi gặp khi dùng Emacs, trớ trêu thay, là việc bảo trì quá đau khổ. Mỗi lần nâng cấp Doom thì đồng bộ gói lại lệch pha, đến mức thường chỉ còn lựa chọn hạt nhân là cài lại toàn bộ
Tất nhiên cũng có thể sửa theo cách “bớt gà mờ hơn”, nhưng từ một lúc nào đó tôi chỉ mong công cụ cứ hoạt động là được. Có việc phải làm mà cấu hình lại hỏng, trong khi mình phụ thuộc quá nhiều vào trình soạn thảo, thì rất khó chịu nổi
Dù vậy tôi vẫn nhớ
org-modevà cách điều hướng nói chung của EmacsMỗi lần thử các giải pháp “hiện đại” như VSCode hay CLion, tôi lại gặp chính những vấn đề đó còn nhiều hơn. Không có tính năng trợ năng tử tế nên thay vì điều hướng hoàn toàn bằng bàn phím lại phải bấm chuột một cách gượng gạo, còn hành vi “Vim” thì cũng không hoàn chỉnh như bản thật
Lý do tôi dùng Neovim dạo này đơn giản là vì nó chạy tốt. Thật ra nếu bảo coding agent sửa cấu hình trong 2 phút thì có lẽ tôi cũng có thể nói y như vậy về Emacs hiện tại của mình (:
updatecủa Doom vài lần nhưng lần nào cũng có vấn đềGiờ thì mỗi khi muốn nâng cấp, hoặc cần vì Emacs được nâng cấp, tôi lại xóa bằng
rm -rf ~/.emacs.d/rồi cấu hình Doom lại từ đầu.~/.doom.d/thì tôi đưa vào quản lý phiên bảnVới quy trình này thì không có vấn đề gì
Tôi là kiểu người kỳ quặc dùng Emacs cho cả phát triển, viết lách lẫn email, và đã làm vậy khoảng 15 năm, nhưng rốt cuộc vẫn chưa bao giờ tìm được thời gian hay dư dả tinh thần để học elisp
Ngay cả khi đụng vào file cấu hình, thật ra tôi cũng không rõ mình đang làm gì. Vậy mà đây vẫn là môi trường cho năng suất cao nhất của tôi, điều đó cho thấy trình soạn thảo này tuyệt vời đến mức nào :-)
Việc đọc nghiêm túc Mastering Emacs đã nằm trong danh sách việc cần làm của tôi lâu đến mức phải ngại thừa nhận
M-x high-fiveTrường hợp của tôi cũng vậy: chỉ dùng rất ít package và dùng key binding gốc. Thực ra không có hàm high-five nào cả, nhưng biết đâu nhân dịp này tôi lại đào sâu elisp thật
Tôi chuyển sang Emacs khoảng 2 năm trước vì không thích cách Vim render, và cũng đã chán ngấy kiểu Electron/VSCode
Tôi rất mê avy và vài plugin nhảy khác, nhưng thứ khiến tôi gắn bó và đến giờ vẫn là công cụ chủ lực để thay đổi code chính là magit
Công ty khách hàng mà tôi làm việc cùng trong công việc phụ thuộc toàn bộ hoạt động kinh doanh vào việc khai thác những file CSV cực lớn, nhưng bên đó có vẻ không ai biết cách mở hay kiểm tra dữ liệu trong file 1GB
Họ thậm chí còn không biết lệnh
headđể dùng khi cần xin header của CSVTôi đã dùng X/GUI trong nhiều năm, nhưng vừa mới chuyển sang
-nwChỉ khi thuyết trình thì tôi mới dùng bản Pgtk