Repository: JanDeDobbeleer/oh-my-posh
Pull request #3458 (2023-02-05 20:30:36)

fix(fish): do not use the iTerm segment
### Prerequisites

- [x] I have read and understood the [contributing guide][CONTRIBUTING.md]
- [x] The commit message follows the [conventional commits][cc] guidelines
- [x] Tests for the changes have been added (for bug fixes/features)
- [x] Docs have been added/updated (for bug fixes/features)

<!---

Tips:

If you're not comfortable with working with Git, we're working a guide (https://ohmyposh.dev/docs/contributing_git) to help you out.
Oh My Posh advises GitKraken (https://www.gitkraken.com/invite/nQmDPR9D) as your preferred cross platform Git GUI power tool.

-->

[CONTRIBUTING.md]: https://github.com/JanDeDobbeleer/oh-my-posh/blob/main/CONTRIBUTING.md
[cc]: https://www.conventionalcommits.org/en/v1.0.0/#summary



Patch:
diff --git a/src/segments/iterm.go b/src/segments/iterm.go
index 2f38cffa..0e461948 100644
--- a/src/segments/iterm.go
+++ b/src/segments/iterm.go
@@ -5,6 +5,7 @@ import (
 
 	"github.com/jandedobbeleer/oh-my-posh/src/platform"
 	"github.com/jandedobbeleer/oh-my-posh/src/properties"
+	"github.com/jandedobbeleer/oh-my-posh/src/shell"
 )
 
 type ITerm struct {
@@ -21,6 +22,7 @@ func (i *ITerm) Template() string {
 func (i *ITerm) Enabled() bool {
 	promptMark, err := i.getResult()
 	if err != nil {
+		i.env.Error(err)
 		return false
 	}
 	i.PromptMark = promptMark
@@ -35,19 +37,17 @@ func (i *ITerm) getResult() (string, error) {
 		return "", errors.New("Only works with iTerm")
 	}
 
-	// Check to ensure the user has squelched the default mark
+	// Check to ensure the user has squelched the default mark for BASH and ZSH
 	if i.env.Getenv("ITERM2_SQUELCH_MARK") != "1" {
-		return "", errors.New("iTerm default mark enabled (set ITERM2_SQUELCH_MARK=1)")
+		return "", errors.New("iTerm default mark enabled (export ITERM2_SQUELCH_MARK=1)")
 	}
 
 	// Now, set the mark string based on shell (or error out)
 	switch i.env.Shell() {
-	case "zsh":
+	case shell.ZSH:
 		response = `%{$(iterm2_prompt_mark)%}`
-	case "bash":
+	case shell.BASH:
 		response = `\[$(iterm2_prompt_mark)\]`
-	case "fish":
-		response = `iterm2_prompt_mark`
 	default:
 		return "", errors.New("Shell isn't compatible with iTerm Shell Integration")
 	}
diff --git a/website/docs/segments/iterm.mdx b/website/docs/segments/iterm.mdx
index e8a7fc56..f73e5a78 100644
--- a/website/docs/segments/iterm.mdx
+++ b/website/docs/segments/iterm.mdx
@@ -6,12 +6,25 @@ sidebar_label: iTerm
 
 ## What
 
-Inserts the iTerm2 shell integration prompt mark for zsh, bash, and fish.
+Inserts the iTerm2 shell integration prompt mark for zsh, and bash.
 For more information, read the [shell integration page][int-page] on
 the developer's website.
 
 :::info
-You will need to set env var `ITERM2_SQUELCH_MARK = 1` prior to initiating Oh My Posh.
+You will need to add `export ITERM2_SQUELCH_MARK=1` before the shell integration script is sourced.
+:::
+
+:::info Fish shell
+For fish, you can make use of Oh My Posh's `set_poshcontext` function to set the prompt mark. Add the
+following line after initialising Oh My Posh:
+
+```fish
+function set_poshcontext
+  iterm2_prompt_mark
+end
+```
+
+You do not need to add this segment.
 :::
 
 ## Sample Configuration


Test patch:
diff --git a/src/segments/iterm_test.go b/src/segments/iterm_test.go
index c90a5c99..8f874eeb 100644
--- a/src/segments/iterm_test.go
+++ b/src/segments/iterm_test.go
@@ -6,6 +6,7 @@ import (
 	"github.com/jandedobbeleer/oh-my-posh/src/mock"
 
 	"github.com/stretchr/testify/assert"
+	mock2 "github.com/stretchr/testify/mock"
 )
 
 func TestITermSegment(t *testing.T) {
@@ -22,7 +23,7 @@ func TestITermSegment(t *testing.T) {
 		{Case: "default mark", TermProgram: "iTerm.app", Shell: "zsh", Template: "{{ .PromptMark }}", ExpectedDisabled: true},
 		{Case: "zsh", TermProgram: "iTerm.app", SquelchMark: "1", Shell: "zsh", Template: "{{ .PromptMark }}", ExpectedString: `%{$(iterm2_prompt_mark)%}`},
 		{Case: "bash", TermProgram: "iTerm.app", SquelchMark: "1", Shell: "bash", Template: "{{ .PromptMark }}", ExpectedString: `\[$(iterm2_prompt_mark)\]`},
-		{Case: "fish", TermProgram: "iTerm.app", SquelchMark: "1", Shell: "fish", Template: "{{ .PromptMark }}", ExpectedString: `iterm2_prompt_mark`},
+		{Case: "fish", TermProgram: "iTerm.app", SquelchMark: "1", Shell: "fish", Template: "{{ .PromptMark }}", ExpectedDisabled: true},
 		{Case: "pwsh", TermProgram: "iTerm.app", SquelchMark: "1", Shell: "pwsh", Template: "{{ .PromptMark }}", ExpectedDisabled: true},
 		{Case: "gibberishshell", TermProgram: "iTerm.app", SquelchMark: "1", Shell: "jaserhuashf", Template: "{{ .PromptMark }}", ExpectedDisabled: true},
 	}
@@ -33,6 +34,7 @@ func TestITermSegment(t *testing.T) {
 		env.On("Getenv", "TERM_PROGRAM").Return(tc.TermProgram)
 		env.On("Getenv", "ITERM2_SQUELCH_MARK").Return(tc.SquelchMark)
 		env.On("Shell").Return(tc.Shell)
+		env.On("Error", mock2.Anything).Return()
 		iterm := &ITerm{
 			env: env,
 		}