\documentclass[aspectratio=169]{beamer} \usetheme{metropolis} \usepackage{lmodern} \usepackage[czech]{babel} \usepackage[utf8]{inputenc} \usepackage[T1]{fontenc} \usepackage{graphicx} \usepackage{wrapfig} \usepackage{color} \usepackage{mathtools} \usepackage{hyperref} \usepackage{epstopdf} \usepackage{amsmath} \usepackage{minted} \hypersetup{ colorlinks, citecolor=black, filecolor=black, linkcolor=black, urlcolor=black } \usepackage{pdflscape} \title{Jak se píše doplňování v shellu?!} \author{Kar(t)el Kočí} \date{7.10.2018} \begin{document} \frame{\titlepage} % nejaky uvodni slide! \begin{frame}[fragile] \frametitle{Příkladový program} \begin{verbatim} $ sterm -h sterm: invalid option -- 'h' Usage: sterm [options] Options: -b send break signal -c enter command mode -d[PULSE] make pulse on DTR -e ignore '~.' escape sequence -n do not switch the device to raw mode -r[PULSE] make pulse on RTS -s -v verbose mode \end{verbatim} \end{frame} \begin{frame}[fragile] \frametitle{bash: příkaz complete a doplňování} \begin{verbatim} complete [-abcdefgjksuv] [-o comp-option] [-DE] [-A action] [-G globpat] [-W wordlist] [-F function] [-C command] [-X filterpat] [-P prefix] [-S suffix] name [name …] complete -pr [-DE] [name …] \end{verbatim} \begin{minted}[frame=lines]{shell} complete -G \*.pdf mupdf \end{minted} \begin{minted}[frame=lines]{shell} complete -W "9600 19200 38400 57600 115200" sterm \end{minted} \end{frame} \begin{frame}[fragile] \frametitle{bash: doplňovcí funkce, proměnné a compgen} \begin{verbatim} compgen [option] [word] \end{verbatim} \begin{minted}[frame=lines]{shell} _sterm() { COMPREPLY+=($(compgen -W "9600 19200 38400 57600 115200" \ -- "${COMP_WORDS[COMP_CWORD]}")) } complete -F _sterm sterm \end{minted} \begin{itemize} \item COMPREPLY: výsledek doplňování \item COMP\_LINE: celý dosavadní vstup \item COMP\_WORDS: pole jednotlivých slov ze vstupu \item COMP\_CWORD: poslední index do COMP\_WORDS = slovo které doplňujeme \end{itemize} \end{frame} \begin{frame}[fragile] \frametitle{bash: \_init\_completion} \begin{minted}[frame=lines]{shell} _sterm() { _init_completion || return COMPREPLY+=($(compgen -W "9600 19200 38400 57600 115200" \ -- "$cur")) } complete -F _sterm sterm \end{minted} Definuje \begin{itemize} \item cur: Aktuálně doplňované slovo \item prev: Předchozí argument \item words: Jako COMP\_WORDS z COMP\_LINE \item cword: To samé jako COMP\_CWORD ale pro words \end{itemize} \end{frame} \begin{frame}[fragile] \frametitle{bash: doplňování voleb} \begin{minted}[frame=lines]{shell} _sterm() { local cur prev words cword _init_completion || return case "$prev" in -b|-d|-r) ;; # No completion for these -s) COMPREPLY=($(compgen -W "9600 19200 38400 57600 115200" \ -- ${cur})) ;; *) COMPREPLY=($(compgen -W "-s -b -d -r" -- ${cur})) ;; esac } complete -o default -F _sterm sterm \end{minted} \end{frame} \begin{frame}[fragile] \frametitle{bash: doplňování cesty} \begin{minted}[frame=lines]{shell} _sterm() { local cur prev words cword _init_completion || return case "$prev" in -b|-d|-r) ;; # No completion for these -s) COMPREPLY=($(compgen -W "9600 19200 38400 57600 115200" \ -- ${cur})) ;; *) COMPREPLY+=($(compgen -W "-s -b -d -r" -- ${cur})) COMPREPLY+=($(compgen -G "/dev/tty*" -- ${cur})) ;; esac } complete -o default -F _sterm sterm \end{minted} \end{frame} \begin{frame}[fragile] \frametitle{zsh: compdef a \#compdef} \begin{minted}[frame=lines]{shell} _sterm() { _values "Baudrate" "9600" "19200" "115200" } compdef _sterm sterm \end{minted} \begin{minted}[frame=lines]{shell} #compdef foobar _sterm() { _values "Baudrate" "9600" "19200" "115200" } _sterm \end{minted} \begin{verbatim} fpath=($(pwd) $fpath) \end{verbatim} \end{frame} \begin{frame}[fragile] \frametitle{zsh: doplňování cest} \begin{minted}[frame=lines]{shell} _sterm() { _files } compdef _sterm sterm \end{minted} \begin{minted}[frame=lines]{shell} _sterm() { _values "tty" /dev/tty* } compdef _sterm sterm \end{minted} \end{frame} \begin{frame}[fragile] \frametitle{zsh: doplňování voleb} \begin{minted}[frame=lines]{shell} _sterm_baudrate() { _values "Baudrate" "9600" "19200" "115200" } _sterm() { _arguments \ "-s[Set baudrate]:baudrate:_sterm_baudrate" \ "-b[Send break]" \ "-c[Enter command mode]" \ "-d[Make pulse on DTR]" \ "-e[Ignore '~.' escape sequence]" } compdef _sterm sterm \end{minted} \end{frame} \begin{frame}[fragile] \frametitle{zsh: poziční argumenty} \begin{minted}[frame=lines]{shell} _sterm_baudrate() { _values "Baudrate" "9600" "19200" "115200" } _sterm() { _arguments \ "-s[Set baudrate]:baudrate:_sterm_baudrate" \ "-b[Send break]" \ "-c[Enter command mode]" \ "-d[Make pulse on DTR]" \ "-e[Ignore '~.' escape sequence]" \ "1:device:_files" } compdef _sterm sterm \end{minted} \end{frame} \begin{frame}[fragile] \frametitle{zsh: argumenty a stavy} \begin{minted}[frame=lines]{shell} _sterm_baudrate() { _values "Baudrate" "9600" "19200" "115200" } _sterm() { _arguments \ "-s[Set baudrate]:baudrate:_sterm_baudrate" \ "-b[Send break]:break:->ignore" \ "-c[Enter command mode]" \ "-d[Make pulse on DTR]:pulse:->ignore" \ "-e[Ignore '~.' escape sequence]" [ "$state" = "ignore" ] || _values "tty" /dev/tty* } compdef _sterm sterm \end{minted} \end{frame} \begin{frame}[fragile] \frametitle{zsh: doplňování bez námahy} \begin{minted}[frame=lines]{shell} compdef _gnu_generic ct-ng \end{minted} \end{frame} \section[Příklady]{} \begin{frame} \frametitle{Zdroje} \begin{itemize} \item Bash: man complete (BASH\_BUILTINS) \item Bash: \url{https://www.gnu.org/software/bash/manual/html\_node/Programmable-Completion.html} \item Zsh lidsky: \url{http://zsh.sourceforge.net/Doc/Release/Completion-System.html\#Completion-System} \item Zsh dokumentace: \url{http://zsh.sourceforge.net/Doc/Release/Completion-System.html\#Completion-System} \end{itemize} \end{frame} \begin{frame} \includegraphics[width=\textwidth]{naborovy-letak-projekce-rgb-1920x1080.png} \end{frame} \begin{frame} \Large Děkuji za pozornost. \url{git.cynerd.cz} \end{frame} \end{document}