Todolist no vim
Tags: vim, productivity
Published: 2020-10-17 22:31:01

Explicações sobre meu "fluxo de todolist" com vim

Objetivos:

- [Fácil de ver e atualizar (pouco "burocrático")](#facilidade)
- [Ser simples e intuitivo de lembrar e manter](#simplicidade)
- [Agrupar tarefas semelhantes (projetos)](#escopo)
- [Possuir checkbox e listas](#listas)

## Facilidade

- Todas tarefas que não foram concluídas ficam em um arquivo `BACKLOG` (concluídas em outro `DONE`)
- Cada linha que possui **TODO** é uma tarefa por fazer
- Cada linha que possui **WAIT** é uma tarefa delegada ou pausada
- Demais linhas não são importantes
- A listagem é criada com `:lvimgrep` buscando por `\C\<TODO\>` e/ou `\C\<WAIT\>` e exibida com `:lli`, não necessitando abrir o arquivo de tarefas

![demonstração](https://dev-to-uploads.s3.amazonaws.com/i/8qvpgjx80024wo4wpq92.gif)
> Visualizar *todolist* com `:lli` e selecionar se for preciso com `:ll <numero>`

## Simplicidade

- Comandos:
    - `:TodoList` abstrai o `:lvimgrep` e de bônus formata `module` e `pattern` do `:lli`
    - `:TodoListFileBacklog` e `:TodoListFileDone` acessar os arquivos com as tarefas
    - `<leader>o` lista os comandos anteriores e outros futuros que podem ser criados
- Para mudar status de uma tarefa (**TODO** e **WAIT**) basta apagar a palavra na linha (possui *highlight*)
- Uma tarefa é concluída saindo do arquivo de backlog

![demonstração](https://dev-to-uploads.s3.amazonaws.com/i/9wod4p6vjp0yicbza9a8.gif) 
> Gerar a lista `TODO` a partir do texto **TODO** ou **WAIT** inserido em linhas do arquivo com `:lvimgrep`

> Ignore `- [ ]` pois é uma implementação antiga de checkbox, durante o post explico melhor

![demonstração](https://dev-to-uploads.s3.amazonaws.com/i/jtcnu2jbgogmhdoqelmq.gif)
> Remover da *todolist* apagando **TODO** ou **WAIT**

![demonstração](https://dev-to-uploads.s3.amazonaws.com/i/2w7exvpbrjwd6aqrzgz1.gif)
> Possuir arquivos `BACKLOG` e `DONE` e acessar facilmente os mesmos

## Escopo

- `BACKLOG` possui *fold* no primeiro nível de indentação, permitindo separação simples de projeto (não subprojetos). Ex.:

```txt
projeto 1
    Projeto XYZ

    = fazer x
    = fazer y
    = fazer z

projeto 2
    Projeto ABC

    = fazer a
    = fazer b
    = fazer c
```

![demonstração](https://dev-to-uploads.s3.amazonaws.com/i/ea1e9gqfodbqfdbz3a22.gif)
> Concluir itens de escopo com checkbox e conceal

## Listas

- `BACKLOG` possui *syntax* com uso de **conceal**
  - `-` converte para um *bullet* comum
  - `=` converte para um checkbox desmarcado
  - `+` converte para um checkbox marcado
- Por que `-`, `=` e `+`?
  - `-` igual ao markdown
  - `=` e `+` *conceal* de 1 carácter é mais agradável que `- [ ]` ou `- [x]` pois é mais fácil de entender o tamanho da linha.

  > Quando se edita uma linha com carácter escondido ele pode reaparecer quando 1) passa o cursor na linha ou 2) entra no modo *insert* na linha. É mais agradável evitar o efeito do "texto se expandido", pois o *conceal* (que sempre é 1 carácter) se transforma em outro carácter

- `<C-SPACE>` (<kbd>crl</kbd><kbd>space</kbd>) marca ou desmarca checkbox. Caso não exista um, é criado desmarcado

## Consequências não planejadas

- Para manter a listagem `:lli` simples, tanto o projeto quanto o item devem ser objetivos

## Código

- [Configurações globais](https://github.com/nenitf/dotfiles/blob/778022c7d6797745aa2a537930753f2c05660301/vim/dotfiles.vim#L49)
- [Configurações de syntax](https://github.com/nenitf/dotfiles/blob/778022c7d6797745aa2a537930753f2c05660301/vim/syntax/todolist.vim)
- [Configurações específicas de TODO e DONE](https://github.com/nenitf/dotfiles/blob/778022c7d6797745aa2a537930753f2c05660301/vim/ftplugin/todolist.vim)