2014-01-13 3 views
1

Я ввел следующий код в мой файл .emacs, чтобы выделить нежелательные пробелы.Emacs: выделить 2 или более пустых строк

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

Это показывает (1) пустые строки в начале & конце буфера (2) вкладки (3) линии, которые выходят за предел 80 символов (4) замыкающие пробельные

I хотел бы emacs автоматически выделить «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))) 

Edit 3: После добавления (global-hi-lock-mode 1) в .emacs файл непосредственно перед строкой в ​​Edit 2, кажется, чтобы выделить 1 или более пустых строк в буфере. Я не уверен, как изменить регулярное выражение так, чтобы оно принимало только две или более пустых строк.

+1

Посмотрите на 'whitespace.el' - 'empty' - это' whitespace-style', который имеет дело с строками в конце файла, а также в начале файла - см. также следующее, которое должно быть адаптировано к вашим потребностям: ' (defcustom whitespace-empty-at-eob-regexp "^ \\ ([\ t \ n] + \\)" "Укажите регулярное выражение для пустых строк в конце буфера. Используется, когда« стиль пробелов »включает в себя« пустой ». ": type '(regexp: tag" Empty Lines At End Buffer "): пробел группы" '. Возможно, потребуется изменить одну или несколько функций, например, функцию 'whitespace-empty-at-eob-regexp'. – lawlist

+0

@lawlist Спасибо! Я не очень хорошо разбираюсь в lisp (начал использовать emacs неделю назад), но я обязательно посмотрю на файл, который вы предложили. –

ответ

2

Ваш highlight-regexp -solution может быть сделан в второстепенном режиме со следующим elisp (например, в вашем файле .emacs).

Вы можете активировать второстепенный режим, щелкнув правой кнопкой мыши на одном из имен режимов в строке режима, а затем выбрав nl2-mode. Вы можете деактивировать второстепенный режим, нажав на nl2 в строке режима и выбрав Turn off minor mode.

Чтобы понять код смотрите справку по define-minor-mode и define-key (например, С-H Fdefine-minor-modeRET). Обратите внимание, что в 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, как правило, только выделить непустые регионы, разрывы строк пределов для региона перераспределяет раскрасить, повторную подсветку не делаются после изменения буфера требуется). Следующий код показывает один из способов. Может быть, есть более простые способы.

(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 и, похоже, работает хорошо. '(global-hi-lock-mode 1)' '(add-hook 'change-major-mode-hook' (lambda() (highlight-regexp " \\ (^ \\ s - * $ \\) \ n "'привет-желтый)))'. Единственная проблема заключается в том, что он выделяет одиночные пустые строки. Я хочу выделить 2 или более пустых строк, если они присутствуют в коде, который я редактирую. –

+1

Я думаю, что проблема в том, что 'jit-lock' (рабочая лошадка' font-lock') уже выделяется после разрыва строки. Таким образом, он всегда видит только одну линию и расширение регулярного выражения - это не правильный путь. Часть буфера, который повторно редактируется после редактирования, слишком мала. Но есть и другие способы ... Я постараюсь, когда у меня будет свободное время. – Tobias

+0

Спасибо! Будем рады вашему решению. –

1

Просто используйте библиотеку Highlight (highlight.el). Вот для чего это. (C-x X h x) или hlt-highlight-regexp-to-end (C-x X h e). (Для снятия выделения регулярное выражение, используйте C-x X u x или C-x X u e.)

интерактивно, вы вводите регулярное выражение, чтобы использовать, как обычно, в Emacs (с C-q C-j, чтобы соответствовать символу новой строки, и нет необходимости в два раза подряд), так что вы типа \(^\s-*$\) C-q C-j.

+0

Спасибо за ваше предложение, но я искал способ добавить это в файл .emacs. Исправьте меня, если я ошибаюсь, но ваш предложенный способ будет работать, только когда я буду явно вводить эти команды каждый раз, когда я хочу, чтобы эти пустые строки были выделены. –

+1

Нет, вам не нужно использовать функции в 'highlight.el' в интерактивном режиме. Вы можете использовать их так же хорошо, как и ваш код Lisp. Это относится ко всем командам Emacs, BTW (хотя да, некоторые команды менее полезны в коде Lisp). Во всяком случае, никаких проблем - вы можете просто использовать функции в коде. Я делаю это все время. – Drew

+0

Спасибо за это объяснение. –

 Смежные вопросы

  • Нет связанных вопросов^_^