aboutsummaryrefslogtreecommitdiff
path: root/2018-linuxdays/pres.tex
diff options
context:
space:
mode:
Diffstat (limited to '2018-linuxdays/pres.tex')
-rw-r--r--2018-linuxdays/pres.tex270
1 files changed, 270 insertions, 0 deletions
diff --git a/2018-linuxdays/pres.tex b/2018-linuxdays/pres.tex
new file mode 100644
index 0000000..71739f1
--- /dev/null
+++ b/2018-linuxdays/pres.tex
@@ -0,0 +1,270 @@
+\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}