Подтвердить что ты не робот

Раскрашивание вывода: make,: grep и т.д. В Vim

При создании моего приложения с помощью команды :make в Vim вывод не раскрашен. Я сконфигурировал make файл, чтобы использовать clang как компилятор C, а при запуске make вне Vim или при запуске :!make выдается цветной выход clang. :set makeprg возвращает makeprg=make только для справки.

У меня такая же проблема с grep: при запуске :grep вывод не раскрашен; при запуске :!grep, это так. Я пробовал использовать параметр --color с :grep, но безрезультатно. :set grepprg возвращает grepprg=grep -n $* /dev/null.

Я прочитал команды VIM Unix, напечатанные в цвете, а также Как раскрасить мои шаблоны результатов vimgrep. Первая имеет противоположную задачу (т.е. :!command вывод не раскрашен); у последнего нет альтернативы сбрасыванию на оболочку, что я не чувствую, это "правильное" исправление проблемы.

4b9b3361

Ответ 1

Проблема заключается в том, что когда Vim запускает другие команды через :make или :grep, эти команды не получают терминал для своего стандартного вывода - в том смысле, что для них isatty (STDOUT_FILENO) является ложным - потому что Vim захватывает вывод на своем пути к отображению на терминале. С другой стороны, когда вы используете :!make или :!grep, стандартный вывод просто подходит к терминалу.

Clang по умолчанию и grep --color=auto (что, вероятно, так, как вы его наложили), используйте терминальную функцию stdout, чтобы решить, следует ли их сортировать. Это удобно в том плане, что вы получаете красочный вывод на своем терминале, но сохраняете только текст при перенаправлении вывода в файл - все без необходимости добавлять дополнительные параметры командной строки.

Итак, что вы хотите сделать, это переопределить привычные умения этих команд, чтобы они всегда окрашивали их вывод.

Для grep вы можете использовать --color=always, когда он запускается через :grep внутри Vim:

:set grepprg=grep\ --color=always\ -n\ $*\ /dev/null

и в зависимости от ваших настроек цвета и версии grep это будет работать достаточно хорошо.

Для clang вы можете изменить свой Makefile, чтобы использовать clang -fcolor-diagnostics, чтобы заставить colourisation или более гибко добавить дополнительную переменную в $(CC), который будет отменен при запуске через :make внутри Vim:

:set makeprg=make\ EXTRA_CFLAGS=-fcolor-diagnostic

Однако (по крайней мере, с clang 3.0 и vim 7.3) вы обнаружите, что стиль цветения clang не позволяет Vim выбирать имена файлов и номера строк из диагностики, поэтому это разрушает преимущество использования :make, а не :!make.

Вы можете учить Vim выбирать имена файлов и т.д. из окружающих escape-последовательностей ANSI, которые выполняют colourisation, добавляя больше записей в параметр Vim errorformat, чтобы соответствовать цветной диагностике стиля clang. (И аналогично с grepformat, если цвет grep окрашивает имена файлов или списки полос.)