Add command history and cycling
Aerc will keep track of the previous 1000 commands, which the user can cycle through using the arrow keys while in the ex-line. Pressing up will move backwards in history while pressing down will move forward.
This commit is contained in:
parent
67fb0938a6
commit
8635c70fda
7 changed files with 113 additions and 8 deletions
commands
62
commands/history.go
Normal file
62
commands/history.go
Normal file
|
@ -0,0 +1,62 @@
|
|||
package commands
|
||||
|
||||
type cmdHistory struct {
|
||||
// rolling buffer of prior commands
|
||||
//
|
||||
// most recent command is at the end of the list,
|
||||
// least recent is index 0
|
||||
cmdList []string
|
||||
|
||||
// current placement in list
|
||||
current int
|
||||
}
|
||||
|
||||
// number of commands to keep in history
|
||||
const cmdLimit = 1000
|
||||
|
||||
// CmdHistory is the history of executed commands
|
||||
var CmdHistory = cmdHistory{}
|
||||
|
||||
func (h *cmdHistory) Add(cmd string) {
|
||||
// if we're at cap, cut off the first element
|
||||
if len(h.cmdList) >= cmdLimit {
|
||||
h.cmdList = h.cmdList[1:]
|
||||
}
|
||||
|
||||
h.cmdList = append(h.cmdList, cmd)
|
||||
|
||||
// whenever we add a new command, reset the current
|
||||
// pointer to the "beginning" of the list
|
||||
h.Reset()
|
||||
}
|
||||
|
||||
// Prev returns the previous command in history.
|
||||
// Since the list is reverse-order, this will return elements
|
||||
// increasingly towards index 0.
|
||||
func (h *cmdHistory) Prev() string {
|
||||
if h.current <= 0 || len(h.cmdList) == 0 {
|
||||
h.current = -1
|
||||
return "(Already at beginning)"
|
||||
}
|
||||
h.current--
|
||||
|
||||
return h.cmdList[h.current]
|
||||
}
|
||||
|
||||
// Next returns the next command in history.
|
||||
// Since the list is reverse-order, this will return elements
|
||||
// increasingly towards index len(cmdList).
|
||||
func (h *cmdHistory) Next() string {
|
||||
if h.current >= len(h.cmdList)-1 || len(h.cmdList) == 0 {
|
||||
h.current = len(h.cmdList)
|
||||
return "(Already at end)"
|
||||
}
|
||||
h.current++
|
||||
|
||||
return h.cmdList[h.current]
|
||||
}
|
||||
|
||||
// Reset the current pointer to the beginning of history.
|
||||
func (h *cmdHistory) Reset() {
|
||||
h.current = len(h.cmdList)
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue