- Trình soạn thảo cấu trúc dựa trên đa con trỏ cho phép thao tác trực tiếp với cấu trúc mã, hoạt động xoay quanh cây cú pháp (AST)
- Hỗ trợ tương tác ở cấp nút cú pháp, giúp thu hẹp khoảng cách giữa ý định khi viết mã và thao tác chỉnh sửa thực tế
- Với tính năng đa con trỏ, có thể chỉnh sửa hoặc refactor nhiều nút cú pháp cùng lúc, nâng cao hiệu quả chỉnh sửa hàng loạt
- Định nghĩa lại cách chỉnh sửa theo chế độ, cho phép di chuyển nhất quán theo nhiều đơn vị như từ, dòng, nút cú pháp
- Tăng cường độ chính xác và tính nhất quán trong chỉnh sửa mã, đề xuất một mô hình biên tập mới giúp nâng cao năng suất của lập trình viên
Tổng quan về Ki Editor
- Ki Editor là một trình soạn thảo cấu trúc đa con trỏ (Multi-cursor structural editor), cung cấp môi trường chỉnh sửa cho phép thao tác trực tiếp với cấu trúc cú pháp của mã
- Khác với kiểu chỉnh sửa văn bản truyền thống, công cụ này thao tác các thành phần mã dựa trên cây cú pháp (AST)
- Có thể chỉnh sửa trực tiếp theo đơn vị nút cú pháp mà không cần dùng chuột hay tổ hợp phím phức tạp
Tương tác với nút cú pháp
- Thông qua tính năng First-class syntax node interaction, người dùng có thể trực tiếp xử lý cấu trúc cú pháp của mã
- Tập trung vào việc thu hẹp khoảng cách giữa ý định khi viết mã và thao tác chỉnh sửa thực tế
- Thực hiện thao tác theo đơn vị cú pháp mà không cần di chuyển chuột hay nhập phím phức tạp
Tính năng đa con trỏ
- Có thể dùng Multiple cursors để chỉnh sửa đồng thời nhiều nút cú pháp
- Nâng cao hiệu quả chỉnh sửa hàng loạt và refactor nhờ thao tác song song trên các nút cú pháp
- Xử lý nhanh các tác vụ sửa mã lặp đi lặp lại
Định nghĩa lại chỉnh sửa theo chế độ
- Với tính năng Redefine modal editing, chế độ chọn được chuẩn hóa
- Hỗ trợ nhất quán việc di chuyển theo nhiều đơn vị như từ, dòng, nút cú pháp
- Tăng cường tính linh hoạt và nhất quán so với kiểu chỉnh sửa theo chế độ hiện có
Ý nghĩa
- Ki Editor mang đến trải nghiệm chỉnh sửa lấy cấu trúc cú pháp làm trung tâm, giúp tăng độ chính xác khi viết và sửa mã
- Kết hợp đa con trỏ với thao tác trên nút cú pháp để đề xuất một cách tiếp cận mới trong biên tập mã, góp phần nâng cao năng suất phát triển
1 bình luận
Ý kiến trên Hacker News
Khi thấy tính năng “First-class syntactic selection”, tôi lập tức nghĩ đến phím tắt Expand / Shrink Selection mà tôi hay dùng trong JetBrains IDE
Với tổ hợp
Ctrl + W,Ctrl + Shift + W, có thể mở rộng hoặc thu hẹp vùng chọn theo đơn vị cú phápNhờ tính năng này mà góc nhìn của tôi về cách tương tác với ‘văn bản’ trong tệp đã thay đổi hoàn toàn
VS Code hay Zed cũng có tính năng tương tự, nhưng cảm giác mở rộng/thu hẹp quá thô
Liên kết tài liệu JetBrains
Với Cmd+Shift+V có thể mở stack clipboard để tìm kiếm hoặc chọn lịch sử sao chép trước đó
Cmd+Shift+E hiển thị danh sách vị trí gần đây, còn Cmd+Shift+A mở action palette để fuzzy search mọi lệnh
Ngoài ra, tính năng Local History cho phép theo dõi lịch sử thay đổi tệp chi tiết hơn Git rất nhiều
Những tính năng như vậy dẫn đến khái niệm “chỉnh sửa trực tiếp ngay trong buffer kết quả tìm kiếm”
incremental selectiondựa trên tree-sitterDouble-click chọn từ, triple-click chọn toàn bộ đối số hàm, click lần thứ 4 chọn toàn bộ
f(a,r,g,s), tức là đơn vị cú pháp tăng dần theo số lần nhấpĐến giờ tôi vẫn còn nhớ cơ bắp với cách này
Tôi đang thử nghiệm ý tưởng để commit, diff, cherry-pick cũng hoạt động theo đơn vị cú pháp như Ctrl+W
Nội dung liên quan được tổng hợp trong dự án librdx
Chỉnh sửa có nhận thức AST làm tôi nhớ đến sự tiện lợi của các ngôn ngữ họ Lisp
Trong Lisp, những việc có thể làm bằng thao tác list đơn giản thì ở JS lại cần LSP hoặc parser riêng
Sau cuối tuần dùng Clojure rồi quay lại TypeScript, tôi thực sự nhớ các lệnh paredit
Trước đây tôi từng tự làm một trình soạn thảo dựa trên cây cú pháp
Vì chỉ thao tác với cây thay vì nhập văn bản, nên không thể tồn tại chương trình sai cú pháp
Tuy vậy, biến nó thành một phương thức nhập liệu đủ thực dụng để dùng thực tế là thử thách lớn
Giờ tôi không thể chạy lại vì không còn phần cứng hiển thị thời đó, nhưng vẫn để lại mô tả dự án
Kết quả là đôi khi phải đi qua những bước không trực quan, hoặc thậm chí phải viết lại từ đầu
Thậm chí còn có những cấu trúc tuy hợp lệ nhưng không hề tồn tại đường tạo ra chúng
Về mặt lý thuyết thì thú vị, nhưng tôi cảm thấy đó là ngõ cụt kém thực dụng
Rất khó để thắng được tính phổ quát và sự đơn giản của giao diện dựa trên văn bản
Editor chuyên dụng, hệ thống quản lý phiên bản mới, hệ sinh thái bị chia cắt và nhiều ràng buộc thực tế khác là trở ngại quá lớn
Con người không suy nghĩ theo đơn vị cây, nên việc chỉ được code trong trạng thái luôn đúng cú pháp là một trải nghiệm cực kỳ ngột ngạt
Cuối cùng, các công cụ cho phép sự nghiêm ngặt linh hoạt (ví dụ như gradual typing của TypeScript) mới thực sự tồn tại được
Tài liệu liên quan: simh, mame, mã VT11, tài liệu
Dù chưa phải editor phổ thông, hướng mở rộng phạm vi chọn theo cây có vẻ đầy hứa hẹn
Liên kết Pantograph
Nó được xây trên một hệ thống parser xử lý các cây chưa hoàn chỉnh nhưng vẫn hợp lệ
Thông qua biểu diễn khoảng trống như
<//>, có thể xử lý cú pháp chưa hoàn chỉnh một cách an toànVí dụ:
2 + ·có thể được parse thành cây<BinaryExpression>Nếu quan tâm, hiện đang có thảo luận trong cộng đồng Discord
Tôi không quen với chỉnh sửa AST
Tôi chỉ dùng các text object kiểu đối số hàm hay arglist
Tính năng LSP thì cũng chỉ dùng mức nhảy đến định nghĩa và đổi tên
Rốt cuộc tôi thấy mình cần nâng trình dùng editor hơn nữa
Có thể viết pattern bằng cú pháp gần như giống mã nguồn và nhìn thấy phép biến đổi ngay trước mắt
Ví dụ có thể thực hiện chuyển đổi sang optional chaining bằng lệnh
ast-grep -pattern '$A && $A.$B' --rewrite '$A?.$B' -lang tsCác metavariable như
$X,$Abuộc phải khớp cùng một nodeAI coding agent hiện vẫn chưa dùng tốt kiểu pattern này, nhưng bản thân công cụ thì rất vững vàng
Phần lớn trường hợp chỉ cần chọn theo node cú pháp rồi xóa, sao chép, thay thế là đủ
Tôi không thường xuyên làm refactor quy mô lớn nên không thấy cần phải học
Nhưng nếu là lập trình viên phát triển dịch vụ lớn, có thể sẽ có quan điểm hoàn toàn khác
Khi học viết macro trong Elixir tôi đã có được nhiều hiểu biết, và Lisp cũng tương tự
Mỗi ngôn ngữ có cách tiếp cận khác nhau, nhưng cuối cùng đều hướng đến cùng một đích
Cách tôi phân loại editor là như sau
Ki thuộc nhóm thứ ba, và tôi luôn theo dõi sát các dự án kiểu này
Các node UI trông như văn bản bình thường, nhưng thực ra là cấu trúc cây
Nếu muốn cho phản hồi ban đầu, hãy liên hệ qua email trong hồ sơ của tôi
Khó khăn của chỉnh sửa AST là khả năng khám phá (discoverability)
Nó có hiện trên màn hình, nhưng nhiều khi ta không biết tên của node đó
Vì vậy tôi đang nghĩ đến một plugin dùng màu sắc bao quanh khu vực gần con trỏ để trực quan hóa từng scope
Thay vì nghĩ “đi tới hàm tiếp theo”, sẽ nghĩ theo kiểu “đi tới vùng màu xanh tiếp theo”
d mlà sẽ hiện nhãn của mọi node cú pháp đang thấy trên màn hình để có thể nhảy tới ngayNhững thao tác như chọn phần bên trong hoặc bên ngoài node hiện tại rất hữu ích
Tôi đã tạo tích hợp Ki cho VSCode
Sau đó không đóng góp được nhiều nữa nên hơi tiếc, nhưng tôi nghĩ những đổi mới ở tầng công cụ nền tảng như thế này là cực kỳ quan trọng
Liên kết extension Ki cho VSCode
Trước khi xem ví dụ thì tôi chưa hiểu lắm,
nhưng khi thấy trong “First-class syntactic modification” dấu phẩy được tự động thêm/xóa, tôi đã thật sự ấn tượng
Có vẻ logic triển khai còn khá đơn giản nữa
Giờ tôi cũng muốn thử tích hợp Ki hoặc rewrite dựa trên AST trong Zed
Chỉ cần tham khảo mã trong kho lưu trữ Ki
Tôi sẽ sớm thử dùng trực tiếp
Tôi thích điểm độc lập với bố cục bàn phím
Việc nó lấy cảm hứng từ triết lý “mọi thứ đều là buffer có thể chỉnh sửa” của Emacs cũng rất thú vị
Tất nhiên mỗi editor đều có trade-off lớn, nên chắc phải dùng thử mới biết
Neovim rất tuyệt, nhưng mô hình chỉnh sửa của nó có giới hạn
Nếu cấu trúc của nó cho phép thay thế hoàn toàn, có lẽ đã không cần Helix hay Ki
Tôi chạy nó trên bàn phím Dvorak thì mapping bị hỏng hoàn toàn
Khi phần mềm tưởng rằng nó thông minh hơn người dùng, rốt cuộc lại khiến người dùng cảm thấy bất lực
Đúng là Emacs đã có thứ này từ lâu
Gói combobulate là một ví dụ
Có thể xóa node bằng M-k hoặc tìm kiếm/chỉnh sửa trực tiếp bằng tree-sitter query
Hiện đã có mức độ tích hợp rất tốt, nhưng nếu là editor chuyên cho AST thì vẫn còn nhiều dư địa để cải thiện UX
Đây là tính năng cực kỳ hợp với workflow của Helix
Cảm giác như mảnh ghép cuối cùng đã khớp vào pattern di chuyển → hành động hiện có