#+TITLE: Developer Workflow v Doom Emacs
#+include: ~/org/templates/document_personal.org

* Úvod

Tento dokument popisuje kompletní vývojářský workflow v Doom Emacs pro jazyky a nástroje, které Martin používá: Perl, Python, Go, Ansible, Terraform a Podman/Dockerfile. Ke každému jazyku najdeš: co nainstalovat, klávesové zkratky, příklad workflow a odkaz na ukázkový soubor v =examples/=.

* Instalace nástrojů

Všechny nástroje se instalují přes Homebrew (macOS). Na Linuxu použij příslušný package manager.

** Perl

#+begin_src bash
brew install perl
cpanm Perl::Tidy Perl::Critic Perl::LanguageServer
#+end_src

- =perltidy= — formatter (SPC m f)
- =perlcritic= — linter
- =Perl::LanguageServer= — LSP backend (volitelné)

** Python

#+begin_src bash
brew install python ruff pyright
#+end_src

- =ruff= — ultra-rychlý linter + formatter
- =pyright= — type-checking LSP server

** Go

#+begin_src bash
brew install go gopls
go install golang.org/x/tools/cmd/goimports@latest
#+end_src

- =gopls= — oficiální Go LSP
- =goimports= — formatter (gofmt + auto imports)

** Ansible

#+begin_src bash
brew install ansible ansible-lint
#+end_src

- =ansible-lint= — linter pro playbooky (flycheck integrace)

** Terraform

#+begin_src bash
brew install terraform terraform-ls
#+end_src

- =terraform-ls= — HashiCorp oficiální LSP server

** Podman / Dockerfile

#+begin_src bash
brew install podman hadolint
#+end_src

- =hadolint= — Dockerfile linter (flycheck integrace)
- =podman= — Docker-kompatibilní container runtime (daemonless)

* Keybindings přehled

Všechny keybindings jsou pod =SPC m= (localleader) — aktivní pouze v příslušném major mode.

| Jazyk      | SPC m f         | SPC m r          | SPC m t / b      | SPC m d   | SPC m i / p      |
|------------+-----------------+------------------+------------------+-----------+------------------|
| Perl       | perltidy format | perl run         | —                | perldb    | —                |
| Python     | ruff format     | python3 run      | —                | M-x pdb   | —                |
| Go         | goimports       | go run           | go test / build  | M-x dlv   | —                |
| Ansible    | —               | ansible-playbook | —                | —         | —                |
| Terraform  | terraform fmt   | —                | —                | —         | init / plan      |
| Dockerfile | —               | podman run       | podman build     | —         | —                |

Obecné navigační zkratky (všechny jazyky):

