mirror of
https://github.com/chylex/IntelliJ-AceJump.git
synced 2025-05-02 20:34:06 +02:00
Hack in a really bad implementation of https://github.com/acejump/AceJump/issues/342#issuecomment-732652730
This commit is contained in:
parent
ee1ce3c37e
commit
b73e5f1ae5
src/main
@ -1,90 +1,132 @@
|
|||||||
package org.acejump.control
|
package org.acejump.control
|
||||||
|
|
||||||
|
import com.intellij.codeInsight.editorActions.SelectWordUtil
|
||||||
import com.intellij.openapi.actionSystem.AnActionEvent
|
import com.intellij.openapi.actionSystem.AnActionEvent
|
||||||
import com.intellij.openapi.actionSystem.CommonDataKeys.EDITOR
|
import com.intellij.openapi.actionSystem.CommonDataKeys.EDITOR
|
||||||
import com.intellij.openapi.diagnostic.Logger
|
import com.intellij.openapi.diagnostic.Logger
|
||||||
|
import com.intellij.openapi.diagnostic.debug
|
||||||
|
import com.intellij.openapi.editor.CaretState
|
||||||
|
import com.intellij.openapi.editor.ScrollType
|
||||||
|
import com.intellij.openapi.fileEditor.FileDocumentManager
|
||||||
import com.intellij.openapi.project.DumbAwareAction
|
import com.intellij.openapi.project.DumbAwareAction
|
||||||
|
import com.intellij.openapi.util.TextRange
|
||||||
import org.acejump.control.Handler.regexSearch
|
import org.acejump.control.Handler.regexSearch
|
||||||
import org.acejump.label.Pattern
|
import org.acejump.label.Pattern
|
||||||
import org.acejump.label.Pattern.ALL_WORDS
|
import org.acejump.label.Pattern.ALL_WORDS
|
||||||
|
import org.acejump.search.Finder
|
||||||
import org.acejump.search.JumpMode
|
import org.acejump.search.JumpMode
|
||||||
import org.acejump.search.Jumper
|
import org.acejump.search.Jumper
|
||||||
import org.acejump.search.getNameOfFileInEditor
|
|
||||||
import org.acejump.view.Boundary.*
|
import org.acejump.view.Boundary.*
|
||||||
|
import org.acejump.view.Model
|
||||||
import org.acejump.view.Model.boundaries
|
import org.acejump.view.Model.boundaries
|
||||||
import org.acejump.view.Model.defaultBoundary
|
import org.acejump.view.Model.defaultBoundary
|
||||||
import org.acejump.view.Model.editor
|
import org.acejump.view.Model.editor
|
||||||
|
import org.acejump.view.Model.viewBounds
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Entry point for all actions. The IntelliJ Platform calls AceJump here.
|
* Entry point for all actions. The IntelliJ Platform calls AceJump here.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
open class AceAction: DumbAwareAction() {
|
sealed class AceAction: DumbAwareAction() {
|
||||||
open val logger = Logger.getInstance(javaClass)
|
val logger = Logger.getInstance(javaClass)
|
||||||
override fun update(action: AnActionEvent) {
|
|
||||||
|
final override fun update(action: AnActionEvent) {
|
||||||
action.presentation.isEnabled = action.getData(EDITOR) != null
|
action.presentation.isEnabled = action.getData(EDITOR) != null
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun actionPerformed(e: AnActionEvent) {
|
final override fun actionPerformed(e: AnActionEvent) {
|
||||||
editor = e.getData(EDITOR) ?: return
|
editor = e.getData(EDITOR) ?: return
|
||||||
boundaries = defaultBoundary
|
boundaries = defaultBoundary
|
||||||
val textLength = editor.document.textLength
|
logger.debug { "Invoked on ${FileDocumentManager.getInstance().getFile(editor.document)?.presentableName} (${editor.document.textLength})" }
|
||||||
logger.info("Invoked on ${editor.getNameOfFileInEditor()} ($textLength)")
|
|
||||||
Handler.activate()
|
Handler.activate()
|
||||||
customize()
|
invoke()
|
||||||
}
|
}
|
||||||
|
|
||||||
open fun customize() = Jumper.cycleMode()
|
abstract fun invoke()
|
||||||
|
|
||||||
|
object ActivateOrCycleMode : AceAction() {
|
||||||
|
override fun invoke() = Jumper.cycleMode()
|
||||||
|
}
|
||||||
|
|
||||||
|
object ToggleJumpMode: AceAction() {
|
||||||
|
override fun invoke() = Jumper.toggleMode(JumpMode.JUMP)
|
||||||
|
}
|
||||||
|
|
||||||
|
object ToggleJumpEndMode: AceAction() {
|
||||||
|
override fun invoke() = Jumper.toggleMode(JumpMode.JUMP_END)
|
||||||
|
}
|
||||||
|
|
||||||
|
object ToggleSelectWordMode: AceAction() {
|
||||||
|
override fun invoke() = Jumper.toggleMode(JumpMode.TARGET)
|
||||||
|
}
|
||||||
|
|
||||||
|
object ToggleDefinitionMode: AceAction() {
|
||||||
|
override fun invoke() = Jumper.toggleMode(JumpMode.DEFINE)
|
||||||
|
}
|
||||||
|
|
||||||
|
object ToggleAllLinesMode: AceAction() {
|
||||||
|
override fun invoke() = regexSearch(Pattern.LINE_MARK)
|
||||||
|
}
|
||||||
|
|
||||||
|
object ToggleAllWordsMode: AceAction() {
|
||||||
|
override fun invoke() = regexSearch(ALL_WORDS, SCREEN_BOUNDARY)
|
||||||
|
}
|
||||||
|
|
||||||
|
object ToggleAllWordsForwardMode: AceAction() {
|
||||||
|
override fun invoke() = regexSearch(ALL_WORDS, AFTER_CARET_BOUNDARY)
|
||||||
|
}
|
||||||
|
|
||||||
|
object ToggleAllWordsBackwardsMode: AceAction() {
|
||||||
|
override fun invoke() = regexSearch(ALL_WORDS, BEFORE_CARET_BOUNDARY)
|
||||||
|
}
|
||||||
|
|
||||||
|
object ActOnHighlightedWords: AceAction() {
|
||||||
|
override fun invoke() = when(JumpMode.mode) {
|
||||||
|
JumpMode.DISABLED -> {}
|
||||||
|
JumpMode.JUMP -> if (editor.caretModel.supportsMultipleCarets()) jumpToAll() else Unit
|
||||||
|
JumpMode.JUMP_END -> if (editor.caretModel.supportsMultipleCarets()) jumpToWordEnds() else Unit
|
||||||
|
JumpMode.TARGET -> if (editor.caretModel.supportsMultipleCarets()) selectAllWords() else Unit
|
||||||
|
JumpMode.DEFINE -> {}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun jumpToAll() {
|
||||||
|
val carets = Finder.allResults().map {
|
||||||
|
CaretState(editor.offsetToLogicalPosition(it), null, null)
|
||||||
|
}
|
||||||
|
if (carets.isEmpty()) return
|
||||||
|
Handler.reset()
|
||||||
|
editor.caretModel.caretsAndSelections = carets
|
||||||
|
editor.scrollingModel.scrollToCaret(ScrollType.MAKE_VISIBLE)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun jumpToWordEnds() {
|
||||||
|
val ranges = ArrayList<TextRange>()
|
||||||
|
for (offset in Finder.allResults()) {
|
||||||
|
SelectWordUtil.addWordSelection(editor.settings.isCamelWords, Model.editorText, offset, ranges)
|
||||||
|
}
|
||||||
|
if (ranges.isEmpty()) return
|
||||||
|
|
||||||
|
Handler.reset()
|
||||||
|
editor.caretModel.caretsAndSelections = ranges.map {
|
||||||
|
CaretState(editor.offsetToLogicalPosition(it.endOffset), null, null)
|
||||||
|
}
|
||||||
|
editor.scrollingModel.scrollToCaret(ScrollType.MAKE_VISIBLE)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun selectAllWords() {
|
||||||
|
val ranges = ArrayList<TextRange>()
|
||||||
|
for (offset in Finder.allResults()) {
|
||||||
|
SelectWordUtil.addWordSelection(editor.settings.isCamelWords, Model.editorText, offset, ranges)
|
||||||
|
}
|
||||||
|
if (ranges.isEmpty()) return
|
||||||
|
|
||||||
|
Handler.reset()
|
||||||
|
editor.caretModel.caretsAndSelections = ranges.map {
|
||||||
|
val start = editor.offsetToLogicalPosition(it.startOffset)
|
||||||
|
val end = editor.offsetToLogicalPosition(it.endOffset)
|
||||||
|
CaretState(end, start, end)
|
||||||
|
}
|
||||||
|
editor.scrollingModel.scrollToCaret(ScrollType.MAKE_VISIBLE)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* When target mode is activated, selecting a tag will highlight an entire word.
|
|
||||||
*/
|
|
||||||
|
|
||||||
class AceTargetAction: AceAction() {
|
|
||||||
override fun customize() = Jumper.toggleMode(JumpMode.TARGET)
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* When line mode is activated, we will tag the beginning and end of each line.
|
|
||||||
*
|
|
||||||
* TODO: https://github.com/acejump/AceJump/issues/327
|
|
||||||
* TODO: https://github.com/acejump/AceJump/issues/340
|
|
||||||
*/
|
|
||||||
|
|
||||||
class AceLineAction: AceAction() {
|
|
||||||
override fun customize() = regexSearch(Pattern.LINE_MARK)
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* When declaration mode is activated, selecting a tag will take us to the
|
|
||||||
* definition (i.e. declaration) of the token in the editor, if it exists.
|
|
||||||
*/
|
|
||||||
|
|
||||||
class AceDefinitionAction: AceAction() {
|
|
||||||
override fun customize() = Jumper.toggleMode(JumpMode.DEFINE)
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* When word mode is activated, we will tag all words on the screen.
|
|
||||||
*/
|
|
||||||
|
|
||||||
class AceWordAction: AceAction() {
|
|
||||||
override fun customize() = regexSearch(ALL_WORDS, SCREEN_BOUNDARY)
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Search for words from the start of the screen to the caret
|
|
||||||
*/
|
|
||||||
|
|
||||||
class AceWordForwardAction: AceAction() {
|
|
||||||
override fun customize() = regexSearch(ALL_WORDS, AFTER_CARET_BOUNDARY)
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Search for words from the caret position to the start of the screen
|
|
||||||
*/
|
|
||||||
|
|
||||||
class AceWordBackwardsAction: AceAction() {
|
|
||||||
override fun customize() = regexSearch(ALL_WORDS, BEFORE_CARET_BOUNDARY)
|
|
||||||
}
|
|
@ -201,6 +201,8 @@ object Finder : Resettable {
|
|||||||
return kept
|
return kept
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun allResults() = results
|
||||||
|
|
||||||
fun visibleResults() = results.filter { it in viewBounds }
|
fun visibleResults() = results.filter { it in viewBounds }
|
||||||
|
|
||||||
private fun String.isValidQuery() =
|
private fun String.isValidQuery() =
|
||||||
|
@ -13,8 +13,9 @@ enum class JumpMode {
|
|||||||
|
|
||||||
companion object: Resettable {
|
companion object: Resettable {
|
||||||
private var modeIndex = 0
|
private var modeIndex = 0
|
||||||
private var mode: JumpMode = DISABLED
|
|
||||||
set(value) {
|
var mode: JumpMode = DISABLED
|
||||||
|
private set(value) {
|
||||||
field = value
|
field = value
|
||||||
setCaretColor(when (field) {
|
setCaretColor(when (field) {
|
||||||
JUMP -> AceConfig.jumpModeColor
|
JUMP -> AceConfig.jumpModeColor
|
||||||
|
@ -22,44 +22,47 @@
|
|||||||
|
|
||||||
<actions>
|
<actions>
|
||||||
<action id="AceAction"
|
<action id="AceAction"
|
||||||
class="org.acejump.control.AceAction"
|
class="org.acejump.control.AceAction$ActivateOrCycleMode"
|
||||||
text="Activate AceJump Mode"
|
text="Activate / Cycle AceJump Mode">
|
||||||
description="Targets a character in AceJump">
|
|
||||||
<keyboard-shortcut keymap="Mac OS X" first-keystroke="ctrl SEMICOLON"/>
|
<keyboard-shortcut keymap="Mac OS X" first-keystroke="ctrl SEMICOLON"/>
|
||||||
<keyboard-shortcut keymap="Mac OS X 10.5+" first-keystroke="ctrl SEMICOLON"/>
|
<keyboard-shortcut keymap="Mac OS X 10.5+" first-keystroke="ctrl SEMICOLON"/>
|
||||||
<keyboard-shortcut keymap="$default" first-keystroke="ctrl SEMICOLON"/>
|
<keyboard-shortcut keymap="$default" first-keystroke="ctrl SEMICOLON"/>
|
||||||
</action>
|
</action>
|
||||||
|
<action id="AceWordStartAction"
|
||||||
|
class="org.acejump.control.AceAction$ToggleJumpMode"
|
||||||
|
text="Start AceJump in Word Start Mode"/>
|
||||||
|
<action id="AceWordEndAction"
|
||||||
|
class="org.acejump.control.AceAction$ToggleJumpEndMode"
|
||||||
|
text="Start AceJump in Word End Mode"/>
|
||||||
|
<action id="AceTargetAction"
|
||||||
|
class="org.acejump.control.AceAction$ToggleSelectWordMode"
|
||||||
|
text="Start AceJump in Word Select Mode">
|
||||||
|
<keyboard-shortcut keymap="Mac OS X" first-keystroke="ctrl alt SEMICOLON"/>
|
||||||
|
<keyboard-shortcut keymap="Mac OS X 10.5+" first-keystroke="ctrl alt SEMICOLON"/>
|
||||||
|
<keyboard-shortcut keymap="$default" first-keystroke="ctrl alt SEMICOLON"/>
|
||||||
|
</action>
|
||||||
|
<action id="AceDeclarationAction"
|
||||||
|
class="org.acejump.control.AceAction$ToggleDefinitionMode"
|
||||||
|
text="Start AceJump in Declaration Mode"/>
|
||||||
<action id="AceLineAction"
|
<action id="AceLineAction"
|
||||||
class="org.acejump.control.AceLineAction"
|
class="org.acejump.control.AceAction$ToggleAllLinesMode"
|
||||||
text="Display Line Markers"
|
text="Start AceJump in All Lines Mode"
|
||||||
description="Targets line markers in AceJump">
|
description="Targets line markers in AceJump">
|
||||||
<keyboard-shortcut keymap="Mac OS X" first-keystroke="ctrl shift SEMICOLON"/>
|
<keyboard-shortcut keymap="Mac OS X" first-keystroke="ctrl shift SEMICOLON"/>
|
||||||
<keyboard-shortcut keymap="Mac OS X 10.5+" first-keystroke="ctrl shift SEMICOLON"/>
|
<keyboard-shortcut keymap="Mac OS X 10.5+" first-keystroke="ctrl shift SEMICOLON"/>
|
||||||
<keyboard-shortcut keymap="$default" first-keystroke="ctrl shift SEMICOLON"/>
|
<keyboard-shortcut keymap="$default" first-keystroke="ctrl shift SEMICOLON"/>
|
||||||
</action>
|
</action>
|
||||||
<action id="AceTargetAction"
|
|
||||||
class="org.acejump.control.AceTargetAction"
|
|
||||||
text="Start in Target Mode"
|
|
||||||
description="Targets a whole word in AceJump">
|
|
||||||
<keyboard-shortcut keymap="Mac OS X" first-keystroke="ctrl alt SEMICOLON"/>
|
|
||||||
<keyboard-shortcut keymap="Mac OS X 10.5+" first-keystroke="ctrl alt SEMICOLON"/>
|
|
||||||
<keyboard-shortcut keymap="$default" first-keystroke="ctrl alt SEMICOLON"/>
|
|
||||||
</action>
|
|
||||||
<action id="AceWordAction"
|
<action id="AceWordAction"
|
||||||
class="org.acejump.control.AceWordAction"
|
class="org.acejump.control.AceAction$ToggleAllWordsMode"
|
||||||
text="Start in Word Mode"
|
text="Start AceJump in All Words Mode"/>
|
||||||
description="Searches for all words on the screen in AceJump"/>
|
|
||||||
<action id="AceWordForwardAction"
|
<action id="AceWordForwardAction"
|
||||||
class="org.acejump.control.AceWordForwardAction"
|
class="org.acejump.control.AceAction$ToggleAllWordsForwardMode"
|
||||||
text="Start in Word Forward Mode"
|
text="Start in All Words After Caret Mode"/>
|
||||||
description="Searches for all visible words after the caret in AceJump"/>
|
|
||||||
<action id="AceWordBackwardsAction"
|
<action id="AceWordBackwardsAction"
|
||||||
class="org.acejump.control.AceWordBackwardsAction"
|
class="org.acejump.control.AceAction$ToggleAllWordsBackwardsMode"
|
||||||
text="Start in Word Backward Mode"
|
text="Start in All Words Before Caret Mode"/>
|
||||||
description="Searches for all visible words before the caret in AceJump"/>
|
<action id="AceActOnHighlightedWords"
|
||||||
<action id="AceDeclarationAction"
|
class="org.acejump.control.AceAction$ActOnHighlightedWords"
|
||||||
class="org.acejump.control.AceDefinitionAction"
|
text="Act on Highlighted Words"/>
|
||||||
text="Start in Declaration Mode"
|
|
||||||
description="AceJump will invoke the 'Navigate To' action after jumping"/>
|
|
||||||
</actions>
|
</actions>
|
||||||
</idea-plugin>
|
</idea-plugin>
|
||||||
|
Loading…
Reference in New Issue
Block a user