mirror of
https://github.com/JanDeDobbeleer/oh-my-posh.git
synced 2024-12-25 02:54:03 -08:00
feat(path): add agnoster right
This commit is contained in:
parent
cbf8a31e72
commit
544a05d458
|
@ -61,6 +61,8 @@ const (
|
||||||
Letter string = "letter"
|
Letter string = "letter"
|
||||||
// Unique like agnoster, but with the first unique letters of each folder name
|
// Unique like agnoster, but with the first unique letters of each folder name
|
||||||
Unique string = "unique"
|
Unique string = "unique"
|
||||||
|
// AgnosterRight like agnoster, but keeps the right side of the path
|
||||||
|
AgnosterRight string = "agnoster_right"
|
||||||
// AgnosterLeft like agnoster, but keeps the left side of the path
|
// AgnosterLeft like agnoster, but keeps the left side of the path
|
||||||
AgnosterLeft string = "agnoster_left"
|
AgnosterLeft string = "agnoster_left"
|
||||||
// Powerlevel tries to mimic the powerlevel10k path,
|
// Powerlevel tries to mimic the powerlevel10k path,
|
||||||
|
@ -183,7 +185,7 @@ func (pt *Path) setStyle() {
|
||||||
pt.Path = pt.root
|
pt.Path = pt.root
|
||||||
|
|
||||||
if strings.HasSuffix(pt.Path, ":") {
|
if strings.HasSuffix(pt.Path, ":") {
|
||||||
pt.Path += pt.getFolderSeparator()
|
pt.Path += pt.pathSeparator
|
||||||
}
|
}
|
||||||
|
|
||||||
return
|
return
|
||||||
|
@ -204,6 +206,9 @@ func (pt *Path) setStyle() {
|
||||||
pt.Path = pt.getUniqueLettersPath(0)
|
pt.Path = pt.getUniqueLettersPath(0)
|
||||||
case AgnosterLeft:
|
case AgnosterLeft:
|
||||||
pt.Path = pt.getAgnosterLeftPath()
|
pt.Path = pt.getAgnosterLeftPath()
|
||||||
|
case AgnosterRight:
|
||||||
|
maxWidth := pt.getMaxWidth()
|
||||||
|
pt.Path = pt.getAgnosterRightPath(maxWidth)
|
||||||
case Short:
|
case Short:
|
||||||
// "short" is a duplicate of "full", just here for backwards compatibility
|
// "short" is a duplicate of "full", just here for backwards compatibility
|
||||||
fallthrough
|
fallthrough
|
||||||
|
@ -326,6 +331,59 @@ func (pt *Path) getAgnosterPath() string {
|
||||||
return pt.colorizePath(pt.root, elements)
|
return pt.colorizePath(pt.root, elements)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (pt *Path) getAgnosterRightPath(maxWidth int) string {
|
||||||
|
folderIcon := pt.props.GetString(FolderIcon, "..")
|
||||||
|
|
||||||
|
if pt.root == pt.pathSeparator {
|
||||||
|
pt.root = pt.Folders[0].Name
|
||||||
|
pt.Folders = pt.Folders[1:]
|
||||||
|
}
|
||||||
|
|
||||||
|
elements := []string{pt.root}
|
||||||
|
elements = append(elements, pt.Folders.List()...)
|
||||||
|
|
||||||
|
if maxWidth <= 0 {
|
||||||
|
return pt.colorizePath(pt.root, elements[1:])
|
||||||
|
}
|
||||||
|
|
||||||
|
n := len(pt.Folders)
|
||||||
|
separator := pt.getFolderSeparator()
|
||||||
|
|
||||||
|
for i := n - 2; i >= 0; i-- {
|
||||||
|
if len(strings.Join(elements, separator)) >= maxWidth {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
elements[i] = folderIcon
|
||||||
|
}
|
||||||
|
|
||||||
|
// for i := 0; i < n; i++ {
|
||||||
|
// elements = append(elements, folderIcon)
|
||||||
|
// }
|
||||||
|
|
||||||
|
// if n > 0 {
|
||||||
|
// elements = append(elements, pt.Folders[n-1].Name)
|
||||||
|
// }
|
||||||
|
|
||||||
|
// if n <= 1 {
|
||||||
|
// return pt.colorizePath(pt.root, elements)
|
||||||
|
// }
|
||||||
|
|
||||||
|
// separator := pt.getFolderSeparator()
|
||||||
|
|
||||||
|
// // loop folders backwards
|
||||||
|
// for i := n - 2; i >= 0; i-- {
|
||||||
|
// if len(strings.Join(elements, separator)) <= maxWidth {
|
||||||
|
// elements[i] = pt.Folders[i].Name
|
||||||
|
// continue
|
||||||
|
// }
|
||||||
|
|
||||||
|
// break
|
||||||
|
// }
|
||||||
|
|
||||||
|
return pt.colorizePath(pt.root, elements[1:])
|
||||||
|
}
|
||||||
|
|
||||||
func (pt *Path) getAgnosterLeftPath() string {
|
func (pt *Path) getAgnosterLeftPath() string {
|
||||||
folderIcon := pt.props.GetString(FolderIcon, "..")
|
folderIcon := pt.props.GetString(FolderIcon, "..")
|
||||||
|
|
||||||
|
|
|
@ -346,7 +346,7 @@ func TestAgnosterPathStyles(t *testing.T) {
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
Style: Letter,
|
Style: Letter,
|
||||||
Expected: "C: > ",
|
Expected: "C:\\",
|
||||||
HomePath: homeDirWindows,
|
HomePath: homeDirWindows,
|
||||||
Pwd: "C:\\",
|
Pwd: "C:\\",
|
||||||
GOOS: platform.WINDOWS,
|
GOOS: platform.WINDOWS,
|
||||||
|
@ -645,7 +645,7 @@ func TestAgnosterPathStyles(t *testing.T) {
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
Style: AgnosterShort,
|
Style: AgnosterShort,
|
||||||
Expected: "C: | ",
|
Expected: "C:/",
|
||||||
HomePath: homeDir,
|
HomePath: homeDir,
|
||||||
Pwd: "/mnt/c",
|
Pwd: "/mnt/c",
|
||||||
Pswd: "C:",
|
Pswd: "C:",
|
||||||
|
@ -676,7 +676,7 @@ func TestAgnosterPathStyles(t *testing.T) {
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
Style: AgnosterShort,
|
Style: AgnosterShort,
|
||||||
Expected: "C: > ",
|
Expected: "C:\\",
|
||||||
HomePath: homeDirWindows,
|
HomePath: homeDirWindows,
|
||||||
Pwd: "C:",
|
Pwd: "C:",
|
||||||
GOOS: platform.WINDOWS,
|
GOOS: platform.WINDOWS,
|
||||||
|
@ -1390,6 +1390,177 @@ func TestAgnosterLeftPath(t *testing.T) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestAgnosterRightPath(t *testing.T) {
|
||||||
|
cases := []struct {
|
||||||
|
Case string
|
||||||
|
Expected string
|
||||||
|
Home string
|
||||||
|
PWD string
|
||||||
|
GOOS string
|
||||||
|
MaxWidth int
|
||||||
|
PathSeparator string
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
Case: "Windows inside home, no max width",
|
||||||
|
Expected: "~ > Documents > Bill > location",
|
||||||
|
Home: homeDirWindows,
|
||||||
|
PWD: homeDirWindows + "\\Documents\\Bill\\location",
|
||||||
|
GOOS: platform.WINDOWS,
|
||||||
|
PathSeparator: "\\",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Case: "Windows inside home zero levels, no max width",
|
||||||
|
Expected: "C: > location",
|
||||||
|
Home: homeDirWindows,
|
||||||
|
PWD: "C:\\location",
|
||||||
|
GOOS: platform.WINDOWS,
|
||||||
|
PathSeparator: "\\",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Case: "Windows root drive, no max width",
|
||||||
|
Expected: "C:\\",
|
||||||
|
Home: homeDirWindows,
|
||||||
|
PWD: "C:\\",
|
||||||
|
GOOS: platform.WINDOWS,
|
||||||
|
PathSeparator: "\\",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Case: "Windows inside home one level, maxwidth 24",
|
||||||
|
Expected: "C: > Program Files > location",
|
||||||
|
Home: homeDirWindows,
|
||||||
|
PWD: "C:\\Program Files\\location",
|
||||||
|
GOOS: platform.WINDOWS,
|
||||||
|
PathSeparator: "\\",
|
||||||
|
MaxWidth: 24,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Case: "Windows inside home one level, maxwidth 20",
|
||||||
|
Expected: "C: > f > location",
|
||||||
|
Home: homeDirWindows,
|
||||||
|
PWD: "C:\\Program Files\\location",
|
||||||
|
GOOS: platform.WINDOWS,
|
||||||
|
PathSeparator: "\\",
|
||||||
|
MaxWidth: 20,
|
||||||
|
},
|
||||||
|
// {
|
||||||
|
// Case: "Windows lower case drive letter",
|
||||||
|
// Expected: "C: > Windows",
|
||||||
|
// Home: homeDirWindows,
|
||||||
|
// PWD: "C:\\Windows\\",
|
||||||
|
// GOOS: platform.WINDOWS,
|
||||||
|
// PathSeparator: "\\",
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// Case: "Windows lower case drive letter (other)",
|
||||||
|
// Expected: "P: > Other",
|
||||||
|
// Home: homeDirWindows,
|
||||||
|
// PWD: "P:\\Other\\",
|
||||||
|
// GOOS: platform.WINDOWS,
|
||||||
|
// PathSeparator: "\\",
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// Case: "Windows lower word drive",
|
||||||
|
// Expected: "some: > some",
|
||||||
|
// Home: homeDirWindows,
|
||||||
|
// PWD: "some:\\some\\",
|
||||||
|
// GOOS: platform.WINDOWS,
|
||||||
|
// PathSeparator: "\\",
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// Case: "Windows lower word drive (ending with c)",
|
||||||
|
// Expected: "src: > source",
|
||||||
|
// Home: homeDirWindows,
|
||||||
|
// PWD: "src:\\source\\",
|
||||||
|
// GOOS: platform.WINDOWS,
|
||||||
|
// PathSeparator: "\\",
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// Case: "Windows lower word drive (arbitrary cases)",
|
||||||
|
// Expected: "sRc: > source",
|
||||||
|
// Home: homeDirWindows,
|
||||||
|
// PWD: "sRc:\\source\\",
|
||||||
|
// GOOS: platform.WINDOWS,
|
||||||
|
// PathSeparator: "\\",
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// Case: "Windows registry drive",
|
||||||
|
// Expected: "\uf013 > SOFTWARE > f",
|
||||||
|
// Home: homeDirWindows,
|
||||||
|
// PWD: "HKLM:\\SOFTWARE\\magnetic:test\\",
|
||||||
|
// GOOS: platform.WINDOWS,
|
||||||
|
// PathSeparator: "\\",
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// Case: "Windows registry drive case sensitive",
|
||||||
|
// Expected: "\uf013 > SOFTWARE > f",
|
||||||
|
// Home: homeDirWindows,
|
||||||
|
// PWD: "HKLM:\\SOFTWARE\\magnetic:TOAST\\",
|
||||||
|
// GOOS: platform.WINDOWS,
|
||||||
|
// PathSeparator: "\\",
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// Case: "Unix outside home",
|
||||||
|
// Expected: "mnt > go > f > f",
|
||||||
|
// Home: homeDir,
|
||||||
|
// PWD: "/mnt/go/test/location",
|
||||||
|
// PathSeparator: "/",
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// Case: "Unix inside home",
|
||||||
|
// Expected: "~ > docs > f > f",
|
||||||
|
// Home: homeDir,
|
||||||
|
// PWD: homeDir + "/docs/jan/location",
|
||||||
|
// PathSeparator: "/",
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// Case: "Unix outside home zero levels",
|
||||||
|
// Expected: "mnt > location",
|
||||||
|
// Home: homeDir,
|
||||||
|
// PWD: "/mnt/location",
|
||||||
|
// PathSeparator: "/",
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// Case: "Unix outside home one level",
|
||||||
|
// Expected: "mnt > folder > f",
|
||||||
|
// Home: homeDir,
|
||||||
|
// PWD: "/mnt/folder/location",
|
||||||
|
// PathSeparator: "/",
|
||||||
|
// },
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, tc := range cases {
|
||||||
|
env := new(mock.MockedEnvironment)
|
||||||
|
env.On("Home").Return(tc.Home)
|
||||||
|
env.On("PathSeparator").Return(tc.PathSeparator)
|
||||||
|
env.On("Pwd").Return(tc.PWD)
|
||||||
|
env.On("GOOS").Return(tc.GOOS)
|
||||||
|
args := &platform.Flags{
|
||||||
|
PSWD: tc.PWD,
|
||||||
|
}
|
||||||
|
|
||||||
|
env.On("Flags").Return(args)
|
||||||
|
env.On("Shell").Return(shell.PWSH)
|
||||||
|
env.On("DebugF", mock2.Anything, mock2.Anything).Return(nil)
|
||||||
|
|
||||||
|
path := &Path{
|
||||||
|
env: env,
|
||||||
|
props: properties.Map{
|
||||||
|
properties.Style: AgnosterRight,
|
||||||
|
FolderSeparatorIcon: " > ",
|
||||||
|
FolderIcon: "f",
|
||||||
|
HomeIcon: "~",
|
||||||
|
MaxWidth: tc.MaxWidth,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
path.setPaths()
|
||||||
|
path.setStyle()
|
||||||
|
|
||||||
|
got := renderTemplateNoTrimSpace(env, "{{ .Path }}", path)
|
||||||
|
assert.Equal(t, tc.Expected, got, tc.Case)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestGetPwd(t *testing.T) {
|
func TestGetPwd(t *testing.T) {
|
||||||
cases := []struct {
|
cases := []struct {
|
||||||
MappedLocationsEnabled bool
|
MappedLocationsEnabled bool
|
||||||
|
|
Loading…
Reference in a new issue