Ответ 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
окрашивает имена файлов или списки полос.)