diff --git a/plugins/terminal/resources/META-INF/plugin.xml b/plugins/terminal/resources/META-INF/plugin.xml
index d218174f5a01..7df82eb3fa6a 100644
--- a/plugins/terminal/resources/META-INF/plugin.xml
+++ b/plugins/terminal/resources/META-INF/plugin.xml
@@ -121,6 +121,8 @@
+
diff --git a/plugins/terminal/resources/messages/TerminalBundle.properties b/plugins/terminal/resources/messages/TerminalBundle.properties
index edfa367dcb88..82d100c7cd55 100644
--- a/plugins/terminal/resources/messages/TerminalBundle.properties
+++ b/plugins/terminal/resources/messages/TerminalBundle.properties
@@ -25,6 +25,7 @@ action.Terminal.Find.text=Find
action.Terminal.ClearBuffer.text=Clear Terminal
action.Terminal.CommandCompletion.text=Command Completion
action.Terminal.InsertInlineCompletionItem.text=Insert Inline Completion Item
+action.Terminal.ShowDocumentation.text=Show Documentation
action.Terminal.Copy.text=Copy
action.Terminal.SelectLastBlock.text=Select Last Block
action.Terminal.SelectPrompt.text=Select Prompt
diff --git a/plugins/terminal/src/org/jetbrains/plugins/terminal/action/TerminalShowDocAction.kt b/plugins/terminal/src/org/jetbrains/plugins/terminal/action/TerminalShowDocAction.kt
new file mode 100644
index 000000000000..dedc5deb95cc
--- /dev/null
+++ b/plugins/terminal/src/org/jetbrains/plugins/terminal/action/TerminalShowDocAction.kt
@@ -0,0 +1,35 @@
+// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
+package org.jetbrains.plugins.terminal.action
+
+import com.intellij.codeInsight.hint.HintManagerImpl
+import com.intellij.codeInsight.lookup.LookupManager
+import com.intellij.codeInsight.lookup.impl.LookupImpl
+import com.intellij.openapi.actionSystem.ActionUpdateThread
+import com.intellij.openapi.actionSystem.AnActionEvent
+import com.intellij.openapi.project.DumbAwareAction
+import org.jetbrains.plugins.terminal.exp.CommandHistoryPresenter.Companion.IS_COMMAND_HISTORY_LOOKUP_KEY
+import org.jetbrains.plugins.terminal.exp.TerminalDataContextUtils.editor
+import org.jetbrains.plugins.terminal.exp.TerminalDataContextUtils.isPromptEditor
+import org.jetbrains.plugins.terminal.exp.documentation.TerminalDocumentationManager
+
+class TerminalShowDocAction : DumbAwareAction(), HintManagerImpl.ActionToIgnore {
+ override fun actionPerformed(e: AnActionEvent) {
+ val project = e.project ?: return
+ val lookup = LookupManager.getActiveLookup(e.editor) as? LookupImpl ?: return
+ val currentItem = lookup.currentItem ?: return
+ TerminalDocumentationManager.getInstance(project).showDocumentationForItem(lookup, currentItem, parentDisposable = lookup)
+ }
+
+ override fun update(e: AnActionEvent) {
+ val editor = e.editor
+ val lookup = LookupManager.getActiveLookup(editor) as? LookupImpl
+ // enable this action only in the terminal command completion popup
+ e.presentation.isEnabledAndVisible = e.project != null
+ && editor?.isPromptEditor == true
+ && lookup != null
+ && lookup.getUserData(IS_COMMAND_HISTORY_LOOKUP_KEY) != true
+ && lookup.currentItem != null
+ }
+
+ override fun getActionUpdateThread(): ActionUpdateThread = ActionUpdateThread.EDT
+}
\ No newline at end of file
diff --git a/plugins/terminal/src/org/jetbrains/plugins/terminal/exp/documentation/TerminalDocumentationManager.kt b/plugins/terminal/src/org/jetbrains/plugins/terminal/exp/documentation/TerminalDocumentationManager.kt
index d85f86fd0de4..c58706e79296 100644
--- a/plugins/terminal/src/org/jetbrains/plugins/terminal/exp/documentation/TerminalDocumentationManager.kt
+++ b/plugins/terminal/src/org/jetbrains/plugins/terminal/exp/documentation/TerminalDocumentationManager.kt
@@ -75,6 +75,7 @@ internal class TerminalDocumentationManager(private val project: Project, privat
Disposer.register(popup) {
EDT.assertIsEdt()
currentPopup = null
+ popupScope.coroutineContext.job.cancelChildren()
}
}
@@ -86,7 +87,7 @@ internal class TerminalDocumentationManager(private val project: Project, privat
val lookupElementFlow = lookup.elementFlow()
val showDocJob = scope.launch(Dispatchers.EDT + ModalityState.current().asContextElement()) {
lookupElementFlow.collectLatest {
- handleLookupElementChange(lookup, it, parentDisposable)
+ showDocumentationForItem(lookup, it, parentDisposable)
}
}
Disposer.register(parentDisposable) {
@@ -94,7 +95,8 @@ internal class TerminalDocumentationManager(private val project: Project, privat
}
}
- private fun handleLookupElementChange(lookup: LookupEx, element: LookupElement, parentDisposable: Disposable) {
+ @RequiresEdt
+ fun showDocumentationForItem(lookup: LookupEx, element: LookupElement, parentDisposable: Disposable) {
if (getCurrentPopup() != null) {
return
}
@@ -141,7 +143,6 @@ internal class TerminalDocumentationManager(private val project: Project, privat
private fun cancelPopup() {
EDT.assertIsEdt()
getCurrentPopup()?.cancel()
- popupScope.coroutineContext.job.cancelChildren()
}
private fun createDocPopupComponent(docComponent: DocumentationComponent, parentDisposable: Disposable): JComponent {