mirror of
				https://github.com/chylex/IntelliJ-IdeaVim.git
				synced 2025-11-04 01:40:12 +01:00 
			
		
		
		
	Compare commits
	
		
			22 Commits
		
	
	
		
			0937234558
			...
			7c7e7728f2
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						
						
							
						
						7c7e7728f2
	
				 | 
					
					
						|||
| 
						
						
							
						
						de930ed57c
	
				 | 
					
					
						|||
| 
						
						
							
						
						590d5bd22d
	
				 | 
					
					
						|||
| 
						
						
							
						
						69c748d881
	
				 | 
					
					
						|||
| 
						
						
							
						
						144cc5c3fc
	
				 | 
					
					
						|||
| 
						
						
							
						
						fb270cdbc5
	
				 | 
					
					
						|||
| 
						
						
							
						
						ce6a296233
	
				 | 
					
					
						|||
| 
						
						
							
						
						949f359b98
	
				 | 
					
					
						|||
| 
						
						
							
						
						c922426e02
	
				 | 
					
					
						|||
| 
						
						
							
						
						9240e82f2d
	
				 | 
					
					
						|||
| 
						
						
							
						
						a1639d80b0
	
				 | 
					
					
						|||
| 
						
						
							
						
						7860b98107
	
				 | 
					
					
						|||
| 
						
						
							
						
						7157f9c5a5
	
				 | 
					
					
						|||
| 
						
						
							
						
						1522618cd6
	
				 | 
					
					
						|||
| 
						
						
							
						
						09862c8356
	
				 | 
					
					
						|||
| 
						
						
							
						
						c6ef3f286f
	
				 | 
					
					
						|||
| 
						
						
							
						
						b358e63444
	
				 | 
					
					
						|||
| 
						
						
							
						
						7ac743c604
	
				 | 
					
					
						|||
| 
						
						
							
						
						db3d3fc608
	
				 | 
					
					
						|||
| 
						
						
							
						
						14d313907b
	
				 | 
					
					
						|||
| 
						
						
							
						
						fe37a69544
	
				 | 
					
					
						|||
| 
						
						
							
						
						54de3dac25
	
				 | 
					
					
						