| Zkratka     | Akce                              |
|-------------+-----------------------------------|
| =C-M-a=     | Začátek funkce/subroutine         |
| =C-M-e=     | Konec funkce/subroutine           |
| =SPC s i=   | Imenu — seznam funkcí v souboru   |
| =gd=        | Go to definition (LSP/tags)       |
| =] e= / =[ e= | Další/předchozí flycheck error |
| =SPC s p=   | Grep v projektu (ripgrep)         |
| =SPC p f=   | Najít soubor v projektu           |

* Perl — workflow

** Co nainstalovat

#+begin_src bash
brew install perl
cpanm Perl::Tidy Perl::Critic Perl::LanguageServer
#+end_src

** Keybindings

| Zkratka   | Akce                        |
|-----------+-----------------------------|
| =SPC m f= | Formátování přes perltidy   |
| =SPC m r= | Spustit aktuální soubor     |
| =SPC m d= | Spustit Perl debugger       |
| =C-M-a=   | Skok na začátek subroutine  |
| =C-M-e=   | Skok na konec subroutine    |
| =SPC s i= | Imenu — seznam subs         |

** Příklad workflow

1. Otevři soubor: =SPC p f= → vyber =example.pl=
2. Navigace po subs: =SPC s i= → vyber subroutine ze seznamu
3. Pohyb mezi subs: =C-M-a= (začátek), =C-M-e= (konec)
4. Formátování: =SPC m f= (perltidy celý buffer)
5. Spuštění: =SPC m r= — otevře compile buffer s výstupem
6. Debug: =SPC m d= → zadej soubor → v kódu přidej =$DB::single = 1;= pro breakpoint
7. Chyby: =] e= / =[ e= pro navigaci flycheck errors

** Ukázkový soubor

Viz =[[file:../examples/perl/example.pl][examples/perl/example.pl]]= — demonstruje strict/warnings, subroutines, hashe, regex, file I/O a error handling.

* Python — workflow

** Co nainstalovat

#+begin_src bash
brew install python ruff pyright
# Pro virtualenv: použij M-x poetry nebo conda (pyvenv je zastaralé)
#+end_src

** Keybindings

| Zkratka   | Akce                        |
|-----------+-----------------------------|
| =SPC m f= | Formátování přes ruff       |
| =SPC m r= | Spustit aktuální soubor     |
| =gd=      | Go to definition (pyright)  |
| =K=       | Hover docs (LSP)            |
| =SPC s i= | Imenu — seznam tříd/funkcí  |

** Příklad workflow

1. Otevři projekt: =SPC p p= → vyber Python projekt
2. Virtual env: =M-x poetry= nebo =conda-env-activate= → aktivuj prostředí
3. Navigace: =SPC s i= pro přehled tříd a funkcí
4. LSP: =gd= (definice), =K= (docs), =SPC c D= (references)
5. Format: =SPC m f= — ruff format na celý soubor
6. Run: =SPC m r= — spustí =python3 buffer.py= v compile bufferu
7. Debug: =M-x pdb= → zadej =python3 -m pdb soubor.py=
8. Chyby: =] e= / =[ e= pro flycheck (ruff lint)

** Ukázkový soubor

Viz =[[file:../examples/python/example.py][examples/python/example.py]]= — demonstruje type hints, dataclass, list comprehension, argparse a exception handling.

* Go — workflow

** Co nainstalovat

#+begin_src bash
brew install go gopls
go install golang.org/x/tools/cmd/goimports@latest
#+end_src

** Keybindings

| Zkratka   | Akce                         |
|-----------+------------------------------|
| =SPC m f= | Formátování (goimports)      |
| =SPC m r= | go run aktuální soubor       |
| =SPC m t= | go test ./...                |
| =SPC m b= | go build ./...               |
| =gd=      | Go to definition (gopls)     |
| =K=       | Hover docs (gopls)           |

** Příklad workflow

1. Nový projekt: =go mod init myproject= v terminálu
2. Otevři: =SPC p f= → =main.go=
3. LSP automaticky: gopls se spustí, poskytuje completion, diagnostiku, navigaci
4. Píšeš kód: goimports automaticky doplní importy při uložení
5. Run: =SPC m r= → =go run main.go=
6. Test: =SPC m t= → =go test ./...=
7. Build: =SPC m b= → =go build ./...=

** Ukázkový soubor

Viz =[[file:../examples/go/main.go][examples/go/main.go]]= — demonstruje struct, methods, error handling, goroutine a channel.

* Ansible — workflow

** Co nainstalovat

#+begin_src bash
brew install ansible ansible-lint
#+end_src

** Keybindings

| Zkratka   | Akce                          |
|-----------+-------------------------------|
| =SPC m r= | Spustit ansible-playbook      |
| =] e=     | Další ansible-lint chyba      |
| =SPC s p= | Grep v projektu (role, vars)  |

** Příklad workflow

