1

.emacs ファイルに次のコードを入力して、不要な空白を強調表示しました。

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

これは、(1) バッファの先頭と末尾にある空の行 (2) タブ (3) 80 文字の制限を超える行 (4) 末尾の空白を示しています

emacs が「2 つ以上の空行」を自動的に強調表示するようにしたいと思います。これを実装する方法についてのアイデアはありますか? 正規表現の助けを借りてこれを行う方法を説明するブログ投稿を見つけましたが、これを .emacs ファイルに実装する方法がわかりません。

編集 1:余分な空白行を削除する方法を見つけましたが、これでも複数の空白行を自動的に強調表示するのには役立ちません。emacs で余分な空白行を削除する

編集 2: .emacs に以下を追加するとうまくいくようですが、バッファにファイルを保存して再度開いた後でのみです。

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

編集 3:(global-hi-lock-mode 1)編集 2 の行の直前に .emacs ファイルに追加した後、バッファー内の 1 つ以上の空の行が強調表示されているようです。正規表現を変更して、2 つ以上の空行のみを受け入れるようにする方法がわかりません。

4

2 に答える 2

2

-solutionhighlight-regexpは、次の elisp (たとえば、.emacsファイル内) を使用してマイナー モードにすることができます。

モードラインのモード名の 1 つを右クリックし、[ ] を選択すると、マイナー モードを有効にできますnl2-modenl2モードラインで をクリックして を選択すると、マイナーモードを無効にすることができます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))))

2 つの連続する空行の強調表示をより複雑にするいくつかの事実があります (font-lock空でない領域のみを強調表示する傾向があり、改行は領域の再フォント化の制限であり、バッファー変更後の再フォント化が必要です)。次のコードは、1 つの方法を示しています。たぶん、もっと簡単な方法があります。

(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)
                      ))
于 2014-01-13T21:54:02.593 に答える