в org-режимі, як видалити посилання?


11

Як видалити існуюче гіперпосилання без необхідності вбирати вручну та видаляти купу дужок? Коли я намагаюся org-insert-linkі просто видаляю існуюче посилання, я отримую Lisp error: (error "Empty link").

Я хочу видалити посилання та зберегти текст (тобто опис).

Відповіді:


7

Наступна функція elisp буде приймати посилання навколо поточної точки, як її розпізнає org-bracket-link-regexp, тому або [[Link][Description]]або [[Link]], і замінить її Descriptionв першому або Linkв другому випадку.

(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]]формату org посилань. Я дізнався про match-beginningта match-endз вашої відповіді.
Каушал Моді

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][DESCRIPTION]]або [[LINK]]в org-modeбуфері; інакше нічого не станеться.

Для безпеки відмінений LINK з org-посилання зберігається 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)))))))

2

Існує рішення, яке уникає використання спеціального розбору з регулярними виразами та безпосередньо використовує вбудований 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

Здається, це видаляє пробіли після посилання. Будь-яка ідея, як їх утримати?
Тімм

1

Найшвидшим може бути розміщення курсору перед посиланням, а потім наберіть C-M-space( mark-sexp), який позначатиме всю посилання. Потім видаліть його, ввівши зворотну область (якщо ви використовуєте delete-selection-mode) або C-w.


1
Здається, це видаляє все посилання, але я хочу видалити посилання та зберегти текст (тобто опис).
лампа розжарювання

1
Вибачте, мабуть, я неправильно зрозумів ваше запитання.
Харальд Ханш-Олсен

1
Для тих, хто нині жив там: Питання було неоднозначним, коли я відповів на нього. Його відтоді редагували, усуваючи неоднозначність. Я все ж залишаю відповідь, оскільки це все ще здається найпростішим способом видалити все посилання, опис і все.
Харальд Ханш-Олсен

0

Цей дуже швидкий і дуже брудний макрос був би одним із способів, не найкращим способом:

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