no modo organizacional, como remover um link?


11

Como removo um hiperlink existente sem precisar acessar e excluir manualmente um monte de colchetes? Quando tento org-insert-linke apenas excluo o link existente, recebo Lisp error: (error "Empty link").

Quero remover o link e preservar o texto (ou seja, a descrição).

Respostas:


7

A função elisp a seguir pegará um link em torno do ponto atual como reconhecido por org-bracket-link-regexp, então ou [[Link][Description]]ou [[Link]], e o substituirá por Descriptionno primeiro caso ou Linkno segundo caso.

(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))))

Essa é uma solução compacta muito elegante! Atualizei minha resposta para oferecer suporte a [[LINK]]links de formato organizacional também. Eu aprendi sobre match-beginninge match-endcom a sua resposta.
precisa saber é o seguinte

5

Tentei adicionar isso à resposta de @Andrew, mas era muito longo para um comentário ...

Eu realmente gostei da solução dele, exceto que ela moveu o cursor. (Tecnicamente, acho que mudou a questão. Enfim ...) Felizmente, foi fácil adicionar isso save-excursionpara evitar isso:

(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

Chame esse comando quando o ponto estiver em qualquer lugar após os primeiros [[colchetes de um link organizacional (ou em qualquer lugar no / após um link orgânico hiperligado).

Um link organizacional será excluído se estiver no formato [[LINK][DESCRIPTION]]ou [[LINK]]em um org-modebuffer; senão nada vai acontecer.

Por segurança, o LINK descartado do org-link é salvo kill-ringno caso de surgir a necessidade de usar esse link em outro local.

(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

O mais rápido pode ser colocar o cursor antes do link e digitar C-M-space( mark-sexp), que marcará o link inteiro. Em seguida, exclua-o digitando um backspace (se você usar delete-selection-mode) ou C-w.


1
Isso parece excluir o link inteiro, mas quero remover o link e preservar o texto (ou seja, a descrição).
Incandescentman

1
Desculpe, acho que não entendi sua pergunta.
Harald Hanche-Olsen

1
Para os que rejeitam por aí: a pergunta era ambígua quando eu respondi. Foi editado desde então, removendo a ambiguidade. No entanto, deixo a resposta em aberto, pois ainda parece a maneira mais fácil de excluir todo o link, descrição e tudo.
Harald Hanche-Olsen

1

Existe uma solução que evita o uso de análise personalizada com regexes e usa diretamente a org-elementAPI interna:

(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)))))))

Você pode adicionar como vincular seu comando a uma chave para que seja suficiente para iniciantes?
DoMiNeLa10

Isso parece excluir os espaços em branco após o link. Alguma idéia de como mantê-los?
Timm

0

Essa macro muito rápida e muito suja seria uma maneira, não a melhor:

(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])
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.