Недавно я приобрёл новый MacBook Air M4 и самое время обновить мой сетап macOS в 2025 и что изменилось за год. Прошлогодний пост облегчил переезд на новый ноутбук.

С 2024 года я остановился на Brave как основном, использую Browserino для переключения между Chrome, Edge и Firefox.

Перешёл на fish с fisher и промптом Tide. Также заменил Docker Desktop на Orb (OrbStack). Экспериментирую с Cursor и Zed. Ещё обновил конфигурацию Git/SSH. Но большинство системных настроек остались без изменений с 2024.

Начал использовать Ghostty как терминал и для управления зависимостями Nix.

План примерно такой по настройке:

Настройки системы

Скрипт настройки macOS

Думал про Ansible или Nix для управления конфигурацией, но проверенный временем bash-скрипт всё ещё самый простой вариант для меня 🙂.

#!/usr/bin/env bash

set -Eeuo pipefail

# macOS Setup Script - Compatible with macOS 15 Sequoia & 26 Tahoe
#
# Sources:
# - https://macos-defaults.com
# - https://github.com/mathiasbynens/dotfiles
# - https://github.com/driesvints/dotfiles
#

echo "Running macOS setup for Sequoia/Tahoe..."

# Detect macOS version
OS_VERSION=$(sw_vers -productVersion)
echo "Detected macOS version: $OS_VERSION"

echo "Some settings require Full Disk Access for Terminal.app"
echo ""

# ============================================================================
# === SCRIPT INITIALIZATION ===
# ============================================================================

# Close any open System Settings panes
osascript -e 'tell application "System Settings" to quit'

# Ask for the administrator password upfront
sudo -v

# ============================================================================
# === SYSTEM CORE SETTINGS ===
# ============================================================================

echo "Configuring system core settings..."

# Disable startup noise
sudo nvram StartupMute=%01

# Automatically switch between light and dark mode
defaults write NSGlobalDomain AppleInterfaceStyleSwitchesAutomatically -bool true

# Reveal IP address, hostname, OS version when clicking login clock
sudo defaults write /Library/Preferences/com.apple.loginwindow AdminHostInfo HostName

# Expand save panel by default
defaults write NSGlobalDomain NSNavPanelExpandedStateForSaveMode -bool true
defaults write NSGlobalDomain NSNavPanelExpandedStateForSaveMode2 -bool true

# Save to disk (not iCloud) by default
defaults write NSGlobalDomain NSDocumentSaveNewDocumentsToCloud -bool false

# Expand print panel by default
defaults write NSGlobalDomain PMPrintingExpandedStateForPrint -bool true
defaults write NSGlobalDomain PMPrintingExpandedStateForPrint2 -bool true

# Disable tiled window margins (Sequoia's window tiling)
defaults write com.apple.WindowManager EnableTiledWindowMargins -bool false

# Reduce motion (more effective than NSAutomaticWindowAnimationsEnabled)
defaults write NSGlobalDomain ReduceMotionEnabled -bool true

# ============================================================================
# === FINDER & FILE MANAGEMENT ===
# ============================================================================

echo "Configuring Finder settings..."

# Use list view by default
defaults write com.apple.finder FXPreferredViewStyle -string "Nlsv"

# Keep folders on top when sorting by name
defaults write com.apple.finder _FXSortFoldersFirst -bool true

# Disable Finder animations for speed
defaults write com.apple.finder DisableAllAnimations -bool true

# Show "Quit Finder" menu item
defaults write com.apple.finder QuitMenuItem -bool true

# Show hidden files (Cmd+Shift+. also works)
defaults write com.apple.finder AppleShowAllFiles -bool true

# Always show file extensions
defaults write NSGlobalDomain AppleShowAllExtensions -bool true

# Disable warning when changing file extensions
defaults write com.apple.finder FXEnableExtensionChangeWarning -bool false

# Search current folder by default
defaults write com.apple.finder FXDefaultSearchScope -string "SCcf"

# Show path bar and status bar
defaults write com.apple.finder ShowPathbar -bool true
defaults write com.apple.finder ShowStatusBar -bool true

# Show POSIX path in title
defaults write com.apple.finder _FXShowPosixPathInTitle -bool true

# New windows open to home folder
defaults write com.apple.finder NewWindowTarget -string "PfHm"
defaults write com.apple.finder NewWindowTargetPath -string "file://${HOME}/"

