in src/main/java/com/maddyhome/idea/vim/ui/ex/ExEntryPanelService.kt [39:100]
fun inputString(vimEditor: VimEditor, context: ExecutionContext, prompt: String, finishOn: Char?): String? {
val editor = vimEditor.ij
if (vimEditor.inRepeatMode) {
val input = Extension.consumeString()
return input ?: error("Not enough strings saved: ${Extension.lastExtensionHandler}")
}
if (ApplicationManager.getApplication().isUnitTestMode) {
val builder = StringBuilder()
val inputModel = TestInputModel.getInstance(editor)
var key: KeyStroke? = inputModel.nextKeyStroke()
while (key != null &&
!key.isCloseKeyStroke() && key.keyCode != KeyEvent.VK_ENTER &&
(finishOn == null || key.keyChar != finishOn)
) {
val c = key.keyChar
if (c != KeyEvent.CHAR_UNDEFINED) {
builder.append(c)
}
key = inputModel.nextKeyStroke()
}
if (finishOn != null && key != null && key.keyChar == finishOn) {
builder.append(key.keyChar)
}
Extension.addString(builder.toString())
return builder.toString()
} else {
var text: String? = null
// XXX: The Ex entry panel is used only for UI here, its logic might be inappropriate for input()
val commandLine = injector.commandLine.createSearchPrompt(vimEditor, context, prompt.ifEmpty { " " }, "")
ModalEntry.activate(editor.vim) { key: KeyStroke ->
return@activate when {
key.isCloseKeyStroke() -> {
commandLine.deactivate(refocusOwningEditor = true, resetCaret = true)
false
}
key.keyCode == KeyEvent.VK_ENTER -> {
text = commandLine.text
commandLine.deactivate(refocusOwningEditor = true, resetCaret = true)
false
}
finishOn != null && key.keyChar == finishOn -> {
commandLine.handleKey(key)
text = commandLine.text
commandLine.deactivate(refocusOwningEditor = true, resetCaret = true)
false
}
else -> {
commandLine.handleKey(key)
true
}
}
}
if (text != null) {
Extension.addString(text)
}
return text
}
}