summaryrefslogtreecommitdiff
path: root/etc
diff options
context:
space:
mode:
authorDaniel Friesel <derf@derf.homelinux.org>2008-09-02 23:10:55 +0200
committerDaniel Friesel <derf@derf.homelinux.org>2008-09-02 23:10:55 +0200
commit3eaabe58b7bb46310fbf8daacd351f96d78989b7 (patch)
tree49d50657c5c0ba6ce708db6e8cd0b3e45ea37ba1 /etc
parent25f723e586957a7544c71b630f6485047c4b1e7f (diff)
Added better sshfs completion
Diffstat (limited to 'etc')
-rw-r--r--etc/completions/_sshfs82
1 files changed, 82 insertions, 0 deletions
diff --git a/etc/completions/_sshfs b/etc/completions/_sshfs
new file mode 100644
index 0000000..e06f8d4
--- /dev/null
+++ b/etc/completions/_sshfs
@@ -0,0 +1,82 @@
+#compdef sshfs
+## Since _user_at_host was a little inflexible,
+## I ripped the responsible parts from _ssh.
+## In future, sshfs should be handled by _ssh as well
+
+typeset expl lstate tmp
+
+_arguments \
+ '-V[version]' \
+ '-p:tcp port:' \
+ '-C[compression]' \
+ '-o:options:_values -s , "sshfs or fuse or mount options" reconnect sshfs_sync no_readahead sshfs_debug cache=:cache\ setting:(yes no) cache_timeout=:seconds: cache_stat_timeout=:seconds: cache_dir_timeout=:seconds: cache_link_timeout=:seconds: ssh_command=:ssh\ command:_command_names directport=:port: SSHOPT=:ssh\ option: default_permissions allow_other allow_root kernel_cache large_read direct_io max_read=:size: hard_remove debug fs_name=:name: use_ino readdir_ino' \
+ '-d[debug]' \
+ '-f[foreground]' \
+ '-s[disable multithreaded operation]' \
+ '-r[mount read-only]' \
+ '-h[help]' \
+ ':remote directory:->userhost' \
+ ':mountpoint:_files -/'
+
+_ssh_users () {
+ _combination -s '[:@]' my-accounts users-hosts users "$@"
+}
+
+_ssh_hosts () {
+ local -a config_hosts
+ local config
+ integer ind
+
+ # If users-hosts matches, we shouldn't complete anything else.
+ if [[ "$IPREFIX" == *@ ]]; then
+ _combination -s '[:@]' my-accounts users-hosts "users=${IPREFIX/@}" hosts "$@" && return
+ else
+ _combination -s '[:@]' my-accounts users-hosts \
+ ${opt_args[-l]:+"users=${opt_args[-l]:q}"} hosts "$@" && return
+ fi
+ if (( ind = ${words[(I)-F]} )); then
+ config=${~words[ind+1]}
+ else
+ config="$HOME/.ssh/config"
+ fi
+ if [[ -r $config ]]; then
+ local IFS=$'\t ' key hosts host
+ while read key hosts; do
+ if [[ "$key" == (#i)host ]]; then
+ for host in ${(z)hosts}; do
+ case $host in
+ (*[*?]*) ;;
+ (*) config_hosts+=("$host") ;;
+ esac
+ done
+ fi
+ done < "$config"
+ if (( ${#config_hosts} )); then
+ _wanted hosts expl 'remote host name' \
+ compadd -M 'm:{a-zA-Z}={A-Za-z} r:|.=* r:|=*' "$@" $config_hosts
+ fi
+ fi
+}
+
+while [[ -n $state ]]; do
+ lstate=$state
+ state=''
+ case $lstate in
+ userhost)
+ if compset -P '*@'; then
+ _wanted hosts expl 'remote host name' _ssh_hosts
+ elif compset -S '@*'; then
+ _wanted users expl 'login name' _ssh_users -S ''
+ else
+ if (( $+opt_args[-l] )); then
+ tmp=()
+ else
+ tmp=( 'users:login name:_ssh_users -qS@' )
+ fi
+ _alternative \
+ 'hosts:remote host name:_ssh_hosts' \
+ "$tmp[@]"
+ fi
+ ;;
+ esac
+done