+55
fzf.elv
+55
fzf.elv
···
1
+
use str
2
+
use store
3
+
4
+
fn history {|&exact=$true &edit-key='tab' &delete-key='ctrl-d' &border='rounded' &down-exit=$true|
5
+
tmp E:SHELL = 'elvish'
6
+
7
+
var fzf-args = [
8
+
--no-multi
9
+
--no-sort
10
+
--read0
11
+
--print0
12
+
--info-command="print History"
13
+
--scheme=history
14
+
--border=$border
15
+
--query=$edit:current-command
16
+
]
17
+
18
+
if (not-eq $edit-key $nil) {
19
+
set fzf-args = [$@fzf-args --expect=$edit-key]
20
+
}
21
+
if (not-eq $delete-key $nil) {
22
+
set fzf-args = [$@fzf-args --expect=$delete-key]
23
+
}
24
+
if $exact {
25
+
set fzf-args = [$@fzf-args --exact]
26
+
}
27
+
if $down-exit {
28
+
set fzf-args = [$@fzf-args --bind 'down:transform:if (<= $E:FZF_POS 1) { print abort } else { print down }']
29
+
}
30
+
31
+
var key line @ignored = (str:split "\x00" (
32
+
edit:command-history &dedup &newest-first |
33
+
each {|cmd| printf "%s %s\x00" $cmd[id] $cmd[cmd] } |
34
+
try {
35
+
fzf $@fzf-args | slurp
36
+
} catch {
37
+
edit:redraw &full=$true
38
+
return
39
+
}
40
+
))
41
+
edit:redraw &full=$true
42
+
43
+
var id command = (str:split &max=2 ' ' $line)
44
+
45
+
if (eq $key $delete-key) {
46
+
store:del-cmd $id
47
+
edit:notify 'Deleted '$id
48
+
} else {
49
+
edit:replace-input $command
50
+
51
+
if (not-eq $key $edit-key) {
52
+
edit:return-line
53
+
}
54
+
}
55
+
}