Как скопировать ссылки из орг-режима?

16

Существует множество документов по вставке или хранению ссылок на режим org-mode, но, по-видимому, нет документации по их копированию в буферы других форматов

Как скопировать URL ссылки org-mode из файла org в буфер обмена / список уничтожений с минимальным количеством нажатий клавиш? Я пробовал org-store-linkи org-insert-link, но он сбрасывает весь синтаксис режима оргстекла в любой другой открытый буфер.

Пример: буфер 1 org-mode, буфер 2 Markdown.

  1. Посетите буфер 1, C-sнайдите ссылку.
  2. Волшебство случается , URL находится в буфере обмена
  3. Посетите буфер 2., C-yчтобы вытащить URL в буфер.
яркая звезда
источник

Ответы:

10

Вот один из способов достижения того, что вы хотите, используя свойства текста.

Вы можете перейти по ссылке в файле org, которую хотите скопировать, и выполнить команду, my-org-retrieve-url-from-pointкоторая скопирует ссылку org в текущей точке в буфер обмена. Перед добавлением ссылки в буфер обмена my-yank-org-linkрегистрируется yank-handler ( ), который вызывается при вставке ссылки. Обработчик yank проверяет, находится ли текущий буфер в режиме org или в режиме, полученном из режима org, если это так, он вставляет ссылку как есть (ссылка org), в противном случае он извлекает URL из ссылки и вставляет его

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

Вот версия DWIM kill-ring-save, которая использует, kill-ring-saveесли регион активен или копирует org-ссылку в точке

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

Примечание . В настоящее время не проводится различие между URL-ссылкой и внутренними ссылками.

Икбал Ансари
источник
1
Я удалил if, потому что при использовании Emacs с графическим интерфейсом он всегда копировал всю ссылку ( [[a]][b]]) вместо части URL ( a)
Nitz
3

Другая возможность: с курсором на ссылке выполнить org-insert-link. Это нормально C-c C-l. С режимом зла (или, может быть, просто с Spacemacs) , i lтакже работает. Это входит в поток вставки ссылки с предварительно заполненным значением ссылки. Вы можете сделать это, M-x evil-yank-lineпока в минибуфере есть содержимое адреса ссылки.

mowwwalker
источник
Этот метод в основном то, что я использую, особенно я иду C-c C-l M-S-<backspace> C-g.
Омар
Это работает, но не так эффективно.
Итиразимвар
2

Поздно к вечеринке (и, кстати, мой первый пост здесь), но я думаю, что это может быть полезно и другим. Принятый ответ отлично работает при повторном извлечении внутри emacs, но фактический текст, скопированный в системный буфер обмена, по-прежнему имеет полный синтаксис режима орг. Я хотел что-то, что могло бы скопировать ссылку из org-mode и emacs. Примеры использования: в последнее время я много занимался веб-разработкой и часто использую несколько браузеров. Только один из них может быть по умолчанию для C-c c-oярлыка, и иногда я хочу открыть ссылку не по умолчанию. Кроме того, вставка ссылок на сотрудников в Slack, и так далее.

Короче говоря, я придумал это решение, смешав и сопоставив принятый ответ :

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

Это скопирует в буфер обмена ссылку только часть ссылки в режиме орг.

На самом деле, я интегрировал как решение предыдущего ответа, так и эту новую функцию в моем .emacs , каждая со своей привязкой клавиш. Полный код здесь:

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

Я выбрал C-c eи C-c cкомбинации клавиш , потому что они являются хорошими Мнемоника для eXPort и cпировать , и они не используются в орг-режиме. Они также как-то сочетаются с уже существующей связкой клавиш C-c C-oдля написания oссылок.

ggrocca
источник