- stinkpot เก็บประวัติคำสั่ง Bash ไว้ใน SQLite เพื่อจัดการได้โดยไม่ขึ้นกับเซสชัน และช่วยให้ค้นหาได้รวดเร็วผ่าน TUI สำหรับค้นหา
- ตัดเซิร์ฟเวอร์ซิงก์, AI, ตัวจัดการ dotfiles/สคริปต์ และ KV store ออกจาก Atuin แล้วใช้งานเฉพาะฟังก์ชันที่จำเป็นด้วย Go ประมาณ 400 บรรทัด
- นำเข้าประวัติ Bash เดิมด้วย
stinkpot importและเมื่อกดCtrl+Rจะเปิด TUI ค้นหาแบบย้อนกลับ - บน NixOS มี โมดูล home-manager ให้ใช้งาน ส่วนสภาพแวดล้อมอื่นให้เริ่มต้นใน
.bashrcด้วยeval "$(stinkpot init)" - ฐานข้อมูลเก็บไว้ที่
~/.local/share/stinkpotหากเสียหายหลังอัปเกรด สามารถลบแล้วนำเข้าประวัติใหม่ได้
แยกเฉพาะฟังก์ชันที่จำเป็นจาก Atuin
- stinkpot เริ่มจากประสบการณ์การใช้ Atuin ที่ต้องการเพียงการจัดการประวัติแบบไม่ขึ้นกับเซสชันและ TUI สำหรับค้นหาเท่านั้น
- ไม่รวมเซิร์ฟเวอร์ซิงก์, Atuin AI, ตัวจัดการ dotfiles, ตัวจัดการสคริปต์ และ KV store
- ไม่ได้ใช้ฟังก์ชันซิงก์ด้วย เพราะการตั้งค่าและคำสั่งที่รันแตกต่างกันมากในแต่ละเครื่อง
- โปรเจกต์เขียนด้วย Go ประมาณ 400 บรรทัด โดยสัดส่วนภาษาของ repository คือ Go 82.5% และ Nix 17.5%
- ชื่อนี้มาจาก
stinkpotซึ่งเป็นเต่าขนาดเล็กชนิดหนึ่ง - เพื่อเพิ่มความเร็วในการค้นหาแบบย้อนกลับ แผนการรันของ SQLite ใช้ covering index แทน B-tree ชั่วคราวสำหรับการเรียงลำดับ
การติดตั้งและการค้นหาประวัติ
- หาก build จากซอร์ส ให้ใช้คำสั่งต่อไปนี้
go build -o stinkpot .
- ผู้ใช้ NixOS home-manager สามารถนำเข้าโมดูล
homeManagerModules.defaultที่มีให้ได้ - ในสภาพแวดล้อมอื่น ให้เพิ่มคำสั่งเริ่มต้นต่อไปนี้ใน
.bashrc
eval "$(stinkpot init)"
- นำเข้าประวัติ Bash เดิมด้วยคำสั่งต่อไปนี้
stinkpot import
- เมื่อกด
Ctrl+Rใน shell จะเปิด TUI สำหรับค้นหา- เลื่อนด้วย
↑·↓และเลือกด้วยTabหรือEnter - หลังเลือกแล้ว กด
Enterอีกครั้งเพื่อรันคำสั่ง - ยกเลิกด้วย
Esc
- เลื่อนด้วย
- DB ประวัติเก็บไว้ที่
~/.local/share/stinkpot- หาก DB เสียหลังอัปเกรด ให้ลบไฟล์แล้วรัน
stinkpot importใหม่
- หาก DB เสียหลังอัปเกรด ให้ลบไฟล์แล้วรัน
1 ความคิดเห็น
ความเห็นจาก Lobste.rs
?ผิดลงไปในพรอมป์ต์ แล้วเห็น Atuin ถามว่าจะเปิดใช้ โหมด AI ไหม ก็เลยตระหนักได้ว่ามันบวมขึ้นขนาดไหนขอไม่เอาดีกว่า ขอบคุณที่แนะนำ ตอนนี้เลยย้ายมาใช้ stinkpot แล้ว
โดยเฉพาะอย่างยิ่งที่ทำไบนารีแบบ static ขนาดเล็กเรียบง่ายได้ด้วย โค้ด Go 400 บรรทัด ชอบมาก Go เป็นภาษาที่ดีมากโดยรวม และตั้งใจจะลองใช้ stinkpot ด้วย
ใช้ hstr มาประมาณ 15 ปีแล้ว และช่วงหลังก็กำลังย้ายไปใช้ fzf แม้จะชอบ SQLite มาก แต่ไม่เข้าใจว่าจำเป็นกับงานนี้เพราะอะไร
ไฟล์ประวัติปกติไม่ได้มีโครงสร้าง แต่ใน SQLite สามารถเก็บข้อมูลอย่างรหัสออกจากโปรแกรมและเวลาที่จบการทำงานได้ และยังจัดการอย่างลบรายการซ้ำตอนแทรก หรืออัปเดตเวลาเรียกใช้เมื่อรันคำสั่งเดิมซ้ำ ได้อย่างรวดเร็ว
ในทางทฤษฎีอาจฝืนกู้บริบทจากประวัติคำสั่งได้ แต่ถ้าค้นประวัติเชลล์แยกตามไดเรกทอรีโปรเจ็กต์ได้เร็ว ๆ ก็น่าจะมีประโยชน์มาก
ถึงอย่างนั้นข้อดีคือมันยังทำงานได้ดี เพียงแต่มีโอกาสสูงว่าผมไม่ได้อัปเดตมันมานานแล้ว
cwdได้ไหม เหตุผลเดียวที่ยังใช้ Atuin อยู่คือมันใช้ไดเรกทอรีเป็นบริบทของประวัติคำสั่งได้หลัง
cdเข้าโปรเจ็กต์แล้วก็ทำงานต่อจากจุดที่ค้างไว้ได้ทันที และมีประโยชน์มากโดยเฉพาะเวลาจะรันคำสั่งยาว ๆ ที่มีพารามิเตอร์เยอะซ้ำอีกครั้งcwdได้เฉพาะ คำสั่งที่รันหลังติดตั้ง stinkpot เท่านั้น เพราะในbash_historyปกติไม่มีข้อมูลนี้ถ้าไม่มีปัญหา ผมอยากเพิ่มไลเซนส์โอเพนซอร์สแล้วนำไปผนวกรวมกับ experimental oils readline หลังทำ dynamic widget ให้เสร็จแล้ว หนึ่งใน TODO ลำดับต้น ๆ ที่จะทำต่อคือเรื่องประวัติคำสั่ง
แม้จะไม่บ่อย แต่ก็มีบางครั้งที่ต้องลบบางบรรทัดออกจากประวัติเชลล์ และในวิธีเดิมก็แค่เปิด
bash_historyแล้วลบบรรทัดนั้นได้เลย เลยอยากรู้ว่า stinkpot มี คำสั่งลบประวัติ หรือไม่นอกเหนือจากกรณีใช้งานเฉพาะทางแบบนี้แล้ว ตัวโปรเจ็กต์เองก็ดูน่าสนใจมาก