emacs에서 SE의 마크 다운 풍미를 어떻게 사용합니까?


17

emacs에 SE 마크 다운 마크 다운을 사용하고 싶습니다. 기본 마크 다운 모드에는 몇 가지 기능 (백틱 및 들여 쓰기 마크 코드, #헤더 작성 및 >글꼴 변경)이 있지만 다음과 같은 기능도 있습니다.

  • * 들여 쓰기를 포함한 목록 항목을 만들 수 있습니다.
  • [foo](http://example.com)클릭하면 foo 로 표시되고 브라우저가 열립니다 http://example.com.

이상적으로는 마크 맥으로 렌더링되어 이맥에 표시되기를 원합니다. 예를 들어, 내가 쓰려고한다면 :

## Header

* item 1
* item 2

         while true; do echo foo; done

End of list and more code

    while true; do echo bar; done

 See [here](http://example.com) for details

emacs 자체에서 다음과 같이 렌더링하고 싶습니다.


머리글

  • 항목 1
  • 항목 2

    while true; do echo foo; done
    

목록 끝 및 더 많은 코드

while true; do echo bar; done

자세한 내용은 여기 를 참조 하십시오


이것이 가능합니까? 그렇다면 어떻게됩니까?


렌더링되는 코드 블록 정보 : 마크 다운 모드가 이미 코드 블록을 강조 표시하지 않습니까? 거기에서 무엇을 찾고 있었습니까?
Malabarba

또한 WYSIWYG Markdown 편집기와 같이 편집 가능하도록 하시겠습니까? 아니면 "컴파일 된"출력을 별도의 버퍼에 표시하기에 충분합니까? 후자는 오히려 단순하고 전자는 코딩 거대하다.
Malabarba

@ Malabarba, 예, 코드는 괜찮습니다. 내가 원하는 것은 i) 자동 들여 쓰기 목록 ii) URL 처리입니다. 어느를 통해 xdg-open또는 클릭하지만 경우에도 단순히 대상 주소를 표시하는 링크 텍스트하지 않을 때 : "클릭 여기 이 될" Click [here](http://example.com)클릭 할 때. 텍스트 문서에 URL을 매끄럽게 포함시키는 빠른 방법입니다.
terdon

그러면 font-lock-add-keyword를 사용하여 두 가지를 모두 달성 할 수 있습니다. 아무도 나를 이길 수 없다면 내일 무언가를 쓰려고 노력할 것입니다.
Malabarba

답변:


19

** 편집 : **이 글을 쓴 이후로 기능의 일부가 마크 다운 모드에서 직접 구현 된 것 같습니다. 이 주석 과 그 링크를 확인하십시오 .


구성

취할 수있는 두 가지 방법이 있습니다.

  1. 쉘 다운 명령을 사용하여 마크 다운 코드를 컴파일하고 버퍼에 HTML을 표시하는 명령을 작성할 수 있습니다.
  2. 버퍼를 렌더링 된 마크 다운처럼 보이 도록 일부 사용자 지정을 a-la org-mode로 만들 수 있습니다.

여기에 2 번을 구현하는 방법을 설명합니다. 아래 코드를 모두 init 파일에 복사하십시오.

글꼴 잠금 규칙 추가

이 변수는 목록의 모양을 제어합니다. 목록을 들여 쓰기에 약간의 공간을 추가하고 예쁜 글 머리 기호를 사용합니다 (글꼴이 표시 할 수있는 경우).

(defvar endless/bullet-appearance
  (propertize (if (char-displayable-p ?•) "  •" "  *")
              'face 'markdown-list-face)
  "String to be displayed as the bullet of markdown list items.")

실제로 규칙을 추가하는 명령입니다. 리스트와 링크를위한 하나가 있습니다.

(require 'rx)
(defvar endless/markdown-link-regexp
    "\\[\\(?1:[^]]+\\)]\\(?:(\\(?2:[^)]+\\))\\|\\[\\(?3:[^]]+\\)]\\)"
  "Regexp matching a markdown link.")

(font-lock-add-keywords
 'markdown-mode
 '(("^ *\\(\\*\\|\\+\\|-\\|\\) "
    1 `(face nil display ,endless/bullet-appearance) prepend)
   (endless/markdown-link-regexp
    1 '(face nil display "") prepend))
 'append)

링크를 편집 가능하게 만들기

display속성을 사용하여 링크의 일부를 숨기므로 링크의 일부를 삭제할 때마다 해당 속성을 지우도록 글꼴 잠금에 알려야합니다 (그러면 여전히 편집 할 수 있음).

(add-hook 'markdown-mode-hook #'endless/markdown-font-lock)

(defun endless/markdown-font-lock ()
  "Configure aggressive font-locking of `markdown-mode'."
  (define-key markdown-mode-map "\C-c\C-l" #'endless/markdown-insert-link)
  (add-to-list (make-local-variable 'font-lock-extra-managed-props) 'display))

C-c C-lorg-mode 에서처럼 , 바인드 된 명령을 쉽게 편집 할 수 있습니다 .

(defun endless/markdown-insert-link ()
  "Insert or edit link at point."
  (interactive)
  (if (or (looking-at endless/markdown-link-regexp)
          (and (ignore-errors (backward-up-list) t)
               (or (looking-at endless/markdown-link-regexp)
                   (and (forward-sexp -1)
                        (looking-at endless/markdown-link-regexp)))))
      (let ((data (endless/ask-for-link
                   (match-string-no-properties 1) 
                   (or (match-string-no-properties 2)
                       (match-string-no-properties 3)))))
        (if (match-string-no-properties 2)
            (replace-match (cdr data) :fixedcase :literal nil 2)
          (replace-match (cdr data) :fixedcase :literal nil 3))
        (replace-match (car data) :fixedcase :literal nil 1))
    (let ((data (endless/ask-for-link)))
      (insert "[" (car data) "](" (cdr data) ")"))))

(defun endless/ask-for-link (&optional name link)
  (cons (read-string "Text of the link: " name)
        (read-string "URL of the link: " link)))

(선택 사항) 일부면 구성

그것은 당신이 요청한 포인트에 충분해야합니다. 당신은 당신의 버퍼가보고 싶은 경우 더욱 SE 인하, 통화처럼

M-x customize-group RET markdown-faces

적합하다고 생각되는 것을 바꾸십시오. 나는 나 자신을 구성했고 여기에 내가 얻은 것이 있습니다.

(custom-set-faces
 '(markdown-header-face-1 ((t (:inherit markdown-header-face :height 2.0))))
 '(markdown-header-face-2 ((t (:inherit markdown-header-face :height 1.7))))
 '(markdown-header-face-3 ((t (:inherit markdown-header-face :height 1.4))))
 '(markdown-header-face-4 ((t (:inherit markdown-header-face :height 1.1))))
 '(markdown-inline-code-face ((t (:inherit font-lock-constant-face :background "gainsboro"))))
 '(markdown-link-face ((t (:inherit link))))
 '(markdown-pre-face ((t (:inherit font-lock-constant-face :background "gainsboro")))))

결과

다음은 처음 두 가지 구성 세트 후에 얻을 수있는 것입니다.
여기에 이미지 설명을 입력하십시오

얼굴을 구성한 후에 얻을 수있는 내용은 다음과 같습니다. 이것이 더 나아 보이는지 논쟁의 여지가 있습니다. 나는 개인적으로 위의 것을 고수 할 것입니다.
여기에 이미지 설명을 입력하십시오


와! 고마워요. 거의 완벽합니다. 이것은 내가 요청한 모든 것에 대답하지만 여분의 브라우니 포인트를 위해 링크를보다 대화식으로 만드는 방법이 있습니까? URL을 추출하는 쉬운 방법입니다. 이 사이를 전환 할 수 있을까 [foo]하고 [foo](http://bar.com)클릭하여? 세부 사항에 너무 신경 쓰지 않았지만 원하는 경우 URL을 쉽게 표시하는 방법을 원합니다. 현재 괄호 중 하나를 삭제해야합니다. 나는 그걸로 살 수 있지만 더 나은 방법에 관심이 있습니다.
terdon

@terdon Done! ..
Malabarba

이것을 Edit with Emacs 와 결합 하여 Tri-State Area를 인수합니다!
nispio

@ Malabarba 거기에 오류가있는 것 같습니다. 내가 얻을 "Unknown rx form 그룹이-N ' " . Output of --debug-init` 여기 .? 어떤 아이디어
terdon

@terdon 그룹 -n은 24.4에만 정의되어 있습니다. 확인하려고합니다. 각각을 group-n X just로 바꾸어 볼 수 있습니다 group. 그 힘의 여전히 작동합니다.
Malabarba

5

시작하기에 좋은 곳 markdown-mode.el여기 에서 다운로드 할 수 있습니다 .

이 모드는 org-mode스타일 미화를 제공하지 않지만 구문 강조 및 customize옵션 을 제공합니다.

이 스타일의 미화를 얻으려면 누군가 글꼴 글꼴을 구현하는 markdown-mode.el에 대한 확장을 작성해야합니다.

  • org-mode.el의 얼굴은 대부분 org-faces.el에 정의되어 있습니다.

  • 또한 org-mode가 텍스트를 문자로 시각적으로 바꾸는 방법을 살펴보고 싶을 것입니다. 이 코드는 org-entities.el에 있습니다. 라텍스 \pm를 ±로 바꾸는 코드입니다 .


고마워, 나는 대답에서 언급했듯이 현재 마크 다운 모드를 사용하고 있습니다. 누락 된 기능을 구현하는 방법과 emacs가 렌더링 된 것으로 표시하는 방법을 알고 싶습니다. 또는 그 경우 렌더링 된 것을 표시하는 것이 불가능하다는 것을 알고 싶습니다.
terdon

그렇게 할 수 있습니다. org-mode는 구문 미화를 수행합니다. 코드를 찾기 위해 잠시 시간을 내주십시오. 다른 주요 모드에 대해 비슷한 코딩을 수행했습니다. markdown.el에 대해 이미 알고 있다는 사실을 몰랐습니다.
nixeagle

원하는 것을 시작하는 방법을 제공하기 위해 답변을 편집했습니다. 집에 도착하면 정확히 원하는 코드를 만들 수 있습니다. 그대로 org-mode는 제목을 수정하여 *표시 수준 을 숨기고 문서의 위치에 따라 제목의 크기를 변경합니다. 또한 링크를 예쁘게 형식화 할 수 있습니다.
nixeagle
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.