fish-shell/share/completions/scp.fish
Johannes Altmanninger 0c92c7d8ac Fix remote path escaping for rsync and scp completions
They need to be escaped twice, for the local and the remote shell.
Also don't suggest local files as rsync remote paths (-a -> -xa) and
fix completion for remote paths containing multiple consecutive spaces.

Fixes #1872
[ci skip]
2020-01-13 10:30:57 +01:00

68 lines
2.1 KiB
Fish

#
# Load completions shared by ssh and scp.
#
__fish_complete_ssh scp
# Helper functions to simplify the completions.
function __scp2ssh_port_number
# There is a silly inconsistency between the ssh and scp commands regarding the short flag name
# for specifying the TCP port number. This function deals with that by extracting the port
# number if present and emitting it as a flag appropriate for ssh.
set -l port (commandline -c | string match -r -- ' -P ?(\d+)\b')
and echo -p\n$port[2]
end
function __scp_remote_target
set -l target (commandline -ct | string match -r -- '(.*):')
and echo $target[2]
end
function __scp_remote_path_prefix
set -l path_prefix (commandline -ct | string match -r -- ':(.*)')
and echo $path_prefix[2]
end
function __fish_no_scp_remote_specified
set -l tokens (commandline -t)
# can't use `for token in tokens[1..-2]` due to https://github.com/fish-shell/fish-shell/issues/4897
set -e tokens[-1]
for token in $tokens # ignoring current token
if string match -e @ -- $token
return 1
end
end
return 0
end
#
# scp specific completions
#
#
# Inherit user/host completions from ssh
#
complete -c scp -d Remote -n "__fish_no_scp_remote_specified; and not string match -e : (commandline -ct)" -a "(complete -C'ssh ' | string replace -r '\t.*' ':')"
#
# Local path
#
complete -c scp -d "Local Path" -n "not string match @ -- (commandline -ct)"
#
# Remote path
#
# Get the list of remote files from the scp target.
complete -c scp -d "Remote Path" -f -n "commandline -ct | string match -e ':'" -a "
(__scp_remote_target):( \
command ssh (__scp2ssh_port_number) -o 'BatchMode yes' (__scp_remote_target) /bin/ls\ -dp\ (__scp_remote_path_prefix | string unescape)\* 2>/dev/null |
string escape -n
)
"
complete -c scp -s B -d "Batch mode"
complete -c scp -s l -x -d "Bandwidth limit"
complete -c scp -s P -x -d "Port"
complete -c scp -s p -d "Preserves modification times, access times, and modes from the original file"
complete -c scp -s q -d "Do not display progress bar"
complete -c scp -s r -d "Recursively copy"
complete -c scp -s S -d "Encryption program"