1
0
قرینه از https://github.com/quitesimpleorg/hs9001.git synced 2025-07-08 10:54:56 +02:00

2 کامیت‌ها

مولف SHA1 پیام تاریخ
3a6a1b2aa9 bash-ctrlr: Improve reverse bash search performance
Remove hack that only starts searching when two chars have been entered

Improve performance by adding LIMIT clause instead.
2021-08-19 21:33:01 +02:00
1a6c75cea9 Improve README.md 2021-08-08 13:24:30 +02:00
3فایلهای تغییر یافته به همراه60 افزوده شده و 35 حذف شده

مشاهده پرونده

@ -2,15 +2,33 @@
hs9001 (history search 9001) is an easy, quite simple bash history enhancement. It simply writes all hs9001 (history search 9001) is an easy, quite simple bash history enhancement. It simply writes all
your bash commands into an sqlite database. You can then search this database. your bash commands into an sqlite database. You can then search this database.
It improves over bash's built-in history mechanism as it'll aggregate the shell history of all open shells,
timestamp them and also record additional information such as the directory a command was executed in.
## Usage / Examples
### Search
```
hs [search terms]
```
You can further filter with options like `-cwd`, `-after` and so on...
For a full list, see `-help`.
```
hs -cwd .
```
Lists all commands ever entered in this directory
```
hs -after yesterday -cwd . git
```
Lists all git commands in the current directory which have been entered today.
Also, it (by default) replaces bash's built-in CTRL-R mechanism, so hs9001's database will be used instead
of bash's limited history files.
## Install ## Install
### From source
```
go build
#move hs9001 to a PATH location
```
### Debian / Ubuntu ### Debian / Ubuntu
Latest release can be installed using apt Latest release can be installed using apt
``` ```
@ -28,31 +46,26 @@ apk update
apk add hs9001 apk add hs9001
``` ```
### From source
```
go build
#move hs9001 to a PATH location
```
### Setup / Config ## Setup / Config
Add this to .bashrc Add this to .bashrc
``` ```
eval "$(hs9001 bash-enable)" eval "$(hs9001 bash-enable)"
``` ```
This will also create a `hs`alias so you have to type less in everyday usage.
By default, every system user gets his own database. You can override this by setting the environment variable By default, every system user gets his own database. You can override this by setting the environment variable
for all users that should write to your unified database. for all users that should write to your unified database.
``` ```
export HS9001_DB_PATH="/home/db/history.sqlite" export HS9001_DB_PATH="/home/db/history.sqlite"
``` ```
## Usage
### Search
```
hs9001 search [search terms]
```
It is recommended to create an alias for search to make life easier, e. g.:
```
alias searchh='hs9001 search'
```

مشاهده پرونده

@ -12,16 +12,15 @@ type history struct {
} }
func (h *history) GetHistoryByPrefix(prefix string) (ph []string) { func (h *history) GetHistoryByPrefix(prefix string) (ph []string) {
/* Hack for performance reasons */
if len(prefix) < 2 {
return
}
opts := searchopts{} opts := searchopts{}
opts.order = "DESC" o := "DESC"
opts.order = &o
lim := 100
opts.limit = &lim
cmdqry := prefix + "%" cmdqry := prefix + "%"
opts.command = &cmdqry opts.command = &cmdqry
results := search(h.conn, opts) results := search(h.conn, opts)
for e := results.Front(); e != nil; e = e.Next() { for e := results.Back(); e != nil; e = e.Prev() {
entry, ok := e.Value.(*HistoryEntry) entry, ok := e.Value.(*HistoryEntry)
if !ok { if !ok {
log.Panic("Failed to retrieve entries") log.Panic("Failed to retrieve entries")
@ -31,16 +30,15 @@ func (h *history) GetHistoryByPrefix(prefix string) (ph []string) {
return return
} }
func (h *history) GetHistoryByPattern(pattern string) (ph []string, pos []int) { func (h *history) GetHistoryByPattern(pattern string) (ph []string, pos []int) {
/* Hack for performance reasons */
if len(pattern) < 2 {
return
}
opts := searchopts{} opts := searchopts{}
opts.order = "DESC" o := "DESC"
opts.order = &o
lim := 100
opts.limit = &lim
cmdqry := "%" + pattern + "%" cmdqry := "%" + pattern + "%"
opts.command = &cmdqry opts.command = &cmdqry
results := search(h.conn, opts) results := search(h.conn, opts)
for e := results.Front(); e != nil; e = e.Next() { for e := results.Back(); e != nil; e = e.Prev() {
entry, ok := e.Value.(*HistoryEntry) entry, ok := e.Value.(*HistoryEntry)
if !ok { if !ok {
log.Panic("Failed to retrieve entries") log.Panic("Failed to retrieve entries")

20
main.go
مشاهده پرونده

@ -157,7 +157,8 @@ type searchopts struct {
after *time.Time after *time.Time
before *time.Time before *time.Time
retval *int retval *int
order string order *string
limit *int
} }
func search(conn *sql.DB, opts searchopts) list.List { func search(conn *sql.DB, opts searchopts) list.List {
@ -188,7 +189,18 @@ func search(conn *sql.DB, opts searchopts) list.List {
args = append(args, opts.retval) args = append(args, opts.retval)
} }
sb.WriteString("ORDER BY timestamp ") sb.WriteString("ORDER BY timestamp ")
sb.WriteString("ASC ") if opts.order != nil {
sb.WriteString(*opts.order)
sb.WriteRune(' ')
} else {
sb.WriteString("ASC ")
}
if opts.limit != nil {
sb.WriteString("LIMIT ")
sb.WriteString(strconv.Itoa(*opts.limit))
sb.WriteRune(' ')
}
queryStmt := sb.String() queryStmt := sb.String()
@ -309,6 +321,7 @@ func main() {
PROMPT_COMMAND='hs9001 add -ret $? "$(history 1)"' PROMPT_COMMAND='hs9001 add -ret $? "$(history 1)"'
bind -x '"\C-r": " READLINE_LINE=$(hs9001 bash-ctrlr 3>&1 1>&2 2>&3) READLINE_POINT=0"' bind -x '"\C-r": " READLINE_LINE=$(hs9001 bash-ctrlr 3>&1 1>&2 2>&3) READLINE_POINT=0"'
fi fi
alias hs='hs9001 search'
`) `)
case "bash-disable": case "bash-disable":
fmt.Printf("unset PROMPT_COMMAND\n") fmt.Printf("unset PROMPT_COMMAND\n")
@ -352,7 +365,8 @@ func main() {
q := strings.Join(args, " ") q := strings.Join(args, " ")
opts := searchopts{} opts := searchopts{}
opts.order = "ASC" o := "ASC"
opts.order = &o
if q != "" { if q != "" {
cmd := "%" + q + "%" cmd := "%" + q + "%"
opts.command = &cmd opts.command = &cmd