github.com/lmorg/murex@v0.0.0-20240217211045-e081c89cd4ef/utils/readline/hotkey_functions.go (about) 1 package readline 2 3 import "fmt" 4 5 func HkFnMoveToStartOfLine(rl *Instance) { 6 rl.viUndoSkipAppend = true 7 if rl.line.RuneLen() == 0 { 8 return 9 } 10 output := rl.clearHelpersStr() 11 rl.line.SetCellPos(0) 12 output += rl.echoStr() 13 output += moveCursorForwardsStr(1) 14 print(output) 15 } 16 17 func HkFnMoveToEndOfLine(rl *Instance) { 18 rl.viUndoSkipAppend = true 19 if rl.line.RuneLen() == 0 { 20 return 21 } 22 output := rl.clearHelpersStr() 23 rl.line.SetRunePos(rl.line.RuneLen()) 24 output += rl.echoStr() 25 output += moveCursorForwardsStr(1) 26 print(output) 27 } 28 29 func HkFnClearAfterCursor(rl *Instance) { 30 if rl.line.RuneLen() == 0 { 31 return 32 } 33 output := rl.clearHelpersStr() 34 rl.line.Set(rl, rl.line.Runes()[:rl.line.RunePos()]) 35 output += rl.echoStr() 36 output += moveCursorForwardsStr(1) 37 print(output) 38 } 39 40 func HkFnClearScreen(rl *Instance) { 41 rl.viUndoSkipAppend = true 42 if rl.previewMode != previewModeClosed { 43 HkFnPreviewToggle(rl) 44 } 45 output := seqSetCursorPosTopLeft + seqClearScreen 46 output += rl.echoStr() 47 output += rl.renderHelpersStr() 48 print(output) 49 } 50 51 func HkFnClearLine(rl *Instance) { 52 rl.clearPrompt() 53 rl.resetHelpers() 54 } 55 56 func HkFnFuzzyFind(rl *Instance) { 57 rl.viUndoSkipAppend = true 58 if !rl.modeTabCompletion { 59 rl.modeAutoFind = true 60 rl.getTabCompletion() 61 } 62 63 rl.modeTabFind = true 64 print(rl.updateTabFindStr([]rune{})) 65 } 66 67 func HkFnSearchHistory(rl *Instance) { 68 rl.viUndoSkipAppend = true 69 rl.modeAutoFind = true 70 rl.tcOffset = 0 71 rl.modeTabCompletion = true 72 rl.tcDisplayType = TabDisplayMap 73 rl.tabMutex.Lock() 74 rl.tcSuggestions, rl.tcDescriptions = rl.autocompleteHistory() 75 rl.tabMutex.Unlock() 76 rl.initTabCompletion() 77 78 rl.modeTabFind = true 79 print(rl.updateTabFindStr([]rune{})) 80 } 81 82 func HkFnAutocomplete(rl *Instance) { 83 rl.viUndoSkipAppend = true 84 if rl.modeTabCompletion { 85 rl.moveTabCompletionHighlight(1, 0) 86 } else { 87 rl.getTabCompletion() 88 } 89 90 if rl.previewMode == previewModeOpen || rl.previewRef == previewRefLine { 91 rl.previewMode = previewModeAutocomplete 92 } 93 94 print(rl.renderHelpersStr()) 95 } 96 97 func HkFnJumpForwards(rl *Instance) { 98 rl.viUndoSkipAppend = true 99 output := rl.moveCursorByRuneAdjustStr(rl.viJumpE(tokeniseLine)) 100 print(output) 101 } 102 103 func HkFnJumpBackwards(rl *Instance) { 104 rl.viUndoSkipAppend = true 105 output := rl.moveCursorByRuneAdjustStr(rl.viJumpB(tokeniseLine)) 106 print(output) 107 } 108 109 func HkFnCancelAction(rl *Instance) { 110 rl.viUndoSkipAppend = true 111 var output string 112 switch { 113 case rl.modeAutoFind: 114 //output += rl.clearPreviewStr() 115 output += rl.resetTabFindStr() 116 output += rl.clearHelpersStr() 117 rl.resetTabCompletion() 118 output += rl.renderHelpersStr() 119 120 case rl.modeTabFind: 121 output += rl.resetTabFindStr() 122 123 case rl.modeTabCompletion: 124 //output = rl.clearPreviewStr() 125 output += rl.clearHelpersStr() 126 rl.resetTabCompletion() 127 output += rl.renderHelpersStr() 128 129 default: 130 if rl.line.RunePos() == rl.line.RuneLen() && rl.line.RuneLen() > 0 { 131 rl.line.SetRunePos(rl.line.RunePos() - 1) 132 output = moveCursorBackwardsStr(1) 133 } 134 rl.modeViMode = vimKeys 135 rl.viIteration = "" 136 output += rl.viHintMessageStr() 137 } 138 139 print(output) 140 } 141 142 func HkFnRecallWord1(rl *Instance) { hkFnRecallWord(rl, 1) } 143 func HkFnRecallWord2(rl *Instance) { hkFnRecallWord(rl, 2) } 144 func HkFnRecallWord3(rl *Instance) { hkFnRecallWord(rl, 3) } 145 func HkFnRecallWord4(rl *Instance) { hkFnRecallWord(rl, 4) } 146 func HkFnRecallWord5(rl *Instance) { hkFnRecallWord(rl, 5) } 147 func HkFnRecallWord6(rl *Instance) { hkFnRecallWord(rl, 6) } 148 func HkFnRecallWord7(rl *Instance) { hkFnRecallWord(rl, 7) } 149 func HkFnRecallWord8(rl *Instance) { hkFnRecallWord(rl, 8) } 150 func HkFnRecallWord9(rl *Instance) { hkFnRecallWord(rl, 9) } 151 func HkFnRecallWord10(rl *Instance) { hkFnRecallWord(rl, 10) } 152 func HkFnRecallWord11(rl *Instance) { hkFnRecallWord(rl, 11) } 153 func HkFnRecallWord12(rl *Instance) { hkFnRecallWord(rl, 12) } 154 155 const errCannotRecallWord = "Cannot recall word" 156 157 func hkFnRecallWord(rl *Instance, i int) { 158 line, err := rl.History.GetLine(rl.History.Len() - 1) 159 if err != nil { 160 rl.ForceHintTextUpdate(fmt.Sprintf("%s %d: empty history", errCannotRecallWord, i)) 161 return 162 } 163 164 tokens, _, _ := tokeniseSplitSpaces([]rune(line), 0) 165 if i > len(tokens) { 166 rl.ForceHintTextUpdate(fmt.Sprintf("%s %d: previous line contained fewer words", errCannotRecallWord, i)) 167 return 168 } 169 170 output := rl.insertStr([]rune(tokens[i-1] + " ")) 171 print(output) 172 } 173 174 func HkFnPreviewToggle(rl *Instance) { 175 if !rl.modeAutoFind && !rl.modeTabCompletion && !rl.modeTabFind && 176 rl.previewMode == previewModeClosed { 177 178 if rl.modeTabCompletion { 179 rl.moveTabCompletionHighlight(1, 0) 180 } else { 181 rl.getTabCompletion() 182 } 183 defer func() { rl.previewMode++ }() 184 } 185 186 _fnPreviewToggle(rl) 187 } 188 189 func _fnPreviewToggle(rl *Instance) { 190 rl.viUndoSkipAppend = true 191 var output string 192 193 switch rl.previewMode { 194 case previewModeClosed: 195 output = curPosSave + seqSaveBuffer + seqClearScreen 196 rl.previewMode++ 197 size, _ := rl.getPreviewXY() 198 if size != nil { 199 output += rl.previewMoveToPromptStr(size) 200 } 201 202 case previewModeOpen: 203 //rl.previewMode = previewModeClosed 204 print(rl.clearPreviewStr()) 205 206 case previewModeAutocomplete: 207 /*if rl.modeTabFind { 208 print(rl.resetTabFindStr()) 209 } 210 HkFnCancelAction(rl)*/ 211 print(rl.clearPreviewStr()) 212 rl.resetHelpers() 213 } 214 215 output += rl.echoStr() 216 output += rl.renderHelpersStr() 217 print(output) 218 } 219 220 func HkFnPreviewLine(rl *Instance) { 221 if rl.PreviewInit != nil { 222 // forced rerun of command line preview 223 rl.PreviewInit() 224 rl.previewCache = nil 225 } 226 227 if !rl.modeAutoFind && !rl.modeTabCompletion && !rl.modeTabFind && 228 rl.previewMode == previewModeClosed { 229 defer func() { rl.previewMode++ }() 230 } 231 232 rl.previewRef = previewRefLine 233 234 if rl.previewMode == previewModeClosed { 235 _fnPreviewToggle(rl) 236 } else { 237 print(rl.renderHelpersStr()) 238 } 239 } 240 241 func HkFnUndo(rl *Instance) { 242 rl.viUndoSkipAppend = true 243 if len(rl.viUndoHistory) == 0 { 244 return 245 } 246 output := rl.undoLastStr() 247 rl.viUndoSkipAppend = true 248 rl.line.SetRunePos(rl.line.RuneLen()) 249 output += moveCursorForwardsStr(1) 250 print(output) 251 }