1
0
mirror of https://github.com/chylex/IntelliJ-IdeaVim.git synced 2025-08-19 04:24:56 +02:00

Compare commits

...

58 Commits
0.34 ... 0.35

Author SHA1 Message Date
Andrey Vlasovskikh
3750417323 Bumped version to 0.35 2014-05-15 15:09:02 +04:00
Andrey Vlasovskikh
d7bfb1ff10 Updated CHANGES 2014-05-15 15:04:12 +04:00
Andrey Vlasovskikh
1797771527 Added configuration via ~/.ideavimrc to the list of plugin features 2014-05-15 14:58:40 +04:00
Andrey Vlasovskikh
e564eb5878 VIM-213 Use '< and '> marks for saving and restoring last visual selection 2014-05-15 02:49:50 +04:00
Andrey Vlasovskikh
9cd620af58 VIM-646 Don't update visual selection if command moves caret and exits visual mode 2014-05-12 21:50:50 +04:00
Andrey Vlasovskikh
1414ef8a4f Removed check for unused FLAG_KEEP_VISUAL flag 2014-05-12 20:06:46 +04:00
Andrey Vlasovskikh
110623f6ef Moved StringHelper.parseKeysSet() to VimCommandAction 2014-05-12 20:04:32 +04:00
Andrey Vlasovskikh
0887c72486 Updated index docs for all the visual mode commands 2014-05-12 20:00:17 +04:00
Andrey Vlasovskikh
a516fd880e Made visual-only mode actions VimCommandActions 2014-05-12 19:28:24 +04:00
Andrey Vlasovskikh
50e15112d6 Use SelectionType in VisualRange instead of SubMode 2014-05-08 17:40:04 +04:00
Andrey Vlasovskikh
8b6f99385a Code style 2014-05-08 17:31:38 +04:00
Andrey Vlasovskikh
2d1b40f00c Added tests for 'gv' and 'o' in visual mode 2014-05-08 16:59:11 +04:00
Andrey Vlasovskikh
2fc2f30055 Removed debug output 2014-05-08 15:49:21 +04:00
Andrey Vlasovskikh
2094a19723 Extracted MarkGroup.setVisualSelectionMarks() 2014-05-08 02:02:38 +04:00
Andrey Vlasovskikh
5b1416424d VisualSelectPreviousAction is a VimCommandAction 2014-05-08 00:43:40 +04:00
Andrey Vlasovskikh
8b9e737c05 Fixed potential NPEs 2014-05-07 22:36:37 +04:00
Andrey Vlasovskikh
cc0f4acec6 Replaced StringBuilder with string concatenation 2014-05-07 22:36:26 +04:00
Andrey Vlasovskikh
30884162a0 Nullity annotations 2014-05-07 22:28:42 +04:00
Andrey Vlasovskikh
f1e7a8c444 Removed unused code 2014-05-07 22:22:24 +04:00
Andrey Vlasovskikh
3271939c87 Simplified conditions 2014-05-07 22:20:00 +04:00
Andrey Vlasovskikh
c9cb487cbc Replaced StringBuilder with string concatenation where possible 2014-05-07 22:17:37 +04:00
Andrey Vlasovskikh
56f6b69adf Use Collections.addAll() 2014-05-07 22:16:42 +04:00
Andrey Vlasovskikh
77dcee1269 Use foreach loop 2014-05-07 22:15:50 +04:00
Andrey Vlasovskikh
c9068ee4d1 Replaced StringBuffer with StringBuilder 2014-05-07 22:15:25 +04:00
Andrey Vlasovskikh
e7addf7fa8 Added 'final' modifiers for fields where possible 2014-05-07 22:12:47 +04:00
Andrey Vlasovskikh
7cc0a8db92 Inlined constant arguments 2014-05-07 22:05:40 +04:00
Andrey Vlasovskikh
bccb62a84f Inlined redundant local variables 2014-05-07 21:55:13 +04:00
Andrey Vlasovskikh
d47570664b Simplified conditions 2014-05-07 21:53:55 +04:00
Andrey Vlasovskikh
a7137558cc Removed unnecessary semicolons 2014-05-07 21:52:38 +04:00
Andrey Vlasovskikh
0251c5a33d Made constants final 2014-05-07 21:52:11 +04:00
Andrey Vlasovskikh
365722ef7e Removed redundant casts 2014-05-07 21:50:17 +04:00
Andrey Vlasovskikh
77e0c30e57 Removed unused assignments and empty conditions 2014-05-07 21:49:29 +04:00
Andrey Vlasovskikh
8a0cad765a Fixed potential NPEs 2014-05-07 21:38:21 +04:00
Andrey Vlasovskikh
272378b800 Fixed typos and dropped commented code 2014-05-07 21:00:16 +04:00
Andrey Vlasovskikh
a34d17ff95 Fixed potential NPEs 2014-05-07 20:46:40 +04:00
Andrey Vlasovskikh
82c782e9f0 Cleanup 2014-05-07 19:40:55 +04:00
Andrey Vlasovskikh
b7b46d2fee Removed unused code 2014-05-07 19:25:30 +04:00
Andrey Vlasovskikh
8916f0f314 Extracted more EventFacade methods 2014-05-06 20:32:42 +04:00
Andrey Vlasovskikh
8d727ef508 Extracted EventFacade.(un)registerCustomShortcutSet() 2014-05-06 19:44:35 +04:00
Andrey Vlasovskikh
fd0be10492 Extracted EventFacade.addEditorFactoryListener() 2014-05-06 19:33:35 +04:00
Andrey Vlasovskikh
a810f95101 Extracted EventFacade.*DocumentListener() 2014-05-06 19:26:36 +04:00
Andrey Vlasovskikh
8857545cf0 Introduced EventFacade for subscribing to IDE events 2014-05-06 19:18:47 +04:00
Andrey Vlasovskikh
2300c0005f Inferred nullity annotations 2014-05-06 18:32:55 +04:00
Andrey Vlasovskikh
827b91286f Removed unused DelegateCommandListener
There are no more actions marked with Command.FLAG_DELEGATE.
2014-05-06 18:04:38 +04:00
Andrey Vlasovskikh
4d8e35655d Extracted and inlined some variables 2014-05-06 17:34:53 +04:00
Andrey Vlasovskikh
f7e6ae9f3c Removed unused code 2014-05-06 17:15:34 +04:00
Andrey Vlasovskikh
67679843b4 Moved getShortcutKeyAction() to VimShortcutKeyAction.getInstance() 2014-05-06 17:09:12 +04:00
Andrey Vlasovskikh
b67b072be2 Updated CHANGES 2014-05-06 15:35:03 +04:00
Andrey Vlasovskikh
d6896e4e76 VIM-690 Read initialization commands only from ~/.ideavimrc 2014-05-06 15:20:40 +04:00
Andrey Vlasovskikh
f86c24a695 VIM-683 Allow Ctrl+PgUp/PgDown to be used outside of Vim emulation 2014-05-06 14:56:10 +04:00
Andrey Vlasovskikh
b200c842b4 VIM-679 Allow \u000D\u000C as <CR> in mappings 2014-05-05 21:26:35 +04:00
Andrey Vlasovskikh
c8df52a86c VIM-679 Allow \u0016 as an escape character for '|' in mappings 2014-05-05 20:51:39 +04:00
Andrey Vlasovskikh
b17a592c95 VIM-679 Parse characters less than \u0020 as <C-$CHAR> 2014-05-05 20:40:14 +04:00
Andrey Vlasovskikh
f71d6c7fab VIM-679 Don't trim whitespace-like characters from command arguments
Characters like '\u0018' may appear in mapping commands.
2014-04-30 21:08:16 +04:00
Andrey Vlasovskikh
30cfae91c0 Removed StringHelper.escape() in favor of updated toKeyNotation() 2014-04-30 20:10:33 +04:00
Andrey Vlasovskikh
5332128852 Extracted toEscapeNotation() 2014-04-30 19:39:04 +04:00
Andrey Vlasovskikh
b593d90dff VIM-676 Handle control characters in .vimrc as pressed, not typed keystrokes 2014-04-30 18:46:45 +04:00
Andrey Vlasovskikh
02fac3b931 Extracted executeText() 2014-04-30 17:36:18 +04:00
159 changed files with 2467 additions and 1815 deletions

View File

@@ -3,6 +3,29 @@ The Changelog
History of changes in IdeaVim for the IntelliJ platform. History of changes in IdeaVim for the IntelliJ platform.
0.35, 2014-05-15
----------------
The `~/.vimrc` initialization file is no longer read by default, use
`~/.ideavimrc` instead.
Features:
* VIM-690 Read initialization commands only from `~/.ideavimrc`
Bug fixes:
* VIM-676 Handle control characters in `.ideavimrc` as pressed, not typed
keystrokes
* VIM-679 Parse characters less than U+0020 as `<C-$CHAR>`
* VIM-683 Allow `<C-PageUp>`/`<C-PagDown>` to be used outside of Vim emulation
* VIM-646 Don't update the visual selection if a command moves the caret and exits
the visual mode
* VIM-213 Use `'<` and `'>` marks for saving and restoring the last visual
selection
0.34, 2014-04-29 0.34, 2014-04-29
---------------- ----------------

View File

