조직 모드에서 링크를 복사하는 방법은 무엇입니까?


16

org-mode-links 삽입 또는 저장에 관한 많은 문서가 있지만 분명히 다른 형식의 버퍼에 복사하는 것에 대한 문서는 없습니다.

키 입력을 최소화하면서 조직 파일의 조직 모드 링크 URL을 클립 보드 / 킬 링에 어떻게 복사합니까? 나는 시도 org-store-link하고 org-insert-link, 그러나 당신이 열려있는 다른 어떤 버퍼에 전체 조직 모드 구문을 덤프합니다.

예 : 버퍼 1 조직 모드, 버퍼 2 마크 다운

  1. 버퍼 1을 방문 C-s하여 링크를 검색하십시오.
  2. 매직이 발생합니다 . URL이 클립 보드에 있습니다.
  3. 버퍼 2 C-y를 방문 하여 URL을 버퍼에 넣습니다.

답변:


10

텍스트 속성을 사용하여 원하는 것을 달성하는 한 가지 방법이 있습니다.

복사하려는 조직 파일의 링크로 이동하여 my-org-retrieve-url-from-point현재 지점의 조직 링크를 클립 보드에 복사하는 명령을 실행합니다 . 링크를 클립 보드에 추가하기 전에 링크를 my-yank-org-link붙여 넣을 때 호출되는 yank-handler ( )가 등록됩니다. yank-handler는 현재 버퍼가 org-mode 또는 org-mode에서 파생 된 모드인지 확인하여 링크를있는 그대로 (org-link) 삽입하고 그렇지 않으면 링크에서 URL을 추출하여 삽입합니다.

(defun my-yank-org-link (text)
  (if (derived-mode-p 'org-mode)
      (insert text)
    (string-match org-bracket-link-regexp text)
    (insert (substring text (match-beginning 1) (match-end 1)))))

(defun my-org-retrieve-url-from-point ()
  (interactive)
  (let* ((link-info (assoc :link (org-context)))
         (text (when link-info
                 ;; org-context seems to return nil if the current element
                 ;; starts at buffer-start or ends at buffer-end
                 (buffer-substring-no-properties (or (cadr link-info) (point-min))
                                                 (or (caddr link-info) (point-max))))))
    (if (not text)
        (error "Not in org link")
      (add-text-properties 0 (length text) '(yank-handler (my-yank-org-link)) text)
      (kill-new text))))

다음은 DWIM 버전입니다 kill-ring-save. kill-ring-save영역이 활성화되어 있거나 org-link를 복사 한 경우

(defun my-smarter-kill-ring-save ()
  (interactive)
  (if (region-active-p)
      (call-interactively #'kill-ring-save)
    (when (eq major-mode 'org-mode)
      (call-interactively #'my-org-retrieve-url-from-point))))

참고 : 현재 URL 링크와 내부 링크를 구분하지 않습니다.


1
나는 제거 ifGUI를 이맥스를 사용할 때 항상 전체 링크 (복사 있기 때문에, [[a]][b]]대신 URL 부분의) ( a)
NITZ

3

다른 가능성 : 링크에 커서를두고를 실행하십시오 org-insert-link. 이것은 일반적으로 C-c C-l입니다. 사악한 모드 (또는 아마도 Spacemacs와 함께) , i l도 작동합니다. 이는 링크 값이 미리 채워진 링크 삽입 플로우로 들어갑니다. 그런 다음 M-x evil-yank-line미니 버퍼에 링크 주소의 내용이있는 동안 수행 할 수 있습니다 .


이 방법은 기본적으로 내가 사용하는 방법입니다 C-c C-l M-S-<backspace> C-g.
Omar

작동하지만 그렇게 효율적이지 않습니다.
itirazimvar

2

파티에 늦게 (그리고 여기의 첫 번째 게시물), 이것이 다른 사람들에게도 유용 할 것이라고 생각합니다. 허용 된 답변은 emacs 내부에서 다시 king을 때 완벽하게 작동하지만 시스템 클립 보드에 복사 된 실제 텍스트는 여전히 전체 조직 모드 구문입니다. 나는 org-mode emacs 에서 링크를 복사 할 수있는 것을 원했습니다 . 사용 사례 : 최근에 많은 웹 개발을 해왔으며 종종 여러 브라우저를 사용합니다. 그중 하나만 C-c c-o바로 가기 의 기본값이 될 수 있으며 때로는 기본이 아닌 링크로 링크를 열고 싶습니다. 또한 Slack 등의 동료와의 링크를 붙여 넣습니다.

간단히 말해서, 나는 받아 들여진 대답 을 혼합하고 일치 시켜이 솔루션을 생각해 냈습니다 .

(defun my-org-export-url ()
  (interactive)
  (let* ((link-info (assoc :link (org-context)))
         (text (when link-info
                 (buffer-substring-no-properties (or (cadr link-info) (point-min))
                                                 (or (caddr link-info) (point-max))))))
    (if (not text)
        (error "Not in org link")
      (string-match org-bracket-link-regexp text)
      (kill-new (substring text (match-beginning 1) (match-end 1))))))

이렇게하면 조직 모드 링크의 일부만 링크를 클립 보드에 복사합니다.

사실, 나는 이전 답변의 솔루션 과이 새로운 기능을 모두 내 .emacs자신의 키 바인딩으로 my 안에 통합 했습니다. 전체 코드는 다음과 같습니다.

(defun my-yank-org-link (text)
  (if (derived-mode-p 'org-mode)
      (insert text)
    (string-match org-bracket-link-regexp text)
    (insert (substring text (match-beginning 1) (match-end 1)))))

(defun my-org-copy-smart-url ()
  (interactive)
  (let* ((link-info (assoc :link (org-context)))
         (text (when link-info
                 (buffer-substring-no-properties (or (cadr link-info) (point-min))
                                                 (or (caddr link-info) (point-max))))))
    (if (not text)
        (error "Not in org link")
      (add-text-properties 0 (length text) '(yank-handler (my-yank-org-link)) text)
      (kill-new text))))
(global-set-key (kbd "C-c c") 'my-org-copy-smart-url)

(defun my-org-export-url ()
  (interactive)
  (let* ((link-info (assoc :link (org-context)))
         (text (when link-info
                 (buffer-substring-no-properties (or (cadr link-info) (point-min))
                                                 (or (caddr link-info) (point-max))))))
    (if (not text)
        (error "Not in org link")
      (string-match org-bracket-link-regexp text)
      (kill-new (substring text (match-beginning 1) (match-end 1))))))
(global-set-key (kbd "C-c e") 'my-org-export-url)

xport와 opy에 대한 좋은 니모닉 이고 org-mode에서는 사용되지 않기 때문에 C-c eand C-c c키 바인딩을 선택했습니다 . 또한 펜싱 링크에 대한 기존 키 바인딩과 어쨌든 맞습니다 .ecC-c C-oo

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.