chiark / gitweb /
bash-completion: split completions and move to new location
[elogind.git] / shell-completion / bash / journalctl
diff --git a/shell-completion/bash/journalctl b/shell-completion/bash/journalctl
new file mode 100644 (file)
index 0000000..1fca5ad
--- /dev/null
@@ -0,0 +1,105 @@
+# journalctl(1) completion                                -*- shell-script -*-
+#
+# This file is part of systemd.
+#
+# Copyright 2010 Ran Benita
+#
+# systemd is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2.1 of the License, or
+# (at your option) any later version.
+#
+# systemd is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public License
+# along with systemd; If not, see <http://www.gnu.org/licenses/>.
+
+__contains_word () {
+        local word=$1; shift
+        for w in $*; do [[ $w = $word ]] && return 0; done
+        return 1
+}
+
+__journal_fields=(MESSAGE{,_ID} PRIORITY CODE_{FILE,LINE,FUNC}
+                  ERRNO SYSLOG_{FACILITY,IDENTIFIER,PID} COREDUMP_EXE
+                  _{P,U,G}ID _COMM _EXE _CMDLINE
+                  _AUDIT_{SESSION,LOGINUID}
+                  _SYSTEMD_{CGROUP,SESSION,UNIT,OWNER_UID}
+                  _SELINUX_CONTEXT _SOURCE_REALTIME_TIMESTAMP
+                  _{BOOT,MACHINE}_ID _HOSTNAME _TRANSPORT
+                  _KERNEL_{DEVICE,SUBSYSTEM}
+                  _UDEV_{SYSNAME,DEVNODE,DEVLINK}
+                  __CURSOR __{REALTIME,MONOTONIC}_TIMESTAMP)
+
+_journalctl() {
+        local field_vals= cur=${COMP_WORDS[COMP_CWORD]} prev=${COMP_WORDS[COMP_CWORD-1]}
+        local -A OPTS=(
+                [STANDALONE]='-a --all --full
+                              -b --this-boot --disk-usage -f --follow --header
+                              -h --help -l --local --new-id128 -m --merge --no-pager
+                              --no-tail -q --quiet --setup-keys --this-boot --verify
+                              --version --list-catalog --update-catalog'
+                       [ARG]='-D --directory -F --field -o --output -u --unit --user-unit'
+                [ARGUNKNOWN]='-c --cursor --interval -n --lines -p --priority --since --until
+                              --verify-key'
+        )
+
+        if __contains_word "$prev" ${OPTS[ARG]} ${OPTS[ARGUNKNOWN]}; then
+                case $prev in
+                        --directory|-D)
+                                comps=$(compgen -d -- "$cur")
+                                compopt -o filenames
+                        ;;
+                        --output|-o)
+                                comps='short short-monotonic verbose export json cat'
+                        ;;
+                        --field|-F)
+                                comps=${__journal_fields[*]}
+                        ;;
+                        --unit|-u)
+                                comps=$(journalctl -F '_SYSTEMD_UNIT')
+                        ;;
+                        --user-unit)
+                                comps=$(journalctl -F '_SYSTEMD_USER_UNIT')
+                        ;;
+                        *)
+                                return 0
+                        ;;
+                esac
+                COMPREPLY=( $(compgen -W '$comps' -- "$cur") )
+                return 0
+        fi
+
+        if [[ $cur = -* ]]; then
+                COMPREPLY=( $(compgen -W '${OPTS[*]}' -- "$cur") )
+                return 0
+        elif [[ $cur = *=* ]]; then
+                mapfile -t field_vals < <(journalctl -F "${prev%=}" 2>/dev/null)
+                COMPREPLY=( $(compgen -W '${field_vals[*]}' -- "${cur#=}") )
+        elif [[ $cur = /dev* ]]; then
+                compopt -o filenames
+                COMPREPLY=( $(compgen -f -- "${cur}") )
+        elif [[ $cur = /* ]]; then
+                # Append /dev/ to the list of completions, so that
+                # after typing /<TAB><TAB> the user sees /dev/ as one
+                # of the alternatives. Later on the rule above will
+                # take care of showing device files in /dev/.
+                mapfile -t field_vals < <(journalctl -F "_EXE" 2>/dev/null; echo '/dev/')
+                COMPREPLY=( $(compgen -W '${field_vals[*]}' -- "${cur}") )
+                if [[ "${COMPREPLY[@]}" = '/dev/' ]]; then
+                    compopt -o filenames
+                    COMPREPLY=( $(compgen -f -- "${cur}") )
+                fi
+        elif [[ $prev = '=' ]]; then
+                mapfile -t field_vals < <(journalctl -F "${COMP_WORDS[COMP_CWORD-2]}" 2>/dev/null)
+                COMPREPLY=( $(compgen -W '${field_vals[*]}' -- "$cur") )
+        else
+                compopt -o nospace
+                COMPREPLY=( $(compgen -W '${__journal_fields[*]}' -S= -- "$cur") )
+        fi
+}
+
+complete -F _journalctl journalctl