2014-01-13 6 views
1

내 .emacs 파일에 다음 코드를 입력하여 원하지 않는 공백을 강조 표시했습니다.이맥스 : 2 줄 이상의 빈 줄을 강조 표시합니다.

(require 'whitespace) 
(setq whitespace-style '(face empty tabs lines-tail trailing)) 
(global-whitespace-mode t) 

이 쇼 (1) 버퍼 (2)의 탭 (3) 80 문자 제한을 초과 (4) 후단 공백 라인

I의 시작 & 끝에 빈 행 이맥스가 자동으로 '2 개 이상의 빈 줄'을 강조 표시하려고합니다. 이것을 구현하는 방법에 대한 아이디어가 있습니까? 내가 blog post regexp의 도움으로 이렇게하는 방법을 설명했지만,이 .emacs 파일에서 이것을 구현하는 방법을 잘 모르겠습니다.

편집 1 : 여분의 빈 줄을 삭제하는 방법을 찾았지만 여전히 여러 빈 줄을 자동으로 강조 표시하는 데 도움이되지 않습니다. delete extra blank lines in emacs

편집 2 : .emacs에 다음을 추가하면 작동하지만, 버퍼에 파일을 저장하고 다시 여는 경우에만 가능합니다.

(add-hook 'change-major-mode-hook '(lambda() (highlight-regexp "\\(^\\s-*$\\)\n" 'hi-yellow))) 

편집 3 : 바로 편집 2의 라인 전에 파일을 이맥스에 (global-hi-lock-mode 1)를 추가 한 후, 버퍼 내에서 1 개 이상의 빈 라인을 강조하는 것 같다. regexp를 수정하는 방법을 모르므로 2 개 이상의 빈 줄만 받아 들일 것입니다.

+1

'공백을보십시오.el' -'empty'는 파일의 끝에있는 줄과 파일의 시작 부분을 처리하는'공백 스타일 '입니다. 다음을 참고하십시오. "공백 스타일에 공백이 포함될 때 사용됩니다."공백 스타일에 공백이 포함될 때 사용됩니다. ": type '(regexp : 태그"빈 끝에 버퍼 끝 ") : group'공백)'. 하나 이상의 함수를 수정해야 할 수도 있습니다 (예 :'whitespace-empty-at-eob-regexp'). – lawlist

+0

@lawlist 감사합니다! 나는 lisp에 익숙하지 않지만 (일주일 전에 이맥스를 사용하기 시작했다.) 필자가 제안한 파일을 보게 될 것이다. 귀하의 답변에 대해 –

답변

2

귀하의 highlight-regexp 해결책은 다음 elisp (예 : .emacs 파일)을 사용하여 보조 모드로 만들 수 있습니다.

모드 - 라인에서 모드 이름 중 하나를 마우스 오른쪽 버튼으로 클릭 한 다음 nl2-mode을 선택하여 마이너 모드를 활성화 할 수 있습니다. 모드 행에서 nl2을 클릭하고 Turn off minor mode을 선택하여 부 모드를 비활성화 할 수 있습니다.

코드가 define-minor-modedefine-key 도움말을 참조 이해 (예를 들어, C-H F define-minor-mode RET). emacs에서도 메뉴의 마우스 클릭은 키 스트로크로 간주됩니다.

(define-minor-mode nl2-mode 
    "Highlight two successive newlines." 
    :global t 
    :lighter " nl2" 
    (if nl2-mode 
     (highlight-regexp "\\(^\\s-*$\\)\n" 'hi-yellow) 
    (unhighlight-regexp "\\(^\\s-*$\\)\n"))) 

(define-key mode-line-mode-menu [nl2-mode] 
    `(menu-item ,(purecopy "nl2-mode") nl2-mode 
    :help "Highlight two succesive newlines." 
    :button (:toggle . (bound-and-true-p nl2-mode)))) 

만들 몇 가지 사실이 있습니다 더 복잡 강조하는 두 개의 연속 빈 라인 (font-lock 만, 줄 바꿈 버퍼 변경이 필요할 후이 지역이 다시 fontification-fontify을 다시하기 위해 한계는 비 빈 영역을 강조하는 경향이있다). 다음 코드는 한 가지 방법을 보여줍니다. 어쩌면, 더 쉬운 방법이 있습니다.

(require 'font-lock) 
(global-font-lock-mode) 

(defface jit-lock-nl2-face '((default :background "yellow")) 
    "Face to indicate two or more successive newlines." 
    :group 'jit-lock) 

(defun jit-nl2-extend (start end &optional old) 
    "Extend region to be re-fontified" 
    (save-excursion 
    (save-match-data 
     ;; trailing: 
     (goto-char end) 
     (skip-chars-forward "[[:blank:]]\n") 
     (setq jit-lock-end (point)) 
     ;; leading: 
     (goto-char start) 
     (beginning-of-line) 
     (skip-chars-backward "[[:blank:]]\n") 
     (unless (bolp) (forward-line)) 
     (setq jit-lock-start (point))))) 

(defun jit-nl2 (jit-lock-start jit-lock-end) 
    "Highlight two or more successive newlines." 
    (save-excursion 
    (save-match-data 
     (jit-nl2-extend jit-lock-start jit-lock-end) 
     ;; cleanup 
     (remove-text-properties jit-lock-start jit-lock-end '(font-lock-face jit-lock-nl2-face)) 
     ;; highlight 
     (while (< (point) jit-lock-end) 
    (if (looking-at "[[:blank:]]*\n\\([[:blank:]]*\n\\)+") 
     (progn (put-text-property (match-beginning 0) (match-end 0) 'font-lock-face 'jit-lock-nl2-face) 
      (goto-char (match-end 0))) 
     (forward-line)))))) 


(add-hook 'after-change-major-mode-hook (lambda() 
         (add-hook 'jit-lock-after-change-extend-region-functions 'jit-nl2-extend) 
         (jit-lock-register 'jit-nl2) 
         (jit-lock-mode 1) 
        )) 
+0

감사합니다. .emacs에 다음 코드를 입력했는데 제대로 작동하는 것 같습니다. \\ (^ \\ s - * $ \\)'(global-hi-lock-mode 1)' '(add-hook 'change-major-mode-hook'(lambda (highlight-regexp " \ n " 'hi-yellow)))'. 유일한 문제는 단일 빈 줄을 강조 표시한다는 것입니다. 내가 편집중인 코드 내에 2 개 이상의 빈 줄을 강조 표시하고 싶습니다. –

+1

나는 그 문제가'jit-lock' ('font-lock'의 working-horse)이 이미 한 줄 바꿈 후에 글꼴 화된다는 점에 있다고 생각합니다. 그래서 항상 하나의 라인 브레이크 만 보았고 정규 표현식을 확장하는 것은 올바른 방법이 아닙니다. 편집 후에 다시 폰트 화 된 부분은 너무 작습니다. 그러나, 다른 방법이 있습니다 ... 나는 여유 시간이있을 때 시도 할 것입니다. – Tobias

+0

감사! 귀하의 솔루션을 기대합니다. –

1

그냥 라이브러리 Highlight (highlight.el)를 사용합니다. 그것이 바로 그 때문입니다.

hlt-highlight-regexp-region (C-x X h x) 또는 hlt-highlight-regexp-to-end (C-x X h e) 명령을 사용하십시오. (하는 정규 표현식을 unhighlight C-x X u x 또는 C-x X u e을 사용합니다.)

대화식으로, 당신이 입력 정규 표현식은 (개행 문자, 더블 백 슬래시에 대한 필요에 맞게 C-q C-j와) 이맥스에서 평소 사용하는, 당신이 \(^\s-*$\) C-q C-j를 입력 할 수 있도록.

+0

당신의 제안에 감사드립니다. 그러나 이것을 .emacs 파일에 추가하는 방법을 찾고있었습니다. 내가 틀렸다면 나를 정정하십시오. 그러나 빈 줄을 강조 표시 할 때마다 명령을 명시 적으로 입력 할 때만 제안 된 방법이 작동합니다. –

+1

아니요,'highlight.el '의 함수를 대화식으로 사용할 필요는 없습니다. Lisp 코드에서 사용할 수 있습니다. 이것은 모든 Emacs 명령 BTW에 해당합니다 (그래도 일부 명령은 Lisp 코드에서 덜 유용합니다). 어쨌든 문제 없습니다. 코드에서 함수를 사용할 수 있습니다. 나는 항상 그렇게한다. – Drew

+0

그 설명에 감사드립니다. –