diff options
| author | Kyren223 <ulmliad223@gmail.com> | 2024-02-23 23:11:09 +0200 |
|---|---|---|
| committer | Kyren223 <ulmliad223@gmail.com> | 2024-02-23 23:11:09 +0200 |
| commit | 5da72c7ec98edfab7fbebc335e1a9fba116988a5 (patch) | |
| tree | b44ff2e0a10c1f5c58c7da50c91efc1b7dd2be9d /src/main/kotlin/me/kyren223/trident | |
| parent | 1017f0d17aa1c745ec0af2de4239c37816d040eb (diff) | |
Added a new menu for path mappings to allow shortcuts like the built-in `...`
Note: need to rethink how normal paths are saved, they should potentially be saved raw (not absolute paths) and then the virtual file list needs to change to string and then dynamically on the fly replace with mappings of key -> value to make an absolute path that then will be used
Diffstat (limited to 'src/main/kotlin/me/kyren223/trident')
| -rw-r--r-- | src/main/kotlin/me/kyren223/trident/AppendAction.kt (renamed from src/main/kotlin/me/kyren223/trident/TridentAppendAction.kt) | 2 | ||||
| -rw-r--r-- | src/main/kotlin/me/kyren223/trident/PathMappingsMenu.kt | 63 | ||||
| -rw-r--r-- | src/main/kotlin/me/kyren223/trident/PathMappingsMenuAction.kt | 11 | ||||
| -rw-r--r-- | src/main/kotlin/me/kyren223/trident/QuickMenu.kt (renamed from src/main/kotlin/me/kyren223/trident/TridentQuickMenu.kt) | 9 | ||||
| -rw-r--r-- | src/main/kotlin/me/kyren223/trident/QuickMenuSelectAction.kt (renamed from src/main/kotlin/me/kyren223/trident/TridentQuickMenuSelectAction.kt) | 2 | ||||
| -rw-r--r-- | src/main/kotlin/me/kyren223/trident/SelectAction.kt (renamed from src/main/kotlin/me/kyren223/trident/TridentSelectAction.kt) | 2 | ||||
| -rw-r--r-- | src/main/kotlin/me/kyren223/trident/SettingsConfigurable.kt (renamed from src/main/kotlin/me/kyren223/trident/AppSettingsConfigurable.kt) | 8 | ||||
| -rw-r--r-- | src/main/kotlin/me/kyren223/trident/SettingsState.kt (renamed from src/main/kotlin/me/kyren223/trident/AppSettingsState.kt) | 12 | ||||
| -rw-r--r-- | src/main/kotlin/me/kyren223/trident/ToggleQuickMenuAction.kt (renamed from src/main/kotlin/me/kyren223/trident/TridentToggleQuickMenuAction.kt) | 4 | ||||
| -rw-r--r-- | src/main/kotlin/me/kyren223/trident/TridentState.kt | 113 | ||||
| -rw-r--r-- | src/main/kotlin/me/kyren223/trident/Utils.kt | 12 |
11 files changed, 191 insertions, 47 deletions
diff --git a/src/main/kotlin/me/kyren223/trident/TridentAppendAction.kt b/src/main/kotlin/me/kyren223/trident/AppendAction.kt index 621b9cd..f058f86 100644 --- a/src/main/kotlin/me/kyren223/trident/TridentAppendAction.kt +++ b/src/main/kotlin/me/kyren223/trident/AppendAction.kt @@ -6,7 +6,7 @@ import com.intellij.openapi.actionSystem.PlatformDataKeys import com.intellij.openapi.project.Project import com.intellij.openapi.vfs.VirtualFile -class TridentAppendAction : AnAction() { +class AppendAction : AnAction() { override fun actionPerformed(e: AnActionEvent) { val project: Project = e.project ?: return val file: VirtualFile = e.getData(PlatformDataKeys.VIRTUAL_FILE) ?: return diff --git a/src/main/kotlin/me/kyren223/trident/PathMappingsMenu.kt b/src/main/kotlin/me/kyren223/trident/PathMappingsMenu.kt new file mode 100644 index 0000000..d098323 --- /dev/null +++ b/src/main/kotlin/me/kyren223/trident/PathMappingsMenu.kt @@ -0,0 +1,63 @@ +package me.kyren223.trident + +import com.intellij.openapi.editor.LogicalPosition +import com.intellij.openapi.ui.DialogWrapper +import com.intellij.ui.EditorTextField +import com.maddyhome.idea.vim.api.injector +import com.maddyhome.idea.vim.newapi.vim +import java.awt.event.FocusEvent +import java.awt.event.FocusListener +import javax.swing.JComponent + +class PathMappingsMenu(private val content: String) : DialogWrapper(true) { + private lateinit var editorTextField: EditorTextField + + init { + val settings = SettingsState.instance + this.title = "Trident Path Mappings Menu" + setSize(settings.width, settings.height) + super.init() + } + + override fun createCenterPanel(): JComponent { + val settings = SettingsState.instance + editorTextField = EditorTextField(this.content) + editorTextField.setOneLineMode(false) + editorTextField.addSettingsProvider { + it.setFontSize(settings.fontSize) + it.isInsertMode = true + it.caretModel.moveToLogicalPosition(LogicalPosition(0, 0)) + it.settings.isLineNumbersShown = true + } + + editorTextField.addFocusListener(object : FocusListener { + override fun focusGained(e: FocusEvent?) { + val editor = editorTextField.editor!!.vim + val context = injector.executionContextManager.onEditor(editor, null) + simulateKeyPress("<ESC>", editor, context) + } + + override fun focusLost(e: FocusEvent?) { /* Do nothing */ } + }) + + return editorTextField + } + + override fun getPreferredFocusedComponent(): JComponent { + return this.editorTextField + } + + override fun doOKAction() { + TridentState.pathMappingsContent = editorTextField.text + super.doOKAction() + } + + override fun doCancelAction() { + TridentState.pathMappingsContent = editorTextField.text + super.doCancelAction() + } + + override fun createSouthPanel(): JComponent? { + return null + } +} diff --git a/src/main/kotlin/me/kyren223/trident/PathMappingsMenuAction.kt b/src/main/kotlin/me/kyren223/trident/PathMappingsMenuAction.kt new file mode 100644 index 0000000..6b46f6a --- /dev/null +++ b/src/main/kotlin/me/kyren223/trident/PathMappingsMenuAction.kt @@ -0,0 +1,11 @@ +package me.kyren223.trident + +import com.intellij.openapi.actionSystem.AnAction +import com.intellij.openapi.actionSystem.AnActionEvent + +class PathMappingsMenuAction : AnAction() { + override fun actionPerformed(e: AnActionEvent) { + val project = e.project ?: return + TridentState.togglePathMappingsMenu(project) + } +} diff --git a/src/main/kotlin/me/kyren223/trident/TridentQuickMenu.kt b/src/main/kotlin/me/kyren223/trident/QuickMenu.kt index e7903e0..3ef3871 100644 --- a/src/main/kotlin/me/kyren223/trident/TridentQuickMenu.kt +++ b/src/main/kotlin/me/kyren223/trident/QuickMenu.kt @@ -14,18 +14,18 @@ import java.awt.event.FocusEvent import java.awt.event.FocusListener import javax.swing.JComponent -class TridentQuickMenu(private val content: String) : DialogWrapper(true) { +class QuickMenu(private val content: String) : DialogWrapper(true) { private lateinit var editorTextField: EditorTextField init { - val settings = AppSettingsState.instance + val settings = SettingsState.instance this.title = "Trident Quick Menu" setSize(settings.width, settings.height) super.init() } override fun createCenterPanel(): JComponent { - val settings = AppSettingsState.instance + val settings = SettingsState.instance editorTextField = EditorTextField(this.content) editorTextField.setOneLineMode(false) editorTextField.addSettingsProvider { @@ -48,9 +48,6 @@ class TridentQuickMenu(private val content: String) : DialogWrapper(true) { return editorTextField } - private fun simulateKeyPress(key: String, editor: VimEditor, context: ExecutionContext.Editor) { - KeyHandler.getInstance().handleKey(editor, injector.parser.parseKeys(key)[0], context) - } override fun getPreferredFocusedComponent(): JComponent { return this.editorTextField diff --git a/src/main/kotlin/me/kyren223/trident/TridentQuickMenuSelectAction.kt b/src/main/kotlin/me/kyren223/trident/QuickMenuSelectAction.kt index f9db35a..0ae320a 100644 --- a/src/main/kotlin/me/kyren223/trident/TridentQuickMenuSelectAction.kt +++ b/src/main/kotlin/me/kyren223/trident/QuickMenuSelectAction.kt @@ -3,7 +3,7 @@ package me.kyren223.trident import com.intellij.openapi.actionSystem.AnAction import com.intellij.openapi.actionSystem.AnActionEvent -class TridentQuickMenuSelectAction : AnAction() { +class QuickMenuSelectAction : AnAction() { override fun actionPerformed(e: AnActionEvent) { TridentState.quickMenuSelect() } diff --git a/src/main/kotlin/me/kyren223/trident/TridentSelectAction.kt b/src/main/kotlin/me/kyren223/trident/SelectAction.kt index 3122650..2e09bb9 100644 --- a/src/main/kotlin/me/kyren223/trident/TridentSelectAction.kt +++ b/src/main/kotlin/me/kyren223/trident/SelectAction.kt @@ -5,7 +5,7 @@ import com.intellij.openapi.actionSystem.AnActionEvent import com.intellij.openapi.actionSystem.PlatformDataKeys import com.intellij.openapi.fileEditor.FileEditorManager -class TridentSelectAction : AnAction() { +class SelectAction : AnAction() { override fun actionPerformed(e: AnActionEvent) { val project = e.project ?: return var index = when (val actionId = e.actionManager.getId(this)) { diff --git a/src/main/kotlin/me/kyren223/trident/AppSettingsConfigurable.kt b/src/main/kotlin/me/kyren223/trident/SettingsConfigurable.kt index e04b3b8..3caaf4b 100644 --- a/src/main/kotlin/me/kyren223/trident/AppSettingsConfigurable.kt +++ b/src/main/kotlin/me/kyren223/trident/SettingsConfigurable.kt @@ -5,7 +5,7 @@ import com.intellij.openapi.options.Configurable import com.intellij.openapi.util.NlsContexts.ConfigurableName import javax.swing.JComponent -class AppSettingsConfigurable : Configurable { +class SettingsConfigurable : Configurable { private var settings: SettingsData? = null override fun getDisplayName(): @ConfigurableName String { return "Trident Settings" @@ -17,7 +17,7 @@ class AppSettingsConfigurable : Configurable { } override fun isModified(): Boolean { - val settings = AppSettingsState.instance + val settings = SettingsState.instance if (settings.width != this.settings!!.getWidth()) return true if (settings.height != this.settings!!.getHeight()) return true if (settings.fontSize != this.settings!!.getFontSize()) return true @@ -26,7 +26,7 @@ class AppSettingsConfigurable : Configurable { } override fun apply() { - val settings = AppSettingsState.instance + val settings = SettingsState.instance settings.width = this.settings!!.getWidth() settings.height = this.settings!!.getHeight() settings.fontSize = this.settings!!.getFontSize() @@ -34,7 +34,7 @@ class AppSettingsConfigurable : Configurable { } override fun reset() { - val settings = AppSettingsState.instance + val settings = SettingsState.instance if (this.settings == null) { this.settings = SettingsData() } diff --git a/src/main/kotlin/me/kyren223/trident/AppSettingsState.kt b/src/main/kotlin/me/kyren223/trident/SettingsState.kt index 6d61ea0..b0544f4 100644 --- a/src/main/kotlin/me/kyren223/trident/AppSettingsState.kt +++ b/src/main/kotlin/me/kyren223/trident/SettingsState.kt @@ -7,24 +7,24 @@ import com.intellij.openapi.components.Storage import com.intellij.util.xmlb.XmlSerializerUtil // Copyright 2000-2022 JetBrains s.r.o. and other contributors. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. -@State(name = "me.kyren223.trident.AppSettingsState", storages = [Storage("SdkSettingsPlugin.xml")]) -class AppSettingsState : PersistentStateComponent<AppSettingsState?> { +@State(name = "me.kyren223.trident.SettingsState", storages = [Storage("SdkSettingsPlugin.xml")]) +class SettingsState : PersistentStateComponent<SettingsState?> { var enterToSelect = true var width = 800 var height = 400 var fontSize = 20 - override fun getState(): AppSettingsState { + override fun getState(): SettingsState { return this } - override fun loadState(state: AppSettingsState) { + override fun loadState(state: SettingsState) { XmlSerializerUtil.copyBean(state, this) } companion object { - val instance: AppSettingsState - get() = ApplicationManager.getApplication().getService(AppSettingsState::class.java) + val instance: SettingsState + get() = ApplicationManager.getApplication().getService(SettingsState::class.java) } } diff --git a/src/main/kotlin/me/kyren223/trident/TridentToggleQuickMenuAction.kt b/src/main/kotlin/me/kyren223/trident/ToggleQuickMenuAction.kt index a3f8cc7..a8a78ab 100644 --- a/src/main/kotlin/me/kyren223/trident/TridentToggleQuickMenuAction.kt +++ b/src/main/kotlin/me/kyren223/trident/ToggleQuickMenuAction.kt @@ -6,7 +6,7 @@ import com.maddyhome.idea.vim.api.injector import com.maddyhome.idea.vim.command.MappingMode import com.maddyhome.idea.vim.key.MappingOwner -class TridentToggleQuickMenuAction : AnAction() { +class ToggleQuickMenuAction : AnAction() { override fun actionPerformed(e: AnActionEvent) { if (!remapped) remap() if (e.project != null) { @@ -15,7 +15,7 @@ class TridentToggleQuickMenuAction : AnAction() { } private fun remap() { - if (!AppSettingsState.instance.enterToSelect) return + if (!SettingsState.instance.enterToSelect) return val keys = injector.parser.parseKeys(":action TridentQuickMenuSelect<cr>") val keyGroup = injector.keyGroup keyGroup.putKeyMapping(MappingMode.NVO, diff --git a/src/main/kotlin/me/kyren223/trident/TridentState.kt b/src/main/kotlin/me/kyren223/trident/TridentState.kt index 57a47b8..1163789 100644 --- a/src/main/kotlin/me/kyren223/trident/TridentState.kt +++ b/src/main/kotlin/me/kyren223/trident/TridentState.kt @@ -8,10 +8,14 @@ import com.intellij.openapi.vfs.VirtualFile object TridentState { private var projectFiles: MutableMap<String, MutableList<VirtualFile>> = mutableMapOf() + private var pathMappings: MutableMap<String, MutableMap<String, String>> = mutableMapOf() private const val TRIDENT_LIST_KEY = "TridentList" - private var quickMenu: TridentQuickMenu? = null + private const val PATH_MAPPINGS_LIST_KEY = "PathMappings" + private var quickMenu: QuickMenu? = null var quickMenuSelectedIndex: Int? = null - var quickMenuContent: String? = "" + var quickMenuContent: String = "" + private var pathMappingsMenu: PathMappingsMenu? = null + var pathMappingsContent: String = "" fun appendFile(project: Project, file: VirtualFile) { if (!file.isValid) return @@ -33,30 +37,49 @@ object TridentState { if (project.name in projectFiles) return val properties = PropertiesComponent.getInstance(project) + val pathMappingsList = properties.getList(PATH_MAPPINGS_LIST_KEY) + var map = mutableMapOf<String, String>() + if (pathMappingsList == null) { + map["..."] = project.basePath!! + } else { + for (entry in pathMappingsList) { + val split = entry.split("=") + if (split.size != 2) continue + map[split[0]] = split[1] + } + } + this.pathMappings[project.name] = map + val list = properties.getList(TRIDENT_LIST_KEY) if (list == null) { projectFiles[project.name] = mutableListOf() - return - } - val fs = LocalFileSystem.getInstance() - val files = list.stream() + } else { + val fs = LocalFileSystem.getInstance() + val files = list.stream() .map { fs.findFileByPath(it) } .toList() .filterNotNull() .filter { it.isValid } .toMutableList() - projectFiles[project.name] = files + projectFiles[project.name] = files + } } private fun saveProject(project: Project) { if (project.name !in projectFiles) return val files = projectFiles[project.name] val properties = PropertiesComponent.getInstance(project) + val stringList = files!!.stream() - .filter { it.isValid } - .map { it.path } - .toList() + .filter { it.isValid } + .map { it.path } + .toList() properties.setList(TRIDENT_LIST_KEY, stringList) + + val pathMappingsString = pathMappings[project.name]!!.entries + .joinToString("\n") { "${it.key}=${it.value}" } + .split("\n") + properties.setList(PATH_MAPPINGS_LIST_KEY, pathMappingsString) } fun getIndexOfFile(project: Project, data: VirtualFile?): Int { @@ -79,11 +102,11 @@ object TridentState { loadProject(project) val content = getProjectContent(project) - quickMenu = TridentQuickMenu(content) + quickMenu = QuickMenu(content) val result = quickMenu!!.showAndGet() - if (quickMenuContent != null && content != quickMenuContent) { - retrieveProjectFiles(project, quickMenuContent!!) + if (content != quickMenuContent) { + retrieveProjectFiles(project, quickMenuContent) saveProject(project) } @@ -100,25 +123,63 @@ object TridentState { } private fun getProjectContent(project: Project): String { - val content = projectFiles[project.name]!! - .joinToString("\n") { it.path } - .replace(project.basePath!!, "...") - .trim() + loadProject(project) + val map = pathMappings[project.name] ?: throw IllegalStateException("Path mappings not found") + println("map: $map") + var content = projectFiles[project.name]!! + .joinToString("\n") { it.path } + .trim() + println("content: $content") + for ((key, value) in map) { + println("key: $key | value: $value") + content = content.replace(value, key) + } + println("content: $content") return content } private fun retrieveProjectFiles(project: Project, content: String) { loadProject(project) val files = content - .split("\n") - .asSequence() - .map { it.trim() } - .map { it.replace("...", project.basePath!!) } - .filter { it.isNotBlank() } - .map { LocalFileSystem.getInstance().findFileByPath(it) } - .filterNotNull() - .filter { it.isValid } - .toMutableList() + .split("\n") + .asSequence() + .map { it.trim() } + .map { line -> + pathMappings[project.name]!!.entries.fold(line) { acc, (key, value) -> + acc.replace(key, value) + } + } +// .map { +// pathMappings[project.name]!!.entries.forEach { (key, value) -> it.replace(key, value) } +// it +// } + .filter { it.isNotBlank() } + .map { LocalFileSystem.getInstance().findFileByPath(it) } + .filterNotNull() + .filter { it.isValid } + .toMutableList() projectFiles[project.name] = files } + + fun togglePathMappingsMenu(project: Project) { + if (pathMappingsMenu != null && pathMappingsMenu!!.isShowing) { + pathMappingsMenu!!.doCancelAction() + return + } + + loadProject(project) + val content = pathMappings[project.name]!!.entries + .joinToString("\n") { "${it.key}=${it.value}" } + pathMappingsMenu = PathMappingsMenu(content) + pathMappingsMenu!!.showAndGet() + + if (content != pathMappingsContent) { + pathMappingsContent.split("\n").forEach { + val split = it.split("=") + if (split.size != 2) return@forEach + this.pathMappings[project.name]!![split[0]] = split[1] + } + saveProject(project) + } + } }
\ No newline at end of file diff --git a/src/main/kotlin/me/kyren223/trident/Utils.kt b/src/main/kotlin/me/kyren223/trident/Utils.kt new file mode 100644 index 0000000..7ff2d58 --- /dev/null +++ b/src/main/kotlin/me/kyren223/trident/Utils.kt @@ -0,0 +1,12 @@ +package me.kyren223.trident + +import com.maddyhome.idea.vim.KeyHandler +import com.maddyhome.idea.vim.api.ExecutionContext +import com.maddyhome.idea.vim.api.VimEditor +import com.maddyhome.idea.vim.api.injector + +fun simulateKeyPress(key: String, editor: VimEditor, context: ExecutionContext.Editor) { + KeyHandler.getInstance().handleKey(editor, injector.parser.parseKeys(key)[0], context) +} + + |