@@ -41,7 +41,7 @@ shortcuts.
Keyboard shortcut conflicts between the Vim emulation and the IDE can be Keyboard shortcut conflicts between the Vim emulation and the IDE can be
resolved via "File | Settings | Vim Emulation", "File | Settings | Keymap" resolved via "File | Settings | Vim Emulation", "File | Settings | Keymap"
and key mapping commands in your ~/.ideavimrc or ~/.vimrc file. and key mapping commands in your ~/.ideavimrc file.
Summary of Supported Vim Features Summary of Supported Vim Features
@@ -83,10 +83,12 @@ Files
* ~/.ideavimrc * ~/.ideavimrc
* Your IdeaVim-specific Vim initialization commands * Your IdeaVim-specific Vim initialization commands
* ~/.vimrc
* Your Vim initializations
Note, that IdeaVim currently parses .vimrc files via simple pattern matching, You can read your ~/.vimrc file from ~/.ideavimrc using this command:
source ~/.vimrc
Note, that IdeaVim currently parses ~/.ideavimrc file via simple pattern matching,
see [VIM-669](http://youtrack.jetbrains.com/issue/VIM-669) for proper parsing see [VIM-669](http://youtrack.jetbrains.com/issue/VIM-669) for proper parsing
of VimL files. of VimL files.

View File

@@ -1,4 +1,4 @@
version-id:0.34 version-id:0.35
platform-version:120.0 platform-version:120.0
idea.download.url=http://download.jetbrains.com/idea/ideaIU-13.zip idea.download.url=http://download.jetbrains.com/idea/ideaIU-13.zip
build.number=dev build.number=dev

View File

@@ -1,7 +1,7 @@
List of Supported Set Commands List of Supported Set Commands
============================== ==============================
The following `:set` commands can appear in `~/.vimrc` or set manually in the command mode: The following `:set` commands can appear in `~/.ideavimrc` or set manually in the command mode:
'digraph' 'dg' enable the entering of digraphs in Insert mode 'digraph' 'dg' enable the entering of digraphs in Insert mode
'gdefault' 'gd' the ":substitute" flag 'g' is default on 'gdefault' 'gd' the ":substitute" flag 'g' is default on

View File

@@ -3,6 +3,11 @@
<id>IdeaVIM</id> <id>IdeaVIM</id>
<change-notes> <change-notes>
<![CDATA[ <![CDATA[
<p>0.35:</p>
<ul>
<li><code>~/.vimrc</code> is no longer read by default, use <code>~/.ideavimrc</code> instead</li>
<li>Various bug fixes</li>
</ul>
<p>0.34:</p> <p>0.34:</p>
<ul> <ul>
<li>Various bug fixes</li> <li>Various bug fixes</li>
@@ -49,6 +54,7 @@
<li>Some :set options</li> <li>Some :set options</li>
<li>Full Vim regexps for search and search/replace</li> <li>Full Vim regexps for search and search/replace</li>
<li>Key mappings</li> <li>Key mappings</li>
<li>Configuration via ~/.ideavimrc</li>
<li>Macros</li> <li>Macros</li>
<li>Digraphs</li> <li>Digraphs</li>
<li>Command line and search history</li> <li>Command line and search history</li>
@@ -183,7 +189,6 @@
<!-- Screen --> <!-- Screen -->
<action id="VimMotionFirstScreenLine" class="com.maddyhome.idea.vim.action.motion.screen.MotionFirstScreenLineAction" text="First Screen Line"/> <action id="VimMotionFirstScreenLine" class="com.maddyhome.idea.vim.action.motion.screen.MotionFirstScreenLineAction" text="First Screen Line"/>
<action id="VimMotionLastScreenLine" class="com.maddyhome.idea.vim.action.motion.screen.MotionLastScreenLineAction" text="Last Screen Line"/> <action id="VimMotionLastScreenLine" class="com.maddyhome.idea.vim.action.motion.screen.MotionLastScreenLineAction" text="Last Screen Line"/>
<action id="VimMotionLastScreenLineEnd" class="com.maddyhome.idea.vim.action.motion.screen.MotionLastScreenLineEndAction" text="Last Screen Line End"/>
<action id="VimMotionMiddleScreenLine" class="com.maddyhome.idea.vim.action.motion.screen.MotionMiddleScreenLineAction" text="Middle Screen Line"/> <action id="VimMotionMiddleScreenLine" class="com.maddyhome.idea.vim.action.motion.screen.MotionMiddleScreenLineAction" text="Middle Screen Line"/>
<!-- Scroll --> <!-- Scroll -->
<action id="VimMotionScrollFirstScreenLinePageStart" class="com.maddyhome.idea.vim.action.motion.scroll.MotionScrollFirstScreenLinePageStartAction" text="Scroll Line to Top"/> <action id="VimMotionScrollFirstScreenLinePageStart" class="com.maddyhome.idea.vim.action.motion.scroll.MotionScrollFirstScreenLinePageStartAction" text="Scroll Line to Top"/>
@@ -211,7 +216,7 @@
<action id="VimVisualToggleBlockMode" class="com.maddyhome.idea.vim.action.motion.visual.VisualToggleBlockModeAction" text="Toggle Block Selection"/> <action id="VimVisualToggleBlockMode" class="com.maddyhome.idea.vim.action.motion.visual.VisualToggleBlockModeAction" text="Toggle Block Selection"/>
<action id="VimVisualSwapEnds" class="com.maddyhome.idea.vim.action.motion.visual.VisualSwapEndsAction" text="Swap Visual Selection Ends"/> <action id="VimVisualSwapEnds" class="com.maddyhome.idea.vim.action.motion.visual.VisualSwapEndsAction" text="Swap Visual Selection Ends"/>
<action id="VimVisualSwapEndsBlock" class="com.maddyhome.idea.vim.action.motion.visual.VisualSwapEndsBlockAction" text="Swap Visual Selection Ends"/> <action id="VimVisualSwapEndsBlock" class="com.maddyhome.idea.vim.action.motion.visual.VisualSwapEndsBlockAction" text="Swap Visual Selection Ends"/>
<action id="VimVisualSelectPrevious" class="com.maddyhome.idea.vim.action.motion.visual.VisualSelectPreviousAction" text="Swap Visual Selection Ends"/> <action id="VimVisualSelectPrevious" class="com.maddyhome.idea.vim.action.motion.visual.VisualSelectPreviousAction" text="Visual Select Previous"/>
<action id="VimVisualSwapSelections" class="com.maddyhome.idea.vim.action.motion.visual.VisualSwapSelectionsAction" text="Swap Visual Selection Ends"/> <action id="VimVisualSwapSelections" class="com.maddyhome.idea.vim.action.motion.visual.VisualSwapSelectionsAction" text="Swap Visual Selection Ends"/>
<!-- Insert --> <!-- Insert -->

View File

@@ -0,0 +1,109 @@
package com.maddyhome.idea.vim;
import com.intellij.openapi.Disposable;
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.ShortcutSet;
import com.intellij.openapi.editor.Document;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.editor.EditorFactory;
import com.intellij.openapi.editor.actionSystem.EditorActionManager;
import com.intellij.openapi.editor.actionSystem.TypedAction;
import com.intellij.openapi.editor.actionSystem.TypedActionHandler;
import com.intellij.openapi.editor.event.*;
import com.intellij.openapi.fileEditor.FileEditorManagerListener;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.project.ProjectManager;
import com.intellij.openapi.project.ProjectManagerListener;
import com.intellij.util.messages.MessageBusConnection;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
/**
* @author vlan
*/
public class EventFacade {
@NotNull private static final EventFacade ourInstance = new EventFacade();
@Nullable private TypedActionHandler myOriginalTypedActionHandler;
private EventFacade() {
}
@NotNull
public static EventFacade getInstance() {
return ourInstance;
}
public void addProjectManagerListener(@NotNull ProjectManagerListener listener) {
ProjectManager.getInstance().addProjectManagerListener(listener);
}
public void setupTypedActionHandler(@NotNull TypedActionHandler handler) {
final TypedAction typedAction = getTypedAction();
myOriginalTypedActionHandler = typedAction.getHandler();
typedAction.setupHandler(handler);
}
public void restoreTypedActionHandler() {
if (myOriginalTypedActionHandler != null) {
getTypedAction().setupHandler(myOriginalTypedActionHandler);
}
}
public void registerCustomShortcutSet(@NotNull AnAction action, @NotNull ShortcutSet shortcutSet,
@Nullable JComponent component) {
action.registerCustomShortcutSet(shortcutSet, component);
}
public void unregisterCustomShortcutSet(@NotNull AnAction action, @Nullable JComponent component) {
action.unregisterCustomShortcutSet(component);
}
public void addFileEditorManagerListener(@NotNull Project project, @NotNull FileEditorManagerListener listener) {
final MessageBusConnection connection = project.getMessageBus().connect();
connection.subscribe(FileEditorManagerListener.FILE_EDITOR_MANAGER, listener);
}
public void addDocumentListener(@NotNull Document document, @NotNull DocumentListener listener) {
document.addDocumentListener(listener);
}
public void removeDocumentListener(@NotNull Document document, @NotNull DocumentListener listener) {
document.removeDocumentListener(listener);
}
public void addEditorFactoryListener(@NotNull EditorFactoryListener listener, @NotNull Disposable parentDisposable) {
EditorFactory.getInstance().addEditorFactoryListener(listener, parentDisposable);
}
public void addEditorMouseListener(@NotNull Editor editor, @NotNull EditorMouseListener listener) {
editor.addEditorMouseListener(listener);
}
public void removeEditorMouseListener(@NotNull Editor editor, @NotNull EditorMouseListener listener) {
editor.removeEditorMouseListener(listener);
}
public void addEditorMouseMotionListener(@NotNull Editor editor, @NotNull EditorMouseMotionListener listener) {
editor.addEditorMouseMotionListener(listener);
}
public void removeEditorMouseMotionListener(@NotNull Editor editor, @NotNull EditorMouseMotionListener listener) {
editor.removeEditorMouseMotionListener(listener);
}
public void addEditorSelectionListener(@NotNull Editor editor, @NotNull SelectionListener listener) {
editor.getSelectionModel().addSelectionListener(listener);
}
public void removeEditorSelectionListener(@NotNull Editor editor, @NotNull SelectionListener listener) {
editor.getSelectionModel().removeSelectionListener(listener);
}
@NotNull
private TypedAction getTypedAction() {
return EditorActionManager.getInstance().getTypedAction();
}
}

View File

@@ -164,7 +164,7 @@ public class KeyHandler {
// If this is an argument node then the last keystroke was not part of the current command but should // If this is an argument node then the last keystroke was not part of the current command but should
// be the first keystroke of the argument of the current command // be the first keystroke of the argument of the current command
else if (node instanceof ArgumentNode) { else if (node instanceof ArgumentNode) {
shouldRecord = handleArgumentNode(editor, key, context, editorState, true, (ArgumentNode)node); shouldRecord = handleArgumentNode(editor, key, context, editorState, (ArgumentNode)node);
} }
else { else {
if (lastWasBS && lastChar != 0 && Options.getInstance().isSet("digraph")) { if (lastWasBS && lastChar != 0 && Options.getInstance().isSet("digraph")) {
@@ -179,7 +179,7 @@ public class KeyHandler {
} }
} }
else if (editorState.getMappingMode() == MappingMode.CMD_LINE) { else if (editorState.getMappingMode() == MappingMode.CMD_LINE) {
if (!VimPlugin.getProcess().processExKey(editor, key, true)) { if (!VimPlugin.getProcess().processExKey(editor, key)) {
shouldRecord = false; shouldRecord = false;
} }
} }
@@ -386,7 +386,6 @@ public class KeyHandler {
private void executeCommand(@NotNull Editor editor, @NotNull KeyStroke key, @NotNull DataContext context, private void executeCommand(@NotNull Editor editor, @NotNull KeyStroke key, @NotNull DataContext context,
@NotNull CommandState editorState) { @NotNull CommandState editorState) {
DelegateCommandListener.getInstance().setRunnable(null);
// Let's go through the command stack and merge it all into one command. At this time there should never // Let's go through the command stack and merge it all into one command. At this time there should never
// be more than two commands on the stack - one is the actual command and the other would be a motion // be more than two commands on the stack - one is the actual command and the other would be a motion
// command argument needed by the first command // command argument needed by the first command
@@ -443,8 +442,7 @@ public class KeyHandler {
} }
private boolean handleArgumentNode(@NotNull Editor editor, @NotNull KeyStroke key, @NotNull DataContext context, private boolean handleArgumentNode(@NotNull Editor editor, @NotNull KeyStroke key, @NotNull DataContext context,
@NotNull CommandState editorState, boolean shouldRecord, @NotNull CommandState editorState, @NotNull ArgumentNode node) {
@NotNull ArgumentNode node) {
// Create a new command based on what the user has typed so far, excluding this keystroke. // Create a new command based on what the user has typed so far, excluding this keystroke.
Command cmd = new Command(count, node.getActionId(), node.getAction(), node.getCmdType(), node.getFlags()); Command cmd = new Command(count, node.getActionId(), node.getAction(), node.getCmdType(), node.getFlags());
cmd.setKeys(keys); cmd.setKeys(keys);
@@ -478,9 +476,9 @@ public class KeyHandler {
if (currentArg != Argument.Type.NONE) { if (currentArg != Argument.Type.NONE) {
partialReset(editor); partialReset(editor);
handleKey(editor, key, context); handleKey(editor, key, context);
shouldRecord = false; // Prevent this from getting recorded twice return false;
} }
return shouldRecord; return true;
} }
private void handleCommandNode(@NotNull Editor editor, @NotNull DataContext context, @NotNull CommandNode node) { private void handleCommandNode(@NotNull Editor editor, @NotNull DataContext context, @NotNull CommandNode node) {
@@ -629,7 +627,6 @@ public class KeyHandler {
lastChar = 0; lastChar = 0;
lastWasBS = false; lastWasBS = false;
VimPlugin.getRegister().resetRegister(); VimPlugin.getRegister().resetRegister();
DelegateCommandListener.getInstance().setRunnable(null);
} }
/** /**
@@ -676,10 +673,10 @@ public class KeyHandler {
} }
} }
private Editor editor; private final Editor editor;
private DataContext context; private final DataContext context;
private Command cmd; private final Command cmd;
private KeyStroke key; private final KeyStroke key;
} }
private static enum State { private static enum State {
@@ -693,7 +690,7 @@ public class KeyHandler {
private int count; private int count;
private List<KeyStroke> keys; private List<KeyStroke> keys;
private State state; private State state;
@NotNull private Stack<Command> currentCmd = new Stack<Command>(); @NotNull private final Stack<Command> currentCmd = new Stack<Command>();
@NotNull private Argument.Type currentArg; @NotNull private Argument.Type currentArg;
private TypedActionHandler origHandler; private TypedActionHandler origHandler;
@Nullable private DigraphSequence digraph = null; @Nullable private DigraphSequence digraph = null;

View File

@@ -37,7 +37,6 @@ public class RegisterActions {
registerVimCommandActions(); registerVimCommandActions();
registerInsertModeActions(); registerInsertModeActions();
registerVisualModeActions();
registerNormalModeActions(); registerNormalModeActions();
registerNVOModesActions(); registerNVOModesActions();
registerCommandLineActions(); registerCommandLineActions();
@@ -251,8 +250,7 @@ public class RegisterActions {
parser parser
.registerAction(MappingMode.NVO, "VimMotionFirstScreenLine", Command.Type.MOTION, Command.FLAG_MOT_LINEWISE | Command.FLAG_SAVE_JUMP, .registerAction(MappingMode.NVO, "VimMotionFirstScreenLine", Command.Type.MOTION, Command.FLAG_MOT_LINEWISE | Command.FLAG_SAVE_JUMP,
new Shortcut[]{ new Shortcut[]{
new Shortcut('H'), new Shortcut('H')
new Shortcut(KeyStroke.getKeyStroke(KeyEvent.VK_PAGE_UP, KeyEvent.CTRL_MASK))
}); });
parser parser
.registerAction(MappingMode.NVO, "VimMotionGotoLineFirst", Command.Type.MOTION, Command.FLAG_MOT_LINEWISE | Command.FLAG_SAVE_JUMP, .registerAction(MappingMode.NVO, "VimMotionGotoLineFirst", Command.Type.MOTION, Command.FLAG_MOT_LINEWISE | Command.FLAG_SAVE_JUMP,
@@ -283,9 +281,6 @@ public class RegisterActions {
parser parser
.registerAction(MappingMode.NVO, "VimMotionLastScreenLine", Command.Type.MOTION, Command.FLAG_MOT_LINEWISE | Command.FLAG_SAVE_JUMP, .registerAction(MappingMode.NVO, "VimMotionLastScreenLine", Command.Type.MOTION, Command.FLAG_MOT_LINEWISE | Command.FLAG_SAVE_JUMP,
new Shortcut('L')); new Shortcut('L'));
parser.registerAction(MappingMode.NVO, "VimMotionLastScreenLineEnd", Command.Type.MOTION,
Command.FLAG_MOT_LINEWISE | Command.FLAG_SAVE_JUMP,
new Shortcut(KeyStroke.getKeyStroke(KeyEvent.VK_PAGE_DOWN, KeyEvent.CTRL_MASK)));
parser.registerAction(MappingMode.NVO, "VimMotionLeft", Command.Type.MOTION, Command.FLAG_MOT_EXCLUSIVE, new Shortcut[]{ parser.registerAction(MappingMode.NVO, "VimMotionLeft", Command.Type.MOTION, Command.FLAG_MOT_EXCLUSIVE, new Shortcut[]{
new Shortcut('h'), new Shortcut('h'),
new Shortcut(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0)) new Shortcut(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0))
@@ -605,8 +600,6 @@ public class RegisterActions {
new Shortcut('&')); new Shortcut('&'));
parser.registerAction(MappingMode.N, "VimLastGlobalSearchReplace", Command.Type.OTHER_WRITABLE, parser.registerAction(MappingMode.N, "VimLastGlobalSearchReplace", Command.Type.OTHER_WRITABLE,
new Shortcut("g&")); new Shortcut("g&"));
parser.registerAction(MappingMode.N, "VimVisualSelectPrevious", Command.Type.OTHER_READONLY,
new Shortcut("gv"));
parser.registerAction(MappingMode.N, "VimRepeatChange", Command.Type.OTHER_WRITABLE, parser.registerAction(MappingMode.N, "VimRepeatChange", Command.Type.OTHER_WRITABLE,
new Shortcut('.')); new Shortcut('.'));
parser.registerAction(MappingMode.N, "VimRepeatExCommand", Command.Type.OTHER_WRITABLE, parser.registerAction(MappingMode.N, "VimRepeatExCommand", Command.Type.OTHER_WRITABLE,
@@ -675,93 +668,6 @@ public class RegisterActions {
// TODO - support for :map macros // TODO - support for :map macros
} }
private static void registerVisualModeActions() {
final KeyGroup parser = VimPlugin.getKey();
parser.registerAction(MappingMode.V, "VimAutoIndentVisual", Command.Type.CHANGE,
Command.FLAG_MOT_LINEWISE | Command.FLAG_FORCE_LINEWISE,
new Shortcut('='));
parser.registerAction(MappingMode.V, "VimReformatVisual", Command.Type.CHANGE,
Command.FLAG_MOT_LINEWISE | Command.FLAG_FORCE_LINEWISE,
new Shortcut("gq"));
parser.registerAction(MappingMode.V, "VimChangeCaseLowerVisual", Command.Type.CHANGE,
new Shortcut('u'));
parser.registerAction(MappingMode.V, "VimChangeCaseToggleVisual", Command.Type.CHANGE,
new Shortcut('~'));
parser.registerAction(MappingMode.V, "VimChangeCaseUpperVisual", Command.Type.CHANGE,
new Shortcut('U'));
parser.registerAction(MappingMode.V, "VimChangeVisual", Command.Type.CHANGE, Command.FLAG_MULTIKEY_UNDO, new Shortcut[]{
new Shortcut('c'),
new Shortcut('s')
});
parser.registerAction(MappingMode.V, "VimChangeVisualCharacter", Command.Type.CHANGE, Command.FLAG_ALLOW_DIGRAPH,
new Shortcut('r'), Argument.Type.DIGRAPH);
parser.registerAction(MappingMode.V, "VimChangeVisualLines", Command.Type.CHANGE,
Command.FLAG_MOT_LINEWISE | Command.FLAG_MULTIKEY_UNDO, new Shortcut[]{
new Shortcut('R'),
new Shortcut('S')
});
parser.registerAction(MappingMode.V, "VimChangeVisualLinesEnd", Command.Type.CHANGE,
Command.FLAG_MOT_LINEWISE | Command.FLAG_MULTIKEY_UNDO, new Shortcut[]{
new Shortcut('C')
});
parser.registerAction(MappingMode.V, "VimCopyYankVisual", Command.Type.COPY,
new Shortcut('y'));
parser.registerAction(MappingMode.V, "VimCopyYankVisualLines", Command.Type.COPY, Command.FLAG_MOT_LINEWISE,
new Shortcut('Y'));
parser.registerAction(MappingMode.V, "VimDeleteJoinVisualLines", Command.Type.DELETE,
new Shortcut("gJ"));
parser.registerAction(MappingMode.V, "VimDeleteJoinVisualLinesSpaces", Command.Type.DELETE,
new Shortcut('J'));
parser.registerAction(MappingMode.V, "VimDeleteVisual", Command.Type.DELETE, new Shortcut[]{
new Shortcut('d'),
new Shortcut('x'),
new Shortcut(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, 0))
});
parser.registerAction(MappingMode.V, "VimDeleteVisualLinesEnd", Command.Type.DELETE, Command.FLAG_MOT_LINEWISE, new Shortcut[]{
new Shortcut('D')
});
parser.registerAction(MappingMode.V, "VimDeleteVisualLines", Command.Type.DELETE, Command.FLAG_MOT_LINEWISE, new Shortcut[]{
new Shortcut('X')
});
parser.registerAction(MappingMode.V, "VimFilterVisualLines", Command.Type.CHANGE, Command.FLAG_MOT_LINEWISE,
new Shortcut('!'));
parser.registerAction(MappingMode.V, "VimShiftLeftVisual", Command.Type.CHANGE,
new Shortcut('<'));
parser.registerAction(MappingMode.V, "VimShiftRightVisual", Command.Type.CHANGE,
new Shortcut('>'));
parser.registerAction(MappingMode.V, "VimVisualExitMode", Command.Type.OTHER_READONLY, new Shortcut[]{
new Shortcut(KeyStroke.getKeyStroke('[', KeyEvent.CTRL_MASK)),
new Shortcut(KeyStroke.getKeyStroke(KeyEvent.VK_C, KeyEvent.CTRL_MASK)),
new Shortcut(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0)),
new Shortcut(new KeyStroke[]{KeyStroke.getKeyStroke(KeyEvent.VK_BACK_SLASH, KeyEvent.CTRL_MASK),
KeyStroke.getKeyStroke(KeyEvent.VK_N, KeyEvent.CTRL_MASK)})
});
parser.registerAction(MappingMode.V, "VimVisualPutText", Command.Type.PASTE, new Shortcut[]{
new Shortcut('P'),
new Shortcut('p')
});
parser.registerAction(MappingMode.V, "VimVisualPutTextMoveCursor", Command.Type.PASTE, new Shortcut[]{
new Shortcut("gp"),
new Shortcut("gP")
});
parser.registerAction(MappingMode.V, "VimVisualPutTextNoIndent", Command.Type.PASTE, new Shortcut[]{
new Shortcut("[p"),
new Shortcut("]p"),
new Shortcut("[P"),
new Shortcut("]P")
});
parser.registerAction(MappingMode.V, "VimVisualBlockInsert", Command.Type.INSERT, Command.FLAG_MULTIKEY_UNDO,
new Shortcut('I'));
parser.registerAction(MappingMode.V, "VimVisualBlockAppend", Command.Type.INSERT, Command.FLAG_MULTIKEY_UNDO,
new Shortcut('A'));
parser.registerAction(MappingMode.V, "VimVisualSwapEnds", Command.Type.OTHER_READONLY,
new Shortcut('o'));
parser.registerAction(MappingMode.V, "VimVisualSwapEndsBlock", Command.Type.OTHER_READONLY,
new Shortcut('O'));
parser.registerAction(MappingMode.V, "VimVisualSwapSelections", Command.Type.OTHER_READONLY,
new Shortcut("gv"));
}
private static void registerInsertModeActions() { private static void registerInsertModeActions() {
final KeyGroup parser = VimPlugin.getKey(); final KeyGroup parser = VimPlugin.getKey();
// Other insert actions // Other insert actions

View File

@@ -22,7 +22,6 @@ import com.intellij.openapi.application.Application;
import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.application.ex.ApplicationEx; import com.intellij.openapi.application.ex.ApplicationEx;
import com.intellij.openapi.application.ex.ApplicationManagerEx; import com.intellij.openapi.application.ex.ApplicationManagerEx;
import com.intellij.openapi.command.CommandProcessor;
import com.intellij.openapi.components.ApplicationComponent; import com.intellij.openapi.components.ApplicationComponent;
import com.intellij.openapi.components.PersistentStateComponent; import com.intellij.openapi.components.PersistentStateComponent;
import com.intellij.openapi.components.State; import com.intellij.openapi.components.State;
@@ -36,7 +35,6 @@ import com.intellij.openapi.editor.event.EditorFactoryAdapter;
import com.intellij.openapi.editor.event.EditorFactoryEvent; import com.intellij.openapi.editor.event.EditorFactoryEvent;
import com.intellij.openapi.editor.ex.EditorEx; import com.intellij.openapi.editor.ex.EditorEx;
import com.intellij.openapi.extensions.PluginId; import com.intellij.openapi.extensions.PluginId;
import com.intellij.openapi.fileEditor.FileEditorManagerListener;
import com.intellij.openapi.keymap.Keymap; import com.intellij.openapi.keymap.Keymap;
import com.intellij.openapi.keymap.ex.KeymapManagerEx; import com.intellij.openapi.keymap.ex.KeymapManagerEx;
import com.intellij.openapi.keymap.impl.DefaultKeymap; import com.intellij.openapi.keymap.impl.DefaultKeymap;
@@ -52,7 +50,10 @@ import com.maddyhome.idea.vim.command.CommandState;
import com.maddyhome.idea.vim.ex.CommandParser; import com.maddyhome.idea.vim.ex.CommandParser;
import com.maddyhome.idea.vim.ex.VimScriptParser; import com.maddyhome.idea.vim.ex.VimScriptParser;
import com.maddyhome.idea.vim.group.*; import com.maddyhome.idea.vim.group.*;
import com.maddyhome.idea.vim.helper.*; import com.maddyhome.idea.vim.helper.DocumentManager;
import com.maddyhome.idea.vim.helper.EditorData;
import com.maddyhome.idea.vim.helper.EditorDataContext;
import com.maddyhome.idea.vim.helper.MacKeyRepeat;
import com.maddyhome.idea.vim.option.Options; import com.maddyhome.idea.vim.option.Options;
import com.maddyhome.idea.vim.ui.VimEmulationConfigurable; import com.maddyhome.idea.vim.ui.VimEmulationConfigurable;
import org.jdom.Element; import org.jdom.Element;
@@ -85,13 +86,12 @@ public class VimPlugin implements ApplicationComponent, PersistentStateComponent
public static final String IDEAVIM_NOTIFICATION_ID = "ideavim"; public static final String IDEAVIM_NOTIFICATION_ID = "ideavim";
public static final String IDEAVIM_STICKY_NOTIFICATION_ID = "ideavim-sticky"; public static final String IDEAVIM_STICKY_NOTIFICATION_ID = "ideavim-sticky";
public static final String IDEAVIM_NOTIFICATION_TITLE = "IdeaVim"; public static final String IDEAVIM_NOTIFICATION_TITLE = "IdeaVim";
public static final int STATE_VERSION = 3; public static final int STATE_VERSION = 4;
private static final boolean BLOCK_CURSOR_VIM_VALUE = true; private static final boolean BLOCK_CURSOR_VIM_VALUE = true;
private static final boolean ANIMATED_SCROLLING_VIM_VALUE = false; private static final boolean ANIMATED_SCROLLING_VIM_VALUE = false;
private static final boolean REFRAIN_FROM_SCROLLING_VIM_VALUE = true; private static final boolean REFRAIN_FROM_SCROLLING_VIM_VALUE = true;
private VimTypedActionHandler vimHandler;
private boolean isBlockCursor = false; private boolean isBlockCursor = false;
private boolean isAnimatedScrolling = false; private boolean isAnimatedScrolling = false;
private boolean isRefrainFromScrolling = false; private boolean isRefrainFromScrolling = false;
@@ -103,22 +103,22 @@ public class VimPlugin implements ApplicationComponent, PersistentStateComponent
// It is enabled by default to avoid any special configuration after plugin installation // It is enabled by default to avoid any special configuration after plugin installation
private boolean enabled = true; private boolean enabled = true;
private static Logger LOG = Logger.getInstance(VimPlugin.class); private static final Logger LOG = Logger.getInstance(VimPlugin.class);
private final Application myApp; private final Application myApp;
private MotionGroup motion; @NotNull private final MotionGroup motion;
private ChangeGroup change; @NotNull private final ChangeGroup change;
private CopyGroup copy; @NotNull private final CopyGroup copy;
private MarkGroup mark; @NotNull private final MarkGroup mark;
private RegisterGroup register; @NotNull private final RegisterGroup register;
private FileGroup file; @NotNull private final FileGroup file;
private SearchGroup search; @NotNull private final SearchGroup search;
private ProcessGroup process; @NotNull private final ProcessGroup process;
private MacroGroup macro; @NotNull private final MacroGroup macro;
private DigraphGroup digraph; @NotNull private final DigraphGroup digraph;
private HistoryGroup history; @NotNull private final HistoryGroup history;
private KeyGroup key; @NotNull private final KeyGroup key;
public VimPlugin(final Application app) { public VimPlugin(final Application app) {
myApp = app; myApp = app;
@@ -157,12 +157,8 @@ public class VimPlugin implements ApplicationComponent, PersistentStateComponent
} }
}); });
EditorActionManager manager = EditorActionManager.getInstance(); final TypedAction typedAction = EditorActionManager.getInstance().getTypedAction();
TypedAction action = manager.getTypedAction(); EventFacade.getInstance().setupTypedActionHandler(new VimTypedActionHandler(typedAction.getHandler()));
// Replace the default key handler with the Vim key handler
vimHandler = new VimTypedActionHandler(action.getHandler());
action.setupHandler(vimHandler);
// Register vim actions in command mode // Register vim actions in command mode
RegisterActions.registerActions(); RegisterActions.registerActions();
@@ -174,9 +170,9 @@ public class VimPlugin implements ApplicationComponent, PersistentStateComponent
CommandParser.getInstance().registerHandlers(); CommandParser.getInstance().registerHandlers();
if (!ApplicationManager.getApplication().isUnitTestMode()) { if (!ApplicationManager.getApplication().isUnitTestMode()) {
final File vimrc = VimScriptParser.findVimrc(); final File ideaVimRc = VimScriptParser.findIdeaVimRc();
if (vimrc != null) { if (ideaVimRc != null) {
VimScriptParser.executeFile(vimrc); VimScriptParser.executeFile(ideaVimRc);
} }
} }
@@ -187,9 +183,7 @@ public class VimPlugin implements ApplicationComponent, PersistentStateComponent
public void disposeComponent() { public void disposeComponent() {
LOG.debug("disposeComponent"); LOG.debug("disposeComponent");
turnOffPlugin(); turnOffPlugin();
EditorActionManager manager = EditorActionManager.getInstance(); EventFacade.getInstance().restoreTypedActionHandler();
TypedAction action = manager.getTypedAction();
action.setupHandler(vimHandler.getOriginalTypedHandler());
LOG.debug("done"); LOG.debug("done");
} }
@@ -236,54 +230,67 @@ public class VimPlugin implements ApplicationComponent, PersistentStateComponent
key.readData(element); key.readData(element);
} }
@NotNull
public static MotionGroup getMotion() { public static MotionGroup getMotion() {
return getInstance().motion; return getInstance().motion;
} }
@NotNull
public static ChangeGroup getChange() { public static ChangeGroup getChange() {
return getInstance().change; return getInstance().change;
} }
@NotNull
public static CopyGroup getCopy() { public static CopyGroup getCopy() {
return getInstance().copy; return getInstance().copy;
} }
@NotNull
public static MarkGroup getMark() { public static MarkGroup getMark() {
return getInstance().mark; return getInstance().mark;
} }
@NotNull
public static RegisterGroup getRegister() { public static RegisterGroup getRegister() {
return getInstance().register; return getInstance().register;
} }
@NotNull
public static FileGroup getFile() { public static FileGroup getFile() {
return getInstance().file; return getInstance().file;
} }
@NotNull
public static SearchGroup getSearch() { public static SearchGroup getSearch() {
return getInstance().search; return getInstance().search;
} }
@NotNull
public static ProcessGroup getProcess() { public static ProcessGroup getProcess() {
return getInstance().process; return getInstance().process;
} }
@NotNull
public static MacroGroup getMacro() { public static MacroGroup getMacro() {
return getInstance().macro; return getInstance().macro;
} }
@NotNull
public static DigraphGroup getDigraph() { public static DigraphGroup getDigraph() {
return getInstance().digraph; return getInstance().digraph;
} }
@NotNull
public static HistoryGroup getHistory() { public static HistoryGroup getHistory() {
return getInstance().history; return getInstance().history;
} }
@NotNull
public static KeyGroup getKey() { public static KeyGroup getKey() {
return getInstance().key; return getInstance().key;
} }
@NotNull
public static PluginId getPluginId() { public static PluginId getPluginId() {
return PluginId.getId(IDEAVIM_PLUGIN_ID); return PluginId.getId(IDEAVIM_PLUGIN_ID);
} }
@@ -404,7 +411,7 @@ public class VimPlugin implements ApplicationComponent, PersistentStateComponent
"Switching to \"%s\" keymap.<br/><br/>" + "Switching to \"%s\" keymap.<br/><br/>" +
"Now it is possible to set up:<br/>" + "Now it is possible to set up:<br/>" +
"<ul>" + "<ul>" +
"<li>Vim keys in your .ideavimrc or .vimrc file using key mapping commands</li>" + "<li>Vim keys in your ~/.ideavimrc file using key mapping commands</li>" +
"<li>IDE action shortcuts in \"File | Settings | Keymap\"</li>" + "<li>IDE action shortcuts in \"File | Settings | Keymap\"</li>" +
"<li>Vim or IDE handlers for conflicting shortcuts in <a href='#settings'>Vim Emulation</a> settings</li>" + "<li>Vim or IDE handlers for conflicting shortcuts in <a href='#settings'>Vim Emulation</a> settings</li>" +
"</ul>", keymap.getPresentableName()), "</ul>", keymap.getPresentableName()),
@@ -417,6 +424,15 @@ public class VimPlugin implements ApplicationComponent, PersistentStateComponent
}).notify(null); }).notify(null);
manager.setActiveKeymap(keymap); manager.setActiveKeymap(keymap);
} }
if (previousStateVersion > 0 && previousStateVersion < 4) {
new Notification(
VimPlugin.IDEAVIM_STICKY_NOTIFICATION_ID,
VimPlugin.IDEAVIM_NOTIFICATION_TITLE,
"The ~/.vimrc file is no longer read by default, use ~/.ideavimrc instead. You can read it from your " +
"~/.ideavimrc using this command:<br/><br/>" +
"<code>source ~/.vimrc</code>",
NotificationType.INFORMATION).notify(null);
}
if (requiresRestart) { if (requiresRestart) {
final ApplicationEx app = ApplicationManagerEx.getApplicationEx(); final ApplicationEx app = ApplicationManagerEx.getApplicationEx();
app.restart(); app.restart();
@@ -428,11 +444,12 @@ public class VimPlugin implements ApplicationComponent, PersistentStateComponent
* This sets up some listeners so we can handle various events that occur * This sets up some listeners so we can handle various events that occur
*/ */
private void setupListeners() { private void setupListeners() {
final EventFacade eventFacade = EventFacade.getInstance();
DocumentManager.getInstance().addDocumentListener(new MarkGroup.MarkUpdater()); DocumentManager.getInstance().addDocumentListener(new MarkGroup.MarkUpdater());
DocumentManager.getInstance().addDocumentListener(new SearchGroup.DocumentSearchListener()); DocumentManager.getInstance().addDocumentListener(new SearchGroup.DocumentSearchListener());
DocumentManager.getInstance().init();
EditorFactory.getInstance().addEditorFactoryListener(new EditorFactoryAdapter() { eventFacade.addEditorFactoryListener(new EditorFactoryAdapter() {
@Override @Override
public void editorCreated(@NotNull EditorFactoryEvent event) { public void editorCreated(@NotNull EditorFactoryEvent event) {
final Editor editor = event.getEditor(); final Editor editor = event.getEditor();
@@ -466,25 +483,14 @@ public class VimPlugin implements ApplicationComponent, PersistentStateComponent
} }
}, myApp); }, myApp);
// Since the Vim plugin custom actions aren't available to the call to <code>initComponent()</code> eventFacade.addProjectManagerListener(new ProjectManagerAdapter() {
// we need to force the generation of the key map when the first project is opened.
ProjectManager.getInstance().addProjectManagerListener(new ProjectManagerAdapter() {
@Override @Override
public void projectOpened(@NotNull final Project project) { public void projectOpened(@NotNull final Project project) {
project.getMessageBus().connect() eventFacade.addFileEditorManagerListener(project, new MotionGroup.MotionEditorChange());
.subscribe(FileEditorManagerListener.FILE_EDITOR_MANAGER, new MotionGroup.MotionEditorChange()); eventFacade.addFileEditorManagerListener(project, new FileGroup.SelectionCheck());
project.getMessageBus().connect() eventFacade.addFileEditorManagerListener(project, new SearchGroup.EditorSelectionCheck());
.subscribe(FileEditorManagerListener.FILE_EDITOR_MANAGER, new FileGroup.SelectionCheck());
project.getMessageBus().connect()
.subscribe(FileEditorManagerListener.FILE_EDITOR_MANAGER, new SearchGroup.EditorSelectionCheck());
}
@Override
public void projectClosed(final Project project) {
} }
}); });
CommandProcessor.getInstance().addCommandListener(DelegateCommandListener.getInstance());
} }
private void setCursors(boolean isBlock) { private void setCursors(boolean isBlock) {

View File

@@ -34,10 +34,10 @@ import javax.swing.*;
* IDE shortcut keys used by Vim commands are handled by {@link com.maddyhome.idea.vim.action.VimShortcutKeyAction}. * IDE shortcut keys used by Vim commands are handled by {@link com.maddyhome.idea.vim.action.VimShortcutKeyAction}.
*/ */
public class VimTypedActionHandler implements TypedActionHandler { public class VimTypedActionHandler implements TypedActionHandler {
private static Logger logger = Logger.getInstance(VimTypedActionHandler.class.getName()); private static final Logger logger = Logger.getInstance(VimTypedActionHandler.class.getName());
private TypedActionHandler origHandler; private final TypedActionHandler origHandler;
private KeyHandler handler; @NotNull private final KeyHandler handler;
public VimTypedActionHandler(TypedActionHandler origHandler) { public VimTypedActionHandler(TypedActionHandler origHandler) {
this.origHandler = origHandler; this.origHandler = origHandler;
@@ -66,10 +66,6 @@ public class VimTypedActionHandler implements TypedActionHandler {
} }
} }
public TypedActionHandler getOriginalTypedHandler() {
return origHandler;
}
private boolean isEnabled(@NotNull Editor editor) { private boolean isEnabled(@NotNull Editor editor) {
if (VimPlugin.isEnabled()) { if (VimPlugin.isEnabled()) {
final Lookup lookup = LookupManager.getActiveLookup(editor); final Lookup lookup = LookupManager.getActiveLookup(editor);

View File

@@ -18,11 +18,13 @@
package com.maddyhome.idea.vim.action; package com.maddyhome.idea.vim.action;
import com.google.common.collect.ImmutableSet;
import com.intellij.openapi.editor.actionSystem.EditorAction; import com.intellij.openapi.editor.actionSystem.EditorAction;
import com.intellij.openapi.editor.actionSystem.EditorActionHandler; import com.intellij.openapi.editor.actionSystem.EditorActionHandler;
import com.maddyhome.idea.vim.command.Argument; import com.maddyhome.idea.vim.command.Argument;
import com.maddyhome.idea.vim.command.Command; import com.maddyhome.idea.vim.command.Command;
import com.maddyhome.idea.vim.command.MappingMode; import com.maddyhome.idea.vim.command.MappingMode;
import com.maddyhome.idea.vim.helper.StringHelper;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import javax.swing.*; import javax.swing.*;
@@ -66,4 +68,13 @@ public abstract class VimCommandAction extends EditorAction {
public int getFlags() { public int getFlags() {
return 0; return 0;
} }
@NotNull
protected static Set<List<KeyStroke>> parseKeysSet(@NotNull String... keyStrings) {
final ImmutableSet.Builder<List<KeyStroke>> builder = ImmutableSet.builder();
for (String keyString : keyStrings) {
builder.add(StringHelper.parseKeys(keyString));
}
return builder.build();
}
} }

View File

@@ -23,10 +23,7 @@ import com.intellij.codeInsight.lookup.LookupManager;
import com.intellij.notification.Notification; import com.intellij.notification.Notification;
import com.intellij.notification.NotificationListener; import com.intellij.notification.NotificationListener;
import com.intellij.notification.NotificationType; import com.intellij.notification.NotificationType;
import com.intellij.openapi.actionSystem.AnAction; import com.intellij.openapi.actionSystem.*;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.actionSystem.KeyboardShortcut;
import com.intellij.openapi.actionSystem.PlatformDataKeys;
import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.keymap.KeymapUtil; import com.intellij.openapi.keymap.KeymapUtil;
import com.intellij.openapi.options.ShowSettingsUtil; import com.intellij.openapi.options.ShowSettingsUtil;
@@ -59,7 +56,9 @@ import static java.awt.event.KeyEvent.*;
* These keys are not passed to {@link com.maddyhome.idea.vim.VimTypedActionHandler} and should be handled by actions. * These keys are not passed to {@link com.maddyhome.idea.vim.VimTypedActionHandler} and should be handled by actions.
*/ */
public class VimShortcutKeyAction extends AnAction implements DumbAware { public class VimShortcutKeyAction extends AnAction implements DumbAware {
@NotNull public static Set<KeyStroke> VIM_ONLY_EDITOR_KEYS = ImmutableSet.<KeyStroke>builder() private static final String ACTION_ID = "VimShortcutKeyAction";
@NotNull public static final Set<KeyStroke> VIM_ONLY_EDITOR_KEYS = ImmutableSet.<KeyStroke>builder()
.addAll(getKeyStrokes(VK_ENTER, 0)) .addAll(getKeyStrokes(VK_ENTER, 0))
.addAll(getKeyStrokes(VK_ESCAPE, 0)) .addAll(getKeyStrokes(VK_ESCAPE, 0))
.addAll(getKeyStrokes(VK_TAB, 0)) .addAll(getKeyStrokes(VK_TAB, 0))
@@ -72,17 +71,18 @@ public class VimShortcutKeyAction extends AnAction implements DumbAware {
.addAll(getKeyStrokes(VK_RIGHT, 0, CTRL_MASK, SHIFT_MASK, CTRL_MASK | SHIFT_MASK)) .addAll(getKeyStrokes(VK_RIGHT, 0, CTRL_MASK, SHIFT_MASK, CTRL_MASK | SHIFT_MASK))
.addAll(getKeyStrokes(VK_HOME, 0, CTRL_MASK, SHIFT_MASK, CTRL_MASK | SHIFT_MASK)) .addAll(getKeyStrokes(VK_HOME, 0, CTRL_MASK, SHIFT_MASK, CTRL_MASK | SHIFT_MASK))
.addAll(getKeyStrokes(VK_END, 0, CTRL_MASK, SHIFT_MASK, CTRL_MASK | SHIFT_MASK)) .addAll(getKeyStrokes(VK_END, 0, CTRL_MASK, SHIFT_MASK, CTRL_MASK | SHIFT_MASK))
.addAll(getKeyStrokes(VK_PAGE_UP, 0, CTRL_MASK, SHIFT_MASK, CTRL_MASK | SHIFT_MASK)) .addAll(getKeyStrokes(VK_PAGE_UP, 0, SHIFT_MASK, CTRL_MASK | SHIFT_MASK))
.addAll(getKeyStrokes(VK_PAGE_DOWN, 0, CTRL_MASK, SHIFT_MASK, CTRL_MASK | SHIFT_MASK)) .addAll(getKeyStrokes(VK_PAGE_DOWN, 0, SHIFT_MASK, CTRL_MASK | SHIFT_MASK))
.build(); .build();
@NotNull private static Set<KeyStroke> NON_FILE_EDITOR_KEYS = ImmutableSet.<KeyStroke>builder() @NotNull private static final Set<KeyStroke> NON_FILE_EDITOR_KEYS = ImmutableSet.<KeyStroke>builder()
.addAll(getKeyStrokes(VK_ESCAPE, 0)) .addAll(getKeyStrokes(VK_ESCAPE, 0))
.addAll(getKeyStrokes(VK_TAB, 0)) .addAll(getKeyStrokes(VK_TAB, 0))
.addAll(getKeyStrokes(VK_UP, 0)) .addAll(getKeyStrokes(VK_UP, 0))
.addAll(getKeyStrokes(VK_DOWN, 0)) .addAll(getKeyStrokes(VK_DOWN, 0))
.build(); .build();
@Override
public void actionPerformed(@NotNull AnActionEvent e) { public void actionPerformed(@NotNull AnActionEvent e) {
final Editor editor = getEditor(e); final Editor editor = getEditor(e);
final KeyStroke keyStroke = getKeyStroke(e); final KeyStroke keyStroke = getKeyStroke(e);
@@ -101,6 +101,11 @@ public class VimShortcutKeyAction extends AnAction implements DumbAware {
e.getPresentation().setEnabled(isEnabled(e)); e.getPresentation().setEnabled(isEnabled(e));
} }
@NotNull
public static AnAction getInstance() {
return ActionManager.getInstance().getAction(ACTION_ID);
}
private void notifyAboutShortcutConflict(@NotNull final KeyStroke keyStroke) { private void notifyAboutShortcutConflict(@NotNull final KeyStroke keyStroke) {
VimPlugin.getKey().getSavedShortcutConflicts().put(keyStroke, ShortcutOwner.VIM); VimPlugin.getKey().getSavedShortcutConflicts().put(keyStroke, ShortcutOwner.VIM);
final String message = String.format( final String message = String.format(
@@ -184,7 +189,8 @@ public class VimShortcutKeyAction extends AnAction implements DumbAware {
return !VimPlugin.getKey().getKeymapConflicts(keyStroke).isEmpty(); return !VimPlugin.getKey().getKeymapConflicts(keyStroke).isEmpty();
} }
private static List<KeyStroke> getKeyStrokes(int keyCode, int... modifiers) { @NotNull
private static List<KeyStroke> getKeyStrokes(int keyCode, @NotNull int... modifiers) {
final List<KeyStroke> keyStrokes = new ArrayList<KeyStroke>(); final List<KeyStroke> keyStrokes = new ArrayList<KeyStroke>();
for (int modifier : modifiers) { for (int modifier : modifiers) {
keyStrokes.add(KeyStroke.getKeyStroke(keyCode, modifier)); keyStrokes.add(KeyStroke.getKeyStroke(keyCode, modifier));

View File

@@ -20,17 +20,22 @@ package com.maddyhome.idea.vim.action.change.change;
import com.intellij.openapi.actionSystem.DataContext; import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.editor.actionSystem.EditorAction;
import com.maddyhome.idea.vim.VimPlugin; import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.action.VimCommandAction;
import com.maddyhome.idea.vim.command.Command; import com.maddyhome.idea.vim.command.Command;
import com.maddyhome.idea.vim.command.MappingMode;
import com.maddyhome.idea.vim.common.TextRange; import com.maddyhome.idea.vim.common.TextRange;
import com.maddyhome.idea.vim.handler.VisualOperatorActionHandler; import com.maddyhome.idea.vim.handler.VisualOperatorActionHandler;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import javax.swing.*;
import java.util.List;
import java.util.Set;
/** /**
* @author vlan * @author vlan
*/ */
public class AutoIndentLinesVisualAction extends EditorAction { public class AutoIndentLinesVisualAction extends VimCommandAction {
public AutoIndentLinesVisualAction() { public AutoIndentLinesVisualAction() {
super(new VisualOperatorActionHandler() { super(new VisualOperatorActionHandler() {
@Override @Override
@@ -43,4 +48,27 @@ public class AutoIndentLinesVisualAction extends EditorAction {
} }
}); });
} }
@NotNull
@Override
public Set<MappingMode> getMappingModes() {
return MappingMode.V;
}
@NotNull
@Override
public Set<List<KeyStroke>> getKeyStrokesSet() {
return parseKeysSet("=");
}
@NotNull
@Override
public Command.Type getType() {
return Command.Type.CHANGE;
}
@Override
public int getFlags() {
return Command.FLAG_MOT_LINEWISE | Command.FLAG_FORCE_LINEWISE | Command.FLAG_EXIT_VISUAL;
}
} }

View File

@@ -20,28 +20,54 @@ package com.maddyhome.idea.vim.action.change.change;
import com.intellij.openapi.actionSystem.DataContext; import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.editor.actionSystem.EditorAction;
import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil; import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil;
import com.maddyhome.idea.vim.VimPlugin; import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.action.VimCommandAction;
import com.maddyhome.idea.vim.command.Command; import com.maddyhome.idea.vim.command.Command;
import com.maddyhome.idea.vim.command.MappingMode;
import com.maddyhome.idea.vim.common.TextRange; import com.maddyhome.idea.vim.common.TextRange;
import com.maddyhome.idea.vim.handler.VisualOperatorActionHandler; import com.maddyhome.idea.vim.handler.VisualOperatorActionHandler;
import com.maddyhome.idea.vim.helper.CharacterHelper; import com.maddyhome.idea.vim.helper.CharacterHelper;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
/** import javax.swing.*;
*/ import java.util.List;
public class ChangeCaseLowerVisualAction extends EditorAction { import java.util.Set;
public ChangeCaseLowerVisualAction() {
super(new Handler());
}
private static class Handler extends VisualOperatorActionHandler { /**
* @author vlan
*/
public class ChangeCaseLowerVisualAction extends VimCommandAction {
public ChangeCaseLowerVisualAction() {
super(new VisualOperatorActionHandler() {
protected boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull Command cmd, protected boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull Command cmd,
@NotNull TextRange range) { @NotNull TextRange range) {
return VimPlugin.getChange().changeCaseRange(InjectedLanguageUtil.getTopLevelEditor(editor), final Editor topLevelEditor = InjectedLanguageUtil.getTopLevelEditor(editor);
range, CharacterHelper.CASE_LOWER); return VimPlugin.getChange().changeCaseRange(topLevelEditor, range, CharacterHelper.CASE_LOWER);
} }
});
}
@NotNull
@Override
public Set<MappingMode> getMappingModes() {
return MappingMode.V;
}
@NotNull
@Override
public Set<List<KeyStroke>> getKeyStrokesSet() {
return parseKeysSet("u");
}
@NotNull
@Override
public Command.Type getType() {
return Command.Type.CHANGE;
}
@Override
public int getFlags() {
return Command.FLAG_EXIT_VISUAL;
} }
} }

View File

@@ -20,25 +20,52 @@ package com.maddyhome.idea.vim.action.change.change;
import com.intellij.openapi.actionSystem.DataContext; import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.editor.actionSystem.EditorAction;
import com.maddyhome.idea.vim.VimPlugin; import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.action.VimCommandAction;
import com.maddyhome.idea.vim.command.Command; import com.maddyhome.idea.vim.command.Command;
import com.maddyhome.idea.vim.command.MappingMode;
import com.maddyhome.idea.vim.common.TextRange; import com.maddyhome.idea.vim.common.TextRange;
import com.maddyhome.idea.vim.handler.VisualOperatorActionHandler; import com.maddyhome.idea.vim.handler.VisualOperatorActionHandler;
import com.maddyhome.idea.vim.helper.CharacterHelper; import com.maddyhome.idea.vim.helper.CharacterHelper;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
/** import javax.swing.*;
*/ import java.util.List;
public class ChangeCaseToggleVisualAction extends EditorAction { import java.util.Set;
public ChangeCaseToggleVisualAction() {
super(new Handler());
}
private static class Handler extends VisualOperatorActionHandler { /**
* @author vlan
*/
public class ChangeCaseToggleVisualAction extends VimCommandAction {
public ChangeCaseToggleVisualAction() {
super(new VisualOperatorActionHandler() {
protected boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull Command cmd, protected boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull Command cmd,
@NotNull TextRange range) { @NotNull TextRange range) {
return VimPlugin.getChange().changeCaseRange(editor, range, CharacterHelper.CASE_TOGGLE); return VimPlugin.getChange().changeCaseRange(editor, range, CharacterHelper.CASE_TOGGLE);
} }
});
}
@NotNull
@Override
public Set<MappingMode> getMappingModes() {
return MappingMode.V;
}
@NotNull
@Override
public Set<List<KeyStroke>> getKeyStrokesSet() {
return parseKeysSet("~");
}
@NotNull
@Override
public Command.Type getType() {
return Command.Type.CHANGE;
}
@Override
public int getFlags() {
return Command.FLAG_EXIT_VISUAL;
} }
} }

View File

@@ -20,25 +20,52 @@ package com.maddyhome.idea.vim.action.change.change;
import com.intellij.openapi.actionSystem.DataContext; import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.editor.actionSystem.EditorAction;
import com.maddyhome.idea.vim.VimPlugin; import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.action.VimCommandAction;
import com.maddyhome.idea.vim.command.Command; import com.maddyhome.idea.vim.command.Command;
import com.maddyhome.idea.vim.command.MappingMode;
import com.maddyhome.idea.vim.common.TextRange; import com.maddyhome.idea.vim.common.TextRange;
import com.maddyhome.idea.vim.handler.VisualOperatorActionHandler; import com.maddyhome.idea.vim.handler.VisualOperatorActionHandler;
import com.maddyhome.idea.vim.helper.CharacterHelper; import com.maddyhome.idea.vim.helper.CharacterHelper;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
/** import javax.swing.*;
*/ import java.util.List;
public class ChangeCaseUpperVisualAction extends EditorAction { import java.util.Set;
public ChangeCaseUpperVisualAction() {
super(new Handler());
}
private static class Handler extends VisualOperatorActionHandler { /**
* @author vlan
*/
public class ChangeCaseUpperVisualAction extends VimCommandAction {
public ChangeCaseUpperVisualAction() {
super(new VisualOperatorActionHandler() {
protected boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull Command cmd, protected boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull Command cmd,
@NotNull TextRange range) { @NotNull TextRange range) {
return VimPlugin.getChange().changeCaseRange(editor, range, CharacterHelper.CASE_UPPER); return VimPlugin.getChange().changeCaseRange(editor, range, CharacterHelper.CASE_UPPER);
} }
});
}
@NotNull
@Override
public Set<MappingMode> getMappingModes() {
return MappingMode.V;
}
@NotNull
@Override
public Set<List<KeyStroke>> getKeyStrokesSet() {
return parseKeysSet("U");
}
@NotNull
@Override
public Command.Type getType() {
return Command.Type.CHANGE;
}
@Override
public int getFlags() {
return Command.FLAG_EXIT_VISUAL;
} }
} }

View File

@@ -39,7 +39,7 @@ public class ChangeLastGlobalSearchReplaceAction extends EditorAction {
private static class Handler extends ChangeEditorActionHandler { private static class Handler extends ChangeEditorActionHandler {
public boolean execute(@NotNull Editor editor, @NotNull DataContext context, int count, int rawCount, @Nullable Argument argument) { public boolean execute(@NotNull Editor editor, @NotNull DataContext context, int count, int rawCount, @Nullable Argument argument) {
LineRange range = new LineRange(0, EditorHelper.getLineCount(editor) - 1); LineRange range = new LineRange(0, EditorHelper.getLineCount(editor) - 1);
return VimPlugin.getSearch().searchAndReplace(editor, context, range, "s", "//~/&"); return VimPlugin.getSearch().searchAndReplace(editor, range, "s", "//~/&");
} }
} }
} }

View File

@@ -39,7 +39,7 @@ public class ChangeLastSearchReplaceAction extends EditorAction {
public boolean execute(@NotNull Editor editor, @NotNull DataContext context, int count, int rawCount, @Nullable Argument argument) { public boolean execute(@NotNull Editor editor, @NotNull DataContext context, int count, int rawCount, @Nullable Argument argument) {
int line = editor.getCaretModel().getLogicalPosition().line; int line = editor.getCaretModel().getLogicalPosition().line;
LineRange range = new LineRange(line, line); LineRange range = new LineRange(line, line);
return VimPlugin.getSearch().searchAndReplace(editor, context, range, "s", "//~/"); return VimPlugin.getSearch().searchAndReplace(editor, range, "s", "//~/");
} }
} }
} }

View File

@@ -20,26 +20,53 @@ package com.maddyhome.idea.vim.action.change.change;
import com.intellij.openapi.actionSystem.DataContext; import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.editor.actionSystem.EditorAction;
import com.maddyhome.idea.vim.VimPlugin; import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.action.VimCommandAction;
import com.maddyhome.idea.vim.command.Command; import com.maddyhome.idea.vim.command.Command;
import com.maddyhome.idea.vim.command.MappingMode;
import com.maddyhome.idea.vim.command.SelectionType; import com.maddyhome.idea.vim.command.SelectionType;
import com.maddyhome.idea.vim.common.TextRange; import com.maddyhome.idea.vim.common.TextRange;
import com.maddyhome.idea.vim.handler.VisualOperatorActionHandler; import com.maddyhome.idea.vim.handler.VisualOperatorActionHandler;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
/** import javax.swing.*;
*/ import java.util.List;
public class ChangeVisualAction extends EditorAction { import java.util.Set;
public ChangeVisualAction() {
super(new Handler());
}
private static class Handler extends VisualOperatorActionHandler { /**
* @author vlan
*/
public class ChangeVisualAction extends VimCommandAction {
public ChangeVisualAction() {
super(new VisualOperatorActionHandler() {
protected boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull Command cmd, protected boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull Command cmd,
@NotNull TextRange range) { @NotNull TextRange range) {
final SelectionType type = range.isMultiple() ? SelectionType.BLOCK_WISE : SelectionType.CHARACTER_WISE; final SelectionType type = range.isMultiple() ? SelectionType.BLOCK_WISE : SelectionType.CHARACTER_WISE;
return VimPlugin.getChange().changeRange(editor, context, range, type); return VimPlugin.getChange().changeRange(editor, context, range, type);
} }
});
}
@NotNull
@Override
public Set<MappingMode> getMappingModes() {
return MappingMode.V;
}
@NotNull
@Override
public Set<List<KeyStroke>> getKeyStrokesSet() {
return parseKeysSet("c", "s");
}
@NotNull
@Override
public Command.Type getType() {
return Command.Type.CHANGE;
}
@Override
public int getFlags() {
return Command.FLAG_MULTIKEY_UNDO | Command.FLAG_EXIT_VISUAL;
} }
} }

View File

@@ -20,24 +20,59 @@ package com.maddyhome.idea.vim.action.change.change;
import com.intellij.openapi.actionSystem.DataContext; import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.editor.actionSystem.EditorAction;
import com.maddyhome.idea.vim.VimPlugin; import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.action.VimCommandAction;
import com.maddyhome.idea.vim.command.Argument;
import com.maddyhome.idea.vim.command.Command; import com.maddyhome.idea.vim.command.Command;
import com.maddyhome.idea.vim.command.MappingMode;
import com.maddyhome.idea.vim.common.TextRange; import com.maddyhome.idea.vim.common.TextRange;
import com.maddyhome.idea.vim.handler.VisualOperatorActionHandler; import com.maddyhome.idea.vim.handler.VisualOperatorActionHandler;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import javax.swing.*;
import java.util.List;
import java.util.Set;
/** /**
* @author vlan
*/ */
public class ChangeVisualCharacterAction extends EditorAction { public class ChangeVisualCharacterAction extends VimCommandAction {
public ChangeVisualCharacterAction() { public ChangeVisualCharacterAction() {
super(new Handler()); super(new VisualOperatorActionHandler() {
protected boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull Command cmd,
@NotNull TextRange range) {
final Argument argument = cmd.getArgument();
return argument != null && VimPlugin.getChange().changeCharacterRange(editor, range, argument.getCharacter());
}
});
} }
private static class Handler extends VisualOperatorActionHandler { @NotNull
protected boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull Command cmd, @NotNull TextRange range) { @Override
return VimPlugin.getChange().changeCharacterRange(editor, range, public Set<MappingMode> getMappingModes() {
cmd.getArgument().getCharacter()); return MappingMode.V;
} }
@NotNull
@Override
public Set<List<KeyStroke>> getKeyStrokesSet() {
return parseKeysSet("r");
}
@NotNull
@Override
public Command.Type getType() {
return Command.Type.CHANGE;
}
@NotNull
@Override
public Argument.Type getArgumentType() {
return Argument.Type.DIGRAPH;
}
@Override
public int getFlags() {
return Command.FLAG_ALLOW_DIGRAPH | Command.FLAG_EXIT_VISUAL;
} }
} }

View File

@@ -20,29 +20,55 @@ package com.maddyhome.idea.vim.action.change.change;
import com.intellij.openapi.actionSystem.DataContext; import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.editor.actionSystem.EditorAction;
import com.maddyhome.idea.vim.VimPlugin; import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.action.VimCommandAction;
import com.maddyhome.idea.vim.command.Command; import com.maddyhome.idea.vim.command.Command;
import com.maddyhome.idea.vim.command.MappingMode;
import com.maddyhome.idea.vim.command.SelectionType; import com.maddyhome.idea.vim.command.SelectionType;
import com.maddyhome.idea.vim.common.TextRange; import com.maddyhome.idea.vim.common.TextRange;
import com.maddyhome.idea.vim.handler.VisualOperatorActionHandler; import com.maddyhome.idea.vim.handler.VisualOperatorActionHandler;
import com.maddyhome.idea.vim.helper.EditorHelper; import com.maddyhome.idea.vim.helper.EditorHelper;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
/** import javax.swing.*;
*/ import java.util.List;
public class ChangeVisualLinesAction extends EditorAction { import java.util.Set;
public ChangeVisualLinesAction() {
super(new Handler());
}
private static class Handler extends VisualOperatorActionHandler { /**
* @author vlan
*/
public class ChangeVisualLinesAction extends VimCommandAction {
public ChangeVisualLinesAction() {
super(new VisualOperatorActionHandler() {
protected boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull Command cmd, protected boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull Command cmd,
@NotNull TextRange range) { @NotNull TextRange range) {
range = new TextRange(EditorHelper.getLineStartForOffset(editor, range.getStartOffset()), final TextRange lineRange = new TextRange(EditorHelper.getLineStartForOffset(editor, range.getStartOffset()),
EditorHelper.getLineEndForOffset(editor, range.getEndOffset()) + 1); EditorHelper.getLineEndForOffset(editor, range.getEndOffset()) + 1);
return VimPlugin.getChange().changeRange(editor, context, lineRange, SelectionType.LINE_WISE);
return VimPlugin.getChange().changeRange(editor, context, range, SelectionType.LINE_WISE);
} }
});
}
@NotNull
@Override
public Set<MappingMode> getMappingModes() {
return MappingMode.V;
}
@NotNull
@Override
public Set<List<KeyStroke>> getKeyStrokesSet() {
return parseKeysSet("R", "S");
}
@NotNull
@Override
public Command.Type getType() {
return Command.Type.CHANGE;
}
@Override
public int getFlags() {
return Command.FLAG_MOT_LINEWISE | Command.FLAG_MULTIKEY_UNDO | Command.FLAG_EXIT_VISUAL;
} }
} }

View File

@@ -20,43 +20,68 @@ package com.maddyhome.idea.vim.action.change.change;
import com.intellij.openapi.actionSystem.DataContext; import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.editor.actionSystem.EditorAction;
import com.maddyhome.idea.vim.VimPlugin; import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.action.VimCommandAction;
import com.maddyhome.idea.vim.command.Command; import com.maddyhome.idea.vim.command.Command;
import com.maddyhome.idea.vim.command.MappingMode;
import com.maddyhome.idea.vim.command.SelectionType; import com.maddyhome.idea.vim.command.SelectionType;
import com.maddyhome.idea.vim.common.TextRange; import com.maddyhome.idea.vim.common.TextRange;
import com.maddyhome.idea.vim.handler.VisualOperatorActionHandler; import com.maddyhome.idea.vim.handler.VisualOperatorActionHandler;
import com.maddyhome.idea.vim.helper.EditorHelper; import com.maddyhome.idea.vim.helper.EditorHelper;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
/** import javax.swing.*;
*/ import java.util.List;
public class ChangeVisualLinesEndAction extends EditorAction { import java.util.Set;
public ChangeVisualLinesEndAction() {
super(new Handler());
}
private static class Handler extends VisualOperatorActionHandler { /**
* @author vlan
*/
public class ChangeVisualLinesEndAction extends VimCommandAction {
public ChangeVisualLinesEndAction() {
super(new VisualOperatorActionHandler() {
protected boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull Command cmd, protected boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull Command cmd,
@NotNull TextRange range) { @NotNull TextRange range) {
if (range.isMultiple()) { if (range.isMultiple()) {
int[] starts = range.getStartOffsets(); final int[] starts = range.getStartOffsets();
int[] ends = range.getEndOffsets(); final int[] ends = range.getEndOffsets();
for (int i = 0; i < starts.length; i++) { for (int i = 0; i < starts.length; i++) {
if (ends[i] > starts[i]) { if (ends[i] > starts[i]) {
ends[i] = EditorHelper.getLineEndForOffset(editor, starts[i]); ends[i] = EditorHelper.getLineEndForOffset(editor, starts[i]);
} }
} }
final TextRange blockRange = new TextRange(starts, ends);
range = new TextRange(starts, ends); return VimPlugin.getChange().changeRange(editor, context, blockRange, SelectionType.BLOCK_WISE);
return VimPlugin.getChange().changeRange(editor, context, range, SelectionType.BLOCK_WISE);
} }
else { else {
range = new TextRange(EditorHelper.getLineStartForOffset(editor, range.getStartOffset()), final TextRange lineRange = new TextRange(EditorHelper.getLineStartForOffset(editor, range.getStartOffset()),
EditorHelper.getLineEndForOffset(editor, range.getEndOffset()) + 1); EditorHelper.getLineEndForOffset(editor, range.getEndOffset()) + 1);
return VimPlugin.getChange().changeRange(editor, context, lineRange, SelectionType.LINE_WISE);
}
}
});
}
return VimPlugin.getChange().changeRange(editor, context, range, SelectionType.LINE_WISE); @NotNull
@Override
public Set<MappingMode> getMappingModes() {
return MappingMode.V;
} }
@NotNull
@Override
public Set<List<KeyStroke>> getKeyStrokesSet() {
return parseKeysSet("C");
} }
@NotNull
@Override
public Command.Type getType() {
return Command.Type.CHANGE;
}
@Override
public int getFlags() {
return Command.FLAG_MOT_LINEWISE | Command.FLAG_MULTIKEY_UNDO | Command.FLAG_EXIT_VISUAL;
} }
} }

View File

@@ -23,6 +23,7 @@ import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.editor.LogicalPosition; import com.intellij.openapi.editor.LogicalPosition;
import com.intellij.openapi.editor.actionSystem.EditorAction; import com.intellij.openapi.editor.actionSystem.EditorAction;
import com.maddyhome.idea.vim.VimPlugin; import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.command.Argument;
import com.maddyhome.idea.vim.command.Command; import com.maddyhome.idea.vim.command.Command;
import com.maddyhome.idea.vim.common.TextRange; import com.maddyhome.idea.vim.common.TextRange;
import com.maddyhome.idea.vim.group.MotionGroup; import com.maddyhome.idea.vim.group.MotionGroup;
@@ -38,8 +39,11 @@ public class FilterMotionAction extends EditorAction {
private static class Handler extends EditorActionHandlerBase { private static class Handler extends EditorActionHandlerBase {
protected boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull Command cmd) { protected boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull Command cmd) {
TextRange range = MotionGroup.getMotionRange(editor, context, cmd.getCount(), cmd.getRawCount(), final Argument argument = cmd.getArgument();
cmd.getArgument(), false, false); if (argument == null) {
return false;
}
TextRange range = MotionGroup.getMotionRange(editor, context, cmd.getCount(), cmd.getRawCount(), argument, false);
if (range == null) { if (range == null) {
return false; return false;
} }

View File

@@ -20,25 +20,51 @@ package com.maddyhome.idea.vim.action.change.change;
import com.intellij.openapi.actionSystem.DataContext; import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.editor.actionSystem.EditorAction;
import com.maddyhome.idea.vim.VimPlugin; import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.action.VimCommandAction;
import com.maddyhome.idea.vim.command.Command; import com.maddyhome.idea.vim.command.Command;
import com.maddyhome.idea.vim.command.MappingMode;
import com.maddyhome.idea.vim.handler.EditorActionHandlerBase; import com.maddyhome.idea.vim.handler.EditorActionHandlerBase;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
/** import javax.swing.*;
*/ import java.util.List;
public class FilterVisualLinesAction extends EditorAction { import java.util.Set;
public FilterVisualLinesAction() {
super(new Handler());
}
private static class Handler extends EditorActionHandlerBase { /**
* @author vlan
*/
public class FilterVisualLinesAction extends VimCommandAction {
public FilterVisualLinesAction() {
super(new EditorActionHandlerBase() {
protected boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull Command cmd) { protected boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull Command cmd) {
VimPlugin.getProcess().startFilterCommand(editor, context, cmd); VimPlugin.getProcess().startFilterCommand(editor, context, cmd);
VimPlugin.getMotion().resetVisual(editor, true); VimPlugin.getMotion().resetVisual(editor, true);
return true; return true;
} }
});
}
@NotNull
@Override
public Set<MappingMode> getMappingModes() {
return MappingMode.V;
}
@NotNull
@Override
public Set<List<KeyStroke>> getKeyStrokesSet() {
return parseKeysSet("!");
}
@NotNull
@Override
public Command.Type getType() {
return Command.Type.CHANGE;
}
@Override
public int getFlags() {
return Command.FLAG_MOT_LINEWISE;
} }
} }

View File

@@ -20,27 +20,53 @@ package com.maddyhome.idea.vim.action.change.change;
import com.intellij.openapi.actionSystem.DataContext; import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.editor.actionSystem.EditorAction;
import com.maddyhome.idea.vim.VimPlugin; import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.action.VimCommandAction;
import com.maddyhome.idea.vim.command.Command; import com.maddyhome.idea.vim.command.Command;
import com.maddyhome.idea.vim.command.MappingMode;
import com.maddyhome.idea.vim.common.TextRange; import com.maddyhome.idea.vim.common.TextRange;
import com.maddyhome.idea.vim.handler.VisualOperatorActionHandler; import com.maddyhome.idea.vim.handler.VisualOperatorActionHandler;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import javax.swing.*;
import java.util.List;
import java.util.Set;
/** /**
* @author vlan * @author vlan
*/ */
public class ReformatCodeVisualAction extends EditorAction { public class ReformatCodeVisualAction extends VimCommandAction {
public ReformatCodeVisualAction() { public ReformatCodeVisualAction() {
super(new VisualOperatorActionHandler() { super(new VisualOperatorActionHandler() {
@Override @Override
protected boolean execute(@NotNull Editor editor, protected boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull Command cmd,
@NotNull DataContext context,
@NotNull Command cmd,
@NotNull TextRange range) { @NotNull TextRange range) {
VimPlugin.getChange().reformatCode(context); VimPlugin.getChange().reformatCode(context);
return true; return true;
} }
}); });
} }
@NotNull
@Override
public Set<MappingMode> getMappingModes() {
return MappingMode.V;
}
@NotNull
@Override
public Set<List<KeyStroke>> getKeyStrokesSet() {
return parseKeysSet("gq");
}
@NotNull
@Override
public Command.Type getType() {
return Command.Type.CHANGE;
}
@Override
public int getFlags() {
return Command.FLAG_MOT_LINEWISE | Command.FLAG_FORCE_LINEWISE | Command.FLAG_EXIT_VISUAL;
}
} }

View File

@@ -20,28 +20,51 @@ package com.maddyhome.idea.vim.action.change.delete;
import com.intellij.openapi.actionSystem.DataContext; import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.editor.actionSystem.EditorAction;
import com.maddyhome.idea.vim.VimPlugin; import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.action.VimCommandAction;
import com.maddyhome.idea.vim.command.Command; import com.maddyhome.idea.vim.command.Command;
import com.maddyhome.idea.vim.command.MappingMode;
import com.maddyhome.idea.vim.common.TextRange; import com.maddyhome.idea.vim.common.TextRange;
import com.maddyhome.idea.vim.handler.VisualOperatorActionHandler; import com.maddyhome.idea.vim.handler.VisualOperatorActionHandler;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
/** import javax.swing.*;
*/ import java.util.List;
public class DeleteJoinVisualLinesAction extends EditorAction { import java.util.Set;
public DeleteJoinVisualLinesAction() {
super(new Handler());
}
private static class Handler extends VisualOperatorActionHandler { /**
* @author vlan
*/
public class DeleteJoinVisualLinesAction extends VimCommandAction {
public DeleteJoinVisualLinesAction() {
super(new VisualOperatorActionHandler() {
protected boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull Command cmd, protected boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull Command cmd,
@NotNull TextRange range) { @NotNull TextRange range) {
if (editor.isOneLineMode()) { return !editor.isOneLineMode() && VimPlugin.getChange().deleteJoinRange(editor, range, false);
return false; }
});
} }
return VimPlugin.getChange().deleteJoinRange(editor, range, false); @NotNull
@Override
public Set<MappingMode> getMappingModes() {
return MappingMode.V;
} }
@NotNull
@Override
public Set<List<KeyStroke>> getKeyStrokesSet() {
return parseKeysSet("gJ");
}
@NotNull
@Override
public Command.Type getType() {
return Command.Type.DELETE;
}
@Override
public int getFlags() {
return Command.FLAG_EXIT_VISUAL;
} }
} }

View File

@@ -20,28 +20,51 @@ package com.maddyhome.idea.vim.action.change.delete;
import com.intellij.openapi.actionSystem.DataContext; import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.editor.actionSystem.EditorAction;
import com.maddyhome.idea.vim.VimPlugin; import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.action.VimCommandAction;
import com.maddyhome.idea.vim.command.Command; import com.maddyhome.idea.vim.command.Command;
import com.maddyhome.idea.vim.command.MappingMode;
import com.maddyhome.idea.vim.common.TextRange; import com.maddyhome.idea.vim.common.TextRange;
import com.maddyhome.idea.vim.handler.VisualOperatorActionHandler; import com.maddyhome.idea.vim.handler.VisualOperatorActionHandler;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
/** import javax.swing.*;
*/ import java.util.List;
public class DeleteJoinVisualLinesSpacesAction extends EditorAction { import java.util.Set;
public DeleteJoinVisualLinesSpacesAction() {
super(new Handler());
}
private static class Handler extends VisualOperatorActionHandler { /**
* @author vlan
*/
public class DeleteJoinVisualLinesSpacesAction extends VimCommandAction {
public DeleteJoinVisualLinesSpacesAction() {
super(new VisualOperatorActionHandler() {
protected boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull Command cmd, protected boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull Command cmd,
@NotNull TextRange range) { @NotNull TextRange range) {
if (editor.isOneLineMode()) { return !editor.isOneLineMode() && VimPlugin.getChange().deleteJoinRange(editor, range, true);
return false; }
});
} }
return VimPlugin.getChange().deleteJoinRange(editor, range, true); @NotNull
@Override
public Set<MappingMode> getMappingModes() {
return MappingMode.V;
} }
@NotNull
@Override
public Set<List<KeyStroke>> getKeyStrokesSet() {
return parseKeysSet("J");
}
@NotNull
@Override
public Command.Type getType() {
return Command.Type.DELETE;
}
@Override
public int getFlags() {
return Command.FLAG_EXIT_VISUAL;
} }
} }

View File

@@ -20,34 +20,62 @@ package com.maddyhome.idea.vim.action.change.delete;
import com.intellij.openapi.actionSystem.DataContext; import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.editor.actionSystem.EditorAction;
import com.maddyhome.idea.vim.VimPlugin; import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.action.VimCommandAction;
import com.maddyhome.idea.vim.command.Command; import com.maddyhome.idea.vim.command.Command;
import com.maddyhome.idea.vim.command.CommandState; import com.maddyhome.idea.vim.command.CommandState;
import com.maddyhome.idea.vim.command.MappingMode;
import com.maddyhome.idea.vim.command.SelectionType; import com.maddyhome.idea.vim.command.SelectionType;
import com.maddyhome.idea.vim.common.TextRange; import com.maddyhome.idea.vim.common.TextRange;
import com.maddyhome.idea.vim.handler.VisualOperatorActionHandler; import com.maddyhome.idea.vim.handler.VisualOperatorActionHandler;
import com.maddyhome.idea.vim.helper.EditorHelper; import com.maddyhome.idea.vim.helper.EditorHelper;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
/** import javax.swing.*;
*/ import java.util.List;
public class DeleteVisualAction extends EditorAction { import java.util.Set;
public DeleteVisualAction() {
super(new Handler());
}
private static class Handler extends VisualOperatorActionHandler { /**
* @author vlan
*/
public class DeleteVisualAction extends VimCommandAction {
public DeleteVisualAction() {
super(new VisualOperatorActionHandler() {
protected boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull Command cmd, protected boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull Command cmd,
@NotNull TextRange range) { @NotNull TextRange range) {
CommandState.SubMode mode = CommandState.getInstance(editor).getSubMode(); final CommandState.SubMode mode = CommandState.getInstance(editor).getSubMode();
if (mode == CommandState.SubMode.VISUAL_LINE) { if (mode == CommandState.SubMode.VISUAL_LINE) {
range = new TextRange(EditorHelper.getLineStartForOffset(editor, range.getStartOffset()), final TextRange lineRange = new TextRange(EditorHelper.getLineStartForOffset(editor, range.getStartOffset()),
EditorHelper.getLineEndForOffset(editor, range.getEndOffset()) + 1); EditorHelper.getLineEndForOffset(editor, range.getEndOffset()) + 1);
return VimPlugin.getChange().deleteRange(editor, lineRange, SelectionType.fromSubMode(mode), false);
}
else {
return VimPlugin.getChange().deleteRange(editor, range, SelectionType.fromSubMode(mode), false);
}
}
});
} }
return VimPlugin.getChange().deleteRange(editor, range, @NotNull
SelectionType.fromSubMode(mode), false); @Override
public Set<MappingMode> getMappingModes() {
return MappingMode.V;
} }
@NotNull
@Override
public Set<List<KeyStroke>> getKeyStrokesSet() {
return parseKeysSet("d", "x", "<Del>");
}
@NotNull
@Override
public Command.Type getType() {
return Command.Type.DELETE;
}
@Override
public int getFlags() {
return Command.FLAG_EXIT_VISUAL;
} }
} }

View File

@@ -20,37 +20,62 @@ package com.maddyhome.idea.vim.action.change.delete;
import com.intellij.openapi.actionSystem.DataContext; import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.editor.actionSystem.EditorAction;
import com.maddyhome.idea.vim.VimPlugin; import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.action.VimCommandAction;
import com.maddyhome.idea.vim.command.Command; import com.maddyhome.idea.vim.command.Command;
import com.maddyhome.idea.vim.command.CommandState; import com.maddyhome.idea.vim.command.CommandState;
import com.maddyhome.idea.vim.command.MappingMode;
import com.maddyhome.idea.vim.command.SelectionType; import com.maddyhome.idea.vim.command.SelectionType;
import com.maddyhome.idea.vim.common.TextRange; import com.maddyhome.idea.vim.common.TextRange;
import com.maddyhome.idea.vim.handler.VisualOperatorActionHandler; import com.maddyhome.idea.vim.handler.VisualOperatorActionHandler;
import com.maddyhome.idea.vim.helper.EditorHelper; import com.maddyhome.idea.vim.helper.EditorHelper;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
/** import javax.swing.*;
*/ import java.util.List;
public class DeleteVisualLinesAction extends EditorAction { import java.util.Set;
public DeleteVisualLinesAction() {
super(new Handler());
}
private static class Handler extends VisualOperatorActionHandler { /**
* @author vlan
*/
public class DeleteVisualLinesAction extends VimCommandAction {
public DeleteVisualLinesAction() {
super(new VisualOperatorActionHandler() {
protected boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull Command cmd, protected boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull Command cmd,
@NotNull TextRange range) { @NotNull TextRange range) {
CommandState.SubMode mode = CommandState.getInstance(editor).getSubMode(); final CommandState.SubMode mode = CommandState.getInstance(editor).getSubMode();
if (mode == CommandState.SubMode.VISUAL_BLOCK) { if (mode == CommandState.SubMode.VISUAL_BLOCK) {
return VimPlugin.getChange().deleteRange(editor, range, return VimPlugin.getChange().deleteRange(editor, range, SelectionType.fromSubMode(mode), false);
SelectionType.fromSubMode(mode), false);
} }
else { else {
range = new TextRange(EditorHelper.getLineStartForOffset(editor, range.getStartOffset()), final TextRange lineRange = new TextRange(EditorHelper.getLineStartForOffset(editor, range.getStartOffset()),
EditorHelper.getLineEndForOffset(editor, range.getEndOffset()) + 1); EditorHelper.getLineEndForOffset(editor, range.getEndOffset()) + 1);
return VimPlugin.getChange().deleteRange(editor, lineRange, SelectionType.LINE_WISE, false);
}
}
});
}
return VimPlugin.getChange().deleteRange(editor, range, SelectionType.LINE_WISE, false); @NotNull
@Override
public Set<MappingMode> getMappingModes() {
return MappingMode.V;
} }
@NotNull
@Override
public Set<List<KeyStroke>> getKeyStrokesSet() {
return parseKeysSet("X");
} }
@NotNull
@Override
public Command.Type getType() {
return Command.Type.DELETE;
}
@Override
public int getFlags() {
return Command.FLAG_MOT_LINEWISE | Command.FLAG_EXIT_VISUAL;
} }
} }

