VIM: восстановить исходный цвет переднего плана для нормальной группы выделения.

Есть ли способ в vim восстановить исходный цвет переднего плана терминала после его изменения с помощью команды ': highlight Normal'?

Например, я использую vim.exe 7.2 в командной строке Windows. Моя командная строка имеет зеленый текст. Когда я запускаю vim.exe, я могу выполнить следующую команду, чтобы изменить текст на красный:

:highlight Normal ctermfg=red

Однако я не могу понять, как вернуть цвет переднего плана к исходному.

Конечно, в этом простом примере я знаю, что исходный цвет был зеленым, поэтому я мог бы просто явно установить его обратно на зеленый. Однако в реальной жизни я пишу сценарий vim и мне нужно универсальное решение для возврата к исходному цвету.

Я просматривал документы vim в течение последних нескольких часов и пробовал такие вещи, как ': syntax off', ': highlight normal clear' и 'syntax reset', но безрезультатно. В разделе termcap была некоторая интересная информация о переменной t_op, но я не могу понять, как ее использовать. Единственный успех, который у меня был до сих пор, - это выйти из vim и позволить командной строке вернуться к исходному цвету; Я действительно хотел бы иметь возможность делать это из одного сеанса vim.

Заранее благодарим за любые предложения, которые могут у вас возникнуть.

-----[20100723 13:30]-----

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

На моей машине (vim 7.2, Windows 7, командная строка) функция synIDattr () возвращает одно и то же значение для каждого нормального цвета переднего плана. Учтите следующее: я запускаю новый сеанс vim в командной строке с отключенной подсветкой синтаксиса и запускаю следующий скрипт, чтобы сообщить цвет переднего плана первого символа первой строки:

let numID = synID(1, 1, 1)
let numIDtrans = synIDtrans(numID)
let numFG = synIDattr(numIDtrans, "fg")
echo "synID: *" . numID . "*"
echo "synIDtrans: *" . numIDtrans . "*"
echo "synIDattr(fg): *" . numFG . "*"

в ответ получаю:

synID: *0*
synIDtrans: *0*
synIDattr(fg): **

Обратите внимание, что synIDattr () не возвращает никакого значения, только добавленные мною буквальные разделители звездочек.

Затем я изменяю цвет переднего плана группы Normal:

highlight Normal ctermfg=red

Когда я запускаю тот же сценарий, я получаю тот же ответ - нет значения от synIDattr (). Обратите внимание, что сценарий действительно возвращает полезную информацию, когда у меня включена подсветка синтаксиса (но в этот момент уже слишком поздно).

-----[20100728 16:11]-----

Решение «выделить Normal ctermfg = NONE» сработало. Я предоставлю немного больше контекста для справок в будущем.

Моей целью было написать функцию и горячую клавишу для быстрого включения и выключения подсветки синтаксиса. Чтобы позволить цвету переднего плана вернуться к исходному цвету после отключения подсветки синтаксиса, мне пришлось удалить команду «выделить нормальный ...» из файла цветовой схемы и добавить две соответствующие команды к самой функции:

function! fSwitchSyntax()

        if exists("g:syntax_on")

                syntax off    
                highlight normal ctermfg=NONE  <--- New command

        else

                syntax on    
                highlight normal ctermfg=white <--- New command

        endif

endfunction

person manniongeo    schedule 22.07.2010    source источник


Ответы (1)


В скрипте Vim вы можете получить цвет переднего плана фрагмента текста под курсором с помощью следующего фрагмента:

let oldcolor = synIDattr(synIDtrans(synID(line("."), col("."), 1)), "fg")

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

let synhere = synID(line("."), col("."), 1)
let oldcolor = synIDattr(synIDtrans(synhere), "fg")
let what = synIDattr(synhere, "name")
echo ":highlight " . what . " ctermfg=" . oldcolor

Возможно, вам придется следить за полужирным шрифтом, подчеркиванием и цветом bg. :help synIDattr() имеет подробную информацию.

РЕДАКТИРОВАТЬ: я не видел вашего обновления, возможно, вам стоило добавить комментарий.

Если у вас отключен синтаксис, я думаю, что функции syn * ничего не делают. Перечитав вопрос, я думаю, что самый простой способ вернуться к исходному состоянию - использовать :highlight Normal ctermfg=NONE.

person richq    schedule 23.07.2010
comment
Синтаксис ctermfg = NONE работал; Спасибо за твой ответ! Я внесу изменения в исходный пост, добавив дополнительную информацию. (Я еще не совсем понял рабочий процесс / этикет для публикации ответов в stackoverflow. На днях я добавил несколько комментариев к вашему ответу, затем понял, что 1. пространство ограничено, а 2. я не могу отформатировать код. После посоветовавшись с FAQ и другом, я решил удалить комментарии и изменить исходное сообщение. Думаю, мне следовало оставить комментарии; извините за путаницу.) - person manniongeo; 29.07.2010
comment
@mannion: Нет проблем! Я думаю, что обычно это делают люди, редактируя вопрос, а затем отправляя сообщение «Эй, я отредактировал комментарий к вопросу». - person richq; 29.07.2010