Jak skopiować linki poza trybem org?

16

Istnieje wiele dokumentacji na temat wstawiania lub przechowywania linków w trybie org, ale najwyraźniej nie ma ich na temat kopiowania ich do buforów w innych formatach.

Jak skopiować adres URL linku trybu org z pliku org do schowka / pierścienia zabijania za pomocą jak najmniejszej liczby naciśnięć klawiszy? Próbowałem org-store-linki org-insert-link, ale zrzuca całą składnię trybu org do dowolnego innego bufora, który masz otwarty.

Przykład: bufor 1 tryb org, bufor 2 Markdown.

  1. Odwiedź bufor 1, C-swyszukaj link.
  2. Magia się dzieje , URL jest w schowku
  3. Przejdź do bufora 2., C-yaby przeciągnąć URL do bufora.
Jasna gwiazda
źródło

Odpowiedzi:

10

Oto jeden ze sposobów osiągnięcia tego, co chcesz, za pomocą właściwości tekstu.

Możesz przejść do łącza w pliku org, który chcesz skopiować, i wykonać polecenie, my-org-retrieve-url-from-pointktóre skopiuje łącze org w bieżącym punkcie do schowka. Przed dodaniem łącza do schowka my-yank-org-linkrejestrowany jest moduł yank-handler ( ), który jest wywoływany podczas wklejania łącza. Moduł obsługi yank sprawdza, czy bieżący bufor znajduje się w trybie org, czy w trybie pochodnym z trybu org, jeśli tak, wstawia link taki, jaki jest (link org), w przeciwnym razie wyodrębnia adres URL z linku i wstawia go

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

Oto wersja DWIM kill-ring-save, która używa, kill-ring-savejeśli region jest aktywny lub kopiuje łącze org w punkcie

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

Uwaga : obecnie nie rozróżnia to linku URL i linków wewnętrznych.

Iqbal Ansari
źródło
1
Usunąłem if, ponieważ podczas korzystania z GUI Emacs zawsze kopiował cały link ( [[a]][b]]) zamiast części URL ( a)
Nitz 1'15
3

Inna możliwość: z kursorem na łączu uruchom org-insert-link. Tak jest normalnie C-c C-l. Z trybem zła (a może tylko z Spacemacs) , i ldziała również. Wprowadza to przepływ wstawiania łącza ze wstępnie wypełnioną wartością łącza. Możesz to zrobić, M-x evil-yank-linegdy minibufor ma zawartość adresu łącza.

mowwwalker
źródło
Ta metoda jest w zasadzie tym, czego używam, a konkretnie idę C-c C-l M-S-<backspace> C-g.
Omar
Działa, ale nie tak wydajnie.
itirazimvar
2

Późno na imprezę (a przy okazji mój pierwszy post tutaj), ale myślę, że może to być przydatne również dla innych. Akceptowana odpowiedź działa idealnie, gdy ponownie szarpniesz wewnątrz emacsa, ale tekst skopiowany do schowka systemowego jest nadal pełną składnią trybu org. Chciałem czegoś, co mogłoby skopiować link zarówno z trybu org, jak i emacsa. Przypadki użycia: Ostatnio robiłem dużo web dev i często używam wielu przeglądarek. Tylko jeden z nich może być domyślnym C-c c-oskrótem, a czasami chcę otworzyć link w innym niż domyślny. Wklejanie linków do współpracowników na Slacku i tak dalej.

Krótko mówiąc, wymyśliłem to rozwiązanie, mieszając i dopasowując przyjętą odpowiedź :

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

Spowoduje to skopiowanie do schowka łącza tylko części łącza w trybie organizacji.

W rzeczywistości zintegrowałem w sobie zarówno rozwiązanie z poprzedniej odpowiedzi, jak i tę nową funkcję .emacs, każde z własnym skrótem klawiszowym. Pełny kod tutaj:

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

Wybrałem skróty klawiszowe C-c ei, C-c cponieważ są dobrym mnemonikiem dla export i copy i nie są używane w trybie org. W jakiś sposób pasują również do już istniejącego skrótu klawiszowego C-c C-odla olinków pening.

ggrocca
źródło