aboutsummaryrefslogtreecommitdiffstats
path: root/content_scripts/mode_visual_edit.coffee
diff options
context:
space:
mode:
authorStephen Blott2015-01-31 06:16:46 +0000
committerStephen Blott2015-01-31 06:45:51 +0000
commit0c9b69a319e272727474ab6e1dabb3461927323d (patch)
tree38f0cf2490a3ef023583acf4758b4169859bdeee /content_scripts/mode_visual_edit.coffee
parent24edba31e73e3155a42f6619b85e5d31ac69cb69 (diff)
downloadvimium-0c9b69a319e272727474ab6e1dabb3461927323d.tar.bz2
Visual/edit modes: rework lexical selection...
- And drop "J".
Diffstat (limited to 'content_scripts/mode_visual_edit.coffee')
-rw-r--r--content_scripts/mode_visual_edit.coffee71
1 files changed, 35 insertions, 36 deletions
diff --git a/content_scripts/mode_visual_edit.coffee b/content_scripts/mode_visual_edit.coffee
index cbc60af6..a7abd314 100644
--- a/content_scripts/mode_visual_edit.coffee
+++ b/content_scripts/mode_visual_edit.coffee
@@ -1,15 +1,10 @@
# Todo:
# Konami code?
-# Use find as a mode.
-# Exit on Ctrl-Enter.
# Scroll is broken (again). Seems to be after dd.
# Paste of whole lines.
# Arrow keys.
# J
-# Fix Y for edit mode.
-# Fix sentence movements.
-# Change how we get the options for submodes.
# This prevents printable characters from being passed through to the underlying page. It should, however,
# allow through Chrome keyboard shortcuts.
@@ -347,6 +342,7 @@ class Movement extends CountPrefix
# Yank the selection; always exits; either deletes the selection or collapses it; returns the yanked text.
yank: (args = {}) ->
@yankedText = @selection.toString()
+ console.log "text:", @yankedText
if @options.deleteFromDocument or args.deleteFromDocument
@selection.deleteFromDocument()
@@ -363,36 +359,39 @@ class Movement extends CountPrefix
@yankedText
# For "daw", "das", and so on. We select a lexical entity (a word, a sentence or a paragraph).
- # Note(smblott). It would be nice if the entities could be handled symmetrically. Unfortunately, they
+ # Note(smblott). It would be better if the entities could be handled symmetrically. Unfortunately, they
# cannot, and we have to handle each case individually.
- # Note(smblott). We currently ignore count.
selectLexicalEntity: (entity, count = 1) ->
- if entity == word
- if @nextCharacterIsWordCharacter()
- @runMovements [ forward, character ], [ backward, word ]
+
+ switch entity
+ when word
+ if @nextCharacterIsWordCharacter()
+ @runMovements [ forward, character ], [ backward, word ]
+ @collapseSelectionToFocus()
+ @runMovements ([0...count].map -> [ forward, word ])..., [ forward, word ], [ backward, word ]
+ else
+ @runMovements [ forward, word ], [ backward, word ], ([0...count].map -> [ forward, word ])...
+
+ when sentence
+ @runMovements [ forward, character ], [ backward, sentence ]
@collapseSelectionToFocus()
- @runMovements ([0...count].map -> [ forward, word ])..., [ forward, word ], [ backward, word ]
- else
- @runMovements [ forward, word ], [ backward, word ], ([0...count].map -> [ forward, word ])...
- else if entity == sentence
- @runMovement forward, character
- @runMovement backward, sentence
- @collapseSelectionToFocus()
- @runMovements ([0...count].map -> [ forward, sentence ])...
- else if entity == paragraph
- # Chrome's paragraph movements are weird: they're not symmetrical, and they tend to stop in odd places
- # (like mid-paragraph, for example). Here, we define a paragraph as a new-line delimited entity,
- # including the terminating newline.
- char = @getNextBackwardCharacter()
- while char and char != "\n"
- return unless @runMovements [ backward, character ], [ backward, lineboundary ]
+ @runMovements ([0...count].map -> [ forward, sentence ])...
+
+ when paragraph
+ # Chrome's paragraph movements are weird: they're not symmetrical, and tend to stop in odd places
+ # (like mid-paragraph, for example). Here, we define a paragraph as a new-line delimited entity,
+ # including the terminating newline.
+ # Note(smblott). This does not currently use the count.
char = @getNextBackwardCharacter()
- @collapseSelectionToFocus()
- char = @getNextForwardCharacter()
- while char and char != "\n"
- return unless @runMovements [ forward, character ], [ forward, lineboundary ]
+ while char? and char != "\n"
+ return unless @runMovements [ backward, character ], [ backward, lineboundary ]
+ char = @getNextBackwardCharacter()
+ @collapseSelectionToFocus()
char = @getNextForwardCharacter()
- @runMovement forward, character
+ while char? and char != "\n"
+ @runMovements [ forward, character ], [ forward, lineboundary ]
+ char = @getNextForwardCharacter()
+ @runMovement forward, character
# Try to scroll the focus into view.
scrollIntoView: ->
@@ -589,7 +588,6 @@ class EditMode extends Movement
v: -> @launchSubMode VisualMode
V: -> @launchSubMode VisualLineMode
- # FIXME(smblott). "Y" is no longer a movement, it's a command. This needs to be implemented.
Y: (count) -> @enterVisualModeForMovement count, immediateMovement: "Y"
x: (count) -> @enterVisualModeForMovement count, immediateMovement: "l", deleteFromDocument: true, noCopyToClipboard: true
X: (count) -> @enterVisualModeForMovement count, immediateMovement: "h", deleteFromDocument: true, noCopyToClipboard: true
@@ -600,11 +598,12 @@ class EditMode extends Movement
D: (count) -> @enterVisualModeForMovement 1, immediateMovement: "$", deleteFromDocument: true
C: (count) -> @enterVisualModeForMovement 1, immediateMovement: "$", deleteFromDocument: true, onYank: => @enterInsertMode()
- J: (count) ->
- for [0...count]
- @runMovement forward, lineboundary
- @enterVisualModeForMovement 1, immediateMovement: "w", deleteFromDocument: true, noCopyToClipboard: true
- DomUtils.simulateTextEntry @element, " "
+ # Disabled. Doesn't work.
+ # J: (count) ->
+ # for [0...count]
+ # @runMovement forward, lineboundary
+ # @enterVisualModeForMovement 1, immediateMovement: "w", deleteFromDocument: true, noCopyToClipboard: true
+ # DomUtils.simulateTextEntry @element, " "
r: (count) ->
handlerStack.push