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.