1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
|
class NormalMode extends KeyHandlerMode
constructor: (options = {}) ->
defaults =
name: "normal"
indicator: false # There is normally no mode indicator in normal mode.
commandHandler: @commandHandler.bind this
super extend defaults, options
chrome.storage.local.get "normalModeKeyStateMapping", (items) =>
@setKeyMapping items.normalModeKeyStateMapping
chrome.storage.onChanged.addListener (changes, area) =>
if area == "local" and changes.normalModeKeyStateMapping?.newValue
@setKeyMapping changes.normalModeKeyStateMapping.newValue
commandHandler: ({command: registryEntry, count}) ->
count *= registryEntry.options.count ? 1
count = 1 if registryEntry.noRepeat
if registryEntry.repeatLimit? and registryEntry.repeatLimit < count
return unless confirm """
You have asked Vimium to perform #{count} repetitions of the command: #{registryEntry.description}.\n
Are you sure you want to continue?"""
if registryEntry.topFrame
# We never return to a UI-component frame (e.g. the help dialog), it might have lost the focus.
sourceFrameId = if window.isVimiumUIComponent then 0 else frameId
chrome.runtime.sendMessage
handler: "sendMessageToFrames", message: {name: "runInTopFrame", sourceFrameId, registryEntry}
else if registryEntry.background
chrome.runtime.sendMessage {handler: "runBackgroundCommand", registryEntry, count}
else
Utils.invokeCommandString registryEntry.command, count, {registryEntry}
NormalModeCommands =
# Scrolling.
scrollToBottom: ->
Marks.setPreviousPosition()
Scroller.scrollTo "y", "max"
scrollToTop: (count) ->
Marks.setPreviousPosition()
Scroller.scrollTo "y", (count - 1) * Settings.get("scrollStepSize")
scrollToLeft: -> Scroller.scrollTo "x", 0
scrollToRight: -> Scroller.scrollTo "x", "max"
scrollUp: (count) -> Scroller.scrollBy "y", -1 * Settings.get("scrollStepSize") * count
scrollDown: (count) -> Scroller.scrollBy "y", Settings.get("scrollStepSize") * count
scrollPageUp: (count) -> Scroller.scrollBy "y", "viewSize", -1/2 * count
scrollPageDown: (count) -> Scroller.scrollBy "y", "viewSize", 1/2 * count
scrollFullPageUp: (count) -> Scroller.scrollBy "y", "viewSize", -1 * count
scrollFullPageDown: (count) -> Scroller.scrollBy "y", "viewSize", 1 * count
scrollLeft: (count) -> Scroller.scrollBy "x", -1 * Settings.get("scrollStepSize") * count
scrollRight: (count) -> Scroller.scrollBy "x", Settings.get("scrollStepSize") * count
# Page state.
reload: (count, options) ->
hard = options.registryEntry.options.hard ? false
window.location.reload(hard)
goBack: (count) -> history.go(-count)
goForward: (count) -> history.go(count)
# Url manipulation.
goUp: (count) ->
url = window.location.href
if (url[url.length - 1] == "/")
url = url.substring(0, url.length - 1)
urlsplit = url.split("/")
# make sure we haven't hit the base domain yet
if (urlsplit.length > 3)
urlsplit = urlsplit.slice(0, Math.max(3, urlsplit.length - count))
window.location.href = urlsplit.join('/')
goToRoot: ->
window.location.href = window.location.origin
toggleViewSource: ->
chrome.runtime.sendMessage { handler: "getCurrentTabUrl" }, (url) ->
if (url.substr(0, 12) == "view-source:")
url = url.substr(12, url.length - 12)
else
url = "view-source:" + url
chrome.runtime.sendMessage {handler: "openUrlInNewTab", url}
copyCurrentUrl: ->
chrome.runtime.sendMessage { handler: "getCurrentTabUrl" }, (url) ->
chrome.runtime.sendMessage { handler: "copyToClipboard", data: url }
url = url[0..25] + "...." if 28 < url.length
HUD.showForDuration("Yanked #{url}", 2000)
# Mode changes.
enterInsertMode: ->
# If a focusable element receives the focus, then we exit and leave the permanently-installed insert-mode
# instance to take over.
new InsertMode global: true, exitOnFocus: true
enterVisualMode: ->
new VisualMode userLaunchedMode: true
enterVisualLineMode: ->
new VisualLineMode userLaunchedMode: true
root = exports ? (window.root ?= {})
root.NormalMode = NormalMode
root.NormalModeCommands = NormalModeCommands
extend root, NormalModeCommands
extend window, root unless exports?
|