mirror of
https://github.com/chylex/IntelliJ-AceJump.git
synced 2025-04-09 17:15:43 +02:00
Slight renaming and show a previously typed visual indicator
This commit is contained in:
parent
2bc68e366b
commit
658a29175a
src/main/kotlin/com/johnlindquist/acejump
@ -9,7 +9,7 @@ class DefaultKeyCommand(override val aceFinder: AceFinder) : AceKeyCommand() {
|
||||
if (key == '\b') return
|
||||
|
||||
//Find or jump
|
||||
aceFinder.findText(text, key)
|
||||
aceFinder.find(text, key)
|
||||
aceFinder.eventDispatcher.multicaster.stateChanged(ChangeEvent("AceFinder"))
|
||||
}
|
||||
}
|
@ -1,9 +1,9 @@
|
||||
package com.johnlindquist.acejump.keycommands
|
||||
|
||||
import com.johnlindquist.acejump.search.AceFinder
|
||||
import com.johnlindquist.acejump.search.Regexp.END_OF_LINE
|
||||
import com.johnlindquist.acejump.search.Pattern.END_OF_LINE
|
||||
|
||||
class ShowEndOfLines(override val aceFinder: AceFinder) : AceKeyCommand() {
|
||||
override fun execute(key: Char, text: String) =
|
||||
aceFinder.findText(END_OF_LINE)
|
||||
aceFinder.findPattern(END_OF_LINE)
|
||||
}
|
@ -1,9 +1,9 @@
|
||||
package com.johnlindquist.acejump.keycommands
|
||||
|
||||
import com.johnlindquist.acejump.search.AceFinder
|
||||
import com.johnlindquist.acejump.search.Regexp.CODE_INDENTS
|
||||
import com.johnlindquist.acejump.search.Pattern.CODE_INDENTS
|
||||
|
||||
class ShowFirstLetters(override val aceFinder: AceFinder) : AceKeyCommand() {
|
||||
override fun execute(key: Char, text: String) =
|
||||
aceFinder.findText(CODE_INDENTS)
|
||||
aceFinder.findPattern(CODE_INDENTS)
|
||||
}
|
@ -1,9 +1,9 @@
|
||||
package com.johnlindquist.acejump.keycommands
|
||||
|
||||
import com.johnlindquist.acejump.search.AceFinder
|
||||
import com.johnlindquist.acejump.search.Regexp.BEGINNING_OF_LINE
|
||||
import com.johnlindquist.acejump.search.Pattern.BEGINNING_OF_LINE
|
||||
|
||||
class ShowStartOfLines(override val aceFinder: AceFinder) : AceKeyCommand() {
|
||||
override fun execute(key: Char, text: String) =
|
||||
aceFinder.findText(BEGINNING_OF_LINE)
|
||||
aceFinder.findPattern(BEGINNING_OF_LINE)
|
||||
}
|
@ -1,9 +1,9 @@
|
||||
package com.johnlindquist.acejump.keycommands
|
||||
|
||||
import com.johnlindquist.acejump.search.AceFinder
|
||||
import com.johnlindquist.acejump.search.Regexp.WHITE_SPACE
|
||||
import com.johnlindquist.acejump.search.Pattern.WHITE_SPACE
|
||||
|
||||
class ShowWhiteSpace(override val aceFinder: AceFinder) : AceKeyCommand() {
|
||||
override fun execute(key: Char, text: String) =
|
||||
aceFinder.findText(WHITE_SPACE)
|
||||
aceFinder.findPattern(WHITE_SPACE)
|
||||
}
|
@ -15,6 +15,7 @@ import javax.swing.event.ChangeListener
|
||||
import kotlin.comparisons.compareBy
|
||||
|
||||
class AceFinder(val findManager: FindManager, val editor: EditorImpl) {
|
||||
var queryString: String = ""
|
||||
val document = editor.document as DocumentImpl
|
||||
val eventDispatcher = EventDispatcher.create(ChangeListener::class.java)
|
||||
val findModel: FindModel = findManager.findInFileModel.clone()
|
||||
@ -46,12 +47,12 @@ class AceFinder(val findManager: FindManager, val editor: EditorImpl) {
|
||||
findModel.setSearchHighlighters(true)
|
||||
}
|
||||
|
||||
fun findText(text: String, key: Char) {
|
||||
fun find(text: String, key: Char) {
|
||||
if (key == 0.toChar())
|
||||
reset()
|
||||
|
||||
queryString = text
|
||||
findModel.stringToFind = text
|
||||
populateNgrams()
|
||||
|
||||
val application = ApplicationManager.getApplication()
|
||||
application.runReadAction(jump(key))
|
||||
@ -61,13 +62,6 @@ class AceFinder(val findManager: FindManager, val editor: EditorImpl) {
|
||||
})
|
||||
}
|
||||
|
||||
private fun populateNgrams() {
|
||||
val a_z = 'a'..'z'
|
||||
unseen1grams.addAll(a_z.mapTo(linkedSetOf(), { "$it" }))
|
||||
unseen1grams.addAll(('0'..'9').mapTo(linkedSetOf(), { "$it" }))
|
||||
a_z.flatMapTo(unseen2grams, { e -> a_z.map { c -> "${e}$c" } })
|
||||
}
|
||||
|
||||
var targetModeEnabled = false
|
||||
fun toggleTargetMode(): Boolean {
|
||||
targetModeEnabled = !targetModeEnabled
|
||||
@ -91,7 +85,7 @@ class AceFinder(val findManager: FindManager, val editor: EditorImpl) {
|
||||
return {
|
||||
jumpLocations = determineJumpLocations()
|
||||
if (jumpLocations.size <= 1) {
|
||||
val text = findModel.stringToFind.toLowerCase()
|
||||
val text = queryString.toLowerCase()
|
||||
if (tagMap.containsKey(text)) {
|
||||
jumpTo(JumpInfo(text, text, tagMap[text]!!, editor))
|
||||
} else if (2 <= text.length) {
|
||||
@ -107,20 +101,26 @@ class AceFinder(val findManager: FindManager, val editor: EditorImpl) {
|
||||
}
|
||||
}
|
||||
|
||||
var sitesToCheck: List<Int> = listOf()
|
||||
|
||||
private fun determineJumpLocations(): Collection<JumpInfo> {
|
||||
populateNgrams()
|
||||
val fullText = document.charsSequence.toString().toLowerCase()
|
||||
sitesToCheck = getSitesInView(fullText)
|
||||
val sitesToCheck = getSitesInView(fullText)
|
||||
val existingDigraphs = makeMap(fullText, sitesToCheck)
|
||||
if (existingDigraphs.isEmpty)
|
||||
tagMap = filterTags(tagMap, findModel.stringToFind)
|
||||
tagMap = filterTags(tagMap, queryString)
|
||||
else
|
||||
tagMap = compact(mapUniqueDigraphs(existingDigraphs))
|
||||
|
||||
return plotJumpLocations()
|
||||
}
|
||||
|
||||
fun populateNgrams() {
|
||||
val a_z = 'a'..'z'
|
||||
unseen1grams.addAll(a_z.mapTo(linkedSetOf(), { "$it" }))
|
||||
unseen1grams.addAll(('0'..'9').mapTo(linkedSetOf(), { "$it" }))
|
||||
a_z.flatMapTo(unseen2grams, { e -> a_z.map { c -> "${e}$c" } })
|
||||
}
|
||||
|
||||
private fun filterTags(tags: BiMap<String, Int>, prefix: String) =
|
||||
tags.filterTo(HashBiMap.create(tags.size), { e ->
|
||||
prefix.endsWith(e.key) || prefix.endsWith(e.key[0])
|
||||
@ -131,15 +131,15 @@ class AceFinder(val findManager: FindManager, val editor: EditorImpl) {
|
||||
val firstCharacter = e.key[0].toString()
|
||||
if (tagMap.keys.count { it[0] == e.key[0] } == 1 &&
|
||||
unseen1grams.contains(firstCharacter) &&
|
||||
!findModel.stringToFind.endsWith(firstCharacter) &&
|
||||
!findModel.stringToFind.endsWith(e.key))
|
||||
!queryString.endsWith(firstCharacter) &&
|
||||
!queryString.endsWith(e.key))
|
||||
firstCharacter
|
||||
else e.key
|
||||
})
|
||||
|
||||
private fun getSitesInView(fullText: String): List<Int> {
|
||||
fun getSitesToCheck(window: String): Iterable<Int> {
|
||||
if (findModel.stringToFind.isEmpty())
|
||||
if (queryString.isEmpty())
|
||||
return 0..(window.length - 2)
|
||||
|
||||
val indicesToCheck = arrayListOf<Int>()
|
||||
@ -162,7 +162,7 @@ class AceFinder(val findManager: FindManager, val editor: EditorImpl) {
|
||||
for (site in sites) {
|
||||
var (p1, p2) = Pair(site, site + 1)
|
||||
var (c1, c2) = Pair(text[p1], text[p2])
|
||||
val origin = p1 - findModel.stringToFind.length
|
||||
val origin = p1 - queryString.length
|
||||
stringToIndex.put("$c1", origin)
|
||||
stringToIndex.put("$c1$c2", origin)
|
||||
unseen1grams.remove("$c1")
|
||||
@ -209,8 +209,7 @@ class AceFinder(val findManager: FindManager, val editor: EditorImpl) {
|
||||
|
||||
// Add pre-existing tags where search string and tag are intermingled
|
||||
for (entry in tagMap) {
|
||||
val search = findModel.stringToFind
|
||||
if (search == entry.key || search.last() == entry.key.first()) {
|
||||
if (queryString == entry.key || queryString.last() == entry.key.first()) {
|
||||
newTagMap[entry.key] = entry.value
|
||||
unusedNgrams.remove(entry.key[0].toString())
|
||||
}
|
||||
@ -229,7 +228,7 @@ class AceFinder(val findManager: FindManager, val editor: EditorImpl) {
|
||||
}
|
||||
|
||||
val remainingSites = remaining.filter {
|
||||
it.key.first().isLetterOrDigit() || findModel.stringToFind.isNotEmpty()
|
||||
it.key.first().isLetterOrDigit() || queryString.isNotEmpty()
|
||||
}.flatMap { it.value }.listIterator()
|
||||
|
||||
while (remainingSites.hasNext() && unusedNgrams.isNotEmpty())
|
||||
@ -238,15 +237,15 @@ class AceFinder(val findManager: FindManager, val editor: EditorImpl) {
|
||||
return newTagMap
|
||||
}
|
||||
|
||||
fun findText(text: Regexp) {
|
||||
fun findPattern(text: Pattern) {
|
||||
findModel.isRegularExpressions = true
|
||||
findText(text.pattern, 0.toChar())
|
||||
find(text.pattern, 0.toChar())
|
||||
findModel.isRegularExpressions = false
|
||||
}
|
||||
|
||||
fun plotJumpLocations(): List<JumpInfo> {
|
||||
return tagMap.values.map {
|
||||
JumpInfo(tagMap.inverse()[it]!!, findModel.stringToFind, it, editor)
|
||||
JumpInfo(tagMap.inverse()[it]!!, queryString, it, editor)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1,6 +1,6 @@
|
||||
package com.johnlindquist.acejump.search
|
||||
|
||||
enum class Regexp(val pattern: String) {
|
||||
enum class Pattern(val pattern: String) {
|
||||
END_OF_LINE("\\n"),
|
||||
BEGINNING_OF_LINE("^.|\\n(?<!.\\n)"),
|
||||
CODE_INDENTS("^\\s*\\S"),
|
@ -4,8 +4,7 @@ import com.intellij.openapi.editor.impl.EditorImpl
|
||||
import com.johnlindquist.acejump.search.getPointFromVisualPosition
|
||||
import java.awt.AlphaComposite
|
||||
import java.awt.Color
|
||||
import java.awt.Color.BLACK
|
||||
import java.awt.Color.yellow
|
||||
import java.awt.Color.*
|
||||
import java.awt.Graphics2D
|
||||
import java.awt.RenderingHints
|
||||
|
||||
@ -17,6 +16,7 @@ class JumpInfo(private val tag: String, var search: String, val index: Int, val
|
||||
var originOffset = editor.offsetToVisualPosition(offset)
|
||||
var tagOffset = editor.offsetToVisualPosition(offset + search.length)
|
||||
var tagPoint = getPointFromVisualPosition(editor, originOffset).originalPoint
|
||||
var srcPoint = getPointFromVisualPosition(editor, originOffset).originalPoint
|
||||
|
||||
fun renderTag(): String {
|
||||
var trueOffset = 0
|
||||
@ -30,13 +30,11 @@ class JumpInfo(private val tag: String, var search: String, val index: Int, val
|
||||
tagOffset = editor.offsetToVisualPosition(offset + trueOffset)
|
||||
tagPoint = getPointFromVisualPosition(editor, tagOffset).originalPoint
|
||||
return tag
|
||||
// .mapIndexed { i, c ->
|
||||
// if (source.isEmpty() || source[i] == c.toLowerCase()) ' ' else c
|
||||
// }.joinToString("")
|
||||
}
|
||||
|
||||
fun drawRect(g2d: Graphics2D, fbm: AceCanvas.FontBasedMeasurements, colors: Pair<Color, Color>) {
|
||||
val text = renderTag()
|
||||
val origin = srcPoint
|
||||
val original = tagPoint
|
||||
val backgroundColor = yellow//if (text[0] == ' ') Color.YELLOW else colors.first
|
||||
val foregroundColor = yellow//if (text[0] == ' ') Color.YELLOW else colors.second
|
||||
@ -44,17 +42,24 @@ class JumpInfo(private val tag: String, var search: String, val index: Int, val
|
||||
original.translate(0, -fbm.hOffset.toInt())
|
||||
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON)
|
||||
|
||||
g2d.color = green
|
||||
if (search.isNotEmpty()) {
|
||||
g2d.drawRect(origin.x - fbm.rectMarginWidth - 1,
|
||||
origin.y - fbm.rectHOffset.toInt() - 1,
|
||||
search.length * fbm.fontWidth, fbm.lineHeight.toInt() + 1)
|
||||
}
|
||||
|
||||
//a slight border for "pop" against the background
|
||||
g2d.color = backgroundColor
|
||||
|
||||
if (text.length == 2) {
|
||||
g2d.drawRect(original.x - fbm.rectMarginWidth - 1,
|
||||
original.y - fbm.rectHOffset.toInt() - 1,
|
||||
fbm.rectWidth + fbm.fontWidth + 5, fbm.lineHeight.toInt() + 1)
|
||||
fbm.rectWidth + fbm.fontWidth, fbm.lineHeight.toInt() + 1)
|
||||
} else {
|
||||
g2d.drawRect(original.x - fbm.rectMarginWidth - 1,
|
||||
original.y - fbm.rectHOffset.toInt() - 1,
|
||||
fbm.rectWidth + 1, fbm.lineHeight.toInt() + 1)
|
||||
fbm.rectWidth, fbm.lineHeight.toInt() + 1)
|
||||
}
|
||||
|
||||
//the background rectangle
|
||||
@ -63,7 +68,7 @@ class JumpInfo(private val tag: String, var search: String, val index: Int, val
|
||||
if (text.length == 2) {
|
||||
g2d.fillRect(original.x - fbm.rectMarginWidth,
|
||||
original.y - fbm.rectHOffset.toInt(),
|
||||
fbm.rectWidth + fbm.fontWidth + 5, fbm.lineHeight.toInt())
|
||||
fbm.rectWidth + fbm.fontWidth, fbm.lineHeight.toInt())
|
||||
} else {
|
||||
g2d.fillRect(original.x - fbm.rectMarginWidth,
|
||||
original.y - fbm.rectHOffset.toInt(),
|
||||
|
Loading…
Reference in New Issue
Block a user