1
0
şunun yansıması https://github.com/quitesimpleorg/hs9001.git eşitlendi 2025-01-07 10:13:44 +01:00

İşlemeleri karşılaştır

..

Ortak bir işleme yok. "ebcdfa5ff4a62a485cd761fdd7335dd2c95ad5ef" ve "3a6a1b2aa949ab97c165b116aab190f2eb77fdc3" tamamen farklı geçmişlere sahip.

4 değiştirilmiş dosya ile 30 ekleme ve 100 silme

Dosyayı Görüntüle

@ -2,10 +2,8 @@ package main
import (
"database/sql"
"hs9001/liner"
"io"
"log"
"path/filepath"
"strings"
)
@ -13,32 +11,14 @@ type history struct {
conn *sql.DB
}
func createSearchOpts(query string, mode int) searchopts {
func (h *history) GetHistoryByPrefix(prefix string) (ph []string) {
opts := searchopts{}
o := "DESC"
opts.order = &o
lim := 100
opts.limit = &lim
opts.command = &query
switch mode {
case liner.ModeGlobal:
break
case liner.ModeWorkdir:
workdir, err := filepath.Abs(".")
if err != nil {
panic(err)
}
opts.workdir = &workdir
default:
panic("Invalid mode supplied")
}
return opts
}
func (h *history) GetHistoryByPrefix(prefix string, mode int) (ph []string) {
cmdquery := prefix + "%"
opts := createSearchOpts(cmdquery, mode)
cmdqry := prefix + "%"
opts.command = &cmdqry
results := search(h.conn, opts)
for e := results.Back(); e != nil; e = e.Prev() {
entry, ok := e.Value.(*HistoryEntry)
@ -49,11 +29,14 @@ func (h *history) GetHistoryByPrefix(prefix string, mode int) (ph []string) {
}
return
}
func (h *history) GetHistoryByPattern(pattern string, mode int) (ph []string, pos []int) {
cmdquery := "%" + pattern + "%"
opts := createSearchOpts(cmdquery, mode)
func (h *history) GetHistoryByPattern(pattern string) (ph []string, pos []int) {
opts := searchopts{}
o := "DESC"
opts.order = &o
lim := 100
opts.limit = &lim
cmdqry := "%" + pattern + "%"
opts.command = &cmdqry
results := search(h.conn, opts)
for e := results.Back(); e != nil; e = e.Prev() {
entry, ok := e.Value.(*HistoryEntry)

Dosyayı Görüntüle

@ -37,8 +37,8 @@ type HistoryProvider interface {
WriteHistory(w io.Writer) (num int, err error)
AppendHistory(item string)
ClearHistory()
GetHistoryByPrefix(prefix string, mode int) (ph []string)
GetHistoryByPattern(pattern string, mode int) (ph []string, pos []int)
GetHistoryByPrefix(prefix string) (ph []string)
GetHistoryByPattern(pattern string) (ph []string, pos []int)
RLock()
RUnlock()
}
@ -95,11 +95,11 @@ func (s *State) AppendHistory(item string) {
func (s *State) ClearHistory() {
s.historyProvider.ClearHistory()
}
func (s *State) getHistoryByPrefix(prefix string, mode int) (ph []string) {
return s.historyProvider.GetHistoryByPrefix(prefix, mode)
func (s *State) getHistoryByPrefix(prefix string) (ph []string) {
return s.historyProvider.GetHistoryByPrefix(prefix)
}
func (s *State) getHistoryByPattern(pattern string, mode int) (ph []string, pos []int) {
return s.historyProvider.GetHistoryByPattern(pattern, mode)
func (s *State) getHistoryByPattern(pattern string) (ph []string, pos []int) {
return s.historyProvider.GetHistoryByPattern(pattern)
}
// SetHistoryProvider allows you to set a custom provider

Dosyayı Görüntüle

@ -90,11 +90,6 @@ const (
tabReverse
)
const (
ModeGlobal = iota
ModeWorkdir
)
func (s *State) refresh(prompt []rune, buf []rune, pos int) error {
if s.columns == 0 {
return ErrInternal
@ -416,26 +411,8 @@ func (s *State) tabComplete(p []rune, line []rune, pos int) ([]rune, int, interf
// reverse intelligent search, implements a bash-like history search.
func (s *State) reverseISearch(origLine []rune, origPos int) ([]rune, int, interface{}, error) {
modeSelect := false
currentMode := ModeGlobal
getPrompt := func(arg string) string {
prompt := ""
switch currentMode {
case ModeWorkdir:
prompt = "(reverse:cwd)`%s': "
case ModeGlobal:
prompt = "(reverse:global)`%s': "
default:
panic("Invalid mode")
}
if modeSelect {
prompt = "(select mode)`%s': "
}
return fmt.Sprintf(prompt, arg)
}
err := s.refresh([]rune(getPrompt("")), origLine, origPos)
p := "(reverse-i-search)`': "
err := s.refresh([]rune(p), origLine, origPos)
if err != nil {
return origLine, origPos, rune(esc), err
}
@ -449,10 +426,11 @@ func (s *State) reverseISearch(origLine []rune, origPos int) ([]rune, int, inter
getLine := func() ([]rune, []rune, int) {
search := string(line)
return []rune(getPrompt(search)), []rune(foundLine), foundPos
prompt := "(reverse-i-search)`%s': "
return []rune(fmt.Sprintf(prompt, search)), []rune(foundLine), foundPos
}
history, positions := s.getHistoryByPattern(string(line), currentMode)
history, positions := s.getHistoryByPattern(string(line))
historyPos := len(history) - 1
for {
@ -472,8 +450,6 @@ func (s *State) reverseISearch(origLine []rune, origPos int) ([]rune, int, inter
} else {
s.doBeep()
}
case ctrlA:
modeSelect = true
case ctrlS: // Search forward
if historyPos < len(history)-1 && historyPos >= 0 {
historyPos++
@ -491,7 +467,7 @@ func (s *State) reverseISearch(origLine []rune, origPos int) ([]rune, int, inter
pos -= n
// For each char deleted, display the last matching line of history
history, positions := s.getHistoryByPattern(string(line), currentMode)
history, positions := s.getHistoryByPattern(string(line))
historyPos = len(history) - 1
if len(history) > 0 {
foundLine = history[historyPos]
@ -504,28 +480,17 @@ func (s *State) reverseISearch(origLine []rune, origPos int) ([]rune, int, inter
case ctrlG: // Cancel
return origLine, origPos, rune(esc), err
case tab, cr, lf, ctrlB, ctrlD, ctrlE, ctrlF, ctrlK,
case tab, cr, lf, ctrlA, ctrlB, ctrlD, ctrlE, ctrlF, ctrlK,
ctrlL, ctrlN, ctrlO, ctrlP, ctrlQ, ctrlT, ctrlU, ctrlV, ctrlW, ctrlX, ctrlY, ctrlZ:
fallthrough
case 0, ctrlC, esc, 28, 29, 30, 31:
return []rune(foundLine), foundPos, next, err
default:
if modeSelect {
switch v {
case 'g':
currentMode = ModeGlobal
case 'w':
currentMode = ModeWorkdir
}
modeSelect = false
break
}
line = append(line[:pos], append([]rune{v}, line[pos:]...)...)
pos++
// For each keystroke typed, display the last matching line of history
history, positions = s.getHistoryByPattern(string(line), currentMode)
history, positions = s.getHistoryByPattern(string(line))
historyPos = len(history) - 1
if len(history) > 0 {
foundLine = history[historyPos]
@ -761,7 +726,7 @@ mainLoop:
case ctrlP: // up
historyAction = true
if historyStale {
historyPrefix = s.getHistoryByPrefix(string(line), ModeGlobal)
historyPrefix = s.getHistoryByPrefix(string(line))
historyPos = len(historyPrefix)
historyStale = false
}
@ -779,7 +744,7 @@ mainLoop:
case ctrlN: // down
historyAction = true
if historyStale {
historyPrefix = s.getHistoryByPrefix(string(line), ModeGlobal)
historyPrefix = s.getHistoryByPrefix(string(line))
historyPos = len(historyPrefix)
historyStale = false
}
@ -947,7 +912,7 @@ mainLoop:
case up:
historyAction = true
if historyStale {
historyPrefix = s.getHistoryByPrefix(string(line), ModeGlobal)
historyPrefix = s.getHistoryByPrefix(string(line))
historyPos = len(historyPrefix)
historyStale = false
}
@ -964,7 +929,7 @@ mainLoop:
case down:
historyAction = true
if historyStale {
historyPrefix = s.getHistoryByPrefix(string(line), ModeGlobal)
historyPrefix = s.getHistoryByPrefix(string(line))
historyPos = len(historyPrefix)
historyStale = false
}

20
main.go
Dosyayı Görüntüle

@ -398,31 +398,13 @@ func main() {
results := search(conn, opts)
previousCmd := ""
fi, err := os.Stdout.Stat()
if err != nil {
panic(err)
}
//Don't print colors if output is piped
printColors := true
if (fi.Mode() & os.ModeCharDevice) == 0 {
printColors = false
}
for e := results.Front(); e != nil; e = e.Next() {
entry, ok := e.Value.(*HistoryEntry)
if !ok {
log.Panic("Failed to retrieve entries")
}
if !distinct || previousCmd != entry.cmd {
prefix := ""
postfix := ""
if printColors && entry.retval != 0 {
prefix = "\033[38;5;88m"
postfix = "\033[0m"
}
fmt.Printf("%s%s%s\n", prefix, entry.cmd, postfix)
fmt.Printf("%s\n", entry.cmd)
}
previousCmd = entry.cmd
}