View File

@@ -20,45 +20,68 @@ package com.maddyhome.idea.vim.action.change.delete;
import com.intellij.openapi.actionSystem.DataContext; import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.editor.actionSystem.EditorAction;
import com.maddyhome.idea.vim.VimPlugin; import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.action.VimCommandAction;
import com.maddyhome.idea.vim.command.Command; import com.maddyhome.idea.vim.command.Command;
import com.maddyhome.idea.vim.command.MappingMode;
import com.maddyhome.idea.vim.command.SelectionType; import com.maddyhome.idea.vim.command.SelectionType;
import com.maddyhome.idea.vim.common.TextRange; import com.maddyhome.idea.vim.common.TextRange;
import com.maddyhome.idea.vim.handler.VisualOperatorActionHandler; import com.maddyhome.idea.vim.handler.VisualOperatorActionHandler;
import com.maddyhome.idea.vim.helper.EditorHelper; import com.maddyhome.idea.vim.helper.EditorHelper;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
/** import javax.swing.*;
*/ import java.util.List;
public class DeleteVisualLinesEndAction extends EditorAction { import java.util.Set;
public DeleteVisualLinesEndAction() {
super(new Handler());
}
private static class Handler extends VisualOperatorActionHandler { /**
* @author vlan
*/
public class DeleteVisualLinesEndAction extends VimCommandAction {
public DeleteVisualLinesEndAction() {
super(new VisualOperatorActionHandler() {
protected boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull Command cmd, protected boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull Command cmd,
@NotNull TextRange range) { @NotNull TextRange range) {
if (range.isMultiple()) { if (range.isMultiple()) {
int[] starts = range.getStartOffsets(); final int[] starts = range.getStartOffsets();
int[] ends = range.getEndOffsets(); final int[] ends = range.getEndOffsets();
for (int i = 0; i < starts.length; i++) { for (int i = 0; i < starts.length; i++) {
if (ends[i] > starts[i]) { if (ends[i] > starts[i]) {
ends[i] = EditorHelper.getLineEndForOffset(editor, starts[i]); ends[i] = EditorHelper.getLineEndForOffset(editor, starts[i]);
} }
} }
final TextRange blockRange = new TextRange(starts, ends);
range = new TextRange(starts, ends); return VimPlugin.getChange().deleteRange(editor, blockRange, SelectionType.BLOCK_WISE, false);
return VimPlugin.getChange().deleteRange(editor, range,
SelectionType.BLOCK_WISE, false);
} }
else { else {
range = new TextRange(EditorHelper.getLineStartForOffset(editor, range.getStartOffset()), final TextRange lineRange = new TextRange(EditorHelper.getLineStartForOffset(editor, range.getStartOffset()),
EditorHelper.getLineEndForOffset(editor, range.getEndOffset()) + 1); EditorHelper.getLineEndForOffset(editor, range.getEndOffset()) + 1);
return VimPlugin.getChange().deleteRange(editor, lineRange, SelectionType.LINE_WISE, false);
}
}
});
}
return VimPlugin.getChange().deleteRange(editor, range, @NotNull
SelectionType.LINE_WISE, false); @Override
public Set<MappingMode> getMappingModes() {
return MappingMode.V;
} }
@NotNull
@Override
public Set<List<KeyStroke>> getKeyStrokesSet() {
return parseKeysSet("D");
} }
@NotNull
@Override
public Command.Type getType() {
return Command.Type.DELETE;
}
@Override
public int getFlags() {
return Command.FLAG_MOT_LINEWISE | Command.FLAG_EXIT_VISUAL;
} }
} }

