2017-04-17 16:18:02 +01:00
function __funced_md5
if type -q md5sum
# GNU systems
echo ( md5sum $argv [ 1 ] | string split ' ' ) [ 1 ]
return 0
else if type -q md5
# BSD systems
md5 -q $argv [ 1 ]
return 0
end
return 1
end
2012-06-27 07:37:48 +04:00
function funced --description 'Edit function definition'
2017-07-13 13:29:35 -07:00
set -l options 'h/help' 'e/editor=' 'i/interactive'
argparse -n funced --min-args = 1 --max-args = 1 $options -- $argv
or return
if set -q _flag_help
__fish_print_help funced
return 0
end
set funcname $argv [ 1 ]
# Check VISUAL first since theoretically EDITOR could be ed.
2015-09-02 13:55:59 +02:00
set -l editor
2017-07-13 13:29:35 -07:00
if set -q _flag_interactive
set editor fish
else if set -q _flag_editor
set editor $_flag_editor
else if set -q VISUAL
2015-09-02 13:55:59 +02:00
set editor $VISUAL
else if set -q EDITOR
set editor $EDITOR
2017-07-13 13:29:35 -07:00
else
set editor fish
2012-06-30 10:22:41 +08:00
end
2012-06-27 07:37:48 +04:00
2012-06-30 10:22:41 +08:00
set -l init
switch $funcname
case '-*'
2016-11-27 21:27:22 -08:00
set init function -- $funcname \n \n end
2012-06-30 10:22:41 +08:00
case '*'
2016-11-27 21:27:22 -08:00
set init function $funcname \n \n end
2012-06-30 10:22:41 +08:00
end
2012-06-27 07:37:48 +04:00
2013-01-23 18:24:49 -08:00
# Break editor up to get its first command (i.e. discard flags)
2013-01-27 13:14:24 -08:00
if test -n " $editor "
set -l editor_cmd
eval set editor_cmd $editor
2014-07-10 00:26:58 -07:00
if not type -q -f " $editor_cmd [1] "
2017-04-17 16:18:02 +01:00
echo ( _ " funced: The value for \$EDITOR ' $editor ' could not be used because the command ' $editor_cmd [1]' could not be found " )
2013-01-27 13:14:24 -08:00
set editor fish
end
end
2016-11-27 21:27:22 -08:00
2017-07-13 13:29:35 -07:00
if test " $editor " = fish
2012-06-30 10:22:41 +08:00
set -l IFS
if functions -q -- $funcname
# Shadow IFS here to avoid array splitting in command substitution
set init ( functions -- $funcname | fish_indent --no-indent )
end
2007-04-23 04:55:39 +10:00
2012-06-30 10:22:41 +08:00
set -l prompt 'printf "%s%s%s> " (set_color green) ' $funcname ' (set_color normal)'
# Unshadow IFS since the fish_title breaks otherwise
set -e IFS
if read -p $prompt -c " $init " -s cmd
# Shadow IFS _again_ to avoid array splitting in command substitution
set -l IFS
eval ( echo -n $cmd | fish_indent )
end
return 0
end
2016-05-23 00:49:09 +02:00
# OSX mktemp is rather restricted - no suffix, no way to automatically use TMPDIR
# Create a directory so we can use a ".fish" suffix for the file - makes editors pick up that it's a fish file
2016-11-27 21:27:22 -08:00
set -q TMPDIR
or set -l TMPDIR /tmp
2016-05-23 00:49:09 +02:00
set -l tmpdir ( mktemp -d $TMPDIR /fish.XXXXXX)
set -l tmpname $tmpdir /$funcname .fish
2012-06-30 10:22:41 +08:00
if functions -q -- $funcname
2016-11-27 21:27:22 -08:00
functions -- $funcname > $tmpname
2012-06-30 10:22:41 +08:00
else
2016-11-27 21:27:22 -08:00
echo $init > $tmpname
2012-06-30 10:22:41 +08:00
end
2017-04-17 16:18:02 +01:00
2016-11-27 21:27:22 -08:00
# Repeatedly edit until it either parses successfully, or the user cancels
# If the editor command itself fails, we assume the user cancelled or the file
# could not be edited, and we do not try again
while true
2017-04-17 16:18:02 +01:00
set -l checksum ( __funced_md5 " $tmpname " )
2016-11-27 21:27:22 -08:00
if not eval $editor $tmpname
2017-04-17 16:18:02 +01:00
echo ( _ "Editing failed or was cancelled" )
2016-11-27 21:27:22 -08:00
else
2017-04-17 16:18:02 +01:00
# Verify the checksum (if present) to detect potential problems
# with the editor command
if set -q checksum [ 1 ]
set -l new_checksum ( __funced_md5 " $tmpname " )
if test " $new_checksum " = " $checksum "
echo ( _ "Editor exited but the function was not modified" )
end
end
2016-11-27 21:27:22 -08:00
if not source $tmpname
# Failed to source the function file. Prompt to try again.
echo # add a line between the parse error and the prompt
set -l repeat
set -l prompt ( _ 'Edit the file again\? [Y/n]' )
while test -z " $repeat "
read -p " echo $prompt \ " repeat
2014-10-17 11:49:26 -07:00
end
2016-11-27 21:27:22 -08:00
if not contains $repeat n N no NO No nO
continue
end
2017-04-17 16:18:02 +01:00
echo ( _ "Cancelled function editing" )
2016-11-27 21:27:22 -08:00
end
2014-10-17 11:49:26 -07:00
end
2016-11-27 21:27:22 -08:00
break
end
2017-04-17 16:18:02 +01:00
2012-11-18 11:23:22 +01:00
set -l stat $status
2016-05-28 12:34:04 +02:00
rm $tmpname > /dev/null
and rmdir $tmpdir > /dev/null
2012-06-30 10:22:41 +08:00
return $stat
end