1 điểm bởi GN⁺ 2 giờ trước | 1 bình luận | Chia sẻ qua WhatsApp
  • stinkpot lưu lịch sử lệnh Bash vào SQLite để quản lý không phụ thuộc phiên làm việc, đồng thời cho phép tìm lại nhanh bằng TUI tìm kiếm
  • Loại bỏ máy chủ đồng bộ, AI, trình quản lý dotfiles·script và kho lưu trữ KV của Atuin, chỉ giữ các tính năng cần thiết và triển khai bằng khoảng 400 dòng Go
  • Có thể nhập lịch sử Bash hiện có bằng stinkpot import, và khi nhấn Ctrl+R thì TUI tìm kiếm ngược sẽ mở ra
  • Trên NixOS, công cụ cung cấp module home-manager; ở các môi trường khác, khởi tạo bằng eval "$(stinkpot init)" trong .bashrc
  • Cơ sở dữ liệu được lưu tại ~/.local/share/stinkpot; nếu bị hỏng sau khi nâng cấp, có thể xóa rồi nhập lại lịch sử

Tách riêng chỉ những tính năng cần từ Atuin

  • stinkpot bắt đầu từ trải nghiệm dùng Atuin nhưng chỉ cần quản lý lịch sử độc lập với phiên và TUI tìm kiếm
    • Không bao gồm máy chủ đồng bộ, Atuin AI, trình quản lý dotfiles, trình quản lý script hay kho lưu trữ KV
    • Tính năng đồng bộ cũng không được dùng vì cấu hình và lệnh chạy khác biệt đáng kể giữa các máy
  • Dự án được viết bằng khoảng 400 dòng Go, với tỷ lệ ngôn ngữ trong kho là Go 82.5% và Nix 17.5%
  • Tên gọi được lấy từ stinkpot, một loài rùa nhỏ
  • Để tăng tốc tìm kiếm ngược, kế hoạch thực thi SQLite dùng covering index thay vì B-tree tạm thời để sắp xếp

Cài đặt và tìm kiếm lịch sử

  • Từ mã nguồn, có thể build bằng lệnh sau
go build -o stinkpot .
  • Người dùng NixOS home-manager có thể import module homeManagerModules.default được cung cấp
  • Ở các môi trường khác, thêm lệnh khởi tạo sau vào .bashrc
eval "$(stinkpot init)"
  • Có thể nhập lịch sử Bash hiện có bằng lệnh sau
stinkpot import
  • Khi nhấn Ctrl+R trong shell, TUI tìm kiếm sẽ mở ra
    • Di chuyển bằng · và chọn bằng Tab hoặc Enter
    • Sau khi chọn, nhấn Enter lần nữa để thực thi lệnh
    • Hủy bằng Esc
  • DB lịch sử được lưu tại ~/.local/share/stinkpot
    • Nếu DB bị hỏng sau khi nâng cấp, hãy xóa tệp rồi chạy lại stinkpot import

1 bình luận

 
Ý kiến trên Lobste.rs
  • Tuần này tôi vô tình gõ ? ở dấu nhắc và thấy Atuin hỏi có muốn bật chế độ AI không, lúc đó mới nhận ra nó đã phình to đến mức nào
    Xin kiếu. Cảm ơn vì đã giới thiệu, giờ tôi đã chuyển sang stinkpot
  • Tôi từng khổ sở vì làm mất lịch sử lệnh shell nên rất thích dự án này. Tôi cũng đã thử atuin.sh nhưng không thật sự hài lòng
    Đặc biệt tôi thích việc tạo ra một binary tối giản tĩnh đơn giản chỉ với 400 dòng mã Go. Go nhìn chung là một ngôn ngữ tuyệt vời, và tôi cũng sẽ thử dùng stinkpot
  • Tôi tò mò việc dùng SQLite ở đây tốt hơn thế nào so với các công cụ đọc trực tiếp file lịch sử như hstr hay fzf
    Tôi đã dùng hstr khoảng 15 năm và gần đây đang chuyển sang fzf. Bản thân SQLite thì rất tuyệt, nhưng tôi không hiểu vì sao lại cần nó cho mục đích này
    • Nếu cấu hình để Bash ghi lịch sử ra file sau mỗi lần thực thi lệnh thì có thể làm gần giống chỉ với fzf
      File lịch sử mặc định không có cấu trúc, nhưng SQLite có thể lưu dữ liệu như mã thoát và thời điểm kết thúc, đồng thời xử lý nhanh việc khử trùng lặp khi chèn hoặc cập nhật thời điểm thực thi khi chạy lại cùng một lệnh
    • Tôi từng nghĩ đến việc lưu và lập chỉ mục thư mục làm việc hiện tại của từng mục lịch sử
      Về lý thuyết, có thể vất vả khôi phục ngữ cảnh từ lịch sử lệnh, nhưng nếu có thể tra cứu nhanh lịch sử shell theo từng thư mục dự án thì sẽ khá hữu ích
  • Chắc chắn đáng để thử. Atuin đã trở thành một vườn thú tính năng đầy những thứ tôi hầu như không quan tâm
    Dù vậy, ưu điểm là nó vẫn hoạt động tốt, nhưng có lẽ tôi đã lâu không cập nhật
    • Tôi biết đến Atuin từ trước, nhưng đến tuần này mới dùng lần đầu. Với xu hướng hiện tại, có vẻ chẳng bao lâu nữa nó sẽ bắt đầu đọc cả email
  • Trông rất ổn, nhưng tôi tò mò liệu có thể lọc lịch sử theo cwd không. Đây là lý do duy nhất tôi dùng Atuin: có thể lấy thư mục làm tiêu chí cho lịch sử lệnh
    Sau khi cd vào một dự án, tôi có thể tiếp tục ngay từ chỗ đã dừng trước đó, và điều này đặc biệt hữu ích khi chạy lại những lệnh dài có nhiều tham số
    • fish có sẵn tính năng này và nó rất hữu ích
    • Cá nhân tôi không thích kiểu hành vi đó, nhưng vẫn có thể triển khai với một ràng buộc. Chỉ những lệnh được chạy sau khi cài stinkpot mới có cwd được ghi lại, vì bash_history mặc định không có thông tin này
  • Nếu muốn người khác yên tâm dùng mã nguồn, tốt hơn là nên thêm giấy phép cho dự án
    Nếu được, tôi muốn thêm một giấy phép nguồn mở rồi tích hợp nó vào experimental oils readline. Sau khi hoàn thành widget động, một trong những TODO ưu tiên cao nhất cần xử lý là lịch sử lệnh
  • Tôi tò mò không biết có thể xóa lệnh khỏi lịch sử dễ đến mức nào. Tôi muốn biết liệu có phải xóa trực tiếp các hàng bằng SQL trong cơ sở dữ liệu SQLite hay không
    Dù hiếm, vẫn có lúc cần xóa vài dòng lệnh khỏi lịch sử shell; với cách cũ, tôi có thể mở trực tiếp bash_history và xóa các dòng đó. Tôi muốn biết stinkpot có lệnh xóa lịch sử hay không
    Ngoài trường hợp dùng hơi đặc biệt này, bản thân dự án trông vẫn khá thú vị