+// UpHistory fetches the previous item in the history
+func (m *Messenger) UpHistory(history []string) {
+ if m.historyNum > 0 {
+ m.historyNum--
+ m.response = history[m.historyNum]
+ m.cursorx = Count(m.response)
+ }
+}
+
+// DownHistory fetches the next item in the history
+func (m *Messenger) DownHistory(history []string) {
+ if m.historyNum < len(history)-1 {
+ m.historyNum++
+ m.response = history[m.historyNum]
+ m.cursorx = Count(m.response)
+ }
+}
+
+// CursorLeft moves the cursor one character left
+func (m *Messenger) CursorLeft() {
+ if m.cursorx > 0 {
+ m.cursorx--
+ }
+}
+
+// CursorRight moves the cursor one character right
+func (m *Messenger) CursorRight() {
+ if m.cursorx < Count(m.response) {
+ m.cursorx++
+ }
+}
+
+// Start moves the cursor to the start of the line
+func (m *Messenger) Start() {
+ m.cursorx = 0
+}
+
+// End moves the cursor to the end of the line
+func (m *Messenger) End() {
+ m.cursorx = Count(m.response)
+}
+
+// Backspace deletes one character
+func (m *Messenger) Backspace() {
+ if m.cursorx > 0 {
+ m.response = string([]rune(m.response)[:m.cursorx-1]) + string([]rune(m.response)[m.cursorx:])
+ m.cursorx--
+ }
+}
+
+// Paste pastes the clipboard
+func (m *Messenger) Paste() {
+ clip, _ := clipboard.ReadAll("clipboard")
+ m.response = Insert(m.response, m.cursorx, clip)
+ m.cursorx += Count(clip)
+}
+
+// WordLeft moves the cursor one word to the left
+func (m *Messenger) WordLeft() {
+ response := []rune(m.response)
+ m.CursorLeft()
+ if m.cursorx <= 0 {
+ return
+ }
+ for IsWhitespace(response[m.cursorx]) {
+ if m.cursorx <= 0 {
+ return
+ }
+ m.CursorLeft()
+ }
+ m.CursorLeft()
+ for IsWordChar(string(response[m.cursorx])) {
+ if m.cursorx <= 0 {
+ return
+ }
+ m.CursorLeft()
+ }
+ m.CursorRight()
+}
+
+// WordRight moves the cursor one word to the right
+func (m *Messenger) WordRight() {
+ response := []rune(m.response)
+ if m.cursorx >= len(response) {
+ return
+ }
+ for IsWhitespace(response[m.cursorx]) {
+ m.CursorRight()
+ if m.cursorx >= len(response) {
+ m.CursorRight()
+ return
+ }
+ }
+ m.CursorRight()
+ if m.cursorx >= len(response) {
+ return
+ }
+ for IsWordChar(string(response[m.cursorx])) {
+ m.CursorRight()
+ if m.cursorx >= len(response) {
+ return
+ }
+ }
+}
+
+// DeleteWordLeft deletes one word to the left
+func (m *Messenger) DeleteWordLeft() {
+ m.WordLeft()
+ m.response = string([]rune(m.response)[:m.cursorx])
+}
+