@@ -127,7 +127,7 @@ dependencies {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    // AceJump is an optional dependency. We use their SessionManager class to check if it's active
 | 
					    // AceJump is an optional dependency. We use their SessionManager class to check if it's active
 | 
				
			||||||
    plugin("AceJump", "3.8.19")
 | 
					    plugin("AceJump", "3.8.19")
 | 
				
			||||||
    plugin("com.intellij.classic.ui", "242.20224.159")
 | 
					    plugin("com.intellij.classic.ui", "243.21565.122")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    bundledPlugins("org.jetbrains.plugins.terminal", "com.intellij.modules.json")
 | 
					    bundledPlugins("org.jetbrains.plugins.terminal", "com.intellij.modules.json")
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -16,11 +16,11 @@
 | 
				
			|||||||
# https://data.services.jetbrains.com/products?code=IC
 | 
					# https://data.services.jetbrains.com/products?code=IC
 | 
				
			||||||
# Maven releases are here: https://www.jetbrains.com/intellij-repository/releases
 | 
					# Maven releases are here: https://www.jetbrains.com/intellij-repository/releases
 | 
				
			||||||
# And snapshots: https://www.jetbrains.com/intellij-repository/snapshots
 | 
					# And snapshots: https://www.jetbrains.com/intellij-repository/snapshots
 | 
				
			||||||
ideaVersion=2024.3.3
 | 
					ideaVersion=2024.3
 | 
				
			||||||
# Values for type: https://plugins.jetbrains.com/docs/intellij/tools-gradle-intellij-plugin.html#intellij-extension-type
 | 
					# Values for type: https://plugins.jetbrains.com/docs/intellij/tools-gradle-intellij-plugin.html#intellij-extension-type
 | 
				
			||||||
ideaType=IC
 | 
					ideaType=IC
 | 
				
			||||||
instrumentPluginCode=true
 | 
					instrumentPluginCode=true
 | 
				
			||||||
version=chylex-43
 | 
					version=chylex-44
 | 
				
			||||||
javaVersion=21
 | 
					javaVersion=21
 | 
				
			||||||
remoteRobotVersion=0.11.23
 | 
					remoteRobotVersion=0.11.23
 | 
				
			||||||
antlrVersion=4.10.1
 | 
					antlrVersion=4.10.1
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -17,6 +17,7 @@ import com.intellij.openapi.editor.markup.HighlighterLayer
 | 
				
			|||||||
import com.intellij.openapi.editor.markup.HighlighterTargetArea
 | 
					import com.intellij.openapi.editor.markup.HighlighterTargetArea
 | 
				
			||||||
import com.intellij.openapi.editor.markup.RangeHighlighter
 | 
					import com.intellij.openapi.editor.markup.RangeHighlighter
 | 
				
			||||||
import com.intellij.openapi.editor.markup.TextAttributes
 | 
					import com.intellij.openapi.editor.markup.TextAttributes
 | 
				
			||||||
 | 
					import com.intellij.util.application
 | 
				
			||||||
import com.maddyhome.idea.vim.api.VimEditor
 | 
					import com.maddyhome.idea.vim.api.VimEditor
 | 
				
			||||||
import com.maddyhome.idea.vim.api.globalOptions
 | 
					import com.maddyhome.idea.vim.api.globalOptions
 | 
				
			||||||
import com.maddyhome.idea.vim.api.injector
 | 
					import com.maddyhome.idea.vim.api.injector
 | 
				
			||||||
@@ -30,6 +31,7 @@ import com.maddyhome.idea.vim.state.mode.inVisualMode
 | 
				
			|||||||
import org.jetbrains.annotations.Contract
 | 
					import org.jetbrains.annotations.Contract
 | 
				
			||||||
import java.awt.Font
 | 
					import java.awt.Font
 | 
				
			||||||
import java.util.*
 | 
					import java.util.*
 | 
				
			||||||
 | 
					import javax.swing.Timer
 | 
				
			||||||
 | 
					
 | 
				
			||||||
internal fun updateSearchHighlights(
 | 
					internal fun updateSearchHighlights(
 | 
				
			||||||
  pattern: String?,
 | 
					  pattern: String?,
 | 
				
			||||||
@@ -84,6 +86,12 @@ internal fun addSubstitutionConfirmationHighlight(editor: Editor, start: Int, en
 | 
				
			|||||||
  )
 | 
					  )
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					val removeHighlightsEditors = mutableListOf<Editor>()
 | 
				
			||||||
 | 
					val removeHighlightsTimer = Timer(400) {
 | 
				
			||||||
 | 
					  removeHighlightsEditors.forEach(::removeSearchHighlights)
 | 
				
			||||||
 | 
					  removeHighlightsEditors.clear()
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * Refreshes current search highlights for all visible editors
 | 
					 * Refreshes current search highlights for all visible editors
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
@@ -125,27 +133,43 @@ private fun updateSearchHighlights(
 | 
				
			|||||||
      // hlsearch (+ incsearch/noincsearch)
 | 
					      // hlsearch (+ incsearch/noincsearch)
 | 
				
			||||||
      // Make sure the range fits this editor. Note that Vim will use the same range for all windows. E.g., given
 | 
					      // Make sure the range fits this editor. Note that Vim will use the same range for all windows. E.g., given
 | 
				
			||||||
      // `:1,5s/foo`, Vim will highlight all occurrences of `foo` in the first five lines of all visible windows
 | 
					      // `:1,5s/foo`, Vim will highlight all occurrences of `foo` in the first five lines of all visible windows
 | 
				
			||||||
      val vimEditor = editor.vim
 | 
					      val isSearching = injector.commandLine.getActiveCommandLine() != null
 | 
				
			||||||
      val editorLastLine = vimEditor.lineCount() - 1
 | 
					      application.invokeLater {
 | 
				
			||||||
      val searchStartLine = searchRange?.startLine ?: 0
 | 
					        val vimEditor = editor.vim
 | 
				
			||||||
      val searchEndLine = (searchRange?.endLine ?: -1).coerceAtMost(editorLastLine)
 | 
					        val editorLastLine = vimEditor.lineCount() - 1
 | 
				
			||||||
      if (searchStartLine <= editorLastLine) {
 | 
					        val searchStartLine = searchRange?.startLine ?: 0
 | 
				
			||||||
        val results =
 | 
					        val searchEndLine = (searchRange?.endLine ?: -1).coerceAtMost(editorLastLine)
 | 
				
			||||||
          injector.searchHelper.findAll(
 | 
					        if (searchStartLine <= editorLastLine) {
 | 
				
			||||||
            vimEditor,
 | 
					          val visibleArea = editor.scrollingModel.visibleAreaOnScrollingFinished
 | 
				
			||||||
            pattern,
 | 
					          val visibleTopLeft = visibleArea.location
 | 
				
			||||||
            searchStartLine,
 | 
					          val visibleBottomRight = visibleArea.location.apply { translate(visibleArea.width, visibleArea.height) }
 | 
				
			||||||
            searchEndLine,
 | 
					          val visibleStartOffset = editor.logicalPositionToOffset(editor.xyToLogicalPosition(visibleTopLeft))
 | 
				
			||||||
            shouldIgnoreCase(pattern, shouldIgnoreSmartCase)
 | 
					          val visibleEndOffset = editor.logicalPositionToOffset(editor.xyToLogicalPosition(visibleBottomRight))
 | 
				
			||||||
          )
 | 
					          val visibleStartLine = editor.document.getLineNumber(visibleStartOffset)
 | 
				
			||||||
        if (results.isNotEmpty()) {
 | 
					          val visibleEndLine = editor.document.getLineNumber(visibleEndOffset)
 | 
				
			||||||
          if (editor === currentEditor?.ij) {
 | 
					          removeSearchHighlights(editor)
 | 
				
			||||||
            currentMatchOffset = findClosestMatch(results, initialOffset, count1, forwards)
 | 
					
 | 
				
			||||||
 | 
					          val results =
 | 
				
			||||||
 | 
					            injector.searchHelper.findAll(
 | 
				
			||||||
 | 
					              vimEditor,
 | 
				
			||||||
 | 
					              pattern,
 | 
				
			||||||
 | 
					              searchStartLine.coerceAtLeast(visibleStartLine),
 | 
				
			||||||
 | 
					              searchEndLine.coerceAtMost(visibleEndLine),
 | 
				
			||||||
 | 
					              shouldIgnoreCase(pattern, shouldIgnoreSmartCase)
 | 
				
			||||||
 | 
					            )
 | 
				
			||||||
 | 
					          if (results.isNotEmpty()) {
 | 
				
			||||||
 | 
					            if (editor === currentEditor?.ij) {
 | 
				
			||||||
 | 
					              currentMatchOffset = findClosestMatch(results, initialOffset, count1, forwards)
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            highlightSearchResults(editor, pattern, results, currentMatchOffset)
 | 
				
			||||||
 | 
					            if (!isSearching) {
 | 
				
			||||||
 | 
					              removeHighlightsEditors.add(editor)
 | 
				
			||||||
 | 
					              removeHighlightsTimer.restart()
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
          highlightSearchResults(editor, pattern, results, currentMatchOffset)
 | 
					 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					        editor.vimLastSearch = pattern
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
      editor.vimLastSearch = pattern
 | 
					 | 
				
			||||||
    } else if (shouldAddCurrentMatchSearchHighlight(pattern, showHighlights, initialOffset)) {
 | 
					    } else if (shouldAddCurrentMatchSearchHighlight(pattern, showHighlights, initialOffset)) {
 | 
				
			||||||
      // nohlsearch + incsearch. Even though search highlights are disabled, we still show a highlight (current editor
 | 
					      // nohlsearch + incsearch. Even though search highlights are disabled, we still show a highlight (current editor
 | 
				
			||||||
      // only), because 'incsearch' is active. But we don't show a search if Visual is active (behind Command-line of
 | 
					      // only), because 'incsearch' is active. But we don't show a search if Visual is active (behind Command-line of
 | 
				
			||||||
@@ -179,6 +203,7 @@ private fun updateSearchHighlights(
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  removeHighlightsTimer.restart()
 | 
				
			||||||
  return currentEditorCurrentMatchOffset
 | 
					  return currentEditorCurrentMatchOffset
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -204,7 +229,7 @@ private fun removeSearchHighlights(editor: Editor) {
 | 
				
			|||||||
 */
 | 
					 */
 | 
				
			||||||
@Contract("_, _, false -> false; _, null, true -> false")
 | 
					@Contract("_, _, false -> false; _, null, true -> false")
 | 
				
			||||||
private fun shouldAddAllSearchHighlights(editor: Editor, newPattern: String?, hlSearch: Boolean): Boolean {
 | 
					private fun shouldAddAllSearchHighlights(editor: Editor, newPattern: String?, hlSearch: Boolean): Boolean {
 | 
				
			||||||
  return hlSearch && newPattern != null && newPattern != editor.vimLastSearch && newPattern != ""
 | 
					  return hlSearch && newPattern != null && newPattern != ""
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
private fun findClosestMatch(
 | 
					private fun findClosestMatch(
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -425,7 +425,7 @@ internal object VimListenerManager {
 | 
				
			|||||||
      
 | 
					      
 | 
				
			||||||
      MotionGroup.fileEditorManagerSelectionChangedCallback(event)
 | 
					      MotionGroup.fileEditorManagerSelectionChangedCallback(event)
 | 
				
			||||||
      FileGroup.fileEditorManagerSelectionChangedCallback(event)
 | 
					      FileGroup.fileEditorManagerSelectionChangedCallback(event)
 | 
				
			||||||
      VimPlugin.getSearch().fileEditorManagerSelectionChangedCallback(event)
 | 
					//      VimPlugin.getSearch().fileEditorManagerSelectionChangedCallback(event)
 | 
				
			||||||
      IjVimRedrawService.fileEditorManagerSelectionChangedCallback(event)
 | 
					      IjVimRedrawService.fileEditorManagerSelectionChangedCallback(event)
 | 
				
			||||||
      VimLastSelectedEditorTracker.setLastSelectedEditor(event.newEditor)
 | 
					      VimLastSelectedEditorTracker.setLastSelectedEditor(event.newEditor)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user