Skip to content

Commit f454226

Browse files
committed
feat(shell): add support for shell script execution #257
- Add "shell script" and "bash" language mappings to CodeFence. - Update code highlight logic to check for non-Markdown text languages. - Implement ShellRunService with runFile method for executing shell scripts. - Use runReadAction for thread-safe file lookup in ShellRunService.
1 parent 87e93b3 commit f454226

File tree

3 files changed

+27
-2
lines changed

3 files changed

+27
-2
lines changed

core/src/main/kotlin/cc/unitmesh/devti/sketch/highlight/CodeHighlightSketch.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ class CodeHighlightSketch(val project: Project, val text: String, private var id
6262
editorFragment = EditorFragment(editor, editorLineThreshold)
6363
add(editorFragment!!.getContent(), BorderLayout.CENTER)
6464

65-
if (ideaLanguage?.displayName != "Markdown" && ideaLanguage != PlainTextLanguage.INSTANCE) {
65+
if (textLanguage != null && textLanguage?.lowercase() != "markdown") {
6666
setupActionBar(project, editor)
6767
}
6868
}

core/src/main/kotlin/cc/unitmesh/devti/util/parser/CodeFence.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,8 @@ class CodeFence(
170170
"scala" -> "scala"
171171
"rust" -> "rs"
172172
"http request" -> "http"
173+
"shell script" -> "sh"
174+
"bash" -> "sh"
173175
else -> languageId
174176
}
175177
}

exts/devins-lang/src/main/kotlin/cc/unitmesh/devti/language/compiler/service/ShellRunService.kt

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,21 +4,44 @@ import cc.unitmesh.devti.provider.RunService
44
import com.intellij.execution.RunManager
55
import com.intellij.execution.configurations.RunConfiguration
66
import com.intellij.execution.configurations.RunProfile
7+
import com.intellij.openapi.application.ApplicationManager
8+
import com.intellij.openapi.application.runReadAction
79
import com.intellij.openapi.project.Project
810
import com.intellij.openapi.vfs.VirtualFile
11+
import com.intellij.psi.PsiElement
912
import com.intellij.psi.PsiManager
1013
import com.intellij.sh.psi.ShFile
1114
import com.intellij.sh.run.ShConfigurationType
1215
import com.intellij.sh.run.ShRunConfiguration
16+
import com.intellij.sh.run.ShRunner
1317

1418
class ShellRunService : RunService {
1519
override fun isApplicable(project: Project, file: VirtualFile): Boolean {
1620
return file.extension == "sh" || file.extension == "bash"
1721
}
1822

23+
override fun runFile(project: Project, virtualFile: VirtualFile, psiElement: PsiElement?): String? {
24+
val workingDirectory = virtualFile.parent.path
25+
val shRunner = ApplicationManager.getApplication().getService(ShRunner::class.java)
26+
?: return "Shell runner not found"
27+
28+
29+
/// lookup virtual file if not exist use scratch file
30+
31+
32+
if (shRunner.isAvailable(project)) {
33+
shRunner.run(project, virtualFile.path, workingDirectory, "RunShireShell", true)
34+
}
35+
36+
return "Running shell command: ${virtualFile.path}"
37+
}
38+
1939
override fun runConfigurationClass(project: Project): Class<out RunProfile> = ShRunConfiguration::class.java
2040
override fun createConfiguration(project: Project, virtualFile: VirtualFile): RunConfiguration? {
21-
val psiFile = PsiManager.getInstance(project).findFile(virtualFile) as? ShFile ?: return null
41+
val psiFile = runReadAction {
42+
PsiManager.getInstance(project).findFile(virtualFile) as? ShFile
43+
} ?: return null
44+
2245
val configurationSetting = RunManager.getInstance(project)
2346
.createConfiguration(psiFile.name, ShConfigurationType.getInstance())
2447

0 commit comments

Comments
 (0)