Uma interface de pesquisa para arquivos no modo organizacional

7

Eu uso o modo organizacional para fazer anotações. Atualmente, tenho um diretório raiz, digamos "Notas", e existem vários subdiretórios dentro dele, por exemplo, "Linux", "Programação" etc. As anotações feitas no modo org são armazenadas nesses subdiretórios.

Fiquei me perguntando se existe um conjunto de configurações disponíveis para que eu possa pesquisar essas notas (que são todos os arquivos do modo organizacional) muito rapidamente. Eu sei que é hábil , mas não foi projetado para arquivos de modo organizacional. Na verdade, eu também tentei leme-projétil, mas está longe de ser satisfatório.

Para ser mais preciso, o que eu quero alcançar é que eu posso pesquisar esses arquivos usando tags, títulos ou outros recursos relacionados ao modo organizacional, talvez usando algumas sintaxes predefinidas. E, se possível, eu preferiria algo como leme. Se não houver tal extensão, valerá a pena implementá-la? Eu pensei que deft + helm-projectile pode ser um bom ponto de partida.

UPDATE: Tentei os dois métodos, variáveis ​​de diretório local (como @itsjeyd sugere na resposta) e comandos org-agenda-custom-command, e achei que o último parecia mais conveniente. Então, aqui está a minha configuração:

(setq org-agenda-custom-commands
  '(("n" . "Search in notes")
    ("nt" "Note tags search" tags ""
     ((org-agenda-files (file-expand-wildcards "path/to/Notes/*/*.org")))) 
    ("ns" "Note full text search" search ""
     ((org-agenda-files (file-expand-wildcards "path/to/Notes/*/*.org"))))))
