Obter o link organizacional para inserir a descrição do link automaticamente?


11

P: Como posso obter uma orgfunção de link personalizado para inserir uma descrição automaticamente?

Gostaria de armazenar orglinks para arquivos em um diredbuffer, mas preferiria que a descrição do link fosse o nome do arquivo sem o caminho, em vez de informar o caminho completo, ou seja:

file:~/the/full/path/myfile.ext     ; default, but no thanks
myfile.ext                          ; what I want

Agora: org-store-linkcodifica os links diretamente diredpara fornecer o padrão. Em vez disso, escrevi uma função personalizada (usando a função codificada) e a adicionei a org-store-link-functions:

(defun dired-store-link ()
  (when (derived-mode-p 'dired-mode)
    (let ((file (dired-get-filename nil t)))
      (setf file (if file
                     (abbreviate-file-name (expand-file-name file))
                   default-directory))
      (org-store-link-props :type        "dired"
                            :link        file
                            :description (file-name-nondirectory file))
      file)))

(add-to-list 'org-store-link-functions #'dired-store-link)

Até aí tudo bem, e funciona como esperado, mas por um lado:

  • Ao chamar org-insert-linkcom o comportamento padrão interno, ele simplesmente insere o link sem solicitar uma descrição.
  • Ao chamar org-insert-linkcom minha função personalizada, ele solicita que eu insira uma descrição (que é preenchida corretamente com o nome do arquivo armazenado na :descriptionpropriedade).

Prefiro não ser solicitada a descrição a cada vez e quero org-insert-linkusar o valor :descriptionque a função personalizada define.

Como posso convencer org-insert-linka usar o :descriptionautomaticamente sem me solicitar?


Os argumentos opcionais link-locationou default-descriptionna função org-insert-linkajudam algum? Se o parâmetro LINK-LOCATION for nulo, esse valor será usado como o local do link em vez de ler um de forma interativa. Se o parâmetro DEFAULT-DESCRIPTION for nulo, esse valor será usado como a descrição padrão.
lawlist

@lawlist: obrigado pela sugestão, embora eu não tenha certeza de como o definiria em uso interativo sem envolvê-lo em outra função. No entanto, isso me fez ler a doutrina mais de perto, o que me levou a uma espécie de resposta.
Dan

Respostas:


4

Enterrado na parte inferior da doutrina, org-insert-linkhá uma observação de que:

Se org-make-link-description-functionnão for nulo, essa função será chamada com o destino do link e o resultado será a descrição padrão do link.

Aparentemente, orgjoga fora muitas informações no processo de armazenamento de um link, então tudo o que resta org-stored-linksé uma lista de entradas do formulário (link description). Na medida em que a função anterior possui um nome de arquivo para o link, ela se parece com o seguinte:

(defun org-link-describe (link desc)
  (if (file-exists-p link)
      desc
    (read-string "Description: " desc)))

(setf org-make-link-description-function #'org-link-describe)

É meio hacky, e eu não o testei extensivamente, mas parece funcionar até agora. Ficaria emocionado ao ver uma solução mais elegante, é claro.


2
Agora que você conhece essa função, não pode abandonar dired-store-linke apenas usar isso para criar a descrição que deseja? Eu acho que isso acabaria muito mais curto.
Malabarba

1
@ Malabarba: você provavelmente está certo - essa função pode ser reescrita para inspecionar o link de um arquivo e prosseguir em conformidade. Vou experimentar quando tiver um momento livre.
Dan

3

Estou usando a org 9.1.6 e, para meu desespero, parece que org-store-link-functionsagora é uma função organizacional incorporada (em vez de um gancho), portanto a solução original não funciona mais. Pode haver uma solução alternativa usando org-link-parameters, mas em vez disso, estou usando o seguinte pequeno truque, que parece fazer o truque:

(defun my//dired-store-link (orig-fun &rest args)
  (if (derived-mode-p 'dired-mode)
      (let ((file (dired-get-filename nil t)))
        (setf file (if file
                       (abbreviate-file-name (expand-file-name file))
                     default-directory))
        (let ((link (concat "file:" file))
              (desc (file-name-nondirectory file)))
          (push (list link desc) org-stored-links)
          (car org-stored-links)))
    (apply orig-fun args)))
(advice-add 'org-store-link :around #'my//dired-store-link)

Como bônus, isso não solicita uma descrição, pois a descrição enviada para org-stored-linksé nula.

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.