mirror of
				https://github.com/chylex/IntelliJ-AceJump.git
				synced 2025-11-04 09:40:10 +01:00 
			
		
		
		
	Compare commits
	
		
			1 Commits
		
	
	
		
			35003b0bab
			...
			customized
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| b73e5f1ae5 | 
@@ -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() {
 | 
				
			||||||
 * When target mode is activated, selecting a tag will highlight an entire word.
 | 
					    override fun invoke() = Jumper.toggleMode(JumpMode.JUMP)
 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
class AceTargetAction: AceAction() {
 | 
					 | 
				
			||||||
  override fun customize() = Jumper.toggleMode(JumpMode.TARGET)
 | 
					 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					  object ToggleJumpEndMode: AceAction() {
 | 
				
			||||||
 * When line mode is activated, we will tag the beginning and end of each line.
 | 
					    override fun invoke() = Jumper.toggleMode(JumpMode.JUMP_END)
 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * 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)
 | 
					 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					  object ToggleSelectWordMode: AceAction() {
 | 
				
			||||||
 * When declaration mode is activated, selecting a tag will take us to the
 | 
					    override fun invoke() = Jumper.toggleMode(JumpMode.TARGET)
 | 
				
			||||||
 * definition (i.e. declaration) of the token in the editor, if it exists.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
class AceDefinitionAction: AceAction() {
 | 
					 | 
				
			||||||
  override fun customize() = Jumper.toggleMode(JumpMode.DEFINE)
 | 
					 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					  object ToggleDefinitionMode: AceAction() {
 | 
				
			||||||
 * When word mode is activated, we will tag all words on the screen.
 | 
					    override fun invoke() = Jumper.toggleMode(JumpMode.DEFINE)
 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
class AceWordAction: AceAction() {
 | 
					 | 
				
			||||||
  override fun customize() = regexSearch(ALL_WORDS, SCREEN_BOUNDARY)
 | 
					 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					  object ToggleAllLinesMode: AceAction() {
 | 
				
			||||||
 * Search for words from the start of the screen to the caret
 | 
					    override fun invoke() = regexSearch(Pattern.LINE_MARK)
 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
class AceWordForwardAction: AceAction() {
 | 
					 | 
				
			||||||
  override fun customize() = regexSearch(ALL_WORDS, AFTER_CARET_BOUNDARY)
 | 
					 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					  object ToggleAllWordsMode: AceAction() {
 | 
				
			||||||
 * Search for words from the caret position to the start of the screen
 | 
					    override fun invoke() = regexSearch(ALL_WORDS, SCREEN_BOUNDARY)
 | 
				
			||||||
 */
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class AceWordBackwardsAction: AceAction() {
 | 
					  object ToggleAllWordsForwardMode: AceAction() {
 | 
				
			||||||
  override fun customize() = regexSearch(ALL_WORDS, BEFORE_CARET_BOUNDARY)
 | 
					    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)
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -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>
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user