Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions src/main/java/com/maddyhome/idea/vim/VimPlugin.java
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,6 @@
import com.maddyhome.idea.vim.listener.VimListenerManager;
import com.maddyhome.idea.vim.newapi.IjVimInjectorKt;
import com.maddyhome.idea.vim.newapi.IjVimSearchGroup;
import com.maddyhome.idea.vim.thinapi.IjPluginExtensionsScanner;
import com.maddyhome.idea.vim.ui.StatusBarIconFactory;
import com.maddyhome.idea.vim.vimscript.services.VariableService;
import com.maddyhome.idea.vim.yank.YankGroupBase;
Expand Down Expand Up @@ -248,7 +247,10 @@ public static void clearError() {
}

public static void showMessage(@Nls(capitalization = Nls.Capitalization.Sentence) @Nullable String msg) {
VimInjectorKt.getInjector().getMessages().showStatusBarMessage(null, msg);
VimEditor editor = VimInjectorKt.getInjector().getEditorGroup().getFocusedEditor();
if (editor != null) {
VimInjectorKt.getInjector().getMessages().showErrorMessage(editor, msg);
}
}

public static @NotNull VimPlugin getInstance() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ private fun doOperatorAction(
): Boolean {
val operatorfunc = injector.optionGroup.getOptionValue(Options.operatorfunc, OptionAccessScope.GLOBAL(editor))
if (operatorfunc.value.isEmpty()) {
injector.messages.showStatusBarMessage(editor, injector.messages.message("E774"))
injector.messages.showErrorMessage(editor, injector.messages.message("E774"))
return false
}

Expand All @@ -68,7 +68,7 @@ private fun doOperatorAction(
VimRepeater.repeatHandler = saveRepeatHandler
return true
} catch (e: ExException) {
injector.messages.showStatusBarMessage(editor, e.message)
injector.messages.showErrorMessage(editor, e.message)
return false
}
}
Expand Down
157 changes: 0 additions & 157 deletions src/main/java/com/maddyhome/idea/vim/ex/ExOutputModel.kt

This file was deleted.

