forked from keymando/keymando-vim
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathvim.rb
113 lines (91 loc) · 3.61 KB
/
vim.rb
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
108
109
110
111
112
class Vim < Plugin
@oldmode = 'n'
@mode = 'n'
@maps = {}
class << self; attr_accessor :mode, :maps, :oldmode; end
def before
end
def fire(key)
fn = Vim.maps[Vim.mode][key]
if fn
fn.call()
else
send(key)
end
end
def tomode(m)
oldmap = Vim.maps[Vim.mode]
newmap = Vim.maps[m]
oldmap.keys.each do |k|
#unmap k
end
newmap.keys.each do |k|
#map(k, lambda { self.fire(k) })
end
end
def toggle()
if Vim.mode == 'disabled'
Vim.mode = Vim.oldmode
system '/usr/local/bin/growlnotify -m "" -a Keymando Vim mode enabled.'
else
Vim.oldmode = Vim.mode
Vim.mode = 'disabled'
system '/usr/local/bin/growlnotify -m "" -a Keymando Vim mode disabled.'
end
end
def after
except /iTerm/, /MacVim/, /Firefox/, /PeepOpen/, /Quicksilver/, /1Password/, /Alfred/ do
Vim.maps['disabled'] = {}
Vim.maps['n'] = {
'h' => lambda { send("<Left>") },
'j' => lambda { send("<Down>") },
'k' => lambda { send("<Up>") },
'l' => lambda { send("<Right>") },
'w' => lambda { send("<Alt-Right><Alt-Right><Alt-Left>") },
'b' => lambda { send("<Alt-Left>") },
'e' => lambda { send("<Alt-Right>") },
'0' => lambda { send("<Cmd-Left>") },
'i' => lambda { Vim.mode = 'i' },
'a' => lambda { Vim.mode = 'i'; send("<Right>") },
'A' => lambda { Vim.mode = 'i'; send("<Ctrl-e>") },
'I' => lambda { Vim.mode = 'i'; send("<Ctrl-a>") },
'o' => lambda { Vim.mode = 'i'; send("<Cmd-Right><Return>") },
'O' => lambda { Vim.mode = 'i'; send("<Cmd-Left><Return><Up>") },
'd' => lambda { Vim.mode = 'od' },
'c' => lambda { Vim.mode = 'oc' },
'p' => lambda { send("<Cmd-Left><Down><Cmd-v>") },
'P' => lambda { send("<Cmd-Left><Cmd-v>") },
'u' => lambda { send("<Cmd-z>") },
'<Ctrl-R>' => lambda { send("<Shift-Cmd-z>") },
'x' => lambda { send("<Shift-Right><Cmd-x>") },
's' => lambda { send("<Shift-Right><Cmd-x>"); Vim.mode = 'i' },
'<Escape>' => lambda { send("<Escape>") },
}
Vim.maps['i'] = {
'<Ctrl-[>' => lambda { Vim.mode = 'n' },
'<Escape>' => lambda { Vim.mode = 'n' },
}
Vim.maps['od'] = {
'w' => lambda { send("<Shift-Alt-Right><Cmd-x>"); Vim.mode = 'n' },
'b' => lambda { send("<Shift-Alt-Left><Cmd-x>"); Vim.mode = 'n' },
'd' => lambda { send("<Cmd-Left><Shift-Down><Cmd-x>"); Vim.mode = 'n' },
#'iw' => lambda { send("<Alt-Right><Shift-Alt-Left><Delete>"); Vim.mode = 'n' },
'<Escape>' => lambda { Vim.mode = 'n' },
}
Vim.maps['oc'] = {
'w' => lambda { send("<Shift-Alt-Right><Cmd-x>"); Vim.mode = 'i' },
'b' => lambda { send("<Shift-Alt-Left><Cmd-x>"); Vim.mode = 'i' },
'c' => lambda { send("<Cmd-Left><Shift-Down><Cmd-x><Return><Up>"); Vim.mode = 'i' },
#'iw' => lambda { send("<Alt-Right><Shift-Alt-Left><Delete>"); Vim.mode = 'i' },
'<Escape>' => lambda { Vim.mode = 'n' },
}
keys = Vim.maps.values.reduce([]) do |l, m|
l = l + m.keys
end
keys.uniq.each do |k|
map(k, lambda { self.fire(k) })
end
end
map "<Alt-Escape>", lambda { self.toggle }
end
end