Come copiare i collegamenti FUORI dalla modalità organizzazione?


16

C'è molta documentazione sull'inserimento o l'archiviazione di collegamenti in modalità org, ma apparentemente nessuno sulla loro copia su buffer in altri formati.

Come si copia l'URL di un collegamento in modalità org da un file org negli Appunti / kill ring con il minor numero di tasti possibile? Ho provato org-store-linke org-insert-link, ma scarica l'intera sintassi della modalità org in qualunque altro buffer tu abbia aperto.

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

  1. Visita il buffer 1, C-scerca il link.
  2. La magia accade , l'URL è negli appunti
  3. Visita il buffer 2. C-yper trascinare l'URL nel buffer.

Risposte:


10

Ecco un modo per ottenere ciò che desideri, utilizzando le proprietà del testo.

Puoi andare al link nel file org che desideri copiare ed eseguire il comando in my-org-retrieve-url-from-pointquesto modo il link org verrà copiato negli Appunti. Prima di aggiungere il collegamento negli Appunti, my-yank-org-linkviene registrato uno yank-handler ( ) che viene chiamato mentre si incolla il collegamento. Il gestore yank verifica se il buffer corrente è in modalità org o una modalità derivata da modalità org, in tal caso inserisce il collegamento così com'è (un collegamento org), altrimenti estrae l'URL dal collegamento e lo inserisce

(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))))

Ecco una versione DWIM di kill-ring-save, che utilizza kill-ring-savese la regione è attiva o copia il collegamento org al punto

(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 : questo attualmente non distingue tra un collegamento URL e collegamenti interni.


1
Ho rimosso il if, perché quando si utilizza la GUI Emacs ha sempre copiato l'intero link ( [[a]][b]]) invece della parte URL ( a)
Nitz

2

Un'altra possibilità: con il cursore sul collegamento, eseguire org-insert-link. Questo è normalmente C-c C-l. Con la modalità male (o forse solo con Spacemacs) , i lfunziona anche. Ciò entra nel flusso di inserimento del collegamento con il valore del collegamento precompilato. È quindi possibile farlo M-x evil-yank-linementre il minibuffer ha il contenuto dell'indirizzo del collegamento.


Questo metodo è fondamentalmente quello che uso, in particolare vado C-c C-l M-S-<backspace> C-g.
Omar,

Funziona ma non è così efficiente.
itirazimvar,

2

In ritardo alla festa (e il mio primo post qui, comunque), ma penso che questo potrebbe essere utile anche agli altri. La risposta accettata funziona perfettamente quando si strattona nuovamente all'interno di emacs, ma il testo effettivo copiato negli Appunti di sistema è ancora la sintassi completa della modalità org. Volevo qualcosa che potesse copiare un link sia in modalità org che in emacs. Casi d'uso: ultimamente ho fatto molti web dev e spesso utilizzo più browser. Solo uno di essi può essere il predefinito per il C-c c-ocollegamento, e talvolta desidero aprire un collegamento in uno non predefinito. Inoltre, incollando i collegamenti ai colleghi su Slack, eccetera.

Per farla breve, ho trovato questa soluzione mescolando e abbinando la risposta accettata :

(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))))))

Questo copierà negli appunti il ​​collegamento solo una parte di un collegamento in modalità org.

In effetti, ho integrato sia la soluzione della risposta precedente sia questa nuova funzione all'interno della mia .emacs, ognuna con la propria combinazione di tasti. Codice completo qui:

(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)

Ho scelto le combinazioni di tasti C-c ee C-c cperché sono buoni mnemonici per export e copy e non sono utilizzati in modalità org. Si adattano anche in qualche modo al già esistente collegamento a tasti C-c C-oper ocollegamenti a penna.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.