1
0
mirror of https://github.com/chylex/IntelliJ-AceJump.git synced 2024-11-24 23:42:46 +01:00

Compare commits

...

2 Commits

5 changed files with 49 additions and 49 deletions

View File

@ -15,12 +15,15 @@ repositories {
} }
intellij { intellij {
version.set("2024.1.4") version.set("2024.2")
updateSinceUntilBuild.set(false) updateSinceUntilBuild.set(false)
plugins.add("IdeaVIM:chylex-37")
plugins.add("IdeaVIM:chylex-40")
plugins.add("com.intellij.classic.ui:242.20224.159")
pluginsRepositories { pluginsRepositories {
custom("https://intellij.chylex.com") custom("https://intellij.chylex.com")
marketplace()
} }
} }
@ -33,7 +36,7 @@ dependencies {
} }
tasks.patchPluginXml { tasks.patchPluginXml {
sinceBuild.set("241") sinceBuild.set("242")
} }
tasks.buildSearchableOptions { tasks.buildSearchableOptions {

View File

@ -1,5 +1,6 @@
package org.acejump.action package org.acejump.action
import com.intellij.openapi.actionSystem.ActionUpdateThread
import com.intellij.openapi.actionSystem.AnActionEvent import com.intellij.openapi.actionSystem.AnActionEvent
import com.intellij.openapi.actionSystem.CommonDataKeys import com.intellij.openapi.actionSystem.CommonDataKeys
import com.intellij.openapi.application.ApplicationManager import com.intellij.openapi.application.ApplicationManager
@ -167,6 +168,10 @@ sealed class AceVimAction : DumbAwareAction() {
action.presentation.isEnabled = action.getData(CommonDataKeys.EDITOR) != null action.presentation.isEnabled = action.getData(CommonDataKeys.EDITOR) != null
} }
override fun getActionUpdateThread(): ActionUpdateThread {
return ActionUpdateThread.BGT
}
override fun actionPerformed(e: AnActionEvent) { override fun actionPerformed(e: AnActionEvent) {
val editor = e.getData(CommonDataKeys.EDITOR) ?: return val editor = e.getData(CommonDataKeys.EDITOR) ?: return
val session = SessionManager.start(editor, AceVimMode.JumpAllEditors.getJumpEditors(editor)) val session = SessionManager.start(editor, AceVimMode.JumpAllEditors.getJumpEditors(editor))

View File

@ -5,16 +5,15 @@ import com.intellij.ui.ColorPanel
import com.intellij.ui.components.JBSlider import com.intellij.ui.components.JBSlider
import com.intellij.ui.components.JBTextArea import com.intellij.ui.components.JBTextArea
import com.intellij.ui.components.JBTextField import com.intellij.ui.components.JBTextField
import com.intellij.ui.layout.Cell import com.intellij.ui.dsl.builder.COLUMNS_LARGE
import com.intellij.ui.layout.GrowPolicy.MEDIUM_TEXT import com.intellij.ui.dsl.builder.COLUMNS_SHORT
import com.intellij.ui.layout.GrowPolicy.SHORT_TEXT import com.intellij.ui.dsl.builder.columns
import com.intellij.ui.layout.panel import com.intellij.ui.dsl.builder.panel
import org.acejump.input.KeyLayout import org.acejump.input.KeyLayout
import java.awt.Color import java.awt.Color
import java.awt.Font import java.awt.Font
import java.util.Hashtable import java.util.Hashtable
import javax.swing.JCheckBox import javax.swing.JCheckBox
import javax.swing.JComponent
import javax.swing.JLabel import javax.swing.JLabel
import javax.swing.JPanel import javax.swing.JPanel
import javax.swing.JSlider import javax.swing.JSlider
@ -52,39 +51,30 @@ internal class AceSettingsPanel {
} }
internal val rootPanel: JPanel = panel { internal val rootPanel: JPanel = panel {
fun Cell.short(component: JComponent) = component(growPolicy = SHORT_TEXT) group("Characters and Layout") {
fun Cell.medium(component: JComponent) = component(growPolicy = MEDIUM_TEXT) row("Allowed characters in tags:") { cell(tagAllowedCharsField).columns(COLUMNS_LARGE) }
row("Allowed prefix characters in tags:") { cell(tagPrefixCharsField).columns(COLUMNS_MEDIUM) }
titledRow("Characters and Layout") { row("Keyboard layout:") { cell(keyboardLayoutCombo).columns(COLUMNS_SHORT) }
row("Allowed characters in tags:") { medium(tagAllowedCharsField) } row("Keyboard design:") { cell(keyboardLayoutArea).columns(COLUMNS_SHORT) }
row("Allowed prefix characters in tags:") { medium(tagPrefixCharsField) }
row("Keyboard layout:") { short(keyboardLayoutCombo) }
row("Keyboard design:") { short(keyboardLayoutArea) }
} }
titledRow("Behavior") { group("Behavior") {
row("Minimum typed characters (1-10):") { short(minQueryLengthField) } row("Minimum typed characters (1-10):") { cell(minQueryLengthField).columns(COLUMNS_SHORT) }
} }
titledRow("Colors") { group("Colors") {
row("Caret background:") { row("Caret background:") {
cell { cell(jumpModeColorWheel)
component(jumpModeColorWheel)
}
} }
row("Tag foreground:") { row("Tag foreground:") {
cell { cell(tagForeground1ColorWheel)
component(tagForeground1ColorWheel) cell(tagForeground2ColorWheel)
component(tagForeground2ColorWheel)
}
} }
row("Search highlight:") { row("Search highlight:") {
cell { cell(searchHighlightColorWheel)
component(searchHighlightColorWheel)
}
} }
row("Editor fade opacity (%):") { row("Editor fade opacity (%):") {
medium(editorFadeOpacitySlider) cell(editorFadeOpacitySlider)
} }
} }
} }
@ -123,7 +113,7 @@ internal class AceSettingsPanel {
// Removal pending support for https://youtrack.jetbrains.com/issue/KT-8575 // Removal pending support for https://youtrack.jetbrains.com/issue/KT-8575
private operator fun JTextComponent.getValue(a: AceSettingsPanel, p: KProperty<*>) = text.toLowerCase() private operator fun JTextComponent.getValue(a: AceSettingsPanel, p: KProperty<*>) = text.lowercase()
private operator fun JTextComponent.setValue(a: AceSettingsPanel, p: KProperty<*>, s: String) = setText(s) private operator fun JTextComponent.setValue(a: AceSettingsPanel, p: KProperty<*>, s: String) = setText(s)
private operator fun ColorPanel.getValue(a: AceSettingsPanel, p: KProperty<*>) = selectedColor private operator fun ColorPanel.getValue(a: AceSettingsPanel, p: KProperty<*>) = selectedColor

View File

@ -28,13 +28,13 @@ internal sealed class SearchQuery {
* If the first character of the query is lowercase, then the entire query will be case-insensitive, * If the first character of the query is lowercase, then the entire query will be case-insensitive,
* and only beginnings of words and camel humps will be matched. * and only beginnings of words and camel humps will be matched.
*/ */
class Literal(override val rawText: String, val excludeMiddlesOfWords: Boolean) : SearchQuery() { class Literal(override val rawText: String) : SearchQuery() {
init { init {
require(rawText.isNotEmpty()) require(rawText.isNotEmpty())
} }
override fun refine(char: Char): SearchQuery { override fun refine(char: Char): SearchQuery {
return Literal(rawText + char, excludeMiddlesOfWords) return Literal(rawText + char)
} }
override fun getHighlightLength(text: CharSequence, offset: Int): Int { override fun getHighlightLength(text: CharSequence, offset: Int): Int {
@ -44,19 +44,14 @@ internal sealed class SearchQuery {
override fun toRegex(): Regex { override fun toRegex(): Regex {
val firstChar = rawText.first() val firstChar = rawText.first()
val pattern = if (firstChar.isLowerCase()) { val pattern = if (firstChar.isLowerCase()) {
if (excludeMiddlesOfWords) { val fullPattern = Regex.escape(rawText)
val firstCharUppercasePattern = Regex.escape(firstChar.uppercaseChar().toString()) "(?i)$fullPattern"
val firstCharPattern = Regex.escape(firstChar.toString())
val remainingPattern = if (rawText.length > 1) Regex.escape(rawText.drop(1)) else ""
"(?:$firstCharUppercasePattern|(?<![a-zA-Z])$firstCharPattern)$remainingPattern"
}
else {
val fullPattern = Regex.escape(rawText)
"(?i)$fullPattern"
}
} }
else { else {
Regex.escape(rawText) val firstCharUppercasePattern = Regex.escape(firstChar.toString())
val firstCharLowercasePattern = Regex.escape(firstChar.lowercase())
val remainingPattern = if (rawText.length > 1) Regex.escape(rawText.drop(1)) else ""
"(?:$firstCharUppercasePattern|(?<![a-zA-Z])$firstCharLowercasePattern)$remainingPattern"
} }
return Regex(pattern, setOf(RegexOption.MULTILINE)) return Regex(pattern, setOf(RegexOption.MULTILINE))
@ -70,7 +65,7 @@ internal sealed class SearchQuery {
override val rawText = "" override val rawText = ""
override fun refine(char: Char): SearchQuery { override fun refine(char: Char): SearchQuery {
return Literal(char.toString(), excludeMiddlesOfWords = false) return Literal(char.toString())
} }
override fun getHighlightLength(text: CharSequence, offset: Int): Int { override fun getHighlightLength(text: CharSequence, offset: Int): Int {

View File

@ -2,6 +2,7 @@ package org.acejump.session
import com.intellij.openapi.editor.Editor import com.intellij.openapi.editor.Editor
import org.acejump.boundaries.Boundaries import org.acejump.boundaries.Boundaries
import org.acejump.boundaries.StandardBoundaries
import org.acejump.config.AceConfig import org.acejump.config.AceConfig
import org.acejump.search.SearchProcessor import org.acejump.search.SearchProcessor
import org.acejump.search.SearchQuery import org.acejump.search.SearchQuery
@ -17,7 +18,7 @@ sealed interface SessionState {
private val defaultBoundary: Boundaries, private val defaultBoundary: Boundaries,
) : SessionState { ) : SessionState {
override fun type(char: Char): TypeResult { override fun type(char: Char): TypeResult {
val searchProcessor = SearchProcessor(jumpEditors, SearchQuery.Literal(char.toString(), excludeMiddlesOfWords = true), defaultBoundary) val searchProcessor = SearchProcessor(jumpEditors, SearchQuery.Literal(char.toString()), defaultBoundary)
return if (searchProcessor.isQueryFinished) { return if (searchProcessor.isQueryFinished) {
TypeResult.ChangeState(SelectTag(actions, jumpEditors, searchProcessor)) TypeResult.ChangeState(SelectTag(actions, jumpEditors, searchProcessor))
@ -63,9 +64,15 @@ sealed interface SessionState {
override fun type(char: Char): TypeResult { override fun type(char: Char): TypeResult {
if (char == ' ') { if (char == ' ') {
val query = searchProcessor.query val query = searchProcessor.query
if (query is SearchQuery.Literal && query.excludeMiddlesOfWords) { if (query is SearchQuery.Literal) {
val newQuery = SearchQuery.Literal(query.rawText, excludeMiddlesOfWords = false) val newBoundaries = when (searchProcessor.boundaries) {
val newSearchProcessor = SearchProcessor(jumpEditors, newQuery, searchProcessor.boundaries) StandardBoundaries.VISIBLE_ON_SCREEN -> StandardBoundaries.AFTER_CARET
StandardBoundaries.AFTER_CARET -> StandardBoundaries.BEFORE_CARET
StandardBoundaries.BEFORE_CARET -> StandardBoundaries.VISIBLE_ON_SCREEN
else -> searchProcessor.boundaries
}
val newSearchProcessor = SearchProcessor(jumpEditors, query, newBoundaries)
return TypeResult.ChangeState(SelectTag(actions, jumpEditors, newSearchProcessor)) return TypeResult.ChangeState(SelectTag(actions, jumpEditors, newSearchProcessor))
} }
} }