View File

@@ -33,8 +33,6 @@ import javax.swing.*;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
import static com.maddyhome.idea.vim.helper.StringHelper.parseKeysSet;
public class InsertBeforeCursorAction extends VimCommandAction { public class InsertBeforeCursorAction extends VimCommandAction {
public InsertBeforeCursorAction() { public InsertBeforeCursorAction() {
super(new ChangeEditorActionHandler() { super(new ChangeEditorActionHandler() {

View File

@@ -33,8 +33,6 @@ import javax.swing.*;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
import static com.maddyhome.idea.vim.helper.StringHelper.parseKeysSet;
public class InsertExitModeAction extends VimCommandAction { public class InsertExitModeAction extends VimCommandAction {
private static final String ACTION_ID = "VimInsertExitMode"; private static final String ACTION_ID = "VimInsertExitMode";

View File

@@ -22,6 +22,7 @@ import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.editor.actionSystem.EditorAction; import com.intellij.openapi.editor.actionSystem.EditorAction;
import com.maddyhome.idea.vim.VimPlugin; import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.command.Argument;
import com.maddyhome.idea.vim.command.Command; import com.maddyhome.idea.vim.command.Command;
import com.maddyhome.idea.vim.handler.EditorActionHandlerBase; import com.maddyhome.idea.vim.handler.EditorActionHandlerBase;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@@ -35,7 +36,8 @@ public class InsertRegisterAction extends EditorAction {
private static class Handler extends EditorActionHandlerBase { private static class Handler extends EditorActionHandlerBase {
public boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull Command cmd) { public boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull Command cmd) {
return VimPlugin.getChange().insertRegister(editor, context, cmd.getArgument().getCharacter()); final Argument argument = cmd.getArgument();
return argument != null && VimPlugin.getChange().insertRegister(editor, context, argument.getCharacter());
} }
} }
} }

View File

@@ -20,28 +20,51 @@ package com.maddyhome.idea.vim.action.change.insert;
import com.intellij.openapi.actionSystem.DataContext; import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.editor.actionSystem.EditorAction;
import com.maddyhome.idea.vim.VimPlugin; import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.action.VimCommandAction;
import com.maddyhome.idea.vim.command.Command; import com.maddyhome.idea.vim.command.Command;
import com.maddyhome.idea.vim.command.MappingMode;
import com.maddyhome.idea.vim.common.TextRange; import com.maddyhome.idea.vim.common.TextRange;
import com.maddyhome.idea.vim.handler.VisualOperatorActionHandler; import com.maddyhome.idea.vim.handler.VisualOperatorActionHandler;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
/** import javax.swing.*;
*/ import java.util.List;
public class VisualBlockAppendAction extends EditorAction { import java.util.Set;
public VisualBlockAppendAction() {
super(new Handler());
}
private static class Handler extends VisualOperatorActionHandler { /**
* @author vlan
*/
public class VisualBlockAppendAction extends VimCommandAction {
public VisualBlockAppendAction() {
super(new VisualOperatorActionHandler() {
protected boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull Command cmd, protected boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull Command cmd,
@NotNull TextRange range) { @NotNull TextRange range) {
if (editor.isOneLineMode()) { return !editor.isOneLineMode() && VimPlugin.getChange().blockInsert(editor, context, range, true);
return false; }
});
} }
return VimPlugin.getChange().blockInsert(editor, context, range, true); @NotNull
@Override
public Set<MappingMode> getMappingModes() {
return MappingMode.V;
} }
@NotNull
@Override
public Set<List<KeyStroke>> getKeyStrokesSet() {
return parseKeysSet("A");
}
@NotNull
@Override
public Command.Type getType() {
return Command.Type.INSERT;
}
@Override
public int getFlags() {
return Command.FLAG_MULTIKEY_UNDO | Command.FLAG_EXIT_VISUAL;
} }
} }

View File

@@ -20,28 +20,51 @@ package com.maddyhome.idea.vim.action.change.insert;
import com.intellij.openapi.actionSystem.DataContext; import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.editor.actionSystem.EditorAction;
import com.maddyhome.idea.vim.VimPlugin; import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.action.VimCommandAction;
import com.maddyhome.idea.vim.command.Command; import com.maddyhome.idea.vim.command.Command;
import com.maddyhome.idea.vim.command.MappingMode;
import com.maddyhome.idea.vim.common.TextRange; import com.maddyhome.idea.vim.common.TextRange;
import com.maddyhome.idea.vim.handler.VisualOperatorActionHandler; import com.maddyhome.idea.vim.handler.VisualOperatorActionHandler;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
/** import javax.swing.*;
*/ import java.util.List;
public class VisualBlockInsertAction extends EditorAction { import java.util.Set;
public VisualBlockInsertAction() {
super(new Handler());
}
private static class Handler extends VisualOperatorActionHandler { /**
* @author vlan
*/
public class VisualBlockInsertAction extends VimCommandAction {
public VisualBlockInsertAction() {
super(new VisualOperatorActionHandler() {
protected boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull Command cmd, protected boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull Command cmd,
@NotNull TextRange range) { @NotNull TextRange range) {
if (editor.isOneLineMode()) { return !editor.isOneLineMode() && VimPlugin.getChange().blockInsert(editor, context, range, false);
return false; }
});
} }
return VimPlugin.getChange().blockInsert(editor, context, range, false); @NotNull
@Override
public Set<MappingMode> getMappingModes() {
return MappingMode.V;
} }
@NotNull
@Override
public Set<List<KeyStroke>> getKeyStrokesSet() {
return parseKeysSet("I");
}
@NotNull
@Override
public Command.Type getType() {
return Command.Type.INSERT;
}
@Override
public int getFlags() {
return Command.FLAG_MULTIKEY_UNDO | Command.FLAG_EXIT_VISUAL;
} }
} }

View File

@@ -20,25 +20,52 @@ package com.maddyhome.idea.vim.action.change.shift;
import com.intellij.openapi.actionSystem.DataContext; import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.editor.actionSystem.EditorAction;
import com.maddyhome.idea.vim.VimPlugin; import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.action.VimCommandAction;
import com.maddyhome.idea.vim.command.Command; import com.maddyhome.idea.vim.command.Command;
import com.maddyhome.idea.vim.command.MappingMode;
import com.maddyhome.idea.vim.common.TextRange; import com.maddyhome.idea.vim.common.TextRange;
import com.maddyhome.idea.vim.handler.VisualOperatorActionHandler; import com.maddyhome.idea.vim.handler.VisualOperatorActionHandler;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import javax.swing.*;
import java.util.List;
import java.util.Set;
/** /**
* @author vlan
*/ */
public class ShiftLeftVisualAction extends EditorAction { public class ShiftLeftVisualAction extends VimCommandAction {
public ShiftLeftVisualAction() { public ShiftLeftVisualAction() {
super(new Handler()); super(new VisualOperatorActionHandler() {
} protected boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull Command cmd,
@NotNull TextRange range) {
private static class Handler extends VisualOperatorActionHandler {
protected boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull Command cmd, @NotNull TextRange range) {
VimPlugin.getChange().indentRange(editor, context, range, cmd.getCount(), -1); VimPlugin.getChange().indentRange(editor, context, range, cmd.getCount(), -1);
return true; return true;
} }
});
}
@NotNull
@Override
public Set<MappingMode> getMappingModes() {
return MappingMode.V;
}
@NotNull
@Override
public Set<List<KeyStroke>> getKeyStrokesSet() {
return parseKeysSet("<");
}
@NotNull
@Override
public Command.Type getType() {
return Command.Type.CHANGE;
}
@Override
public int getFlags() {
return Command.FLAG_EXIT_VISUAL;
} }
} }

View File

@@ -20,25 +20,52 @@ package com.maddyhome.idea.vim.action.change.shift;
import com.intellij.openapi.actionSystem.DataContext; import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.editor.actionSystem.EditorAction;
import com.maddyhome.idea.vim.VimPlugin; import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.action.VimCommandAction;
import com.maddyhome.idea.vim.command.Command; import com.maddyhome.idea.vim.command.Command;
import com.maddyhome.idea.vim.command.MappingMode;
import com.maddyhome.idea.vim.common.TextRange; import com.maddyhome.idea.vim.common.TextRange;
import com.maddyhome.idea.vim.handler.VisualOperatorActionHandler; import com.maddyhome.idea.vim.handler.VisualOperatorActionHandler;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import javax.swing.*;
import java.util.List;
import java.util.Set;
/** /**
* @author vlan
*/ */
public class ShiftRightVisualAction extends EditorAction { public class ShiftRightVisualAction extends VimCommandAction {
public ShiftRightVisualAction() { public ShiftRightVisualAction() {
super(new Handler()); super(new VisualOperatorActionHandler() {
} protected boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull Command cmd,
@NotNull TextRange range) {
private static class Handler extends VisualOperatorActionHandler {
protected boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull Command cmd, @NotNull TextRange range) {
VimPlugin.getChange().indentRange(editor, context, range, cmd.getCount(), 1); VimPlugin.getChange().indentRange(editor, context, range, cmd.getCount(), 1);
return true; return true;
} }
});
}
@NotNull
@Override
public Set<MappingMode> getMappingModes() {
return MappingMode.V;
}
@NotNull
@Override
public Set<List<KeyStroke>> getKeyStrokesSet() {
return parseKeysSet(">");
}
@NotNull
@Override
public Command.Type getType() {
return Command.Type.CHANGE;
}
@Override
public int getFlags() {
return Command.FLAG_EXIT_VISUAL;
} }
} }

