Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,12 @@ public struct TerminalCatalogSection: SettingCatalogSection {
userDefaultsKey: "terminal.autoResumeAgentSessions"
)

public let regexHighlights = DefaultsKey<String>(
id: "terminal.regexHighlights",
defaultValue: "",
userDefaultsKey: "terminal.regexHighlights"
)

public let agentHibernationEnabled = DefaultsKey<Bool>(
id: "terminal.agentHibernation.enabled",
defaultValue: false,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,7 @@ extension Array where Element == CuratedSettingEntry {
.init(section: .terminal, id: "scrollbar", title: "Show Terminal Scroll Bar", synonyms: "terminal.showScrollBar scrollback scrollbar scroll bar right edge alternate screen tui"),
.init(section: .terminal, id: "copy-on-select", title: "Copy on Selection", synonyms: "terminal.copyOnSelect copy on selection select clipboard mouse double click triple click iterm"),
.init(section: .terminal, id: "agent-auto-resume", title: "Resume Agent Sessions on Reopen", synonyms: "terminal.autoResumeAgentSessions auto resume restore reopen relaunch quit sessions agents claude code codex opencode rovo dev rovodev toggle"),
.init(section: .terminal, id: "regex-highlights", title: "Automatic Text Highlights", synonyms: "terminal.regexHighlights regex regular expression highlight alert error warning terminal text"),
.init(section: .terminal, id: "agent-hibernation", title: "Agent Hibernation", synonyms: "terminal.agentHibernation.enabled idle hibernate suspend background agents claude code codex opencode live terminals"),
.init(section: .terminal, id: "agent-hibernation-idle", title: "Hibernate After Idle Seconds", synonyms: "terminal.agentHibernation.idleSeconds idle seconds timeout delay hibernate suspend"),
.init(section: .terminal, id: "agent-hibernation-max", title: "Max Live Agent Terminals", synonyms: "terminal.agentHibernation.maxLiveTerminals max live agent terminals limit count hibernate"),
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import AppKit
import CmuxSettings
import SwiftUI

Expand All @@ -17,6 +18,7 @@ public struct TerminalSection: View {
@State private var scrollBar: DefaultsValueModel<Bool>
@State private var copyOnSelect: DefaultsValueModel<Bool>
@State private var autoResume: DefaultsValueModel<Bool>
@State private var regexHighlights: DefaultsValueModel<String>
@State private var hibernation: DefaultsValueModel<Bool>
@State private var idleSeconds: DefaultsValueModel<Double>
@State private var maxLive: DefaultsValueModel<Int>
Expand All @@ -34,6 +36,7 @@ public struct TerminalSection: View {
_scrollBar = State(initialValue: DefaultsValueModel(store: defaultsStore, key: catalog.terminal.showScrollBar))
_copyOnSelect = State(initialValue: DefaultsValueModel(store: defaultsStore, key: catalog.terminal.copyOnSelect))
_autoResume = State(initialValue: DefaultsValueModel(store: defaultsStore, key: catalog.terminal.autoResumeAgentSessions))
_regexHighlights = State(initialValue: DefaultsValueModel(store: defaultsStore, key: catalog.terminal.regexHighlights))
_hibernation = State(initialValue: DefaultsValueModel(store: defaultsStore, key: catalog.terminal.agentHibernationEnabled))
_idleSeconds = State(initialValue: DefaultsValueModel(store: defaultsStore, key: catalog.terminal.agentHibernationIdleSeconds))
_maxLive = State(initialValue: DefaultsValueModel(store: defaultsStore, key: catalog.terminal.agentHibernationMaxLiveTerminals))
Expand Down Expand Up @@ -168,6 +171,8 @@ public struct TerminalSection: View {
.accessibilityIdentifier("SettingsTerminalAgentAutoResumeToggle")
}
SettingsCardDivider()
regexHighlightsRow
SettingsCardDivider()
SettingsCardRow(
configurationReview: .json("terminal.agentHibernation.enabled"),
String(localized: "settings.terminal.agentHibernation", defaultValue: "Agent Hibernation"),
Expand Down Expand Up @@ -213,4 +218,45 @@ public struct TerminalSection: View {
}
}

private var regexHighlightsBinding: Binding<String> {
Binding(
get: { regexHighlights.current },
set: { regexHighlights.set($0) }
)
}

@ViewBuilder
private var regexHighlightsRow: some View {
VStack(alignment: .leading, spacing: 6) {
SettingsCardRow(
configurationReview: .json("terminal.regexHighlights"),
String(localized: "settings.terminal.regexHighlights", defaultValue: "Automatic Text Highlights"),
subtitle: String(
localized: "settings.terminal.regexHighlights.subtitle",
defaultValue: "Highlights visible terminal text that matches a regex. One pattern per line; prefix with #RRGGBB or #RRGGBBAA and a tab to choose the highlight color."
)
) {
EmptyView()
}

TextEditor(text: regexHighlightsBinding)
.font(.system(.body, design: .monospaced))
.frame(minHeight: 60, maxHeight: 120)
.scrollContentBackground(.hidden)
.padding(6)
.background(Color(nsColor: .controlBackgroundColor))
.cornerRadius(6)
.overlay(
RoundedRectangle(cornerRadius: 6)
.stroke(Color(nsColor: .separatorColor), lineWidth: 0.5)
)
.padding(.horizontal, 14)
.padding(.bottom, 10)
.accessibilityIdentifier("SettingsTerminalRegexHighlightsEditor")
.accessibilityLabel(
String(localized: "settings.terminal.regexHighlights", defaultValue: "Automatic Text Highlights")
)
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,7 @@ struct SettingsRowAnchorResolutionTests {
"terminal.agentHibernation.maxLiveTerminals",
"terminal.autoResumeAgentSessions",
"terminal.copyOnSelect",
"terminal.regexHighlights",
"terminal.resumeCommands",
"terminal.focusTextBoxOnNewTerminals",
"terminal.showScrollBar",
Expand Down
2 changes: 2 additions & 0 deletions Resources/Localizable.xcstrings
Original file line number Diff line number Diff line change
Expand Up @@ -148971,6 +148971,8 @@
}
}
},
"settings.terminal.regexHighlights": {"extractionState":"manual","localizations":{"ar":{"stringUnit":{"state":"translated","value":"تمييز النص التلقائي"}},"bs":{"stringUnit":{"state":"translated","value":"Automatsko isticanje teksta"}},"da":{"stringUnit":{"state":"translated","value":"Automatiske tekstmarkeringer"}},"de":{"stringUnit":{"state":"translated","value":"Automatische Texthervorhebungen"}},"en":{"stringUnit":{"state":"translated","value":"Automatic Text Highlights"}},"es":{"stringUnit":{"state":"translated","value":"Resaltados automáticos de texto"}},"fr":{"stringUnit":{"state":"translated","value":"Surlignages automatiques du texte"}},"it":{"stringUnit":{"state":"translated","value":"Evidenziazioni automatiche del testo"}},"ja":{"stringUnit":{"state":"translated","value":"自動テキストハイライト"}},"km":{"stringUnit":{"state":"translated","value":"ការបន្លិចអត្ថបទដោយស្វ័យប្រវត្តិ"}},"ko":{"stringUnit":{"state":"translated","value":"자동 텍스트 강조"}},"nb":{"stringUnit":{"state":"translated","value":"Automatiske tekstuthevinger"}},"pl":{"stringUnit":{"state":"translated","value":"Automatyczne wyróżnienia tekstu"}},"pt-BR":{"stringUnit":{"state":"translated","value":"Destaques automáticos de texto"}},"ru":{"stringUnit":{"state":"translated","value":"Автоматическая подсветка текста"}},"th":{"stringUnit":{"state":"translated","value":"การไฮไลต์ข้อความอัตโนมัติ"}},"tr":{"stringUnit":{"state":"translated","value":"Otomatik Metin Vurgulamaları"}},"uk":{"stringUnit":{"state":"translated","value":"Автоматичне підсвічування тексту"}},"zh-Hans":{"stringUnit":{"state":"translated","value":"自动文本高亮"}},"zh-Hant":{"stringUnit":{"state":"translated","value":"自動文字醒目提示"}}}},
"settings.terminal.regexHighlights.subtitle": {"extractionState":"manual","localizations":{"ar":{"stringUnit":{"state":"translated","value":"يميّز نص الطرفية المرئي الذي يطابق تعبيرًا منتظمًا. نمط واحد في كل سطر؛ ابدأ السطر بـ #RRGGBB أو #RRGGBBAA ثم Tab لاختيار لون التمييز."}},"bs":{"stringUnit":{"state":"translated","value":"Ističe vidljivi tekst terminala koji odgovara regularnom izrazu. Jedan uzorak po redu; dodajte #RRGGBB ili #RRGGBBAA i tabulator na početak da odaberete boju isticanja."}},"da":{"stringUnit":{"state":"translated","value":"Markerer synlig terminaltekst, der matcher et regulært udtryk. Ét mønster pr. linje; sæt #RRGGBB eller #RRGGBBAA og en tabulator foran for at vælge markeringsfarven."}},"de":{"stringUnit":{"state":"translated","value":"Hebt sichtbaren Terminaltext hervor, der einem regulären Ausdruck entspricht. Ein Muster pro Zeile; stellen Sie #RRGGBB oder #RRGGBBAA und einen Tabulator voran, um die Hervorhebungsfarbe zu wählen."}},"en":{"stringUnit":{"state":"translated","value":"Highlights visible terminal text that matches a regex. One pattern per line; prefix with #RRGGBB or #RRGGBBAA and a tab to choose the highlight color."}},"es":{"stringUnit":{"state":"translated","value":"Resalta el texto visible de la terminal que coincide con una expresión regular. Un patrón por línea; anteponga #RRGGBB o #RRGGBBAA y una tabulación para elegir el color de resaltado."}},"fr":{"stringUnit":{"state":"translated","value":"Surligne le texte visible du terminal qui correspond à une expression régulière. Un motif par ligne; préfixez avec #RRGGBB ou #RRGGBBAA et une tabulation pour choisir la couleur de surlignage."}},"it":{"stringUnit":{"state":"translated","value":"Evidenzia il testo visibile del terminale che corrisponde a un'espressione regolare. Un pattern per riga; anteponi #RRGGBB o #RRGGBBAA e una tabulazione per scegliere il colore dell'evidenziazione."}},"ja":{"stringUnit":{"state":"translated","value":"正規表現に一致する表示中のターミナルテキストをハイライトします。1 行に 1 パターンを入力し、#RRGGBB または #RRGGBBAA とタブを先頭に付けると色を指定できます。"}},"km":{"stringUnit":{"state":"translated","value":"បន្លិចអត្ថបទស្ថានីយដែលមើលឃើញដែលត្រូវនឹង regex។ មួយលំនាំក្នុងមួយបន្ទាត់; ដាក់ #RRGGBB ឬ #RRGGBBAA និង Tab នៅខាងមុខ ដើម្បីជ្រើសពណ៌បន្លិច។"}},"ko":{"stringUnit":{"state":"translated","value":"정규식과 일치하는 보이는 터미널 텍스트를 강조합니다. 한 줄에 패턴 하나를 입력하고, 강조 색상을 선택하려면 앞에 #RRGGBB 또는 #RRGGBBAA와 탭을 붙이세요."}},"nb":{"stringUnit":{"state":"translated","value":"Uthever synlig terminaltekst som samsvarer med et regulært uttrykk. Ett mønster per linje; bruk #RRGGBB eller #RRGGBBAA og en tabulator foran for å velge uthevingsfarge."}},"pl":{"stringUnit":{"state":"translated","value":"Wyróżnia widoczny tekst terminala pasujący do wyrażenia regularnego. Jeden wzorzec na wiersz; poprzedź go #RRGGBB lub #RRGGBBAA oraz tabulatorem, aby wybrać kolor wyróżnienia."}},"pt-BR":{"stringUnit":{"state":"translated","value":"Destaca o texto visível do terminal que corresponde a uma regex. Um padrão por linha; prefixe com #RRGGBB ou #RRGGBBAA e uma tabulação para escolher a cor do destaque."}},"ru":{"stringUnit":{"state":"translated","value":"Подсвечивает видимый текст терминала, совпадающий с регулярным выражением. Один шаблон на строку; добавьте в начало #RRGGBB или #RRGGBBAA и табуляцию, чтобы выбрать цвет подсветки."}},"th":{"stringUnit":{"state":"translated","value":"ไฮไลต์ข้อความเทอร์มินัลที่มองเห็นซึ่งตรงกับ regex หนึ่งรูปแบบต่อบรรทัด; ใส่ #RRGGBB หรือ #RRGGBBAA และแท็บนำหน้าเพื่อเลือกสีไฮไลต์"}},"tr":{"stringUnit":{"state":"translated","value":"Regex ile eşleşen görünür terminal metnini vurgular. Satır başına bir desen kullanın; vurgu rengini seçmek için başına #RRGGBB veya #RRGGBBAA ve bir sekme ekleyin."}},"uk":{"stringUnit":{"state":"translated","value":"Підсвічує видимий текст термінала, що відповідає регулярному виразу. Один шаблон на рядок; додайте на початок #RRGGBB або #RRGGBBAA і табуляцію, щоб вибрати колір підсвічування."}},"zh-Hans":{"stringUnit":{"state":"translated","value":"高亮显示与正则表达式匹配的可见终端文本。每行一个模式;在前面加上 #RRGGBB 或 #RRGGBBAA 和一个制表符可选择高亮颜色。"}},"zh-Hant":{"stringUnit":{"state":"translated","value":"醒目提示符合正規表示式的可見終端機文字。每行一個模式;在前面加上 #RRGGBB 或 #RRGGBBAA 和一個 Tab,可選擇醒目提示顏色。"}}}},
"settings.terminal.resumeCommands": {
"extractionState": "manual",
"localizations": {
Expand Down
Loading
Loading