fish-shell/share/completions/scp.fish
Johannes Altmanninger b98cee10bb completions/scp: inhibit ls redefinitions
scp completions use "ls" to list files on the remote host.  If a user aliases
them (in noninteractive shells) this will break. In general, this is the
users fault but also kind of ours because we shouldn't really use "ls" here.
Let's work around this problem by skipping functions.

Fixes #9363
2022-11-20 13:46:07 +01:00

70 lines
2.5 KiB
Fish

# Load completions shared by various ssh tools like ssh, scp and sftp.
__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) command\ ls\ -dp\ (__scp_remote_path_prefix | string unescape)\* 2>/dev/null |
string escape -n
)
"
complete -c scp -s 3 -d "Copies between two remote hosts are transferred through the local host"
complete -c scp -s B -d "Batch mode"
complete -c scp -s D -x -d "Connect directly to a local SFTP server"
complete -c scp -s l -x -d "Bandwidth limit"
complete -c scp -s O -d "Use original SCP protocol instead of SFTP"
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 R -d "Copies between two remote hosts are performed by executing scp on the origin host"
complete -c scp -s r -d "Recursively copy"
complete -c scp -s S -d "Encryption program"
complete -c scp -s T -d "Disable strict filename checking"