Modules for Elvish Shell

Adding fzf.elv

Changed files
+55
+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 + }