Как я могу заставить emacs выделять строки длиной более 80 символов?

#emacs

#emacs

Вопрос:

Я знаю, что есть решения, позволяющие заставить emacs отображать столбец в 80 строк, но я не хочу такого рода визуальных помех. Я бы просто хотел, чтобы он выделял строку, если в ней более 80 символов.

Комментарии:

1. > Я знаю, что есть решения Для тех, кто не знает, например emacswiki.org/emacs/FillColumnIndicator . Возможно, этого не существовало, когда был задан вопрос, и, ИМХО, это не слишком беспокоит, но вкус — это, ну, в общем, дело вкуса.

Ответ №1:

Другой простой вариант — выполнить highlight-lines-matching-regexp выражение .{81} .

Каждая строка, содержащая 81 символ или более, будет выделена выбранным вами цветом.

Комментарии:

1. Блестяще. Есть ли какой-либо способ включить это в моем .emacs?

2. Выделение — это настройка для каждого буфера. Однако вы можете добавить привязку к конкретному режиму в свой .emacs следующим образом: (add-hook 'emacs-lisp-mode-hook '(lambda () (highlight-lines-matching-regexp ".{81}" "hi-green-b"))) . Я не нашел универсального new-buffer-hook для работы со всеми буферами.

3. Почему у меня не (add-hook 'c -mode-hook '(lambda () (highlight-lines-matching-regexp ".{81}" "hi-green-b"))) работает?

4. @RNAer Попробуйте это: (add-hook 'c -mode-hook '(lambda () (highlight-lines-matching-regexp ".\{81\}" 'hi-yellow)))

5. @Juancho find-file-hook должно быть тем крючком, который вы искали.

Ответ №2:

Смотрите whitespace-mode — теперь это часть Emacs и может делать гораздо больше, чем просто выделять длинные строки. (Но, конечно, может использоваться только для этого.)

Комментарии:

1. Можете ли вы объяснить, как это работает? Там есть косвенная ссылка на «длинные строки», но с объяснением того, что делает строку длинной. Если это не 80 символов, как указать 80?

2. Вы можете установить whitespace-line-column . Для получения дополнительных опций используйте M-x customize-group RET whitespace RET , и вы увидите их все. (Я просто смотрю на исходный код и пишу elisp-код …)

3. Я использовал redspace.el ( emacswiki.org/emacs/redspace.el ), но это кажется лучше. Спасибо!

4. Моя проблема с этим заключается в том, что он добавляет кучу других выделений, которые, вероятно, не нужны.

5. @EoghanM, посмотри whitespace-style : ты можешь управлять тем, что выделять.

Ответ №3:

Вот моя конфигурация из Emacs Dev Kit:

 ;; whitespace-mode
;; free of trailing whitespace and to use 80-column width, standard indentation
(setq whitespace-style '(trailing lines space-before-tab
                                  indentation space-after-tab)
      whitespace-line-column 80)
  

В принципе, вам нужен только последний бит, но я нахожу другие настройки весьма полезными (я ненавижу табуляции и завершающие пробелы).

Ответ №4:

Попробуйте highlight-80 .el . Вы можете получить это из здесь.

Чтобы установить его, просто добавьте следующее в свой .emacs :

 (add-to-list 'load-path "/path/to/highlight-80 ")
(require 'highlight-80 )
  

Затем вы можете включить его через:

M-x highlight-80 -mode

Комментарии:

1. Автор highlight-80 .el сообщает, что его выпуск прекращен, и рекомендует, начиная с Emacs 23, использовать пробельную строку-столбец в режиме пробелов .

Ответ №5:

Это не совсем то, что вы хотели, но у меня была похожая проблема, и я нашел этот вопрос / ответ. Все, что я хотел, это вставить визуальное руководство, когда оно мне понадобится. Это то, с чем я, наконец, закончил:

 (defun insert-80 ()
    "Insert an 80-character-wide guide at beginning of line."
    (interactive)
    (beginning-of-line)
    (insert "0         1         2         3         4         5         6         7         |")
    (newline)
    (insert "01234567890123456789012345678901234567890123456789012345678901234567890123456789|")
    (newline)
)
  

Очень просто, но иногда очень эффективно.

Ответ №6:

Вот некоторый пример кода, который выделит текст, который находится за пределами столбца 80, с текущим заголовком «предупреждение» и строкой, чтобы включить его для режима C .

 ;; Turn on warn highlighting for characters outside of the 'width' char limit
(defun font-lock-width-keyword (width)
  "Return a font-lock style keyword for a string beyond width WIDTH
   that uses 'font-lock-warning-face'."
  `((,(format "^%s\(. \)" (make-string width ?.))
     (1 font-lock-warning-face t))))

(font-lock-add-keywords 'c  -mode (font-lock-width-keyword 80))
  

Это не выделяет всю строку, но я нахожу это достаточно полезным.

Комментарии:

1. Однако с табуляциями это не работает. Смотрите emacswiki.org/emacs/EightyColumnRule для более продвинутого регулярного выражения.

2. Могу ли я применить это для определенного шаблона имен файлов вместо *mode ? @acm

3. @alper — К сожалению, за пределами моих знаний. Может быть, начать новый вопрос?

Ответ №7:

В emacs-goodies-el есть встроенный пакет (рекомендую установить его в терминал) под названием highlight-beyond-fill-column.el, добавьте это в свой .emacs или init.el :

 (setq-default fill-column 80)
(add-hook 'prog-mode-hook 'highlight-beyond-fill-column)
(custom-set-faces '(highlight-beyond-fill-column-face
                    ((t (:foreground "red" )))))
  

Текст за fill-column пределами, который равен 80 во фрагменте, будет выделен цветом red . Вы можете настроить лицо так, как вам нравится.

Комментарии:

1. Может быть, с помощью set-face-attribute ? custom-set-faces их не предполагается трогать вручную.

Ответ №8:

Это похоже на другие ответы здесь, с преимуществом использования fill-column , и оно выполняется после переключения режима. Таким образом, каждый режим может иметь свою собственную ширину строки, которая должным образом учитывается при выделении.

 (add-hook 'after-change-major-mode-hook
  (lambda ()
    (when (derived-mode-p 'prog-mode)
      (let ((column-re (format "^[^n]\{%d\}\(.*\)$" fill-column)))
        (font-lock-add-keywords nil
          `((,column-re 1 font-lock-warning-face prepend)))))))
  

Возможно, вам не захочется снимать prog-mode флажок, если вы хотите, чтобы это было включено и для текстовых файлов.