From 7cf03a1555d46117b5f1a3d0db7c28c02498fcee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Karel=20Ko=C4=8D=C3=AD?= Date: Sun, 7 Oct 2018 20:03:35 +0200 Subject: Add presentation from LinuxDays 2018 --- 2018-linuxdays/pres.tex | 270 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 270 insertions(+) create mode 100644 2018-linuxdays/pres.tex (limited to '2018-linuxdays/pres.tex') 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] +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} -- cgit v1.2.3