From 4bab59fbd85ff5f01e82df513c3546942bf4d2a0 Mon Sep 17 00:00:00 2001 From: Jan De Dobbeleer Date: Sun, 6 Aug 2023 15:37:25 +0200 Subject: [PATCH] feat(debug): use actual prompt logic --- src/engine/block.go | 30 ------------------------------ src/engine/debug.go | 39 +++++++++++++++++++++------------------ src/engine/segment.go | 25 ++++++++++++++++++------- 3 files changed, 39 insertions(+), 55 deletions(-) diff --git a/src/engine/block.go b/src/engine/block.go index ddf96f54..84bd4738 100644 --- a/src/engine/block.go +++ b/src/engine/block.go @@ -3,7 +3,6 @@ package engine import ( "strings" "sync" - "time" "github.com/jandedobbeleer/oh-my-posh/src/ansi" "github.com/jandedobbeleer/oh-my-posh/src/platform" @@ -77,9 +76,6 @@ func (b *Block) InitPlain(env platform.Environment, config *Config) { } func (b *Block) executeSegmentLogic() { - if b.env.Flags().Debug { - return - } if shouldHideForWidth(b.env, b.MinWidth, b.MaxWidth) { return } @@ -266,29 +262,3 @@ func (b *Block) getPowerlineColor() string { } return b.previousActiveSegment.background() } - -func (b *Block) Debug() (int, []*SegmentTiming) { - var segmentTimings []*SegmentTiming - largestSegmentNameLength := 0 - for _, segment := range b.Segments { - var segmentTiming SegmentTiming - segmentTiming.name = string(segment.Type) - segmentTiming.nameLength = len(segmentTiming.name) - if segmentTiming.nameLength > largestSegmentNameLength { - largestSegmentNameLength = segmentTiming.nameLength - } - b.env.DebugF("Segment: %s", segmentTiming.name) - start := time.Now() - segment.SetEnabled(b.env) - segment.SetText() - segmentTiming.active = segment.Enabled - if segmentTiming.active || segment.style() == Accordion { - b.setActiveSegment(segment) - b.renderActiveSegment() - segmentTiming.text, _ = b.writer.String() - } - segmentTiming.duration = time.Since(start) - segmentTimings = append(segmentTimings, &segmentTiming) - } - return largestSegmentNameLength, segmentTimings -} diff --git a/src/engine/debug.go b/src/engine/debug.go index d6e29996..fc8a51ea 100644 --- a/src/engine/debug.go +++ b/src/engine/debug.go @@ -16,47 +16,50 @@ func (e *Engine) PrintDebug(startTime time.Time, version string) string { sh += fmt.Sprintf(" (%s)", shellVersion) } e.write(fmt.Sprintf("\n%s %s\n", log.Text("Shell:").Green().Bold().Plain(), sh)) - e.write(log.Text("\nSegments:\n\n").Green().Bold().Plain().String()) // console title timing titleStartTime := time.Now() e.Env.Debug("Segment: Title") title := e.getTitleTemplateText() - consoleTitleTiming := &SegmentTiming{ + consoleTitle := &Segment{ name: "ConsoleTitle", nameLength: 12, - active: len(e.Config.ConsoleTitleTemplate) > 0, + Enabled: len(e.Config.ConsoleTitleTemplate) > 0, text: title, duration: time.Since(titleStartTime), } - largestSegmentNameLength := consoleTitleTiming.nameLength + largestSegmentNameLength := consoleTitle.nameLength + + // render prompt + e.write(log.Text("\nPrompt:\n\n").Green().Bold().Plain().String()) + e.write(e.Primary()) + + e.write(log.Text("\n\nSegments:\n\n").Green().Bold().Plain().String()) + + var segments []*Segment + segments = append(segments, consoleTitle) - var segmentTimings []*SegmentTiming - segmentTimings = append(segmentTimings, consoleTitleTiming) - // cache a pointer to the color cycle - cycle = &e.Config.Cycle - // loop each segments of each blocks for _, block := range e.Config.Blocks { - block.Init(e.Env, e.Writer) - longestSegmentName, timings := block.Debug() - segmentTimings = append(segmentTimings, timings...) - if longestSegmentName > largestSegmentNameLength { - largestSegmentNameLength = longestSegmentName + for _, segment := range block.Segments { + segments = append(segments, segment) + if segment.nameLength > largestSegmentNameLength { + largestSegmentNameLength = segment.nameLength + } } } // 22 is the color for false/true and 7 is the reset color largestSegmentNameLength += 22 + 7 - for _, segment := range segmentTimings { + for _, segment := range segments { duration := segment.duration.Milliseconds() var active log.Text - if segment.active { + if segment.Enabled { active = log.Text("true").Yellow() } else { active = log.Text("false").Purple() } - segmentName := fmt.Sprintf("%s(%s)", segment.name, active.Plain()) - e.write(fmt.Sprintf("%-*s - %3d ms - %s\n", largestSegmentNameLength, segmentName, duration, segment.text)) + segmentName := fmt.Sprintf("%s(%s)", segment.Name(), active.Plain()) + e.write(fmt.Sprintf("%-*s - %3d ms\n", largestSegmentNameLength, segmentName, duration)) } e.write(fmt.Sprintf("\n%s %s\n", log.Text("Run duration:").Green().Bold().Plain(), time.Since(startTime))) diff --git a/src/engine/segment.go b/src/engine/segment.go index 7bb003c6..43cb83f5 100644 --- a/src/engine/segment.go +++ b/src/engine/segment.go @@ -49,15 +49,10 @@ type Segment struct { text string styleCache SegmentStyle name string -} -// SegmentTiming holds the timing context for a segment -type SegmentTiming struct { - name string - nameLength int - active bool - text string + // debug info duration time.Duration + nameLength int } // SegmentWriter is the interface used to define what and if to write to the prompt @@ -480,10 +475,24 @@ func (segment *Segment) SetEnabled(env platform.Environment) { fmt.Println(message) segment.Enabled = true }() + + // segment timings for debug purposes + var start time.Time + if env.Flags().Debug { + start = time.Now() + segment.nameLength = len(segment.Name()) + defer func() { + segment.duration = time.Since(start) + }() + } + err := segment.mapSegmentWithWriter(env) if err != nil || !segment.shouldIncludeFolder() { return } + + segment.env.DebugF("Segment: %s", segment.Name()) + // validate toggles if toggles, OK := segment.env.Cache().Get(platform.TOGGLECACHE); OK && len(toggles) > 0 { list := strings.Split(toggles, ",") @@ -493,9 +502,11 @@ func (segment *Segment) SetEnabled(env platform.Environment) { } } } + if shouldHideForWidth(segment.env, segment.MinWidth, segment.MaxWidth) { return } + if segment.writer.Enabled() { segment.Enabled = true env.TemplateCache().AddSegmentData(segment.Name(), segment.writer)