조직 모드에서 링크를 제거하는 방법?


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]]형식 조직 링크도 지원하도록 답변을 업데이트했습니다 . 나는에 대해 알게 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-space( mark-sexp) 를 입력 하면 전체 링크가 표시됩니다. 그런 다음 백 스페이스 (사용하는 경우 delete-selection-mode) 또는 을 입력하여 삭제하십시오 C-w.


1
이것은 전체 링크를 삭제하는 것처럼 보이지만 링크를 제거하고 텍스트 (예 : 설명)를 유지하고 싶습니다.
incandescentman

1
죄송합니다. 귀하의 질문을 오해 한 것 같습니다.
Harald Hanche-Olsen

1
downvoters 밖으로 : 내가 대답했을 때 질문은 모호했다. 그 이후로 모호성을 제거하여 편집되었습니다. 그래도 전체 링크, 설명 및 모두를 삭제하는 가장 쉬운 방법 인 것처럼 보이기 때문에 대답을 남겨 두십시오.
Harald Hanche-Olsen

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

이 매우 빠르고 더러운 매크로는 가장 좋은 방법이 아닌 한 가지 방법입니다.

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