diff --git a/src/color/ansi.go b/src/color/ansi.go index 6ceb7cff..60ee21d9 100644 --- a/src/color/ansi.go +++ b/src/color/ansi.go @@ -32,7 +32,8 @@ type Ansi struct { escapeRight string hyperlink string hyperlinkRegex string - pwd string + osc99 string + osc7 string bold string italic string underline string @@ -65,7 +66,8 @@ func (a *Ansi) Init(shellName string) { a.escapeRight = "%}" a.hyperlink = "%%{\x1b]8;;%s\x1b\\%%}%s%%{\x1b]8;;\x1b\\%%}" a.hyperlinkRegex = `(?P%{\x1b]8;;(.+)\x1b\\%}(?P.+)%{\x1b]8;;\x1b\\%})` - a.pwd = "%%{\x1b]%s;\"%s\"\x1b\\%%}" + a.osc99 = "%%{\x1b]9;9;\"%s\"\x1b\\%%}" + a.osc7 = "%%{\x1b]7;file://%s/%s\x1b\\%%}" a.bold = "%%{\x1b[1m%%}%s%%{\x1b[22m%%}" a.italic = "%%{\x1b[3m%%}%s%%{\x1b[23m%%}" a.underline = "%%{\x1b[4m%%}%s%%{\x1b[24m%%}" @@ -92,7 +94,8 @@ func (a *Ansi) Init(shellName string) { a.escapeRight = "\\]" a.hyperlink = "\\[\x1b]8;;%s\x1b\\\\\\]%s\\[\x1b]8;;\x1b\\\\\\]" a.hyperlinkRegex = `(?P\\\[\x1b\]8;;(.+)\x1b\\\\\\\](?P.+)\\\[\x1b\]8;;\x1b\\\\\\\])` - a.pwd = "\\[\x1b]%s;\"%s\"\x1b\\\\\\]" + a.osc99 = "\\[\x1b]9;9;\"%s\"\x1b\\\\\\]" + a.osc7 = "\\[\x1b]7;file://%s/%s\x1b\\\\]" a.bold = "\\[\x1b[1m\\]%s\\[\x1b[22m\\]" a.italic = "\\[\x1b[3m\\]%s\\[\x1b[23m\\]" a.underline = "\\[\x1b[4m\\]%s\\[\x1b[24m\\]" @@ -119,7 +122,8 @@ func (a *Ansi) Init(shellName string) { a.escapeRight = "" a.hyperlink = "\x1b]8;;%s\x1b\\%s\x1b]8;;\x1b\\" a.hyperlinkRegex = "(?P\x1b]8;;(.+)\x1b\\\\\\\\?(?P.+)\x1b]8;;\x1b\\\\)" - a.pwd = "\x1b]%s;\"%s\"\x1b\\" + a.osc99 = "\x1b]9;9;\"%s\"\x1b\\" + a.osc7 = "\x1b]7;file://%s/%s\x1b\\" a.bold = "\x1b[1m%s\x1b[22m" a.italic = "\x1b[3m%s\x1b[23m" a.underline = "\x1b[4m%s\x1b[24m" @@ -243,17 +247,17 @@ func (a *Ansi) ChangeLine(numberOfLines int) string { return fmt.Sprintf(a.linechange, numberOfLines, position) } -func (a *Ansi) ConsolePwd(pwdType, pwd string) string { +func (a *Ansi) ConsolePwd(pwdType, hostName, pwd string) string { if strings.HasSuffix(pwd, ":") { pwd += "\\" } switch pwdType { case OSC7: - return fmt.Sprintf(a.pwd, "7", pwd) + return fmt.Sprintf(a.osc7, hostName, pwd) case OSC99: fallthrough default: - return fmt.Sprintf(a.pwd, "9;9", pwd) + return fmt.Sprintf(a.osc99, pwd) } } diff --git a/src/engine/engine.go b/src/engine/engine.go index 19cba427..ded15381 100644 --- a/src/engine/engine.go +++ b/src/engine/engine.go @@ -85,7 +85,7 @@ func (e *Engine) printPWD() { cwd := e.Env.Pwd() // Backwards compatibility for deprecated OSC99 if e.Config.OSC99 { - e.writeANSI(e.Ansi.ConsolePwd(color.OSC99, cwd)) + e.writeANSI(e.Ansi.ConsolePwd(color.OSC99, "", cwd)) return } // Allow template logic to define when to enable the PWD (when supported) @@ -97,7 +97,8 @@ func (e *Engine) printPWD() { if err != nil || len(pwdType) == 0 { return } - e.writeANSI(e.Ansi.ConsolePwd(pwdType, cwd)) + host, _ := e.Env.Host() + e.writeANSI(e.Ansi.ConsolePwd(pwdType, host, cwd)) } func (e *Engine) newline() { diff --git a/src/engine/engine_test.go b/src/engine/engine_test.go index 9a230778..d3f79892 100644 --- a/src/engine/engine_test.go +++ b/src/engine/engine_test.go @@ -53,16 +53,17 @@ func TestPrintPWD(t *testing.T) { }{ {Case: "Empty PWD"}, {Case: "OSC99", PWD: color.OSC99, Expected: "\x1b]9;9;\"pwd\"\x1b\\"}, - {Case: "OSC7", PWD: color.OSC7, Expected: "\x1b]7;\"pwd\"\x1b\\"}, + {Case: "OSC7", PWD: color.OSC7, Expected: "\x1b]7;file://host/pwd\x1b\\"}, {Case: "Deprecated OSC99", OSC99: true, Expected: "\x1b]9;9;\"pwd\"\x1b\\"}, {Case: "Template (empty)", PWD: "{{ if eq .Shell \"pwsh\" }}osc7{{ end }}"}, - {Case: "Template (non empty)", PWD: "{{ if eq .Shell \"shell\" }}osc7{{ end }}", Expected: "\x1b]7;\"pwd\"\x1b\\"}, + {Case: "Template (non empty)", PWD: "{{ if eq .Shell \"shell\" }}osc7{{ end }}", Expected: "\x1b]7;file://host/pwd\x1b\\"}, } for _, tc := range cases { env := new(mock.MockedEnvironment) env.On("Pwd").Return("pwd") env.On("Shell").Return("shell") + env.On("Host").Return("host", nil) env.On("TemplateCache").Return(&environment.TemplateCache{ Env: make(map[string]string), Shell: "shell",