Як скопіювати посилання ВІД орга-режиму?


16

Існує велика кількість документації про вставку або зберігання org-mode-посилань, але, мабуть, жодна інформація про копіювання їх у буфери в інші формати.

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

Приклад: буфер 1 орга-режим, буфер 2 Відмітка.

  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-mode, якщо так, він вставляє посилання таким, яким він є (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, оскільки при використанні GUI Emacs завжди копіював усе посилання ( [[a]][b]]) замість частини URL ( a)
Nitz,

3

Інша можливість: за допомогою курсору по посиланню виконайте org-insert-link. Це нормально C-c C-l. Злий режим (а може просто і з Spacemacs) , i lтакож працює. Це вводить потік вставки посилання із попередньо заповненим значенням посилання. Потім ви можете зробитиM-x evil-yank-line поки мінібуфер містить вміст адреси посилання.


Цей метод в основному те, що я використовую, конкретно я йду C-c C-l M-S-<backspace> C-g.
Омар

Це працює, але не настільки ефективно.
itirazimvar

2

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

Коротше кажучи, я придумав це рішення, змішуючи та узгоджуючи прийняту відповідь :

(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 та copy, і вони не використовуються в org-режимі. Вони так чи інакше вписуються у вже існуючу палітурку клавіш C-c C-oдля oперенаправлення посилань.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.