# Show drives on desktop
defaults write com.apple.finder ShowHardDrivesOnDesktop -bool true
defaults write com.apple.finder ShowMountedServersOnDesktop -bool true
defaults write com.apple.finder ShowExternalHardDrivesOnDesktop -bool true
defaults write com.apple.finder ShowRemovableMediaOnDesktop -bool true

# Show ~/Library folder
chflags nohidden ~/Library

# Show /Volumes folder
sudo chflags nohidden /Volumes

# Disable .DS_Store on network and USB drives
defaults write com.apple.desktopservices DSDontWriteNetworkStores -bool true
defaults write com.apple.desktopservices DSDontWriteUSBStores -bool true

# ============================================================================
# === DOCK & MISSION CONTROL ===
# ============================================================================

echo "Configuring Dock and Mission Control..."

# Auto-hide Dock
defaults write com.apple.dock autohide -bool true

# Fast Dock animations
defaults write com.apple.dock autohide-time-modifier -float 0.15
defaults write com.apple.dock autohide-delay -float 0

# Smaller Dock icons
defaults write com.apple.dock tilesize -int 48

# No magnification
defaults write com.apple.dock magnification -bool false

# Scale effect for minimizing
defaults write com.apple.dock mineffect -string "scale"

# Hide recent applications
defaults write com.apple.dock show-recents -bool false

# Show indicator lights for open applications
defaults write com.apple.dock show-process-indicators -bool true

# Make hidden app icons translucent
defaults write com.apple.dock showhidden -bool true

# Don't rearrange Spaces automatically
defaults write com.apple.dock mru-spaces -bool false

# Group windows by application in Mission Control
defaults write com.apple.dock expose-group-by-app -bool true

# Disable hot corners (set all to 0 for no action)
defaults write com.apple.dock wvous-tl-corner -int 0
defaults write com.apple.dock wvous-tr-corner -int 0
defaults write com.apple.dock wvous-bl-corner -int 0
defaults write com.apple.dock wvous-br-corner -int 0

# Enable scroll gesture to open Dock stacks
defaults write com.apple.dock scroll-to-open -bool true

# ============================================================================
# === UI & ANIMATIONS ===
# ============================================================================

echo "Configuring UI and animations..."

# Reduce menu bar spacing for MacBooks with notch
defaults write NSGlobalDomain NSStatusItemSelectionPadding -int 10
defaults write NSGlobalDomain NSStatusItemSpacing -int 10

# Faster window resize
defaults write NSGlobalDomain NSWindowResizeTime -float 0.001

# Instant Quick Look
defaults write NSGlobalDomain QLPanelAnimationDuration -float 0

# ============================================================================
# === INPUT & TEXT ===
# ============================================================================

echo "Configuring input and text settings..."

# Disable all automatic text corrections
defaults write NSGlobalDomain NSAutomaticCapitalizationEnabled -bool false
defaults write NSGlobalDomain NSAutomaticDashSubstitutionEnabled -bool false
defaults write NSGlobalDomain NSAutomaticQuoteSubstitutionEnabled -bool false
defaults write NSGlobalDomain NSAutomaticPeriodSubstitutionEnabled -bool false
defaults write NSGlobalDomain NSAutomaticSpellingCorrectionEnabled -bool false
defaults write NSGlobalDomain NSAutomaticTextCompletionEnabled -bool false

# Disable language indicator
defaults write kCFPreferencesAnyApplication TSMLanguageIndicatorEnabled -bool false

# Full keyboard access (Tab through all controls)
# Note: Sequoia changed values - use 2, not 3
# https://github.com/nix-darwin/nix-darwin/issues/1378
defaults write NSGlobalDomain AppleKeyboardUIMode -int 2

# Disable press-and-hold for accented characters
defaults write NSGlobalDomain ApplePressAndHoldEnabled -bool false

# Fast keyboard repeat rate (requires logout)
defaults write NSGlobalDomain KeyRepeat -int 2
defaults write NSGlobalDomain InitialKeyRepeat -int 15


# Trackpad: Enable tap-to-click
defaults write com.apple.driver.AppleBluetoothMultitouch.trackpad Clicking -bool true
defaults write com.apple.AppleMultitouchTrackpad Clicking -bool true
defaults -currentHost write NSGlobalDomain com.apple.mouse.tapBehavior -int 1
defaults write NSGlobalDomain com.apple.mouse.tapBehavior -int 1