1. Otevři playbook: =SPC p f= → =playbook.yml=
2. Yaml-mode se aktivuje automaticky, ansible-lint přes flycheck
3. Navigace: =SPC s i= pro imenu (task names)
4. Spuštění: =SPC m r= — spustí =ansible-playbook playbook.yml=
5. Lint chyby: =] e= / =[ e= pro navigaci

** Ukázkový soubor

Viz =[[file:../examples/ansible/playbook.yml][examples/ansible/playbook.yml]]= — demonstruje apt install, user create, template copy, handlers a vars.

* Terraform — workflow

** Co nainstalovat

#+begin_src bash
brew install terraform terraform-ls
#+end_src

** Keybindings

| Zkratka   | Akce                    |
|-----------+-------------------------|
| =SPC m f= | terraform fmt           |
| =SPC m i= | terraform init          |
| =SPC m p= | terraform plan          |
| =gd=      | Go to definition (LSP)  |

** Příklad workflow

1. Nový projekt: vytvoř adresář, =main.tf= + =variables.tf=
2. Init: =SPC m i= — stáhne providery
3. LSP (terraform-ls): autocompletion pro resource typy, atributy, variables
4. Format: =SPC m f= — terraform fmt (kanonický styl)
5. Plan: =SPC m p= — ukáže co se změní
6. Apply: v terminálu =terraform apply=

** Ukázkové soubory

Viz =[[file:../examples/terraform/main.tf][examples/terraform/main.tf]]= a =[[file:../examples/terraform/variables.tf][examples/terraform/variables.tf]]= — demonstrují null provider, resource, variable, output a validation.

* Podman / Dockerfile — workflow

** Co nainstalovat

#+begin_src bash
brew install podman hadolint
podman machine init   # jednorázově
podman machine start
#+end_src

** Keybindings

| Zkratka   | Akce                              |
|-----------+-----------------------------------|
| =SPC m b= | podman build (zeptá se na tag)    |
| =SPC m r= | podman run (zeptá se na image)    |
| =] e=     | Další hadolint chyba              |

** Příklad workflow

1. Otevři =Dockerfile=: dockerfile-mode se aktivuje automaticky
2. Hadolint: flycheck ukazuje best practices (DL3008, DL3059 atd.)
3. Build: =SPC m b= → zadej tag (např. =myapp:latest=) → compile buffer
4. Run: =SPC m r= → zadej image name → spustí container

** Ukázkový soubor

Viz =[[file:../examples/docker/Dockerfile][examples/docker/Dockerfile]]= — demonstruje multi-stage build, non-root user, HEALTHCHECK a layer caching.

* Go — učení (začátečník)

** Základní kroky

1. Vytvoř projekt:
   #+begin_src bash
   mkdir myproject && cd myproject
   go mod init myproject
   #+end_src

2. Struktura:
   #+begin_example
   myproject/
   ├── go.mod
   ├── main.go          # vstupní bod
   ├── internal/         # interní balíčky
   │   └── handler.go
   └── pkg/              # veřejné balíčky
       └── utils.go
   #+end_example

3. Spusť: =go run main.go= (nebo =SPC m r= v Emacsu)
4. Test: =go test ./...= (nebo =SPC m t=)
5. Build: =go build -o myapp= (nebo =SPC m b=)

** Klíčové koncepty

- =package main= + =func main()= = vstupní bod
- Error handling: =if err != nil { return err }= (žádné exceptions)
- Goroutines: =go func()= pro souběžnost
- Channels: =ch := make(chan int)= pro komunikaci mezi goroutines
- Interfaces: implicitní implementace (duck typing)

** Příklad

Viz =[[file:../examples/go/main.go][examples/go/main.go]]= pro funkční ukázku všech konceptů.

* Obecné tipy

| Zkratka       | Akce                                    |
|---------------+-----------------------------------------|
| =SPC s p=     | Grep v projektu (ripgrep)               |
| =SPC p f=     | Najít soubor v projektu                 |
| =SPC p p=     | Přepnout projekt                        |
| =SPC g g=     | Magit — git status                      |
| =SPC g B=     | Git blame                               |
| =C-M-a= / =C-M-e= | Pohyb po funkcích (všechny jazyky) |
| =] e= / =[ e=    | Flycheck: další/předchozí error     |
| =SPC c x=     | Flycheck: seznam všech errors           |
| =SPC b b=     | Přepnout buffer                         |
| =SPC w v=     | Vertikální split                        |
| =SPC o t=     | Otevřít terminál (vterm)                |

** Compile buffer

Všechny =SPC m r/t/b= příkazy používají Emacs =compile= — výstup se zobrazí v compile bufferu. Klávesy v compile bufferu:

- =g= — znovu spustit
- =q= — zavřít
- =RET= na error řádku — skok na zdrojový kód
