Вопрос или проблема
Я использую терминал (Iterm2 Beta), который позволяет установить отдельную тему для светлого и темного режимов. Это полезно для изменения цвета фона терминала и контраста различныхPreset-цветов с ним.
Мне было интересно, возможно ли установить отдельную конфигурацию цвета для fish shell для светлого и темного режимов. Например, в светлом режиме я хотел бы, чтобы мой цвет fish отображался черным как основной цвет команд, тогда как в темном режиме я хотел бы, чтобы они были белыми.
Я программно настраивал цвет с помощью скрипта, вдохновленного этим постом на reddit, но не смог найти простого способа изменения этих цветов через системную тему macOS. Вот моя функция fish для изменения темы на темную или светлую
Я не пользователь Mac, поэтому не могу предоставить детальные шаги, но надеюсь, что смогу изложить части Fish и дать вам некоторые советы, которые могут помочь на стороне macOS.
Я бы разбил это на:
-
Что-то, что уведомляет все открытые экземпляры Fish shell, когда тема должна измениться.
Это будет обрабатываться функцией, которая отслеживает изменение переменной. Она должна находиться в памяти в любое время (в отличие от ленивой загрузки). Хотя вы могли бы создать это в
fish.config
, я предпочитаю разместить это в~/.config/fish/conf.d/update_theme.fish
:function update_theme --on-variable macOS_Theme if [ "$macOS_Theme" = "dark" ] set_theme_dark else if [ "$macOS_Theme" = "light" ] set_theme_light end end
-
Мы можем затем инициировать изменение темы во всех открытых экземплярах Fish с помощью:
set --universal macOS_Theme "dark"
-
Обнаружение изменения темы системы macOS — Этот пост на Ask Different Stack привел меня к этому коду на Swift, который кажется необходимым для этого. Что-то вроде:
DistributedNotificationCenter.default.addObserver( forName: Notification.Name("AppleInterfaceThemeChangedNotification"), object: nil, queue: nil) { (notification) in updateFishTheme() }
-
updateFishTheme()
должен уметь вызывать Fish и устанавливать глобальную переменную. Пример кода там предоставляет функциюshell
, которая, вероятно, с модификацией подойдет для этого. Этот ответ на SO также предоставляет несколько пример “shell” кода.Также, как оказывается, есть возможность использовать
run()
по этому ответу на SO.Снова-таки, у меня нет Mac, поэтому я просто не могу протестировать это и предоставить необходимый код.
-
Когда вы сможете вызвать shell из этой функции Swift, используйте его для вызова:
fish -c "set --universal macOS_Theme 'dark'" # или 'light'
И все ваши экземпляры должны обновиться.
Вот полный рабочий набор инструкций, протестированных на macOS 15.1, iTerm2 3.5.9 и fish 3.7.1.
Это можно сделать, используя Python API iTerm.
Создайте новый скрипт Basic Long-Running Daemon и замените содержимое следующим.
#!/usr/bin/env python3.10
import asyncio
import iterm2
import subprocess
async def main(connection):
async with iterm2.VariableMonitor(connection, iterm2.VariableScopes.APP, "effectiveTheme", None) as mon:
while True:
# Блокировать до изменения темы
theme = await mon.async_get()
# Темы имеют атрибуты, разделенные пробелами, один из которых будет светлым или темным.
parts = theme.split(" ")
if "dark" in parts:
print("меняю тему на темную")
subprocess.run(["fish", "-c", "yes | fish_config theme save 'Ваша Темная Тема'"])
else:
print("меняю тему на светлую")
subprocess.run(["fish", "-c", "yes | fish_config theme save 'Ваша Светлая Тема'"])
iterm2.run_forever(main)
Наконец, активируйте скрипт из меню Scripts
.
Устраните неполадки с помощью консоли скрипта (⌥⌘J)
Ответ или решение
Да, возможна настройка отдельных цветовых конфигураций для оболочки Fish в зависимости от темы системы (светлая или тёмная) на macOS. Такой подход позволит вам управлять цветовыми схемами вашего терминала, используя различные настройки фонового цвета и контраста для удобства работы. Ниже приведены подробные шаги, как это можно реализовать.
1. Уведомление о смене темы
Сначала необходимо создать функцию, которая будет реагировать на изменение переменной, указывающей на текущую тему системы. Это можно осуществить, поместив функцию в файл ~/.config/fish/conf.d/update_theme.fish
:
function update_theme --on-variable macOS_Theme
if [ "$macOS_Theme" = "dark" ]
set_theme_dark
else if [ "$macOS_Theme" = "light" ]
set_theme_light
end
end
Эта функция будет вызываться при изменении переменной macOS_Theme
, соответствующей текущей теме.
2. Установка переменной темы
Чтобы изменить тему в работающих экземплярах оболочки Fish, вы можете использовать команду:
set --universal macOS_Theme "dark" # или "light"
3. Отслеживание изменения темы системы
С помощью Swift вы можете отслеживать изменения в системе. Пример кода, который можно использовать, основан на использовании DistributedNotificationCenter
для отслеживания уведомлений о смене темы:
DistributedNotificationCenter.default.addObserver(
forName: Notification.Name("AppleInterfaceThemeChangedNotification"),
object: nil,
queue: nil) { (notification) in
updateFishTheme()
}
4. Вызов изменения темы из Swift
Необходимо сделать так, чтобы функция updateFishTheme()
могла запускать команду Fish для изменения переменной. Ваша функция в Swift может выглядеть следующим образом:
func updateFishTheme() {
let theme = // Определите, какая тема (dark/light)
let process = Process()
process.launchPath = "/usr/bin/env"
process.arguments = ["fish", "-c", "set --universal macOS_Theme '\(theme)'"]
process.launch()
}
После этого, при смене темы в macOS, установленная вами функция обновит переменную в всех экземплярах оболочки Fish.
5. Использование Python API для iTerm2
Как альтернативный вариант, можно использовать Python API для iTerm2. Это более современный способ, позволяющий автоматизировать процессы. Пример кода, который можно использовать для мониторинга изменения темы:
#!/usr/bin/env python3.10
import asyncio
import iterm2
import subprocess
async def main(connection):
async with iterm2.VariableMonitor(connection, iterm2.VariableScopes.APP, "effectiveTheme", None) as mon:
while True:
theme = await mon.async_get()
parts = theme.split(" ")
if "dark" in parts:
print("changing theme to dark")
subprocess.run(["fish", "-c", "yes | fish_config theme save 'Your Dark Theme'"])
else:
print("changing theme to light")
subprocess.run(["fish", "-c", "yes | fish_config theme save 'Your Light Theme'"])
iterm2.run_forever(main)
Эта программа будет запускаться как фоновый процесс и автоматически изменять тему в зависимости от установленной в macOS.
Заключение
С помощью предложенных методов вы сможете настроить оболочку Fish под ваши предпочтения, изменяя цвета команд в зависимости от темы вашей системы. Это повысит визуальный комфорт работы в терминале, особенно при переключении между различными условиями освещения. Важно помнить, что для полноценной работы необходимо правильно конфигурировать ваш терминал и следить за актуальностью версий используемого программного обеспечения.