diff --git a/src/config/segment_types.go b/src/config/segment_types.go index 63df09bdc91c..6b4dfedb8ef7 100644 --- a/src/config/segment_types.go +++ b/src/config/segment_types.go @@ -129,6 +129,8 @@ const ( NBGV SegmentType = "nbgv" // NIGHTSCOUT is an open source diabetes system NIGHTSCOUT SegmentType = "nightscout" + // NIM writes the active nim version + NIM SegmentType = "nim" // NIXSHELL writes the active nix shell details NIXSHELL SegmentType = "nix-shell" // NODE writes which node version is currently active @@ -211,6 +213,8 @@ const ( UNITY SegmentType = "unity" // UPGRADE lets you know if you can upgrade Oh My Posh UPGRADE SegmentType = "upgrade" + // V writes the active vlang version + V SegmentType = "v" // VALA writes the active vala version VALA SegmentType = "vala" // WAKATIME writes tracked time spend in dev editors @@ -283,6 +287,7 @@ var Segments = map[SegmentType]func() SegmentWriter{ NBGV: func() SegmentWriter { return &segments.Nbgv{} }, NIGHTSCOUT: func() SegmentWriter { return &segments.Nightscout{} }, NIXSHELL: func() SegmentWriter { return &segments.NixShell{} }, + NIM: func() SegmentWriter { return &segments.Nim{} }, NODE: func() SegmentWriter { return &segments.Node{} }, NPM: func() SegmentWriter { return &segments.Npm{} }, NX: func() SegmentWriter { return &segments.Nx{} }, @@ -323,6 +328,7 @@ var Segments = map[SegmentType]func() SegmentWriter{ UMBRACO: func() SegmentWriter { return &segments.Umbraco{} }, UNITY: func() SegmentWriter { return &segments.Unity{} }, UPGRADE: func() SegmentWriter { return &segments.Upgrade{} }, + V: func() SegmentWriter { return &segments.V{} }, VALA: func() SegmentWriter { return &segments.Vala{} }, WAKATIME: func() SegmentWriter { return &segments.Wakatime{} }, WINREG: func() SegmentWriter { return &segments.WindowsRegistry{} }, diff --git a/src/segments/nim.go b/src/segments/nim.go new file mode 100644 index 000000000000..abaf2a651b98 --- /dev/null +++ b/src/segments/nim.go @@ -0,0 +1,22 @@ +package segments + +type Nim struct { + language +} + +func (n *Nim) Template() string { + return languageTemplate +} + +func (n *Nim) Enabled() bool { + n.extensions = []string{"*.nim", "*.nims"} + + n.commands = []*cmd{ + { + executable: "nim", + args: []string{"--version"}, + regex: `Nim Compiler Version (?P(?P\d+)\.(?P\d+)\.(?P\d+))`, + }, + } + return n.language.Enabled() +} diff --git a/src/segments/nim_test.go b/src/segments/nim_test.go new file mode 100644 index 000000000000..0156daf8e40a --- /dev/null +++ b/src/segments/nim_test.go @@ -0,0 +1,46 @@ +package segments + +import ( + "fmt" + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestNim(t *testing.T) { + cases := []struct { + Case string + ExpectedString string + Version string + }{ + { + Case: "Nim 2.2.0", + ExpectedString: "2.2.0", + Version: "Nim Compiler Version 2.2.0 [MacOSX: arm64]\nCompiled at 2024-11-30\nCopyright (c) 2006-2024 by Andreas Rumpf", + }, + { + Case: "Nim 1.6.12", + ExpectedString: "1.6.12", + Version: "Nim Compiler Version 1.6.12 [Linux: amd64]\nCompiled at 2023-06-15\nCopyright (c) 2006-2023 by Andreas Rumpf", + }, + { + Case: "Nim 2.0.0", + ExpectedString: "2.0.0", + Version: "Nim Compiler Version 2.0.0 [Windows: amd64]\nCompiled at 2023-12-25\nCopyright (c) 2006-2023 by Andreas Rumpf", + }, + } + + for _, tc := range cases { + params := &mockedLanguageParams{ + cmd: "nim", + versionParam: "--version", + versionOutput: tc.Version, + extension: "*.nim", + } + env, props := getMockedLanguageEnv(params) + n := &Nim{} + n.Init(props, env) + assert.True(t, n.Enabled(), fmt.Sprintf("Failed in case: %s", tc.Case)) + assert.Equal(t, tc.ExpectedString, renderTemplate(env, n.Template(), n), fmt.Sprintf("Failed in case: %s", tc.Case)) + } +} diff --git a/src/segments/v.go b/src/segments/v.go new file mode 100644 index 000000000000..8e6b828f7780 --- /dev/null +++ b/src/segments/v.go @@ -0,0 +1,22 @@ +package segments + +type V struct { + language +} + +func (v *V) Template() string { + return languageTemplate +} + +func (v *V) Enabled() bool { + v.extensions = []string{"*.v"} + + v.commands = []*cmd{ + { + executable: "v", + args: []string{"--version"}, + regex: `V (?P(?P\d+)\.(?P\d+)\.(?P\d+)) [a-f0-9]+`, + }, + } + return v.language.Enabled() +} diff --git a/src/segments/v_test.go b/src/segments/v_test.go new file mode 100644 index 000000000000..e5706c72a793 --- /dev/null +++ b/src/segments/v_test.go @@ -0,0 +1,46 @@ +package segments + +import ( + "fmt" + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestV(t *testing.T) { + cases := []struct { + Case string + ExpectedString string + Version string + }{ + { + Case: "V 0.4.9", + ExpectedString: "0.4.9", + Version: "V 0.4.9 b487986", + }, + { + Case: "V 0.4.8", + ExpectedString: "0.4.8", + Version: "V 0.4.8 a123456", + }, + { + Case: "V 0.4.7", + ExpectedString: "0.4.7", + Version: "V 0.4.7 f789012", + }, + } + + for _, tc := range cases { + params := &mockedLanguageParams{ + cmd: "v", + versionParam: "--version", + versionOutput: tc.Version, + extension: "*.v", + } + env, props := getMockedLanguageEnv(params) + v := &V{} + v.Init(props, env) + assert.True(t, v.Enabled(), fmt.Sprintf("Failed in case: %s", tc.Case)) + assert.Equal(t, tc.ExpectedString, renderTemplate(env, v.Template(), v), fmt.Sprintf("Failed in case: %s", tc.Case)) + } +} diff --git a/themes/schema.json b/themes/schema.json index 1318b394b056..3e411826f6e2 100644 --- a/themes/schema.json +++ b/themes/schema.json @@ -357,6 +357,7 @@ "mvn", "nbgv", "nightscout", + "nim", "nix-shell", "node", "npm", @@ -398,6 +399,7 @@ "umbraco", "unity", "upgrade", + "v", "vala", "wakatime", "winreg", @@ -4164,6 +4166,58 @@ } } }, + { + "if": { + "properties": { + "type": { + "const": "v" + } + } + }, + "then": { + "title": "V Segment", + "description": "https://ohmyposh.dev/docs/segments/languages/v", + "properties": { + "properties": { + "properties": { + "home_enabled": { + "$ref": "#/definitions/home_enabled" + }, + "fetch_version": { + "$ref": "#/definitions/fetch_version" + }, + "cache_duration": { + "$ref": "#/definitions/cache_duration", + "default": "none" + }, + "display_mode": { + "$ref": "#/definitions/display_mode" + }, + "missing_command_text": { + "$ref": "#/definitions/missing_command_text" + }, + "version_url_template": { + "$ref": "#/definitions/version_url_template" + }, + "extensions": { + "type": "array", + "title": "Extensions", + "description": "The extensions to look for when determining if the current directory is a V project", + "default": [ + "*.v" + ], + "items": { + "type": "string" + } + }, + "folders": { + "$ref": "#/definitions/folders" + } + } + } + } + } + }, { "if": { "properties": { @@ -4739,6 +4793,56 @@ } } }, + { + "if": { + "properties": { + "type": { + "const": "nim" + } + } + }, + "then": { + "title": "Nim Segment", + "description": "https://ohmyposh.dev/docs/segments/languages/nim", + "properties": { + "properties": { + "properties": { + "home_enabled": { + "$ref": "#/definitions/home_enabled" + }, + "fetch_version": { + "$ref": "#/definitions/fetch_version" + }, + "cache_duration": { + "$ref": "#/definitions/cache_duration", + "default": "none" + }, + "display_mode": { + "$ref": "#/definitions/display_mode" + }, + "missing_command_text": { + "$ref": "#/definitions/missing_command_text" + }, + "version_url_template": { + "$ref": "#/definitions/version_url_template" + }, + "extensions": { + "type": "array", + "title": "Extensions", + "description": "The extensions to look for when determining if a folder is a Nim workspace", + "default": [ + "*.nim", + "*.nims" + ] + }, + "folders": { + "$ref": "#/definitions/folders" + } + } + } + } + } + }, { "if": { "properties": { diff --git a/website/docs/segments/languages/nim.mdx b/website/docs/segments/languages/nim.mdx new file mode 100644 index 000000000000..7f986af2c794 --- /dev/null +++ b/website/docs/segments/languages/nim.mdx @@ -0,0 +1,61 @@ +--- +id: nim +title: Nim +sidebar_label: Nim +--- + +## What + +Display the currently active Nim version. + +## Sample Configuration + +import Config from "@site/src/components/Config.js"; + + + +## Properties + +| Name | Type | Default | Description | +| ---------------------- | :--------: | :---------------------------------: | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `home_enabled` | `boolean` | `false` | display the segment in the HOME folder or not | +| `fetch_version` | `boolean` | `true` | fetch the Nim version (`nim --version`) | +| `cache_duration` | `string` | `none` | the duration for which the version will be cached. The duration is a string in the format `1h2m3s` and is parsed using the [time.ParseDuration] function from the Go standard library. To disable the cache, use `none` | +| `missing_command_text` | `string` | | text to display when the command is missing | +| `display_mode` | `string` | `context` |
  • `always`: the segment is always displayed
  • `files`: the segment is only displayed when file `extensions` listed are present
  • `context`: displays the segment when the environment or files is active
| +| `version_url_template` | `string` | | a go [text/template][go-text-template] [template][templates] that creates the URL of the version info / release notes | +| `extensions` | `[]string` | `*.nim, *.nims` | allows to override the default list of file extensions to validate | +| `folders` | `[]string` | | allows to override the list of folder names to validate | + +## Template ([info][templates]) + +:::note default template + +```template +{{ if .Error }}{{ .Error }}{{ else }}{{ .Full }}{{ end }} +``` + +::: + +### Properties + +| Name | Type | Description | +| ------------- | -------- | -------------------------------------------------- | +| `.Full` | `string` | the full version | +| `.Major` | `string` | major number | +| `.Minor` | `string` | minor number | +| `.Patch` | `string` | patch number | +| `.Error` | `string` | error encountered when fetching the version string | + +[go-text-template]: https://golang.org/pkg/text/template/ +[templates]: /docs/configuration/templates +[time.ParseDuration]: https://golang.org/pkg/time/#ParseDuration \ No newline at end of file diff --git a/website/docs/segments/languages/v.mdx b/website/docs/segments/languages/v.mdx new file mode 100644 index 000000000000..da672897340f --- /dev/null +++ b/website/docs/segments/languages/v.mdx @@ -0,0 +1,62 @@ +--- +id: v +title: V +sidebar_label: V +--- + +## What + +Display the currently active V version. + +## Sample Configuration + +import Config from "@site/src/components/Config.js"; + + + +## Properties + +| Name | Type | Default | Description | +| ---------------------- | :--------: | :---------------------------------: | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `home_enabled` | `boolean` | `false` | display the segment in the HOME folder or not | +| `fetch_version` | `boolean` | `true` | fetch the V version (`v --version`) | +| `cache_duration` | `string` | `none` | the duration for which the version will be cached. The duration is a string in the format `1h2m3s` and is parsed using the [time.ParseDuration] function from the Go standard library. To disable the cache, use `none` | +| `missing_command_text` | `string` | | text to display when the command is missing | +| `display_mode` | `string` | `context` |
  • `always`: the segment is always displayed
  • `files`: the segment is only displayed when file `extensions` listed are present
  • `context`: displays the segment when the environment or files is active
| +| `version_url_template` | `string` | | a go [text/template][go-text-template] [template][templates] that creates the URL of the version info / release notes | +| `extensions` | `[]string` | `*.v` | allows to override the default list of file extensions to validate | +| `folders` | `[]string` | | allows to override the list of folder names to validate | + +## Template ([info][templates]) + +:::note default template + +```template +{{ if .Error }}{{ .Error }}{{ else }}{{ .Full }}{{ end }} +``` + +::: + +### Properties + +| Name | Type | Description | +| ------------- | -------- | -------------------------------------------------- | +| `.Full` | `string` | the full version (e.g., "0.4.9") | +| `.Major` | `string` | major number (e.g., "0") | +| `.Minor` | `string` | minor number (e.g., "4") | +| `.Patch` | `string` | patch number (e.g., "9") | +| `.Commit` | `string` | commit hash (e.g., "b487986") | +| `.Error` | `string` | error encountered when fetching the version string | + +[go-text-template]: https://golang.org/pkg/text/template/ +[templates]: /docs/configuration/templates +[time.ParseDuration]: https://golang.org/pkg/time/#ParseDuration \ No newline at end of file diff --git a/website/sidebars.js b/website/sidebars.js index d3326e30ea8b..05b6878a53b7 100644 --- a/website/sidebars.js +++ b/website/sidebars.js @@ -137,6 +137,7 @@ module.exports = { "segments/languages/kotlin", "segments/languages/lua", "segments/languages/mojo", + "segments/languages/nim", "segments/languages/node", "segments/languages/ocaml", "segments/languages/perl", @@ -146,6 +147,7 @@ module.exports = { "segments/languages/ruby", "segments/languages/rust", "segments/languages/swift", + "segments/languages/v", "segments/languages/vala", "segments/languages/zig", ]