-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathpokemon.kak
289 lines (268 loc) · 8.73 KB
/
pokemon.kak
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
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
declare-option -hidden str pokemon_selections_desc
declare-option -hidden str pokemon_head
declare-option -hidden str pokemon_next
declare-option -hidden str pokemon_prev
declare-option -hidden str pokemon_iter
declare-option -hidden int pokemon_len
declare-option -hidden int pokemon_index
declare-option -hidden str-list pokemon_list
declare-option -docstring 'automatically show pokemon user mode' bool pokemon_auto_user_mode true
define-command -hidden pokemon-user-mode %{
enter-user-mode pokemon
}
hook global GlobalSetOption pokemon_auto_user_mode=true %{
define-command -hidden -override pokemon-user-mode %{
enter-user-mode pokemon
}
}
hook global GlobalSetOption pokemon_auto_user_mode=false %{
define-command -hidden -override pokemon-user-mode nop
}
declare-user-mode pokemon
map global pokemon p ':pokemon-prev<ret>'
map global pokemon n ':pokemon-next<ret>'
map global pokemon l ':pokemon-list<ret>' -docstring 'LIST'
map global pokemon s ':pokemon-pin<ret>' -docstring 'PIN'
define-command -docstring %{
map global normal <a-0>..<a-9> default keybindings
} pokemon-keys-map %{
map global normal <a-1> ':pokemon-open 1<ret>'
map global normal <a-2> ':pokemon-open 2<ret>'
map global normal <a-3> ':pokemon-open 3<ret>'
map global normal <a-4> ':pokemon-open 4<ret>'
map global normal <a-5> ':pokemon-open 5<ret>'
map global normal <a-6> ':pokemon-open 6<ret>'
map global normal <a-7> ':pokemon-open 7<ret>'
map global normal <a-8> ':pokemon-open 8<ret>'
map global normal <a-9> ':pokemon-open 9<ret>'
map global normal <a-0> ':pokemon-open<ret>' -docstring 'open last pinned one'
}
define-command -hidden pokemon-pin-prompt %{
echo -markup '{Information}pin pokemon? (y/n)'
on-key %{
echo
evaluate-commands %sh{
case "$kak_key" in
y|Y)
printf 'pokemon-set; pokemon-user-mode\n'
;;
esac
}
}
}
define-command -params ..1 -docstring %{
pokemon-pin [switches]: pin current buffer and enter user mode
Switches:
prompt|p prompt before pin
Hint:
set pokemon_auto_user_mode to false to disable entering user mode
} pokemon-pin %{
evaluate-commands %sh{
[ "$kak_bufname" = '*debug*' ] && exit
case "$1" in
prompt|p)
if [ "$kak_opt_pokemon_index" -eq 0 ]; then
printf 'pokemon-pin-prompt\n'
else
printf 'pokemon-user-mode\n'
fi
;;
*)
if [ "$kak_opt_pokemon_index" -eq 0 ]; then
printf 'pokemon-set; pokemon-user-mode\n'
else
printf 'pokemon-user-mode\n'
fi
;;
esac
}
}
define-command -params ..1 -docstring %{
pokemon-open [index]: open pokemon by index or last pinned one if index is omitted
} pokemon-open %{
evaluate-commands %sh{
index="${1:-0}"
if [ "$index" -le "$kak_opt_pokemon_len" ]; then
if [ "$index" -gt 0 ]; then
printf "pokemon-index-open %d '%s'\n" "$index" "$kak_client"
elif [ -n "$kak_opt_pokemon_head" ]; then
printf "evaluate-commands -buffer '%s' -verbatim -- pokemon-buffer-select %s\n" "$kak_opt_pokemon_head" "$kak_client"
fi
fi
}
}
define-command -params ..1 -docstring %{
pokemon-drop [index]: drop pokemon by index or current one if index is omitted
} pokemon-drop %{
evaluate-commands %sh{
index="${1:-0}"
if [ "$index" -le "$kak_opt_pokemon_len" ]; then
if [ "$index" -gt 0 ]; then
printf 'pokemon-index-drop %d\n' "$index"
elif [ "$kak_opt_pokemon_index" -gt 0 ]; then
printf 'pokemon-current-drop\n'
fi
fi
}
}
define-command -docstring %{
goto next pokemon if available in the current context
} pokemon-next %{
try %{
buffer %opt{pokemon_next}
try %{
select %opt{pokemon_selections_desc}
execute-keys vv
}
enter-user-mode pokemon
} catch %{
fail 'pokemon passed away'
}
}
define-command -docstring %{
goto previous pokemon if available in the current context
} pokemon-prev %{
try %{
buffer %opt{pokemon_prev}
try %{
select %opt{pokemon_selections_desc}
execute-keys vv
}
enter-user-mode pokemon
} catch %{
fail 'pokemon passed away'
}
}
define-command -docstring %{
list all pokemons in the *pokemons* buffer
} pokemon-list %{
try %{
buffer *pokemons*
} catch %{
set-option global pokemon_list
evaluate-commands -buffer '*' %{
evaluate-commands %sh{
if [ "$kak_opt_pokemon_index" -gt 0 ]; then
printf "set-option -add global pokemon_list '%02d:%s'\n" "$kak_opt_pokemon_index" "$kak_bufname"
fi
}
}
evaluate-commands -save-regs '"/' %{
set-register / "^\Q%val{bufname}\E$"
set-register dquote %opt{pokemon_list}
edit -scratch *pokemons*
try %{
execute-keys '<a-P>i<ret><esc>ggd'
execute-keys '%|sort<ret><a-s>ghf:dx'
execute-keys '<a-k><ret>'
} catch %{
execute-keys gg
}
map buffer normal <ret> ':pokemon-list-open<ret>'
map buffer normal <esc> ':delete-buffer *pokemons*<ret>'
# negative lookahead trick allows not to drop *pokemons* buffer after '<ret>ga'
# useful if <ret> was pressed in wrong line then 'ga' restores existing list.
hook -once global WinDisplay '(?!\*pokemons\*).*' %{
try %{ delete-buffer *pokemons* }
}
}
}
}
define-command -hidden pokemon-set %{
trigger-user-hook "PokemonLink=%val{bufname} prev=%opt{pokemon_head}"
trigger-user-hook "PokemonLink=%opt{pokemon_head} next=%val{bufname}"
set-option -add global pokemon_len 1
set-option global pokemon_head %val{bufname}
set-option buffer pokemon_index %opt{pokemon_len}
map buffer pokemon d ':pokemon-drop<ret>' -docstring 'DROP'
map buffer pokemon s ':set-option buffer pokemon_selections_desc %val{selections_desc}<ret>' -docstring 'SELECTION SAVE'
hook buffer BufClose '.*' pokemon-current-drop
}
define-command -hidden pokemon-unset %{
trigger-user-hook "PokemonLink=%opt{pokemon_prev} next=%opt{pokemon_next}"
trigger-user-hook "PokemonLink=%opt{pokemon_next} prev=%opt{pokemon_prev}"
unset-option buffer pokemon_prev
unset-option buffer pokemon_next
unset-option buffer pokemon_index
set-option -remove global pokemon_len 1
unmap buffer pokemon s
unmap buffer pokemon n
unmap buffer pokemon p
}
define-command -hidden pokemon-current-drop %{
set-option global pokemon_head %opt{pokemon_prev}
set-option global pokemon_iter %opt{pokemon_next}
pokemon-index-update %opt{pokemon_index}
pokemon-unset
}
define-command -hidden pokemon-index-update -params 1 %{
evaluate-commands -buffer %opt{pokemon_iter} %{
set-option global pokemon_head %val{bufname}
set-option global pokemon_iter %opt{pokemon_next}
pokemon-index-update %opt{pokemon_index}
set-option buffer pokemon_index %arg{1}
}
}
define-command -hidden pokemon-index-drop -params 1 %{
evaluate-commands -buffer '*' %{
evaluate-commands %sh{
if [ "$1" -eq "$kak_opt_pokemon_index" ]; then
printf "set-option global pokemon_head '%s'\n" "$kak_bufname"
fi
}
}
evaluate-commands -buffer %opt{pokemon_head} pokemon-current-drop
}
define-command -hidden pokemon-index-open -params 2 %{
evaluate-commands -buffer '*' %{
evaluate-commands %sh{
if [ "$1" -eq "$kak_opt_pokemon_index" ]; then
printf "pokemon-buffer-select %s\n" "$2"
fi
}
}
}
define-command -hidden pokemon-buffer-select -params 1 %{
evaluate-commands -client "%arg{1}" %exp{
buffer '%val{bufname}'
try %%{
select %opt{pokemon_selections_desc}
execute-keys vv
}
}
}
define-command -hidden pokemon-list-open %{
try %{
execute-keys 'x_:b ''<c-r>.''<ret>'
try %{
select %opt{pokemon_selections_desc}
execute-keys vv
}
} catch %{
pokemon-open %val{cursor_line}
}
}
hook global User 'PokemonLink=(.*) prev=(.*)' %{
# if -buffer arg is empty eval block is not executed
evaluate-commands -buffer %val{hook_param_capture_1} %{
set-option buffer pokemon_prev %val{hook_param_capture_2}
map buffer pokemon p ':pokemon-prev<ret>' -docstring %val{hook_param_capture_2}
}
}
hook global User 'PokemonLink=(.*) next=(.*)' %{
# if -buffer arg is empty eval block is not executed
evaluate-commands -buffer %val{hook_param_capture_1} %{
set-option buffer pokemon_next %val{hook_param_capture_2}
map buffer pokemon n ':pokemon-next<ret>' -docstring %val{hook_param_capture_2}
}
}
define-command -hidden pokemon-debug %{
echo -debug -- ---
echo -debug pokemon_head: %opt{pokemon_head}
echo -debug pokemon_prev: %opt{pokemon_prev}
echo -debug pokemon_next: %opt{pokemon_next}
echo -debug pokemon_iter: %opt{pokemon_iter}
echo -debug pokemon_len: %opt{pokemon_len}
echo -debug pokemon_index: %opt{pokemon_index}
echo -debug pokemon_selections_desc: %opt{pokemon_selections_desc}
}