# Enable three-finger drag
defaults write com.apple.AppleMultitouchTrackpad TrackpadThreeFingerDrag -bool true
defaults write com.apple.driver.AppleBluetoothMultitouch.trackpad TrackpadThreeFingerDrag -bool true

# ============================================================================
# === SCREENSHOTS ===
# ============================================================================

echo "Configuring screenshot settings..."

# Save as PNG
defaults write com.apple.screencapture type -string "png"

# Save to Downloads
defaults write com.apple.screencapture location -string "${HOME}/Downloads"

# Disable shadow in screenshots
defaults write com.apple.screencapture disable-shadow -bool true

# No floating thumbnail
defaults write com.apple.screencapture show-thumbnail -bool false

# Custom name prefix
defaults write com.apple.screencapture name -string "Screenshot"

# ============================================================================
# === ACTIVITY MONITOR ===
# ============================================================================

echo "Configuring Activity Monitor..."

# Show all processes
defaults write com.apple.ActivityMonitor ShowCategory -int 0

# Sort by CPU usage
defaults write com.apple.ActivityMonitor SortColumn -string "CPUUsage"
defaults write com.apple.ActivityMonitor SortDirection -int 0

# Show CPU history in Dock icon
defaults write com.apple.ActivityMonitor IconType -int 6

# Update frequency: Often (2 seconds)
defaults write com.apple.ActivityMonitor UpdatePeriod -int 2

# ============================================================================
# === PRIVACY & SECURITY ===
# ============================================================================

echo "Configuring privacy settings..."

# Disable Spotlight web search (keeps searches local)
defaults write com.apple.lookup.shared LookupSuggestionsDisabled -bool true

# Disable crash reporter dialog
defaults write com.apple.CrashReporter DialogType -string "none"

# ============================================================================
# === SYSTEM PREFERENCES ===
# ============================================================================

echo "Configuring system preferences..."

# Prevent Photos from auto-launching
defaults -currentHost write com.apple.ImageCapture disableHotPlug -bool YES

# Disable app state restoration
defaults write NSGlobalDomain NSQuitAlwaysKeepsWindows -bool false
defaults write com.apple.loginwindow TALLogoutSavesState -bool false
defaults write com.apple.loginwindow LoginwindowLaunchesRelaunchApps -bool false

# Enable spring loading for directories
defaults write NSGlobalDomain com.apple.springing.enabled -bool true

# Remove spring loading delay
defaults write NSGlobalDomain com.apple.springing.delay -float 0

# ============================================================================
# === CLEANUP ===
# ============================================================================

echo "Cleaning up old settings..."

# Remove deprecated Launchpad settings if they exist
defaults delete com.apple.dock springboard-columns 2>/dev/null || true
defaults delete com.apple.dock springboard-rows 2>/dev/null || true

# Reset Launchpad
defaults write com.apple.dock ResetLaunchPad -bool true

# ============================================================================
# === APPLY CHANGES ===
# ============================================================================

echo "Applying changes..."

# Restart affected services
for app in "Finder" "Dock" "SystemUIServer" "WindowManager"; do
    killall "${app}" &> /dev/null || true
done

# Restart preference daemon
killall cfprefsd

echo ""
echo "✅ Setup complete!"
echo ""
echo "Consider rebooting for all changes to take effect."

Браузер

Мой основной браузер теперь Brave, с Browserino для переключения между другими браузерами (личный, рабочий и т.д.). На работе использую Chrome или Edge, в зависимости от ноутбука. На MacBook Air использую Edge, потому что он предустановлен с рабочим аккаунтом.

Иногда также использую Firefox или Zen Browser. Обычно предпочитаю Firefox из-за его расширений, хотя Brave во многом закрыл этот пробел. Теперь Firefox использую все реже...

Что касается Zen Browser, мне нравится концепция и использую его примерно со второго релиза. Правда, пришлось пару раз пересоздавать аккаунт, потому что Zen не смог мигрировать данные после обновления, что расстроило. По этой причине теперь я больше смотрю стороны и пробую только отдельные релизы.