View File

@@ -20,23 +20,51 @@ package com.maddyhome.idea.vim.action.copy;
import com.intellij.openapi.actionSystem.DataContext; import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.editor.actionSystem.EditorAction;
import com.maddyhome.idea.vim.VimPlugin; import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.action.VimCommandAction;
import com.maddyhome.idea.vim.command.Command; import com.maddyhome.idea.vim.command.Command;
import com.maddyhome.idea.vim.command.MappingMode;
import com.maddyhome.idea.vim.common.TextRange; import com.maddyhome.idea.vim.common.TextRange;
import com.maddyhome.idea.vim.handler.VisualOperatorActionHandler; import com.maddyhome.idea.vim.handler.VisualOperatorActionHandler;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
/** import javax.swing.*;
*/ import java.util.List;
public class PutVisualTextAction extends EditorAction { import java.util.Set;
public PutVisualTextAction() {
super(new Handler());
}
private static class Handler extends VisualOperatorActionHandler { /**
protected boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull Command cmd, @NotNull TextRange range) { * @author vlan
*/
public class PutVisualTextAction extends VimCommandAction {
public PutVisualTextAction() {
super(new VisualOperatorActionHandler() {
protected boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull Command cmd,
@NotNull TextRange range) {
return VimPlugin.getCopy().putVisualRange(editor, context, range, cmd.getCount(), true, false); return VimPlugin.getCopy().putVisualRange(editor, context, range, cmd.getCount(), true, false);
} }
});
}
@NotNull
@Override
public Set<MappingMode> getMappingModes() {
return MappingMode.V;
}
@NotNull
@Override
public Set<List<KeyStroke>> getKeyStrokesSet() {
return parseKeysSet("p", "P");
}
@NotNull
@Override
public Command.Type getType() {
return Command.Type.PASTE;
}
@Override
public int getFlags() {
return Command.FLAG_EXIT_VISUAL;
} }
} }

View File

@@ -20,23 +20,51 @@ package com.maddyhome.idea.vim.action.copy;
import com.intellij.openapi.actionSystem.DataContext; import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.editor.actionSystem.EditorAction;
import com.maddyhome.idea.vim.VimPlugin; import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.action.VimCommandAction;
import com.maddyhome.idea.vim.command.Command; import com.maddyhome.idea.vim.command.Command;
import com.maddyhome.idea.vim.command.MappingMode;
import com.maddyhome.idea.vim.common.TextRange; import com.maddyhome.idea.vim.common.TextRange;
import com.maddyhome.idea.vim.handler.VisualOperatorActionHandler; import com.maddyhome.idea.vim.handler.VisualOperatorActionHandler;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
/** import javax.swing.*;
*/ import java.util.List;
public class PutVisualTextMoveCursorAction extends EditorAction { import java.util.Set;
public PutVisualTextMoveCursorAction() {
super(new Handler());
}
private static class Handler extends VisualOperatorActionHandler { /**
protected boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull Command cmd, @NotNull TextRange range) { * @author vlan
*/
public class PutVisualTextMoveCursorAction extends VimCommandAction {
public PutVisualTextMoveCursorAction() {
super(new VisualOperatorActionHandler() {
protected boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull Command cmd,
@NotNull TextRange range) {
return VimPlugin.getCopy().putVisualRange(editor, context, range, cmd.getCount(), true, true); return VimPlugin.getCopy().putVisualRange(editor, context, range, cmd.getCount(), true, true);
} }
});
}
@NotNull
@Override
public Set<MappingMode> getMappingModes() {
return MappingMode.V;
}
@NotNull
@Override
public Set<List<KeyStroke>> getKeyStrokesSet() {
return parseKeysSet("gp", "gP");
}
@NotNull
@Override
public Command.Type getType() {
return Command.Type.PASTE;
}
@Override
public int getFlags() {
return Command.FLAG_EXIT_VISUAL;
} }
} }

View File

@@ -20,23 +20,51 @@ package com.maddyhome.idea.vim.action.copy;
import com.intellij.openapi.actionSystem.DataContext; import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.editor.actionSystem.EditorAction;
import com.maddyhome.idea.vim.VimPlugin; import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.action.VimCommandAction;
import com.maddyhome.idea.vim.command.Command; import com.maddyhome.idea.vim.command.Command;
import com.maddyhome.idea.vim.command.MappingMode;
import com.maddyhome.idea.vim.common.TextRange; import com.maddyhome.idea.vim.common.TextRange;
import com.maddyhome.idea.vim.handler.VisualOperatorActionHandler; import com.maddyhome.idea.vim.handler.VisualOperatorActionHandler;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
/** import javax.swing.*;
*/ import java.util.List;
public class PutVisualTextNoIndentAction extends EditorAction { import java.util.Set;
public PutVisualTextNoIndentAction() {
super(new Handler());
}
private static class Handler extends VisualOperatorActionHandler { /**
protected boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull Command cmd, @NotNull TextRange range) { * @author vlan
*/
public class PutVisualTextNoIndentAction extends VimCommandAction {
public PutVisualTextNoIndentAction() {
super(new VisualOperatorActionHandler() {
protected boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull Command cmd,
@NotNull TextRange range) {
return VimPlugin.getCopy().putVisualRange(editor, context, range, cmd.getCount(), false, false); return VimPlugin.getCopy().putVisualRange(editor, context, range, cmd.getCount(), false, false);
} }
});
}
@NotNull
@Override
public Set<MappingMode> getMappingModes() {
return MappingMode.V;
}
@NotNull
@Override
public Set<List<KeyStroke>> getKeyStrokesSet() {
return parseKeysSet("[p", "]p", "[P", "]P");
}
@NotNull
@Override
public Command.Type getType() {
return Command.Type.PASTE;
}
@Override
public int getFlags() {
return Command.FLAG_EXIT_VISUAL;
} }
} }

