VIM: восстановить исходный цвет переднего плана для группы выделения «Нормальный» - PullRequest
2 голосов
/ 23 июля 2010

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

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

:highlight Normal ctermfg=red

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

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

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

Заранее благодарим за любые ваши предложения.

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

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

На моем компьютере (vim 7.2, Windows 7, командная строка) функция synIDattr () возвращает одинаковое значение для каждого цвета переднего плана Normal. Примите во внимание следующее: я запускаю новый сеанс 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] -----

Сработало решение 'highlight Normal ctermfg = NONE'. Я предоставлю немного больше контекста для дальнейшего использования.

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

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

1 Ответ

2 голосов
/ 23 июля 2010

В сценарии 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.

...