summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSimon Roberts <lyricnz@users.noreply.github.com>2021-10-12 17:11:14 +1100
committerGitHub <noreply@github.com>2021-10-12 17:11:14 +1100
commite409a0bddee50cd4015357959d706a7aa7f8aeef (patch)
treeb5d011a5599266d7b0c5c14452d8ad36916548c7
parentda06d5ef1446eb99ad4a4c3df0a96ea29a0a0f84 (diff)
Improvements to search mechanism (#216)
* Enable repeated search using empty search expression (`/` then `<enter>`) * Quick note about how to repeat-search in the FAQ
-rw-r--r--cointop/cointop.go1
-rw-r--r--cointop/search.go25
-rw-r--r--docs/content/faq.md1
3 files changed, 24 insertions, 3 deletions
diff --git a/cointop/cointop.go b/cointop/cointop.go
index 2f08e1f..4b15410 100644
--- a/cointop/cointop.go
+++ b/cointop/cointop.go
@@ -69,6 +69,7 @@ type State struct {
refreshRate time.Duration
running bool
searchFieldVisible bool
+ lastSearchQuery string
selectedCoin *Coin
selectedChartRange string
selectedView string
diff --git a/cointop/search.go b/cointop/search.go
index 9643cce..dd06844 100644
--- a/cointop/search.go
+++ b/cointop/search.go
@@ -66,7 +66,7 @@ func (ct *Cointop) DoSearch() error {
if n == 0 {
return nil
}
- q := string(b)
+ q := strings.TrimSpace(string(b[:n]))
// remove slash
regex := regexp.MustCompile(`/(.*)`)
matches := regex.FindStringSubmatch(q)
@@ -78,13 +78,32 @@ func (ct *Cointop) DoSearch() error {
// Search performs the search and filtering
func (ct *Cointop) Search(q string) error {
- log.Debug("Search()")
+ log.Debugf("Search(%s)", q)
+
+ // If there are no coins, return no result
+ if len(ct.State.coins) == 0 {
+ return nil
+ }
+
+ // If search term is empty, use the previous search term.
q = strings.TrimSpace(strings.ToLower(q))
+ if q == "" {
+ q = ct.State.lastSearchQuery
+ } else {
+ ct.State.lastSearchQuery = q
+ }
+
idx := -1
min := -1
var hasprefixidx []int
var hasprefixdist []int
- for i := range ct.State.allCoins {
+
+ // Start the search from the current position (+1), looking names that start with the search term, or symbols that match completely
+ currentIndex := ct.GetGlobalCoinIndex(ct.HighlightedRowCoin()) + 1
+ if ct.IsLastPage() && ct.IsLastRow() {
+ currentIndex = 0
+ }
+ for i := currentIndex; i < len(ct.State.allCoins); i++ {
coin := ct.State.allCoins[i]
name := strings.ToLower(coin.Name)
symbol := strings.ToLower(coin.Symbol)
diff --git a/docs/content/faq.md b/docs/content/faq.md
index 8a700a2..1ee7e20 100644
--- a/docs/content/faq.md
+++ b/docs/content/faq.md
@@ -132,6 +132,7 @@ draft: false
## How do I search?
The default key to open search is <kbd>/</kbd>. Type the search query after the `/` in the field and hit <kbd>Enter</kbd>.
+ Each search starts from the current cursor position. To search for the same term again, hit <kbd>/</kbd> then <kbd>Enter</kbd>.
## How do I exit search?