4 changes: 3 additions & 1 deletion src/main/java/com/maddyhome/idea/vim/group/FileGroup.kt
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,9 @@ class FileGroup : VimFileBase() {
return true
}
} else {
injector.messages.showStatusBarMessage(null, injector.messages.message("message.open.file.not.found", filename))
injector.editorGroup.getFocusedEditor()?.let { editor ->
injector.messages.showErrorMessage(editor, injector.messages.message("message.open.file.not.found", filename))
}

return false
}
Expand Down
4 changes: 2 additions & 2 deletions src/main/java/com/maddyhome/idea/vim/group/KeyGroup.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright 2003-2023 The IdeaVim authors
* Copyright 2003-2026 The IdeaVim authors
*
* Use of this source code is governed by an MIT-style
* license that can be found in the LICENSE.txt file or at
Expand Down Expand Up @@ -388,7 +388,7 @@ public boolean showKeyMappings(@NotNull Set<? extends MappingMode> modes,

VimOutputPanel outputPanel = injector.getOutputPanel()
.getOrCreate(editor, injector.getExecutionContextManager().getEditorExecutionContext(editor));
outputPanel.addText(builder.toString(), true);
outputPanel.addText(builder.toString(), true, null);
outputPanel.show();
return true;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright 2003-2023 The IdeaVim authors
* Copyright 2003-2026 The IdeaVim authors
*
* Use of this source code is governed by an MIT-style
* license that can be found in the LICENSE.txt file or at
Expand All @@ -23,13 +23,12 @@ import com.maddyhome.idea.vim.api.LocalMarkStorage
import com.maddyhome.idea.vim.api.SelectionInfo
import com.maddyhome.idea.vim.common.InsertSequence
import com.maddyhome.idea.vim.common.VimEditorReplaceMask
import com.maddyhome.idea.vim.ex.ExOutputModel
import com.maddyhome.idea.vim.group.visual.VisualChange
import com.maddyhome.idea.vim.group.visual.vimLeadSelectionOffset
import com.maddyhome.idea.vim.newapi.vim
import com.maddyhome.idea.vim.state.mode.Mode
import com.maddyhome.idea.vim.state.mode.SelectionType
import com.maddyhome.idea.vim.ui.ExOutputPanel
import com.maddyhome.idea.vim.ui.OutputPanel
import kotlin.properties.ReadWriteProperty
import kotlin.reflect.KProperty

Expand Down Expand Up @@ -108,7 +107,6 @@ internal var Editor.vimInitialised: Boolean by userDataOr { false }
internal fun unInitializeEditor(editor: Editor) {
editor.vimLastSelectionType = null
editor.vimMorePanel = null
editor.vimExOutput = null
editor.vimLastHighlighters = null
editor.vimInitialised = false
}
Expand All @@ -123,8 +121,7 @@ internal var Editor.vimIncsearchCurrentMatchOffset: Int? by userData()
internal var Editor.vimLastSelectionType: SelectionType? by userData()
internal var Editor.vimEditorGroup: Boolean by userDataOr { false }
internal var Editor.vimHasRelativeLineNumbersInstalled: Boolean by userDataOr { false }
internal var Editor.vimMorePanel: ExOutputPanel? by userData()
internal var Editor.vimExOutput: ExOutputModel? by userData()
internal var Editor.vimMorePanel: OutputPanel? by userData()
internal var Editor.vimTestInputModel: TestInputModel? by userData()

internal var Editor.vimChangeActionSwitchMode: Mode? by userData()
Expand Down
61 changes: 18 additions & 43 deletions src/main/java/com/maddyhome/idea/vim/newapi/IjVimMessages.kt
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright 2003-2023 The IdeaVim authors
* Copyright 2003-2026 The IdeaVim authors
*
* Use of this source code is governed by an MIT-style
* license that can be found in the LICENSE.txt file or at
Expand All @@ -10,9 +10,7 @@ package com.maddyhome.idea.vim.newapi

import com.intellij.openapi.application.ApplicationManager
import com.intellij.openapi.components.Service
import com.intellij.openapi.project.Project
import com.intellij.openapi.project.ProjectManager
import com.intellij.openapi.wm.WindowManager
import com.maddyhome.idea.vim.api.MessageType
import com.maddyhome.idea.vim.api.VimEditor
import com.maddyhome.idea.vim.api.VimMessagesBase
import com.maddyhome.idea.vim.api.globalOptions
Expand All @@ -27,56 +25,33 @@ internal class IjVimMessages : VimMessagesBase() {
private var message: String? = null
private var error = false
private var lastBeepTimeMillis = 0L
private var allowClearStatusBarMessage = true

override fun showStatusBarMessage(editor: VimEditor?, message: String?) {
fun setStatusBarMessage(project: Project, message: String?) {
WindowManager.getInstance().getStatusBar(project)?.let {
it.info = if (message.isNullOrBlank()) "" else "Vim - $message"
}
}
override fun showMessage(editor: VimEditor, message: String?) {
showMessageInternal(editor, message, MessageType.STANDARD)
}

override fun showErrorMessage(editor: VimEditor, message: String?) {
showMessageInternal(editor, message, MessageType.ERROR)
indicateError()
}

private fun showMessageInternal(editor: VimEditor, message: String?, messageType: MessageType) {
this.message = message

val project = editor?.ij?.project
if (project != null) {
setStatusBarMessage(project, message)
} else {
// TODO: We really shouldn't set the status bar text for other projects. That's rude.
ProjectManager.getInstance().openProjects.forEach {
setStatusBarMessage(it, message)
}
if (message.isNullOrBlank()) {
clearStatusBarMessage()
return
}

// Redraw happens automatically based on changes or scrolling. If we've just set the message (e.g., searching for a
// string, hitting the bottom and scrolling to the top), make sure we don't immediately clear it when scrolling.
allowClearStatusBarMessage = false
ApplicationManager.getApplication().invokeLater {
allowClearStatusBarMessage = true
}
val context = injector.executionContextManager.getEditorExecutionContext(editor)
injector.outputPanel.output(editor, context, message, messageType)
}

override fun getStatusBarMessage(): String? = message

// Vim doesn't appear to have a policy about clearing the status bar, other than on "redraw". This can be forced with
// <C-L> or the `:redraw` command, but also happens as the screen changes, e.g., when inserting or deleting lines,
// scrolling, entering Command-line mode and probably lots more. We should manually clear the status bar when these
// things happen.
override fun clearStatusBarMessage() {
val currentMessage = message
if (currentMessage.isNullOrEmpty()) return

// Don't clear the status bar message if we've only just set it
if (!allowClearStatusBarMessage) return

ProjectManager.getInstance().openProjects.forEach { project ->
WindowManager.getInstance().getStatusBar(project)?.let { statusBar ->
// Only clear the status bar if it's showing our last message
if (statusBar.info?.contains(currentMessage) == true) {
statusBar.info = ""
}
}
}
if (message.isNullOrEmpty()) return
injector.outputPanel.getCurrentOutputPanel()?.close()
message = null
}

Expand Down
Loading
Loading