aboutsummaryrefslogtreecommitdiffstats
path: root/content_scripts/mode_visual.coffee
diff options
context:
space:
mode:
Diffstat (limited to 'content_scripts/mode_visual.coffee')
-rw-r--r--content_scripts/mode_visual.coffee16
1 files changed, 14 insertions, 2 deletions
diff --git a/content_scripts/mode_visual.coffee b/content_scripts/mode_visual.coffee
index cbdf6ae2..011d6775 100644
--- a/content_scripts/mode_visual.coffee
+++ b/content_scripts/mode_visual.coffee
@@ -197,7 +197,15 @@ class VisualMode extends KeyHandlerMode
"P": -> chrome.runtime.sendMessage handler: "openUrlInNewTab", url: @yank()
"v": -> new VisualMode
"V": -> new VisualLineMode
- "c": -> @movement.collapseSelectionToAnchor(); new CaretMode
+ "c": ->
+ # If we're already in caret mode, or if the selection looks the same as it would in caret mode, then
+ # callapse to anchor (so that the caret-mode selection will seem unchanged). Otherwise, we're in visual
+ # mode and the user has moved the focus, so collapse to that.
+ if @name == "caret" or @selection.toString().length <= 1
+ @movement.collapseSelectionToAnchor()
+ else
+ @movement.collapseSelectionToFocus()
+ new CaretMode
"o": -> @movement.reverseSelection()
constructor: (options = {}) ->
@@ -228,7 +236,11 @@ class VisualMode extends KeyHandlerMode
commandHandler: @commandHandler.bind this
@onExit (event = null) =>
- @movement.collapseSelectionToAnchor()
+ # This mimics vim: when leaving visual mode via Escape, collapse to focus, otherwise collapse to anchor.
+ if event?.type == "keydown" and KeyboardUtils.isEscape(event) and @name != "caret"
+ @movement.collapseSelectionToFocus()
+ else
+ @movement.collapseSelectionToAnchor()
# Don't leave the user in insert mode just because they happen to have selected an input.
if document.activeElement and DomUtils.isEditable document.activeElement
document.activeElement.blur() unless event?.type == "click"