\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] <device>
Options:
  -b <duration> 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 <baudrate>
  -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}
