в орг-режиме как удалить ссылку?

11

Как удалить существующую гиперссылку, не добавляя и не удаляя несколько скобок вручную? Когда я пытаюсь org-insert-linkпросто удалить существующую ссылку, я получаю Lisp error: (error "Empty link").

Я хочу удалить ссылку и сохранить текст (т.е. описание).

incandescentman
источник

Ответы:

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-ссылки (или в любом месте на / после гиперссылки org-link).

Ссылка на организацию будет удалена, если она имеет формат [[LINK][DESCRIPTION]]или находится [[LINK]]в org-modeбуфере; иначе ничего не случится.

В целях безопасности отбрасываемая ССЫЛКА от org-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-space( mark-sexp), который пометит всю ссылку. Затем удалите его, набрав Backspace (если вы используете delete-selection-mode) или C-w.

Харальд Ханче-Олсен
источник
1
Это, кажется, удаляет всю ссылку, но я хочу удалить ссылку и сохранить текст (то есть описание).
Лампа накаливания
1
Извините, наверное, я неправильно понял ваш вопрос.
Харальд Ханче-Олсен
1
Для даунвотеров там: вопрос был неоднозначным, когда я ответил на него. Это было отредактировано с тех пор, удаляя неоднозначность. Я оставляю ответ, хотя, так как это все еще кажется самым простым способом удалить всю ссылку, описание и все.
Харальд Ханче-Олсен
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)))))))
user22270
источник
Можете ли вы добавить, как привязать вашу команду к клавише, чтобы ее было достаточно для новичков?
DoMiNeLa10
Это похоже на удаление пробелов после ссылки. Есть идеи, как их сохранить?
Тим
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])
Брайан З
источник