1
0
mirror of https://github.com/chylex/IntelliJ-IdeaVim.git synced 2025-05-28 08:34:02 +02:00

Reformat code

This commit is contained in:
Alex Plate 2025-01-10 12:25:51 +03:00
parent 36556d559f
commit ad584d553c
No known key found for this signature in database
GPG Key ID: 0B97153C8FFEC09F
424 changed files with 4985 additions and 1875 deletions
src
main
java/com/maddyhome/idea/vim
resources
test/java/org/jetbrains/plugins/ideavim/action

View File

@ -215,7 +215,8 @@ public class VimPlugin implements PersistentStateComponent<Element>, Disposable
if (enabled) { if (enabled) {
VimInjectorKt.getInjector().getListenersNotifier().notifyPluginTurnedOn(); VimInjectorKt.getInjector().getListenersNotifier().notifyPluginTurnedOn();
} else { }
else {
VimInjectorKt.getInjector().getListenersNotifier().notifyPluginTurnedOff(); VimInjectorKt.getInjector().getListenersNotifier().notifyPluginTurnedOff();
} }

View File

@ -44,7 +44,12 @@ class VimTypedActionHandler(origHandler: TypedActionHandler) : TypedActionHandle
LOG.trace("Before execute for typed action") LOG.trace("Before execute for typed action")
if (editor.isIdeaVimDisabledHere) { if (editor.isIdeaVimDisabledHere) {
LOG.trace("IdeaVim disabled here, finish") LOG.trace("IdeaVim disabled here, finish")
(KeyHandlerKeeper.getInstance().originalHandler as? TypedActionHandlerEx)?.beforeExecute(editor, charTyped, context, plan) (KeyHandlerKeeper.getInstance().originalHandler as? TypedActionHandlerEx)?.beforeExecute(
editor,
charTyped,
context,
plan
)
return return
} }

View File

