From a422a86e69ecc8967831f4e9bed6628557084a9b Mon Sep 17 00:00:00 2001 From: Viktor Varland Date: Mon, 16 Feb 2026 20:15:07 +0100 Subject: [PATCH] feat: tilde for homedir, add reverse sort --- README.md | 8 +++++--- internal/add/add.go | 7 ++++++- internal/search/search.go | 17 +++++++++++++---- 3 files changed, 24 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 5129619..7fd297e 100644 --- a/README.md +++ b/README.md @@ -56,11 +56,13 @@ hs() { esac ;; esac + local strip='awk -F" " "{OFS=\" \"; \$4=\"\"; gsub(/ +/,\" \"); print}"' + local entry="$( - verbatim search "$@" | \ + verbatim search --reverse "$@" | eval $strip | \ fzf --ansi --disabled --query "${*:-}" \ - --bind "start:reload:verbatim search {q}" \ - --bind "change:reload:sleep 0.1; verbatim search {q} || true" \ + --bind "start:reload:verbatim search --reverse {q} | $strip" \ + --bind "change:reload:sleep 0.1; verbatim search --reverse {q} | $strip || true" \ --delimiter ' ' )" diff --git a/internal/add/add.go b/internal/add/add.go index 4fbe32a..aa9422e 100644 --- a/internal/add/add.go +++ b/internal/add/add.go @@ -25,9 +25,14 @@ func Run(d *sql.DB, args []string) error { return nil } + wd := *dir + if home, err := os.UserHomeDir(); err == nil && home != "" { + wd = strings.Replace(wd, home, "~", 1) + } + _, err := d.Exec( `INSERT OR IGNORE INTO history (timestamp, hostname, working_dir, command) VALUES (?, ?, ?, ?)`, - *timestamp, *hostname, *dir, command, + *timestamp, *hostname, wd, command, ) return err } diff --git a/internal/search/search.go b/internal/search/search.go index d56f4de..d55c7c9 100644 --- a/internal/search/search.go +++ b/internal/search/search.go @@ -5,6 +5,7 @@ import ( "flag" "fmt" "strings" + "time" ) func Run(d *sql.DB, args []string) error { @@ -14,6 +15,7 @@ func Run(d *sql.DB, args []string) error { after := fs.String("after", "", "filter entries after timestamp") before := fs.String("before", "", "filter entries before timestamp") limit := fs.Int("limit", 10000, "max results") + reverse := fs.Bool("reverse", false, "newest first") fs.Parse(args) query := strings.Join(fs.Args(), " ") @@ -49,7 +51,11 @@ func Run(d *sql.DB, args []string) error { inner += " ORDER BY timestamp DESC LIMIT ?" params = append(params, *limit) - q := "SELECT * FROM (" + inner + ") ORDER BY timestamp ASC" + outerOrder := "ASC" + if *reverse { + outerOrder = "DESC" + } + q := "SELECT * FROM (" + inner + ") ORDER BY timestamp " + outerOrder rows, err := d.Query(q, params...) if err != nil { @@ -58,11 +64,14 @@ func Run(d *sql.DB, args []string) error { defer rows.Close() for rows.Next() { - var ts, h, dir, cmd string - if err := rows.Scan(&ts, &h, &dir, &cmd); err != nil { + var ts, h, wd, cmd string + if err := rows.Scan(&ts, &h, &wd, &cmd); err != nil { return err } - fmt.Printf("%s %s %s %s\n", ts, h, dir, cmd) + if t, err := time.Parse(time.RFC3339, ts); err == nil { + ts = t.Format("2006-01-02 15:04") + } + fmt.Printf("%s %s %s %s\n", ts, h, wd, cmd) } return rows.Err() }