組織モードからリンクをコピーする方法は?


16

org-mode-linksの挿入または保存に関するドキュメントはたくさんありますが、明らかに他の形式のバッファにコピーすることについては何もありません。

org-mode-linkのURLを、できるだけ少ないキーストロークで組織ファイルからクリップボード/キルリングにコピーするにはどうすればよいですか?私が試したorg-store-linkorg-insert-link、それはあなたが開いている他のどんなバッファに、全組織・モードの構文をダンプします。

例:バッファー1組織モード、バッファー2マークダウン。

  1. バッファ1にC-sアクセスし、リンクを検索します。
  2. マジックが起こり、URLはクリップボードにあります
  3. バッファー2 C-yにアクセスして、URLをバッファーにヤンクします。

回答:


10

テキストプロパティを使用して、目的を達成する1つの方法を次に示します。

コピーする組織ファイル内のリンクに移動してコマンドを実行すると、 my-org-retrieve-url-from-point現在のポイントの組織リンクがクリップボードにコピーされます。リンクをクリップボードに追加する前に、リンクのmy-yank-org-link貼り付け中に呼び出されるyank-handler()が登録されます。yank-handlerは、現在のバッファーがorg-modeであるかorg-modeから派生したモードであるかをチェックし、そうである場合はリンクをそのまま挿入します(org-link)、そうでない場合はリンクから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リージョンがアクティブかどうかを使用するか、ポイントで組織リンクをコピーします

(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
私は削除ifGUIのEmacsを使用しているとき、それは常にリンク全体を(コピーされたので、[[a]][b]]代わりにURLの一部(の)a
NITZ

2

別の可能性:リンクにカーソルを合わせて、を実行し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 emacsの両方からリンクをコピーできるものが欲しかった。使用例:最近、多くのWeb開発を行ってきましたが、複数のブラウザーをよく使用します。そのうちの1つだけが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))))))

これにより、組織モードリンクの一部のみのリンクがクリップボードにコピーされます。

実際、以前の回答のソリューションとこの新しい関数の両方をmy内に統合し.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 eC-c cキーバインドを選択しました。これらはexportとcopyのニーモニックであり、org-modeでは使用されないためです。また、リンクC-c C-ooペニングするための既存のキーバインドにも何らかの形で適合します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.