cutejumper
fonte
Você já tentou ?: M-x org-search-viewAqui está o link para a documentação: orgmode.org/manual/Search-view.html
lawlist
Depois, você pode configurar o Deft para usar arquivos organizacionais por padrão com (setq deft-extension "org")e (setq deft-text-mode 'org-mode).
mutbuerger
@ mutbuerger As configurações são as que eu uso atualmente. Mas a própria Deft não tem nenhuma função de pesquisa org-relacionado
cutejumper

Respostas:

7

A própria organização fornece um recurso para filtrar / pesquisar informações armazenadas em .orgarquivos de várias maneiras. É chamado de "Agenda" . O org-modemanual fornece informações abrangentes sobre como usá-lo (verifique o link acima ou faça isso C-h i m Org Mode RETno Emacs e navegue até o capítulo "Vistas da agenda"), para que não faça sentido repetir todas essas informações aqui. O texto introdutório do manual resume o que você pode fazer com ele (grifo meu):

A organização pode selecionar itens com base em vários critérios e exibi-los em um buffer separado. São fornecidos sete tipos diferentes de vistas:

  • uma agenda que é como um calendário e mostra informações para datas específicas,
  • uma lista TODO que abrange todos os itens de ação inacabados,
  • uma visualização de correspondência, títulos de exibição com base nas tags, propriedades e estado TODO associados a eles,
  • uma exibição da linha do tempo que mostra todos os eventos em um único arquivo organizacional, na exibição ordenada por tempo,
  • uma exibição de pesquisa de texto que mostra todas as entradas de vários arquivos que contêm palavras-chave especificadas ,
  • uma exibição de projetos bloqueados mostrando projetos que atualmente não se movem e
  • visualizações personalizadas que são pesquisas especiais e combinações de visualizações diferentes.

A única coisa que você precisa fazer para começar a usar a agenda para pesquisar suas anotações é adicionar os arquivos que deseja pesquisar org-agenda-files:

As informações a serem mostradas são normalmente coletadas de todos os arquivos da agenda, os arquivos listados na variável org-agenda-files. Se um diretório fizer parte desta lista, todos os arquivos com a extensão .orgnesse diretório farão parte da lista.

Portanto, no seu caso, você deseja adicionar algo assim ao seu arquivo init:

(setq org-agenda-files '("/path/to/Notes/Linux" "/path/to/Notes/Programming"))

Para muitos exemplos e conselhos práticos, também recomendo que você consulte o artigo sobre Pesquisa avançada no Worg .

[UPDATE] Limitando a pesquisa a conjuntos de arquivos específicos

Conforme mencionado nos comentários, o OP deseja restringir as pesquisas a conjuntos específicos de arquivos. Em termos técnicos, isso significa definir org-agenda-filesvalores diferentes, dependendo do contexto. Isso pode ser alcançado usando variáveis ​​locais do diretório :

A maneira usual de definir variáveis ​​locais do diretório é colocar um arquivo nomeado .dir-locals.elem um diretório. Sempre que o Emacs visitar qualquer arquivo nesse diretório ou em qualquer um de seus subdiretórios, aplicará as variáveis ​​locais de diretório especificadas em .dir-locals.el, [...].

Por exemplo, digamos que

  • ao visitar os arquivos armazenados, Notes/Linuxvocê deseja usar a agenda para pesquisar apenas os .orgarquivos armazenados Notes/Linux.

  • ao visitar os arquivos armazenados Notes/Programming, você deseja usar a agenda para pesquisar apenas os .orgarquivos armazenados Notes/Programming.

Aqui está o que fazer para habilitar esse comportamento:

  1. Adicione um .dir-locals.elarquivo com o seguinte conteúdo a ambos Notes/Linuxe Notes/Programming:

    ((nil . ((org-agenda-files . (".")))))

    Isso define a lista de org-agenda-filespara incluir todos os arquivos no diretório atual.

  2. Adicione o seguinte código ao seu arquivo init:

    (add-hook 'org-agenda-mode-hook #'hack-dir-local-variables-non-file-buffer)

    Esta etapa é necessária para garantir que *Org Agenda*(um buffer que não seja de arquivo ) respeite as configurações locais do diretório org-agenda-files.

Da próxima vez que você visitar um arquivo armazenado em Notes/Linuxou Notes/Programming, o Emacs perguntará se você deseja aplicar as configurações armazenadas .dir-locals.el. Pressione !para dizer ao Emacs para aplicar as configurações e marcá-las como seguras para sessões futuras (você não será solicitado a fornecer novamente arquivos no mesmo diretório).

itsjeyd
fonte
Talvez eu não tenha indicado claramente na pergunta ... Eu usei a agenda, mas o problema é que tenho outros arquivos organizacionais mostrando minhas agendas e TODOs para a minha agenda e não quero que minhas anotações atrapalhem a agenda. Visão. Talvez o que eu queira seja algo como a função de pesquisa no Evernote, pois quero usar o Emacs como meu aplicativo de anotações. Você conhece Deft? Ele tem uma boa interface de pesquisa, mas não está relacionado a uma organização
cutejumper 14/03
@cutejumper Não tenho certeza se sigo. O que você quer dizer com "estragar a exibição da agenda"? Se as manchetes em seu Linux / Programação / etc. as anotações não têm TODOestados associados a elas, elas não devem aparecer na sua agenda quando você lista seus itens do TODO.
itsjeyd
Bem, desta maneira pode ser mais claro: eu realmente quero ter conjuntos separados de arquivos da agenda. Meu entendimento da agenda do modo organizacional atual é que ele se parece mais com um conjunto "global", enquanto eu quero uma interface de pesquisa para um certo "projeto" (como um projétil), de modo que, quando faço a pesquisa, vejo apenas o conteúdo relevante em um "projeto". Eu negligencio alguma funcionalidade que a agenda realmente oferece?
cutejumper
Você pode definir localmente org-agenda-filesapenas os arquivos (ou diretório) de seu interesse em um modelo de agenda ou usar C-c a <para restringir a pesquisa de agenda apenas ao arquivo atual.
erikstokes
11
@cutejumper Não acho que o buffer da agenda suporte esse caso de uso imediatamente. No entanto, o comando @BrianZ menciona em sua resposta ( helm-org-agenda-files-headings) faz exatamente o que você deseja (para os títulos). Observe que você precisará configurar variáveis ​​locais do diretório para possibilitar a execução helm-org-agenda-files-headingsem conjuntos de arquivos específicos.
itsjeyd
2

Existem algumas funções relacionadas à organização no leme. Eu acho que helm-org-agenda-files-headingsé basicamente o que você tem em mente. Se ainda não estiver disponível para você no emacs, tente remover o helm-org.el do Github .

Brian Z
fonte