Расширения браузера

  1. Bitwarden
  2. OneTab — использую как список для чтения
  3. uBlock Origin — можно хоть как-то жить (вместе с Pi‑hole)
  4. Simple Translate — самое удобное расширение для перевода, которое я видел
  5. Clickbait Remover for YouTube
  6. Enhancer for YouTube
  7. SponsorBlock
  8. Claude — для периодических экспериментов, например сделать самари для PR

Homebrew

Большинство CLI-инструментов ставлю через Homebrew, а GUI-приложения — это микс из Homebrew Casks и прямых загрузок. Когда у приложения есть свой автообновлятор, предпочитаю ставить напрямую.

Списки сгенерировал так:

brew leaves | xargs brew desc --eval-all
brew ls --casks | xargs brew desc --eval-all

CLI‑приложения (сгенерировано)

age: Simple, modern, secure file encryption
ansible: Automate deployment, configuration, and upgrading
ansible-lint: Checks ansible playbooks for practices and behaviour
atuin: Improved shell history for zsh, bash, fish and nushell
awscli: Official Amazon AWS command-line interface
bat: Clone of cat(1) with syntax highlighting and Git integration
btop: Resource monitor. C++ version and continuation of bashtop and bpytop
cloudflared: Cloudflare Tunnel client (formerly Argo Tunnel)
cmake: Cross-platform make
codex: OpenAI's coding agent that runs in your terminal
curl: Get a file from an HTTP, HTTPS or FTP server
dialog: Display user-friendly message boxes from shell scripts
direnv: Load/unload environment variables based on $PWD
dust: More intuitive version of du in rust
eza: Modern, maintained replacement for ls
fastfetch: Like neofetch, but much faster because written mostly in C
fd: Simple, fast and user-friendly alternative to find
fish: User-friendly command-line shell for UNIX-like operating systems
fzf: Command-line fuzzy finder written in Go
gh: GitHub command-line tool
git: Distributed revision control system
git-delta: Syntax-highlighting pager for git and diff output
git-filter-repo: Quickly rewrite git repository history
gnu-tar: GNU version of the tar archiving utility
golang-migrate: Database migrations CLI tool
golangci-lint: Fast linters runner for Go
goreleaser: Deliver Go binaries as fast and easily as possible
gping: Ping, but with a graph
graphviz: Graph visualization software from AT&T and Bell Labs
grpcurl: Like cURL, but for gRPC
terraform: Terraform
httpie: User-friendly cURL replacement (command-line HTTP client)
jq: Lightweight and flexible command-line JSON processor
lazydocker: Lazier way to manage everything docker
lazygit: Simple terminal UI for git commands
llama.cpp: LLM inference in C/C++
lld: LLVM Project Linker
make: Utility for directing compilation
miniserve: High performance static file server
mpv: Media player based on MPlayer and mplayer2
mypy: Experimental optional static type checker for Python
neovim: Ambitious Vim-fork focused on extensibility and agility
nmap: Port scanning utility for large networks
openfortivpn: Open Fortinet client for PPP+TLS VPN tunnel services
bun: Incredibly fast JavaScript runtime, bundler, transpiler and package manager - all in one.
p7zip: 7-Zip (high compression file archiver) implementation
pnpm: Fast, disk space efficient package manager
protobuf: Protocol buffers (Google's data interchange format)
pv: Monitor data's progress through a pipe
pwgen: Password generator
qemu: Generic machine emulator and virtualizer
repomix: Pack repository contents into a single AI-friendly file
ruby: Powerful, clean, object-oriented scripting language
ruff: Extremely fast Python linter, written in Rust
shellcheck: Static analysis and lint tool, for (ba)sh scripts
solidity: Contract-oriented programming language
sops: Editor of encrypted files
sshs: Graphical command-line client for SSH
swiftlint: Tool to enforce Swift style and conventions
teleport: Modern SSH server for teams managing distributed infrastructure
telnet: User interface to the TELNET protocol
typst: Markup-based typesetting system
uv: Extremely fast Python package installer and resolver, written in Rust
watch: Executes a program periodically, showing output fullscreen
wget: Internet file retriever
yamllint: Linter for YAML files
yazi: Blazing fast terminal file manager written in Rust, based on async I/O
yq: Process YAML, JSON, XML, CSV and properties documents from the CLI
zig: Programming language designed for robustness, optimality, and clarity
ast-grep: Code searching, linting, rewriting

GUI‑приложения (сгенерировано)

anki: (Anki) Memory training application
flashspace: (FlashSpace) Virtual workspace manager
font-inter: (Inter) [no description]
font-jetbrains-mono-nerd-font: (JetBrainsMono Nerd Font families (JetBrains Mono)) [no description]
font-noto-color-emoji: (Noto Color Emoji) [no description]
font-roboto-mono: (Roboto Mono) [no description]
iina: (IINA) Free and open-source media player
jdownloader: (JDownloader) Download manager
obsidian: (Obsidian) Knowledge base that works on top of a local folder of plain text Markdown files
orbstack: (OrbStack) Replacement for Docker Desktop
postman: (Postman) Collaboration platform for API development
qbittorrent: (qBittorrent) Peer to peer Bitorrent client
raycast: (Raycast) Control your tools with a few keystrokes
syncthing: Open source continuous file synchronization application
syncthing-app: (Syncthing) Real time file synchronisation software
thunderbird: (Mozilla Thunderbird) Customizable email client
vlc: (VLC media player) Multimedia player
wireshark: Network analyzer and capture tool - without graphical user interface
wireshark-app: (Wireshark) Network protocol analyzer

Приложения вне Homebrew

# Браузеры
Browserino
Brave Browser
Firefox

# Коммуникации и встречи
Slack
Discord
Telegram
Telegram Lite
WhatsApp
TeamViewer
AnyDesk
zoom.us

# Код и IDE
Cursor
Visual Studio Code
Zed
Sublime Text
Goland
RustRover

# Git и сравнение
Sublime Merge
GitButler
Kaleidoscope

# DevOps и контейнеры
Lens
Orb

# Медиа и захват
Shottr
Screen Studio
Streisand
VoiceInk

# Файлы и передача
Transmit

# Продуктивность и знания
Anytype
Lookupper
Microsoft Office
Yomu
Flow
Horo

# Система и тюнинг
Rectangle
Macs Fan Control
DaisyDisk
Keka
Handy

# VPN и сеть
Wireguard
OpenVPN

# Виртуализация и совместимость
Parallels Desktop
CrossOver

# Игры
Steam

Терминал и редакторы

Глобальное окружение Python

Создаю одно глобальное окружение Python в домашней директории для системных Python-инструментов, которое активирую в fish позже, выглядит чище, чем установка всего глобально, да и у некоторых зависимостей конфликтуют версии.

~/personal> uv venv

fish

# Добавить fish в список логин‑шеллов
echo "/opt/homebrew/bin/fish" | sudo tee -a /etc/shells
# Сделать fish шеллом по умолчанию
chsh -s /opt/homebrew/bin/fish

Установка Fisher и плагинов

Я использую Fisher как менеджер пакетов для fish:

  1. https://github.com/jorgebucaran/fisher — менеджер плагинов для fish
  2. fisher install IlanCosman/tide@v6 — промпт
  3. fisher install jorgebucaran/autopair.fish — автозакрытие скобок/кавычек
  4. fisher list | fisher update — обновить плагины

Пример списка плагинов:

jorgebucaran/fisher
ilancosman/tide@v6
jorgebucaran/autopair.fish

Настройка Tide и fish

tide configure --auto --style=Classic --prompt_colors='True color' --classic_prompt_color=Light --show_time='24-hour format' --classic_prompt_separators=Vertical --powerline_prompt_heads=Sharp --powerline_prompt_tails=Flat --powerline_prompt_style='Two lines, character' --prompt_connection=Dotted --powerline_right_prompt_frame=No --prompt_connection_andor_frame_color=Dark --prompt_spacing=Compact --icons='Few icons' --transient=No

~/.config/fish/config.fish

# Disable greeting
set fish_greeting

# Language environment
set -gx LC_ALL en_US.UTF-8
set -gx LANG en_US.UTF-8

# Default editor and terminal
set -gx PAGER less
set -gx EDITOR nvim
set -gx VISUAL nvim

# Add Homebrew to PATH
/opt/homebrew/bin/brew shellenv | source

# and other
fish_add_path /opt/homebrew/opt/ruby/bin
fish_add_path $HOME/.docker/bin
fish_add_path $HOME/.cargo/bin
fish_add_path $HOME/go/bin/
fish_add_path $HOME/development/flutter/bin

# Python - Activate global venv for my user
source $HOME/personal/.venv/bin/activate.fish

# Tide
set --global tide_left_prompt_items os context pwd direnv git newline character
set --global tide_right_prompt_items status cmd_duration context jobs python go time
set --global tide_cmd_duration_decimals 1
set --global tide_cmd_duration_threshold 0

# History search with Atuin
atuin init fish | source

# Auto activate .env files
direnv hook fish | source

# 'yy' function (Terminal file explorer using yazi)
function yy
    set tmp (mktemp -t "yazi-cwd.XXXXXX")
    yazi $argv --cwd-file="$tmp"
    if set cwd (command cat -- "$tmp"); and [ -n "$cwd" ]; and [ "$cwd" != "$PWD" ]
        builtin cd -- "$cwd"
    end
    rm -f -- "$tmp"
end

# Aliases
function beep
    afplay /System/Library/PrivateFrameworks/ScreenReader.framework/Versions/A/Resources/Sounds/AnimationFlyToDownloads.aiff >/dev/null 2>&1 &
end

# Shortcuts
alias l "eza -lah --group-directories-first"
alias o open
alias oo "open ."
alias cc "code ."
alias zz "zed ."

# Navigation shortcuts
alias "..." "cd ../.."
alias "...." "cd ../../.."
alias "....." "cd ../../../.."
alias "......" "cd ../../../../.."

# Git shortcuts
alias g    git
alias ga  "git add"
alias gaa "git add --all"
alias gcm "git commit -m"
alias gf  "git fetch"
alias gfa "git fetch --all --tags --prune --jobs=10"
alias gl  "git pull"
alias gp  "git push"

function grishy-claude
    docker run -it --rm \
      -v $(pwd):/workspace \
      -v ~/.claude:/home/ubuntu/.claude \
      -v ~/.claude.json:/home/ubuntu/.claude.json \
      grishy-dev claude --dangerously-skip-permissions $argv
end

function grishy-codex
    docker run -it --rm \
      -v $(pwd):/workspace \
      -v ~/.codex:/home/ubuntu/.codex \
      grishy-dev codex --search --sandbox danger-full-access $argv
end

function grishy-dev
    docker run -it --rm \
      -v $(pwd):/workspace \
      grishy-dev
end

if status is-interactive
    # Commands to run in interactive sessions can go here
end

Ghostty

~/.config/ghostty/config

shell-integration = fish
font-family = JetBrainsMono Nerd Font Mono
font-feature = -calt, -liga, -dlig
theme = grishy

# Open on fullscreen
window-height = 10000
window-width = 10000
window-position-x = 0
window-position-y = 0

# Hide title bar
macos-titlebar-style = tabs

# Keybindings
keybind = shift+enter=text:\n

~/.config/ghostty/themes/grishy

# =============================================================================
# COLOR PALETTE ORGANIZATION
# =============================================================================
# The palette uses 16 colors organized as:
# palette = 0-7: Standard ANSI colors (black, red, green, yellow, blue, purple, aqua, white)
# palette = 8-15: Bright versions of the same colors
#
# Color Index Reference:
# 0, 8  = Black (normal/bright)
# 1, 9  = Red (normal/bright)
# 2, 10 = Green (normal/bright)
# 3, 11 = Yellow (normal/bright)
# 4, 12 = Blue (normal/bright)
# 5, 13 = Purple/Magenta (normal/bright)
# 6, 14 = Cyan/Aqua (normal/bright)
# 7, 15 = White/Light Gray (normal/bright)
#
# =============================================================================
# THEME SETTINGS
# =============================================================================
# background: Terminal background color
# foreground: Default text color
# cursor-color: Color of the cursor
# cursor-text: Color of text under the cursor
# selection-background: Color behind selected text
# selection-foreground: Color of selected text

# Root Loops color scheme (Initial version)
# Via https://rootloops.sh

# Basic colors
palette = 0=#222222
palette = 1=#f30052
palette = 2=#4f9a00
palette = 3=#b07700
palette = 4=#0081f8
palette = 5=#c301fb
palette = 6=#009797
palette = 7=#b9b9b9
palette = 8=#525252
palette = 9=#ff506e
palette = 10=#5cb200
palette = 11=#cc8a00
palette = 12=#4699ff
palette = 13=#d057ff
palette = 14=#00afaf
palette = 15=#f1f1f1

# Theme settings
background = #080808
foreground = #e2e2e2
cursor-color = #b9b9b9
cursor-text = #e2e2e2
selection-background = #e2e2e2
selection-foreground = #080808

Zed редактор

settings.json

{
  "features": {
    "edit_prediction_provider": "copilot"
  },
  "vim_mode": false,
  "theme": "One Dark",
  "buffer_font_family": "JetBrainsMono Nerd Font Mono",
  "confirm_quit": true,
  "ui_font_family": "JetBrainsMono Nerd Font Mono",
  "show_edit_predictions": true,
  "telemetry": {
    "metrics": false
  },
  "ui_font_size": 14,
  "buffer_font_size": 13,
  "terminal": {
    "detect_venv": {
      "on": {
        "activate_script": "fish"
      }
    }
  },
  "lsp": {
    "gopls": {
      "gofumpt": true,
      "initialization_options": {
        "gofumpt": true
      }
    }
  }
}

Neovim

  1. Установить LazyVim — https://www.lazyvim.org/installation
  2. Начать пользоваться; конфиг дорабатываю по мере работы

Raycast

  1. Установить
  2. Назначить хоткей Spotlight — https://manual.raycast.com/hotkey

Git и SSH

Я использую разные Git‑конфиги для личных и рабочих проектов и соответствующие SSH‑ключи. Поэтому есть базовый ~/.gitconfig, который условно подключает нужные настройки в зависимости от пути репозитория.

~/.gitconfig

[filter "lfs"]
    clean = git-lfs clean -- %f
    smudge = git-lfs smudge -- %f
    process = git-lfs filter-process
    required = true

[http]
    version = HTTP/1.1

#
# Personal
#
[includeIf "gitdir:~/personal/"]
    path = ~/personal/.gitconfig

#
# Work
#

# As we have personal

#
# Base on https://blog.gitbutler.com/how-git-core-devs-configure-git/

# clearly makes git better
[column]
    ui = auto
[branch]
    sort = -committerdate
[tag]
    sort = version:refname
[init]
    defaultBranch = main
[diff]
    algorithm = histogram
    colorMoved = plain
    mnemonicPrefix = true
    renames = true
[push]
    default = simple
    autoSetupRemote = true
    followTags = true
[fetch]
    prune = true
    pruneTags = true
    all = true

[help]
    autocorrect = prompt
[commit]
    verbose = true
[rerere]
    enabled = true
    autoupdate = true
[core]
    excludesfile = ~/.gitignore
    pager = delta
[rebase]
    autoSquash = true
    autoStash = true
    updateRefs = true

[interactive]
    diffFilter = delta --color-only
[delta]
    navigate = true  # use n and N to move between diff sections
    dark = true      # or light = true, or omit for auto-detection
[merge]
    conflictStyle = zdiff3

~/personal/.gitconfig

[user]
email = mailgrishy@gmail.com
name = Sergei G.
signingKey = /Users/grishy/.ssh/id_ed25519.pub

[gpg]
format = ssh

[commit]
gpgsign = true

[core]
sshCommand = ssh -i /Users/grishy/.ssh/id_ed25519

~/.ssh/config

Host *
  # Environment Variables
  SetEnv TERM=xterm-256color         # Terminal type for proper color/display rendering
  SetEnv LC_ALL=en_US.UTF-8          # Locale setting for character encoding
  SetEnv LANG=en_US.UTF-8            # Language setting for messages and formatting

  # Key Management (macOS-specific)
  AddKeysToAgent yes                 # Auto-add keys to ssh-agent when first used (stores in agent with default lifetime)
  UseKeychain yes                    # Store passphrases in macOS Keychain (avoids re-entering passphrase)
  IdentitiesOnly yes                 # ONLY use keys specified in config/command line, ignore keys in ssh-agent (prevents wrong key usage)

  # Connection Keep-Alive (prevents idle timeouts)
  ServerAliveInterval 30             # Send encrypted keepalive message every 30s if no data received from server
  ServerAliveCountMax 3              # Disconnect after 3 failed keepalive attempts
  TCPKeepAlive yes                   # Enable TCP-level keepalive (detects dead connections, but spoofable unlike ServerAlive)

Заключение

Вот и весь мой сетап macOS 2025 на двух макбуках. Теперь жонглирую двумя машинами.

Если это поможет тебе настроить свой Mac или открыть для себя новый инструмент — отлично.


Thumbnail
Font: Inter
Photo by Thai Nguyen on Unsplash