org-refile para um local fixo conhecido


11

Estou tentando escrever uma função que pegue um cabeçalho e refile-o para um local específico. O documento para org-refileé

(org-refile &optional GOTO DEFAULT-BUFFER RFLOC MSG)

e RFLOCé

RFLOC can be a refile location obtained in a different way.

mas não tenho idéia do que seria uma "maneira diferente" e estou pesquisando no Google por meio dia e não vejo nenhum exemplo. Conheço o arquivo e o título do destino, mas não conheço a sintaxe para transformá-lo no que ele deseja. O mais próximo que cheguei é:

(org-refile nil #("~/Org/bookmarks.org")

o que me solicitará a manchete, mas é claro que não quero que ela me solicite, quero fornecê-la.

Eu sou novo no elisp e adivinhei todas as sintaxes em que consigo pensar. Alguém sabe como expressar isso?


Deve haver uma maneira de fazer o que você realmente quer aqui, mas se você não encontrá-lo, aqui está uma solução alternativa: stackoverflow.com/questions/7681326/...
Brian Z

Eu uso o seguinte snippet para fazer o que você está procurando: (let* ( (org-archive-location "/path/to/org-file::* NAME_OF_HEADING") (org-archive-save-context-info nil)) (org-archive-subtree)) provavelmente não colocarei isso em uma resposta desde que você perguntou org-refile, mas o snippet faz o trabalho muito bem. Os dois pontos são necessários. Eu uso isso o tempo todo e até criei uma versão personalizada org-archive-subtreepara suprimir a mensagem para que eu não tenha centenas delas quando reorganizo automaticamente meu arquivo organizacional inteiro.
lawlist

Obrigado, lawlist, este é um bom trecho e provavelmente o usarei em outro contexto. É bom tê-lo documentado aqui.
jtgd

Respostas:


9

Eu me perguntei como deveria ser o RFLOC antes, mas nunca investiguei. Observando o código-fonte da organização, ele deve ser uma lista que consiste em:

  • posição
  • Arquivo
  • re (expressão regular)
  • pos (posição do cabeçalho alvo)

Eu não experimentei o reelemento, mas aqui está uma função simples que será org-refilechamada com um RFLOC construído a partir de um determinado FILE e HEADING:

(defun my/refile (file headline)
  (let ((pos (save-excursion
               (find-file file)
               (org-find-exact-headline-in-buffer headline))))
    (org-refile nil nil (list headline file nil pos))))

Isso abre o arquivo de destino e usa uma função organizacional para encontrar a posição do título de destino e cria a lista RFLOC para a qual passar org-refile.


5

Muito obrigado @glucas, trabalhei sua solução na minha final. A principal informação era conhecer o formato do RFLOC. Eu experimentei fornecer uma lista de nome de arquivo e texto do título, mas estava faltando esses outros elementos e o valor extra. Foi assim que acabei:

(defun jay/refile-to (file headline)
    "Move current headline to specified location"
    (let ((pos (save-excursion
                 (find-file file)
                 (org-find-exact-headline-in-buffer headline))))
      (org-refile nil nil (list headline file nil pos))))

(defun jay/refile-to-bookmarks ()
    "Move current headline to bookmarks"
    (interactive)
    (org-mark-ring-push)
    (jay/refile-to "~/Org/bookmarks.org" "New")
    (org-mark-ring-goto))

O documento para save-excursionafirma que retornaremos ao local em que começamos, mas não parece funcionar dessa maneira. Isso me deixa no destino de destino, o que pode ser adequado para o general refile-to, mas eu queria que ele movesse a linha e permanecesse onde estava, para salvar e restaurar refile-to-bookmark.

O fluxo de trabalho para o qual isso se destina é que eu começo com uma lista de links HTML que vêm do meu script para ler feeds RSS. Originalmente, tive o script para produzir arquivos maildir para o mu4e, mas me vi seguindo os links para um navegador de qualquer maneira e depois marquei os de interesse, então agora apenas gero uma lista de ** [[uri][title]]linhas. Depois de seguir o link do emacs para o navegador uzbl, em vez de marcar (que gera a mesma forma de linhas), uso esse comando para mover o link para meu bookmarks.org após definir as tags. Um pouco mais rápido, pois também uso os comandos org speed, tpara marcar e bpara este comando. Estou feliz agora e adoro aprender mais elisp!


Alguns detalhes, não diretamente relevantes para o que você está fazendo aqui: o primeiro elemento do RFLOC pode realmente ser qualquer string. Ele está sendo usado apenas como um nome lógico para o local de destino, mostrado na mensagem "refiled to xxx". A localização é realmente apenas definida pelo marcador de arquivo e posição. O reelemento do RFLOC será ignorado, até onde eu sei. É usado em algumas outras funções no org.el que lidam com locais de destino.
glucas

1
Por razões que não compreendo, eu era capaz de obter a sua refile-tofunção para retorno à posição original, adicionando isso no final, após o let: (switch-to-buffer (current-buffer)). Parece que não deveria fazer nada, mas funciona para mim.
glucas

Mais uma vez obrigado @glucas. Sim, isso parece funcionar e eu substituí o meu -pushe -gotopor isso. Parece estranho que você permaneça em outro buffer e, no entanto, ele considera o buffer atual como o anterior.
jtgd
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.