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  }