@ -205,6 +205,7 @@ class VimShortcutKeyAction : AnAction(), DumbAware/*, LightEditCompatible*/ {
ShortcutOwner.VIM -> { ShortcutOwner.VIM -> {
return ActionEnableStatus.yes("Owner is vim", LogLevel.DEBUG) return ActionEnableStatus.yes("Owner is vim", LogLevel.DEBUG)
} }
ShortcutOwner.IDE -> { ShortcutOwner.IDE -> {
if (!isShortcutConflict(keyStroke)) { if (!isShortcutConflict(keyStroke)) {
ActionEnableStatus.yes("Owner is IDE, but no actionve shortcut conflict", LogLevel.DEBUG) ActionEnableStatus.yes("Owner is IDE, but no actionve shortcut conflict", LogLevel.DEBUG)
@ -212,6 +213,7 @@ class VimShortcutKeyAction : AnAction(), DumbAware/*, LightEditCompatible*/ {
ActionEnableStatus.no("Owner is IDE", LogLevel.DEBUG) ActionEnableStatus.no("Owner is IDE", LogLevel.DEBUG)
} }
} }
else -> { else -> {
if (isShortcutConflict(keyStroke)) { if (isShortcutConflict(keyStroke)) {
savedShortcutConflicts[keyStroke] = ShortcutOwnerInfo.allUndefined savedShortcutConflicts[keyStroke] = ShortcutOwnerInfo.allUndefined
@ -224,7 +226,8 @@ class VimShortcutKeyAction : AnAction(), DumbAware/*, LightEditCompatible*/ {
} }
private fun isEnabledForEscape(editor: Editor): Boolean { private fun isEnabledForEscape(editor: Editor): Boolean {
val ideaVimSupportDialog = injector.globalIjOptions().ideavimsupport.contains(IjOptionConstants.ideavimsupport_dialog) val ideaVimSupportDialog =
injector.globalIjOptions().ideavimsupport.contains(IjOptionConstants.ideavimsupport_dialog)
return editor.isPrimaryEditor() || return editor.isPrimaryEditor() ||
EditorHelper.isFileEditor(editor) && !editor.vim.mode.inNormalMode || EditorHelper.isFileEditor(editor) && !editor.vim.mode.inNormalMode ||
ideaVimSupportDialog && !editor.vim.mode.inNormalMode ideaVimSupportDialog && !editor.vim.mode.inNormalMode

View File

@ -37,7 +37,12 @@ import com.maddyhome.idea.vim.vimscript.model.expressions.FunctionCallExpression
import com.maddyhome.idea.vim.vimscript.model.expressions.SimpleExpression import com.maddyhome.idea.vim.vimscript.model.expressions.SimpleExpression
// todo make it multicaret // todo make it multicaret
private fun doOperatorAction(editor: VimEditor, context: ExecutionContext, textRange: TextRange, motionType: SelectionType): Boolean { private fun doOperatorAction(
editor: VimEditor,
context: ExecutionContext,
textRange: TextRange,
motionType: SelectionType,
): Boolean {
val func = injector.globalOptions().operatorfunc val func = injector.globalOptions().operatorfunc
if (func.isEmpty()) { if (func.isEmpty()) {
VimPlugin.showMessage(MessageHelper.message("E774")) VimPlugin.showMessage(MessageHelper.message("E774"))
@ -61,8 +66,7 @@ private fun doOperatorAction(editor: VimEditor, context: ExecutionContext, textR
// Get the argument for function('...') or funcref('...') for the error message // Get the argument for function('...') or funcref('...') for the error message
val functionName = if (expression is FunctionCallExpression && expression.arguments.isNotEmpty()) { val functionName = if (expression is FunctionCallExpression && expression.arguments.isNotEmpty()) {
expression.arguments[0].evaluate(editor, context, scriptContext).toString() expression.arguments[0].evaluate(editor, context, scriptContext).toString()
} } else {
else {
func func
} }
@ -100,7 +104,12 @@ internal class OperatorAction : VimActionHandler.SingleExecution() {
override val argumentType: Argument.Type = Argument.Type.MOTION override val argumentType: Argument.Type = Argument.Type.MOTION
override fun execute(editor: VimEditor, context: ExecutionContext, cmd: Command, operatorArguments: OperatorArguments): Boolean { override fun execute(
editor: VimEditor,
context: ExecutionContext,
cmd: Command,
operatorArguments: OperatorArguments,
): Boolean {
val argument = cmd.argument as? Argument.Motion ?: return false val argument = cmd.argument as? Argument.Motion ?: return false
if (!editor.inRepeatMode) { if (!editor.inRepeatMode) {
argumentCaptured = argument argumentCaptured = argument

View File

@ -23,7 +23,12 @@ import com.maddyhome.idea.vim.newapi.ij
internal class RepeatChangeAction : VimActionHandler.SingleExecution() { internal class RepeatChangeAction : VimActionHandler.SingleExecution() {
override val type: Command.Type = Command.Type.OTHER_WRITABLE override val type: Command.Type = Command.Type.OTHER_WRITABLE
override fun execute(editor: VimEditor, context: ExecutionContext, cmd: Command, operatorArguments: OperatorArguments): Boolean { override fun execute(
editor: VimEditor,
context: ExecutionContext,
cmd: Command,
operatorArguments: OperatorArguments,
): Boolean {
val state = injector.vimState val state = injector.vimState
var lastCommand = VimRepeater.lastChangeCommand var lastCommand = VimRepeater.lastChangeCommand

View File

@ -38,7 +38,7 @@ internal class VimEditorDown : IdeActionHandler(IdeActions.ACTION_EDITOR_MOVE_CA
editor: VimEditor, editor: VimEditor,
context: ExecutionContext, context: ExecutionContext,
cmd: Command, cmd: Command,
operatorArguments: OperatorArguments operatorArguments: OperatorArguments,
): Boolean { ): Boolean {
val undo = injector.undo val undo = injector.undo
when (undo) { when (undo) {
@ -67,7 +67,7 @@ internal class VimEditorUp : IdeActionHandler(IdeActions.ACTION_EDITOR_MOVE_CARE
editor: VimEditor, editor: VimEditor,
context: ExecutionContext, context: ExecutionContext,
cmd: Command, cmd: Command,
operatorArguments: OperatorArguments operatorArguments: OperatorArguments,
): Boolean { ): Boolean {
val undo = injector.undo val undo = injector.undo
when (undo) { when (undo) {
@ -85,7 +85,12 @@ internal class VimEditorUp : IdeActionHandler(IdeActions.ACTION_EDITOR_MOVE_CARE
internal class VimQuickJavaDoc : VimActionHandler.SingleExecution() { internal class VimQuickJavaDoc : VimActionHandler.SingleExecution() {
override val type: Command.Type = Command.Type.OTHER_READONLY override val type: Command.Type = Command.Type.OTHER_READONLY
override fun execute(editor: VimEditor, context: ExecutionContext, cmd: Command, operatorArguments: OperatorArguments): Boolean { override fun execute(
editor: VimEditor,
context: ExecutionContext,
cmd: Command,
operatorArguments: OperatorArguments,
): Boolean {
injector.actionExecutor.executeAction(editor, IdeActions.ACTION_QUICK_JAVADOC, context) injector.actionExecutor.executeAction(editor, IdeActions.ACTION_QUICK_JAVADOC, context)
return true return true
} }

View File

@ -36,19 +36,21 @@ class CommandState(private val machine: VimStateMachine) {
} }
} }
@get:Deprecated("Use `KeyHandler.keyHandlerState.commandBuilder", ReplaceWith( @get:Deprecated(
"KeyHandler.getInstance().keyHandlerState.commandBuilder", "Use `KeyHandler.keyHandlerState.commandBuilder", ReplaceWith(
"com.maddyhome.idea.vim.KeyHandler" "KeyHandler.getInstance().keyHandlerState.commandBuilder",
) "com.maddyhome.idea.vim.KeyHandler"
)
) )
@get:ApiStatus.ScheduledForRemoval @get:ApiStatus.ScheduledForRemoval
val commandBuilder: CommandBuilder val commandBuilder: CommandBuilder
get() = KeyHandler.getInstance().keyHandlerState.commandBuilder get() = KeyHandler.getInstance().keyHandlerState.commandBuilder
@Deprecated("Use `KeyHandler.keyHandlerState.mappingState", ReplaceWith( @Deprecated(
"KeyHandler.getInstance().keyHandlerState.mappingState", "Use `KeyHandler.keyHandlerState.mappingState", ReplaceWith(
"com.maddyhome.idea.vim.KeyHandler" "KeyHandler.getInstance().keyHandlerState.mappingState",
) "com.maddyhome.idea.vim.KeyHandler"
)
) )
val mappingState: MappingState val mappingState: MappingState
get() = KeyHandler.getInstance().keyHandlerState.mappingState get() = KeyHandler.getInstance().keyHandlerState.mappingState

View File

@ -14,7 +14,7 @@ import com.intellij.openapi.project.Project
import com.intellij.psi.codeStyle.CommonCodeStyleSettings.IndentOptions import com.intellij.psi.codeStyle.CommonCodeStyleSettings.IndentOptions
import com.maddyhome.idea.vim.api.VimIndentConfig import com.maddyhome.idea.vim.api.VimIndentConfig
internal class IndentConfig private constructor(indentOptions: IndentOptions): VimIndentConfig { internal class IndentConfig private constructor(indentOptions: IndentOptions) : VimIndentConfig {
private val indentSize = indentOptions.INDENT_SIZE private val indentSize = indentOptions.INDENT_SIZE
private val tabSize = indentOptions.TAB_SIZE private val tabSize = indentOptions.TAB_SIZE
private val isUseTabs = indentOptions.USE_TAB_CHARACTER private val isUseTabs = indentOptions.USE_TAB_CHARACTER

View File

@ -127,8 +127,7 @@ class ExOutputModel(private val myEditor: WeakReference<Editor>) : VimOutputPane
override fun close() { override fun close() {
if (!ApplicationManager.getApplication().isUnitTestMode) { if (!ApplicationManager.getApplication().isUnitTestMode) {
editor?.let { ExOutputPanel.getInstance(it).close() } editor?.let { ExOutputPanel.getInstance(it).close() }
} } else {
else {
isActiveInTestMode = false isActiveInTestMode = false
} }
} }

View File

@ -40,7 +40,7 @@ public interface VimExtension {
* let g:exchange_no_mappings=1 * let g:exchange_no_mappings=1
* ``` * ```
* Here the user will expect that the exchange plugin won't have default mappings. However, if we load vim-exchange * Here the user will expect that the exchange plugin won't have default mappings. However, if we load vim-exchange
* immediately, this variable won't be initialized at the moment of plugin initialization. * immediately, this variable won't be initialized at the moment of plugin initialization.
* <p> * <p>
* There is also a tricky case for mappings override: * There is also a tricky case for mappings override:
* ``` * ```
@ -48,8 +48,8 @@ public interface VimExtension {
* map X <Plug>(ExchangeLine) * map X <Plug>(ExchangeLine)
* ``` * ```
* For this case, a plugin with a good implementation detects that there is already a defined mapping for * For this case, a plugin with a good implementation detects that there is already a defined mapping for
* `<Plug>(ExchangeLine)` and doesn't register the default cxx mapping. However, such detection requires the mapping * `<Plug>(ExchangeLine)` and doesn't register the default cxx mapping. However, such detection requires the mapping
* to be defined before the plugin initialization. * to be defined before the plugin initialization.
*/ */
void init(); void init();

View File

@ -69,7 +69,8 @@ object VimExtensionFacade {
@JvmStatic @JvmStatic
@Deprecated("Use VimPlugin.getKey().putKeyMapping(modes, fromKeys, pluginOwner, extensionHandler, recursive)", @Deprecated(
"Use VimPlugin.getKey().putKeyMapping(modes, fromKeys, pluginOwner, extensionHandler, recursive)",
ReplaceWith( ReplaceWith(
"VimPlugin.getKey().putKeyMapping(modes, fromKeys, pluginOwner, extensionHandler, recursive)", "VimPlugin.getKey().putKeyMapping(modes, fromKeys, pluginOwner, extensionHandler, recursive)",
"com.maddyhome.idea.vim.VimPlugin" "com.maddyhome.idea.vim.VimPlugin"
@ -189,12 +190,18 @@ object VimExtensionFacade {
/** Get the current contents of the given register similar to 'getreg()'. */ /** Get the current contents of the given register similar to 'getreg()'. */
@JvmStatic @JvmStatic
fun getRegister(editor: VimEditor, register: Char): List<KeyStroke>? { fun getRegister(editor: VimEditor, register: Char): List<KeyStroke>? {
val reg = VimPlugin.getRegister().getRegister(editor, injector.executionContextManager.getEditorExecutionContext(editor), register) ?: return null val reg = VimPlugin.getRegister()
.getRegister(editor, injector.executionContextManager.getEditorExecutionContext(editor), register) ?: return null
return reg.keys return reg.keys
} }
@JvmStatic @JvmStatic
fun getRegisterForCaret(editor: VimEditor, context: ExecutionContext, register: Char, caret: VimCaret): List<KeyStroke>? { fun getRegisterForCaret(
editor: VimEditor,
context: ExecutionContext,
register: Char,
caret: VimCaret,
): List<KeyStroke>? {
val reg = caret.registerStorage.getRegister(editor, context, register) ?: return null val reg = caret.registerStorage.getRegister(editor, context, register) ?: return null
return reg.keys return reg.keys
} }
@ -225,7 +232,7 @@ object VimExtensionFacade {
defaultArgs: List<Pair<String, Expression>>, defaultArgs: List<Pair<String, Expression>>,
hasOptionalArguments: Boolean, hasOptionalArguments: Boolean,
flags: EnumSet<FunctionFlag>, flags: EnumSet<FunctionFlag>,
function: ScriptFunction function: ScriptFunction,
) { ) {
var functionDeclaration: FunctionDeclaration? = null var functionDeclaration: FunctionDeclaration? = null
val body = listOf(object : Executable { val body = listOf(object : Executable {
@ -255,8 +262,7 @@ object VimExtensionFacade {
} }
fun VimExtensionFacade.exportOperatorFunction(name: String, function: OperatorFunction) { fun VimExtensionFacade.exportOperatorFunction(name: String, function: OperatorFunction) {
exportScriptFunction(null, name, listOf("type"), emptyList(), false, noneOfEnum()) { exportScriptFunction(null, name, listOf("type"), emptyList(), false, noneOfEnum()) { editor, context, args ->
editor, context, args ->
val type = args["type"]?.asString() val type = args["type"]?.asString()
val selectionType = when (type) { val selectionType = when (type) {
@ -268,8 +274,7 @@ fun VimExtensionFacade.exportOperatorFunction(name: String, function: OperatorFu
if (function.apply(editor, context, selectionType)) { if (function.apply(editor, context, selectionType)) {
ExecutionResult.Success ExecutionResult.Success
} } else {
else {
ExecutionResult.Error ExecutionResult.Error
} }
} }

View File

@ -186,12 +186,24 @@ class ChangeGroup : VimChangeGroupBase() {
} }
} }
@Deprecated(message = "Please use listenersNotifier", replaceWith = ReplaceWith("injector.listenersNotifier.modeChangeListeners.add", imports = ["import com.maddyhome.idea.vim.api.injector"])) @Deprecated(
message = "Please use listenersNotifier",
replaceWith = ReplaceWith(
"injector.listenersNotifier.modeChangeListeners.add",
imports = ["import com.maddyhome.idea.vim.api.injector"]
)
)
fun addInsertListener(listener: VimInsertListener) { fun addInsertListener(listener: VimInsertListener) {
injector.listenersNotifier.modeChangeListeners.add(listener) injector.listenersNotifier.modeChangeListeners.add(listener)
} }
@Deprecated(message = "Please use listenersNotifier", replaceWith = ReplaceWith("injector.listenersNotifier.modeChangeListeners.remove", imports = ["import com.maddyhome.idea.vim.api.injector"])) @Deprecated(
message = "Please use listenersNotifier",
replaceWith = ReplaceWith(
"injector.listenersNotifier.modeChangeListeners.remove",
imports = ["import com.maddyhome.idea.vim.api.injector"]
)
)
fun removeInsertListener(listener: VimInsertListener) { fun removeInsertListener(listener: VimInsertListener) {
injector.listenersNotifier.modeChangeListeners.remove(listener) injector.listenersNotifier.modeChangeListeners.remove(listener)
} }

View File

@ -156,7 +156,8 @@ public class EditorGroup implements PersistentStateComponent<Element>, VimEditor
private static void repaintRelativeLineNumbers(final @NotNull Editor editor) { private static void repaintRelativeLineNumbers(final @NotNull Editor editor) {
final EditorGutter gutter = editor.getGutter(); final EditorGutter gutter = editor.getGutter();
final EditorGutterComponentEx gutterComponent = gutter instanceof EditorGutterComponentEx ? (EditorGutterComponentEx) gutter : null; final EditorGutterComponentEx gutterComponent =
gutter instanceof EditorGutterComponentEx ? (EditorGutterComponentEx)gutter : null;
if (gutterComponent != null) { if (gutterComponent != null) {
gutterComponent.repaint(); gutterComponent.repaint();
} }
@ -251,18 +252,18 @@ public class EditorGroup implements PersistentStateComponent<Element>, VimEditor
@Override @Override
public void notifyIdeaJoin(@NotNull VimEditor editor) { public void notifyIdeaJoin(@NotNull VimEditor editor) {
notifyIdeaJoin(((IjVimEditor) editor).getEditor().getProject(), editor); notifyIdeaJoin(((IjVimEditor)editor).getEditor().getProject(), editor);
} }
@Override @Override
public void updateCaretsVisualAttributes(@NotNull VimEditor editor) { public void updateCaretsVisualAttributes(@NotNull VimEditor editor) {
Editor ijEditor = ((IjVimEditor) editor).getEditor(); Editor ijEditor = ((IjVimEditor)editor).getEditor();
CaretVisualAttributesHelperKt.updateCaretsVisualAttributes(ijEditor); CaretVisualAttributesHelperKt.updateCaretsVisualAttributes(ijEditor);
} }
@Override @Override
public void updateCaretsVisualPosition(@NotNull VimEditor editor) { public void updateCaretsVisualPosition(@NotNull VimEditor editor) {
Editor ijEditor = ((IjVimEditor) editor).getEditor(); Editor ijEditor = ((IjVimEditor)editor).getEditor();
CaretVisualAttributesHelperKt.updateCaretsVisualAttributes(ijEditor); CaretVisualAttributesHelperKt.updateCaretsVisualAttributes(ijEditor);
} }
@ -309,26 +310,21 @@ public class EditorGroup implements PersistentStateComponent<Element>, VimEditor
@Override @Override
public @NotNull Collection<VimEditor> getEditorsRaw() { public @NotNull Collection<VimEditor> getEditorsRaw() {
return getLocalEditors() return getLocalEditors().map(IjVimEditor::new).collect(Collectors.toList());
.map(IjVimEditor::new)
.collect(Collectors.toList());
} }
@Override @Override
public @NotNull Collection<VimEditor> getEditors() { public @NotNull Collection<VimEditor> getEditors() {
return getLocalEditors() return getLocalEditors().filter(UserDataManager::getVimInitialised).map(IjVimEditor::new)
.filter(UserDataManager::getVimInitialised)
.map(IjVimEditor::new)
.collect(Collectors.toList()); .collect(Collectors.toList());
} }
@Override @Override
public @NotNull Collection<VimEditor> getEditors(@NotNull VimDocument buffer) { public @NotNull Collection<VimEditor> getEditors(@NotNull VimDocument buffer) {
final Document document = ((IjVimDocument)buffer).getDocument(); final Document document = ((IjVimDocument)buffer).getDocument();
return getLocalEditors() return getLocalEditors().filter(
.filter(editor -> UserDataManager.getVimInitialised(editor) && editor.getDocument().equals(document)) editor -> UserDataManager.getVimInitialised(editor) && editor.getDocument().equals(document))
.map(IjVimEditor::new) .map(IjVimEditor::new).collect(Collectors.toList());
.collect(Collectors.toList());
} }
private Stream<Editor> getLocalEditors() { private Stream<Editor> getLocalEditors() {

View File

@ -28,8 +28,7 @@ import java.util.List;
import static com.maddyhome.idea.vim.history.HistoryConstants.*; import static com.maddyhome.idea.vim.history.HistoryConstants.*;
@State(name = "VimHistorySettings", storages = { @State(name = "VimHistorySettings", storages = {
@Storage(value = "$APP_CONFIG$/vim_settings_local.xml", roamingType = RoamingType.DISABLED) @Storage(value = "$APP_CONFIG$/vim_settings_local.xml", roamingType = RoamingType.DISABLED)})
})
public class HistoryGroup extends VimHistoryBase implements PersistentStateComponent<Element> { public class HistoryGroup extends VimHistoryBase implements PersistentStateComponent<Element> {
public void saveData(@NotNull Element element) { public void saveData(@NotNull Element element) {
@ -108,7 +107,7 @@ public class HistoryGroup extends VimHistoryBase implements PersistentStateCompo
return INPUT; return INPUT;
} }
if (type instanceof VimHistory.Type.Custom) { if (type instanceof VimHistory.Type.Custom) {
return ((Type.Custom) type).getId(); return ((Type.Custom)type).getId();
} }
return "unreachable"; return "unreachable";
} }

View File

@ -42,7 +42,7 @@ open class GlobalIjOptions(scope: OptionAccessScope) : OptionsPropertiesBase(sco
* *
* As a convenience, this class also provides access to the IntelliJ specific global options, via inheritance. * As a convenience, this class also provides access to the IntelliJ specific global options, via inheritance.
*/ */
class EffectiveIjOptions(scope: OptionAccessScope.EFFECTIVE): GlobalIjOptions(scope) { class EffectiveIjOptions(scope: OptionAccessScope.EFFECTIVE) : GlobalIjOptions(scope) {
// Vim options that are implemented purely by existing IntelliJ features and not used by vim-engine // Vim options that are implemented purely by existing IntelliJ features and not used by vim-engine
var breakindent: Boolean by optionProperty(IjOptions.breakindent) var breakindent: Boolean by optionProperty(IjOptions.breakindent)
val colorcolumn: StringListOptionValue by optionProperty(IjOptions.colorcolumn) val colorcolumn: StringListOptionValue by optionProperty(IjOptions.colorcolumn)

View File

@ -122,6 +122,7 @@ object IjOptions {
IjOptionConstants.ideavimsupportValues IjOptionConstants.ideavimsupportValues
) )
) )
@JvmField @JvmField
val ideawrite: StringOption = addOption( val ideawrite: StringOption = addOption(
StringOption("ideawrite", GLOBAL, "ideawrite", "all", IjOptionConstants.ideaWriteValues) StringOption("ideawrite", GLOBAL, "ideawrite", "all", IjOptionConstants.ideaWriteValues)
@ -131,17 +132,21 @@ object IjOptions {
"lookupkeys", "lookupkeys",
GLOBAL, GLOBAL,
"lookupkeys", "lookupkeys",
"<Tab>,<Down>,<Up>,<Enter>,<Left>,<Right>,<C-Down>,<C-Up>,<PageUp>,<PageDown>,<C-J>,<C-Q>") "<Tab>,<Down>,<Up>,<Enter>,<Left>,<Right>,<C-Down>,<C-Up>,<PageUp>,<PageDown>,<C-J>,<C-Q>"
)
) )
val trackactionids: ToggleOption = addOption(ToggleOption("trackactionids", GLOBAL, "tai", false)) val trackactionids: ToggleOption = addOption(ToggleOption("trackactionids", GLOBAL, "tai", false))
val visualdelay: UnsignedNumberOption = addOption(UnsignedNumberOption("visualdelay", GLOBAL, "visualdelay", 100)) val visualdelay: UnsignedNumberOption = addOption(UnsignedNumberOption("visualdelay", GLOBAL, "visualdelay", 100))
// Temporary feature flags during development, not really intended for external use // Temporary feature flags during development, not really intended for external use
val closenotebooks: ToggleOption = addOption(ToggleOption("closenotebooks", GLOBAL, "closenotebooks", true, isHidden = true)) val closenotebooks: ToggleOption =
val commandOrMotionAnnotation: ToggleOption = addOption(ToggleOption("commandormotionannotation", GLOBAL, "commandormotionannotation", true, isHidden = true)) addOption(ToggleOption("closenotebooks", GLOBAL, "closenotebooks", true, isHidden = true))
val commandOrMotionAnnotation: ToggleOption =
addOption(ToggleOption("commandormotionannotation", GLOBAL, "commandormotionannotation", true, isHidden = true))
val oldundo: ToggleOption = addOption(ToggleOption("oldundo", GLOBAL, "oldundo", false, isHidden = true)) val oldundo: ToggleOption = addOption(ToggleOption("oldundo", GLOBAL, "oldundo", false, isHidden = true))
val unifyjumps: ToggleOption = addOption(ToggleOption("unifyjumps", GLOBAL, "unifyjumps", true, isHidden = true)) val unifyjumps: ToggleOption = addOption(ToggleOption("unifyjumps", GLOBAL, "unifyjumps", true, isHidden = true))
val vimscriptFunctionAnnotation: ToggleOption = addOption(ToggleOption("vimscriptfunctionannotation", GLOBAL, "vimscriptfunctionannotation", true, isHidden = true)) val vimscriptFunctionAnnotation: ToggleOption =
addOption(ToggleOption("vimscriptfunctionannotation", GLOBAL, "vimscriptfunctionannotation", true, isHidden = true))
// This needs to be Option<out VimDataType> so that it can work with derived option types, such as NumberOption, which // This needs to be Option<out VimDataType> so that it can work with derived option types, such as NumberOption, which
// derives from Option<VimInt> // derives from Option<VimInt>

View File

@ -21,7 +21,7 @@ import com.maddyhome.idea.vim.newapi.ij
import com.maddyhome.idea.vim.newapi.vim import com.maddyhome.idea.vim.newapi.vim
@Service @Service
class IjVimPsiService: VimPsiService { class IjVimPsiService : VimPsiService {
override fun getCommentAtPos(editor: VimEditor, pos: Int): Pair<TextRange, Pair<String, String>?>? { override fun getCommentAtPos(editor: VimEditor, pos: Int): Pair<TextRange, Pair<String, String>?>? {
val psiFile = PsiHelper.getFile(editor.ij) ?: return null val psiFile = PsiHelper.getFile(editor.ij) ?: return null
val psiElement = psiFile.findElementAt(pos) ?: return null val psiElement = psiFile.findElementAt(pos) ?: return null

View File

@ -42,14 +42,14 @@ internal class IjVimStorageService : VimStorageServiceBase() {
private val ijKeys = mutableMapOf<String, Key<out Any?>>() private val ijKeys = mutableMapOf<String, Key<out Any?>>()
@Suppress("UNCHECKED_CAST") @Suppress("UNCHECKED_CAST")
private val <T> com.maddyhome.idea.vim.api.Key<T>.ij : Key<T> private val <T> com.maddyhome.idea.vim.api.Key<T>.ij: Key<T>
get(): Key<T> { get(): Key<T> {
val storedIjKey = ijKeys[this.name] val storedIjKey = ijKeys[this.name]
if (storedIjKey != null) { if (storedIjKey != null) {
return storedIjKey as Key<T> return storedIjKey as Key<T>
}
val newKey = Key<T>(this.name)
ijKeys[this.name] = newKey
return newKey
} }
val newKey = Key<T>(this.name)
ijKeys[this.name] = newKey
return newKey
}
} }

View File

@ -49,7 +49,7 @@ import static java.util.stream.Collectors.toList;
* @author vlan * @author vlan
*/ */
@State(name = "VimKeySettings", storages = {@Storage(value = "$APP_CONFIG$/vim_settings.xml")}) @State(name = "VimKeySettings", storages = {@Storage(value = "$APP_CONFIG$/vim_settings.xml")})
public class KeyGroup extends VimKeyGroupBase implements PersistentStateComponent<Element>{ public class KeyGroup extends VimKeyGroupBase implements PersistentStateComponent<Element> {
public static final @NonNls String SHORTCUT_CONFLICTS_ELEMENT = "shortcut-conflicts"; public static final @NonNls String SHORTCUT_CONFLICTS_ELEMENT = "shortcut-conflicts";
private static final @NonNls String SHORTCUT_CONFLICT_ELEMENT = "shortcut-conflict"; private static final @NonNls String SHORTCUT_CONFLICT_ELEMENT = "shortcut-conflict";
private static final @NonNls String OWNER_ATTRIBUTE = "owner"; private static final @NonNls String OWNER_ATTRIBUTE = "owner";
@ -303,8 +303,8 @@ public class KeyGroup extends VimKeyGroupBase implements PersistentStateComponen
@Override @Override
public @NotNull List<NativeAction> getActions(@NotNull VimEditor editor, @NotNull KeyStroke keyStroke) { public @NotNull List<NativeAction> getActions(@NotNull VimEditor editor, @NotNull KeyStroke keyStroke) {
return getActions(((IjVimEditor)editor).getEditor().getComponent(), keyStroke).stream() return getActions(((IjVimEditor)editor).getEditor().getComponent(), keyStroke).stream().map(IjNativeAction::new)
.map(IjNativeAction::new).collect(toList()); .collect(toList());
} }
private static @NotNull List<AnAction> getLocalActions(@NotNull Component component, @NotNull KeyStroke keyStroke) { private static @NotNull List<AnAction> getLocalActions(@NotNull Component component, @NotNull KeyStroke keyStroke) {
@ -355,21 +355,26 @@ public class KeyGroup extends VimKeyGroupBase implements PersistentStateComponen
} }
@Override @Override
public boolean showKeyMappings(@NotNull Set<? extends MappingMode> modes, @NotNull List<? extends KeyStroke> prefix, @NotNull VimEditor editor) { public boolean showKeyMappings(@NotNull Set<? extends MappingMode> modes,
@NotNull List<? extends KeyStroke> prefix,
@NotNull VimEditor editor) {
List<Pair<Set<MappingMode>, MappingInfo>> rows = getKeyMappingRows(modes, prefix); List<Pair<Set<MappingMode>, MappingInfo>> rows = getKeyMappingRows(modes, prefix);
final StringBuilder builder = new StringBuilder(); final StringBuilder builder = new StringBuilder();
for (Pair<Set<MappingMode>, MappingInfo> row : rows) { for (Pair<Set<MappingMode>, MappingInfo> row : rows) {
MappingInfo mappingInfo = row.getSecond(); MappingInfo mappingInfo = row.getSecond();
builder.append(StringsKt.padEnd(getModesStringCode(row.getFirst()), 3, ' ')); builder.append(StringsKt.padEnd(getModesStringCode(row.getFirst()), 3, ' '));
builder.append(StringsKt.padEnd(VimInjectorKt.getInjector().getParser().toKeyNotation(mappingInfo.getFromKeys()) + " ", 12, ' ')); builder.append(
StringsKt.padEnd(VimInjectorKt.getInjector().getParser().toKeyNotation(mappingInfo.getFromKeys()) + " ", 12,
' '));
builder.append(mappingInfo.isRecursive() ? " " : "*"); // Or `&` if script-local mappings being recursive builder.append(mappingInfo.isRecursive() ? " " : "*"); // Or `&` if script-local mappings being recursive
builder.append(" "); // Should be `@` if it's a buffer-local mapping builder.append(" "); // Should be `@` if it's a buffer-local mapping
builder.append(mappingInfo.getPresentableString()); builder.append(mappingInfo.getPresentableString());
builder.append("\n"); builder.append("\n");
} }
VimOutputPanel outputPanel = injector.getOutputPanel().getOrCreate(editor, injector.getExecutionContextManager().getEditorExecutionContext(editor)); VimOutputPanel outputPanel = injector.getOutputPanel()
.getOrCreate(editor, injector.getExecutionContextManager().getEditorExecutionContext(editor));
outputPanel.addText(builder.toString(), true); outputPanel.addText(builder.toString(), true);
outputPanel.show(); outputPanel.show();
return true; return true;

View File

@ -318,11 +318,13 @@ internal class MotionGroup : VimMotionGroupBase() {
vimEditor.exitVisualMode() vimEditor.exitVisualMode()
KeyHandler.getInstance().reset(vimEditor) KeyHandler.getInstance().reset(vimEditor)
} }
is Mode.CMD_LINE -> { is Mode.CMD_LINE -> {
val commandLine = injector.commandLine.getActiveCommandLine() ?: return val commandLine = injector.commandLine.getActiveCommandLine() ?: return
commandLine.close(refocusOwningEditor = false, resetCaret = false) commandLine.close(refocusOwningEditor = false, resetCaret = false)
injector.outputPanel.getCurrentOutputPanel()?.close() injector.outputPanel.getCurrentOutputPanel()?.close()
} }
else -> {} else -> {}
} }
} }

View File

@ -215,6 +215,7 @@ internal class NotificationService(private val project: Project?) {
is KeyMapIssue.AddShortcut -> { is KeyMapIssue.AddShortcut -> {
appendLine("- ${it.key} key is not assigned to the ${it.action} action.<br/>") appendLine("- ${it.key} key is not assigned to the ${it.action} action.<br/>")
} }
is KeyMapIssue.RemoveShortcut -> { is KeyMapIssue.RemoveShortcut -> {
appendLine("- ${it.shortcut} key is incorrectly assigned to the ${it.action} action.<br/>") appendLine("- ${it.shortcut} key is incorrectly assigned to the ${it.action} action.<br/>")
} }
@ -296,23 +297,25 @@ internal class NotificationService(private val project: Project?) {
} }
} + "<small>See the ${ActionCenter.getToolwindowName()} tool window for previous IDs</small>" } + "<small>See the ${ActionCenter.getToolwindowName()} tool window for previous IDs</small>"
notification = Notification(IDEAVIM_NOTIFICATION_ID, IDEAVIM_NOTIFICATION_TITLE, content, NotificationType.INFORMATION).also { notification =
it.whenExpired { notification = null } Notification(IDEAVIM_NOTIFICATION_ID, IDEAVIM_NOTIFICATION_TITLE, content, NotificationType.INFORMATION).also {
it.addAction(StopTracking()) it.whenExpired { notification = null }
it.addAction(StopTracking())
if (id != null || possibleIDs?.size == 1) { if (id != null || possibleIDs?.size == 1) {
it.addAction(CopyActionId(id ?: possibleIDs?.get(0), project)) it.addAction(CopyActionId(id ?: possibleIDs?.get(0), project))
}
it.notify(project)
} }
it.notify(project)
}
if (id != null) { if (id != null) {
ActionTracker.Util.logTrackedAction(id) ActionTracker.Util.logTrackedAction(id)
} }
} }
class CopyActionId(val id: String?, val project: Project?) : DumbAwareAction(MessageHelper.message("action.copy.action.id.text")) { class CopyActionId(val id: String?, val project: Project?) :
DumbAwareAction(MessageHelper.message("action.copy.action.id.text")) {
override fun actionPerformed(e: AnActionEvent) { override fun actionPerformed(e: AnActionEvent) {
CopyPasteManager.getInstance().setContents(StringSelection(id ?: "")) CopyPasteManager.getInstance().setContents(StringSelection(id ?: ""))
if (id != null) { if (id != null) {

View File

@ -66,7 +66,7 @@ import java.nio.charset.Charset
import java.nio.charset.StandardCharsets import java.nio.charset.StandardCharsets
import java.util.* import java.util.*
internal interface IjVimOptionGroup: VimOptionGroup { internal interface IjVimOptionGroup : VimOptionGroup {
/** /**
* Return an accessor for options that only have a global value * Return an accessor for options that only have a global value
*/ */
@ -151,7 +151,7 @@ internal class OptionGroup : VimOptionGroupBase(), IjVimOptionGroup, InternalOpt
override fun <T : VimDataType> setOptionValueInternal( override fun <T : VimDataType> setOptionValueInternal(
option: Option<T>, option: Option<T>,
scope: OptionAccessScope, scope: OptionAccessScope,
value: OptionValue<T> value: OptionValue<T>,
) { ) {
super.setOptionValueInternal(option, scope, value) super.setOptionValueInternal(option, scope, value)
} }
@ -391,7 +391,6 @@ private abstract class GlobalLocalOptionToGlobalLocalIdeaSettingMapper<T : VimDa
} }
/** /**
* Maps the `'bomb'` local-to-buffer Vim option to the file's current byte order mark * Maps the `'bomb'` local-to-buffer Vim option to the file's current byte order mark
* *
@ -425,7 +424,8 @@ private class BombOptionMapper : LocalOptionValueOverride<VimInt> {
// Use IntelliJ's own actions to modify the BOM. This will change the BOM stored in the virtual file, update the // Use IntelliJ's own actions to modify the BOM. This will change the BOM stored in the virtual file, update the
// file contents and save it // file contents and save it
val actionId = if (hasBom) "RemoveBom" else "AddBom" val actionId = if (hasBom) "RemoveBom" else "AddBom"
val action = injector.actionExecutor.getAction(actionId) ?: throw ExException("Cannot find native action: $actionId") val action =
injector.actionExecutor.getAction(actionId) ?: throw ExException("Cannot find native action: $actionId")
val context = injector.executionContextManager.getEditorExecutionContext(editor) val context = injector.executionContextManager.getEditorExecutionContext(editor)
injector.actionExecutor.executeAction(editor, action, context) injector.actionExecutor.executeAction(editor, action, context)
return true return true
@ -463,8 +463,8 @@ private class BreakIndentOptionMapper(
* *
* TODO: This is a code style setting - how can we react to changes? * TODO: This is a code style setting - how can we react to changes?
*/ */
private class ColorColumnOptionValueProvider(private val colorColumnOption: StringListOption) private class ColorColumnOptionValueProvider(private val colorColumnOption: StringListOption) :
: LocalOptionToGlobalLocalExternalSettingMapper<VimString>(colorColumnOption) { LocalOptionToGlobalLocalExternalSettingMapper<VimString>(colorColumnOption) {
// The IntelliJ setting is in practice global, from the user's perspective // The IntelliJ setting is in practice global, from the user's perspective
override val canUserModifyExternalLocalValue: Boolean = false override val canUserModifyExternalLocalValue: Boolean = false
@ -510,8 +510,7 @@ private class ColorColumnOptionValueProvider(private val colorColumnOption: Stri
// Given an empty string, hide the margin. // Given an empty string, hide the margin.
if (value == VimString.EMPTY) { if (value == VimString.EMPTY) {
editor.ij.settings.isRightMarginShown = false editor.ij.settings.isRightMarginShown = false
} } else {
else {
editor.ij.settings.isRightMarginShown = true editor.ij.settings.isRightMarginShown = true
val softMargins = mutableListOf<Int>() val softMargins = mutableListOf<Int>()
@ -524,8 +523,7 @@ private class ColorColumnOptionValueProvider(private val colorColumnOption: Stri
// We could perhaps add a property change listener from editor settings state? // We could perhaps add a property change listener from editor settings state?
// (editor.ij as EditorImpl).state.addPropertyChangeListener(...) // (editor.ij as EditorImpl).state.addPropertyChangeListener(...)
// (editor.ij.settings as SettingsImpl).getState().addPropertyChangeListener(...) // (editor.ij.settings as SettingsImpl).getState().addPropertyChangeListener(...)
} } else {
else {
it.toIntOrNull()?.let(softMargins::add) it.toIntOrNull()?.let(softMargins::add)
} }
} }
@ -559,8 +557,8 @@ private class ColorColumnOptionValueProvider(private val colorColumnOption: Stri
* *
* Note that there isn't a global IntelliJ setting for this option. * Note that there isn't a global IntelliJ setting for this option.
*/ */
private class CursorLineOptionMapper(cursorLineOption: ToggleOption) private class CursorLineOptionMapper(cursorLineOption: ToggleOption) :
: LocalOptionToGlobalLocalExternalSettingMapper<VimInt>(cursorLineOption) { LocalOptionToGlobalLocalExternalSettingMapper<VimInt>(cursorLineOption) {
// The IntelliJ setting is in practice global, from the user's perspective // The IntelliJ setting is in practice global, from the user's perspective
override val canUserModifyExternalLocalValue: Boolean = false override val canUserModifyExternalLocalValue: Boolean = false
@ -667,7 +665,12 @@ private class FileEncodingOptionMapper : LocalOptionValueOverride<VimString> {
} }
} }
private fun isSafeToReloadIn(virtualFile: VirtualFile, text: CharSequence, bytes: ByteArray, charset: Charset): Magic8 { private fun isSafeToReloadIn(
virtualFile: VirtualFile,
text: CharSequence,
bytes: ByteArray,
charset: Charset,
): Magic8 {
val bom = virtualFile.bom val bom = virtualFile.bom
if (bom != null && !CharsetToolkit.canHaveBom(charset, bom)) return Magic8.NO_WAY if (bom != null && !CharsetToolkit.canHaveBom(charset, bom)) return Magic8.NO_WAY
@ -680,11 +683,9 @@ private class FileEncodingOptionMapper : LocalOptionValueOverride<VimString> {
var bytesToSave = try { var bytesToSave = try {
StringUtil.convertLineSeparators(loaded, separator).toByteArray(charset) StringUtil.convertLineSeparators(loaded, separator).toByteArray(charset)
} } catch (e: UnsupportedOperationException) {
catch (e: UnsupportedOperationException) {
return Magic8.NO_WAY return Magic8.NO_WAY
} } catch (e: NullPointerException) {
catch (e: NullPointerException) {
return Magic8.NO_WAY return Magic8.NO_WAY
} }
if (bom != null && !ArrayUtil.startsWith(bytesToSave, bom)) { if (bom != null && !ArrayUtil.startsWith(bytesToSave, bom)) {
@ -718,12 +719,14 @@ private class FileFormatOptionMapper : LocalOptionValueOverride<VimString> {
// We should have a virtual file for most scenarios, e.g., scratch files, commit message dialog, etc. // We should have a virtual file for most scenarios, e.g., scratch files, commit message dialog, etc.
// The fallback window (TextComponentEditorImpl) does not have a virtual file // The fallback window (TextComponentEditorImpl) does not have a virtual file
val separator = editor.ij.virtualFile?.let { LoadTextUtil.detectLineSeparator(it, false) } val separator = editor.ij.virtualFile?.let { LoadTextUtil.detectLineSeparator(it, false) }
val value = VimString(when (separator) { val value = VimString(
LineSeparator.LF.separatorString -> "unix" when (separator) {
LineSeparator.CR.separatorString -> "mac" LineSeparator.LF.separatorString -> "unix"
LineSeparator.CRLF.separatorString -> "dos" LineSeparator.CR.separatorString -> "mac"
else -> if (injector.systemInfoService.isWindows) "dos" else "unix" LineSeparator.CRLF.separatorString -> "dos"
}) else -> if (injector.systemInfoService.isWindows) "dos" else "unix"
}
)
// There is no difference between user/external/default - the file is always just one format // There is no difference between user/external/default - the file is always just one format
return OptionValue.User(value) return OptionValue.User(value)
@ -762,8 +765,8 @@ private class FileFormatOptionMapper : LocalOptionValueOverride<VimString> {
/** /**
* Maps the `'list'` local-to-window Vim option to the IntelliJ global-local whitespace setting * Maps the `'list'` local-to-window Vim option to the IntelliJ global-local whitespace setting
*/ */
private class ListOptionMapper(listOption: ToggleOption, internalOptionValueAccessor: InternalOptionValueAccessor) private class ListOptionMapper(listOption: ToggleOption, internalOptionValueAccessor: InternalOptionValueAccessor) :
: LocalOptionToGlobalLocalIdeaSettingMapper<VimInt>(listOption, internalOptionValueAccessor) { LocalOptionToGlobalLocalIdeaSettingMapper<VimInt>(listOption, internalOptionValueAccessor) {
override val ideaPropertyName: String = EditorSettingsExternalizable.PropNames.PROP_IS_WHITESPACES_SHOWN override val ideaPropertyName: String = EditorSettingsExternalizable.PropNames.PROP_IS_WHITESPACES_SHOWN
@ -787,8 +790,8 @@ private class ListOptionMapper(listOption: ToggleOption, internalOptionValueAcce
* *
* Note that this must work with `'relativenumber'` to correctly handle the hybrid modes. * Note that this must work with `'relativenumber'` to correctly handle the hybrid modes.
*/ */
private class NumberOptionMapper(numberOption: ToggleOption, internalOptionValueAccessor: InternalOptionValueAccessor) private class NumberOptionMapper(numberOption: ToggleOption, internalOptionValueAccessor: InternalOptionValueAccessor) :
: LocalOptionToGlobalLocalIdeaSettingMapper<VimInt>(numberOption, internalOptionValueAccessor) { LocalOptionToGlobalLocalIdeaSettingMapper<VimInt>(numberOption, internalOptionValueAccessor) {
// This is a global-local setting, and can be modified by the user via _View | Active Editor | Show Line Numbers_ // This is a global-local setting, and can be modified by the user via _View | Active Editor | Show Line Numbers_
override val canUserModifyExternalLocalValue: Boolean = true override val canUserModifyExternalLocalValue: Boolean = true
@ -808,13 +811,11 @@ private class NumberOptionMapper(numberOption: ToggleOption, internalOptionValue
if (isShowingRelativeLineNumbers(editor.ij.settings.lineNumerationType)) { if (isShowingRelativeLineNumbers(editor.ij.settings.lineNumerationType)) {
editor.ij.settings.lineNumerationType = LineNumerationType.HYBRID editor.ij.settings.lineNumerationType = LineNumerationType.HYBRID
} }
} } else {
else {
editor.ij.settings.isLineNumbersShown = true editor.ij.settings.isLineNumbersShown = true
editor.ij.settings.lineNumerationType = LineNumerationType.ABSOLUTE editor.ij.settings.lineNumerationType = LineNumerationType.ABSOLUTE
} }
} } else {
else {
// Turn off 'number'. Hide lines if 'relativenumber' is not set, else switch to relative // Turn off 'number'. Hide lines if 'relativenumber' is not set, else switch to relative
if (editor.ij.settings.isLineNumbersShown) { if (editor.ij.settings.isLineNumbersShown) {
if (isShowingRelativeLineNumbers(editor.ij.settings.lineNumerationType)) { if (isShowingRelativeLineNumbers(editor.ij.settings.lineNumerationType)) {
@ -828,7 +829,8 @@ private class NumberOptionMapper(numberOption: ToggleOption, internalOptionValue
override fun onGlobalIdeaValueChanged(propertyName: String) { override fun onGlobalIdeaValueChanged(propertyName: String) {
if (propertyName == EditorSettingsExternalizable.PropNames.PROP_ARE_LINE_NUMBERS_SHOWN if (propertyName == EditorSettingsExternalizable.PropNames.PROP_ARE_LINE_NUMBERS_SHOWN
|| propertyName == EditorSettingsExternalizable.PropNames.PROP_LINE_NUMERATION) { || propertyName == EditorSettingsExternalizable.PropNames.PROP_LINE_NUMERATION
) {
doOnGlobalIdeaValueChanged() doOnGlobalIdeaValueChanged()
} }
} }
@ -863,13 +865,11 @@ private class RelativeNumberOptionMapper(
if (isShowingAbsoluteLineNumbers(editor.ij.settings.lineNumerationType)) { if (isShowingAbsoluteLineNumbers(editor.ij.settings.lineNumerationType)) {
editor.ij.settings.lineNumerationType = LineNumerationType.HYBRID editor.ij.settings.lineNumerationType = LineNumerationType.HYBRID
} }
} } else {
else {
editor.ij.settings.isLineNumbersShown = true editor.ij.settings.isLineNumbersShown = true
editor.ij.settings.lineNumerationType = LineNumerationType.RELATIVE editor.ij.settings.lineNumerationType = LineNumerationType.RELATIVE
} }
} } else {
else {
// Turn off 'relativenumber'. Hide lines if 'number' is not set, else switch to relative // Turn off 'relativenumber'. Hide lines if 'number' is not set, else switch to relative
if (editor.ij.settings.isLineNumbersShown) { if (editor.ij.settings.isLineNumbersShown) {
if (isShowingAbsoluteLineNumbers(editor.ij.settings.lineNumerationType)) { if (isShowingAbsoluteLineNumbers(editor.ij.settings.lineNumerationType)) {
@ -883,7 +883,8 @@ private class RelativeNumberOptionMapper(
override fun onGlobalIdeaValueChanged(propertyName: String) { override fun onGlobalIdeaValueChanged(propertyName: String) {
if (propertyName == EditorSettingsExternalizable.PropNames.PROP_ARE_LINE_NUMBERS_SHOWN if (propertyName == EditorSettingsExternalizable.PropNames.PROP_ARE_LINE_NUMBERS_SHOWN
|| propertyName == EditorSettingsExternalizable.PropNames.PROP_LINE_NUMERATION) { || propertyName == EditorSettingsExternalizable.PropNames.PROP_LINE_NUMERATION
) {
doOnGlobalIdeaValueChanged() doOnGlobalIdeaValueChanged()
} }
} }
@ -914,8 +915,8 @@ private fun isShowingRelativeLineNumbers(lineNumerationType: LineNumerationType)
* We can also clear the overridden IDE setting value by setting it to `-1`. So when the user resets the Vim option to * We can also clear the overridden IDE setting value by setting it to `-1`. So when the user resets the Vim option to
* defaults, it will again map to the global IDE value. It's a shame not all IDE settings do this. * defaults, it will again map to the global IDE value. It's a shame not all IDE settings do this.
*/ */
private class ScrollJumpOptionMapper(option: NumberOption, internalOptionValueAccessor: InternalOptionValueAccessor) private class ScrollJumpOptionMapper(option: NumberOption, internalOptionValueAccessor: InternalOptionValueAccessor) :
: GlobalOptionToGlobalLocalIdeaSettingMapper<VimInt>(option, internalOptionValueAccessor) { GlobalOptionToGlobalLocalIdeaSettingMapper<VimInt>(option, internalOptionValueAccessor) {
override val ideaPropertyName: String = EditorSettingsExternalizable.PropNames.PROP_VERTICAL_SCROLL_JUMP override val ideaPropertyName: String = EditorSettingsExternalizable.PropNames.PROP_VERTICAL_SCROLL_JUMP
@ -949,8 +950,8 @@ private class ScrollJumpOptionMapper(option: NumberOption, internalOptionValueAc
* We can also clear the overridden IDE setting value by setting it to `-1`. So when the user resets the Vim option to * We can also clear the overridden IDE setting value by setting it to `-1`. So when the user resets the Vim option to
* defaults, it will again map to the global IDE value. It's a shame not all IDE settings do this. * defaults, it will again map to the global IDE value. It's a shame not all IDE settings do this.
*/ */
private class SideScrollOptionMapper(option: NumberOption, internalOptionValueAccessor: InternalOptionValueAccessor) private class SideScrollOptionMapper(option: NumberOption, internalOptionValueAccessor: InternalOptionValueAccessor) :
: GlobalOptionToGlobalLocalIdeaSettingMapper<VimInt>(option, internalOptionValueAccessor) { GlobalOptionToGlobalLocalIdeaSettingMapper<VimInt>(option, internalOptionValueAccessor) {
override val ideaPropertyName: String = EditorSettingsExternalizable.PropNames.PROP_HORIZONTAL_SCROLL_JUMP override val ideaPropertyName: String = EditorSettingsExternalizable.PropNames.PROP_HORIZONTAL_SCROLL_JUMP
@ -1140,8 +1141,8 @@ private abstract class OneWayGlobalLocalOptionToGlobalLocalIdeaSettingMapper<T :
* (window) overrides. The [LocalOptionToGlobalLocalExternalSettingMapper] base class will handle this by calling * (window) overrides. The [LocalOptionToGlobalLocalExternalSettingMapper] base class will handle this by calling
* [setLocalExternalValue] for all open editors for the changed buffer. * [setLocalExternalValue] for all open editors for the changed buffer.
*/ */
private class TextWidthOptionMapper(textWidthOption: NumberOption) private class TextWidthOptionMapper(textWidthOption: NumberOption) :
: LocalOptionToGlobalLocalExternalSettingMapper<VimInt>(textWidthOption) { LocalOptionToGlobalLocalExternalSettingMapper<VimInt>(textWidthOption) {
// The IntelliJ setting is in practice global, from the user's perspective // The IntelliJ setting is in practice global, from the user's perspective
override val canUserModifyExternalLocalValue: Boolean = false override val canUserModifyExternalLocalValue: Boolean = false
@ -1168,8 +1169,7 @@ private class TextWidthOptionMapper(textWidthOption: NumberOption)
val project = ijEditor.project ?: ProjectManager.getInstance().defaultProject val project = ijEditor.project ?: ProjectManager.getInstance().defaultProject
return if (ijEditor.settings.isWrapWhenTypingReachesRightMargin(project)) { return if (ijEditor.settings.isWrapWhenTypingReachesRightMargin(project)) {
ijEditor.settings.getRightMargin(ijEditor.project).asVimInt() ijEditor.settings.getRightMargin(ijEditor.project).asVimInt()
} } else {
else {
VimInt.ZERO VimInt.ZERO
} }
} }
@ -1215,8 +1215,8 @@ private class TextWidthOptionMapper(textWidthOption: NumberOption)
/** /**
* Maps the `'wrap'` Vim option to the IntelliJ soft wrap settings * Maps the `'wrap'` Vim option to the IntelliJ soft wrap settings
*/ */
private class WrapOptionMapper(wrapOption: ToggleOption, internalOptionValueAccessor: InternalOptionValueAccessor) private class WrapOptionMapper(wrapOption: ToggleOption, internalOptionValueAccessor: InternalOptionValueAccessor) :
: LocalOptionToGlobalLocalIdeaSettingMapper<VimInt>(wrapOption, internalOptionValueAccessor) { LocalOptionToGlobalLocalIdeaSettingMapper<VimInt>(wrapOption, internalOptionValueAccessor) {
// This is a global-local setting, and can be modified by the user via _View | Active Editor | Soft-Wrap_ // This is a global-local setting, and can be modified by the user via _View | Active Editor | Soft-Wrap_
override val canUserModifyExternalLocalValue: Boolean = true override val canUserModifyExternalLocalValue: Boolean = true
@ -1245,7 +1245,9 @@ private class WrapOptionMapper(wrapOption: ToggleOption, internalOptionValueAcce
fun editorKindToSoftWrapAppliancesPlace(kind: EditorKind) = when (kind) { fun editorKindToSoftWrapAppliancesPlace(kind: EditorKind) = when (kind) {
EditorKind.UNTYPED, EditorKind.UNTYPED,
EditorKind.DIFF, EditorKind.DIFF,
EditorKind.MAIN_EDITOR -> SoftWrapAppliancePlaces.MAIN_EDITOR EditorKind.MAIN_EDITOR,
-> SoftWrapAppliancePlaces.MAIN_EDITOR
EditorKind.CONSOLE -> SoftWrapAppliancePlaces.CONSOLE EditorKind.CONSOLE -> SoftWrapAppliancePlaces.CONSOLE
// Treat PREVIEW as a kind of MAIN_EDITOR instead of SWAP.PREVIEW. There are fewer noticeable differences // Treat PREVIEW as a kind of MAIN_EDITOR instead of SWAP.PREVIEW. There are fewer noticeable differences
EditorKind.PREVIEW -> SoftWrapAppliancePlaces.MAIN_EDITOR EditorKind.PREVIEW -> SoftWrapAppliancePlaces.MAIN_EDITOR
@ -1261,7 +1263,9 @@ private class WrapOptionMapper(wrapOption: ToggleOption, internalOptionValueAcce
val softWrapAppliancePlace = when (editor.ij.editorKind) { val softWrapAppliancePlace = when (editor.ij.editorKind) {
EditorKind.UNTYPED, EditorKind.UNTYPED,
EditorKind.DIFF, EditorKind.DIFF,
EditorKind.MAIN_EDITOR -> SoftWrapAppliancePlaces.MAIN_EDITOR EditorKind.MAIN_EDITOR,
-> SoftWrapAppliancePlaces.MAIN_EDITOR
EditorKind.CONSOLE -> SoftWrapAppliancePlaces.CONSOLE EditorKind.CONSOLE -> SoftWrapAppliancePlaces.CONSOLE
EditorKind.PREVIEW -> SoftWrapAppliancePlaces.PREVIEW EditorKind.PREVIEW -> SoftWrapAppliancePlaces.PREVIEW
} }
@ -1304,7 +1308,8 @@ private class WrapOptionMapper(wrapOption: ToggleOption, internalOptionValueAcce
override fun onGlobalIdeaValueChanged(propertyName: String) { override fun onGlobalIdeaValueChanged(propertyName: String) {
if (propertyName == EditorSettingsExternalizable.PropNames.PROP_USE_SOFT_WRAPS if (propertyName == EditorSettingsExternalizable.PropNames.PROP_USE_SOFT_WRAPS
|| propertyName == EditorSettingsExternalizable.PropNames.PROP_SOFT_WRAP_FILE_MASKS) { || propertyName == EditorSettingsExternalizable.PropNames.PROP_SOFT_WRAP_FILE_MASKS
) {
doOnGlobalIdeaValueChanged() doOnGlobalIdeaValueChanged()
} }
} }
@ -1331,8 +1336,10 @@ class IjOptionConstants {
const val ideawrite_file: String = "file" const val ideawrite_file: String = "file"
val ideaStatusIconValues: Set<String> = setOf(ideastatusicon_enabled, ideastatusicon_gray, ideastatusicon_disabled) val ideaStatusIconValues: Set<String> = setOf(ideastatusicon_enabled, ideastatusicon_gray, ideastatusicon_disabled)
val ideaRefactorModeValues: Set<String> = setOf(idearefactormode_keep, idearefactormode_select, idearefactormode_visual) val ideaRefactorModeValues: Set<String> =
setOf(idearefactormode_keep, idearefactormode_select, idearefactormode_visual)
val ideaWriteValues: Set<String> = setOf(ideawrite_all, ideawrite_file) val ideaWriteValues: Set<String> = setOf(ideawrite_all, ideawrite_file)
val ideavimsupportValues: Set<String> = setOf(ideavimsupport_dialog, ideavimsupport_singleline, ideavimsupport_dialoglegacy) val ideavimsupportValues: Set<String> =
setOf(ideavimsupport_dialog, ideavimsupport_singleline, ideavimsupport_dialoglegacy)
} }
} }

View File

@ -37,7 +37,7 @@ class ProcessGroup : VimProcessGroupBase() {
editor: VimEditor, editor: VimEditor,
command: String, command: String,
input: CharSequence?, input: CharSequence?,
currentDirectoryPath: String? currentDirectoryPath: String?,
): String? { ): String? {
// This is a much simplified version of how Vim does this. We're using stdin/stdout directly, while Vim will // This is a much simplified version of how Vim does this. We're using stdin/stdout directly, while Vim will
// redirect to temp files ('shellredir' and 'shelltemp') or use pipes. We don't support 'shellquote', because we're // redirect to temp files ('shellredir' and 'shelltemp') or use pipes. We don't support 'shellquote', because we're

View File

@ -33,8 +33,7 @@ import static com.maddyhome.idea.vim.api.VimInjectorKt.injector;
* This group works with command associated with copying and pasting text * This group works with command associated with copying and pasting text
*/ */
@State(name = "VimRegisterSettings", storages = { @State(name = "VimRegisterSettings", storages = {
@Storage(value = "$APP_CONFIG$/vim_settings_local.xml", roamingType = RoamingType.DISABLED) @Storage(value = "$APP_CONFIG$/vim_settings_local.xml", roamingType = RoamingType.DISABLED)})
})
public class RegisterGroup extends VimRegisterGroupBase implements PersistentStateComponent<Element> { public class RegisterGroup extends VimRegisterGroupBase implements PersistentStateComponent<Element> {
static { static {
@ -146,9 +145,8 @@ public class RegisterGroup extends VimRegisterGroupBase implements PersistentSta
final int modifiers = Integer.parseInt(keyElement.getAttributeValue("mods")); final int modifiers = Integer.parseInt(keyElement.getAttributeValue("mods"));
final char c = (char)Integer.parseInt(keyElement.getAttributeValue("char")); final char c = (char)Integer.parseInt(keyElement.getAttributeValue("char"));
//noinspection MagicConstant //noinspection MagicConstant
strokes.add(c == KeyEvent.CHAR_UNDEFINED ? strokes.add(
KeyStroke.getKeyStroke(code, modifiers) : c == KeyEvent.CHAR_UNDEFINED ? KeyStroke.getKeyStroke(code, modifiers) : KeyStroke.getKeyStroke(c));
KeyStroke.getKeyStroke(c));
} }
register = new Register(key, type, strokes); register = new Register(key, type, strokes);
} }

View File

@ -28,11 +28,15 @@ import com.maddyhome.idea.vim.newapi.ij
import com.maddyhome.idea.vim.newapi.initInjector import com.maddyhome.idea.vim.newapi.initInjector
import org.jdom.Element import org.jdom.Element
@State(name = "VimJumpsSettings", storages = [Storage(value = "\$APP_CONFIG$/vim_settings_local.xml", roamingType = RoamingType.DISABLED)]) @State(
name = "VimJumpsSettings",
storages = [Storage(value = "\$APP_CONFIG$/vim_settings_local.xml", roamingType = RoamingType.DISABLED)]
)
internal class VimJumpServiceImpl : VimJumpServiceBase(), PersistentStateComponent<Element?> { internal class VimJumpServiceImpl : VimJumpServiceBase(), PersistentStateComponent<Element?> {
companion object { companion object {
private val logger = vimLogger<VimJumpServiceImpl>() private val logger = vimLogger<VimJumpServiceImpl>()
} }
override var lastJumpTimeStamp: Long = 0 override var lastJumpTimeStamp: Long = 0
override fun includeCurrentCommandAsNavigation(editor: VimEditor) { override fun includeCurrentCommandAsNavigation(editor: VimEditor) {
@ -93,7 +97,7 @@ internal class JumpsListener(val project: Project) : RecentPlacesListener {
override fun recentPlaceAdded(changePlace: PlaceInfo, isChanged: Boolean) { override fun recentPlaceAdded(changePlace: PlaceInfo, isChanged: Boolean) {
initInjector() initInjector()
if (!injector.globalIjOptions().unifyjumps) return if (!injector.globalIjOptions().unifyjumps) return
val jumpService = injector.jumpService val jumpService = injector.jumpService
if (!isChanged) { if (!isChanged) {
if (changePlace.timeStamp < jumpService.lastJumpTimeStamp) return // this listener is notified asynchronously, and if (changePlace.timeStamp < jumpService.lastJumpTimeStamp) return // this listener is notified asynchronously, and
@ -105,7 +109,7 @@ internal class JumpsListener(val project: Project) : RecentPlacesListener {
override fun recentPlaceRemoved(changePlace: PlaceInfo, isChanged: Boolean) { override fun recentPlaceRemoved(changePlace: PlaceInfo, isChanged: Boolean) {
if (!injector.globalIjOptions().unifyjumps) return if (!injector.globalIjOptions().unifyjumps) return
val jumpService = injector.jumpService val jumpService = injector.jumpService
if (!isChanged) { if (!isChanged) {
if (changePlace.timeStamp < jumpService.lastJumpTimeStamp) return // this listener is notified asynchronously, and if (changePlace.timeStamp < jumpService.lastJumpTimeStamp) return // this listener is notified asynchronously, and

View File

@ -45,7 +45,10 @@ import java.util.*
// todo sync vim jumps with ide jumps // todo sync vim jumps with ide jumps
// todo exception after moving to global mark after deleting it via IDE (impossible to receive markChar) // todo exception after moving to global mark after deleting it via IDE (impossible to receive markChar)
@State(name = "VimMarksSettings", storages = [Storage(value = "\$APP_CONFIG$/vim_settings_local.xml", roamingType = RoamingType.DISABLED)]) @State(
name = "VimMarksSettings",
storages = [Storage(value = "\$APP_CONFIG$/vim_settings_local.xml", roamingType = RoamingType.DISABLED)]
)
internal class VimMarkServiceImpl : VimMarkServiceBase(), PersistentStateComponent<Element?> { internal class VimMarkServiceImpl : VimMarkServiceBase(), PersistentStateComponent<Element?> {
private fun createOrGetSystemMark(ch: Char, line: Int, col: Int, editor: VimEditor): Mark? { private fun createOrGetSystemMark(ch: Char, line: Int, col: Int, editor: VimEditor): Mark? {
val ijEditor = (editor as IjVimEditor).editor val ijEditor = (editor as IjVimEditor).editor
@ -71,7 +74,8 @@ internal class VimMarkServiceImpl : VimMarkServiceBase(), PersistentStateCompone
} }
element.addContent(globalMarksElement) element.addContent(globalMarksElement)
val localMarksElement = Element("localmarks") val localMarksElement = Element("localmarks")
var files: List<LocalMarks<Char, Mark>> = filepathToLocalMarks.values.sortedWith(Comparator.comparing(LocalMarks<Char, Mark>::myTimestamp)) var files: List<LocalMarks<Char, Mark>> =
filepathToLocalMarks.values.sortedWith(Comparator.comparing(LocalMarks<Char, Mark>::myTimestamp))
if (files.size > SAVE_MARK_COUNT) { if (files.size > SAVE_MARK_COUNT) {
files = files.subList(files.size - SAVE_MARK_COUNT, files.size) files = files.subList(files.size - SAVE_MARK_COUNT, files.size)
} }
@ -85,7 +89,12 @@ internal class VimMarkServiceImpl : VimMarkServiceBase(), PersistentStateCompone
fileMarkElem.setAttribute("name", file) fileMarkElem.setAttribute("name", file)
fileMarkElem.setAttribute("timestamp", java.lang.Long.toString(marks.myTimestamp.time)) fileMarkElem.setAttribute("timestamp", java.lang.Long.toString(marks.myTimestamp.time))
for (mark in marks.values) { for (mark in marks.values) {
if (!Character.isUpperCase(mark.key) && injector.markService.isValidMark(mark.key, VimMarkService.Operation.SAVE, true)) { if (!Character.isUpperCase(mark.key) && injector.markService.isValidMark(
mark.key,
VimMarkService.Operation.SAVE,
true
)
) {
val markElem = Element("mark") val markElem = Element("mark")
markElem.setAttribute("key", mark.key.toString()) markElem.setAttribute("key", mark.key.toString())
markElem.setAttribute("line", mark.line.toString()) markElem.setAttribute("line", mark.line.toString())

View File

@ -56,7 +56,7 @@ public class WindowGroup extends WindowGroupBase {
} }
public void closeAll(@NotNull ExecutionContext context) { public void closeAll(@NotNull ExecutionContext context) {
getFileEditorManager(((IjEditorExecutionContext) context).getContext()).closeAllFiles(); getFileEditorManager(((IjEditorExecutionContext)context).getContext()).closeAllFiles();
} }
@Override @Override
@ -105,10 +105,13 @@ public class WindowGroup extends WindowGroupBase {
@Override @Override
@RWLockLabel.Readonly @RWLockLabel.Readonly
@RequiresReadLock @RequiresReadLock
public void selectWindowInRow(@NotNull VimCaret caret, @NotNull ExecutionContext context, int relativePosition, boolean vertical) { public void selectWindowInRow(@NotNull VimCaret caret,
final Caret ijCaret = ((IjVimCaret) caret).getCaret(); @NotNull ExecutionContext context,
int relativePosition,
boolean vertical) {
final Caret ijCaret = ((IjVimCaret)caret).getCaret();
final FileEditorManagerEx fileEditorManager = getFileEditorManager(((DataContext)context.getContext())); final FileEditorManagerEx fileEditorManager = getFileEditorManager(((DataContext)context.getContext()));
final EditorWindow currentWindow = fileEditorManager.getCurrentWindow(); final EditorWindow currentWindow = fileEditorManager.getCurrentWindow();
if (currentWindow != null) { if (currentWindow != null) {
final EditorWindow[] windows = fileEditorManager.getWindows(); final EditorWindow[] windows = fileEditorManager.getWindows();
final List<EditorWindow> row = findWindowsInRow(ijCaret, currentWindow, Arrays.asList(windows), vertical); final List<EditorWindow> row = findWindowsInRow(ijCaret, currentWindow, Arrays.asList(windows), vertical);
@ -116,7 +119,8 @@ public class WindowGroup extends WindowGroupBase {
} }
} }
private void selectWindow(@NotNull EditorWindow currentWindow, @NotNull List<EditorWindow> windows, private void selectWindow(@NotNull EditorWindow currentWindow,
@NotNull List<EditorWindow> windows,
int relativePosition) { int relativePosition) {
final int pos = windows.indexOf(currentWindow); final int pos = windows.indexOf(currentWindow);
final int selected = pos + relativePosition; final int selected = pos + relativePosition;
@ -126,7 +130,8 @@ public class WindowGroup extends WindowGroupBase {
private static @NotNull List<EditorWindow> findWindowsInRow(@NotNull Caret caret, private static @NotNull List<EditorWindow> findWindowsInRow(@NotNull Caret caret,
@NotNull EditorWindow editorWindow, @NotNull EditorWindow editorWindow,
@NotNull List<EditorWindow> windows, final boolean vertical) { @NotNull List<EditorWindow> windows,
final boolean vertical) {
final Point anchorPoint = getCaretPoint(caret); final Point anchorPoint = getCaretPoint(caret);
if (anchorPoint != null) { if (anchorPoint != null) {
final List<EditorWindow> result = new ArrayList<>(); final List<EditorWindow> result = new ArrayList<>();

View File

@ -181,7 +181,8 @@ internal class PutGroup : VimPutBase() {
val firstItemBefore = allContentsBefore.firstOrNull() val firstItemBefore = allContentsBefore.firstOrNull()
logger.debug { "Copied text: ${text.copiedText}" } logger.debug { "Copied text: ${text.copiedText}" }
val (textContent, transferableData) = text.copiedText as IjVimCopiedText val (textContent, transferableData) = text.copiedText as IjVimCopiedText
val origContent: TextBlockTransferable = injector.clipboardManager.setClipboardText(textContent, textContent, transferableData) as TextBlockTransferable val origContent: TextBlockTransferable =
injector.clipboardManager.setClipboardText(textContent, textContent, transferableData) as TextBlockTransferable
val allContentsAfter = CopyPasteManager.getInstance().allContents val allContentsAfter = CopyPasteManager.getInstance().allContents
val sizeAfterInsert = allContentsAfter.size val sizeAfterInsert = allContentsAfter.size
try { try {

View File

@ -159,18 +159,22 @@ internal object IdeaSelectionControl {
if (logReason) logger.debug("Enter select mode. Reason: one line mode") if (logReason) logger.debug("Enter select mode. Reason: one line mode")
Mode.SELECT(VimPlugin.getVisualMotion().detectSelectionType(editor.vim)) Mode.SELECT(VimPlugin.getVisualMotion().detectSelectionType(editor.vim))
} }
selectionSource == VimListenerManager.SelectionSource.MOUSE && OptionConstants.selectmode_mouse in selectmode -> { selectionSource == VimListenerManager.SelectionSource.MOUSE && OptionConstants.selectmode_mouse in selectmode -> {
if (logReason) logger.debug("Enter select mode. Selection source is mouse and selectMode option has mouse") if (logReason) logger.debug("Enter select mode. Selection source is mouse and selectMode option has mouse")
Mode.SELECT(VimPlugin.getVisualMotion().detectSelectionType(editor.vim)) Mode.SELECT(VimPlugin.getVisualMotion().detectSelectionType(editor.vim))
} }
editor.isTemplateActive() && editor.vim.isIdeaRefactorModeSelect -> { editor.isTemplateActive() && editor.vim.isIdeaRefactorModeSelect -> {
if (logReason) logger.debug("Enter select mode. Template is active and selectMode has template") if (logReason) logger.debug("Enter select mode. Template is active and selectMode has template")
Mode.SELECT(VimPlugin.getVisualMotion().detectSelectionType(editor.vim)) Mode.SELECT(VimPlugin.getVisualMotion().detectSelectionType(editor.vim))
} }
selectionSource == VimListenerManager.SelectionSource.OTHER && OptionConstants.selectmode_ideaselection in selectmode -> { selectionSource == VimListenerManager.SelectionSource.OTHER && OptionConstants.selectmode_ideaselection in selectmode -> {
if (logReason) logger.debug("Enter select mode. Selection source is OTHER and selectMode has refactoring") if (logReason) logger.debug("Enter select mode. Selection source is OTHER and selectMode has refactoring")
Mode.SELECT(VimPlugin.getVisualMotion().detectSelectionType(editor.vim)) Mode.SELECT(VimPlugin.getVisualMotion().detectSelectionType(editor.vim))
} }
else -> { else -> {
if (logReason) logger.debug("Enter visual mode") if (logReason) logger.debug("Enter visual mode")
Mode.VISUAL(VimPlugin.getVisualMotion().detectSelectionType(editor.vim)) Mode.VISUAL(VimPlugin.getVisualMotion().detectSelectionType(editor.vim))

View File

@ -31,7 +31,7 @@ import kotlinx.coroutines.launch
// We use alarm with delay to avoid many actions in case many events are fired at the same time // We use alarm with delay to avoid many actions in case many events are fired at the same time
internal val correctorRequester = MutableSharedFlow<Unit>(replay=1, onBufferOverflow = BufferOverflow.DROP_OLDEST) internal val correctorRequester = MutableSharedFlow<Unit>(replay = 1, onBufferOverflow = BufferOverflow.DROP_OLDEST)
private val LOG = logger<CopilotKeymapCorrector>() private val LOG = logger<CopilotKeymapCorrector>()
@ -106,8 +106,7 @@ private fun correctCopilotKeymap() {
keymap.removeShortcut("copilot.disposeInlays", escapeShortcut) keymap.removeShortcut("copilot.disposeInlays", escapeShortcut)
copilotHideActionMap[keymap.name] = Unit copilotHideActionMap[keymap.name] = Unit
LOG.info("Remove copilot escape shortcut from keymap ${keymap.name}") LOG.info("Remove copilot escape shortcut from keymap ${keymap.name}")
} } else {
else {
copilotHideActionMap.forEach { (name, _) -> copilotHideActionMap.forEach { (name, _) ->
val keymap = KeymapManagerEx.getInstanceEx().getKeymap(name) ?: return@forEach val keymap = KeymapManagerEx.getInstanceEx().getKeymap(name) ?: return@forEach
val currentShortcuts = keymap.getShortcuts("copilot.disposeInlays") val currentShortcuts = keymap.getShortcuts("copilot.disposeInlays")

View File

@ -18,7 +18,12 @@ import com.maddyhome.idea.vim.command.OperatorArguments
* Base class for Vim commands handled by existing IDE actions. * Base class for Vim commands handled by existing IDE actions.
*/ */
internal abstract class IdeActionHandler(private val actionName: String) : VimActionHandler.SingleExecution() { internal abstract class IdeActionHandler(private val actionName: String) : VimActionHandler.SingleExecution() {
override fun execute(editor: VimEditor, context: ExecutionContext, cmd: Command, operatorArguments: OperatorArguments): Boolean { override fun execute(
editor: VimEditor,
context: ExecutionContext,
cmd: Command,
operatorArguments: OperatorArguments,
): Boolean {
injector.actionExecutor.executeAction(editor, name = actionName, context = context) injector.actionExecutor.executeAction(editor, name = actionName, context = context)
injector.scroll.scrollCaretIntoView(editor) injector.scroll.scrollCaretIntoView(editor)
return true return true

View File

@ -31,7 +31,7 @@ import kotlinx.coroutines.launch
import javax.swing.KeyStroke import javax.swing.KeyStroke
// We use alarm with delay to avoid many notifications in case many events are fired at the same time // We use alarm with delay to avoid many notifications in case many events are fired at the same time
internal val keyCheckRequests = MutableSharedFlow<Unit>(replay=1, onBufferOverflow = BufferOverflow.DROP_OLDEST) internal val keyCheckRequests = MutableSharedFlow<Unit>(replay = 1, onBufferOverflow = BufferOverflow.DROP_OLDEST)
/** /**
* This checker verifies that the keymap has a correct configuration that is required for IdeaVim plugin * This checker verifies that the keymap has a correct configuration that is required for IdeaVim plugin
@ -152,5 +152,5 @@ internal sealed interface KeyMapIssue {
val action: String, val action: String,
val actionId: String, val actionId: String,
val shortcut: Shortcut, val shortcut: Shortcut,
): KeyMapIssue ) : KeyMapIssue
} }

View File

@ -221,13 +221,13 @@ internal class VimEscHandler(nextHandler: EditorActionHandler) : VimKeyHandler(n
private val ideaVimSupportDialog private val ideaVimSupportDialog
get() = injector.globalIjOptions().ideavimsupport.contains(IjOptionConstants.ideavimsupport_dialog) get() = injector.globalIjOptions().ideavimsupport.contains(IjOptionConstants.ideavimsupport_dialog)
override fun isHandlerEnabled(editor: Editor, dataContext: DataContext?): Boolean { override fun isHandlerEnabled(editor: Editor, dataContext: DataContext?): Boolean {
return editor.isPrimaryEditor() || return editor.isPrimaryEditor() ||
EditorHelper.isFileEditor(editor) && vimStateNeedsToHandleEscape(editor) || EditorHelper.isFileEditor(editor) && vimStateNeedsToHandleEscape(editor) ||
ideaVimSupportDialog && vimStateNeedsToHandleEscape(editor) ideaVimSupportDialog && vimStateNeedsToHandleEscape(editor)
} }
private fun vimStateNeedsToHandleEscape(editor: Editor): Boolean { private fun vimStateNeedsToHandleEscape(editor: Editor): Boolean {
return !editor.vim.mode.inNormalMode || KeyHandler.getInstance().keyHandlerState.mappingState.hasKeys return !editor.vim.mode.inNormalMode || KeyHandler.getInstance().keyHandlerState.mappingState.hasKeys
} }

View File

@ -111,9 +111,12 @@ private fun Editor.updateSecondaryCaretsVisualAttributes() {
} }
} }
private val HIDDEN = CaretVisualAttributes(null, CaretVisualAttributes.Weight.NORMAL, CaretVisualAttributes.Shape.BAR, 0F) private val HIDDEN =
private val BLOCK = CaretVisualAttributes(null, CaretVisualAttributes.Weight.NORMAL, CaretVisualAttributes.Shape.BLOCK, 1.0F) CaretVisualAttributes(null, CaretVisualAttributes.Weight.NORMAL, CaretVisualAttributes.Shape.BAR, 0F)
private val BAR = CaretVisualAttributes(null, CaretVisualAttributes.Weight.NORMAL, CaretVisualAttributes.Shape.BAR, 0.25F) private val BLOCK =
CaretVisualAttributes(null, CaretVisualAttributes.Weight.NORMAL, CaretVisualAttributes.Shape.BLOCK, 1.0F)
private val BAR =
CaretVisualAttributes(null, CaretVisualAttributes.Weight.NORMAL, CaretVisualAttributes.Shape.BAR, 0.25F)
private object AttributesCache { private object AttributesCache {
private var lastGuicursorValue = "" private var lastGuicursorValue = ""

View File

@ -79,7 +79,8 @@ public class EditorHelper {
public static int getVisualLineAtMiddleOfScreen(final @NotNull Editor editor) { public static int getVisualLineAtMiddleOfScreen(final @NotNull Editor editor) {
// The editor will return line numbers of virtual space if the text doesn't reach the end of the visible area // The editor will return line numbers of virtual space if the text doesn't reach the end of the visible area
// (either because it's too short, or it's been scrolled up) // (either because it's too short, or it's been scrolled up)
final int lastLineBaseline = editor.logicalPositionToXY(new LogicalPosition(new IjVimEditor(editor).lineCount(), 0)).y; final int lastLineBaseline =
editor.logicalPositionToXY(new LogicalPosition(new IjVimEditor(editor).lineCount(), 0)).y;
final Rectangle visibleArea = getVisibleArea(editor); final Rectangle visibleArea = getVisibleArea(editor);
final int height = min(lastLineBaseline - visibleArea.y, visibleArea.height); final int height = min(lastLineBaseline - visibleArea.y, visibleArea.height);
return editor.yToVisualLine(visibleArea.y + (height / 2)); return editor.yToVisualLine(visibleArea.y + (height / 2));
@ -91,8 +92,7 @@ public class EditorHelper {
// Adjust available height if the ex entry text field is visible // Adjust available height if the ex entry text field is visible
final Rectangle visibleArea = getVisibleArea(editor); final Rectangle visibleArea = getVisibleArea(editor);
final int height = visibleArea.height - getExEntryHeight() - getHorizontalScrollbarHeight(editor); final int height = visibleArea.height - getExEntryHeight() - getHorizontalScrollbarHeight(editor);
return getFullVisualLine(editor, visibleArea.y + height, visibleArea.y, return getFullVisualLine(editor, visibleArea.y + height, visibleArea.y, visibleArea.y + height);
visibleArea.y + height);
} }
public static int getVisualLineAtBottomOfScreen(final @NotNull Editor editor) { public static int getVisualLineAtBottomOfScreen(final @NotNull Editor editor) {
@ -288,7 +288,8 @@ public class EditorHelper {
// virtual space at the bottom of the screen // virtual space at the bottom of the screen
final @NotNull VimEditor editor1 = new IjVimEditor(editor); final @NotNull VimEditor editor1 = new IjVimEditor(editor);
final int lastVisualLine = EngineEditorHelperKt.getVisualLineCount(editor1) - 1; final int lastVisualLine = EngineEditorHelperKt.getVisualLineCount(editor1) - 1;
final int yBottomLineOffset = max(getOffsetToScrollVisualLineToBottomOfScreen(editor, lastVisualLine), visibleArea.y); final int yBottomLineOffset =
max(getOffsetToScrollVisualLineToBottomOfScreen(editor, lastVisualLine), visibleArea.y);
scrollVertically(editor, min(yVisualLine - caretScreenOffset - inlayOffset, yBottomLineOffset)); scrollVertically(editor, min(yVisualLine - caretScreenOffset - inlayOffset, yBottomLineOffset));
} }
@ -331,7 +332,9 @@ public class EditorHelper {
* @param editor The editor to scroll * @param editor The editor to scroll
* @param visualLine The visual line to place in the middle of the current window * @param visualLine The visual line to place in the middle of the current window
*/ */
public static void scrollVisualLineToMiddleOfScreen(@NotNull Editor editor, int visualLine, boolean allowVirtualSpace) { public static void scrollVisualLineToMiddleOfScreen(@NotNull Editor editor,
int visualLine,
boolean allowVirtualSpace) {
final int y = editor.visualLineToY(EngineEditorHelperKt.normalizeVisualLine(new IjVimEditor(editor), visualLine)); final int y = editor.visualLineToY(EngineEditorHelperKt.normalizeVisualLine(new IjVimEditor(editor), visualLine));
final Rectangle visibleArea = getVisibleArea(editor); final Rectangle visibleArea = getVisibleArea(editor);
final int screenHeight = visibleArea.height; final int screenHeight = visibleArea.height;
@ -423,7 +426,8 @@ public class EditorHelper {
} }
} }
final int columnLeftX = (int) Math.round(editor.visualPositionToPoint2D(new VisualPosition(visualLine, targetVisualColumn)).getX()); final int columnLeftX =
(int)Math.round(editor.visualPositionToPoint2D(new VisualPosition(visualLine, targetVisualColumn)).getX());
scrollHorizontally(editor, columnLeftX); scrollHorizontally(editor, columnLeftX);
} }
@ -435,8 +439,8 @@ public class EditorHelper {
// of columns. It also works with inline inlays and folds. It is slightly inaccurate for proportional fonts, but is // of columns. It also works with inline inlays and folds. It is slightly inaccurate for proportional fonts, but is
// still a good solution. Besides, what kind of monster uses Vim with proportional fonts? // still a good solution. Besides, what kind of monster uses Vim with proportional fonts?
final float standardColumnWidth = EditorHelper.getPlainSpaceWidthFloat(editor); final float standardColumnWidth = EditorHelper.getPlainSpaceWidthFloat(editor);
final int screenMidColumn = (int) (screenWidth / standardColumnWidth / 2); final int screenMidColumn = (int)(screenWidth / standardColumnWidth / 2);
final int x = max(0, (int) Math.round(point.getX() - (screenMidColumn * standardColumnWidth))); final int x = max(0, (int)Math.round(point.getX() - (screenMidColumn * standardColumnWidth)));
scrollHorizontally(editor, x); scrollHorizontally(editor, x);
} }
@ -461,7 +465,8 @@ public class EditorHelper {
} }
// Scroll to the left edge of the target column, minus a screenwidth, and adjusted for inlays // Scroll to the left edge of the target column, minus a screenwidth, and adjusted for inlays
final int targetColumnRightX = (int) Math.round(editor.visualPositionToPoint2D(new VisualPosition(visualLine, targetVisualColumn + 1)).getX()); final int targetColumnRightX =
(int)Math.round(editor.visualPositionToPoint2D(new VisualPosition(visualLine, targetVisualColumn + 1)).getX());
final int screenWidth = getVisibleArea(editor).width; final int screenWidth = getVisibleArea(editor).width;
scrollHorizontally(editor, targetColumnRightX - screenWidth); scrollHorizontally(editor, targetColumnRightX - screenWidth);
} }
@ -469,8 +474,8 @@ public class EditorHelper {
/** /**
* Scroll page down, moving text up. * Scroll page down, moving text up.
* *
* @param editor The editor to scroll * @param editor The editor to scroll
* @param pages How many pages to scroll * @param pages How many pages to scroll
* @return A pair consisting of a flag to show if scrolling was completed, and a visual line to position the cart on * @return A pair consisting of a flag to show if scrolling was completed, and a visual line to position the cart on
*/ */
public static Pair<Boolean, Integer> scrollFullPageDown(final @NotNull Editor editor, int pages) { public static Pair<Boolean, Integer> scrollFullPageDown(final @NotNull Editor editor, int pages) {
@ -521,8 +526,8 @@ public class EditorHelper {
/** /**
* Scroll page up, moving text down. * Scroll page up, moving text down.
* *
* @param editor The editor to scroll * @param editor The editor to scroll
* @param pages How many pages to scroll * @param pages How many pages to scroll
* @return A pair consisting of a flag to show if scrolling was completed, and a visual line to position the cart on * @return A pair consisting of a flag to show if scrolling was completed, and a visual line to position the cart on
*/ */
public static Pair<Boolean, Integer> scrollFullPageUp(final @NotNull Editor editor, int pages) { public static Pair<Boolean, Integer> scrollFullPageUp(final @NotNull Editor editor, int pages) {
@ -596,7 +601,8 @@ public class EditorHelper {
} }
if (xActualLeft >= leftBound) { if (xActualLeft >= leftBound) {
final VisualPosition nextVisualPosition = new VisualPosition(closestVisualPosition.line, closestVisualPosition.column + 1); final VisualPosition nextVisualPosition =
new VisualPosition(closestVisualPosition.line, closestVisualPosition.column + 1);
final long xActualRight = Math.round(editor.visualPositionToPoint2D(nextVisualPosition).getX()) - 1; final long xActualRight = Math.round(editor.visualPositionToPoint2D(nextVisualPosition).getX()) - 1;
if (xActualRight <= rightBound) { if (xActualRight <= rightBound) {
return closestVisualPosition.column; return closestVisualPosition.column;

View File

@ -56,7 +56,8 @@ internal class HandlerInjector {
// only true in command mode. // only true in command mode.
// Set by `org.jetbrains.plugins.notebooks.ui.editor.actions.command.mode.NotebookEditorModeListenerAdapter` // Set by `org.jetbrains.plugins.notebooks.ui.editor.actions.command.mode.NotebookEditorModeListenerAdapter`
// appears to be null in non Notebook editors // appears to be null in non Notebook editors
val allow_plain_letter_shortcuts = editor.contentComponent.getClientProperty(ActionUtil.ALLOW_PlAIN_LETTER_SHORTCUTS) val allow_plain_letter_shortcuts =
editor.contentComponent.getClientProperty(ActionUtil.ALLOW_PlAIN_LETTER_SHORTCUTS)
inEditor && (allow_plain_letter_shortcuts != null && allow_plain_letter_shortcuts as Boolean) inEditor && (allow_plain_letter_shortcuts != null && allow_plain_letter_shortcuts as Boolean)
} }
} else { } else {

View File

@ -138,7 +138,7 @@ internal class IjActionExecutor : VimActionExecutor {
val action = getAction(name, context) val action = getAction(name, context)
return action != null && executeAction(editor, IjNativeAction(action), context) return action != null && executeAction(editor, IjNativeAction(action), context)
} }
private fun getAction(name: String, context: ExecutionContext): AnAction? { private fun getAction(name: String, context: ExecutionContext): AnAction? {
val actionManager = ActionManager.getInstance() val actionManager = ActionManager.getInstance()
val action = actionManager.getAction(name) val action = actionManager.getAction(name)

View File

@ -197,4 +197,5 @@ private fun skip(iterator: IntIterator, n: Int) {
class CountPosition(val count: Int, val position: Int) class CountPosition(val count: Int, val position: Int)
private val logger = logger<SearchLogger>() private val logger = logger<SearchLogger>()
private class SearchLogger private class SearchLogger

View File

@ -48,8 +48,7 @@ internal fun updateIncsearchHighlights(
): Int { ): Int {
val searchStartOffset = if (searchRange != null && searchRange.startLine < editor.document.lineCount) { val searchStartOffset = if (searchRange != null && searchRange.startLine < editor.document.lineCount) {
editor.vim.getLineStartOffset(searchRange.startLine) editor.vim.getLineStartOffset(searchRange.startLine)
} } else {
else {
caretOffset caretOffset
} }
val showHighlights = injector.options(editor.vim).hlsearch val showHighlights = injector.options(editor.vim).hlsearch
@ -218,8 +217,7 @@ private fun findClosestMatch(
} }
val closestIndex = if (forwards) { val closestIndex = if (forwards) {
sortedResults.indexOfFirst { it.startOffset > initialOffset } sortedResults.indexOfFirst { it.startOffset > initialOffset }
} } else {
else {
sortedResults.indexOfFirst { it.startOffset < initialOffset } sortedResults.indexOfFirst { it.startOffset < initialOffset }
} }
@ -235,7 +233,12 @@ private fun findClosestMatch(
return sortedResults[nextIndex % results.size].startOffset return sortedResults[nextIndex % results.size].startOffset
} }
internal fun highlightSearchResults(editor: Editor, pattern: String, results: List<TextRange>, currentMatchOffset: Int) { internal fun highlightSearchResults(
editor: Editor,
pattern: String,
results: List<TextRange>,
currentMatchOffset: Int,
) {
var highlighters = editor.vimLastHighlighters var highlighters = editor.vimLastHighlighters
if (highlighters == null) { if (highlighters == null) {
highlighters = mutableListOf() highlighters = mutableListOf()

View File

@ -119,7 +119,7 @@ internal class UndoRedoHelper : VimTimestampBasedUndoService {
private fun hasSelection(editor: VimEditor): Boolean { private fun hasSelection(editor: VimEditor): Boolean {
return editor.primaryCaret().ij.hasSelection() return editor.primaryCaret().ij.hasSelection()
} }
override fun redo(editor: VimEditor, context: ExecutionContext): Boolean { override fun redo(editor: VimEditor, context: ExecutionContext): Boolean {
val ijContext = context.context as DataContext val ijContext = context.context as DataContext
val project = PlatformDataKeys.PROJECT.getData(ijContext) ?: return false val project = PlatformDataKeys.PROJECT.getData(ijContext) ?: return false

View File

@ -81,9 +81,11 @@ internal var Caret.vimLastColumn: Int
_vimLastColumn = value _vimLastColumn = value
_vimLastColumnPos = visualPosition _vimLastColumnPos = visualPosition
} }
internal fun Caret.resetVimLastColumn() { internal fun Caret.resetVimLastColumn() {
_vimLastColumnPos = null _vimLastColumnPos = null
} }
private var Caret._vimLastColumn: Int by userDataCaretToEditorOr { (this as Caret).inlayAwareVisualColumn } private var Caret._vimLastColumn: Int by userDataCaretToEditorOr { (this as Caret).inlayAwareVisualColumn }
private var Caret._vimLastColumnPos: VisualPosition? by userDataCaretToEditor() private var Caret._vimLastColumnPos: VisualPosition? by userDataCaretToEditor()

View File

@ -72,7 +72,8 @@ internal object IdeaSpecifics {
val isVimAction = (action as? AnActionWrapper)?.delegate is VimShortcutKeyAction val isVimAction = (action as? AnActionWrapper)?.delegate is VimShortcutKeyAction
if (!isVimAction && injector.globalIjOptions().trackactionids) { if (!isVimAction && injector.globalIjOptions().trackactionids) {
if (action !is NotificationService.ActionIdNotifier.CopyActionId && action !is NotificationService.ActionIdNotifier.StopTracking) { if (action !is NotificationService.ActionIdNotifier.CopyActionId && action !is NotificationService.ActionIdNotifier.StopTracking) {
val id: String? = ActionManager.getInstance().getId(action) ?: (action.shortcutSet as? ProxyShortcutSet)?.actionId val id: String? =
ActionManager.getInstance().getId(action) ?: (action.shortcutSet as? ProxyShortcutSet)?.actionId
val candidates = if (id == null) { val candidates = if (id == null) {
// Some actions are specific to the component they're registered for, and are copies of a global action, // Some actions are specific to the component they're registered for, and are copies of a global action,
// reusing the action ID and shortcuts (e.g. `NextTab` is different for editor tabs and tool window tabs). // reusing the action ID and shortcuts (e.g. `NextTab` is different for editor tabs and tool window tabs).
@ -83,8 +84,7 @@ internal object IdeaSpecifics {
// action. Note that we might return duplicate IDs because the keymap might have multiple shortcuts mapped // action. Note that we might return duplicate IDs because the keymap might have multiple shortcuts mapped
// to the same action. The notifier will handle de-duplication and sorting as a presentation detail. // to the same action. The notifier will handle de-duplication and sorting as a presentation detail.
action.shortcutSet.shortcuts.flatMap { KeymapManager.getInstance().activeKeymap.getActionIdList(it) } action.shortcutSet.shortcuts.flatMap { KeymapManager.getInstance().activeKeymap.getActionIdList(it) }
} } else {
else {
emptyList() emptyList()
} }
@ -125,7 +125,14 @@ internal object IdeaSpecifics {
val caretShift = addedTextLength - (editor.caretModel.primaryCaret.offset - prevDocumentOffset) val caretShift = addedTextLength - (editor.caretModel.primaryCaret.offset - prevDocumentOffset)
val leftArrow = KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0) val leftArrow = KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0)
register.recordText(editor.document.getText(TextRange(prevDocumentOffset, prevDocumentOffset + addedTextLength))) register.recordText(
editor.document.getText(
TextRange(
prevDocumentOffset,
prevDocumentOffset + addedTextLength
)
)
)
repeat(caretShift.coerceAtLeast(0)) { repeat(caretShift.coerceAtLeast(0)) {
register.recordKeyStroke(leftArrow) register.recordKeyStroke(leftArrow)
} }

View File

@ -14,7 +14,10 @@ import com.maddyhome.idea.vim.common.ModeChangeListener
import com.maddyhome.idea.vim.newapi.ij import com.maddyhome.idea.vim.newapi.ij
import com.maddyhome.idea.vim.state.mode.Mode import com.maddyhome.idea.vim.state.mode.Mode
@Deprecated(message = "Please use ModeChangeListener", replaceWith = ReplaceWith("ModeChangeListener", imports = ["import com.maddyhome.idea.vim.common.ModeChangeListener"])) @Deprecated(
message = "Please use ModeChangeListener",
replaceWith = ReplaceWith("ModeChangeListener", imports = ["import com.maddyhome.idea.vim.common.ModeChangeListener"])
)
interface VimInsertListener : ModeChangeListener { interface VimInsertListener : ModeChangeListener {
override fun modeChanged(editor: VimEditor, oldMode: Mode) { override fun modeChanged(editor: VimEditor, oldMode: Mode) {
if (editor.mode == Mode.INSERT) { if (editor.mode == Mode.INSERT) {

View File

@ -197,7 +197,10 @@ internal object VimListenerManager {
val optionGroup = VimPlugin.getOptionGroup() val optionGroup = VimPlugin.getOptionGroup()
optionGroup.addEffectiveOptionValueChangeListener(Options.number, EditorGroup.NumberChangeListener.INSTANCE) optionGroup.addEffectiveOptionValueChangeListener(Options.number, EditorGroup.NumberChangeListener.INSTANCE)
optionGroup.addEffectiveOptionValueChangeListener(IjOptions.relativenumber, EditorGroup.NumberChangeListener.INSTANCE) optionGroup.addEffectiveOptionValueChangeListener(
IjOptions.relativenumber,
EditorGroup.NumberChangeListener.INSTANCE
)
optionGroup.addEffectiveOptionValueChangeListener(Options.scrolloff, ScrollGroup.ScrollOptionsChangeListener) optionGroup.addEffectiveOptionValueChangeListener(Options.scrolloff, ScrollGroup.ScrollOptionsChangeListener)
optionGroup.addEffectiveOptionValueChangeListener(Options.guicursor, GuicursorChangeListener) optionGroup.addEffectiveOptionValueChangeListener(Options.guicursor, GuicursorChangeListener)
optionGroup.addGlobalOptionChangeListener(Options.showcmd, ShowCmdOptionChangeListener) optionGroup.addGlobalOptionChangeListener(Options.showcmd, ShowCmdOptionChangeListener)
@ -209,8 +212,10 @@ internal object VimListenerManager {
macroWidgetOptionListener.onGlobalOptionChanged() macroWidgetOptionListener.onGlobalOptionChanged()
// Listen for and initialise new editors // Listen for and initialise new editors
EventFacade.getInstance().addEditorFactoryListener(VimEditorFactoryListener, VimPlugin.getInstance().onOffDisposable) EventFacade.getInstance()
val busConnection = ApplicationManager.getApplication().messageBus.connect(VimPlugin.getInstance().onOffDisposable) .addEditorFactoryListener(VimEditorFactoryListener, VimPlugin.getInstance().onOffDisposable)
val busConnection =
ApplicationManager.getApplication().messageBus.connect(VimPlugin.getInstance().onOffDisposable)
busConnection.subscribe(FileOpenedSyncListener.TOPIC, VimEditorFactoryListener) busConnection.subscribe(FileOpenedSyncListener.TOPIC, VimEditorFactoryListener)
} }
@ -219,7 +224,10 @@ internal object VimListenerManager {
val optionGroup = VimPlugin.getOptionGroup() val optionGroup = VimPlugin.getOptionGroup()
optionGroup.removeEffectiveOptionValueChangeListener(Options.number, EditorGroup.NumberChangeListener.INSTANCE) optionGroup.removeEffectiveOptionValueChangeListener(Options.number, EditorGroup.NumberChangeListener.INSTANCE)
optionGroup.removeEffectiveOptionValueChangeListener(IjOptions.relativenumber, EditorGroup.NumberChangeListener.INSTANCE) optionGroup.removeEffectiveOptionValueChangeListener(
IjOptions.relativenumber,
EditorGroup.NumberChangeListener.INSTANCE
)
optionGroup.removeEffectiveOptionValueChangeListener(Options.scrolloff, ScrollGroup.ScrollOptionsChangeListener) optionGroup.removeEffectiveOptionValueChangeListener(Options.scrolloff, ScrollGroup.ScrollOptionsChangeListener)
optionGroup.removeGlobalOptionChangeListener(Options.showcmd, ShowCmdOptionChangeListener) optionGroup.removeGlobalOptionChangeListener(Options.showcmd, ShowCmdOptionChangeListener)
optionGroup.removeGlobalOptionChangeListener(Options.showmode, modeWidgetOptionListener) optionGroup.removeGlobalOptionChangeListener(Options.showmode, modeWidgetOptionListener)
@ -227,7 +235,7 @@ internal object VimListenerManager {
optionGroup.removeEffectiveOptionValueChangeListener(Options.guicursor, GuicursorChangeListener) optionGroup.removeEffectiveOptionValueChangeListener(Options.guicursor, GuicursorChangeListener)
} }
} }
object EditorListeners { object EditorListeners {
fun addAll() { fun addAll() {
val initialisedEditors = mutableSetOf<Editor>() val initialisedEditors = mutableSetOf<Editor>()
@ -327,8 +335,7 @@ internal object VimListenerManager {
val editorDisposable = editor.removeUserData(editorListenersDisposableKey) val editorDisposable = editor.removeUserData(editorListenersDisposableKey)
if (editorDisposable != null) { if (editorDisposable != null) {
Disposer.dispose(editorDisposable) Disposer.dispose(editorDisposable)
} } else {
else {
// We definitely do not expect this to happen // We definitely do not expect this to happen
StrictMode.fail("Editor doesn't have disposable attached. $editor") StrictMode.fail("Editor doesn't have disposable attached. $editor")
} }
@ -447,8 +454,7 @@ internal object VimListenerManager {
} }
EditorListeners.add(event.editor, openingEditor?.vim ?: injector.fallbackWindow, scenario) EditorListeners.add(event.editor, openingEditor?.vim ?: injector.fallbackWindow, scenario)
firstEditorInitialised = true firstEditorInitialised = true
} } else {
else {
// We've got a virtual file, so FileOpenedSyncListener will be called. Save data // We've got a virtual file, so FileOpenedSyncListener will be called. Save data
val project = openingEditor.project ?: return val project = openingEditor.project ?: return
val virtualFile = openingEditor.virtualFile ?: return val virtualFile = openingEditor.virtualFile ?: return
@ -461,15 +467,18 @@ internal object VimListenerManager {
// If the user has enabled "Open declaration source in the same tab", the opening editor will be replaced as // If the user has enabled "Open declaration source in the same tab", the opening editor will be replaced as
// long as it's not pinned, and it's not modified, and we're in the same split // long as it's not pinned, and it's not modified, and we're in the same split
val canBeReused = UISettings.getInstance().reuseNotModifiedTabs && val canBeReused = UISettings.getInstance().reuseNotModifiedTabs &&
(manager.getComposite(virtualFile) as? EditorComposite)?.let { composite -> (manager.getComposite(virtualFile) as? EditorComposite)?.let { composite ->
!composite.isPinned && !composite.isModified !composite.isPinned && !composite.isModified
} ?: false } ?: false
// Keep a track of the owner of the opening editor, so we can compare later, potentially after the opening // Keep a track of the owner of the opening editor, so we can compare later, potentially after the opening
// editor has been closed. This is nullable, but should always have a value // editor has been closed. This is nullable, but should always have a value
val owningEditorWindow = getOwningEditorWindow(openingEditor) val owningEditorWindow = getOwningEditorWindow(openingEditor)
event.editor.putUserData(openingEditorKey, OpeningEditor(openingEditor, owningEditorWindow, isPreview, canBeReused)) event.editor.putUserData(
openingEditorKey,
OpeningEditor(openingEditor, owningEditorWindow, isPreview, canBeReused)
)
} }
VimStandalonePluginUpdateChecker.getInstance().pluginUsed() VimStandalonePluginUpdateChecker.getInstance().pluginUsed()
@ -525,7 +534,7 @@ internal object VimListenerManager {
// Sometimes the platform will not reuse a tab when you expect it to, e.g. when reuse tabs is enabled and // Sometimes the platform will not reuse a tab when you expect it to, e.g. when reuse tabs is enabled and
// navigating to derived class. We'll confirm our heuristics by checking to see if the editor is still around // navigating to derived class. We'll confirm our heuristics by checking to see if the editor is still around
val openingEditorIsClosed = editor.project?.let { p -> val openingEditorIsClosed = editor.project?.let { p ->
FileEditorManagerEx.getInstanceEx(p).allEditors.filterIsInstance(TextEditor::class.java).all { textEditor -> FileEditorManagerEx.getInstanceEx(p).allEditors.filterIsInstance<TextEditor>().all { textEditor ->
textEditor.editor != openingEditor?.editor textEditor.editor != openingEditor?.editor
} }
} ?: false } ?: false
@ -547,7 +556,7 @@ internal object VimListenerManager {
private fun getOwningEditorWindow(editor: Editor) = editor.project?.let { p -> private fun getOwningEditorWindow(editor: Editor) = editor.project?.let { p ->
FileEditorManagerEx.getInstanceEx(p).windows.find { editorWindow -> FileEditorManagerEx.getInstanceEx(p).windows.find { editorWindow ->
editorWindow.allComposites.any { composite -> editorWindow.allComposites.any { composite ->
composite.allEditors.filterIsInstance(TextEditor::class.java).any { it.editor == editor } composite.allEditors.filterIsInstance<TextEditor>().any { it.editor == editor }
} }
} }
} }
@ -584,7 +593,8 @@ internal object VimListenerManager {
// TODO: It is very confusing that this logic is split between EditorSelectionHandler and EditorMouseHandler // TODO: It is very confusing that this logic is split between EditorSelectionHandler and EditorMouseHandler
if (MouseEventsDataHolder.dragEventCount < MouseEventsDataHolder.allowedSkippedDragEvents if (MouseEventsDataHolder.dragEventCount < MouseEventsDataHolder.allowedSkippedDragEvents
&& lineStart != lineEnd && startOffset == caretOffset) { && lineStart != lineEnd && startOffset == caretOffset
) {
if (lineEnd == endOffset - 1) { if (lineEnd == endOffset - 1) {
// When starting on an empty line and dragging vertically upwards onto // When starting on an empty line and dragging vertically upwards onto
// another line, the selection should include the entirety of the empty line // another line, the selection should include the entirety of the empty line

View File

@ -32,8 +32,7 @@ internal class IntellijMark(bookmark: LineBookmark, override val col: Int, proje
} }
private fun getMark(): LineBookmark? = private fun getMark(): LineBookmark? =
getProject()?.let { getProject()?.let { project ->
project ->
BookmarksManager.getInstance(project)?.getBookmark(BookmarkType.get(key)) as? LineBookmark BookmarksManager.getInstance(project)?.getBookmark(BookmarkType.get(key)) as? LineBookmark
} }

View File

@ -64,7 +64,11 @@ internal class IjClipboardManager : VimClipboardManager {
override fun setClipboardContent(editor: VimEditor, context: ExecutionContext, textData: VimCopiedText): Boolean { override fun setClipboardContent(editor: VimEditor, context: ExecutionContext, textData: VimCopiedText): Boolean {
require(textData is IjVimCopiedText) require(textData is IjVimCopiedText)
return handleTextSetting(textData.text, textData.text, textData.transferableData) { content -> setContents(content) } != null return handleTextSetting(
textData.text,
textData.text,
textData.transferableData
) { content -> setContents(content) } != null
} }
// TODO prefer methods with ranges, because they collect and preprocess for us // TODO prefer methods with ranges, because they collect and preprocess for us
@ -129,7 +133,12 @@ internal class IjClipboardManager : VimClipboardManager {
} }
} }
override fun collectCopiedText(editor: VimEditor, context: ExecutionContext, range: TextRange, text: String): VimCopiedText { override fun collectCopiedText(
editor: VimEditor,
context: ExecutionContext,
range: TextRange,
text: String,
): VimCopiedText {
val transferableData = getTransferableData(editor, range) val transferableData = getTransferableData(editor, range)
val preprocessedText = preprocessText(editor, range, text, transferableData) val preprocessedText = preprocessText(editor, range, text, transferableData)
return IjVimCopiedText(preprocessedText, transferableData) return IjVimCopiedText(preprocessedText, transferableData)
@ -140,7 +149,12 @@ internal class IjClipboardManager : VimClipboardManager {
} }
@Suppress("UNCHECKED_CAST") @Suppress("UNCHECKED_CAST")
private fun handleTextSetting(text: String, rawText: String, transferableData: List<Any>, setContent: (TextBlockTransferable) -> Unit?): Transferable? { private fun handleTextSetting(
text: String,
rawText: String,
transferableData: List<Any>,
setContent: (TextBlockTransferable) -> Unit?,
): Transferable? {
val mutableTransferableData = (transferableData as List<TextBlockTransferableData>).toMutableList() val mutableTransferableData = (transferableData as List<TextBlockTransferableData>).toMutableList()
try { try {
val s = TextBlockTransferable.convertLineSeparators(text, "\n", mutableTransferableData) val s = TextBlockTransferable.convertLineSeparators(text, "\n", mutableTransferableData)
@ -182,7 +196,12 @@ internal class IjClipboardManager : VimClipboardManager {
} }
} }
} }
transferableData.add(CaretStateTransferableData(intArrayOf(0), intArrayOf(textRange.endOffset - textRange.startOffset))) transferableData.add(
CaretStateTransferableData(
intArrayOf(0),
intArrayOf(textRange.endOffset - textRange.startOffset)
)
)
// These data provided by {@link com.intellij.openapi.editor.richcopy.TextWithMarkupProcessor} doesn't work with // These data provided by {@link com.intellij.openapi.editor.richcopy.TextWithMarkupProcessor} doesn't work with
// IdeaVim and I don't see a way to fix it // IdeaVim and I don't see a way to fix it
@ -241,6 +260,6 @@ internal class IjClipboardManager : VimClipboardManager {
} }
} }
data class IjVimCopiedText(override val text: String, val transferableData: List<Any>): VimCopiedText { data class IjVimCopiedText(override val text: String, val transferableData: List<Any>) : VimCopiedText {
override fun updateText(newText: String): VimCopiedText = IjVimCopiedText(newText, transferableData) override fun updateText(newText: String): VimCopiedText = IjVimCopiedText(newText, transferableData)
} }

View File

@ -86,6 +86,7 @@ internal class IjVimCaret(val caret: Caret) : VimCaretBase() {
set(value) { set(value) {
caret.vimLastColumn = value caret.vimLastColumn = value
} }
override fun resetLastColumn() = caret.resetVimLastColumn() override fun resetLastColumn() = caret.resetVimLastColumn()
override val selectionStart: Int override val selectionStart: Int
get() = caret.selectionStart get() = caret.selectionStart

View File

@ -386,7 +386,7 @@ internal class IjVimEditor(editor: Editor) : MutableLinearEditor, VimEditorBase(
} }
override fun extractProtocol(): String? { override fun extractProtocol(): String? {
return EditorHelper.getVirtualFile(editor)?.getUrl()?.let { VirtualFileManager.extractProtocol(it) } return EditorHelper.getVirtualFile(editor)?.url?.let { VirtualFileManager.extractProtocol(it) }
} }
override val projectId = editor.project?.let { injector.file.getProjectId(it) } ?: DEFAULT_PROJECT_ID override val projectId = editor.project?.let { injector.file.getProjectId(it) } ?: DEFAULT_PROJECT_ID
@ -536,7 +536,7 @@ val VimEditor.ij: Editor
val com.intellij.openapi.util.TextRange.vim: TextRange val com.intellij.openapi.util.TextRange.vim: TextRange
get() = TextRange(this.startOffset, this.endOffset) get() = TextRange(this.startOffset, this.endOffset)
internal class InsertTimeRecorder: ModeChangeListener { internal class InsertTimeRecorder : ModeChangeListener {
override fun modeChanged(editor: VimEditor, oldMode: Mode) { override fun modeChanged(editor: VimEditor, oldMode: Mode) {
editor as IjVimEditor editor as IjVimEditor
if (oldMode == Mode.INSERT) { if (oldMode == Mode.INSERT) {

View File

@ -41,8 +41,7 @@ internal class IjVimMessages : VimMessagesBase() {
val project = editor?.ij?.project val project = editor?.ij?.project
if (project != null) { if (project != null) {
setStatusBarMessage(project, message) setStatusBarMessage(project, message)
} } else {
else {
// TODO: We really shouldn't set the status bar text for other projects. That's rude. // TODO: We really shouldn't set the status bar text for other projects. That's rude.
ProjectManager.getInstance().openProjects.forEach { ProjectManager.getInstance().openProjects.forEach {
setStatusBarMessage(it, message) setStatusBarMessage(it, message)

View File

@ -277,7 +277,11 @@ open class IjVimSearchGroup : VimSearchGroupBase(), PersistentStateComponent<Ele
} }
} }
(injector.searchGroup as VimSearchGroupBase).highlightSearchLines(editor.vim, startPosition.line, endPosition.line) (injector.searchGroup as VimSearchGroupBase).highlightSearchLines(
editor.vim,
startPosition.line,
endPosition.line
)
if (logger.isDebug()) { if (logger.isDebug()) {
existingHighlighters = editor.vimLastHighlighters!! existingHighlighters = editor.vimLastHighlighters!!

View File

@ -45,8 +45,7 @@ internal class IjVimSearchHelper : VimSearchHelperBase() {
endOffset = caret.offset - 1 endOffset = caret.offset - 1
skipCount = -count - 1 skipCount = -count - 1
offsetOrdering = IntComparators.OPPOSITE_COMPARATOR offsetOrdering = IntComparators.OPPOSITE_COMPARATOR
} } else {
else {
startOffset = caret.offset + 1 startOffset = caret.offset + 1
endOffset = editor.ij.document.textLength endOffset = editor.ij.document.textLength
skipCount = count - 1 skipCount = count - 1

View File

@ -29,7 +29,13 @@ internal class ShortcutConflictState : ApplicationUsagesCollector() {
val metrics = mutableSetOf<MetricEvent>() val metrics = mutableSetOf<MetricEvent>()
keyStrokes.forEach { keystroke -> keyStrokes.forEach { keystroke ->
getHandlersForShortcut(keystroke) getHandlersForShortcut(keystroke)
.filter { !setOf(HandledModes.INSERT_UNDEFINED, HandledModes.NORMAL_UNDEFINED, HandledModes.VISUAL_AND_SELECT_UNDEFINED).contains(it) } .filter {
!setOf(
HandledModes.INSERT_UNDEFINED,
HandledModes.NORMAL_UNDEFINED,
HandledModes.VISUAL_AND_SELECT_UNDEFINED
).contains(it)
}
.forEach { mode -> .forEach { mode ->
metrics += HANDLER.metric(keystroke.toReadableString(), mode) metrics += HANDLER.metric(keystroke.toReadableString(), mode)
} }
@ -38,14 +44,32 @@ internal class ShortcutConflictState : ApplicationUsagesCollector() {
} }
private fun getHandlersForShortcut(shortcut: KeyStroke): List<HandledModes> { private fun getHandlersForShortcut(shortcut: KeyStroke): List<HandledModes> {
val modes = VimPlugin.getKey().shortcutConflicts[shortcut] ?: return listOf(HandledModes.NORMAL_UNDEFINED, HandledModes.INSERT_UNDEFINED, HandledModes.VISUAL_AND_SELECT_UNDEFINED) val modes = VimPlugin.getKey().shortcutConflicts[shortcut] ?: return listOf(
HandledModes.NORMAL_UNDEFINED,
HandledModes.INSERT_UNDEFINED,
HandledModes.VISUAL_AND_SELECT_UNDEFINED
)
return when (modes) { return when (modes) {
is ShortcutOwnerInfo.AllModes -> { is ShortcutOwnerInfo.AllModes -> {
when (modes.owner) { when (modes.owner) {
ShortcutOwner.IDE -> listOf(HandledModes.NORMAL_IDE, HandledModes.INSERT_IDE, HandledModes.VISUAL_AND_SELECT_IDE) ShortcutOwner.IDE -> listOf(
ShortcutOwner.VIM -> listOf(HandledModes.NORMAL_VIM, HandledModes.INSERT_VIM, HandledModes.VISUAL_AND_SELECT_VIM) HandledModes.NORMAL_IDE,
ShortcutOwner.UNDEFINED -> listOf(HandledModes.NORMAL_UNDEFINED, HandledModes.INSERT_UNDEFINED, HandledModes.VISUAL_AND_SELECT_UNDEFINED) HandledModes.INSERT_IDE,
HandledModes.VISUAL_AND_SELECT_IDE
)
ShortcutOwner.VIM -> listOf(
HandledModes.NORMAL_VIM,
HandledModes.INSERT_VIM,
HandledModes.VISUAL_AND_SELECT_VIM
)
ShortcutOwner.UNDEFINED -> listOf(
HandledModes.NORMAL_UNDEFINED,
HandledModes.INSERT_UNDEFINED,
HandledModes.VISUAL_AND_SELECT_UNDEFINED
)
} }
} }

View File

@ -29,7 +29,8 @@ internal class VimscriptState : ApplicationUsagesCollector() {
return setOf( return setOf(
VIMSCRIPT.metric( VIMSCRIPT.metric(
SOURCED_FILES with Util.sourcedFiles.size, SOURCED_FILES with Util.sourcedFiles.size,
IDEAVIMRC_SIZE with (VimRcService.findIdeaVimRc()?.readLines()?.filter { !it.matches(Regex("\\s*\".*")) && it.isNotBlank() }?.size ?: -1), IDEAVIMRC_SIZE with (VimRcService.findIdeaVimRc()?.readLines()
?.filter { !it.matches(Regex("\\s*\".*")) && it.isNotBlank() }?.size ?: -1),
EXTENSIONS_ENABLED_BY_SET with (PluginState.Util.enabledExtensions - Util.extensionsEnabledWithPlug).toList(), EXTENSIONS_ENABLED_BY_SET with (PluginState.Util.enabledExtensions - Util.extensionsEnabledWithPlug).toList(),
EXTENSIONS_ENABLED_BY_PLUG with Util.extensionsEnabledWithPlug.toList(), EXTENSIONS_ENABLED_BY_PLUG with Util.extensionsEnabledWithPlug.toList(),
IS_IDE_SPECIFIC_CONFIGURATION_USED with Util.isIDESpecificConfigurationUsed, IS_IDE_SPECIFIC_CONFIGURATION_USED with Util.isIDESpecificConfigurationUsed,

View File

@ -58,8 +58,10 @@ class WidgetState : ApplicationUsagesCollector() {
private val GROUP = EventLogGroup("vim.widget", 1, "FUS") private val GROUP = EventLogGroup("vim.widget", 1, "FUS")
private val IS_MODE_WIDGET_SHOWN = EventFields.Boolean("is-mode-widget-shown") private val IS_MODE_WIDGET_SHOWN = EventFields.Boolean("is-mode-widget-shown")
private val MODE_WIDGET_THEME_LIGHT = EventFields.String("mode-widget-theme-light", listOf("TERM", "COLORLESS", "ADVANCED CUSTOMIZATION")) private val MODE_WIDGET_THEME_LIGHT =
private val MODE_WIDGET_THEME_DARK = EventFields.String("mode-widget-theme-dark", listOf("TERM", "COLORLESS", "ADVANCED CUSTOMIZATION")) EventFields.String("mode-widget-theme-light", listOf("TERM", "COLORLESS", "ADVANCED CUSTOMIZATION"))
private val MODE_WIDGET_THEME_DARK =
EventFields.String("mode-widget-theme-dark", listOf("TERM", "COLORLESS", "ADVANCED CUSTOMIZATION"))
private val WIDGET: VarargEventId = GROUP.registerVarargEvent( private val WIDGET: VarargEventId = GROUP.registerVarargEvent(
"vim.widget", "vim.widget",

View File

@ -259,7 +259,8 @@ public class ExOutputPanel extends JPanel {
public boolean isAtEnd() { public boolean isAtEnd() {
int val = myScrollPane.getVerticalScrollBar().getValue(); int val = myScrollPane.getVerticalScrollBar().getValue();
return val >= myScrollPane.getVerticalScrollBar().getMaximum() - myScrollPane.getVerticalScrollBar().getVisibleAmount(); return val >=
myScrollPane.getVerticalScrollBar().getMaximum() - myScrollPane.getVerticalScrollBar().getVisibleAmount();
} }
private void positionPanel() { private void positionPanel() {
@ -316,8 +317,10 @@ public class ExOutputPanel extends JPanel {
KeyHandler.getInstance().getKeyStack().dump()); KeyHandler.getInstance().getKeyStack().dump());
} }
KeyHandler.getInstance().getKeyStack().addKeys(keys); KeyHandler.getInstance().getKeyStack().addKeys(keys);
ExecutionContext context = injector.getExecutionContextManager().getEditorExecutionContext(new IjVimEditor(myEditor)); ExecutionContext context =
injector.getApplication().runWriteAction(() -> { VimPlugin.getMacro().playbackKeys(new IjVimEditor(myEditor), context, 1); injector.getExecutionContextManager().getEditorExecutionContext(new IjVimEditor(myEditor));
injector.getApplication().runWriteAction(() -> {
VimPlugin.getMacro().playbackKeys(new IjVimEditor(myEditor), context, 1);
return null; return null;
}); });
} }
@ -342,7 +345,9 @@ public class ExOutputPanel extends JPanel {
int keyCode = e.getKeyCode(); int keyCode = e.getKeyCode();
Character keyChar = e.getKeyChar(); Character keyChar = e.getKeyChar();
int modifiers = e.getModifiersEx(); int modifiers = e.getModifiersEx();
KeyStroke keyStroke = (keyChar == KeyEvent.CHAR_UNDEFINED) ? KeyStroke.getKeyStroke(keyCode, modifiers) : KeyStroke.getKeyStroke(keyChar, modifiers); KeyStroke keyStroke = (keyChar == KeyEvent.CHAR_UNDEFINED)
? KeyStroke.getKeyStroke(keyCode, modifiers)
: KeyStroke.getKeyStroke(keyChar, modifiers);
currentPanel.handleKey(keyStroke); currentPanel.handleKey(keyStroke);
} }
} }

View File

@ -267,7 +267,8 @@ private class HelpLink(
} }
} }
private object ShortcutConflictsSettings : DumbAwareAction(MessageHelper.message("action.settings.text"))/*, LightEditCompatible*/ { private object ShortcutConflictsSettings :
DumbAwareAction(MessageHelper.message("action.settings.text"))/*, LightEditCompatible*/ {
override fun actionPerformed(e: AnActionEvent) { override fun actionPerformed(e: AnActionEvent) {
ShowSettingsUtil.getInstance().showSettingsDialog(e.project, VimEmulationConfigurable::class.java) ShowSettingsUtil.getInstance().showSettingsDialog(e.project, VimEmulationConfigurable::class.java)
} }

View File

@ -120,7 +120,7 @@ internal class VimEmulationConfigurable : Configurable {
} }
} }
return rowsToChange; return rowsToChange
} }
fun addHelpLine(model: VimShortcutConflictsTable.Model) { fun addHelpLine(model: VimShortcutConflictsTable.Model) {

View File

@ -34,7 +34,7 @@ public class ExDocument extends PlainDocument {
void toggleInsertReplace() { void toggleInsertReplace() {
VimCommandLine commandLine = injector.getCommandLine().getActiveCommandLine(); VimCommandLine commandLine = injector.getCommandLine().getActiveCommandLine();
if (commandLine != null) { if (commandLine != null) {
((ExEntryPanel) commandLine).isReplaceMode = !((ExEntryPanel)commandLine).isReplaceMode; ((ExEntryPanel)commandLine).isReplaceMode = !((ExEntryPanel)commandLine).isReplaceMode;
} }
overwrite = !overwrite; overwrite = !overwrite;
} }

View File

@ -49,7 +49,9 @@ internal object ExEditorKit : DefaultEditorKit() {
val c = key.keyChar val c = key.keyChar
if (c.code > 0) { if (c.code > 0) {
if (target.useHandleKeyFromEx) { if (target.useHandleKeyFromEx) {
val panel = ((injector.commandLine.getActiveCommandLine() as? ExEntryPanel) ?: (injector.modalInput.getCurrentModalInput() as? WrappedAsModalInputExEntryPanel)?.exEntryPanel) ?: return val panel = ((injector.commandLine.getActiveCommandLine() as? ExEntryPanel)
?: (injector.modalInput.getCurrentModalInput() as? WrappedAsModalInputExEntryPanel)?.exEntryPanel)
?: return
val entry = panel.entry val entry = panel.entry
val editor = entry.editor val editor = entry.editor
val keyHandler = KeyHandler.getInstance() val keyHandler = KeyHandler.getInstance()

View File

@ -88,11 +88,8 @@ public class ExEntryPanel extends JPanel implements VimCommandLine {
add(entry); add(entry);
// This does not need to be unregistered, it's registered as a custom UI property on this // This does not need to be unregistered, it's registered as a custom UI property on this
EventFacade.getInstance().registerCustomShortcutSet( EventFacade.getInstance().registerCustomShortcutSet(VimShortcutKeyAction.getInstance(), toShortcutSet(
VimShortcutKeyAction.getInstance(), ((VimKeyGroupBase)injector.getKeyGroup()).getRequiredShortcutKeys()), entry);
toShortcutSet(((VimKeyGroupBase) injector.getKeyGroup()).getRequiredShortcutKeys()),
entry
);
new ExShortcutKeyAction(this).registerCustomShortcutSet(); new ExShortcutKeyAction(this).registerCustomShortcutSet();
updateUI(); updateUI();
@ -148,7 +145,8 @@ public class ExEntryPanel extends JPanel implements VimCommandLine {
public void setEditor(@Nullable Editor editor) { public void setEditor(@Nullable Editor editor) {
if (editor == null) { if (editor == null) {
weakEditor = null; weakEditor = null;
} else { }
else {
weakEditor = new WeakReference<>(editor); weakEditor = new WeakReference<>(editor);
} }
} }
@ -331,9 +329,9 @@ public class ExEntryPanel extends JPanel implements VimCommandLine {
searchText = argument.substring(1); searchText = argument.substring(1);
} }
if (!searchText.isEmpty()) { if (!searchText.isEmpty()) {
searchRange = command.getLineRangeSafe(new IjVimEditor(editor)); searchRange = command.getLineRangeSafe(new IjVimEditor(editor));
} }
if (searchText.isEmpty() || searchRange == null) { if (searchText.isEmpty() || searchRange == null) {
// Reset back to the original search highlights after deleting a search from a substitution command.Or if // Reset back to the original search highlights after deleting a search from a substitution command.Or if
// there is no search range (because the user entered an invalid range, e.g. mark not set). // there is no search range (because the user entered an invalid range, e.g. mark not set).
// E.g. Highlight `whatever`, type `:%s/foo` + highlight `foo`, delete back to `:%s/` and reset highlights // E.g. Highlight `whatever`, type `:%s/foo` + highlight `foo`, delete back to `:%s/` and reset highlights
@ -385,7 +383,7 @@ public class ExEntryPanel extends JPanel implements VimCommandLine {
return exCommand; return exCommand;
} }
} }
catch(Exception e) { catch (Exception e) {
logger.warn("Cannot parse command for incsearch", e); logger.warn("Cannot parse command for incsearch", e);
} }
@ -533,7 +531,7 @@ public class ExEntryPanel extends JPanel implements VimCommandLine {
@Override @Override
public @NotNull VimCommandLineCaret getCaret() { public @NotNull VimCommandLineCaret getCaret() {
return (VimCommandLineCaret) entry.getCaret(); return (VimCommandLineCaret)entry.getCaret();
} }
@Override @Override

View File

@ -72,17 +72,20 @@ class ExEntryPanelService : VimCommandLineServiceBase(), VimModalInputService {
commandLine.deactivate(refocusOwningEditor = true, resetCaret = true) commandLine.deactivate(refocusOwningEditor = true, resetCaret = true)
false false
} }
key.keyCode == KeyEvent.VK_ENTER -> { key.keyCode == KeyEvent.VK_ENTER -> {
text = commandLine.actualText text = commandLine.actualText
commandLine.deactivate(refocusOwningEditor = true, resetCaret = true) commandLine.deactivate(refocusOwningEditor = true, resetCaret = true)
false false
} }
finishOn != null && key.keyChar == finishOn -> { finishOn != null && key.keyChar == finishOn -> {
commandLine.handleKey(key) commandLine.handleKey(key)
text = commandLine.actualText text = commandLine.actualText
commandLine.deactivate(refocusOwningEditor = true, resetCaret = true) commandLine.deactivate(refocusOwningEditor = true, resetCaret = true)
false false
} }
else -> { else -> {
commandLine.handleKey(key) commandLine.handleKey(key)
true true
@ -126,7 +129,12 @@ class ExEntryPanelService : VimCommandLineServiceBase(), VimModalInputService {
panel.activate(editor.ij, context.ij, prompt, "") panel.activate(editor.ij, context.ij, prompt, "")
} }
override fun createPanel(editor: VimEditor, context: ExecutionContext, label: String, initText: String): VimCommandLine { override fun createPanel(
editor: VimEditor,
context: ExecutionContext,
label: String,
initText: String,
): VimCommandLine {
val panel = ExEntryPanel.getInstance() val panel = ExEntryPanel.getInstance()
panel.activate(editor.ij, context.ij, label, initText) panel.activate(editor.ij, context.ij, label, initText)
return panel return panel
@ -137,10 +145,16 @@ class ExEntryPanelService : VimCommandLineServiceBase(), VimModalInputService {
} }
override fun getCurrentModalInput(): VimModalInput? { override fun getCurrentModalInput(): VimModalInput? {
return ExEntryPanel.getInstanceWithoutShortcuts()?.takeIf { it.isActive && it.inputInterceptor != null }?.let { WrappedAsModalInputExEntryPanel(it) } return ExEntryPanel.getInstanceWithoutShortcuts()?.takeIf { it.isActive && it.inputInterceptor != null }
?.let { WrappedAsModalInputExEntryPanel(it) }
} }
override fun create(editor: VimEditor, context: ExecutionContext, label: String, inputInterceptor: VimInputInterceptor<*>): VimModalInput { override fun create(
editor: VimEditor,
context: ExecutionContext,
label: String,
inputInterceptor: VimInputInterceptor<*>,
): VimModalInput {
val panel = ExEntryPanel.getInstanceWithoutShortcuts() val panel = ExEntryPanel.getInstanceWithoutShortcuts()
panel.inputInterceptor = inputInterceptor panel.inputInterceptor = inputInterceptor
panel.activate(editor.ij, context.ij, label, "") panel.activate(editor.ij, context.ij, label, "")
@ -151,7 +165,9 @@ class ExEntryPanelService : VimCommandLineServiceBase(), VimModalInputService {
internal class WrappedAsModalInputExEntryPanel(internal val exEntryPanel: ExEntryPanel) : VimModalInputBase() { internal class WrappedAsModalInputExEntryPanel(internal val exEntryPanel: ExEntryPanel) : VimModalInputBase() {
override var inputInterceptor: VimInputInterceptor<*> override var inputInterceptor: VimInputInterceptor<*>
get() = exEntryPanel.inputInterceptor!! get() = exEntryPanel.inputInterceptor!!
set(value) { exEntryPanel.inputInterceptor = value } set(value) {
exEntryPanel.inputInterceptor = value
}
override val caret: VimCommandLineCaret = exEntryPanel.caret override val caret: VimCommandLineCaret = exEntryPanel.caret
override val label: String = exEntryPanel.label override val label: String = exEntryPanel.label

View File

@ -60,41 +60,41 @@ internal class ExShortcutKeyAction(private val exEntryPanel: ExEntryPanel) : Dum
fun registerCustomShortcutSet() { fun registerCustomShortcutSet() {
val shortcuts = listOf( val shortcuts = listOf(
KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0),
KeyStroke.getKeyStroke(KeyEvent.VK_OPEN_BRACKET, KeyEvent.CTRL_DOWN_MASK), KeyStroke.getKeyStroke(KeyEvent.VK_OPEN_BRACKET, KeyEvent.CTRL_DOWN_MASK),
KeyStroke.getKeyStroke(KeyEvent.VK_C, KeyEvent.CTRL_DOWN_MASK), KeyStroke.getKeyStroke(KeyEvent.VK_C, KeyEvent.CTRL_DOWN_MASK),
KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0),
KeyStroke.getKeyStroke(KeyEvent.VK_J, KeyEvent.CTRL_DOWN_MASK), KeyStroke.getKeyStroke(KeyEvent.VK_J, KeyEvent.CTRL_DOWN_MASK),
KeyStroke.getKeyStroke(KeyEvent.VK_M, KeyEvent.CTRL_DOWN_MASK), KeyStroke.getKeyStroke(KeyEvent.VK_M, KeyEvent.CTRL_DOWN_MASK),
KeyStroke.getKeyStroke(KeyEvent.VK_B, KeyEvent.CTRL_DOWN_MASK), KeyStroke.getKeyStroke(KeyEvent.VK_B, KeyEvent.CTRL_DOWN_MASK),
KeyStroke.getKeyStroke(KeyEvent.VK_HOME, 0), KeyStroke.getKeyStroke(KeyEvent.VK_HOME, 0),
KeyStroke.getKeyStroke(KeyEvent.VK_E, KeyEvent.CTRL_DOWN_MASK), KeyStroke.getKeyStroke(KeyEvent.VK_E, KeyEvent.CTRL_DOWN_MASK),
KeyStroke.getKeyStroke(KeyEvent.VK_END, 0), KeyStroke.getKeyStroke(KeyEvent.VK_END, 0),
KeyStroke.getKeyStroke(KeyEvent.VK_BACK_SPACE, 0), KeyStroke.getKeyStroke(KeyEvent.VK_BACK_SPACE, 0),
KeyStroke.getKeyStroke(KeyEvent.VK_H, KeyEvent.CTRL_DOWN_MASK), KeyStroke.getKeyStroke(KeyEvent.VK_H, KeyEvent.CTRL_DOWN_MASK),
KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, 0), KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, 0),
KeyStroke.getKeyStroke(KeyEvent.VK_W, KeyEvent.CTRL_DOWN_MASK), KeyStroke.getKeyStroke(KeyEvent.VK_W, KeyEvent.CTRL_DOWN_MASK),
KeyStroke.getKeyStroke(KeyEvent.VK_U, KeyEvent.CTRL_DOWN_MASK), KeyStroke.getKeyStroke(KeyEvent.VK_U, KeyEvent.CTRL_DOWN_MASK),
KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0), KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0),
KeyStroke.getKeyStroke(KeyEvent.VK_UP, KeyEvent.SHIFT_DOWN_MASK), KeyStroke.getKeyStroke(KeyEvent.VK_UP, KeyEvent.SHIFT_DOWN_MASK),
KeyStroke.getKeyStroke(KeyEvent.VK_PAGE_UP, 0), KeyStroke.getKeyStroke(KeyEvent.VK_PAGE_UP, 0),
KeyStroke.getKeyStroke(KeyEvent.VK_P, KeyEvent.CTRL_DOWN_MASK), KeyStroke.getKeyStroke(KeyEvent.VK_P, KeyEvent.CTRL_DOWN_MASK),
KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0), KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0),
KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, KeyEvent.SHIFT_DOWN_MASK), KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, KeyEvent.SHIFT_DOWN_MASK),
KeyStroke.getKeyStroke(KeyEvent.VK_PAGE_DOWN, 0), KeyStroke.getKeyStroke(KeyEvent.VK_PAGE_DOWN, 0),
KeyStroke.getKeyStroke(KeyEvent.VK_N, KeyEvent.CTRL_DOWN_MASK), KeyStroke.getKeyStroke(KeyEvent.VK_N, KeyEvent.CTRL_DOWN_MASK),
KeyStroke.getKeyStroke(KeyEvent.VK_INSERT, 0), KeyStroke.getKeyStroke(KeyEvent.VK_INSERT, 0),
KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0), KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0),
KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, KeyEvent.SHIFT_DOWN_MASK), KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, KeyEvent.SHIFT_DOWN_MASK),
KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, KeyEvent.CTRL_DOWN_MASK), KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, KeyEvent.CTRL_DOWN_MASK),
KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0), KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0),
KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, KeyEvent.SHIFT_DOWN_MASK), KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, KeyEvent.SHIFT_DOWN_MASK),
KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, KeyEvent.CTRL_DOWN_MASK), KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, KeyEvent.CTRL_DOWN_MASK),
KeyStroke.getKeyStroke(KeyEvent.VK_K, KeyEvent.CTRL_DOWN_MASK), KeyStroke.getKeyStroke(KeyEvent.VK_K, KeyEvent.CTRL_DOWN_MASK),
KeyStroke.getKeyStroke(KeyEvent.VK_V, KeyEvent.CTRL_DOWN_MASK), KeyStroke.getKeyStroke(KeyEvent.VK_V, KeyEvent.CTRL_DOWN_MASK),
KeyStroke.getKeyStroke(KeyEvent.VK_Q, KeyEvent.CTRL_DOWN_MASK), KeyStroke.getKeyStroke(KeyEvent.VK_Q, KeyEvent.CTRL_DOWN_MASK),
KeyStroke.getKeyStroke(KeyEvent.VK_V, KeyEvent.META_DOWN_MASK), KeyStroke.getKeyStroke(KeyEvent.VK_V, KeyEvent.META_DOWN_MASK),
KeyStroke.getKeyStroke(KeyEvent.VK_INSERT, KeyEvent.SHIFT_DOWN_MASK), KeyStroke.getKeyStroke(KeyEvent.VK_INSERT, KeyEvent.SHIFT_DOWN_MASK),
) )
.map { KeyboardShortcut(it, null) } .map { KeyboardShortcut(it, null) }
.toTypedArray() .toTypedArray()

View File

@ -239,14 +239,16 @@ public class ExTextField extends JTextField {
// This gets called for ALL events, before the IDE starts to process key events for the action system. We can add a // This gets called for ALL events, before the IDE starts to process key events for the action system. We can add a
// dispatcher that checks that the plugin is enabled, checks that the component with the focus is ExTextField, // dispatcher that checks that the plugin is enabled, checks that the component with the focus is ExTextField,
// dispatch to ExEntryPanel#handleKey and if it's processed, mark the event as consumed. // dispatch to ExEntryPanel#handleKey and if it's processed, mark the event as consumed.
KeyEvent event = new KeyEvent(this, keyChar != KeyEvent.CHAR_UNDEFINED ? KeyEvent.KEY_TYPED : KeyEvent event = new KeyEvent(this, keyChar != KeyEvent.CHAR_UNDEFINED
(stroke.isOnKeyRelease() ? KeyEvent.KEY_RELEASED : KeyEvent.KEY_PRESSED), ? KeyEvent.KEY_TYPED
: (stroke.isOnKeyRelease() ? KeyEvent.KEY_RELEASED : KeyEvent.KEY_PRESSED),
(new Date()).getTime(), modifiers, keyCode, c); (new Date()).getTime(), modifiers, keyCode, c);
useHandleKeyFromEx = false; useHandleKeyFromEx = false;
try { try {
super.processKeyEvent(event); super.processKeyEvent(event);
} finally { }
finally {
useHandleKeyFromEx = true; useHandleKeyFromEx = true;
} }
} }
@ -311,7 +313,8 @@ public class ExTextField extends JTextField {
} }
private void resetCaret() { private void resetCaret() {
if (getCaretPosition() == super.getText().length() || currentActionPromptCharacterOffset == super.getText().length() - 1) { if (getCaretPosition() == super.getText().length() ||
currentActionPromptCharacterOffset == super.getText().length() - 1) {
setNormalModeCaret(); setNormalModeCaret();
} }
else { else {
@ -388,7 +391,7 @@ public class ExTextField extends JTextField {
if (!isVisible()) return; if (!isVisible()) return;
// Take a copy of the graphics, so we can mess around with it without having to reset after // Take a copy of the graphics, so we can mess around with it without having to reset after
final Graphics2D g2d = (Graphics2D) g.create(); final Graphics2D g2d = (Graphics2D)g.create();
try { try {
final JTextComponent component = getComponent(); final JTextComponent component = getComponent();
@ -414,10 +417,12 @@ public class ExTextField extends JTextField {
// when the caret has not yet been moved or changed // when the caret has not yet been moved or changed
final FontMetrics fm = component.getFontMetrics(component.getFont()); final FontMetrics fm = component.getFontMetrics(component.getFont());
if (!hasFocus) { if (!hasFocus) {
final float outlineThickness = (float) PaintUtil.alignToInt(1.0, g2d); final float outlineThickness = (float)PaintUtil.alignToInt(1.0, g2d);
final double caretWidth = getCaretWidth(fm, r.getX(), 100); final double caretWidth = getCaretWidth(fm, r.getX(), 100);
final Area area = new Area(new Rectangle2D.Double(r.getX(), r.getY(), caretWidth, r.getHeight())); final Area area = new Area(new Rectangle2D.Double(r.getX(), r.getY(), caretWidth, r.getHeight()));
area.subtract(new Area(new Rectangle2D.Double(r.getX() + outlineThickness, r.getY() + outlineThickness, caretWidth - (2 * outlineThickness), r.getHeight() - (2 * outlineThickness)))); area.subtract(new Area(new Rectangle2D.Double(r.getX() + outlineThickness, r.getY() + outlineThickness,
caretWidth - (2 * outlineThickness),
r.getHeight() - (2 * outlineThickness))));
g2d.fill(area); g2d.fill(area);
} }
else { else {
@ -516,7 +521,7 @@ public class ExTextField extends JTextField {
@TestOnly @TestOnly
public @NonNls String getCaretShape() { public @NonNls String getCaretShape() {
CommandLineCaret caret = (CommandLineCaret) getCaret(); CommandLineCaret caret = (CommandLineCaret)getCaret();
return String.format("%s %d", caret.mode, caret.thickness); return String.format("%s %d", caret.mode, caret.thickness);
} }

View File

@ -121,26 +121,26 @@ class ModeWidgetPopup : AnAction() {
return ModeColors( return ModeColors(
"widget_mode_is_full_customization$keyPostfix", "widget_mode_is_full_customization$keyPostfix",
"widget_mode_theme$keyPostfix", "widget_mode_theme$keyPostfix",
"widget_mode_normal_background$keyPostfix", "widget_mode_normal_background$keyPostfix",
"widget_mode_normal_foreground$keyPostfix", "widget_mode_normal_foreground$keyPostfix",
"widget_mode_insert_background$keyPostfix", "widget_mode_insert_background$keyPostfix",
"widget_mode_insert_foreground$keyPostfix", "widget_mode_insert_foreground$keyPostfix",
"widget_mode_replace_background$keyPostfix", "widget_mode_replace_background$keyPostfix",
"widget_mode_replace_foreground$keyPostfix", "widget_mode_replace_foreground$keyPostfix",
"widget_mode_command_background$keyPostfix", "widget_mode_command_background$keyPostfix",
"widget_mode_command_foreground$keyPostfix", "widget_mode_command_foreground$keyPostfix",
"widget_mode_visual_background$keyPostfix", "widget_mode_visual_background$keyPostfix",
"widget_mode_visual_foreground$keyPostfix", "widget_mode_visual_foreground$keyPostfix",
"widget_mode_visual_line_background$keyPostfix", "widget_mode_visual_line_background$keyPostfix",
"widget_mode_visual_line_foreground$keyPostfix", "widget_mode_visual_line_foreground$keyPostfix",
"widget_mode_visual_block_background$keyPostfix", "widget_mode_visual_block_background$keyPostfix",
"widget_mode_visual_block_foreground$keyPostfix", "widget_mode_visual_block_foreground$keyPostfix",
"widget_mode_select_background$keyPostfix", "widget_mode_select_background$keyPostfix",
"widget_mode_select_foreground$keyPostfix", "widget_mode_select_foreground$keyPostfix",
"widget_mode_select_line_background$keyPostfix", "widget_mode_select_line_background$keyPostfix",
"widget_mode_select_line_foreground$keyPostfix", "widget_mode_select_line_foreground$keyPostfix",
"widget_mode_select_block_background$keyPostfix", "widget_mode_select_block_background$keyPostfix",
"widget_mode_select_block_foreground$keyPostfix", "widget_mode_select_block_foreground$keyPostfix",
) )
} }
@ -148,14 +148,20 @@ class ModeWidgetPopup : AnAction() {
val panel = panel { val panel = panel {
lateinit var advancedSettings: Cell<JBCheckBox> lateinit var advancedSettings: Cell<JBCheckBox>
row { row {
advancedSettings = checkBox(MessageHelper.getMessage("widget.mode.popup.field.advanced.settings")).bindSelected(modeColors::isFullCustomization) advancedSettings =
checkBox(MessageHelper.getMessage("widget.mode.popup.field.advanced.settings")).bindSelected(modeColors::isFullCustomization)
} }
group { group {
row { row {
label(MessageHelper.getMessage("widget.mode.popup.field.theme")) label(MessageHelper.getMessage("widget.mode.popup.field.theme"))
comboBox(ModeWidgetTheme.entries).bindItem(modeColors::theme.toNullableProperty()) comboBox(ModeWidgetTheme.entries).bindItem(modeColors::theme.toNullableProperty())
} }
row { browserLink("Suggest your theme", "https://youtrack.jetbrains.com/issue/VIM-1377/Normal-mode-needs-to-be-more-obvious") } row {
browserLink(
"Suggest your theme",
"https://youtrack.jetbrains.com/issue/VIM-1377/Normal-mode-needs-to-be-more-obvious"
)
}
}.topGap(TopGap.NONE).visibleIf(!advancedSettings.selected) }.topGap(TopGap.NONE).visibleIf(!advancedSettings.selected)
group(MessageHelper.getMessage("widget.mode.popup.group.title.full.customization")) { group(MessageHelper.getMessage("widget.mode.popup.group.title.full.customization")) {
row { text(MessageHelper.getMessage("widget.mode.popup.color.instruction")) } row { text(MessageHelper.getMessage("widget.mode.popup.color.instruction")) }
@ -279,7 +285,8 @@ class ModeWidgetPopup : AnAction() {
} }
private fun JComponent.addScrollPane(): JComponent { private fun JComponent.addScrollPane(): JComponent {
val scrollPane = JBScrollPane(this, JBScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JBScrollPane.HORIZONTAL_SCROLLBAR_NEVER) val scrollPane =
JBScrollPane(this, JBScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JBScrollPane.HORIZONTAL_SCROLLBAR_NEVER)
scrollPane.border = BorderFactory.createEmptyBorder() scrollPane.border = BorderFactory.createEmptyBorder()
return scrollPane return scrollPane
} }
@ -317,7 +324,7 @@ class ModeWidgetPopup : AnAction() {
var selectBlockBg: String by VimScopeStringVariable(selectBlockBgKey) var selectBlockBg: String by VimScopeStringVariable(selectBlockBgKey)
var selectBlockFg: String by VimScopeStringVariable(selectBlockFgKey) var selectBlockFg: String by VimScopeStringVariable(selectBlockFgKey)
private class VimScopeBooleanVariable(private var key: String): ReadWriteProperty<ModeColors, Boolean> { private class VimScopeBooleanVariable(private var key: String) : ReadWriteProperty<ModeColors, Boolean> {
override fun getValue(thisRef: ModeColors, property: KProperty<*>): Boolean { override fun getValue(thisRef: ModeColors, property: KProperty<*>): Boolean {
return injector.variableService.getVimVariable(key)?.asBoolean() ?: false return injector.variableService.getVimVariable(key)?.asBoolean() ?: false
} }
@ -327,7 +334,7 @@ class ModeWidgetPopup : AnAction() {
} }
} }
private class VimScopeStringVariable(private var key: String): ReadWriteProperty<ModeColors, String> { private class VimScopeStringVariable(private var key: String) : ReadWriteProperty<ModeColors, String> {
override fun getValue(thisRef: ModeColors, property: KProperty<*>): String { override fun getValue(thisRef: ModeColors, property: KProperty<*>): String {
return injector.variableService.getVimVariable(key)?.asString() ?: "" return injector.variableService.getVimVariable(key)?.asString() ?: ""
} }
@ -337,9 +344,10 @@ class ModeWidgetPopup : AnAction() {
} }
} }
private class VimScopeThemeVariable(private var key: String): ReadWriteProperty<ModeColors, ModeWidgetTheme> { private class VimScopeThemeVariable(private var key: String) : ReadWriteProperty<ModeColors, ModeWidgetTheme> {
override fun getValue(thisRef: ModeColors, property: KProperty<*>): ModeWidgetTheme { override fun getValue(thisRef: ModeColors, property: KProperty<*>): ModeWidgetTheme {
val themeString = injector.variableService.getVimVariable(key)?.asString() ?: return ModeWidgetTheme.getDefaultTheme() val themeString =
injector.variableService.getVimVariable(key)?.asString() ?: return ModeWidgetTheme.getDefaultTheme()
return ModeWidgetTheme.parseString(themeString) ?: ModeWidgetTheme.getDefaultTheme() return ModeWidgetTheme.parseString(themeString) ?: ModeWidgetTheme.getDefaultTheme()
} }

View File

@ -31,6 +31,7 @@ fun getModeBackground(mode: Mode?): Color {
is Mode.OP_PENDING, null -> UIUtil.getPanelBackground() is Mode.OP_PENDING, null -> UIUtil.getPanelBackground()
} }
} }
ModeWidgetTheme.DRACULA -> { ModeWidgetTheme.DRACULA -> {
return when (mode) { return when (mode) {
Mode.INSERT -> Color.decode("#50FA7B") Mode.INSERT -> Color.decode("#50FA7B")
@ -41,6 +42,7 @@ fun getModeBackground(mode: Mode?): Color {
is Mode.OP_PENDING, null -> UIUtil.getPanelBackground() is Mode.OP_PENDING, null -> UIUtil.getPanelBackground()
} }
} }
ModeWidgetTheme.COLORLESS -> { ModeWidgetTheme.COLORLESS -> {
return UIUtil.getPanelBackground() return UIUtil.getPanelBackground()
} }
@ -55,18 +57,26 @@ fun getModeBackground(mode: Mode?): Color {
val visualModeBackground = injector.variableService.getVimVariable("widget_mode_visual_background$keyPostfix") val visualModeBackground = injector.variableService.getVimVariable("widget_mode_visual_background$keyPostfix")
when (mode.selectionType) { when (mode.selectionType) {
SelectionType.CHARACTER_WISE -> visualModeBackground SelectionType.CHARACTER_WISE -> visualModeBackground
SelectionType.LINE_WISE -> injector.variableService.getVimVariable("widget_mode_visual_line_background$keyPostfix") ?: visualModeBackground SelectionType.LINE_WISE -> injector.variableService.getVimVariable("widget_mode_visual_line_background$keyPostfix")
SelectionType.BLOCK_WISE -> injector.variableService.getVimVariable("widget_mode_visual_block_background$keyPostfix") ?: visualModeBackground ?: visualModeBackground
SelectionType.BLOCK_WISE -> injector.variableService.getVimVariable("widget_mode_visual_block_background$keyPostfix")
?: visualModeBackground
} }
} }
is Mode.SELECT -> { is Mode.SELECT -> {
val selectModeBackground = injector.variableService.getVimVariable("widget_mode_select_background$keyPostfix") val selectModeBackground = injector.variableService.getVimVariable("widget_mode_select_background$keyPostfix")
when (mode.selectionType) { when (mode.selectionType) {
SelectionType.CHARACTER_WISE -> selectModeBackground SelectionType.CHARACTER_WISE -> selectModeBackground
SelectionType.LINE_WISE -> injector.variableService.getVimVariable("widget_mode_select_line_background$keyPostfix") ?: selectModeBackground SelectionType.LINE_WISE -> injector.variableService.getVimVariable("widget_mode_select_line_background$keyPostfix")
SelectionType.BLOCK_WISE -> injector.variableService.getVimVariable("widget_mode_select_block_background$keyPostfix") ?: selectModeBackground ?: selectModeBackground
SelectionType.BLOCK_WISE -> injector.variableService.getVimVariable("widget_mode_select_block_background$keyPostfix")
?: selectModeBackground
} }
} }
is Mode.OP_PENDING, null -> null is Mode.OP_PENDING, null -> null
}?.asString() }?.asString()
val defaultColor = UIUtil.getPanelBackground() val defaultColor = UIUtil.getPanelBackground()
@ -77,7 +87,11 @@ fun getModeBackground(mode: Mode?): Color {
if (colorString == null) { if (colorString == null) {
defaultColor defaultColor
} else { } else {
try { Color.decode(colorString) } catch (e: Exception) { defaultColor } try {
Color.decode(colorString)
} catch (e: Exception) {
defaultColor
}
} }
} }
} }
@ -106,18 +120,26 @@ fun getModeForeground(mode: Mode?): Color {
val visualModeBackground = injector.variableService.getVimVariable("widget_mode_visual_foreground$keyPostfix") val visualModeBackground = injector.variableService.getVimVariable("widget_mode_visual_foreground$keyPostfix")
when (mode.selectionType) { when (mode.selectionType) {
SelectionType.CHARACTER_WISE -> visualModeBackground SelectionType.CHARACTER_WISE -> visualModeBackground
SelectionType.LINE_WISE -> injector.variableService.getVimVariable("widget_mode_visual_line_foreground$keyPostfix") ?: visualModeBackground SelectionType.LINE_WISE -> injector.variableService.getVimVariable("widget_mode_visual_line_foreground$keyPostfix")
SelectionType.BLOCK_WISE -> injector.variableService.getVimVariable("widget_mode_visual_block_foreground$keyPostfix") ?: visualModeBackground ?: visualModeBackground
SelectionType.BLOCK_WISE -> injector.variableService.getVimVariable("widget_mode_visual_block_foreground$keyPostfix")
?: visualModeBackground
} }
} }
is Mode.SELECT -> { is Mode.SELECT -> {
val selectModeBackground = injector.variableService.getVimVariable("widget_mode_select_foreground$keyPostfix") val selectModeBackground = injector.variableService.getVimVariable("widget_mode_select_foreground$keyPostfix")
when (mode.selectionType) { when (mode.selectionType) {
SelectionType.CHARACTER_WISE -> selectModeBackground SelectionType.CHARACTER_WISE -> selectModeBackground
SelectionType.LINE_WISE -> injector.variableService.getVimVariable("widget_mode_select_line_foreground$keyPostfix") ?: selectModeBackground SelectionType.LINE_WISE -> injector.variableService.getVimVariable("widget_mode_select_line_foreground$keyPostfix")
SelectionType.BLOCK_WISE -> injector.variableService.getVimVariable("widget_mode_select_block_foreground$keyPostfix") ?: selectModeBackground ?: selectModeBackground
SelectionType.BLOCK_WISE -> injector.variableService.getVimVariable("widget_mode_select_block_foreground$keyPostfix")
?: selectModeBackground
} }
} }
is Mode.OP_PENDING, null -> null is Mode.OP_PENDING, null -> null
}?.asString() }?.asString()
val defaultColor = UIUtil.getLabelForeground() val defaultColor = UIUtil.getLabelForeground()
@ -128,7 +150,11 @@ fun getModeForeground(mode: Mode?): Color {
if (colorString == null) { if (colorString == null) {
defaultColor defaultColor
} else { } else {
try { Color.decode(colorString) } catch (e: Exception) { defaultColor } try {
Color.decode(colorString)
} catch (e: Exception) {
defaultColor
}
} }
} }
} }

View File

@ -161,7 +161,7 @@ class VimModeWidget(val project: Project) : CustomStatusBarWidget, VimStatusBarW
return fileEditorManager.selectedTextEditor return fileEditorManager.selectedTextEditor
} }
private class JBLabelWiderThan(private val words: Collection<String>): JBLabel("", CENTER) { private class JBLabelWiderThan(private val words: Collection<String>) : JBLabel("", CENTER) {
private val wordWidth: Int private val wordWidth: Int
get() { get() {
val fontMetrics = getFontMetrics(font) val fontMetrics = getFontMetrics(font)

View File

@ -25,7 +25,7 @@ import com.maddyhome.idea.vim.ui.widgets.mode.ModeWidgetFactory
import com.maddyhome.idea.vim.ui.widgets.mode.VimModeWidget import com.maddyhome.idea.vim.ui.widgets.mode.VimModeWidget
import com.maddyhome.idea.vim.ui.widgets.mode.updateModeWidget import com.maddyhome.idea.vim.ui.widgets.mode.updateModeWidget
internal class ModeWidgetListener: ModeChangeListener, EditorListener, VimWidgetListener({ updateModeWidget()}) { internal class ModeWidgetListener : ModeChangeListener, EditorListener, VimWidgetListener({ updateModeWidget() }) {
override fun modeChanged(editor: VimEditor, oldMode: Mode) { override fun modeChanged(editor: VimEditor, oldMode: Mode) {
val modeWidget = getWidget(editor) ?: return val modeWidget = getWidget(editor) ?: return
val editorMode = editor.mode val editorMode = editor.mode

View File

@ -29,7 +29,11 @@ internal data class ActionListCommand(val range: Range, val modifier: CommandMod
override val argFlags = flags(RangeFlag.RANGE_FORBIDDEN, ArgumentFlag.ARGUMENT_OPTIONAL, Access.READ_ONLY) override val argFlags = flags(RangeFlag.RANGE_FORBIDDEN, ArgumentFlag.ARGUMENT_OPTIONAL, Access.READ_ONLY)
override fun processCommand(editor: VimEditor, context: ExecutionContext, operatorArguments: OperatorArguments): ExecutionResult { override fun processCommand(
editor: VimEditor,
context: ExecutionContext,
operatorArguments: OperatorArguments,
): ExecutionResult {
val lineSeparator = "\n" val lineSeparator = "\n"
val searchPattern = argument.trim().lowercase(Locale.getDefault()).split("*") val searchPattern = argument.trim().lowercase(Locale.getDefault()).split("*")
val actionManager = ActionManager.getInstance() val actionManager = ActionManager.getInstance()

View File

@ -32,7 +32,11 @@ internal data class BufferCommand(val range: Range, val modifier: CommandModifie
override val argFlags = flags(RangeFlag.RANGE_FORBIDDEN, ArgumentFlag.ARGUMENT_OPTIONAL, Access.READ_ONLY) override val argFlags = flags(RangeFlag.RANGE_FORBIDDEN, ArgumentFlag.ARGUMENT_OPTIONAL, Access.READ_ONLY)
override fun processCommand(editor: VimEditor, context: ExecutionContext, operatorArguments: OperatorArguments): ExecutionResult { override fun processCommand(
editor: VimEditor,
context: ExecutionContext,
operatorArguments: OperatorArguments,
): ExecutionResult {
val overrideModified = modifier == CommandModifier.BANG val overrideModified = modifier == CommandModifier.BANG
val buffer = argument.trim() val buffer = argument.trim()
var result = true var result = true
@ -55,6 +59,7 @@ internal data class BufferCommand(val range: Range, val modifier: CommandModifie
VimPlugin.showMessage(MessageHelper.message("no.matching.buffer.for.0", buffer)) VimPlugin.showMessage(MessageHelper.message("no.matching.buffer.for.0", buffer))
result = false result = false
} }
1 -> { 1 -> {
if (EditorHelper.hasUnsavedChanges(editor.ij) && !overrideModified) { if (EditorHelper.hasUnsavedChanges(editor.ij) && !overrideModified) {
VimPlugin.showMessage(MessageHelper.message("no.write.since.last.change.add.to.override")) VimPlugin.showMessage(MessageHelper.message("no.write.since.last.change.add.to.override"))
@ -63,6 +68,7 @@ internal data class BufferCommand(val range: Range, val modifier: CommandModifie
VimPlugin.getFile().openFile(EditorHelper.getVirtualFile(editors[0].ij)!!.name, context) VimPlugin.getFile().openFile(EditorHelper.getVirtualFile(editors[0].ij)!!.name, context)
} }
} }
else -> { else -> {
VimPlugin.showMessage(MessageHelper.message("more.than.one.match.for.0", buffer)) VimPlugin.showMessage(MessageHelper.message("more.than.one.match.for.0", buffer))
result = false result = false

View File

@ -42,7 +42,11 @@ internal data class BufferListCommand(val range: Range, val modifier: CommandMod
val SUPPORTED_FILTERS = setOf('+', '=', 'a', '%', '#') val SUPPORTED_FILTERS = setOf('+', '=', 'a', '%', '#')
} }
override fun processCommand(editor: VimEditor, context: ExecutionContext, operatorArguments: OperatorArguments): ExecutionResult { override fun processCommand(
editor: VimEditor,
context: ExecutionContext,
operatorArguments: OperatorArguments,
): ExecutionResult {
val arg = argument.trim() val arg = argument.trim()
val filter = pruneUnsupportedFilters(arg) val filter = pruneUnsupportedFilters(arg)
val bufferList = getBufferList(context, filter) val bufferList = getBufferList(context, filter)

View File

@ -29,12 +29,16 @@ import com.maddyhome.idea.vim.vimscript.model.ExecutionResult
* see "h :!" * see "h :!"
*/ */
@ExCommand(command = "!") @ExCommand(command = "!")
internal data class CmdFilterCommand(val range: Range, val modifier: CommandModifier, val argument: String) internal data class CmdFilterCommand(val range: Range, val modifier: CommandModifier, val argument: String) :
: Command.SingleExecution(range, modifier) { Command.SingleExecution(range, modifier) {
override val argFlags = flags(RangeFlag.RANGE_OPTIONAL, ArgumentFlag.ARGUMENT_OPTIONAL, Access.SELF_SYNCHRONIZED) override val argFlags = flags(RangeFlag.RANGE_OPTIONAL, ArgumentFlag.ARGUMENT_OPTIONAL, Access.SELF_SYNCHRONIZED)
override fun processCommand(editor: VimEditor, context: ExecutionContext, operatorArguments: OperatorArguments): ExecutionResult { override fun processCommand(
editor: VimEditor,
context: ExecutionContext,
operatorArguments: OperatorArguments,
): ExecutionResult {
logger.debug("execute") logger.debug("execute")
val command = buildString { val command = buildString {
var inBackslash = false var inBackslash = false
@ -48,6 +52,7 @@ internal data class CmdFilterCommand(val range: Range, val modifier: CommandModi
} }
append(last) append(last)
} }
!inBackslash && c == '%' -> { !inBackslash && c == '%' -> {
val virtualFile = EditorHelper.getVirtualFile(editor.ij) val virtualFile = EditorHelper.getVirtualFile(editor.ij)
if (virtualFile == null) { if (virtualFile == null) {
@ -60,6 +65,7 @@ internal data class CmdFilterCommand(val range: Range, val modifier: CommandModi
} }
append(virtualFile.path) append(virtualFile.path)
} }
else -> append(c) else -> append(c)
} }

View File

@ -29,7 +29,11 @@ internal data class HelpCommand(val range: Range, val modifier: CommandModifier,
override val argFlags = flags(RangeFlag.RANGE_OPTIONAL, ArgumentFlag.ARGUMENT_OPTIONAL, Access.READ_ONLY) override val argFlags = flags(RangeFlag.RANGE_OPTIONAL, ArgumentFlag.ARGUMENT_OPTIONAL, Access.READ_ONLY)
override fun processCommand(editor: VimEditor, context: ExecutionContext, operatorArguments: OperatorArguments): ExecutionResult { override fun processCommand(
editor: VimEditor,
context: ExecutionContext,
operatorArguments: OperatorArguments,
): ExecutionResult {
BrowserUtil.browse(helpTopicUrl(argument)) BrowserUtil.browse(helpTopicUrl(argument))
return ExecutionResult.Success return ExecutionResult.Success
} }

View File

@ -14,5 +14,6 @@ import com.maddyhome.idea.vim.vimscript.model.functions.IntellijFunctionProvider
import com.maddyhome.idea.vim.vimscript.model.functions.VimscriptFunctionProvider import com.maddyhome.idea.vim.vimscript.model.functions.VimscriptFunctionProvider
internal class FunctionStorage : VimScriptFunctionServiceBase() { internal class FunctionStorage : VimScriptFunctionServiceBase() {
override val functionProviders: List<VimscriptFunctionProvider> = listOf(EngineFunctionProvider, IntellijFunctionProvider) override val functionProviders: List<VimscriptFunctionProvider> =
listOf(EngineFunctionProvider, IntellijFunctionProvider)
} }

View File

@ -28,9 +28,18 @@ import com.maddyhome.idea.vim.vimscript.model.expressions.Scope
import com.maddyhome.idea.vim.vimscript.model.expressions.Variable import com.maddyhome.idea.vim.vimscript.model.expressions.Variable
import org.jdom.Element import org.jdom.Element
@State(name = "VimVariables", storages = [Storage(value = "\$APP_CONFIG$/vim_settings_local.xml", roamingType = RoamingType.DISABLED)]) @State(
name = "VimVariables",
storages = [Storage(value = "\$APP_CONFIG$/vim_settings_local.xml", roamingType = RoamingType.DISABLED)]
)
internal class IjVariableService : VimVariableServiceBase(), PersistentStateComponent<Element?> { internal class IjVariableService : VimVariableServiceBase(), PersistentStateComponent<Element?> {
override fun storeVariable(variable: Variable, value: VimDataType, editor: VimEditor, context: ExecutionContext, vimContext: VimLContext) { override fun storeVariable(
variable: Variable,
value: VimDataType,
editor: VimEditor,
context: ExecutionContext,
vimContext: VimLContext,
) {
super.storeVariable(variable, value, editor, context, vimContext) super.storeVariable(variable, value, editor, context, vimContext)
val scope = variable.scope ?: getDefaultVariableScope(vimContext) val scope = variable.scope ?: getDefaultVariableScope(vimContext)
@ -92,6 +101,7 @@ internal class IjVariableService : VimVariableServiceBase(), PersistentStateComp
"string" -> { "string" -> {
vimVariables[variableElement.getAttributeValue("key")] = VimString(variableElement.getAttributeValue("value")) vimVariables[variableElement.getAttributeValue("key")] = VimString(variableElement.getAttributeValue("value"))
} }
"int" -> { "int" -> {
vimVariables[variableElement.getAttributeValue("key")] = VimInt(variableElement.getAttributeValue("value")) vimVariables[variableElement.getAttributeValue("key")] = VimInt(variableElement.getAttributeValue("value"))
} }

View File

@ -99,7 +99,8 @@
</aliases> </aliases>
</vimExtension> </vimExtension>
<vimExtension implementation="com.maddyhome.idea.vim.extension.paragraphmotion.ParagraphMotion" name="vim-paragraph-motion"> <vimExtension implementation="com.maddyhome.idea.vim.extension.paragraphmotion.ParagraphMotion"
name="vim-paragraph-motion">
<aliases> <aliases>
<alias name="https://github.com/dbakker/vim-paragraph-motion"/> <alias name="https://github.com/dbakker/vim-paragraph-motion"/>
<alias name="dbakker/vim-paragraph-motion"/> <alias name="dbakker/vim-paragraph-motion"/>

View File

@ -13,5 +13,6 @@
<stop offset="100%" stop-color="#087CFA"/> <stop offset="100%" stop-color="#087CFA"/>
</linearGradient> </linearGradient>
</defs> </defs>
<polygon fill="url(#ideavim_plugin-a)" fill-rule="evenodd" points="28.019 4 15.988 24.119 15.988 4 4 4 4 36 17.953 36 36 4"/> <polygon fill="url(#ideavim_plugin-a)" fill-rule="evenodd"
points="28.019 4 15.988 24.119 15.988 4 4 4 4 36 17.953 36 36 4"/>
</svg> </svg>

Before

(image error) Size: 667 B

After

(image error) Size: 678 B

View File

@ -6,6 +6,7 @@
- https://opensource.org/licenses/MIT. - https://opensource.org/licenses/MIT.
--> -->
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 40 40" fill-opacity="0" stroke="#6E6E6E" stroke-width="3"> <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 40 40" fill-opacity="0" stroke="#6E6E6E"
<path d="M 28.019 4 L 15.988 24.119 L 15.988 4 L 4 4 L 4 36 L 17.953 36 L 36 4z"/> stroke-width="3">
<path d="M 28.019 4 L 15.988 24.119 L 15.988 4 L 4 4 L 4 36 L 17.953 36 L 36 4z"/>
</svg> </svg>

Before

(image error) Size: 446 B

After

(image error) Size: 449 B

View File

@ -8,5 +8,6 @@
--> -->
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 26 26" width="16" height="16" fill="#000000"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 26 26" width="16" height="16" fill="#000000">
<path fill="#1DA1F2" d="M 25.855469 5.574219 C 24.914063 5.992188 23.902344 6.273438 22.839844 6.402344 C 23.921875 5.75 24.757813 4.722656 25.148438 3.496094 C 24.132813 4.097656 23.007813 4.535156 21.8125 4.769531 C 20.855469 3.75 19.492188 3.113281 17.980469 3.113281 C 15.082031 3.113281 12.730469 5.464844 12.730469 8.363281 C 12.730469 8.773438 12.777344 9.175781 12.867188 9.558594 C 8.503906 9.339844 4.636719 7.246094 2.046875 4.070313 C 1.59375 4.847656 1.335938 5.75 1.335938 6.714844 C 1.335938 8.535156 2.261719 10.140625 3.671875 11.082031 C 2.808594 11.054688 2 10.820313 1.292969 10.425781 C 1.292969 10.449219 1.292969 10.46875 1.292969 10.492188 C 1.292969 13.035156 3.101563 15.15625 5.503906 15.640625 C 5.0625 15.761719 4.601563 15.824219 4.121094 15.824219 C 3.78125 15.824219 3.453125 15.792969 3.132813 15.730469 C 3.800781 17.8125 5.738281 19.335938 8.035156 19.375 C 6.242188 20.785156 3.976563 21.621094 1.515625 21.621094 C 1.089844 21.621094 0.675781 21.597656 0.265625 21.550781 C 2.585938 23.039063 5.347656 23.90625 8.3125 23.90625 C 17.96875 23.90625 23.25 15.90625 23.25 8.972656 C 23.25 8.742188 23.246094 8.515625 23.234375 8.289063 C 24.261719 7.554688 25.152344 6.628906 25.855469 5.574219"/> <path fill="#1DA1F2"
d="M 25.855469 5.574219 C 24.914063 5.992188 23.902344 6.273438 22.839844 6.402344 C 23.921875 5.75 24.757813 4.722656 25.148438 3.496094 C 24.132813 4.097656 23.007813 4.535156 21.8125 4.769531 C 20.855469 3.75 19.492188 3.113281 17.980469 3.113281 C 15.082031 3.113281 12.730469 5.464844 12.730469 8.363281 C 12.730469 8.773438 12.777344 9.175781 12.867188 9.558594 C 8.503906 9.339844 4.636719 7.246094 2.046875 4.070313 C 1.59375 4.847656 1.335938 5.75 1.335938 6.714844 C 1.335938 8.535156 2.261719 10.140625 3.671875 11.082031 C 2.808594 11.054688 2 10.820313 1.292969 10.425781 C 1.292969 10.449219 1.292969 10.46875 1.292969 10.492188 C 1.292969 13.035156 3.101563 15.15625 5.503906 15.640625 C 5.0625 15.761719 4.601563 15.824219 4.121094 15.824219 C 3.78125 15.824219 3.453125 15.792969 3.132813 15.730469 C 3.800781 17.8125 5.738281 19.335938 8.035156 19.375 C 6.242188 20.785156 3.976563 21.621094 1.515625 21.621094 C 1.089844 21.621094 0.675781 21.597656 0.265625 21.550781 C 2.585938 23.039063 5.347656 23.90625 8.3125 23.90625 C 17.96875 23.90625 23.25 15.90625 23.25 8.972656 C 23.25 8.742188 23.246094 8.515625 23.234375 8.289063 C 24.261719 7.554688 25.152344 6.628906 25.855469 5.574219"/>
</svg> </svg>

Before

(image error) Size: 1.6 KiB

After

(image error) Size: 1.6 KiB

View File

@ -265,7 +265,7 @@ class CopyActionTest : VimTestCase() {
@TestFor(issues = ["VIM-792"]) @TestFor(issues = ["VIM-792"])
fun testLineWiseClipboardYankPaste() { fun testLineWiseClipboardYankPaste() {
configureByText("<caret>foo\n") configureByText("<caret>foo\n")
typeText("\"*yy" + "\"*p") typeText("\"*yy" + "\"*p")
val vimEditor = fixture.editor.vim val vimEditor = fixture.editor.vim
val context = injector.executionContextManager.getEditorExecutionContext(vimEditor) val context = injector.executionContextManager.getEditorExecutionContext(vimEditor)
val registerService = injector.registerGroup val registerService = injector.registerGroup

View File

@ -159,14 +159,16 @@ class MacroActionTest : VimTestCase() {
) )
assertRegister('b', "6@a") assertRegister('b', "6@a")
assertState(""" assertState(
"""
Lorem Ipsum Lorem Ipsum
Lorem ipsum dolor ${c}sit amet, Lorem ipsum dolor ${c}sit amet,
consectetur adipiscing elit consectetur adipiscing elit
Sed in orci mauris. Sed in orci mauris.
Cras id tellus in ex imperdiet egestas. Cras id tellus in ex imperdiet egestas.
""".trimIndent()) """.trimIndent()
)
} }
@Test @Test
@ -191,14 +193,16 @@ class MacroActionTest : VimTestCase() {
assertRegister('b', "3@a") assertRegister('b', "3@a")
assertRegister('c', "2@b") assertRegister('c', "2@b")
assertState(""" assertState(
"""
Lorem Ipsum Lorem Ipsum
Lorem ipsum dolor ${c}sit amet, Lorem ipsum dolor ${c}sit amet,
consectetur adipiscing elit consectetur adipiscing elit
Sed in orci mauris. Sed in orci mauris.
Cras id tellus in ex imperdiet egestas. Cras id tellus in ex imperdiet egestas.
""".trimIndent()) """.trimIndent()
)
} }
@Test @Test

View File

@ -45,7 +45,10 @@ class MacroWithEditingTest : VimTestCase() {
typeTextInFile(injector.parser.parseKeys("^v\$h\"wy"), "\u0001") typeTextInFile(injector.parser.parseKeys("^v\$h\"wy"), "\u0001")
val vimEditor = fixture.editor.vim val vimEditor = fixture.editor.vim
val context = injector.executionContextManager.getEditorExecutionContext(vimEditor) val context = injector.executionContextManager.getEditorExecutionContext(vimEditor)
kotlin.test.assertEquals(injector.parser.parseKeys("<C-A>"), injector.registerGroup.getRegister(vimEditor, context, 'w')!!.keys) kotlin.test.assertEquals(
injector.parser.parseKeys("<C-A>"),
injector.registerGroup.getRegister(vimEditor, context, 'w')!!.keys
)
setText("1") setText("1")
typeText(injector.parser.parseKeys("@w")) typeText(injector.parser.parseKeys("@w"))
waitAndAssert { waitAndAssert {

View File

@ -614,7 +614,7 @@ class MotionActionTest : VimTestCase() {
doTest(keys, before, after, Mode.NORMAL()) doTest(keys, before, after, Mode.NORMAL())
} }
// VIM-2733 // VIM-2733
@Test @Test
fun testDeleteOuterQuoteEmptyString2() { fun testDeleteOuterQuoteEmptyString2() {
val keys = listOf("da'") val keys = listOf("da'")
@ -665,7 +665,7 @@ class MotionActionTest : VimTestCase() {
doTest(keys, before, after, Mode.NORMAL()) doTest(keys, before, after, Mode.NORMAL())
} }
// VIM-1427 // VIM-1427
@Test @Test
fun testDeleteOuterTagWithCount() { fun testDeleteOuterTagWithCount() {
val keys = listOf("d2at") val keys = listOf("d2at")

View File

@ -2181,7 +2181,14 @@ rtyfg${c}hzxc"""
val context = injector.executionContextManager.getEditorExecutionContext(vimEditor) val context = injector.executionContextManager.getEditorExecutionContext(vimEditor)
injector.registerGroup.storeText(vimEditor, context, '*', "fgh") injector.registerGroup.storeText(vimEditor, context, '*', "fgh")
VimPlugin.getRegister() VimPlugin.getRegister()
.storeText(IjVimEditor(editor), context, editor.vim.primaryCaret(), TextRange(16, 19), SelectionType.CHARACTER_WISE, false) .storeText(
IjVimEditor(editor),
context,
editor.vim.primaryCaret(),
TextRange(16, 19),
SelectionType.CHARACTER_WISE,
false
)
typeText(injector.parser.parseKeys("\"*P")) typeText(injector.parser.parseKeys("\"*P"))
val after = "fg${c}hqfg${c}hwe asd zxc rty fg${c}hfgh vbn" val after = "fg${c}hqfg${c}hwe asd zxc rty fg${c}hfgh vbn"
assertState(after) assertState(after)

View File

@ -29,77 +29,93 @@ class OperatorActionTest : VimTestCase() {
@Test @Test
fun `test operator action with function name`() { fun `test operator action with function name`() {
doTest("gxe", doTest(
"gxe",
"lorem ipsum dolor sit amet", "lorem ipsum dolor sit amet",
"xxxxx ipsum dolor sit amet" "xxxxx ipsum dolor sit amet"
) { ) {
executeVimscript("""function! Redact(type) executeVimscript(
"""function! Redact(type)
| execute "normal `[v`]rx" | execute "normal `[v`]rx"
|endfunction |endfunction
""".trimMargin()) """.trimMargin()
)
enterCommand("noremap gx :set opfunc=Redact<CR>g@") enterCommand("noremap gx :set opfunc=Redact<CR>g@")
} }
} }
@Test @Test
fun `test operator action with character wise motion`() { fun `test operator action with character wise motion`() {
doTest("gxe", doTest(
"gxe",
"lorem ipsum dolor sit amet", "lorem ipsum dolor sit amet",
"charlorem ipsum dolor sit amet" "charlorem ipsum dolor sit amet"
) { ) {
executeVimscript("""function! Redact(type) executeVimscript(
"""function! Redact(type)
| execute "normal i" . a:type | execute "normal i" . a:type
|endfunction |endfunction
""".trimMargin()) """.trimMargin()
)
enterCommand("noremap gx :set opfunc=Redact<CR>g@") enterCommand("noremap gx :set opfunc=Redact<CR>g@")
} }
} }
@Test @Test
fun `test operator action with linewise motion`() { fun `test operator action with linewise motion`() {
doTest("Vgx", doTest(
"Vgx",
"lorem ipsum dolor sit amet", "lorem ipsum dolor sit amet",
"linelorem ipsum dolor sit amet" "linelorem ipsum dolor sit amet"
) { ) {
executeVimscript("""function! Redact(type) executeVimscript(
"""function! Redact(type)
| execute "normal i" . a:type | execute "normal i" . a:type
|endfunction |endfunction
""".trimMargin()) """.trimMargin()
)
enterCommand("noremap gx <Esc>:set opfunc=Redact<CR>gvg@") enterCommand("noremap gx <Esc>:set opfunc=Redact<CR>gvg@")
} }
} }
@Test @Test
fun `test operator action with blockwise motion`() { fun `test operator action with blockwise motion`() {
doTest("<C-V>gx", doTest(
"<C-V>gx",
"lorem ipsum dolor sit amet", "lorem ipsum dolor sit amet",
"blocklorem ipsum dolor sit amet" "blocklorem ipsum dolor sit amet"
) { ) {
executeVimscript("""function! Redact(type) executeVimscript(
"""function! Redact(type)
| execute "normal i" . a:type | execute "normal i" . a:type
|endfunction |endfunction
""".trimMargin()) """.trimMargin()
)
enterCommand("noremap gx <Esc>:set opfunc=Redact<CR>gvg@") enterCommand("noremap gx <Esc>:set opfunc=Redact<CR>gvg@")
} }
} }
@Test @Test
fun `test operator action with function`() { fun `test operator action with function`() {
doTest("gxe", doTest(
"gxe",
"lorem ipsum dolor sit amet", "lorem ipsum dolor sit amet",
"xxxxx ipsum dolor sit amet" "xxxxx ipsum dolor sit amet"
) { ) {
executeVimscript("""function! Redact(type) executeVimscript(
"""function! Redact(type)
| execute "normal `[v`]rx" | execute "normal `[v`]rx"
|endfunction |endfunction
""".trimMargin()) """.trimMargin()
)
enterCommand("noremap gx :set opfunc=function('Redact')<CR>g@") enterCommand("noremap gx :set opfunc=function('Redact')<CR>g@")
} }
} }
@Test @Test
fun `test operator action throws error with unknown function`() { fun `test operator action throws error with unknown function`() {
doTest("gxe", doTest(
"gxe",
"lorem ipsum dolor sit amet", "lorem ipsum dolor sit amet",
"lorem ipsum dolor sit amet" "lorem ipsum dolor sit amet"
) { ) {
@ -110,21 +126,25 @@ class OperatorActionTest : VimTestCase() {
@Test @Test
fun `test operator function with funcref`() { fun `test operator function with funcref`() {
doTest("gxe", doTest(
"gxe",
"lorem ipsum dolor sit amet", "lorem ipsum dolor sit amet",
"xxxxx ipsum dolor sit amet" "xxxxx ipsum dolor sit amet"
) { ) {
executeVimscript("""function! Redact(type) executeVimscript(
"""function! Redact(type)
| execute "normal `[v`]rx" | execute "normal `[v`]rx"
|endfunction |endfunction
""".trimMargin()) """.trimMargin()
)
enterCommand("noremap gx :set opfunc=funcref('Redact')<CR>g@") enterCommand("noremap gx :set opfunc=funcref('Redact')<CR>g@")
} }
} }
@Test @Test
fun `test operator action throws error with unknown function ref`() { fun `test operator action throws error with unknown function ref`() {
doTest("gxe", doTest(
"gxe",
"lorem ipsum dolor sit amet", "lorem ipsum dolor sit amet",
"lorem ipsum dolor sit amet" "lorem ipsum dolor sit amet"
) { ) {
@ -140,7 +160,8 @@ class OperatorActionTest : VimTestCase() {
// The map command is properly handled - the `<CR>g@` is correctly understood, and the full lambda is passed to the // The map command is properly handled - the `<CR>g@` is correctly understood, and the full lambda is passed to the
// parser, but the parser does not fully handle the text // parser, but the parser does not fully handle the text
fun `test operator function with lambda`() { fun `test operator function with lambda`() {
doTest("gxe", doTest(
"gxe",
"lorem ipsum dolor sit amet", "lorem ipsum dolor sit amet",
"lorem ipsum dolor sit amet" "lorem ipsum dolor sit amet"
) { ) {

View File

@ -351,7 +351,8 @@ class RepeatChangeActionTest : VimTestCase() {
@Test @Test
@TestFor(issues = ["VIM-481"]) @TestFor(issues = ["VIM-481"])
fun `test dot after overwrite mode`() { fun `test dot after overwrite mode`() {
configureByText(""" configureByText(
"""
/** /**
* @param array ${'$'}arr_footers * @param array ${'$'}arr_footers
* @param array ${'$'}arr_totals_data * @param array ${'$'}arr_totals_data
@ -361,9 +362,11 @@ class RepeatChangeActionTest : VimTestCase() {
* *
* @return array * @return array
*/ */
""".trimIndent()) """.trimIndent()
)
typeText("Rarray<C-[>", "jgell.") typeText("Rarray<C-[>", "jgell.")
assertState(""" assertState(
"""
/** /**
* @param array ${'$'}arr_footers * @param array ${'$'}arr_footers
* @param array ${'$'}arr_totals_data * @param array ${'$'}arr_totals_data
@ -373,6 +376,7 @@ class RepeatChangeActionTest : VimTestCase() {
* *
* @return array * @return array
*/ */
""".trimIndent()) """.trimIndent()
)
} }
} }

View File

@ -41,7 +41,7 @@ class ChangeLineActionTest : VimTestCase() {
Lorem ipsum dolor sit amet, Lorem ipsum dolor sit amet,
$c $c
""".trimIndent(), """.trimIndent(),
Mode.INSERT, Mode.INSERT,
) )
} }
@ -59,7 +59,7 @@ Mode.INSERT,
$c $c
""".trimIndent(), """.trimIndent(),
Mode.INSERT, Mode.INSERT,
) )
} }
@ -75,7 +75,7 @@ Mode.INSERT,
Lorem ipsum dolor sit amet, Lorem ipsum dolor sit amet,
$c $c
""".trimIndent(), """.trimIndent(),
Mode.INSERT, Mode.INSERT,
) )
} }
@ -93,7 +93,7 @@ Mode.INSERT,
$c $c
""".trimIndent(), """.trimIndent(),
Mode.INSERT, Mode.INSERT,
) )
} }
@ -109,7 +109,7 @@ Mode.INSERT,
$c $c
consectetur adipiscing elit consectetur adipiscing elit
""".trimIndent(), """.trimIndent(),
Mode.INSERT, Mode.INSERT,
) )
} }
@ -127,7 +127,7 @@ Mode.INSERT,
$c $c
""".trimIndent(), """.trimIndent(),
Mode.INSERT, Mode.INSERT,
) )
} }
@ -145,7 +145,7 @@ Mode.INSERT,
consectetur adipiscing elit consectetur adipiscing elit
$c $c
""".trimIndent(), """.trimIndent(),
Mode.INSERT, Mode.INSERT,
) )
} }
@ -183,7 +183,7 @@ Mode.INSERT,
that priceless mote now dimpling the convex that priceless mote now dimpling the convex
and limpid teardrop on a lighted slide. and limpid teardrop on a lighted slide.
""".trimIndent(), """.trimIndent(),
Mode.INSERT, Mode.INSERT,
) )
} }
} }

View File

@ -35,7 +35,7 @@ class ChangeMotionActionTest : VimTestCase() {
"cc", "cc",
"foo\n" + "${c}bar\n", "foo\n" + "${c}bar\n",
"foo\n${c}" + "\n", "foo\n${c}" + "\n",
Mode.INSERT, Mode.INSERT,
) )
} }
@ -54,7 +54,7 @@ Mode.INSERT,
....${c} ....${c}
} }
""".trimIndent().dotToSpace(), """.trimIndent().dotToSpace(),
Mode.INSERT, Mode.INSERT,
) )
} }
@ -65,7 +65,7 @@ Mode.INSERT,
"ccbaz", "ccbaz",
"${c}foo\n" + "bar\n", "${c}foo\n" + "bar\n",
"baz\n" + "bar\n", "baz\n" + "bar\n",
Mode.INSERT, Mode.INSERT,
) )
} }
@ -83,7 +83,7 @@ Mode.INSERT,
${c} ${c}
""".trimIndent(), """.trimIndent(),
Mode.INSERT, Mode.INSERT,
) )
} }
@ -93,7 +93,7 @@ Mode.INSERT,
"c_baz", "c_baz",
"${c}foo\n" + "bar\n", "${c}foo\n" + "bar\n",
"baz\n" + "bar\n", "baz\n" + "bar\n",
Mode.INSERT, Mode.INSERT,
) )
} }
@ -104,7 +104,7 @@ Mode.INSERT,
"cw", "cw",
"on${c}e two three\n", "on${c}e two three\n",
"on${c} two three\n", "on${c} two three\n",
Mode.INSERT, Mode.INSERT,
) )
} }
@ -115,7 +115,7 @@ Mode.INSERT,
"c2w", "c2w",
"on${c}e two three\n", "on${c}e two three\n",
"on${c} three\n", "on${c} three\n",
Mode.INSERT, Mode.INSERT,
) )
} }
@ -134,7 +134,7 @@ Mode.INSERT,
} }
""".trimIndent(), """.trimIndent(),
Mode.INSERT, Mode.INSERT,
) )
} }
@ -145,7 +145,7 @@ Mode.INSERT,
"cT(", "cT(",
"if (condition) ${c}{\n" + "}\n", "if (condition) ${c}{\n" + "}\n",
"if ({\n" + "}\n", "if ({\n" + "}\n",
Mode.INSERT, Mode.INSERT,
) )
} }
@ -158,7 +158,7 @@ Mode.INSERT,
"cFc", "cFc",
"if (condition) {${c}\n" + "}\n", "if (condition) {${c}\n" + "}\n",
"if (\n" + "}\n", "if (\n" + "}\n",
Mode.INSERT, Mode.INSERT,
) )
} }
@ -169,7 +169,7 @@ Mode.INSERT,
"cw", "cw",
"ab.${c}cd\n", "ab.${c}cd\n",
"ab.${c}\n", "ab.${c}\n",
Mode.INSERT, Mode.INSERT,
) )
} }
@ -180,7 +180,7 @@ Mode.INSERT,
listOf("c", "iw", "baz"), listOf("c", "iw", "baz"),
"foo bar bo${c}o\n", "foo bar bo${c}o\n",
"foo bar baz\n", "foo bar baz\n",
Mode.INSERT, Mode.INSERT,
) )
} }
@ -198,12 +198,14 @@ Mode.INSERT,
// VIM-3729 // VIM-3729
@Test @Test
fun `test change with count applies only to motion when repeated`() { fun `test change with count applies only to motion when repeated`() {
doTest(listOf("2c3l", "foo<Esc>", "w", "."), doTest(
listOf("2c3l", "foo<Esc>", "w", "."),
""" """
banana banana banana banana
""".trimIndent(), """.trimIndent(),
""" """
foo foo foo foo
""".trimIndent()) """.trimIndent()
)
} }
} }

View File

@ -42,7 +42,7 @@ class InsertDeletePreviousWordActionTest : VimTestCase() {
""" """
I ${c} it in a legendary land I ${c} it in a legendary land
""".trimIndent(), """.trimIndent(),
Mode.INSERT, Mode.INSERT,
) )
} }
@ -56,7 +56,7 @@ Mode.INSERT,
""" """
I ${c} in a legendary land I ${c} in a legendary land
""".trimIndent(), """.trimIndent(),
Mode.INSERT, Mode.INSERT,
) )
} }
@ -72,7 +72,7 @@ Mode.INSERT,
""" """
Lorem Ipsum${c} found it in a legendary land Lorem Ipsum${c} found it in a legendary land
""".trimIndent(), """.trimIndent(),
Mode.INSERT, Mode.INSERT,
) )
} }
@ -102,7 +102,7 @@ Mode.INSERT,
legendary legendary
${c} ${c}
""".trimIndent(), """.trimIndent(),
Mode.INSERT, Mode.INSERT,
) )
} }
@ -113,7 +113,7 @@ Mode.INSERT,
listOf("a", "<C-W>"), listOf("a", "<C-W>"),
"this is a sentence<caret>.\n", "this is a sentence<caret>.\n",
"this is a sentence<caret>\n", "this is a sentence<caret>\n",
Mode.INSERT, Mode.INSERT,
) )
} }
@ -124,7 +124,7 @@ Mode.INSERT,
listOf("A", "<C-W>"), listOf("A", "<C-W>"),
"<caret>this is a sentence\n", "<caret>this is a sentence\n",
"this is a <caret>\n", "this is a <caret>\n",
Mode.INSERT, Mode.INSERT,
) )
} }
@ -135,7 +135,7 @@ Mode.INSERT,
listOf("A", "<C-W>"), listOf("A", "<C-W>"),
"<caret>\$variable\n", "<caret>\$variable\n",
"$<caret>\n", "$<caret>\n",
Mode.INSERT, Mode.INSERT,
) )
} }

View File

@ -168,7 +168,7 @@ class VisualBlockInsertActionTest : VimTestCase() {
listOf("<C-V>", "lll", "I"), listOf("<C-V>", "lll", "I"),
before.trimIndent(), before.trimIndent(),
before.trimIndent(), before.trimIndent(),
Mode.INSERT, Mode.INSERT,
) )
} }
} }

View File

@ -34,7 +34,14 @@ class IdeaPutNotificationsTest : VimTestCase() {
val vimEditor = fixture.editor.vim val vimEditor = fixture.editor.vim
val context = injector.executionContextManager.getEditorExecutionContext(vimEditor) val context = injector.executionContextManager.getEditorExecutionContext(vimEditor)
val registerService = injector.registerGroup val registerService = injector.registerGroup
registerService.storeText(vimEditor, context, vimEditor.primaryCaret(), before rangeOf "legendary", SelectionType.CHARACTER_WISE, false) registerService.storeText(
vimEditor,
context,
vimEditor.primaryCaret(),
before rangeOf "legendary",
SelectionType.CHARACTER_WISE,
false
)
typeText(injector.parser.parseKeys("p")) typeText(injector.parser.parseKeys("p"))
val notification = notifications().last() val notification = notifications().last()
@ -55,7 +62,14 @@ class IdeaPutNotificationsTest : VimTestCase() {
val vimEditor = fixture.editor.vim val vimEditor = fixture.editor.vim
val context = injector.executionContextManager.getEditorExecutionContext(vimEditor) val context = injector.executionContextManager.getEditorExecutionContext(vimEditor)
val registerService = injector.registerGroup val registerService = injector.registerGroup
registerService.storeText(vimEditor, context, vimEditor.primaryCaret(), before rangeOf "legendary", SelectionType.CHARACTER_WISE, false) registerService.storeText(
vimEditor,
context,
vimEditor.primaryCaret(),
before rangeOf "legendary",
SelectionType.CHARACTER_WISE,
false
)
typeText(injector.parser.parseKeys("p")) typeText(injector.parser.parseKeys("p"))
val notifications = notifications() val notifications = notifications()
@ -74,7 +88,14 @@ class IdeaPutNotificationsTest : VimTestCase() {
val vimEditor = fixture.editor.vim val vimEditor = fixture.editor.vim
val context = injector.executionContextManager.getEditorExecutionContext(vimEditor) val context = injector.executionContextManager.getEditorExecutionContext(vimEditor)
val registerService = injector.registerGroup val registerService = injector.registerGroup
registerService.storeText(vimEditor, context, vimEditor.primaryCaret(), before rangeOf "legendary", SelectionType.CHARACTER_WISE, false) registerService.storeText(
vimEditor,
context,
vimEditor.primaryCaret(),
before rangeOf "legendary",
SelectionType.CHARACTER_WISE,
false
)
typeText(injector.parser.parseKeys("p")) typeText(injector.parser.parseKeys("p"))
val notifications = EventLog.getLogModel(fixture.project).notifications val notifications = EventLog.getLogModel(fixture.project).notifications

View File

@ -88,7 +88,14 @@ class PutTestAfterCursorActionTest : VimTestCase() {
val vimEditor = editor.vim val vimEditor = editor.vim
val context = injector.executionContextManager.getEditorExecutionContext(vimEditor) val context = injector.executionContextManager.getEditorExecutionContext(vimEditor)
val registerService = injector.registerGroup val registerService = injector.registerGroup
registerService.storeText(vimEditor, context, vimEditor.primaryCaret(), before rangeOf "A Discovery\n", SelectionType.LINE_WISE, false) registerService.storeText(
vimEditor,
context,
vimEditor.primaryCaret(),
before rangeOf "A Discovery\n",
SelectionType.LINE_WISE,
false
)
typeText(injector.parser.parseKeys("p")) typeText(injector.parser.parseKeys("p"))
val after = """ val after = """
A Discovery A Discovery
@ -161,7 +168,14 @@ class PutTestAfterCursorActionTest : VimTestCase() {
val vimEditor = editor.vim val vimEditor = editor.vim
val context = injector.executionContextManager.getEditorExecutionContext(vimEditor) val context = injector.executionContextManager.getEditorExecutionContext(vimEditor)
val registerService = injector.registerGroup val registerService = injector.registerGroup
registerService.storeText(vimEditor, context, vimEditor.primaryCaret(), before rangeOf "Discovery", SelectionType.CHARACTER_WISE, false) registerService.storeText(
vimEditor,
context,
vimEditor.primaryCaret(),
before rangeOf "Discovery",
SelectionType.CHARACTER_WISE,
false
)
typeText(injector.parser.parseKeys("vep")) typeText(injector.parser.parseKeys("vep"))
val after = """ val after = """
A Discovery A Discovery

View File

@ -33,7 +33,14 @@ class PutTextBeforeCursorActionTest : VimTestCase() {
val vimEditor = editor.vim val vimEditor = editor.vim
val context = injector.executionContextManager.getEditorExecutionContext(vimEditor) val context = injector.executionContextManager.getEditorExecutionContext(vimEditor)
val registerService = injector.registerGroup val registerService = injector.registerGroup
registerService.storeText(vimEditor, context, vimEditor.primaryCaret(), before rangeOf "Discovery", SelectionType.CHARACTER_WISE, false) registerService.storeText(
vimEditor,
context,
vimEditor.primaryCaret(),
before rangeOf "Discovery",
SelectionType.CHARACTER_WISE,
false
)
typeText(injector.parser.parseKeys("V" + "P")) typeText(injector.parser.parseKeys("V" + "P"))
typeText(injector.parser.parseKeys("V" + "P")) typeText(injector.parser.parseKeys("V" + "P"))
val after = """ val after = """

View File

@ -58,7 +58,14 @@ class PutViaIdeaTest : VimTestCase() {
val vimEditor = fixture.editor.vim val vimEditor = fixture.editor.vim
val context = injector.executionContextManager.getEditorExecutionContext(vimEditor) val context = injector.executionContextManager.getEditorExecutionContext(vimEditor)
val registerService = injector.registerGroup val registerService = injector.registerGroup
registerService.storeText(vimEditor, context, vimEditor.primaryCaret(), before rangeOf "legendary", SelectionType.CHARACTER_WISE, false) registerService.storeText(
vimEditor,
context,
vimEditor.primaryCaret(),
before rangeOf "legendary",
SelectionType.CHARACTER_WISE,
false
)
typeText("ppp") typeText("ppp")
val after = "Ilegendarylegendarylegendar${c}y found it in a legendary land" val after = "Ilegendarylegendarylegendar${c}y found it in a legendary land"
@ -79,13 +86,13 @@ class PutViaIdeaTest : VimTestCase() {
val context = injector.executionContextManager.getEditorExecutionContext(vimEditor) val context = injector.executionContextManager.getEditorExecutionContext(vimEditor)
val registerService = injector.registerGroup val registerService = injector.registerGroup
registerService.storeText( registerService.storeText(
vimEditor, vimEditor,
context, context,
vimEditor.primaryCaret(), vimEditor.primaryCaret(),
before rangeOf "legendary$randomUUID", before rangeOf "legendary$randomUUID",
SelectionType.CHARACTER_WISE, SelectionType.CHARACTER_WISE,
false, false,
) )
val sizeBefore = CopyPasteManager.getInstance().allContents.size val sizeBefore = CopyPasteManager.getInstance().allContents.size
typeText("ve", "p") typeText("ve", "p")

View File

@ -78,7 +78,14 @@ class PutVisualTextActionTest : VimTestCase() {
val context = injector.executionContextManager.getEditorExecutionContext(vimEditor) val context = injector.executionContextManager.getEditorExecutionContext(vimEditor)
val registerService = injector.registerGroup val registerService = injector.registerGroup
registerService.storeText(vimEditor, context, vimEditor.primaryCaret(), before rangeOf "legendary", SelectionType.CHARACTER_WISE, false) registerService.storeText(
vimEditor,
context,
vimEditor.primaryCaret(),
before rangeOf "legendary",
SelectionType.CHARACTER_WISE,
false
)
typeText(injector.parser.parseKeys("ve" + "p")) typeText(injector.parser.parseKeys("ve" + "p"))
val after = "legendar${c}y it in a legendary land" val after = "legendar${c}y it in a legendary land"
assertState(after) assertState(after)
@ -94,7 +101,14 @@ class PutVisualTextActionTest : VimTestCase() {
val context = injector.executionContextManager.getEditorExecutionContext(vimEditor) val context = injector.executionContextManager.getEditorExecutionContext(vimEditor)
val registerService = injector.registerGroup val registerService = injector.registerGroup
registerService.storeText(vimEditor, context, vimEditor.primaryCaret(), before rangeOf "legendary", SelectionType.CHARACTER_WISE, false) registerService.storeText(
vimEditor,
context,
vimEditor.primaryCaret(),
before rangeOf "legendary",
SelectionType.CHARACTER_WISE,
false
)
typeText(injector.parser.parseKeys("v2e" + "2p")) typeText(injector.parser.parseKeys("v2e" + "2p"))
val after = "legendarylegendar${c}y in a legendary land" val after = "legendarylegendar${c}y in a legendary land"
assertState(after) assertState(after)
@ -110,7 +124,14 @@ class PutVisualTextActionTest : VimTestCase() {
val context = injector.executionContextManager.getEditorExecutionContext(vimEditor) val context = injector.executionContextManager.getEditorExecutionContext(vimEditor)
val registerService = injector.registerGroup val registerService = injector.registerGroup
registerService.storeText(vimEditor, context, vimEditor.primaryCaret(), before rangeOf "legendary", SelectionType.CHARACTER_WISE, false) registerService.storeText(
vimEditor,
context,
vimEditor.primaryCaret(),
before rangeOf "legendary",
SelectionType.CHARACTER_WISE,
false
)
typeText(injector.parser.parseKeys("v$" + "2p")) typeText(injector.parser.parseKeys("v$" + "2p"))
val after = "legendarylegendar${c}y" val after = "legendarylegendar${c}y"
assertState(after) assertState(after)
@ -123,7 +144,7 @@ class PutVisualTextActionTest : VimTestCase() {
configureByText(before) configureByText(before)
val vimEditor = fixture.editor.vim val vimEditor = fixture.editor.vim
val context = injector.executionContextManager.getEditorExecutionContext(vimEditor) val context = injector.executionContextManager.getEditorExecutionContext(vimEditor)
injector.registerGroup.storeText(vimEditor, context,'+', "legendary", SelectionType.CHARACTER_WISE) injector.registerGroup.storeText(vimEditor, context, '+', "legendary", SelectionType.CHARACTER_WISE)
typeText(injector.parser.parseKeys("ve" + "\"+p")) typeText(injector.parser.parseKeys("ve" + "\"+p"))
val after = "legendar${c}y legendar${c}y in a legendar${c}y land" val after = "legendar${c}y legendar${c}y in a legendar${c}y land"
assertState(after) assertState(after)
@ -136,7 +157,7 @@ class PutVisualTextActionTest : VimTestCase() {
configureByText(before) configureByText(before)
val vimEditor = fixture.editor.vim val vimEditor = fixture.editor.vim
val context = injector.executionContextManager.getEditorExecutionContext(vimEditor) val context = injector.executionContextManager.getEditorExecutionContext(vimEditor)
injector.registerGroup.storeText(vimEditor, context,'+', "legendary", SelectionType.CHARACTER_WISE) injector.registerGroup.storeText(vimEditor, context, '+', "legendary", SelectionType.CHARACTER_WISE)
typeText(injector.parser.parseKeys("ve" + "\"+p")) typeText(injector.parser.parseKeys("ve" + "\"+p"))
val after = "legendar${c}y legendar${c}y in a legendar${c}y land" val after = "legendar${c}y legendar${c}y in a legendar${c}y land"
assertState(after) assertState(after)
@ -152,7 +173,14 @@ class PutVisualTextActionTest : VimTestCase() {
val context = injector.executionContextManager.getEditorExecutionContext(vimEditor) val context = injector.executionContextManager.getEditorExecutionContext(vimEditor)
val registerService = injector.registerGroup val registerService = injector.registerGroup
registerService.storeText(vimEditor, context, vimEditor.primaryCaret(), before rangeOf "legendary", SelectionType.CHARACTER_WISE, false) registerService.storeText(
vimEditor,
context,
vimEditor.primaryCaret(),
before rangeOf "legendary",
SelectionType.CHARACTER_WISE,
false
)
typeText(injector.parser.parseKeys("vb" + "p")) typeText(injector.parser.parseKeys("vb" + "p"))
val after = "I legendar${c}y it in a legendary land" val after = "I legendar${c}y it in a legendary land"
assertState(after) assertState(after)
@ -177,7 +205,14 @@ class PutVisualTextActionTest : VimTestCase() {
val context = injector.executionContextManager.getEditorExecutionContext(vimEditor) val context = injector.executionContextManager.getEditorExecutionContext(vimEditor)
val registerService = injector.registerGroup val registerService = injector.registerGroup
registerService.storeText(vimEditor, context, vimEditor.primaryCaret(), before rangeOf "A Discovery\n", SelectionType.LINE_WISE, false) registerService.storeText(
vimEditor,
context,
vimEditor.primaryCaret(),
before rangeOf "A Discovery\n",
SelectionType.LINE_WISE,
false
)
typeText(injector.parser.parseKeys("ve" + "p")) typeText(injector.parser.parseKeys("ve" + "p"))
val after = """ val after = """
A Discovery A Discovery
@ -209,7 +244,14 @@ class PutVisualTextActionTest : VimTestCase() {
val context = injector.executionContextManager.getEditorExecutionContext(vimEditor) val context = injector.executionContextManager.getEditorExecutionContext(vimEditor)
val registerService = injector.registerGroup val registerService = injector.registerGroup
registerService.storeText(vimEditor, context, vimEditor.primaryCaret(), before rangeOf "A Discovery\n", SelectionType.LINE_WISE, false) registerService.storeText(
vimEditor,
context,
vimEditor.primaryCaret(),
before rangeOf "A Discovery\n",
SelectionType.LINE_WISE,
false
)
typeText(injector.parser.parseKeys("ve" + "p")) typeText(injector.parser.parseKeys("ve" + "p"))
val after = """ val after = """
A Discovery A Discovery
@ -241,7 +283,14 @@ class PutVisualTextActionTest : VimTestCase() {
val context = injector.executionContextManager.getEditorExecutionContext(vimEditor) val context = injector.executionContextManager.getEditorExecutionContext(vimEditor)
val registerService = injector.registerGroup val registerService = injector.registerGroup
registerService.storeText(vimEditor, context, vimEditor.primaryCaret(), before rangeOf "A Discovery\n", SelectionType.LINE_WISE, false) registerService.storeText(
vimEditor,
context,
vimEditor.primaryCaret(),
before rangeOf "A Discovery\n",
SelectionType.LINE_WISE,
false
)
typeText(injector.parser.parseKeys("ve" + "p")) typeText(injector.parser.parseKeys("ve" + "p"))
val after = """ val after = """
A Discovery A Discovery
@ -273,7 +322,14 @@ class PutVisualTextActionTest : VimTestCase() {
val context = injector.executionContextManager.getEditorExecutionContext(vimEditor) val context = injector.executionContextManager.getEditorExecutionContext(vimEditor)
val registerService = injector.registerGroup val registerService = injector.registerGroup
registerService.storeText(vimEditor, context, vimEditor.primaryCaret(), before rangeOf "A Discovery\n", SelectionType.LINE_WISE, false) registerService.storeText(
vimEditor,
context,
vimEditor.primaryCaret(),
before rangeOf "A Discovery\n",
SelectionType.LINE_WISE,
false
)
typeText(injector.parser.parseKeys("v$" + "p")) typeText(injector.parser.parseKeys("v$" + "p"))
val after = """ val after = """
A Discovery A Discovery
@ -302,7 +358,7 @@ class PutVisualTextActionTest : VimTestCase() {
configureByText(before) configureByText(before)
val vimEditor = fixture.editor.vim val vimEditor = fixture.editor.vim
val context = injector.executionContextManager.getEditorExecutionContext(vimEditor) val context = injector.executionContextManager.getEditorExecutionContext(vimEditor)
injector.registerGroup.storeText(vimEditor, context,'*', "A Discovery\n", SelectionType.LINE_WISE) injector.registerGroup.storeText(vimEditor, context, '*', "A Discovery\n", SelectionType.LINE_WISE)
typeText(injector.parser.parseKeys("ve" + "\"*p")) typeText(injector.parser.parseKeys("ve" + "\"*p"))
val after = """ val after = """
A Discovery A Discovery
@ -335,7 +391,7 @@ class PutVisualTextActionTest : VimTestCase() {
configureByText(before) configureByText(before)
val vimEditor = fixture.editor.vim val vimEditor = fixture.editor.vim
val context = injector.executionContextManager.getEditorExecutionContext(vimEditor) val context = injector.executionContextManager.getEditorExecutionContext(vimEditor)
injector.registerGroup.storeText(vimEditor, context,'+', "A Discovery\n", SelectionType.LINE_WISE) injector.registerGroup.storeText(vimEditor, context, '+', "A Discovery\n", SelectionType.LINE_WISE)
typeText(injector.parser.parseKeys("ve" + "\"+p")) typeText(injector.parser.parseKeys("ve" + "\"+p"))
val after = """ val after = """
A Discovery A Discovery
@ -368,7 +424,7 @@ class PutVisualTextActionTest : VimTestCase() {
configureByText(before) configureByText(before)
val vimEditor = fixture.editor.vim val vimEditor = fixture.editor.vim
val context = injector.executionContextManager.getEditorExecutionContext(vimEditor) val context = injector.executionContextManager.getEditorExecutionContext(vimEditor)
injector.registerGroup.storeText(vimEditor, context,'+', "A Discovery\n", SelectionType.LINE_WISE) injector.registerGroup.storeText(vimEditor, context, '+', "A Discovery\n", SelectionType.LINE_WISE)
typeText(injector.parser.parseKeys("ve" + "\"+p")) typeText(injector.parser.parseKeys("ve" + "\"+p"))
val after = """ val after = """
A Discovery A Discovery
@ -399,7 +455,7 @@ class PutVisualTextActionTest : VimTestCase() {
configureByText(before) configureByText(before)
val vimEditor = fixture.editor.vim val vimEditor = fixture.editor.vim
val context = injector.executionContextManager.getEditorExecutionContext(vimEditor) val context = injector.executionContextManager.getEditorExecutionContext(vimEditor)
injector.registerGroup.storeText(vimEditor, context,'+', "A Discovery\n", SelectionType.LINE_WISE) injector.registerGroup.storeText(vimEditor, context, '+', "A Discovery\n", SelectionType.LINE_WISE)
typeText(injector.parser.parseKeys("ve" + "\"+p")) typeText(injector.parser.parseKeys("ve" + "\"+p"))
val after = """ val after = """
A Discovery A Discovery
@ -430,7 +486,7 @@ class PutVisualTextActionTest : VimTestCase() {
configureByText(before) configureByText(before)
val vimEditor = fixture.editor.vim val vimEditor = fixture.editor.vim
val context = injector.executionContextManager.getEditorExecutionContext(vimEditor) val context = injector.executionContextManager.getEditorExecutionContext(vimEditor)
injector.registerGroup.storeText(vimEditor, context,'+', "A Discovery\n", SelectionType.LINE_WISE) injector.registerGroup.storeText(vimEditor, context, '+', "A Discovery\n", SelectionType.LINE_WISE)
typeText(injector.parser.parseKeys("ve" + "2\"+p")) typeText(injector.parser.parseKeys("ve" + "2\"+p"))
val after = """ val after = """
A Discovery A Discovery
@ -463,7 +519,7 @@ class PutVisualTextActionTest : VimTestCase() {
configureByText(before) configureByText(before)
val vimEditor = fixture.editor.vim val vimEditor = fixture.editor.vim
val context = injector.executionContextManager.getEditorExecutionContext(vimEditor) val context = injector.executionContextManager.getEditorExecutionContext(vimEditor)
injector.registerGroup.storeText(vimEditor, context,'+', "A Discovery\n", SelectionType.LINE_WISE) injector.registerGroup.storeText(vimEditor, context, '+', "A Discovery\n", SelectionType.LINE_WISE)
typeText(injector.parser.parseKeys("ve" + "2\"+p")) typeText(injector.parser.parseKeys("ve" + "2\"+p"))
val after = """ val after = """
A Discovery A Discovery
@ -506,7 +562,14 @@ class PutVisualTextActionTest : VimTestCase() {
val context = injector.executionContextManager.getEditorExecutionContext(vimEditor) val context = injector.executionContextManager.getEditorExecutionContext(vimEditor)
val registerService = injector.registerGroup val registerService = injector.registerGroup
registerService.storeText(vimEditor, context, vimEditor.primaryCaret(), editor.rangeOf("|found|", 2), SelectionType.BLOCK_WISE, false) registerService.storeText(
vimEditor,
context,
vimEditor.primaryCaret(),
editor.rangeOf("|found|", 2),
SelectionType.BLOCK_WISE,
false
)
typeText(injector.parser.parseKeys("ve" + "p")) typeText(injector.parser.parseKeys("ve" + "p"))
val after = """ val after = """
A Discovery A Discovery
@ -546,7 +609,14 @@ class PutVisualTextActionTest : VimTestCase() {
val context = injector.executionContextManager.getEditorExecutionContext(vimEditor) val context = injector.executionContextManager.getEditorExecutionContext(vimEditor)
val registerService = injector.registerGroup val registerService = injector.registerGroup
registerService.storeText(vimEditor, context, vimEditor.primaryCaret(), editor.rangeOf("|found|", 2), SelectionType.BLOCK_WISE, false) registerService.storeText(
vimEditor,
context,
vimEditor.primaryCaret(),
editor.rangeOf("|found|", 2),
SelectionType.BLOCK_WISE,
false
)
typeText(injector.parser.parseKeys("ve" + "p")) typeText(injector.parser.parseKeys("ve" + "p"))
val after = """ val after = """
A Discovery A Discovery
@ -588,7 +658,14 @@ class PutVisualTextActionTest : VimTestCase() {
val context = injector.executionContextManager.getEditorExecutionContext(vimEditor) val context = injector.executionContextManager.getEditorExecutionContext(vimEditor)
val registerService = injector.registerGroup val registerService = injector.registerGroup
registerService.storeText(vimEditor, context, vimEditor.primaryCaret(), editor.rangeOf("|found|", 2), SelectionType.BLOCK_WISE, false) registerService.storeText(
vimEditor,
context,
vimEditor.primaryCaret(),
editor.rangeOf("|found|", 2),
SelectionType.BLOCK_WISE,
false
)
typeText(injector.parser.parseKeys("ve" + "2p")) typeText(injector.parser.parseKeys("ve" + "2p"))
val after = """ val after = """
A Discovery A Discovery
@ -627,7 +704,7 @@ class PutVisualTextActionTest : VimTestCase() {
configureByText(before) configureByText(before)
val vimEditor = fixture.editor.vim val vimEditor = fixture.editor.vim
val context = injector.executionContextManager.getEditorExecutionContext(vimEditor) val context = injector.executionContextManager.getEditorExecutionContext(vimEditor)
injector.registerGroup.storeText(vimEditor, context,'+', "|found|\n|l roc|\n|ere i|", SelectionType.BLOCK_WISE) injector.registerGroup.storeText(vimEditor, context, '+', "|found|\n|l roc|\n|ere i|", SelectionType.BLOCK_WISE)
// registerService.storeText(editor.vim context,, editor.rangeOf("|found|", 2), SelectionType.BLOCK_WISE, false) // registerService.storeText(editor.vim context,, editor.rangeOf("|found|", 2), SelectionType.BLOCK_WISE, false)
typeText(injector.parser.parseKeys("ve" + "\"+p")) typeText(injector.parser.parseKeys("ve" + "\"+p"))
val after = """ val after = """
@ -667,7 +744,7 @@ class PutVisualTextActionTest : VimTestCase() {
configureByText(before) configureByText(before)
val vimEditor = fixture.editor.vim val vimEditor = fixture.editor.vim
val context = injector.executionContextManager.getEditorExecutionContext(vimEditor) val context = injector.executionContextManager.getEditorExecutionContext(vimEditor)
injector.registerGroup.storeText(vimEditor, context,'+', "|found|\n|l roc|\n|ere i|", SelectionType.BLOCK_WISE) injector.registerGroup.storeText(vimEditor, context, '+', "|found|\n|l roc|\n|ere i|", SelectionType.BLOCK_WISE)
// registerService.storeText(editor.vim context,, editor.rangeOf("|found|", 2), SelectionType.BLOCK_WISE, false) // registerService.storeText(editor.vim context,, editor.rangeOf("|found|", 2), SelectionType.BLOCK_WISE, false)
typeText(injector.parser.parseKeys("ve" + "\"+p")) typeText(injector.parser.parseKeys("ve" + "\"+p"))
val after = """ val after = """
@ -707,7 +784,14 @@ class PutVisualTextActionTest : VimTestCase() {
val context = injector.executionContextManager.getEditorExecutionContext(vimEditor) val context = injector.executionContextManager.getEditorExecutionContext(vimEditor)
val registerService = injector.registerGroup val registerService = injector.registerGroup
registerService.storeText(vimEditor, context, vimEditor.primaryCaret(), before rangeOf "Discovery", SelectionType.CHARACTER_WISE, false) registerService.storeText(
vimEditor,
context,
vimEditor.primaryCaret(),
before rangeOf "Discovery",
SelectionType.CHARACTER_WISE,
false
)
typeText(injector.parser.parseKeys("V" + "p")) typeText(injector.parser.parseKeys("V" + "p"))
val after = """ val after = """
A Discovery A Discovery
@ -737,7 +821,14 @@ class PutVisualTextActionTest : VimTestCase() {
val context = injector.executionContextManager.getEditorExecutionContext(vimEditor) val context = injector.executionContextManager.getEditorExecutionContext(vimEditor)
val registerService = injector.registerGroup val registerService = injector.registerGroup
registerService.storeText(vimEditor, context, vimEditor.primaryCaret(), before rangeOf "Discovery", SelectionType.CHARACTER_WISE, false) registerService.storeText(
vimEditor,
context,
vimEditor.primaryCaret(),
before rangeOf "Discovery",
SelectionType.CHARACTER_WISE,
false
)
typeText(injector.parser.parseKeys("V" + "2p")) typeText(injector.parser.parseKeys("V" + "2p"))
val after = """ val after = """
A Discovery A Discovery
@ -778,7 +869,14 @@ class PutVisualTextActionTest : VimTestCase() {
val context = injector.executionContextManager.getEditorExecutionContext(vimEditor) val context = injector.executionContextManager.getEditorExecutionContext(vimEditor)
val registerService = injector.registerGroup val registerService = injector.registerGroup
registerService.storeText(vimEditor, context, vimEditor.primaryCaret(), before rangeOf "Discovery", SelectionType.CHARACTER_WISE, false) registerService.storeText(
vimEditor,
context,
vimEditor.primaryCaret(),
before rangeOf "Discovery",
SelectionType.CHARACTER_WISE,
false
)
typeText(injector.parser.parseKeys("V" + "p")) typeText(injector.parser.parseKeys("V" + "p"))
val after = """ val after = """
A Discovery A Discovery
@ -816,7 +914,7 @@ class PutVisualTextActionTest : VimTestCase() {
configureByText(before) configureByText(before)
val vimEditor = fixture.editor.vim val vimEditor = fixture.editor.vim
val context = injector.executionContextManager.getEditorExecutionContext(vimEditor) val context = injector.executionContextManager.getEditorExecutionContext(vimEditor)
injector.registerGroup.storeText(vimEditor, context,'*', "Discovery", SelectionType.CHARACTER_WISE) injector.registerGroup.storeText(vimEditor, context, '*', "Discovery", SelectionType.CHARACTER_WISE)
typeText(injector.parser.parseKeys("V" + "\"*p")) typeText(injector.parser.parseKeys("V" + "\"*p"))
val after = """ val after = """
A Discovery A Discovery
@ -854,7 +952,7 @@ class PutVisualTextActionTest : VimTestCase() {
configureByText(before) configureByText(before)
val vimEditor = fixture.editor.vim val vimEditor = fixture.editor.vim
val context = injector.executionContextManager.getEditorExecutionContext(vimEditor) val context = injector.executionContextManager.getEditorExecutionContext(vimEditor)
injector.registerGroup.storeText(vimEditor, context,'+', "Discovery", SelectionType.CHARACTER_WISE) injector.registerGroup.storeText(vimEditor, context, '+', "Discovery", SelectionType.CHARACTER_WISE)
typeText(injector.parser.parseKeys("V" + "\"+p")) typeText(injector.parser.parseKeys("V" + "\"+p"))
val after = """ val after = """
A Discovery A Discovery
@ -892,7 +990,7 @@ class PutVisualTextActionTest : VimTestCase() {
configureByText(before) configureByText(before)
val vimEditor = fixture.editor.vim val vimEditor = fixture.editor.vim
val context = injector.executionContextManager.getEditorExecutionContext(vimEditor) val context = injector.executionContextManager.getEditorExecutionContext(vimEditor)
injector.registerGroup.storeText(vimEditor, context,'+', "Discovery", SelectionType.CHARACTER_WISE) injector.registerGroup.storeText(vimEditor, context, '+', "Discovery", SelectionType.CHARACTER_WISE)
typeText(injector.parser.parseKeys("V" + "\"+p")) typeText(injector.parser.parseKeys("V" + "\"+p"))
val after = """ val after = """
A Discovery A Discovery
@ -930,7 +1028,7 @@ class PutVisualTextActionTest : VimTestCase() {
configureByText(before) configureByText(before)
val vimEditor = fixture.editor.vim val vimEditor = fixture.editor.vim
val context = injector.executionContextManager.getEditorExecutionContext(vimEditor) val context = injector.executionContextManager.getEditorExecutionContext(vimEditor)
injector.registerGroup.storeText(vimEditor, context,'+', "Discovery", SelectionType.CHARACTER_WISE) injector.registerGroup.storeText(vimEditor, context, '+', "Discovery", SelectionType.CHARACTER_WISE)
typeText(injector.parser.parseKeys("V" + "\"+p")) typeText(injector.parser.parseKeys("V" + "\"+p"))
val after = """ val after = """
A Discovery A Discovery
@ -963,7 +1061,14 @@ class PutVisualTextActionTest : VimTestCase() {
val context = injector.executionContextManager.getEditorExecutionContext(vimEditor) val context = injector.executionContextManager.getEditorExecutionContext(vimEditor)
val registerService = injector.registerGroup val registerService = injector.registerGroup
registerService.storeText(vimEditor, context, vimEditor.primaryCaret(), before rangeOf "A Discovery\n", SelectionType.LINE_WISE, false) registerService.storeText(
vimEditor,
context,
vimEditor.primaryCaret(),
before rangeOf "A Discovery\n",
SelectionType.LINE_WISE,
false
)
typeText(injector.parser.parseKeys("V" + "p")) typeText(injector.parser.parseKeys("V" + "p"))
val after = """ val after = """
A Discovery A Discovery
@ -993,7 +1098,14 @@ class PutVisualTextActionTest : VimTestCase() {
val context = injector.executionContextManager.getEditorExecutionContext(vimEditor) val context = injector.executionContextManager.getEditorExecutionContext(vimEditor)
val registerService = injector.registerGroup val registerService = injector.registerGroup
registerService.storeText(vimEditor, context, vimEditor.primaryCaret(), before rangeOf "A Discovery\n", SelectionType.LINE_WISE, false) registerService.storeText(
vimEditor,
context,
vimEditor.primaryCaret(),
before rangeOf "A Discovery\n",
SelectionType.LINE_WISE,
false
)
typeText(injector.parser.parseKeys("V" + "2p")) typeText(injector.parser.parseKeys("V" + "2p"))
val after = """ val after = """
A Discovery A Discovery
@ -1034,7 +1146,14 @@ class PutVisualTextActionTest : VimTestCase() {
val context = injector.executionContextManager.getEditorExecutionContext(vimEditor) val context = injector.executionContextManager.getEditorExecutionContext(vimEditor)
val registerService = injector.registerGroup val registerService = injector.registerGroup
registerService.storeText(vimEditor, context, vimEditor.primaryCaret(), before rangeOf "A Discovery\n", SelectionType.LINE_WISE, false) registerService.storeText(
vimEditor,
context,
vimEditor.primaryCaret(),
before rangeOf "A Discovery\n",
SelectionType.LINE_WISE,
false
)
typeText(injector.parser.parseKeys("V" + "p")) typeText(injector.parser.parseKeys("V" + "p"))
val after = """ val after = """
A Discovery A Discovery
@ -1072,7 +1191,7 @@ class PutVisualTextActionTest : VimTestCase() {
configureByText(before) configureByText(before)
val vimEditor = fixture.editor.vim val vimEditor = fixture.editor.vim
val context = injector.executionContextManager.getEditorExecutionContext(vimEditor) val context = injector.executionContextManager.getEditorExecutionContext(vimEditor)
injector.registerGroup.storeText(vimEditor, context,'*', "A Discovery\n", SelectionType.LINE_WISE) injector.registerGroup.storeText(vimEditor, context, '*', "A Discovery\n", SelectionType.LINE_WISE)
typeText(injector.parser.parseKeys("V" + "\"*p")) typeText(injector.parser.parseKeys("V" + "\"*p"))
val after = """ val after = """
A Discovery A Discovery
@ -1110,7 +1229,7 @@ class PutVisualTextActionTest : VimTestCase() {
configureByText(before) configureByText(before)
val vimEditor = fixture.editor.vim val vimEditor = fixture.editor.vim
val context = injector.executionContextManager.getEditorExecutionContext(vimEditor) val context = injector.executionContextManager.getEditorExecutionContext(vimEditor)
injector.registerGroup.storeText(vimEditor, context,'+', "A Discovery\n", SelectionType.LINE_WISE) injector.registerGroup.storeText(vimEditor, context, '+', "A Discovery\n", SelectionType.LINE_WISE)
typeText(injector.parser.parseKeys("V" + "\"+p")) typeText(injector.parser.parseKeys("V" + "\"+p"))
val after = """ val after = """
A Discovery A Discovery
@ -1148,7 +1267,7 @@ class PutVisualTextActionTest : VimTestCase() {
configureByText(before) configureByText(before)
val vimEditor = fixture.editor.vim val vimEditor = fixture.editor.vim
val context = injector.executionContextManager.getEditorExecutionContext(vimEditor) val context = injector.executionContextManager.getEditorExecutionContext(vimEditor)
injector.registerGroup.storeText(vimEditor, context,'+', "A Discovery\n", SelectionType.LINE_WISE) injector.registerGroup.storeText(vimEditor, context, '+', "A Discovery\n", SelectionType.LINE_WISE)
typeText(injector.parser.parseKeys("V" + "\"+p")) typeText(injector.parser.parseKeys("V" + "\"+p"))
val after = """ val after = """
A Discovery A Discovery
@ -1186,7 +1305,7 @@ class PutVisualTextActionTest : VimTestCase() {
configureByText(before) configureByText(before)
val vimEditor = fixture.editor.vim val vimEditor = fixture.editor.vim
val context = injector.executionContextManager.getEditorExecutionContext(vimEditor) val context = injector.executionContextManager.getEditorExecutionContext(vimEditor)
injector.registerGroup.storeText(vimEditor, context,'+', "A Discovery\n", SelectionType.LINE_WISE) injector.registerGroup.storeText(vimEditor, context, '+', "A Discovery\n", SelectionType.LINE_WISE)
typeText(injector.parser.parseKeys("V" + "\"+p")) typeText(injector.parser.parseKeys("V" + "\"+p"))
val after = """ val after = """
A Discovery A Discovery
@ -1224,7 +1343,14 @@ class PutVisualTextActionTest : VimTestCase() {
val context = injector.executionContextManager.getEditorExecutionContext(vimEditor) val context = injector.executionContextManager.getEditorExecutionContext(vimEditor)
val registerService = injector.registerGroup val registerService = injector.registerGroup
registerService.storeText(vimEditor, context, vimEditor.primaryCaret(), editor.rangeOf("|found|", 2), SelectionType.BLOCK_WISE, false) registerService.storeText(
vimEditor,
context,
vimEditor.primaryCaret(),
editor.rangeOf("|found|", 2),
SelectionType.BLOCK_WISE,
false
)
typeText(injector.parser.parseKeys("V" + "p")) typeText(injector.parser.parseKeys("V" + "p"))
val after = """ val after = """
A Discovery A Discovery
@ -1283,7 +1409,14 @@ class PutVisualTextActionTest : VimTestCase() {
val context = injector.executionContextManager.getEditorExecutionContext(vimEditor) val context = injector.executionContextManager.getEditorExecutionContext(vimEditor)
val registerService = injector.registerGroup val registerService = injector.registerGroup
registerService.storeText(vimEditor, context, vimEditor.primaryCaret(), editor.rangeOf("|found|", 2), SelectionType.BLOCK_WISE, false) registerService.storeText(
vimEditor,
context,
vimEditor.primaryCaret(),
editor.rangeOf("|found|", 2),
SelectionType.BLOCK_WISE,
false
)
typeText(injector.parser.parseKeys("V" + "p")) typeText(injector.parser.parseKeys("V" + "p"))
val after = """ val after = """
A Discovery A Discovery
@ -1348,7 +1481,14 @@ class PutVisualTextActionTest : VimTestCase() {
val context = injector.executionContextManager.getEditorExecutionContext(vimEditor) val context = injector.executionContextManager.getEditorExecutionContext(vimEditor)
val registerService = injector.registerGroup val registerService = injector.registerGroup
registerService.storeText(vimEditor, context, vimEditor.primaryCaret(), editor.rangeOf("|found|", 2), SelectionType.BLOCK_WISE, false) registerService.storeText(
vimEditor,
context,
vimEditor.primaryCaret(),
editor.rangeOf("|found|", 2),
SelectionType.BLOCK_WISE,
false
)
typeText(injector.parser.parseKeys("V" + "2p")) typeText(injector.parser.parseKeys("V" + "2p"))
val after = """ val after = """
A Discovery A Discovery
@ -1409,7 +1549,7 @@ class PutVisualTextActionTest : VimTestCase() {
configureByText(before) configureByText(before)
val vimEditor = fixture.editor.vim val vimEditor = fixture.editor.vim
val context = injector.executionContextManager.getEditorExecutionContext(vimEditor) val context = injector.executionContextManager.getEditorExecutionContext(vimEditor)
injector.registerGroup.storeText(vimEditor, context,'+', "|found|\n|l roc|\n|ere i|", SelectionType.BLOCK_WISE) injector.registerGroup.storeText(vimEditor, context, '+', "|found|\n|l roc|\n|ere i|", SelectionType.BLOCK_WISE)
typeText(injector.parser.parseKeys("V" + "\"+p")) typeText(injector.parser.parseKeys("V" + "\"+p"))
val after = """ val after = """
A Discovery A Discovery
@ -1472,7 +1612,7 @@ class PutVisualTextActionTest : VimTestCase() {
configureByText(before) configureByText(before)
val vimEditor = fixture.editor.vim val vimEditor = fixture.editor.vim
val context = injector.executionContextManager.getEditorExecutionContext(vimEditor) val context = injector.executionContextManager.getEditorExecutionContext(vimEditor)
injector.registerGroup.storeText(vimEditor, context,'+', "|found|\n|l roc|\n|ere i|", SelectionType.BLOCK_WISE) injector.registerGroup.storeText(vimEditor, context, '+', "|found|\n|l roc|\n|ere i|", SelectionType.BLOCK_WISE)
typeText(injector.parser.parseKeys("V" + "\"+p")) typeText(injector.parser.parseKeys("V" + "\"+p"))
val after = """ val after = """
A Discovery A Discovery
@ -1532,7 +1672,14 @@ class PutVisualTextActionTest : VimTestCase() {
val context = injector.executionContextManager.getEditorExecutionContext(vimEditor) val context = injector.executionContextManager.getEditorExecutionContext(vimEditor)
val registerService = injector.registerGroup val registerService = injector.registerGroup
registerService.storeText(vimEditor, context, vimEditor.primaryCaret(), before rangeOf "Discovery", SelectionType.CHARACTER_WISE, false) registerService.storeText(
vimEditor,
context,
vimEditor.primaryCaret(),
before rangeOf "Discovery",
SelectionType.CHARACTER_WISE,
false
)
typeText(injector.parser.parseKeys("<C-V>2e2j" + "p")) typeText(injector.parser.parseKeys("<C-V>2e2j" + "p"))
val after = """ val after = """
A Discovery A Discovery
@ -1562,7 +1709,14 @@ class PutVisualTextActionTest : VimTestCase() {
val context = injector.executionContextManager.getEditorExecutionContext(vimEditor) val context = injector.executionContextManager.getEditorExecutionContext(vimEditor)
val registerService = injector.registerGroup val registerService = injector.registerGroup
registerService.storeText(vimEditor, context, vimEditor.primaryCaret(), before rangeOf "Discovery", SelectionType.CHARACTER_WISE, false) registerService.storeText(
vimEditor,
context,
vimEditor.primaryCaret(),
before rangeOf "Discovery",
SelectionType.CHARACTER_WISE,
false
)
typeText(injector.parser.parseKeys("<C-V>3e2k" + "p")) typeText(injector.parser.parseKeys("<C-V>3e2k" + "p"))
val after = """ val after = """
A Discovery A Discovery
@ -1592,7 +1746,14 @@ class PutVisualTextActionTest : VimTestCase() {
val context = injector.executionContextManager.getEditorExecutionContext(vimEditor) val context = injector.executionContextManager.getEditorExecutionContext(vimEditor)
val registerService = injector.registerGroup val registerService = injector.registerGroup
registerService.storeText(vimEditor, context, vimEditor.primaryCaret(), before rangeOf "Discovery", SelectionType.CHARACTER_WISE, false) registerService.storeText(
vimEditor,
context,
vimEditor.primaryCaret(),
before rangeOf "Discovery",
SelectionType.CHARACTER_WISE,
false
)
typeText(injector.parser.parseKeys("<C-V>2e2j" + "2p")) typeText(injector.parser.parseKeys("<C-V>2e2j" + "2p"))
val after = """ val after = """
A Discovery A Discovery
@ -1622,7 +1783,14 @@ class PutVisualTextActionTest : VimTestCase() {
val context = injector.executionContextManager.getEditorExecutionContext(vimEditor) val context = injector.executionContextManager.getEditorExecutionContext(vimEditor)
val registerService = injector.registerGroup val registerService = injector.registerGroup
registerService.storeText(vimEditor, context, vimEditor.primaryCaret(), before rangeOf "Discovery", SelectionType.CHARACTER_WISE, false) registerService.storeText(
vimEditor,
context,
vimEditor.primaryCaret(),
before rangeOf "Discovery",
SelectionType.CHARACTER_WISE,
false
)
typeText(injector.parser.parseKeys("<C-V>3j$" + "p")) typeText(injector.parser.parseKeys("<C-V>3j$" + "p"))
val after = """ val after = """
A Discovery A Discovery
@ -1665,7 +1833,14 @@ class PutVisualTextActionTest : VimTestCase() {
val context = injector.executionContextManager.getEditorExecutionContext(vimEditor) val context = injector.executionContextManager.getEditorExecutionContext(vimEditor)
val registerService = injector.registerGroup val registerService = injector.registerGroup
registerService.storeText(vimEditor, context, vimEditor.primaryCaret(), before rangeOf "A Discovery\n", SelectionType.LINE_WISE, false) registerService.storeText(
vimEditor,
context,
vimEditor.primaryCaret(),
before rangeOf "A Discovery\n",
SelectionType.LINE_WISE,
false
)
typeText(injector.parser.parseKeys("<C-V>2e2j" + "p")) typeText(injector.parser.parseKeys("<C-V>2e2j" + "p"))
val after = """ val after = """
A Discovery A Discovery
@ -1697,7 +1872,14 @@ class PutVisualTextActionTest : VimTestCase() {
val context = injector.executionContextManager.getEditorExecutionContext(vimEditor) val context = injector.executionContextManager.getEditorExecutionContext(vimEditor)
val registerService = injector.registerGroup val registerService = injector.registerGroup
registerService.storeText(vimEditor, context, vimEditor.primaryCaret(), before rangeOf "A Discovery\n", SelectionType.LINE_WISE, false) registerService.storeText(
vimEditor,
context,
vimEditor.primaryCaret(),
before rangeOf "A Discovery\n",
SelectionType.LINE_WISE,
false
)
typeText(injector.parser.parseKeys("<C-V>2e2j" + "P")) typeText(injector.parser.parseKeys("<C-V>2e2j" + "P"))
val after = """ val after = """
A Discovery A Discovery
@ -1740,7 +1922,14 @@ class PutVisualTextActionTest : VimTestCase() {
val context = injector.executionContextManager.getEditorExecutionContext(vimEditor) val context = injector.executionContextManager.getEditorExecutionContext(vimEditor)
val registerService = injector.registerGroup val registerService = injector.registerGroup
registerService.storeText(vimEditor, context, vimEditor.primaryCaret(), before rangeOf "A Discovery\n", SelectionType.LINE_WISE, false) registerService.storeText(
vimEditor,
context,
vimEditor.primaryCaret(),
before rangeOf "A Discovery\n",
SelectionType.LINE_WISE,
false
)
typeText(injector.parser.parseKeys("<C-V>2e2j" + "2p")) typeText(injector.parser.parseKeys("<C-V>2e2j" + "2p"))
val after = """ val after = """
A Discovery A Discovery
@ -1784,7 +1973,14 @@ class PutVisualTextActionTest : VimTestCase() {
val context = injector.executionContextManager.getEditorExecutionContext(vimEditor) val context = injector.executionContextManager.getEditorExecutionContext(vimEditor)
val registerService = injector.registerGroup val registerService = injector.registerGroup
registerService.storeText(vimEditor, context, vimEditor.primaryCaret(), before rangeOf "A Discovery\n", SelectionType.LINE_WISE, false) registerService.storeText(
vimEditor,
context,
vimEditor.primaryCaret(),
before rangeOf "A Discovery\n",
SelectionType.LINE_WISE,
false
)
typeText(injector.parser.parseKeys("<C-V>2e3j" + "p")) typeText(injector.parser.parseKeys("<C-V>2e3j" + "p"))
val after = """ val after = """
A Discovery A Discovery
@ -1827,7 +2023,14 @@ class PutVisualTextActionTest : VimTestCase() {
val context = injector.executionContextManager.getEditorExecutionContext(vimEditor) val context = injector.executionContextManager.getEditorExecutionContext(vimEditor)
val registerService = injector.registerGroup val registerService = injector.registerGroup
registerService.storeText(vimEditor, context, vimEditor.primaryCaret(), before rangeOf "A Discovery\n", SelectionType.LINE_WISE, false) registerService.storeText(
vimEditor,
context,
vimEditor.primaryCaret(),
before rangeOf "A Discovery\n",
SelectionType.LINE_WISE,
false
)
typeText(injector.parser.parseKeys("<C-V>2j$" + "p")) typeText(injector.parser.parseKeys("<C-V>2j$" + "p"))
val after = """ val after = """
A Discovery A Discovery
@ -1866,7 +2069,14 @@ class PutVisualTextActionTest : VimTestCase() {
val context = injector.executionContextManager.getEditorExecutionContext(vimEditor) val context = injector.executionContextManager.getEditorExecutionContext(vimEditor)
val registerService = injector.registerGroup val registerService = injector.registerGroup
registerService.storeText(vimEditor, context, vimEditor.primaryCaret(), editor.rangeOf("|found|", 2), SelectionType.BLOCK_WISE, false) registerService.storeText(
vimEditor,
context,
vimEditor.primaryCaret(),
editor.rangeOf("|found|", 2),
SelectionType.BLOCK_WISE,
false
)
typeText(injector.parser.parseKeys("<C-V>2e2j" + "p")) typeText(injector.parser.parseKeys("<C-V>2e2j" + "p"))
val after = """ val after = """
A Discovery A Discovery
@ -1906,7 +2116,14 @@ class PutVisualTextActionTest : VimTestCase() {
val context = injector.executionContextManager.getEditorExecutionContext(vimEditor) val context = injector.executionContextManager.getEditorExecutionContext(vimEditor)
val registerService = injector.registerGroup val registerService = injector.registerGroup
registerService.storeText(vimEditor, context, vimEditor.primaryCaret(), editor.rangeOf("|found|", 2), SelectionType.BLOCK_WISE, false) registerService.storeText(
vimEditor,
context,
vimEditor.primaryCaret(),
editor.rangeOf("|found|", 2),
SelectionType.BLOCK_WISE,
false
)
typeText(injector.parser.parseKeys("<C-V>2e3j" + "p")) typeText(injector.parser.parseKeys("<C-V>2e3j" + "p"))
val after = """ val after = """
A Discovery A Discovery
@ -1946,7 +2163,14 @@ class PutVisualTextActionTest : VimTestCase() {
val context = injector.executionContextManager.getEditorExecutionContext(vimEditor) val context = injector.executionContextManager.getEditorExecutionContext(vimEditor)
val registerService = injector.registerGroup val registerService = injector.registerGroup
registerService.storeText(vimEditor, context, vimEditor.primaryCaret(), editor.rangeOf("|found|", 2), SelectionType.BLOCK_WISE, false) registerService.storeText(
vimEditor,
context,
vimEditor.primaryCaret(),
editor.rangeOf("|found|", 2),
SelectionType.BLOCK_WISE,
false
)
typeText(injector.parser.parseKeys("<C-V>2ej" + "p")) typeText(injector.parser.parseKeys("<C-V>2ej" + "p"))
val after = """ val after = """
A Discovery A Discovery
@ -1985,7 +2209,14 @@ class PutVisualTextActionTest : VimTestCase() {
val context = injector.executionContextManager.getEditorExecutionContext(vimEditor) val context = injector.executionContextManager.getEditorExecutionContext(vimEditor)
val registerService = injector.registerGroup val registerService = injector.registerGroup
registerService.storeText(vimEditor, context, vimEditor.primaryCaret(), editor.rangeOf("|found|", 2), SelectionType.BLOCK_WISE, false) registerService.storeText(
vimEditor,
context,
vimEditor.primaryCaret(),
editor.rangeOf("|found|", 2),
SelectionType.BLOCK_WISE,
false
)
typeText(injector.parser.parseKeys("<C-V>elj" + "p")) typeText(injector.parser.parseKeys("<C-V>elj" + "p"))
val after = """ val after = """
A Discovery A Discovery
@ -2026,7 +2257,14 @@ class PutVisualTextActionTest : VimTestCase() {
val context = injector.executionContextManager.getEditorExecutionContext(vimEditor) val context = injector.executionContextManager.getEditorExecutionContext(vimEditor)
val registerService = injector.registerGroup val registerService = injector.registerGroup
registerService.storeText(vimEditor, context, vimEditor.primaryCaret(), editor.rangeOf("|found|", 2), SelectionType.BLOCK_WISE, false) registerService.storeText(
vimEditor,
context,
vimEditor.primaryCaret(),
editor.rangeOf("|found|", 2),
SelectionType.BLOCK_WISE,
false
)
typeText(injector.parser.parseKeys("<C-V>2j$" + "p")) typeText(injector.parser.parseKeys("<C-V>2j$" + "p"))
val after = """ val after = """
A Discovery A Discovery

View File

@ -34,7 +34,14 @@ class PutVisualTextMoveCursorActionTest : VimTestCase() {
val vimEditor = editor.vim val vimEditor = editor.vim
val context = injector.executionContextManager.getEditorExecutionContext(vimEditor) val context = injector.executionContextManager.getEditorExecutionContext(vimEditor)
val registerService = injector.registerGroup val registerService = injector.registerGroup
registerService.storeText(vimEditor, context, vimEditor.primaryCaret(), TextRange(16, 25), SelectionType.CHARACTER_WISE, false) registerService.storeText(
vimEditor,
context,
vimEditor.primaryCaret(),
TextRange(16, 25),
SelectionType.CHARACTER_WISE,
false
)
typeText(injector.parser.parseKeys("v2e" + "2gp")) typeText(injector.parser.parseKeys("v2e" + "2gp"))
val after = "legendarylegendary$c in a legendary land" val after = "legendarylegendary$c in a legendary land"
assertState(after) assertState(after)
@ -48,7 +55,14 @@ class PutVisualTextMoveCursorActionTest : VimTestCase() {
val vimEditor = editor.vim val vimEditor = editor.vim
val context = injector.executionContextManager.getEditorExecutionContext(vimEditor) val context = injector.executionContextManager.getEditorExecutionContext(vimEditor)
val registerService = injector.registerGroup val registerService = injector.registerGroup
registerService.storeText(vimEditor, context, vimEditor.primaryCaret(), TextRange(16, 25), SelectionType.LINE_WISE, false) registerService.storeText(
vimEditor,
context,
vimEditor.primaryCaret(),
TextRange(16, 25),
SelectionType.LINE_WISE,
false
)
typeText(injector.parser.parseKeys("v2e" + "gp")) typeText(injector.parser.parseKeys("v2e" + "gp"))
val after = """ val after = """
@ -66,7 +80,14 @@ class PutVisualTextMoveCursorActionTest : VimTestCase() {
val vimEditor = editor.vim val vimEditor = editor.vim
val context = injector.executionContextManager.getEditorExecutionContext(vimEditor) val context = injector.executionContextManager.getEditorExecutionContext(vimEditor)
val registerService = injector.registerGroup val registerService = injector.registerGroup
registerService.storeText(vimEditor, context, vimEditor.primaryCaret(), TextRange(16, 25), SelectionType.CHARACTER_WISE, false) registerService.storeText(
vimEditor,
context,
vimEditor.primaryCaret(),
TextRange(16, 25),
SelectionType.CHARACTER_WISE,
false
)
typeText(injector.parser.parseKeys("V" + "gp")) typeText(injector.parser.parseKeys("V" + "gp"))
val after = "legendary\n$c" val after = "legendary\n$c"
assertState(after) assertState(after)
@ -95,7 +116,14 @@ class PutVisualTextMoveCursorActionTest : VimTestCase() {
val vimEditor = editor.vim val vimEditor = editor.vim
val context = injector.executionContextManager.getEditorExecutionContext(vimEditor) val context = injector.executionContextManager.getEditorExecutionContext(vimEditor)
val registerService = injector.registerGroup val registerService = injector.registerGroup
registerService.storeText(vimEditor, context, vimEditor.primaryCaret(), TextRange(2, 11), SelectionType.LINE_WISE, false) registerService.storeText(
vimEditor,
context,
vimEditor.primaryCaret(),
TextRange(2, 11),
SelectionType.LINE_WISE,
false
)
typeText(injector.parser.parseKeys("V" + "gp")) typeText(injector.parser.parseKeys("V" + "gp"))
assertState(newFile) assertState(newFile)
} }
@ -143,7 +171,14 @@ class PutVisualTextMoveCursorActionTest : VimTestCase() {
val vimEditor = editor.vim val vimEditor = editor.vim
val context = injector.executionContextManager.getEditorExecutionContext(vimEditor) val context = injector.executionContextManager.getEditorExecutionContext(vimEditor)
val registerService = injector.registerGroup val registerService = injector.registerGroup
registerService.storeText(vimEditor, context, vimEditor.primaryCaret(), TextRange(16, 25), SelectionType.LINE_WISE, false) registerService.storeText(
vimEditor,
context,
vimEditor.primaryCaret(),
TextRange(16, 25),
SelectionType.LINE_WISE,
false
)
typeText(injector.parser.parseKeys("v2e" + "gP")) typeText(injector.parser.parseKeys("v2e" + "gP"))
val after = """ val after = """
@ -161,7 +196,14 @@ class PutVisualTextMoveCursorActionTest : VimTestCase() {
val vimEditor = editor.vim val vimEditor = editor.vim
val context = injector.executionContextManager.getEditorExecutionContext(vimEditor) val context = injector.executionContextManager.getEditorExecutionContext(vimEditor)
val registerService = injector.registerGroup val registerService = injector.registerGroup
registerService.storeText(vimEditor, context, vimEditor.primaryCaret(), TextRange(16, 25), SelectionType.CHARACTER_WISE, false) registerService.storeText(
vimEditor,
context,
vimEditor.primaryCaret(),
TextRange(16, 25),
SelectionType.CHARACTER_WISE,
false
)
typeText(injector.parser.parseKeys("v2e" + "2gP")) typeText(injector.parser.parseKeys("v2e" + "2gP"))
val after = "legendarylegendary$c in a legendary land" val after = "legendarylegendary$c in a legendary land"
assertState(after) assertState(after)
@ -175,7 +217,14 @@ class PutVisualTextMoveCursorActionTest : VimTestCase() {
val vimEditor = editor.vim val vimEditor = editor.vim
val context = injector.executionContextManager.getEditorExecutionContext(vimEditor) val context = injector.executionContextManager.getEditorExecutionContext(vimEditor)
val registerService = injector.registerGroup val registerService = injector.registerGroup
registerService.storeText(vimEditor, context, vimEditor.primaryCaret(), TextRange(16, 25), SelectionType.CHARACTER_WISE, false) registerService.storeText(
vimEditor,
context,
vimEditor.primaryCaret(),
TextRange(16, 25),
SelectionType.CHARACTER_WISE,
false
)
typeText(injector.parser.parseKeys("v$" + "2gP")) typeText(injector.parser.parseKeys("v$" + "2gP"))
val after = "legendarylegendar${c}y" val after = "legendarylegendar${c}y"
assertState(after) assertState(after)
@ -189,7 +238,14 @@ class PutVisualTextMoveCursorActionTest : VimTestCase() {
val vimEditor = editor.vim val vimEditor = editor.vim
val context = injector.executionContextManager.getEditorExecutionContext(vimEditor) val context = injector.executionContextManager.getEditorExecutionContext(vimEditor)
val registerService = injector.registerGroup val registerService = injector.registerGroup
registerService.storeText(vimEditor, context, vimEditor.primaryCaret(), TextRange(16, 25), SelectionType.CHARACTER_WISE, false) registerService.storeText(
vimEditor,
context,
vimEditor.primaryCaret(),
TextRange(16, 25),
SelectionType.CHARACTER_WISE,
false
)
typeText(injector.parser.parseKeys("V" + "gP")) typeText(injector.parser.parseKeys("V" + "gP"))
val after = "legendary\n$c" val after = "legendary\n$c"
assertState(after) assertState(after)
@ -294,7 +350,14 @@ class PutVisualTextMoveCursorActionTest : VimTestCase() {
val vimEditor = editor.vim val vimEditor = editor.vim
val context = injector.executionContextManager.getEditorExecutionContext(vimEditor) val context = injector.executionContextManager.getEditorExecutionContext(vimEditor)
val registerService = injector.registerGroup val registerService = injector.registerGroup
registerService.storeText(vimEditor, context, vimEditor.primaryCaret(), TextRange(16, 19), SelectionType.BLOCK_WISE, false) registerService.storeText(
vimEditor,
context,
vimEditor.primaryCaret(),
TextRange(16, 19),
SelectionType.BLOCK_WISE,
false
)
typeText(injector.parser.parseKeys("<S-v>" + "gp")) typeText(injector.parser.parseKeys("<S-v>" + "gp"))
val after = """ val after = """
${c}fgh ${c}fgh
@ -322,7 +385,14 @@ class PutVisualTextMoveCursorActionTest : VimTestCase() {
val vimEditor = editor.vim val vimEditor = editor.vim
val context = injector.executionContextManager.getEditorExecutionContext(vimEditor) val context = injector.executionContextManager.getEditorExecutionContext(vimEditor)
val registerService = injector.registerGroup val registerService = injector.registerGroup
registerService.storeText(vimEditor, context, vimEditor.primaryCaret(), TextRange(16, 19), SelectionType.LINE_WISE, false) registerService.storeText(
vimEditor,
context,
vimEditor.primaryCaret(),
TextRange(16, 19),
SelectionType.LINE_WISE,
false
)
typeText(injector.parser.parseKeys("<C-v>" + "h" + "gp")) typeText(injector.parser.parseKeys("<C-v>" + "h" + "gp"))
val after = """ val after = """
q q
@ -345,7 +415,14 @@ class PutVisualTextMoveCursorActionTest : VimTestCase() {
val vimEditor = editor.vim val vimEditor = editor.vim
val context = injector.executionContextManager.getEditorExecutionContext(vimEditor) val context = injector.executionContextManager.getEditorExecutionContext(vimEditor)
val registerService = injector.registerGroup val registerService = injector.registerGroup
registerService.storeText(vimEditor, context, vimEditor.primaryCaret(), TextRange(16, 19), SelectionType.CHARACTER_WISE, false) registerService.storeText(
vimEditor,
context,
vimEditor.primaryCaret(),
TextRange(16, 19),
SelectionType.CHARACTER_WISE,
false
)
typeText(injector.parser.parseKeys("v2e" + "2gp")) typeText(injector.parser.parseKeys("v2e" + "2gp"))
val after = "fghfgh$c fghfgh$c fghfgh$c" val after = "fghfgh$c fghfgh$c fghfgh$c"
assertState(after) assertState(after)

View File

@ -64,7 +64,12 @@ class YankAndPutTest : VimTestCase() {
) )
} }
@OptionTest(VimOption(TestOptionConstants.clipboard, limitedValues = [OptionConstants.clipboard_unnamedplus + "," + OptionConstants.clipboard_ideaput])) @OptionTest(
VimOption(
TestOptionConstants.clipboard,
limitedValues = [OptionConstants.clipboard_unnamedplus + "," + OptionConstants.clipboard_ideaput]
)
)
fun `test yank to number register with unnamedplus and ideaput`() { fun `test yank to number register with unnamedplus and ideaput`() {
val before = """ val before = """
I ${c}found it in a legendary land I ${c}found it in a legendary land
@ -86,7 +91,12 @@ class YankAndPutTest : VimTestCase() {
) )
} }
@OptionTest(VimOption(TestOptionConstants.clipboard, limitedValues = [OptionConstants.clipboard_unnamed + "," + OptionConstants.clipboard_ideaput])) @OptionTest(
VimOption(
TestOptionConstants.clipboard,
limitedValues = [OptionConstants.clipboard_unnamed + "," + OptionConstants.clipboard_ideaput]
)
)
@TestWithoutPrimaryClipboard @TestWithoutPrimaryClipboard
fun `test yank to number register with unnamed and ideaput`() { fun `test yank to number register with unnamed and ideaput`() {
val before = """ val before = """

View File

@ -28,7 +28,8 @@ class YankMotionActionTest : VimTestCase() {
val vimEditor = fixture.editor.vim val vimEditor = fixture.editor.vim
val context = injector.executionContextManager.getEditorExecutionContext(vimEditor) val context = injector.executionContextManager.getEditorExecutionContext(vimEditor)
val registerService = injector.registerGroup val registerService = injector.registerGroup
val text = registerService.getRegister(vimEditor, context, registerService.lastRegisterChar)?.text ?: kotlin.test.fail() val text =
registerService.getRegister(vimEditor, context, registerService.lastRegisterChar)?.text ?: kotlin.test.fail()
kotlin.test.assertEquals("and", text) kotlin.test.assertEquals("and", text)
} }
@ -127,7 +128,8 @@ class YankMotionActionTest : VimTestCase() {
val vimEditor = fixture.editor.vim val vimEditor = fixture.editor.vim
val context = injector.executionContextManager.getEditorExecutionContext(vimEditor) val context = injector.executionContextManager.getEditorExecutionContext(vimEditor)
val registerService = injector.registerGroup val registerService = injector.registerGroup
val text = registerService.getRegister(vimEditor, context, registerService.lastRegisterChar)?.text ?: kotlin.test.fail() val text =
registerService.getRegister(vimEditor, context, registerService.lastRegisterChar)?.text ?: kotlin.test.fail()
kotlin.test.assertEquals("", text) kotlin.test.assertEquals("", text)
} }
@ -147,7 +149,8 @@ class YankMotionActionTest : VimTestCase() {
val vimEditor = fixture.editor.vim val vimEditor = fixture.editor.vim
val context = injector.executionContextManager.getEditorExecutionContext(vimEditor) val context = injector.executionContextManager.getEditorExecutionContext(vimEditor)
val registerService = injector.registerGroup val registerService = injector.registerGroup
val text = registerService.getRegister(vimEditor, context, registerService.lastRegisterChar)?.text ?: kotlin.test.fail() val text =
registerService.getRegister(vimEditor, context, registerService.lastRegisterChar)?.text ?: kotlin.test.fail()
kotlin.test.assertEquals("legendary", text) kotlin.test.assertEquals("legendary", text)
} }
@ -185,7 +188,8 @@ class YankMotionActionTest : VimTestCase() {
val vimEditor = fixture.editor.vim val vimEditor = fixture.editor.vim
val context = injector.executionContextManager.getEditorExecutionContext(vimEditor) val context = injector.executionContextManager.getEditorExecutionContext(vimEditor)
val registerService = injector.registerGroup val registerService = injector.registerGroup
val text = registerService.getRegister(vimEditor, context, registerService.lastRegisterChar)?.text ?: kotlin.test.fail() val text =
registerService.getRegister(vimEditor, context, registerService.lastRegisterChar)?.text ?: kotlin.test.fail()
kotlin.test.assertEquals("hard by the torrent of a mountain pass.\n", text) kotlin.test.assertEquals("hard by the torrent of a mountain pass.\n", text)
} }

View File

@ -38,7 +38,8 @@ class YankVisualLinesActionTest : VimTestCase() {
val vimEditor = fixture.editor.vim val vimEditor = fixture.editor.vim
val context = injector.executionContextManager.getEditorExecutionContext(vimEditor) val context = injector.executionContextManager.getEditorExecutionContext(vimEditor)
val registerService = injector.registerGroup val registerService = injector.registerGroup
val savedText = registerService.getRegister(vimEditor, context, registerService.lastRegisterChar)?.text ?: kotlin.test.fail() val savedText =
registerService.getRegister(vimEditor, context, registerService.lastRegisterChar)?.text ?: kotlin.test.fail()
kotlin.test.assertEquals(yankedTest, savedText) kotlin.test.assertEquals(yankedTest, savedText)
} }
@ -69,7 +70,8 @@ class YankVisualLinesActionTest : VimTestCase() {
val vimEditor = fixture.editor.vim val vimEditor = fixture.editor.vim
val context = injector.executionContextManager.getEditorExecutionContext(vimEditor) val context = injector.executionContextManager.getEditorExecutionContext(vimEditor)
val registerService = injector.registerGroup val registerService = injector.registerGroup
val savedText = registerService.getRegister(vimEditor, context, registerService.lastRegisterChar)?.text ?: kotlin.test.fail() val savedText =
registerService.getRegister(vimEditor, context, registerService.lastRegisterChar)?.text ?: kotlin.test.fail()
kotlin.test.assertEquals(yankedTest, savedText) kotlin.test.assertEquals(yankedTest, savedText)
} }
@ -93,7 +95,8 @@ class YankVisualLinesActionTest : VimTestCase() {
val vimEditor = fixture.editor.vim val vimEditor = fixture.editor.vim
val context = injector.executionContextManager.getEditorExecutionContext(vimEditor) val context = injector.executionContextManager.getEditorExecutionContext(vimEditor)
val registerService = injector.registerGroup val registerService = injector.registerGroup
val savedText = registerService.getRegister(vimEditor, context, registerService.lastRegisterChar)?.text ?: kotlin.test.fail() val savedText =
registerService.getRegister(vimEditor, context, registerService.lastRegisterChar)?.text ?: kotlin.test.fail()
kotlin.test.assertEquals(yankedTest, savedText) kotlin.test.assertEquals(yankedTest, savedText)
} }
} }

View File

@ -38,7 +38,7 @@ class SearchWholeWordForwardActionTest : VimTestCase() {
@VimBehaviorDiffers( @VimBehaviorDiffers(
originalVimAfter = originalVimAfter =
""" """
I found it in a legendary land I found it in a legendary land
all rocks and lavender and tufted grass, all rocks and lavender and tufted grass,
where it was settled on some sodden sand where it was settled on some sodden sand

View File

@ -30,7 +30,7 @@ class MotionSentenceNextStartActionTest : VimTestCase() {
Cras id tellus in Cras id tellus in
""".trimIndent(), """.trimIndent(),
Mode.INSERT, Mode.INSERT,
) )
} }
} }

Some files were not shown because too many files have changed in this diff Show More