tükörképe a:
https://github.com/quitesimpleorg/hs9001.git
synced 2025-07-12 23:34:57 +02:00
Commitok összehasonlítása
2 Commit-ok
3a6a1b2aa9
...
WIP/liner
Szerző | SHA1 | Dátum | |
---|---|---|---|
6e4ed9a1cd | |||
26ababc93e |
53
README.md
53
README.md
@ -2,33 +2,15 @@
|
|||||||
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
|
||||||
```
|
```
|
||||||
@ -46,26 +28,31 @@ 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'
|
||||||
|
```
|
||||||
|
|
||||||
|
14
history.go
14
history.go
@ -13,14 +13,11 @@ type history struct {
|
|||||||
|
|
||||||
func (h *history) GetHistoryByPrefix(prefix string) (ph []string) {
|
func (h *history) GetHistoryByPrefix(prefix string) (ph []string) {
|
||||||
opts := searchopts{}
|
opts := searchopts{}
|
||||||
o := "DESC"
|
opts.order = "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.Back(); e != nil; e = e.Prev() {
|
for e := results.Front(); e != nil; e = e.Next() {
|
||||||
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,14 +28,11 @@ func (h *history) GetHistoryByPrefix(prefix string) (ph []string) {
|
|||||||
}
|
}
|
||||||
func (h *history) GetHistoryByPattern(pattern string) (ph []string, pos []int) {
|
func (h *history) GetHistoryByPattern(pattern string) (ph []string, pos []int) {
|
||||||
opts := searchopts{}
|
opts := searchopts{}
|
||||||
o := "DESC"
|
opts.order = "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.Back(); e != nil; e = e.Prev() {
|
for e := results.Front(); e != nil; e = e.Next() {
|
||||||
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
20
main.go
@ -157,8 +157,7 @@ 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 {
|
||||||
@ -189,18 +188,7 @@ 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 ")
|
||||||
if opts.order != nil {
|
sb.WriteString("ASC ")
|
||||||
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()
|
||||||
|
|
||||||
@ -321,7 +309,6 @@ 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")
|
||||||
@ -365,8 +352,7 @@ func main() {
|
|||||||
q := strings.Join(args, " ")
|
q := strings.Join(args, " ")
|
||||||
|
|
||||||
opts := searchopts{}
|
opts := searchopts{}
|
||||||
o := "ASC"
|
opts.order = "ASC"
|
||||||
opts.order = &o
|
|
||||||
if q != "" {
|
if q != "" {
|
||||||
cmd := "%" + q + "%"
|
cmd := "%" + q + "%"
|
||||||
opts.command = &cmd
|
opts.command = &cmd
|
||||||
|
Reference in New Issue
Block a user