mirror of
https://github.com/chylex/IntelliJ-AceJump.git
synced 2024-11-24 23:42:46 +01:00
Compare commits
2 Commits
59fbd4e19c
...
01c38df82a
Author | SHA1 | Date | |
---|---|---|---|
01c38df82a | |||
a3a86cf447 |
@ -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 {
|
||||||
|
@ -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))
|
||||||
|
@ -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
|
||||||
|
@ -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 {
|
||||||
|
@ -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))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user