summary refs log tree commit diff
path: root/Completion
diff options
context:
space:
mode:
Diffstat (limited to 'Completion')
-rw-r--r--Completion/Unix/Command/.distfiles1
-rw-r--r--Completion/Unix/Command/_ln76
2 files changed, 77 insertions, 0 deletions
diff --git a/Completion/Unix/Command/.distfiles b/Completion/Unix/Command/.distfiles
index 696faea88..22e0a4fbe 100644
--- a/Completion/Unix/Command/.distfiles
+++ b/Completion/Unix/Command/.distfiles
@@ -111,6 +111,7 @@ _last
 _ldd
 _less
 _links
+_ln
 _loadkeys
 _locate
 _look
diff --git a/Completion/Unix/Command/_ln b/Completion/Unix/Command/_ln
new file mode 100644
index 000000000..89b7177ab
--- /dev/null
+++ b/Completion/Unix/Command/_ln
@@ -0,0 +1,76 @@
+#compdef ln gln
+
+local curcontext="$curcontext" state line ret=1
+local -A opt_args
+
+local -a args
+args=(
+  '-f[remove existing destination files]'
+  '-s[create symbolic links instead of hard links]')
+
+local -a opts
+
+local variant
+_pick_variant -r variant gnu=gnu unix --help
+if [[ $variant == gnu ]]; then
+  opts=(-S)
+  args=(
+    '(-b --backup)-b[create a backup of each existing destination file]' \
+    '(-b --backup)--backup=[create a backup of each existing destination file]::method:((
+        none\:"never create backups"
+        off\:"never create backups"
+        numbered\:"create numbered backup"
+        t\:"create numbered backup"
+        existing\:"same as numbered if numbered backups exist, otherwise same as simple"
+        nil\:"same as numbered if numbered backups exist, otherwise same as simple"
+        simple\:"always create simple backups"
+        never\:"always create simple backups"))'
+    '(-d -F --directory)'{-d,-F,--directory}'[allow the superuser to attempt to hard link directories]'
+    '(-f --force)'{-f,--force}'[remove existing destination files]'
+    '(-i --interactive)'{-i,--interactive}'[prompt before removing destination files]'
+    '(-L --logical)'{-L,--logical}'[create hard links to symbolic link references]'
+    '(-n --no-dereference)'{-n,--no-dereference}'[treat destination symbolic link to a directory as if it were a normal file]'
+    '(-P --physical)'{-P,--physical}'[create hard links directly to symbolic links]'
+    '(-s --symbolic)'{-s,--symbolic}'[create symbolic links instead of hard links]'
+    '(-S --suffix)'{-S,--suffix=}'[override default backup suffix]:suffix'
+    '(-t --target-directory)'{-t,--target-directory=}'[specify directory in which to create the links]: :_directories'
+    '(-T --no-target-directory)'{-T,--no-target-directory}'[treat destination as a normal file]'
+    '(-v --verbose)'{-v,--verbose}'[print name of each linked file]'
+    '--help[display usage information and exit]'
+    '--version[display version information and exit]')
+elif (( ${+builtins[ln]} )); then
+  args+=(
+    '-d[attempt to hard link directories]'
+    {-h,-n}'[do not dereference destination]'
+    '-i[prompt before removing destination files]')
+elif [[ $OSTYPE == darwin* ]]; then
+  args+=(
+    '-F[remove existing destination directories]'
+    {-h,-n}'[do not dereference destination]'
+    '-i[prompt before removing destination files]'
+    '-v[print name of each linked file]')
+fi
+
+_arguments -s $opts \
+  $args \
+  ':link target:_files' \
+  '*:: :->files' && ret=0
+
+case $state in
+  (files)
+    if [[ $variant == gnu && -n ${opt_args[(I)-t|--target-directory]} ]]; then
+      _wanted files expl 'link target' _files && ret=0
+    else
+      if (( CURRENT == 2 )); then
+        local expl
+        _wanted files expl 'additional link target or link name' _files && ret=0
+      else
+        _alternative \
+          'link-targets:additional link target:_files' \
+          'target-directories:target directory:_directories' && ret=0
+      fi
+    fi
+    ;;
+esac
+
+return ret