Отобразить конечные пробелы в vim


11

Мне бы хотелось, чтобы в моем терминальном vim было хорошее и приятное отображение пробела. Это позволило бы мне удалить их перед закрытием файла.

Я знаю, что этот вопрос довольно популярен, и я уже нашел десятки ответов на SO. К сожалению, я не нашел удовлетворительного еще ...

Поэтому я постараюсь обобщить собранную информацию и найденные решения.

Решение 1. Вручную выделите конечные пробелы

highlight ExtraWhitespace ctermbg=red guibg=red
match ExtraWhitespace /\s\+$/
autocmd BufWinEnter * match ExtraWhitespace /\s\+$/
autocmd InsertEnter * match ExtraWhitespace /\s\+\%#\@<!$/
autocmd InsertLeave * match ExtraWhitespace /\s\+$/
autocmd BufWinLeave * call clearmatches()

Выделите конечные пробелы

Плюсы:

  • Легко использовать
  • Быстрый
  • Совместим с cursorline

Минусы:

  • Выбранный цвет не совместим с другими цветовыми схемами, поскольку для цвета вручную установлено значение red
  • Большие красные фоновые блоки не очень эстетичны

Решение 2. Использование функции списка

set list
set listchars+=trail:◦

введите описание изображения здесь введите описание изображения здесь

Плюсы:

  • Легко использовать
  • Быстрый

Минусы:

  • Проблема, если :set cursorlineвключена
  • Выделенный цвет для list/trailне настраивается. Должен быть таким же, как и другие списки

Решение 3. Использование функции скрытия

syn match WhiteSpace "\s\+$" containedin=ALL conceal cchar=◦
set conceallevel=2 
set concealcursor=nv
highlight Conceal ctermfg=red

введите описание изображения здесь введите описание изображения здесь

Плюсы:

  • Красивее, чем первое решение

Минусы:

  • Фон не совпадает с фоном курсора
  • Может мешать другим скрытым правилам
  • Выбранный цвет не всегда совместим с цветовой схемой
  • Не совместим со старой версией Vim

Мой вопрос

Какое из перечисленных решений является наиболее подходящим с точки зрения производительности и совместимости, и как я могу получить все плюсы и ни одного из минусов?

Другими словами, я хотел бы найти решение, где:

  • Выделение цвета в конце соответствует выбранной схеме цветов
  • Этот цвет хорошо виден, но не слишком агрессивен для глаз
  • Совместим с cursorline(фоном и передним планом) `
  • Совместим с другими плагинами, которые могут использовать скрытый
  • Конечный символ может быть установлен на любой символ Unicode

Если вам не нравится красный, выберите другой цвет. Если вы хотите, чтобы цвет , чтобы быть совместимым с различными цветовыми схемами, затем связать с именем цвета группы вместо использования определенного цвета, например, :hi link ExtraWhitespace CursorLine. См :help hi-link.
garyjohn

Ответы:


4

С точки зрения производительности, ни один из них не должен иметь значения. Vim в основном увязает в сложных синтаксических паттернах; картина здесь довольно проста.

Чтобы цвет подсветки соответствовал выбранной схеме цветов, используйте :hi linkсуществующую группу; как правило, это было бы Error. Конечно, все это имеет значение, только если вы часто переключаете (совсем другие) схемы цветов; иначе, использование подходящих цветов напрямую (как в вашем решении 1) также будет хорошо.

Решение 1. Вручную выделите конечные пробелы

Я бы пошел на это, но использовал matchadd()вместо :match; это оставляет последний для пользовательского выделения. Кроме того, clearmatches()это слишком грубо; удаляет все совпадения и, следовательно, может влиять на плагины. Вы можете использовать / посмотреть на мой плагин ShowTrailingWhitespace для чистой и мощной реализации (которая также включает исключения для определенных типов файлов). Да, это гораздо более масштабное решение, но я пока не заметил каких-либо последствий.

Решение 2. Использование функции списка

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

Решение 3. Использование функции скрытия

Это, безусловно, будет мешать некоторым синтаксисам и плагинам, использующим эту функцию. Плохая идея.


Итак, из вашего ответа я понимаю, что есть такое решение, которое позволяет использовать собственный символ Unicode для обозначения лишних пробелов. Этот вопрос действительно более сложный, чем я изначально думал.
nowox

Правильно, пользовательские символы работают только с 'listchars'. Для меня подсветка более чем достаточно (особенно с агрессивными цветами).
Инго Каркат
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.