]> git.ipfire.org Git - thirdparty/util-linux.git/blobdiff - bash-completion/umount
Merge branch 'lsclocks/ns-offset' of https://github.com/t-8ch/util-linux
[thirdparty/util-linux.git] / bash-completion / umount
index 98c90d61a45686a5bc2468494a542ad821b28b66..7650358ddd1032d7fa3a55be09228e5551a283ea 100644 (file)
@@ -1,3 +1,37 @@
+_umount_points_list()
+{
+       # List of characters to escape shamelessly stolen from "scp" completion
+       local escape_chars='[][(){}<>\",:;^&!$=?`|\\'\'' \t\f\n\r\v]'
+
+       findmnt -lno TARGET | awk '
+
+       function literal_ere(s) {
+               gsub(/[][^$.*?+{}\\()|]/, "\\\\&", s)
+               return s
+       }
+
+       {
+               home_ere = literal_ere(ENVIRON["HOME"])
+               print home_ere
+               if ($0 ~ "^"home_ere) {
+                       homeless = $0
+                       sub("^"home_ere, "~", homeless)
+                       gsub("'"$escape_chars"'", "\\\\&", homeless)
+                       print homeless " "
+               }
+               pwd_ere = literal_ere(ENVIRON["PWD"])
+               if ($0 ~ "^"pwd_ere) {
+                       reldir = $0
+                       sub("^"pwd_ere"/?", "", reldir)
+                       gsub("'"$escape_chars"'", "\\\\&", reldir)
+                       print "./" reldir " "
+                       print reldir " "
+               }
+               gsub("'"$escape_chars"'", "\\\\&")
+               print $0 " "
+       }'
+}
+
 _umount_module()
 {
        local cur prev OPTS
@@ -17,6 +51,12 @@ _umount_module()
                '-h'|'--help'|'-V'|'--version')
                        return 0
                        ;;
+               '-N'|'--namespace')
+                       local NAMESPACE
+                       NAMESPACE="$(lsns --type mnt --output PATH --noheadings)"
+                       COMPREPLY=( $(compgen -W "$NAMESPACE" -- $cur) )
+                       return 0
+                       ;;
        esac
        case $cur in
                -*)
@@ -27,12 +67,14 @@ _umount_module()
                                --fake
                                --force
                                --internal-only
+                               --namespace
                                --no-mtab
                                --lazy
                                --test-opts
                                --recursive
                                --read-only
                                --types
+                               --quiet
                                --verbose
                                --help
                                --version"
@@ -41,9 +83,7 @@ _umount_module()
                        ;;
        esac
 
-       local oldifs=$IFS
-       IFS=$'\n'
-       COMPREPLY=( $( compgen -W '$(findmnt -lno TARGET | sed "s/\([[:blank:]]\)/\\\\\1/g")' -- "$cur" ) )
-       IFS=$oldifs
+       local IFS=$'\n'
+       COMPREPLY=( $( compgen -W '$( _umount_points_list )'  -- "$cur" ) )
 }
-complete -F _umount_module umount
+complete -F _umount_module -o nospace umount