Como copiar links para fora do modo organizacional?


16

Há muita documentação sobre a inserção ou armazenamento de links de modo organizacional, mas aparentemente não há como copiá-los para buffers em outros formatos.

Como você copia o URL de um link do modo organizacional de um arquivo organizacional para o clipboard / kill ring com o menor número de pressionamentos de tecla possível? Eu tentei org-store-linke org-insert-link, mas despeja toda a sintaxe do modo organizacional em qualquer outro buffer que você abra.

Exemplo: buffer 1 org-mode, buffer 2 Markdown.

  1. Visite o buffer 1, C-sprocure o link.
  2. Magia acontece , URL está na área de transferência
  3. Visite o buffer 2. C-ypara puxar o URL para o buffer.

Respostas:


10

Aqui está uma maneira de alcançar o que você deseja, usando propriedades de texto.

Você pode ir para o link no arquivo organizacional que deseja copiar e executar o comando, my-org-retrieve-url-from-pointque copiará o link organizacional no ponto atual da área de transferência. Antes de adicionar o link à área de transferência, my-yank-org-linké registrado um manipulador de puxões ( ), chamado ao colar o link. O manipulador de arranque verifica se o buffer atual está no modo organizacional ou um modo derivado do modo organizacional; nesse caso, ele insere o link como está (um link organizacional); caso contrário, extrai o URL do link e o insere.

(defun my-yank-org-link (text)
  (if (derived-mode-p 'org-mode)
      (insert text)
    (string-match org-bracket-link-regexp text)
    (insert (substring text (match-beginning 1) (match-end 1)))))

(defun my-org-retrieve-url-from-point ()
  (interactive)
  (let* ((link-info (assoc :link (org-context)))
         (text (when link-info
                 ;; org-context seems to return nil if the current element
                 ;; starts at buffer-start or ends at buffer-end
                 (buffer-substring-no-properties (or (cadr link-info) (point-min))
                                                 (or (caddr link-info) (point-max))))))
    (if (not text)
        (error "Not in org link")
      (add-text-properties 0 (length text) '(yank-handler (my-yank-org-link)) text)
      (kill-new text))))

Aqui está uma versão DWIM de kill-ring-save, que usa kill-ring-savese a região está ativa ou copia o link orgânico no ponto

(defun my-smarter-kill-ring-save ()
  (interactive)
  (if (region-active-p)
      (call-interactively #'kill-ring-save)
    (when (eq major-mode 'org-mode)
      (call-interactively #'my-org-retrieve-url-from-point))))

Nota : No momento, isso não distingue entre um link de URL e links internos.


1
Eu removi o if, porque ao usar a GUI Emacs sempre copiado todo o link ( [[a]][b]]) em vez da parte URL ( a)
Nitz

2

Outra possibilidade: com o cursor no link, execute org-insert-link. Isto é normalmente C-c C-l. Com o modo maligno (ou talvez apenas com Spacemacs) , i ltambém funciona. Isso entra no fluxo de inserção do link com o valor do link pré-preenchido. Você pode fazer M-x evil-yank-lineenquanto o minibuffer possui o conteúdo do endereço do link.


Este método é basicamente o que eu uso, especificamente eu vou C-c C-l M-S-<backspace> C-g.
Omar

Funciona, mas não é tão eficiente.
itirazimvar 8/09/19

2

Atrasado para a festa (e meu primeiro post aqui, a propósito), mas acho que isso pode ser útil para outras pessoas também. A resposta aceita funciona perfeitamente ao puxar o emacs novamente, mas o texto real copiado para a área de transferência do sistema ainda é a sintaxe completa do modo organizacional. Eu queria algo que pudesse copiar um link do org-mode e do emacs. Casos de uso: venho desenvolvendo muitos desenvolvedores da Web ultimamente e frequentemente uso vários navegadores. Apenas um deles pode ser o padrão para o C-c c-oatalho e, às vezes, desejo abrir um link em um não padrão. Além disso, colando links para colegas de trabalho no Slack, etc.

Para encurtar a história, criei esta solução misturando e combinando a resposta aceita :

(defun my-org-export-url ()
  (interactive)
  (let* ((link-info (assoc :link (org-context)))
         (text (when link-info
                 (buffer-substring-no-properties (or (cadr link-info) (point-min))
                                                 (or (caddr link-info) (point-max))))))
    (if (not text)
        (error "Not in org link")
      (string-match org-bracket-link-regexp text)
      (kill-new (substring text (match-beginning 1) (match-end 1))))))

Isso copiará para a área de transferência o link apenas parte de um link de modo organizacional.

De fato, integrei a solução da resposta anterior e essa nova função dentro da minha .emacs, cada uma com sua própria combinação de teclas. Código completo aqui:

(defun my-yank-org-link (text)
  (if (derived-mode-p 'org-mode)
      (insert text)
    (string-match org-bracket-link-regexp text)
    (insert (substring text (match-beginning 1) (match-end 1)))))

(defun my-org-copy-smart-url ()
  (interactive)
  (let* ((link-info (assoc :link (org-context)))
         (text (when link-info
                 (buffer-substring-no-properties (or (cadr link-info) (point-min))
                                                 (or (caddr link-info) (point-max))))))
    (if (not text)
        (error "Not in org link")
      (add-text-properties 0 (length text) '(yank-handler (my-yank-org-link)) text)
      (kill-new text))))
(global-set-key (kbd "C-c c") 'my-org-copy-smart-url)

(defun my-org-export-url ()
  (interactive)
  (let* ((link-info (assoc :link (org-context)))
         (text (when link-info
                 (buffer-substring-no-properties (or (cadr link-info) (point-min))
                                                 (or (caddr link-info) (point-max))))))
    (if (not text)
        (error "Not in org link")
      (string-match org-bracket-link-regexp text)
      (kill-new (substring text (match-beginning 1) (match-end 1))))))
(global-set-key (kbd "C-c e") 'my-org-export-url)

Eu escolhi as combinações de teclas C-c ee C-c cporque são boas mnemônicas para export e copy e não são usadas no modo organizacional. De alguma forma, eles também se encaixam na vinculação C-c C-ode teclas já existente para olinks com caneta.

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.