View File

@@ -22,6 +22,7 @@ import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.editor.actionSystem.EditorAction; import com.intellij.openapi.editor.actionSystem.EditorAction;
import com.maddyhome.idea.vim.VimPlugin; import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.command.Argument;
import com.maddyhome.idea.vim.command.Command; import com.maddyhome.idea.vim.command.Command;
import com.maddyhome.idea.vim.handler.EditorActionHandlerBase; import com.maddyhome.idea.vim.handler.EditorActionHandlerBase;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@@ -37,7 +38,8 @@ public class SelectRegisterAction extends EditorAction {
private static class Handler extends EditorActionHandlerBase { private static class Handler extends EditorActionHandlerBase {
@Override @Override
protected boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull Command cmd) { protected boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull Command cmd) {
return VimPlugin.getRegister().selectRegister(cmd.getArgument().getCharacter()); final Argument argument = cmd.getArgument();
return argument != null && VimPlugin.getRegister().selectRegister(argument.getCharacter());
} }
} }
} }

View File

@@ -22,6 +22,7 @@ import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.editor.actionSystem.EditorAction; import com.intellij.openapi.editor.actionSystem.EditorAction;
import com.maddyhome.idea.vim.VimPlugin; import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.command.Argument;
import com.maddyhome.idea.vim.command.Command; import com.maddyhome.idea.vim.command.Command;
import com.maddyhome.idea.vim.handler.EditorActionHandlerBase; import com.maddyhome.idea.vim.handler.EditorActionHandlerBase;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@@ -35,7 +36,9 @@ public class YankMotionAction extends EditorAction {
private static class Handler extends EditorActionHandlerBase { private static class Handler extends EditorActionHandlerBase {
protected boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull Command cmd) { protected boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull Command cmd) {
return VimPlugin.getCopy().yankMotion(editor, context, cmd.getCount(), cmd.getRawCount(), cmd.getArgument()); final Argument argument = cmd.getArgument();
return argument != null && VimPlugin.getCopy().yankMotion(editor, context, cmd.getCount(), cmd.getRawCount(),
argument);
} }
} }
} }

View File

@@ -20,28 +20,54 @@ package com.maddyhome.idea.vim.action.copy;
import com.intellij.openapi.actionSystem.DataContext; import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.editor.actionSystem.EditorAction;
import com.maddyhome.idea.vim.VimPlugin; import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.action.VimCommandAction;
import com.maddyhome.idea.vim.command.Command; import com.maddyhome.idea.vim.command.Command;
import com.maddyhome.idea.vim.command.CommandState; import com.maddyhome.idea.vim.command.CommandState;
import com.maddyhome.idea.vim.command.MappingMode;
import com.maddyhome.idea.vim.command.SelectionType; import com.maddyhome.idea.vim.command.SelectionType;
import com.maddyhome.idea.vim.common.TextRange; import com.maddyhome.idea.vim.common.TextRange;
import com.maddyhome.idea.vim.handler.VisualOperatorActionHandler; import com.maddyhome.idea.vim.handler.VisualOperatorActionHandler;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
/** import javax.swing.*;
*/ import java.util.List;
public class YankVisualAction extends EditorAction { import java.util.Set;
public YankVisualAction() {
super(new Handler());
}
private static class Handler extends VisualOperatorActionHandler { /**
* @author vlan
*/
public class YankVisualAction extends VimCommandAction {
public YankVisualAction() {
super(new VisualOperatorActionHandler() {
protected boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull Command cmd, protected boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull Command cmd,
@NotNull TextRange range) { @NotNull TextRange range) {
final CommandState.SubMode subMode = CommandState.getInstance(editor).getSubMode(); final CommandState.SubMode subMode = CommandState.getInstance(editor).getSubMode();
return VimPlugin.getCopy().yankRange(editor, range, return VimPlugin.getCopy().yankRange(editor, range, SelectionType.fromSubMode(subMode), true);
SelectionType.fromSubMode(subMode), true);
} }
});
}
@NotNull
@Override
public Set<MappingMode> getMappingModes() {
return MappingMode.V;
}
@NotNull
@Override
public Set<List<KeyStroke>> getKeyStrokesSet() {
return parseKeysSet("y");
}
@NotNull
@Override
public Command.Type getType() {
return Command.Type.COPY;
}
@Override
public int getFlags() {
return Command.FLAG_EXIT_VISUAL;
} }
} }

View File

@@ -20,37 +20,62 @@ package com.maddyhome.idea.vim.action.copy;
import com.intellij.openapi.actionSystem.DataContext; import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.editor.actionSystem.EditorAction;
import com.maddyhome.idea.vim.VimPlugin; import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.action.VimCommandAction;
import com.maddyhome.idea.vim.command.Command; import com.maddyhome.idea.vim.command.Command;
import com.maddyhome.idea.vim.command.CommandState; import com.maddyhome.idea.vim.command.CommandState;
import com.maddyhome.idea.vim.command.MappingMode;
import com.maddyhome.idea.vim.command.SelectionType; import com.maddyhome.idea.vim.command.SelectionType;
import com.maddyhome.idea.vim.common.TextRange; import com.maddyhome.idea.vim.common.TextRange;
import com.maddyhome.idea.vim.handler.VisualOperatorActionHandler; import com.maddyhome.idea.vim.handler.VisualOperatorActionHandler;
import com.maddyhome.idea.vim.helper.EditorHelper; import com.maddyhome.idea.vim.helper.EditorHelper;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
/** import javax.swing.*;
*/ import java.util.List;
public class YankVisualLinesAction extends EditorAction { import java.util.Set;
public YankVisualLinesAction() {
super(new Handler());
}
private static class Handler extends VisualOperatorActionHandler { /**
* @author vlan
*/
public class YankVisualLinesAction extends VimCommandAction {
public YankVisualLinesAction() {
super(new VisualOperatorActionHandler() {
protected boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull Command cmd, protected boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull Command cmd,
@NotNull TextRange range) { @NotNull TextRange range) {
CommandState.SubMode mode = CommandState.getInstance(editor).getSubMode(); final CommandState.SubMode mode = CommandState.getInstance(editor).getSubMode();
if (mode == CommandState.SubMode.VISUAL_BLOCK) { if (mode == CommandState.SubMode.VISUAL_BLOCK) {
return VimPlugin.getCopy().yankRange(editor, range, SelectionType.fromSubMode(mode), return VimPlugin.getCopy().yankRange(editor, range, SelectionType.fromSubMode(mode), true);
true);
} }
else { else {
range = new TextRange(EditorHelper.getLineStartForOffset(editor, range.getStartOffset()), final TextRange lineRange = new TextRange(EditorHelper.getLineStartForOffset(editor, range.getStartOffset()),
EditorHelper.getLineEndForOffset(editor, range.getEndOffset()) + 1); EditorHelper.getLineEndForOffset(editor, range.getEndOffset()) + 1);
return VimPlugin.getCopy().yankRange(editor, lineRange, SelectionType.LINE_WISE, true);
}
}
});
}
return VimPlugin.getCopy().yankRange(editor, range, SelectionType.LINE_WISE, true); @NotNull
@Override
public Set<MappingMode> getMappingModes() {
return MappingMode.V;
} }
@NotNull
@Override
public Set<List<KeyStroke>> getKeyStrokesSet() {
return parseKeysSet("Y");
} }
@NotNull
@Override
public Command.Type getType() {
return Command.Type.COPY;
}
@Override
public int getFlags() {
return Command.FLAG_MOT_LINEWISE | Command.FLAG_EXIT_VISUAL;
} }
} }

View File

@@ -26,8 +26,6 @@ import com.maddyhome.idea.vim.command.Command;
import com.maddyhome.idea.vim.handler.EditorActionHandlerBase; import com.maddyhome.idea.vim.handler.EditorActionHandlerBase;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import javax.swing.*;
/** /**
*/ */
public class BackspaceAction extends EditorAction { public class BackspaceAction extends EditorAction {
@@ -37,8 +35,7 @@ public class BackspaceAction extends EditorAction {
private static class Handler extends EditorActionHandlerBase { private static class Handler extends EditorActionHandlerBase {
protected boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull Command cmd) { protected boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull Command cmd) {
return VimPlugin.getProcess().processExKey(editor, return VimPlugin.getProcess().processExKey(editor, cmd.getKeys().get(0));
(KeyStroke)cmd.getKeys().get(0), false);
} }
} }
} }

View File

@@ -26,8 +26,6 @@ import com.maddyhome.idea.vim.command.Command;
import com.maddyhome.idea.vim.handler.EditorActionHandlerBase; import com.maddyhome.idea.vim.handler.EditorActionHandlerBase;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import javax.swing.*;
/** /**
*/ */
public class ProcessExKeyAction extends EditorAction { public class ProcessExKeyAction extends EditorAction {
@@ -37,8 +35,7 @@ public class ProcessExKeyAction extends EditorAction {
private static class Handler extends EditorActionHandlerBase { private static class Handler extends EditorActionHandlerBase {
protected boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull Command cmd) { protected boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull Command cmd) {
return VimPlugin.getProcess().processExKey(editor, return VimPlugin.getProcess().processExKey(editor, cmd.getKeys().get(0));
(KeyStroke)cmd.getKeys().get(0), false);
} }
} }
} }

View File

@@ -22,6 +22,7 @@ import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.actionSystem.PlatformDataKeys; import com.intellij.openapi.actionSystem.PlatformDataKeys;
import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.editor.actionSystem.EditorAction; import com.intellij.openapi.editor.actionSystem.EditorAction;
import com.intellij.openapi.project.Project;
import com.maddyhome.idea.vim.VimPlugin; import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.command.Command; import com.maddyhome.idea.vim.command.Command;
import com.maddyhome.idea.vim.handler.EditorActionHandlerBase; import com.maddyhome.idea.vim.handler.EditorActionHandlerBase;
@@ -36,9 +37,8 @@ public class PlaybackLastRegisterAction extends EditorAction {
private static class Handler extends EditorActionHandlerBase { private static class Handler extends EditorActionHandlerBase {
protected boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull Command cmd) { protected boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull Command cmd) {
return VimPlugin.getMacro().playbackLastRegister(editor, context, final Project project = PlatformDataKeys.PROJECT.getData(context);
PlatformDataKeys.PROJECT.getData(context), return VimPlugin.getMacro().playbackLastRegister(editor, context, project, cmd.getCount());
cmd.getCount()); // API change - don't merge
} }
} }
} }

View File

@@ -22,7 +22,9 @@ import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.actionSystem.PlatformDataKeys; import com.intellij.openapi.actionSystem.PlatformDataKeys;
import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.editor.actionSystem.EditorAction; import com.intellij.openapi.editor.actionSystem.EditorAction;
import com.intellij.openapi.project.Project;
import com.maddyhome.idea.vim.VimPlugin; import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.command.Argument;
import com.maddyhome.idea.vim.command.Command; import com.maddyhome.idea.vim.command.Command;
import com.maddyhome.idea.vim.handler.EditorActionHandlerBase; import com.maddyhome.idea.vim.handler.EditorActionHandlerBase;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@@ -36,10 +38,13 @@ public class PlaybackRegisterAction extends EditorAction {
private static class Handler extends EditorActionHandlerBase { private static class Handler extends EditorActionHandlerBase {
protected boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull Command cmd) { protected boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull Command cmd) {
char reg = cmd.getArgument().getCharacter(); final Argument argument = cmd.getArgument();
return VimPlugin.getMacro().playbackRegister(editor, context, if (argument == null) {
PlatformDataKeys.PROJECT.getData(context), reg, return false;
cmd.getCount()); // API change - don't merge }
final char reg = argument.getCharacter();
final Project project = PlatformDataKeys.PROJECT.getData(context);
return VimPlugin.getMacro().playbackRegister(editor, context, project, reg, cmd.getCount());
} }
} }
} }

View File

@@ -22,6 +22,7 @@ import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.editor.actionSystem.EditorAction; import com.intellij.openapi.editor.actionSystem.EditorAction;
import com.maddyhome.idea.vim.VimPlugin; import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.command.Argument;
import com.maddyhome.idea.vim.command.Command; import com.maddyhome.idea.vim.command.Command;
import com.maddyhome.idea.vim.command.CommandState; import com.maddyhome.idea.vim.command.CommandState;
import com.maddyhome.idea.vim.handler.EditorActionHandlerBase; import com.maddyhome.idea.vim.handler.EditorActionHandlerBase;
@@ -37,7 +38,11 @@ public class ToggleRecordingAction extends EditorAction {
private static class Handler extends EditorActionHandlerBase { private static class Handler extends EditorActionHandlerBase {
protected boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull Command cmd) { protected boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull Command cmd) {
if (!CommandState.getInstance(editor).isRecording()) { if (!CommandState.getInstance(editor).isRecording()) {
char reg = cmd.getArgument().getCharacter(); final Argument argument = cmd.getArgument();
if (argument == null) {
return false;
}
char reg = argument.getCharacter();
return VimPlugin.getRegister().startRecording(editor, reg); return VimPlugin.getRegister().startRecording(editor, reg);
} }
else { else {

View File

@@ -36,5 +36,5 @@ public abstract class MotionEditorAction extends EditorAction {
return handler.getOffset(editor, context, count, rawCount, argument); return handler.getOffset(editor, context, count, rawCount, argument);
} }
private MotionEditorActionHandler handler; private final MotionEditorActionHandler handler;
} }

View File

@@ -39,5 +39,5 @@ public abstract class TextObjectAction extends EditorAction {
return handler.getRange(editor, context, count, rawCount, argument); return handler.getRange(editor, context, count, rawCount, argument);
} }
private TextObjectActionHandler handler; private final TextObjectActionHandler handler;
} }

View File

@@ -35,7 +35,7 @@ public class MotionJumpNextAction extends MotionEditorAction {
private static class Handler extends MotionEditorActionHandler { private static class Handler extends MotionEditorActionHandler {
public int getOffset(@NotNull Editor editor, DataContext context, int count, int rawCount, Argument argument) { public int getOffset(@NotNull Editor editor, DataContext context, int count, int rawCount, Argument argument) {
return VimPlugin.getMotion().moveCaretToJump(editor, context, count); return VimPlugin.getMotion().moveCaretToJump(editor, count);
} }
} }
} }

View File

@@ -35,7 +35,7 @@ public class MotionJumpPreviousAction extends MotionEditorAction {
private static class Handler extends MotionEditorActionHandler { private static class Handler extends MotionEditorActionHandler {
public int getOffset(@NotNull Editor editor, DataContext context, int count, int rawCount, Argument argument) { public int getOffset(@NotNull Editor editor, DataContext context, int count, int rawCount, Argument argument) {
return VimPlugin.getMotion().moveCaretToJump(editor, context, -count); return VimPlugin.getMotion().moveCaretToJump(editor, -count);
} }
} }
} }

View File

@@ -22,6 +22,7 @@ import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.editor.actionSystem.EditorAction; import com.intellij.openapi.editor.actionSystem.EditorAction;
import com.maddyhome.idea.vim.VimPlugin; import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.command.Argument;
import com.maddyhome.idea.vim.command.Command; import com.maddyhome.idea.vim.command.Command;
import com.maddyhome.idea.vim.handler.EditorActionHandlerBase; import com.maddyhome.idea.vim.handler.EditorActionHandlerBase;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@@ -35,7 +36,8 @@ public class MotionMarkAction extends EditorAction {
private static class Handler extends EditorActionHandlerBase { private static class Handler extends EditorActionHandlerBase {
protected boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull Command cmd) { protected boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull Command cmd) {
return VimPlugin.getMark().setMark(editor, cmd.getArgument().getCharacter()); final Argument argument = cmd.getArgument();
return argument != null && VimPlugin.getMark().setMark(editor, argument.getCharacter());
} }
} }
} }

View File

@@ -1,41 +0,0 @@
/*
* IdeaVim - Vim emulator for IDEs based on the IntelliJ platform
* Copyright (C) 2003-2014 The IdeaVim authors
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.maddyhome.idea.vim.action.motion.screen;
import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.Editor;
import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.action.motion.MotionEditorAction;
import com.maddyhome.idea.vim.command.Argument;
import com.maddyhome.idea.vim.handler.MotionEditorActionHandler;
import org.jetbrains.annotations.NotNull;
/**
*/
public class MotionLastScreenLineEndAction extends MotionEditorAction {
public MotionLastScreenLineEndAction() {
super(new Handler());
}
private static class Handler extends MotionEditorActionHandler {
public int getOffset(@NotNull Editor editor, DataContext context, int count, int rawCount, Argument argument) {
return VimPlugin.getMotion().moveCaretToLastScreenLineEnd(editor, count);
}
}
}

View File

@@ -37,8 +37,11 @@ public class SearchEntryFwdAction extends MotionEditorAction {
private static class Handler extends MotionEditorActionHandler { private static class Handler extends MotionEditorActionHandler {
public int getOffset(@NotNull Editor editor, DataContext context, int count, int rawCount, @NotNull Argument argument) { public int getOffset(@NotNull Editor editor, DataContext context, int count, int rawCount, @NotNull Argument argument) {
return VimPlugin.getSearch().search(editor, argument.getString(), final String command = argument.getString();
count, Command.FLAG_SEARCH_FWD, false); if (command == null) {
return -1;
}
return VimPlugin.getSearch().search(editor, command, count, Command.FLAG_SEARCH_FWD, false);
} }
} }
} }

View File

@@ -37,8 +37,11 @@ public class SearchEntryRevAction extends MotionEditorAction {
private static class Handler extends MotionEditorActionHandler { private static class Handler extends MotionEditorActionHandler {
public int getOffset(@NotNull Editor editor, DataContext context, int count, int rawCount, @NotNull Argument argument) { public int getOffset(@NotNull Editor editor, DataContext context, int count, int rawCount, @NotNull Argument argument) {
return VimPlugin.getSearch().search(editor, argument.getString(), final String command = argument.getString();
count, Command.FLAG_SEARCH_REV, false); if (command == null) {
return -1;
}
return VimPlugin.getSearch().search(editor, command, count, Command.FLAG_SEARCH_REV, false);
} }
} }
} }

View File

@@ -35,7 +35,7 @@ public class MotionNextTabAction extends MotionEditorAction {
} }
private static class Handler extends MotionEditorActionHandler { private static class Handler extends MotionEditorActionHandler {
public int getOffset(final Editor editor, @NotNull final DataContext context, final int count, final int rawCount, final Argument argument) { public int getOffset(@NotNull final Editor editor, @NotNull final DataContext context, final int count, final int rawCount, final Argument argument) {
return VimPlugin.getMotion().moveCaretGotoNextTab(editor, context); return VimPlugin.getMotion().moveCaretGotoNextTab(editor, context);
} }
} }

View File

@@ -35,7 +35,7 @@ public class MotionPreviousTabAction extends MotionEditorAction {
} }
private static class Handler extends MotionEditorActionHandler { private static class Handler extends MotionEditorActionHandler {
public int getOffset(final Editor editor, @NotNull final DataContext context, final int count, final int rawCount, final Argument argument) { public int getOffset(@NotNull final Editor editor, @NotNull final DataContext context, final int count, final int rawCount, final Argument argument) {
return VimPlugin.getMotion().moveCaretGotoPreviousTab(editor, context); return VimPlugin.getMotion().moveCaretGotoPreviousTab(editor, context);
} }
} }

View File

@@ -20,24 +20,46 @@ package com.maddyhome.idea.vim.action.motion.visual;
import com.intellij.openapi.actionSystem.DataContext; import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.editor.actionSystem.EditorAction;
import com.intellij.openapi.editor.actionSystem.EditorActionHandler; import com.intellij.openapi.editor.actionSystem.EditorActionHandler;
import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil; import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil;
import com.maddyhome.idea.vim.VimPlugin; import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.action.VimCommandAction;
import com.maddyhome.idea.vim.command.Command;
import com.maddyhome.idea.vim.command.MappingMode;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
/** import javax.swing.*;
* import java.util.List;
*/ import java.util.Set;
public class VisualExitModeAction extends EditorAction {
public VisualExitModeAction() {
super(new Handler());
}
private static class Handler extends EditorActionHandler { /**
* @author vlan
*/
public class VisualExitModeAction extends VimCommandAction {
public VisualExitModeAction() {
super(new EditorActionHandler() {
public void execute(@NotNull Editor editor, @NotNull DataContext context) { public void execute(@NotNull Editor editor, @NotNull DataContext context) {
VimPlugin.getMotion().processEscape(InjectedLanguageUtil.getTopLevelEditor(editor)); VimPlugin.getMotion().processEscape(InjectedLanguageUtil.getTopLevelEditor(editor));
} }
});
}
@NotNull
@Override
public Set<MappingMode> getMappingModes() {
return MappingMode.V;
}
@NotNull
@Override
public Set<List<KeyStroke>> getKeyStrokesSet() {
return parseKeysSet("<Esc>", "<C-[>", "<C-C>", "<C-\\><C-N>");
}
@NotNull
@Override
public Command.Type getType() {
return Command.Type.OTHER_READONLY;
} }
} }

View File

@@ -20,24 +20,44 @@ package com.maddyhome.idea.vim.action.motion.visual;
import com.intellij.openapi.actionSystem.DataContext; import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.editor.actionSystem.EditorAction;
import com.maddyhome.idea.vim.VimPlugin; import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.action.VimCommandAction;
import com.maddyhome.idea.vim.command.Command; import com.maddyhome.idea.vim.command.Command;
import com.maddyhome.idea.vim.command.MappingMode;
import com.maddyhome.idea.vim.handler.EditorActionHandlerBase; import com.maddyhome.idea.vim.handler.EditorActionHandlerBase;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
/** import javax.swing.*;
* import java.util.List;
*/ import java.util.Set;
public class VisualSelectPreviousAction extends EditorAction {
public VisualSelectPreviousAction() {
super(new Handler());
}
private static class Handler extends EditorActionHandlerBase { /**
* @author vlan
*/
public class VisualSelectPreviousAction extends VimCommandAction {
public VisualSelectPreviousAction() {
super(new EditorActionHandlerBase() {
protected boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull Command cmd) { protected boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull Command cmd) {
return VimPlugin.getMotion().selectPreviousVisualMode(editor); return VimPlugin.getMotion().selectPreviousVisualMode(editor);
} }
});
}
@NotNull
@Override
public Set<MappingMode> getMappingModes() {
return MappingMode.N;
}
@NotNull
@Override
public Set<List<KeyStroke>> getKeyStrokesSet() {
return parseKeysSet("gv");
}
@NotNull
@Override
public Command.Type getType() {
return Command.Type.OTHER_READONLY;
} }
} }

