diff --git a/src/cli/font.go b/src/cli/font.go index cf1070ed18f4..a1212445eaa2 100644 --- a/src/cli/font.go +++ b/src/cli/font.go @@ -11,7 +11,8 @@ import ( ) var ( - // fontCmd can work with fonts + ttf bool + fontCmd = &cobra.Command{ Use: "font [install|configure]", Short: "Manage fonts", @@ -46,7 +47,7 @@ This command is used to install fonts and configure the font in your terminal. terminal.Init(env.Shell()) - font.Run(fontName, env) + font.Run(fontName, env.Cache(), env.Root(), ttf) return case "configure": @@ -59,5 +60,6 @@ This command is used to install fonts and configure the font in your terminal. ) func init() { + fontCmd.Flags().BoolVar(&ttf, "ttf", false, "fetch the TTF version of the font") RootCmd.AddCommand(fontCmd) } diff --git a/src/font/cli.go b/src/font/cli.go index 424caf0cc6c8..1a495b1dab7c 100644 --- a/src/font/cli.go +++ b/src/font/cli.go @@ -10,13 +10,13 @@ import ( "github.com/charmbracelet/bubbles/spinner" tea "github.com/charmbracelet/bubbletea" "github.com/charmbracelet/lipgloss" - "github.com/jandedobbeleer/oh-my-posh/src/runtime" + cache_ "github.com/jandedobbeleer/oh-my-posh/src/cache" "github.com/jandedobbeleer/oh-my-posh/src/terminal" ) var ( - program *tea.Program - environment runtime.Environment + program *tea.Program + cache cache_.Cache ) const listHeight = 14 @@ -79,6 +79,7 @@ type main struct { spinner spinner.Model state state system bool + ttf bool } func (m *main) buildFontList(nerdFonts []*Asset) { @@ -120,18 +121,18 @@ func downloadFontZip(location string) { program.Send(zipMsg(zipFile)) } -func installLocalFontZIP(zipFile string, user bool) { +func installLocalFontZIP(zipFile string, user, ttf bool) { data, err := os.ReadFile(zipFile) if err != nil { program.Send(errMsg(err)) return } - installFontZIP(data, user) + installFontZIP(data, user, ttf) } -func installFontZIP(zipFile []byte, user bool) { - families, err := InstallZIP(zipFile, user) +func installFontZIP(zipFile []byte, user, ttf bool) { + families, err := InstallZIP(zipFile, user, ttf) if err != nil { program.Send(errMsg(err)) return @@ -159,7 +160,7 @@ func (m *main) Init() tea.Cmd { defer func() { if isLocalZipFile() { - go installLocalFontZIP(m.font, m.system) + go installLocalFontZIP(m.font, m.system, m.ttf) return } go getFontsList() @@ -239,7 +240,7 @@ func (m *main) Update(msg tea.Msg) (tea.Model, tea.Cmd) { case zipMsg: m.state = installFont defer func() { - go installFontZIP(msg, m.system) + go installFontZIP(msg, m.system, m.ttf) }() m.spinner.Spinner = spinner.Dot return m, m.spinner.Tick @@ -290,7 +291,7 @@ func (m *main) View() string { var builder strings.Builder builder.WriteString(fmt.Sprintf("Successfully installed %s 🚀\n\n%s", m.font, terminal.StopProgress())) - builder.WriteString("The following font families are now available for configuration:\n") + builder.WriteString("The following font families are now available for configuration:\n\n") for i, family := range m.families { builder.WriteString(fmt.Sprintf(" • %s", family)) @@ -306,13 +307,14 @@ func (m *main) View() string { return "" } -func Run(font string, env runtime.Environment) { +func Run(font string, ch cache_.Cache, root, ttf bool) { main := &main{ font: font, - system: env.Root(), + system: root, + ttf: ttf, } - environment = env + cache = ch program = tea.NewProgram(main) if _, err := program.Run(); err != nil { diff --git a/src/font/fonts.go b/src/font/fonts.go index 12c53bdf385f..db022f3cb78c 100644 --- a/src/font/fonts.go +++ b/src/font/fonts.go @@ -10,7 +10,7 @@ import ( "strings" "time" - "github.com/jandedobbeleer/oh-my-posh/src/cache" + cache_ "github.com/jandedobbeleer/oh-my-posh/src/cache" "github.com/jandedobbeleer/oh-my-posh/src/runtime/http" ) @@ -50,11 +50,11 @@ func Fonts() ([]*Asset, error) { } func getCachedFontData() ([]*Asset, error) { - if environment == nil { + if cache == nil { return nil, errors.New("environment not set") } - list, OK := environment.Cache().Get(cache.FONTLISTCACHE) + list, OK := cache.Get(cache_.FONTLISTCACHE) if !OK { return nil, errors.New("cache not found") } @@ -69,7 +69,7 @@ func getCachedFontData() ([]*Asset, error) { } func setCachedFontData(assets []*Asset) { - if environment == nil { + if cache == nil { return } @@ -78,7 +78,7 @@ func setCachedFontData(assets []*Asset) { return } - environment.Cache().Set(cache.FONTLISTCACHE, string(data), cache.ONEDAY) + cache.Set(cache_.FONTLISTCACHE, string(data), cache_.ONEDAY) } func CascadiaCode() ([]*Asset, error) { diff --git a/src/font/install.go b/src/font/install.go index 326d2b2e5a37..c4feff8bf966 100644 --- a/src/font/install.go +++ b/src/font/install.go @@ -8,6 +8,7 @@ import ( "io" "path" stdruntime "runtime" + "slices" "strings" "github.com/jandedobbeleer/oh-my-posh/src/runtime" @@ -20,10 +21,17 @@ func contains[S ~[]E, E comparable](s S, e E) bool { return true } } + return false } -func InstallZIP(data []byte, user bool) ([]string, error) { +func InstallZIP(data []byte, user, ttf bool) ([]string, error) { + // prefer OTF over TTF; otherwise prefer the first font we find + extension := ".otf" + if ttf { + extension = ".ttf" + } + var families []string bytesReader := bytes.NewReader(data) @@ -45,6 +53,7 @@ func InstallZIP(data []byte, user bool) ([]string, error) { if err != nil { return families, err } + defer rc.Close() data, err := io.ReadAll(rc) @@ -59,13 +68,14 @@ func InstallZIP(data []byte, user bool) ([]string, error) { if _, found := fonts[fontData.Name]; !found { fonts[fontData.Name] = fontData - } else { - // prefer OTF over TTF; otherwise prefer the first font we find - first := strings.ToLower(path.Ext(fonts[fontData.Name].FileName)) - second := strings.ToLower(path.Ext(fontData.FileName)) - if first != second && second == ".otf" { - fonts[fontData.Name] = fontData - } + continue + } + + // respect the user's preference for TTF or OTF + first := strings.ToLower(path.Ext(fonts[fontData.Name].FileName)) + second := strings.ToLower(path.Ext(fontData.FileName)) + if first != second && second == extension { + fonts[fontData.Name] = fontData } } @@ -74,7 +84,7 @@ func InstallZIP(data []byte, user bool) ([]string, error) { return families, err } - if !contains(families, font.Family) { + if found := contains(families, font.Family); !found { families = append(families, font.Family) } } @@ -84,5 +94,7 @@ func InstallZIP(data []byte, user bool) ([]string, error) { _, _ = cmd.Run("fc-cache", "-f") } + slices.Sort(families) + return families, nil } diff --git a/website/docs/installation/fonts.mdx b/website/docs/installation/fonts.mdx index fd6b54fe9c31..3023de004013 100644 --- a/website/docs/installation/fonts.mdx +++ b/website/docs/installation/fonts.mdx @@ -46,6 +46,12 @@ This will present a list of Nerd Font libraries, from which you can select `Mes oh-my-posh font install meslo ``` +By default, Oh My Posh installs the `.otf` version of the font. If you prefer the `.ttf` version, you can specify it with the `--ttf` flag: + +```bash +oh-my-posh font install meslo --ttf +``` +