組織モードで、リンクを削除するにはどうすればよいですか?


11

大量の括弧を手動で削除せずに既存のハイパーリンクを削除するにはどうすればよいですか?org-insert-link既存のリンクを削除しようとすると、が表示されますLisp error: (error "Empty link")

リンクを削除してテキスト(説明)を保持したい。

回答:


7

次のelisp関数は、によって認識されている現在のポイントの周りのリンクをとるorg-bracket-link-regexpため、[[Link][Description]]またはのいずれかで、最初のケースまたは2番目のケースで[[Link]]それを置き換えます。DescriptionLink

(defun afs/org-replace-link-by-link-description ()
    "Replace an org link by its description or if empty its address"
  (interactive)
  (if (org-in-regexp org-bracket-link-regexp 1)
      (let ((remove (list (match-beginning 0) (match-end 0)))
        (description (if (match-end 3) 
                 (org-match-string-no-properties 3)
                 (org-match-string-no-properties 1))))
    (apply 'delete-region remove)
    (insert description))))

それは非常にきちんとしたコンパクトなソリューションです!回答を更新して、[[LINK]]組織のリンクのフォーマットもサポートしました。私は学びましたmatch-beginningし、match-endあなたの答えから。
Kaushal Modi

5

@Andrewからの回答にこれを追加しようとしましたが、コメントには長すぎました...

カーソルを動かした以外は、私は彼の解決策を本当に気に入りました。(技術的にはポイントが動いたと思います。とにかく...)幸い、それsave-excursionを避けるために簡単に追加できました:

(defun afs/org-replace-link-by-link-description ()
  "Replace an org link by its description or if empty its address"
  (interactive)
  (if (org-in-regexp org-bracket-link-regexp 1)
      (save-excursion
        (let ((remove (list (match-beginning 0) (match-end 0)))
              (description (if (match-end 3) 
                               (org-match-string-no-properties 3)
                             (org-match-string-no-properties 1))))
          (apply 'delete-region remove)
          (insert description)))))

4

ポイントが[[org-linkの最初の角括弧の後(またはハイパーリンクされたorg-linkの後/後)にあるときに、このコマンドを呼び出します。

組織リンクがフォーマット[[LINK][DESCRIPTION]]またはバッファ[[LINK]]内にある場合は削除されorg-modeます。そうでなければ何も起こりません。

安全のために、org-linkから破棄されたLINK kill-ringは、他の場所でそのリンクを使用する必要が生じた場合にに保存されます。

(defun my/org-delete-link ()
  "Replace an org link of the format [[LINK][DESCRIPTION]] with DESCRIPTION.
If the link is of the format [[LINK]], delete the whole org link.

In both the cases, save the LINK to the kill-ring.

Execute this command while the point is on or after the hyper-linked org link."
  (interactive)
  (when (derived-mode-p 'org-mode)
    (let ((search-invisible t) start end)
      (save-excursion
        (when (re-search-backward "\\[\\[" nil :noerror)
          (when (re-search-forward "\\[\\[\\(.*?\\)\\(\\]\\[.*?\\)*\\]\\]" nil :noerror)
            (setq start (match-beginning 0))
            (setq end   (match-end 0))
            (kill-new (match-string-no-properties 1)) ; Save the link to kill-ring
            (replace-regexp "\\[\\[.*?\\(\\]\\[\\(.*?\\)\\)*\\]\\]" "\\2" nil start end)))))))

1

リンクの前にカーソルを置いてからC-M-spacemark-sexp)を入力すると、リンク全体がマークされます。次に、バックスペース(を使用する場合delete-selection-mode)またはを入力して削除しますC-w


1
これはリンク全体を削除するようですが、リンクを削除してテキスト(つまり、説明)を保持します。
白熱症者

1
すみません、あなたの質問を誤解したようです。
Harald Hanche-Olsen 2015

1
そこの反対投票者へ:私がそれに答えたとき、質問は曖昧でした。それ以降は編集され、あいまいさを取り除いています。ただし、リンク全体、説明、およびすべてを削除するのが最も簡単な方法であると思われるため、答えはそのままにしておきます。
Harald Hanche-Olsen 2015

1

正規表現によるカスタム解析の使用を回避し、組み込みorg-elementAPI を直接使用するソリューションがあります。

(defun org-link-delete-link ()
  "Remove the link part of an org-mode link at point and keep
only the description"
  (interactive)
  (let ((elem (org-element-context)))
    (if (eq (car elem) 'link)
        (let* ((content-begin (org-element-property :contents-begin elem))
               (content-end  (org-element-property :contents-end elem))
               (link-begin (org-element-property :begin elem))
               (link-end (org-element-property :end elem)))
          (if (and content-begin content-end)
              (let ((content (buffer-substring-no-properties content-begin content-end)))
                (delete-region link-begin link-end)
                (insert content)))))))

コマンドをキーにバインドする方法を追加して、初心者にとって十分なようにすることはできますか?
DoMiNeLa10

これは、リンクの後の空白を削除するようです。それらを維持する方法はありますか?
ティム

0

この非常に速くて汚いマクロは、最善の方法ではなく、1つの方法です。

(fset 'my/org-remove-link
   [?\M-a delete delete ?\M-x ?z ?a ?p ?- ?t ?o ?- ?c ?h ?a ?r return ?\[ ?\C-e backspace backspace ?\C-x])
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.