View File

@@ -20,24 +20,45 @@ package com.maddyhome.idea.vim.action.motion.visual;
import com.intellij.openapi.actionSystem.DataContext; import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.editor.actionSystem.EditorAction;
import com.maddyhome.idea.vim.VimPlugin; import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.action.VimCommandAction;
import com.maddyhome.idea.vim.command.Command; import com.maddyhome.idea.vim.command.Command;
import com.maddyhome.idea.vim.command.MappingMode;
import com.maddyhome.idea.vim.handler.EditorActionHandlerBase; import com.maddyhome.idea.vim.handler.EditorActionHandlerBase;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
/** import javax.swing.*;
* import java.util.List;
*/ import java.util.Set;
public class VisualSwapEndsAction extends EditorAction {
public VisualSwapEndsAction() {
super(new Handler());
}
private static class Handler extends EditorActionHandlerBase { /**
* @author vlan
*/
public class VisualSwapEndsAction extends VimCommandAction {
public VisualSwapEndsAction() {
super(new EditorActionHandlerBase() {
protected boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull Command cmd) { protected boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull Command cmd) {
return VimPlugin.getMotion().swapVisualEnds(editor); return VimPlugin.getMotion().swapVisualEnds(editor);
} }
});
}
@NotNull
@Override
public Set<MappingMode> getMappingModes() {
return MappingMode.V;
}
@NotNull
@Override
public Set<List<KeyStroke>> getKeyStrokesSet() {
return parseKeysSet("o");
}
@NotNull
@Override
public Command.Type getType() {
return Command.Type.OTHER_READONLY;
} }
} }

View File

@@ -20,24 +20,45 @@ package com.maddyhome.idea.vim.action.motion.visual;
import com.intellij.openapi.actionSystem.DataContext; import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.editor.actionSystem.EditorAction;
import com.maddyhome.idea.vim.VimPlugin; import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.action.VimCommandAction;
import com.maddyhome.idea.vim.command.Command; import com.maddyhome.idea.vim.command.Command;
import com.maddyhome.idea.vim.command.MappingMode;
import com.maddyhome.idea.vim.handler.EditorActionHandlerBase; import com.maddyhome.idea.vim.handler.EditorActionHandlerBase;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
/** import javax.swing.*;
* import java.util.List;
*/ import java.util.Set;
public class VisualSwapEndsBlockAction extends EditorAction {
public VisualSwapEndsBlockAction() {
super(new Handler());
}
private static class Handler extends EditorActionHandlerBase { /**
* @author vlan
*/
public class VisualSwapEndsBlockAction extends VimCommandAction {
public VisualSwapEndsBlockAction() {
super(new EditorActionHandlerBase() {
protected boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull Command cmd) { protected boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull Command cmd) {
return VimPlugin.getMotion().swapVisualEndsBlock(editor); return VimPlugin.getMotion().swapVisualEndsBlock(editor);
} }
});
}
@NotNull
@Override
public Set<MappingMode> getMappingModes() {
return MappingMode.V;
}
@NotNull
@Override
public Set<List<KeyStroke>> getKeyStrokesSet() {
return parseKeysSet("O");
}
@NotNull
@Override
public Command.Type getType() {
return Command.Type.OTHER_READONLY;
} }
} }

View File

@@ -20,24 +20,45 @@ package com.maddyhome.idea.vim.action.motion.visual;
import com.intellij.openapi.actionSystem.DataContext; import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.editor.actionSystem.EditorAction;
import com.maddyhome.idea.vim.VimPlugin; import com.maddyhome.idea.vim.VimPlugin;
import com.maddyhome.idea.vim.action.VimCommandAction;
import com.maddyhome.idea.vim.command.Command; import com.maddyhome.idea.vim.command.Command;
import com.maddyhome.idea.vim.command.MappingMode;
import com.maddyhome.idea.vim.handler.EditorActionHandlerBase; import com.maddyhome.idea.vim.handler.EditorActionHandlerBase;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
/** import javax.swing.*;
* import java.util.List;
*/ import java.util.Set;
public class VisualSwapSelectionsAction extends EditorAction {
public VisualSwapSelectionsAction() {
super(new Handler());
}
private static class Handler extends EditorActionHandlerBase { /**
* @author vlan
*/
public class VisualSwapSelectionsAction extends VimCommandAction {
public VisualSwapSelectionsAction() {
super(new EditorActionHandlerBase() {
protected boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull Command cmd) { protected boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull Command cmd) {
return VimPlugin.getMotion().swapVisualSelections(editor); return VimPlugin.getMotion().swapVisualSelections(editor);
} }
});
}
@NotNull
@Override
public Set<MappingMode> getMappingModes() {
return MappingMode.V;
}
@NotNull
@Override
public Set<List<KeyStroke>> getKeyStrokesSet() {
return parseKeysSet("gv");
}
@NotNull
@Override
public Command.Type getType() {
return Command.Type.OTHER_READONLY;
} }
} }

View File

