1 คะแนน โดย GN⁺ 2 시간 전 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • 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 ใหม่

1 ความคิดเห็น

 
GN⁺ 2 시간 전
ความเห็นจาก Lobste.rs
  • สัปดาห์นี้พิมพ์ ? ผิดลงไปในพรอมป์ต์ แล้วเห็น Atuin ถามว่าจะเปิดใช้ โหมด AI ไหม ก็เลยตระหนักได้ว่ามันบวมขึ้นขนาดไหน
    ขอไม่เอาดีกว่า ขอบคุณที่แนะนำ ตอนนี้เลยย้ายมาใช้ stinkpot แล้ว
  • เคยลำบากเพราะทำประวัติคำสั่งเชลล์หาย เลยชอบโปรเจ็กต์นี้มาก เคยใช้ atuin.sh เหมือนกันแต่ไม่ค่อยประทับใจ
    โดยเฉพาะอย่างยิ่งที่ทำไบนารีแบบ static ขนาดเล็กเรียบง่ายได้ด้วย โค้ด Go 400 บรรทัด ชอบมาก Go เป็นภาษาที่ดีมากโดยรวม และตั้งใจจะลองใช้ stinkpot ด้วย
  • สงสัยว่าการใช้ SQLite ตรงนี้ดีกว่าเครื่องมือที่อ่านไฟล์ประวัติโดยตรงอย่าง hstr หรือ fzf อย่างไร
    ใช้ hstr มาประมาณ 15 ปีแล้ว และช่วงหลังก็กำลังย้ายไปใช้ fzf แม้จะชอบ SQLite มาก แต่ไม่เข้าใจว่าจำเป็นกับงานนี้เพราะอะไร
    • ถ้าตั้งให้ Bash เขียนประวัติลงไฟล์ทุกครั้งหลังรันคำสั่ง ก็ทำอะไรคล้ายกันได้ด้วย fzf อย่างเดียว
      ไฟล์ประวัติปกติไม่ได้มีโครงสร้าง แต่ใน SQLite สามารถเก็บข้อมูลอย่างรหัสออกจากโปรแกรมและเวลาที่จบการทำงานได้ และยังจัดการอย่างลบรายการซ้ำตอนแทรก หรืออัปเดตเวลาเรียกใช้เมื่อรันคำสั่งเดิมซ้ำ ได้อย่างรวดเร็ว
    • ผมนึกถึงการเก็บและทำดัชนี ไดเรกทอรีทำงานปัจจุบัน ของแต่ละรายการในประวัติ
      ในทางทฤษฎีอาจฝืนกู้บริบทจากประวัติคำสั่งได้ แต่ถ้าค้นประวัติเชลล์แยกตามไดเรกทอรีโปรเจ็กต์ได้เร็ว ๆ ก็น่าจะมีประโยชน์มาก
  • น่าลองใช้แน่นอน Atuin กลายเป็น สวนสัตว์ฟีเจอร์ ที่เต็มไปด้วยความสามารถซึ่งแทบไม่สนใจแล้ว
    ถึงอย่างนั้นข้อดีคือมันยังทำงานได้ดี เพียงแต่มีโอกาสสูงว่าผมไม่ได้อัปเดตมันมานานแล้ว
    • รู้จัก Atuin มานานแล้ว แต่เพิ่งได้ลองใช้ครั้งแรกในสัปดาห์นี้ ถ้ายังเป็นไปตามกระแสนี้ อีกไม่นานมันคง เริ่มอ่านอีเมลด้วย
  • ดูยอดเยี่ยมมาก แต่อยากรู้ว่าสามารถกรองประวัติตาม cwd ได้ไหม เหตุผลเดียวที่ยังใช้ Atuin อยู่คือมันใช้ไดเรกทอรีเป็นบริบทของประวัติคำสั่งได้
    หลัง cd เข้าโปรเจ็กต์แล้วก็ทำงานต่อจากจุดที่ค้างไว้ได้ทันที และมีประโยชน์มากโดยเฉพาะเวลาจะรันคำสั่งยาว ๆ ที่มีพารามิเตอร์เยอะซ้ำอีกครั้ง
    • fish มีฟีเจอร์นี้มาให้ในตัว และมีประโยชน์มาก
    • ส่วนตัวไม่ใช่พฤติกรรมที่ผมชอบ แต่สามารถทำได้ภายใต้ข้อจำกัดอย่างหนึ่ง: จะบันทึก cwd ได้เฉพาะ คำสั่งที่รันหลังติดตั้ง stinkpot เท่านั้น เพราะใน bash_history ปกติไม่มีข้อมูลนี้
  • ถ้าอยากให้คนอื่นใช้งานโค้ดได้อย่างสบายใจ ควรเพิ่ม ไลเซนส์ ให้โปรเจ็กต์
    ถ้าไม่มีปัญหา ผมอยากเพิ่มไลเซนส์โอเพนซอร์สแล้วนำไปผนวกรวมกับ experimental oils readline หลังทำ dynamic widget ให้เสร็จแล้ว หนึ่งใน TODO ลำดับต้น ๆ ที่จะทำต่อคือเรื่องประวัติคำสั่ง
  • สงสัยว่าลบคำสั่งออกจากประวัติได้ง่ายแค่ไหน ต้องลบแถวในฐานข้อมูล SQLite ด้วย SQL ตรง ๆ หรือเปล่า
    แม้จะไม่บ่อย แต่ก็มีบางครั้งที่ต้องลบบางบรรทัดออกจากประวัติเชลล์ และในวิธีเดิมก็แค่เปิด bash_history แล้วลบบรรทัดนั้นได้เลย เลยอยากรู้ว่า stinkpot มี คำสั่งลบประวัติ หรือไม่
    นอกเหนือจากกรณีใช้งานเฉพาะทางแบบนี้แล้ว ตัวโปรเจ็กต์เองก็ดูน่าสนใจมาก