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 /. Type the search query after the `/` in the field and hit Enter. + Each search starts from the current cursor position. To search for the same term again, hit / then Enter. ## How do I exit search?