@@ -32,8 +32,6 @@ import javax.swing.*;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
import static com.maddyhome.idea.vim.helper.StringHelper.parseKeysSet;
public class VisualToggleCharacterModeAction extends VimCommandAction { public class VisualToggleCharacterModeAction extends VimCommandAction {
public VisualToggleCharacterModeAction() { public VisualToggleCharacterModeAction() {
super(new EditorActionHandlerBase() { super(new EditorActionHandlerBase() {

View File

@@ -32,7 +32,7 @@ public class Argument {
CHARACTER, CHARACTER,
STRING, STRING,
DIGRAPH, DIGRAPH,
EX_STRING; EX_STRING
} }
/** /**
@@ -50,7 +50,7 @@ public class Argument {
* *
* @param motionArg The motion command * @param motionArg The motion command
*/ */
public Argument(Command motionArg) { public Argument(@Nullable Command motionArg) {
this.motionArg = motionArg; this.motionArg = motionArg;
type = Type.MOTION; type = Type.MOTION;
} }
@@ -60,7 +60,7 @@ public class Argument {
* *
* @param strArg The string * @param strArg The string
*/ */
public Argument(String strArg) { public Argument(@Nullable String strArg) {
this.strArg = strArg; this.strArg = strArg;
type = Type.STRING; type = Type.STRING;
} }
@@ -126,19 +126,21 @@ public class Argument {
@NotNull @NotNull
public String toString() { public String toString() {
StringBuffer res = new StringBuffer();
res.append("Argument [");
res.append("charArg=").append(charArg);
res.append(", motionArg=").append(motionArg);
res.append(", strArg=").append(strArg);
res.append(", type=").append(type);
res.append("]");
return res.toString(); return "Argument [" +
"charArg=" +
charArg +
", motionArg=" +
motionArg +
", strArg=" +
strArg +
", type=" +
type +
"]";
} }
private char charArg = 0; private char charArg = 0;
@Nullable private Command motionArg = null; @Nullable private Command motionArg = null;
@Nullable private String strArg = null; @Nullable private String strArg = null;
@NotNull private Type type; @NotNull private final Type type;
} }

View File

@@ -23,6 +23,7 @@ import com.intellij.openapi.editor.actionSystem.EditorAction;
import com.intellij.openapi.editor.actionSystem.EditorActionHandler; import com.intellij.openapi.editor.actionSystem.EditorActionHandler;
import com.maddyhome.idea.vim.handler.EditorActionHandlerBase; import com.maddyhome.idea.vim.handler.EditorActionHandlerBase;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*; import javax.swing.*;
import java.util.List; import java.util.List;
@@ -80,10 +81,13 @@ public class Command {
public static final int FLAG_SEARCH_FWD = 1 << 16; public static final int FLAG_SEARCH_FWD = 1 << 16;
public static final int FLAG_SEARCH_REV = 1 << 17; public static final int FLAG_SEARCH_REV = 1 << 17;
public static final int FLAG_KEEP_VISUAL = 1 << 20; /**
* Command exits the visual mode, so caret movement shouldn't update visual selection
*/
public static final int FLAG_EXIT_VISUAL = 1 << 20;
public static final int FLAG_FORCE_VISUAL = 1 << 21; public static final int FLAG_FORCE_VISUAL = 1 << 21;
public static final int FLAG_FORCE_LINEWISE = 1 << 22; public static final int FLAG_FORCE_LINEWISE = 1 << 22;
public static final int FLAG_DELEGATE = 1 << 23;
/** /**
* Special flag used for any mappings involving operators * Special flag used for any mappings involving operators
*/ */
@@ -182,24 +186,11 @@ public class Command {
* @param flags Any custom flags specific to this command * @param flags Any custom flags specific to this command
*/ */
public Command(int count, String actionId, AnAction action, @NotNull Type type, int flags) { public Command(int count, String actionId, AnAction action, @NotNull Type type, int flags) {
this(count, actionId, action, type, flags, null);
}
/**
* Creates a command that requires an argument
*
* @param count The number entered prior to the command (zero if no specific number)
* @param action The action to be executed when the command is run
* @param type The type of the command
* @param flags Any custom flags specific to this command
* @param arg The argument to this command
*/
public Command(int count, String actionId, AnAction action, @NotNull Type type, int flags, Argument arg) {
this.count = count; this.count = count;
this.action = action; this.action = action;
this.type = type; this.type = type;
this.flags = flags; this.flags = flags;
this.argument = arg; this.argument = null;
if (action instanceof EditorAction) { if (action instanceof EditorAction) {
EditorAction eaction = (EditorAction)action; EditorAction eaction = (EditorAction)action;
@@ -289,6 +280,7 @@ public class Command {
* *
* @return The command's argument, null if there isn't one * @return The command's argument, null if there isn't one
*/ */
@Nullable
public Argument getArgument() { public Argument getArgument() {
return argument; return argument;
} }
@@ -298,7 +290,7 @@ public class Command {
* *
* @param argument The new argument, can be null to clear the argument * @param argument The new argument, can be null to clear the argument
*/ */
public void setArgument(Argument argument) { public void setArgument(@Nullable Argument argument) {
this.argument = argument; this.argument = argument;
} }
@@ -312,23 +304,27 @@ public class Command {
@NotNull @NotNull
public String toString() { public String toString() {
StringBuffer res = new StringBuffer();
res.append("Command[");
res.append("count=").append(count);
res.append(", action=").append(action);
res.append(", type=").append(type);
res.append(", flags=").append(flags);
res.append(", argument=").append(argument);
res.append(", keys=").append(keys);
res.append("]");
return res.toString(); return "Command[" +
"count=" +
count +
", action=" +
action +
", type=" +
type +
", flags=" +
flags +
", argument=" +
argument +
", keys=" +
keys +
"]";
} }
private int count; private int count;
private AnAction action; private AnAction action;
@NotNull private Type type; @NotNull private final Type type;
private int flags; private int flags;
private Argument argument; @Nullable private Argument argument;
private List<KeyStroke> keys; private List<KeyStroke> keys;
} }

View File

@@ -40,8 +40,8 @@ public class CommandState {
@Nullable private static Command ourLastChange = null; @Nullable private static Command ourLastChange = null;
private static char ourLastRegister = RegisterGroup.REGISTER_DEFAULT; private static char ourLastRegister = RegisterGroup.REGISTER_DEFAULT;
@NotNull private Stack<State> myStates = new Stack<State>(); @NotNull private final Stack<State> myStates = new Stack<State>();
@NotNull private State myDefaultState = new State(Mode.COMMAND, SubMode.NONE, MappingMode.NORMAL); @NotNull private final State myDefaultState = new State(Mode.COMMAND, SubMode.NONE, MappingMode.NORMAL);
@Nullable private Command myCommand; @Nullable private Command myCommand;
@NotNull private ParentNode myCurrentNode = VimPlugin.getKey().getKeyRoot(getMappingMode()); @NotNull private ParentNode myCurrentNode = VimPlugin.getKey().getKeyRoot(getMappingMode());
@NotNull private final List<KeyStroke> myMappingKeys = new ArrayList<KeyStroke>(); @NotNull private final List<KeyStroke> myMappingKeys = new ArrayList<KeyStroke>();
@@ -329,9 +329,9 @@ public class CommandState {
} }
private class State { private class State {
@NotNull private Mode myMode; @NotNull private final Mode myMode;
@NotNull private SubMode mySubMode; @NotNull private SubMode mySubMode;
@NotNull private MappingMode myMappingMode; @NotNull private final MappingMode myMappingMode;
public State(@NotNull Mode mode, @NotNull SubMode subMode, @NotNull MappingMode mappingMode) { public State(@NotNull Mode mode, @NotNull SubMode subMode, @NotNull MappingMode mappingMode) {
this.myMode = mode; this.myMode = mode;

View File

@@ -62,6 +62,19 @@ public enum SelectionType {
} }
@NotNull @NotNull
public CommandState.SubMode toSubMode() {
switch (this) {
case LINE_WISE:
return CommandState.SubMode.VISUAL_LINE;
case CHARACTER_WISE:
return CommandState.SubMode.VISUAL_CHARACTER;
case BLOCK_WISE:
return CommandState.SubMode.VISUAL_BLOCK;
default:
return CommandState.SubMode.VISUAL_CHARACTER;
}
}
public static SelectionType fromCommandFlags(int flags) { public static SelectionType fromCommandFlags(int flags) {
if ((flags & Command.FLAG_MOT_LINEWISE) != 0) { if ((flags & Command.FLAG_MOT_LINEWISE) != 0) {
return SelectionType.LINE_WISE; return SelectionType.LINE_WISE;

View File

@@ -42,17 +42,11 @@ public class VisualChange {
@NotNull @NotNull
public String toString() { public String toString() {
StringBuffer res = new StringBuffer();
res.append("VisualChange[");
res.append("lines=").append(lines);
res.append(", columns=").append(columns);
res.append(", type=").append(type);
res.append("]");
return res.toString(); return "VisualChange[" + "lines=" + lines + ", columns=" + columns + ", type=" + type + "]";
} }
int lines; final int lines;
int columns; final int columns;
@NotNull SelectionType type; @NotNull final SelectionType type;
} }

View File

@@ -1,65 +0,0 @@
/*
* IdeaVim - Vim emulator for IDEs based on the IntelliJ platform
* Copyright (C) 2003-2014 The IdeaVim authors
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.maddyhome.idea.vim.command;
import org.jetbrains.annotations.NotNull;
public class VisualRange {
public VisualRange(int start, int end, @NotNull CommandState.SubMode type, int offset) {
this.start = start;
this.end = end;
this.type = type;
this.offset = offset;
}
public int getStart() {
return start;
}
public int getEnd() {
return end;
}
@NotNull
public CommandState.SubMode getType() {
return type;
}
public int getOffset() {
return offset;
}
@NotNull
public String toString() {
StringBuffer res = new StringBuffer();
res.append("VisualRange[");
res.append("start=").append(start);
res.append(", end=").append(end);
res.append(", type=").append(type);
res.append(", offset=").append(offset);
res.append("]");
return res.toString();
}
int start;
int end;
@NotNull CommandState.SubMode type;
int offset;
}

View File

@@ -22,7 +22,7 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
public abstract class FileLocation { public abstract class FileLocation {
protected FileLocation(int lline, int col, String filename) { protected FileLocation(int lline, int col, @Nullable String filename) {
this.line = lline; this.line = lline;
this.col = col; this.col = col;
this.filename = filename; this.filename = filename;
@@ -90,13 +90,7 @@ public abstract class FileLocation {
@NotNull @NotNull
public String toString() { public String toString() {
final StringBuffer sb = new StringBuffer(); return "FileLocation" + "{col=" + col + ", line=" + line + ", filename='" + filename + '\'' + '}';
sb.append("FileLocation");
sb.append("{col=").append(col);
sb.append(", line=").append(line);
sb.append(", filename='").append(filename).append('\'');
sb.append('}');
return sb.toString();
} }
private int line; private int line;

View File

@@ -62,12 +62,7 @@ public class Mark extends FileLocation {
@NotNull @NotNull
public String toString() { public String toString() {
final StringBuffer sb = new StringBuffer(); return "Mark{" + super.toString() + ",key=" + key + '}';
sb.append("Mark{");
sb.append(super.toString());
sb.append(",key=").append(key);
sb.append('}');
return sb.toString();
} }
public static class KeySorter<V> implements Comparator<V> { public static class KeySorter<V> implements Comparator<V> {
@@ -86,5 +81,5 @@ public class Mark extends FileLocation {
} }
} }
private char key; private final char key;
} }

View File

@@ -33,8 +33,8 @@ import java.util.List;
*/ */
public class Register { public class Register {
private char name; private char name;
@NotNull private SelectionType type; @NotNull private final SelectionType type;
@NotNull private List<KeyStroke> keys; @NotNull private final List<KeyStroke> keys;
public Register(char name, @NotNull SelectionType type, @NotNull String text) { public Register(char name, @NotNull SelectionType type, @NotNull String text) {
this.name = name; this.name = name;

View File

@@ -100,7 +100,7 @@ public class TextRange {
@NotNull @NotNull
public String toString() { public String toString() {
final StringBuffer sb = new StringBuffer(); final StringBuilder sb = new StringBuilder();
sb.append("TextRange"); sb.append("TextRange");
sb.append("{starts=").append(starts == null ? "null" : ""); sb.append("{starts=").append(starts == null ? "null" : "");
for (int i = 0; starts != null && i < starts.length; ++i) { for (int i = 0; starts != null && i < starts.length; ++i) {
@@ -114,6 +114,6 @@ public class TextRange {
return sb.toString(); return sb.toString();
} }
private int[] starts; private final int[] starts;
private int[] ends; private final int[] ends;
} }

View File

@@ -89,7 +89,7 @@ public abstract class CommandHandler {
* @param argFlags Range and Arguments commands * @param argFlags Range and Arguments commands
* @param optFlags Other command specific flags * @param optFlags Other command specific flags
*/ */
public CommandHandler(CommandName[] names, int argFlags, int optFlags) { public CommandHandler(@Nullable CommandName[] names, int argFlags, int optFlags) {
this.names = names; this.names = names;
this.argFlags = argFlags; this.argFlags = argFlags;
this.optFlags = optFlags; this.optFlags = optFlags;
@@ -261,7 +261,7 @@ public abstract class CommandHandler {
*/ */
public abstract boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull ExCommand cmd) throws ExException; public abstract boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull ExCommand cmd) throws ExException;
@Nullable protected CommandName[] names; @Nullable protected final CommandName[] names;
protected int argFlags; protected final int argFlags;
protected int optFlags; protected final int optFlags;
} }

View File

@@ -35,6 +35,6 @@ public class CommandName {
return optional; return optional;
} }
private String required; private final String required;
private String optional; private final String optional;
} }

View File

@@ -31,7 +31,7 @@ public class CommandNode {
command = null; command = null;
} }
public CommandNode(CommandHandler command) { public CommandNode(@Nullable CommandHandler command) {
this.command = command; this.command = command;
} }
@@ -57,5 +57,5 @@ public class CommandNode {
} }
@Nullable private CommandHandler command; @Nullable private CommandHandler command;
@NotNull private HashMap<Character, CommandNode> nodes = new HashMap<Character, CommandNode>(); @NotNull private final HashMap<Character, CommandNode> nodes = new HashMap<Character, CommandNode>();
} }

View File

@@ -32,6 +32,9 @@ import com.maddyhome.idea.vim.helper.Msg;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/** /**
* Maintains a tree of Ex commands based on the required and optional parts of the command names. Parses and * Maintains a tree of Ex commands based on the required and optional parts of the command names. Parses and
* executes Ex commands entered by the user. * executes Ex commands entered by the user.
@@ -41,6 +44,7 @@ public class CommandParser {
public static final int RES_ERROR = 1; public static final int RES_ERROR = 1;
public static final int RES_READONLY = 1; public static final int RES_READONLY = 1;
public static final int RES_DONT_REOPEN = 4; public static final int RES_DONT_REOPEN = 4;
public static final Pattern TRIM_WHITESPACE = Pattern.compile("[ \\t]*(.*)[ \\t\\n\\r]+", Pattern.DOTALL);
/** /**
* There is only one parser. * There is only one parser.
@@ -222,8 +226,8 @@ public class CommandParser {
} }
int state = STATE_START; int state = STATE_START;
Ranges ranges = new Ranges(); // The list of ranges Ranges ranges = new Ranges(); // The list of ranges
StringBuffer command = new StringBuffer(); // The command StringBuilder command = new StringBuilder(); // The command
StringBuffer argument = new StringBuffer(); // The command's argument(s) StringBuilder argument = new StringBuilder(); // The command's argument(s)
StringBuffer location = null; // The current range text StringBuffer location = null; // The current range text
int offsetSign = 1; // Sign of current range offset int offsetSign = 1; // Sign of current range offset
int offsetNumber = 0; // The value of the current range offset int offsetNumber = 0; // The value of the current range offset
@@ -533,7 +537,12 @@ public class CommandParser {
logger.debug("argument = " + argument); logger.debug("argument = " + argument);
} }
return new ExCommand(ranges, command.toString(), argument.toString().trim()); String argumentString = argument.toString();
final Matcher matcher = TRIM_WHITESPACE.matcher(argumentString);
if (matcher.matches()) {
argumentString = matcher.group(1);
}
return new ExCommand(ranges, command.toString(), argumentString);
} }
/** /**
@@ -544,6 +553,9 @@ public class CommandParser {
public void addHandler(@NotNull CommandHandler handler) { public void addHandler(@NotNull CommandHandler handler) {
// Iterator through each command name alias // Iterator through each command name alias
CommandName[] names = handler.getNames(); CommandName[] names = handler.getNames();
if (names == null) {
return;
}
for (CommandName name : names) { for (CommandName name : names) {
CommandNode node = root; CommandNode node = root;
String text = name.getRequired(); String text = name.getRequired();
@@ -583,7 +595,7 @@ public class CommandParser {
} }
} }
@NotNull private CommandNode root = new CommandNode(); @NotNull private final CommandNode root = new CommandNode();
private boolean registered = false; private boolean registered = false;
private static CommandParser ourInstance; private static CommandParser ourInstance;
@@ -610,5 +622,5 @@ public class CommandParser {
private static final int STATE_RANGE_DONE = 51; private static final int STATE_RANGE_DONE = 51;
private static final int STATE_ERROR = 99; private static final int STATE_ERROR = 99;
private static Logger logger = Logger.getInstance(CommandParser.class.getName()); private static final Logger logger = Logger.getInstance(CommandParser.class.getName());
} }

View File

@@ -53,13 +53,8 @@ public class ExCommand {
} }
@NotNull @NotNull
public LineRange getLineRange(@NotNull Editor editor, DataContext context, boolean checkCount) { public LineRange getLineRange(@NotNull Editor editor, DataContext context) {
int count = -1; return ranges.getLineRange(editor, context, -1);
if (checkCount) {
count = getCountArgument();
}
return ranges.getLineRange(editor, context, count);
} }
@NotNull @NotNull
@@ -100,8 +95,8 @@ public class ExCommand {
return ranges; return ranges;
} }
@NotNull private Ranges ranges; @NotNull private final Ranges ranges;
@NotNull private String command; @NotNull private final String command;
@NotNull private String argument; @NotNull private String argument;
private static Logger logger = Logger.getInstance(ExCommand.class.getName()); private static Logger logger = Logger.getInstance(ExCommand.class.getName());

View File

@@ -41,6 +41,6 @@ public class LineRange {
return endLine; return endLine;
} }
private int startLine; private final int startLine;
private int endLine; private final int endLine;
} }

View File

@@ -24,9 +24,9 @@ import org.jetbrains.annotations.NotNull;
* *
*/ */
public class ParseResult { public class ParseResult {
@NotNull private Ranges ranges; @NotNull private final Ranges ranges;
@NotNull private String command; @NotNull private final String command;
@NotNull private String argument; @NotNull private final String argument;
public ParseResult(@NotNull Ranges ranges, @NotNull String command, @NotNull String argument) { public ParseResult(@NotNull Ranges ranges, @NotNull String command, @NotNull String argument) {
this.ranges = ranges; this.ranges = ranges;

View File

@@ -28,6 +28,7 @@ import com.maddyhome.idea.vim.helper.EditorHelper;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections;
import java.util.List; import java.util.List;
/** /**
@@ -47,9 +48,7 @@ public class Ranges {
* @param range The list of ranges to append to the current list * @param range The list of ranges to append to the current list
*/ */
public void addRange(@NotNull Range[] range) { public void addRange(@NotNull Range[] range) {
for (Range aRange : range) { Collections.addAll(ranges, range);
ranges.add(aRange);
}
} }
/** /**
@@ -184,7 +183,10 @@ public class Ranges {
@NotNull @NotNull
public static TextRange getFileTextRange(@NotNull Editor editor, DataContext context) { public static TextRange getFileTextRange(@NotNull Editor editor, DataContext context) {
Ranges ranges = new Ranges(); Ranges ranges = new Ranges();
ranges.addRange(AbstractRange.createRange("%", 0, false)); final Range[] range = AbstractRange.createRange("%", 0, false);
if (range != null) {
ranges.addRange(range);
}
return ranges.getTextRange(editor, context, -1); return ranges.getTextRange(editor, context, -1);
} }
@@ -225,11 +227,8 @@ public class Ranges {
@NotNull @NotNull
public String toString() { public String toString() {
StringBuffer res = new StringBuffer();
res.append("Ranges[ranges=").append(ranges);
res.append("]");
return res.toString(); return "Ranges[ranges=" + ranges + "]";
} }
private int startLine = 0; private int startLine = 0;
@@ -237,5 +236,5 @@ public class Ranges {
private int count = 0; private int count = 0;
private int defaultLine = -1; private int defaultLine = -1;
private boolean done = false; private boolean done = false;
private List<Range> ranges; @NotNull private final List<Range> ranges;
} }

View File

@@ -25,18 +25,21 @@ import java.io.BufferedReader;
import java.io.File; import java.io.File;
import java.io.FileReader; import java.io.FileReader;
import java.io.IOException; import java.io.IOException;
import java.util.regex.Pattern;
/** /**
* @author vlan * @author vlan
*/ */
public class VimScriptParser { public class VimScriptParser {
public static final String[] VIMRC_FILES = {".ideavimrc", "_ideavimrc", ".vimrc", "_vimrc"}; public static final String[] VIMRC_FILES = {".ideavimrc", "_ideavimrc"};
public static final int BUFSIZE = 4096;
private static final Pattern EOL_SPLIT_PATTERN = Pattern.compile(" *(\r\n|\n)+ *");
private VimScriptParser() { private VimScriptParser() {
} }
@Nullable @Nullable
public static File findVimrc() { public static File findIdeaVimRc() {
final String homeDirName = System.getProperty("user.home"); final String homeDirName = System.getProperty("user.home");
if (homeDirName != null) { if (homeDirName != null) {
for (String fileName : VIMRC_FILES) { for (String fileName : VIMRC_FILES) {
@@ -50,11 +53,18 @@ public class VimScriptParser {
} }
public static void executeFile(@NotNull File file) { public static void executeFile(@NotNull File file) {
final String data;
try { try {
final BufferedReader reader = new BufferedReader(new FileReader(file)); data = readFile(file);
String line; }
while ((line = reader.readLine()) != null) { catch (IOException ignored) {
try { return;
}
executeText(data);
}
public static void executeText(@NotNull String text) {
for (String line : EOL_SPLIT_PATTERN.split(text)) {
// TODO: Build a proper parse tree for a VimL file instead of ignoring potentially nested lines (VIM-669) // TODO: Build a proper parse tree for a VimL file instead of ignoring potentially nested lines (VIM-669)
if (line.startsWith(" ") || line.startsWith("\t")) { if (line.startsWith(" ") || line.startsWith("\t")) {
continue; continue;
@@ -63,6 +73,7 @@ public class VimScriptParser {
line = line.substring(1); line = line.substring(1);
} }
final CommandParser commandParser = CommandParser.getInstance(); final CommandParser commandParser = CommandParser.getInstance();
try {
final ExCommand command = commandParser.parse(line); final ExCommand command = commandParser.parse(line);
final CommandHandler commandHandler = commandParser.getCommandHandler(command); final CommandHandler commandHandler = commandParser.getCommandHandler(command);
if (commandHandler instanceof VimScriptCommandHandler) { if (commandHandler instanceof VimScriptCommandHandler) {
@@ -74,7 +85,16 @@ public class VimScriptParser {
} }
} }
} }
catch (IOException ignored) {
@NotNull
private static String readFile(@NotNull File file) throws IOException {
final BufferedReader reader = new BufferedReader(new FileReader(file));
final StringBuilder builder = new StringBuilder();
final char[] buffer = new char[BUFSIZE];
int n;
while ((n = reader.read(buffer)) > 0) {
builder.append(buffer, 0, n);
} }
return builder.toString();
} }
} }

View File

@@ -76,5 +76,5 @@ public class CmdFilterHandler extends CommandHandler {
} }
} }
private static Logger logger = Logger.getInstance(CmdFilterHandler.class.getName()); private static final Logger logger = Logger.getInstance(CmdFilterHandler.class.getName());
} }

View File

@@ -38,7 +38,7 @@ public class DeleteLinesHandler extends CommandHandler {
} }
public boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull ExCommand cmd) throws ExException { public boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull ExCommand cmd) throws ExException {
StringBuffer arg = new StringBuffer(cmd.getArgument()); StringBuilder arg = new StringBuilder(cmd.getArgument());
char register = RegisterGroup.REGISTER_DEFAULT; char register = RegisterGroup.REGISTER_DEFAULT;
if (arg.length() > 0 && (arg.charAt(0) < '0' || arg.charAt(0) > '9')) { if (arg.length() > 0 && (arg.charAt(0) < '0' || arg.charAt(0) > '9')) {
register = arg.charAt(0); register = arg.charAt(0);

View File

@@ -41,8 +41,8 @@ public class DigraphHandler extends CommandHandler {
logger.debug("arg=" + arg); logger.debug("arg=" + arg);
} }
return VimPlugin.getDigraph().parseCommandLine(editor, cmd.getArgument(), true); return VimPlugin.getDigraph().parseCommandLine(editor, cmd.getArgument());
} }
private static Logger logger = Logger.getInstance(DigraphHandler.class.getName()); private static final Logger logger = Logger.getInstance(DigraphHandler.class.getName());
} }

View File

@@ -35,7 +35,7 @@ public class DumpLineHandler extends CommandHandler {
} }
public boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull ExCommand cmd) throws ExException { public boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull ExCommand cmd) throws ExException {
LineRange range = cmd.getLineRange(editor, context, false); LineRange range = cmd.getLineRange(editor, context);
CharSequence chars = editor.getDocument().getCharsSequence(); CharSequence chars = editor.getDocument().getCharsSequence();
for (int l = range.getStartLine(); l <= range.getEndLine(); l++) { for (int l = range.getStartLine(); l <= range.getEndLine(); l++) {
@@ -55,5 +55,5 @@ public class DumpLineHandler extends CommandHandler {
return true; return true;
} }
private static Logger logger = Logger.getInstance(DumpLineHandler.class.getName()); private static final Logger logger = Logger.getInstance(DumpLineHandler.class.getName());
} }

View File

@@ -42,7 +42,6 @@ public class EditFileHandler extends CommandHandler {
public boolean execute(@NotNull final Editor editor, @NotNull final DataContext context, public boolean execute(@NotNull final Editor editor, @NotNull final DataContext context,
@NotNull ExCommand cmd) throws ExException { @NotNull ExCommand cmd) throws ExException {
final String arg = cmd.getArgument(); final String arg = cmd.getArgument();
if (arg != null) {
if (arg.equals("#")) { if (arg.equals("#")) {
VimPlugin.getMark().saveJumpLocation(editor); VimPlugin.getMark().saveJumpLocation(editor);
VimPlugin.getFile().selectPreviousTab(context); VimPlugin.getFile().selectPreviousTab(context);
@@ -55,7 +54,6 @@ public class EditFileHandler extends CommandHandler {
} }
return res; return res;
} }
}
// Don't open a choose file dialog under a write action // Don't open a choose file dialog under a write action
SwingUtilities.invokeLater(new Runnable() { SwingUtilities.invokeLater(new Runnable() {

View File

@@ -39,5 +39,5 @@ public class EmptyHandler extends CommandHandler {
return true; return true;
} }
private static Logger logger = Logger.getInstance(EmptyHandler.class.getName()); private static final Logger logger = Logger.getInstance(EmptyHandler.class.getName());
} }

View File

@@ -39,7 +39,7 @@ public class FindClassHandler extends CommandHandler {
public boolean execute(@NotNull Editor editor, @NotNull final DataContext context, @NotNull ExCommand cmd) throws ExException { public boolean execute(@NotNull Editor editor, @NotNull final DataContext context, @NotNull ExCommand cmd) throws ExException {
String arg = cmd.getArgument(); String arg = cmd.getArgument();
if (arg != null && arg.length() > 0) { if (arg.length() > 0) {
boolean res = VimPlugin.getFile().openFile(arg + ".java", context); boolean res = VimPlugin.getFile().openFile(arg + ".java", context);
if (res) { if (res) {
VimPlugin.getMark().saveJumpLocation(editor); VimPlugin.getMark().saveJumpLocation(editor);

View File

@@ -39,7 +39,7 @@ public class FindFileHandler extends CommandHandler {
public boolean execute(@NotNull Editor editor, @NotNull final DataContext context, @NotNull ExCommand cmd) throws ExException { public boolean execute(@NotNull Editor editor, @NotNull final DataContext context, @NotNull ExCommand cmd) throws ExException {
String arg = cmd.getArgument(); String arg = cmd.getArgument();
if (arg != null && arg.length() > 0) { if (arg.length() > 0) {
boolean res = VimPlugin.getFile().openFile(arg, context); boolean res = VimPlugin.getFile().openFile(arg, context);
if (res) { if (res) {
VimPlugin.getMark().saveJumpLocation(editor); VimPlugin.getMark().saveJumpLocation(editor);

View File

@@ -37,17 +37,12 @@ public class FindSymbolHandler extends CommandHandler {
} }
public boolean execute(@NotNull Editor editor, @NotNull final DataContext context, @NotNull ExCommand cmd) throws ExException { public boolean execute(@NotNull Editor editor, @NotNull final DataContext context, @NotNull ExCommand cmd) throws ExException {
String arg = cmd.getArgument(); // TODO: Check the command argument and jump to a specific symbol
if (arg != null && arg.length() > 0) {
// TODO - jump to specific symbol
}
SwingUtilities.invokeLater(new Runnable() { SwingUtilities.invokeLater(new Runnable() {
public void run() { public void run() {
KeyHandler.executeAction("GotoSymbol", context); KeyHandler.executeAction("GotoSymbol", context);
} }
}); });
return true; return true;
} }
} }

View File

@@ -126,7 +126,7 @@ public class HistoryHandler extends CommandHandler {
return false; return false;
} }
StringBuffer res = new StringBuffer(); StringBuilder res = new StringBuilder();
switch (key.charAt(0)) { switch (key.charAt(0)) {
case 'c': case 'c':
res.append(processKey(HistoryGroup.COMMAND, f, l)); res.append(processKey(HistoryGroup.COMMAND, f, l));
@@ -159,7 +159,7 @@ public class HistoryHandler extends CommandHandler {
logger.debug("process " + key + " " + start + "," + end); logger.debug("process " + key + " " + start + "," + end);
} }
StringBuffer res = new StringBuffer(); StringBuilder res = new StringBuilder();
res.append(" # ").append(key).append(" ").append("history\n"); res.append(" # ").append(key).append(" ").append("history\n");
@@ -173,5 +173,5 @@ public class HistoryHandler extends CommandHandler {
return res.toString(); return res.toString();
} }
private static Logger logger = Logger.getInstance(HistoryHandler.class.getName()); private static final Logger logger = Logger.getInstance(HistoryHandler.class.getName());
} }

View File

@@ -36,7 +36,7 @@ public class JoinLinesHandler extends CommandHandler {
} }
public boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull ExCommand cmd) throws ExException { public boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull ExCommand cmd) throws ExException {
StringBuffer arg = new StringBuffer(cmd.getArgument()); StringBuilder arg = new StringBuilder(cmd.getArgument());
boolean spaces = true; boolean spaces = true;
if (arg.length() > 0 && arg.charAt(0) == '!') { if (arg.length() > 0 && arg.charAt(0) == '!') {
spaces = false; spaces = false;

View File

@@ -26,11 +26,12 @@ import com.maddyhome.idea.vim.common.Jump;
import com.maddyhome.idea.vim.ex.*; import com.maddyhome.idea.vim.ex.*;
import com.maddyhome.idea.vim.helper.EditorData; import com.maddyhome.idea.vim.helper.EditorData;
import com.maddyhome.idea.vim.helper.EditorHelper; import com.maddyhome.idea.vim.helper.EditorHelper;
import com.maddyhome.idea.vim.helper.StringHelper;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import java.util.List; import java.util.List;
import static com.maddyhome.idea.vim.helper.StringHelper.*;
/** /**
* *
*/ */
@@ -46,7 +47,7 @@ public class JumpsHandler extends CommandHandler {
int spot = VimPlugin.getMark().getJumpSpot(); int spot = VimPlugin.getMark().getJumpSpot();
String spaces = " "; String spaces = " ";
StringBuffer text = new StringBuffer(); StringBuilder text = new StringBuilder();
text.append(" jump line col file/text\n"); text.append(" jump line col file/text\n");
int i = jumps.size(); int i = jumps.size();
for (Jump jump : jumps) { for (Jump jump : jumps) {
@@ -56,7 +57,7 @@ public class JumpsHandler extends CommandHandler {
else { else {
text.append(" "); text.append(" ");
} }
text.append(StringHelper.rightJustify(Integer.toString(Math.abs(i - spot - 1)), 3, ' ')); text.append(rightJustify(Integer.toString(Math.abs(i - spot - 1)), 3, ' '));
text.append(" "); text.append(" ");
String num = Integer.toString(jump.getLogicalLine() + 1); String num = Integer.toString(jump.getLogicalLine() + 1);
@@ -71,7 +72,7 @@ public class JumpsHandler extends CommandHandler {
text.append(" "); text.append(" ");
VirtualFile vf = EditorData.getVirtualFile(editor); VirtualFile vf = EditorData.getVirtualFile(editor);
if (vf != null && vf.getPath().equals(jump.getFilename())) { if (vf != null && vf.getPath().equals(jump.getFilename())) {
text.append(StringHelper.escape(EditorHelper.getLineText(editor, jump.getLogicalLine()).trim())); text.append(toKeyNotation(stringToKeys(EditorHelper.getLineText(editor, jump.getLogicalLine()).trim())));
} }
else { else {
text.append(jump.getFilename()); text.append(jump.getFilename());

View File

@@ -36,6 +36,7 @@ import static com.maddyhome.idea.vim.helper.StringHelper.parseKeys;
* @author vlan * @author vlan
*/ */
public class MapHandler extends CommandHandler implements VimScriptCommandHandler { public class MapHandler extends CommandHandler implements VimScriptCommandHandler {
public static final char CTRL_V = '\u0016';
public static final CommandInfo[] COMMAND_INFOS = new CommandInfo[] { public static final CommandInfo[] COMMAND_INFOS = new CommandInfo[] {
// TODO: Support xmap, smap, map!, lmap // TODO: Support xmap, smap, map!, lmap
new CommandInfo("map", "", MappingMode.NVO, true), new CommandInfo("map", "", MappingMode.NVO, true),
@@ -156,7 +157,7 @@ public class MapHandler extends CommandHandler implements VimScriptCommandHandle
} }
inputBuilder.append(c); inputBuilder.append(c);
} }
else if (c == '\\') { else if (c == '\\' || c == CTRL_V) {
escape = true; escape = true;
} }
else if (c == '|') { else if (c == '|') {

View File

@@ -26,11 +26,13 @@ import com.maddyhome.idea.vim.common.Mark;
import com.maddyhome.idea.vim.ex.*; import com.maddyhome.idea.vim.ex.*;
import com.maddyhome.idea.vim.helper.EditorData; import com.maddyhome.idea.vim.helper.EditorData;
import com.maddyhome.idea.vim.helper.EditorHelper; import com.maddyhome.idea.vim.helper.EditorHelper;
import com.maddyhome.idea.vim.helper.StringHelper;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import java.util.List; import java.util.List;
import static com.maddyhome.idea.vim.helper.StringHelper.stringToKeys;
import static com.maddyhome.idea.vim.helper.StringHelper.toKeyNotation;
/** /**
* *
*/ */
@@ -45,7 +47,7 @@ public class MarksHandler extends CommandHandler {
List<Mark> marks = VimPlugin.getMark().getMarks(editor); List<Mark> marks = VimPlugin.getMark().getMarks(editor);
String spaces = " "; String spaces = " ";
StringBuffer text = new StringBuffer(); StringBuilder text = new StringBuilder();
text.append("mark line col file/text\n"); text.append("mark line col file/text\n");
for (Mark mark : marks) { for (Mark mark : marks) {
text.append(" "); text.append(" ");
@@ -64,7 +66,7 @@ public class MarksHandler extends CommandHandler {
text.append(" "); text.append(" ");
VirtualFile vf = EditorData.getVirtualFile(editor); VirtualFile vf = EditorData.getVirtualFile(editor);
if (vf != null && vf.getPath().equals(mark.getFilename())) { if (vf != null && vf.getPath().equals(mark.getFilename())) {
text.append(StringHelper.escape(EditorHelper.getLineText(editor, mark.getLogicalLine()).trim())); text.append(toKeyNotation(stringToKeys(EditorHelper.getLineText(editor, mark.getLogicalLine()).trim())));
} }
else { else {
text.append(mark.getFilename()); text.append(mark.getFilename());

View File

@@ -40,7 +40,7 @@ public class MoveTextHandler extends CommandHandler {
public boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull ExCommand cmd) throws ExException { public boolean execute(@NotNull Editor editor, @NotNull DataContext context, @NotNull ExCommand cmd) throws ExException {
TextRange range = cmd.getTextRange(editor, context, false); TextRange range = cmd.getTextRange(editor, context, false);
LineRange lr = cmd.getLineRange(editor, context, false); LineRange lr = cmd.getLineRange(editor, context);
int adj = lr.getEndLine() - lr.getStartLine() + 1; int adj = lr.getEndLine() - lr.getStartLine() + 1;
final ExCommand argumentCmd = CommandParser.getInstance().parse(cmd.getArgument()); final ExCommand argumentCmd = CommandParser.getInstance().parse(cmd.getArgument());

View File

@@ -42,14 +42,14 @@ public class RegistersHandler extends CommandHandler {
public boolean execute(@NotNull final Editor editor, @NotNull DataContext context, @NotNull ExCommand cmd) throws ExException { public boolean execute(@NotNull final Editor editor, @NotNull DataContext context, @NotNull ExCommand cmd) throws ExException {
List<Register> registers = VimPlugin.getRegister().getRegisters(); List<Register> registers = VimPlugin.getRegister().getRegisters();
StringBuffer text = new StringBuffer(); StringBuilder text = new StringBuilder();
text.append("--- Registers ---\n"); text.append("--- Registers ---\n");
for (Register reg : registers) { for (Register reg : registers) {
text.append("\""); text.append("\"");
text.append(reg.getName()); text.append(reg.getName());
text.append(" "); text.append(" ");
text.append(StringHelper.escape(reg.getKeys())); text.append(StringHelper.toKeyNotation(reg.getKeys()));
text.append("\n"); text.append("\n");
} }

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