feat: mapped_locations_enabled

This commit is contained in:
TravisTX 2020-12-24 14:17:00 -07:00 committed by Jan De Dobbeleer
parent 7ff4954766
commit 0e5e65d9e3
13 changed files with 134 additions and 138 deletions

View file

@ -33,17 +33,18 @@ Display the current path.
- folder_icon: `string` - the icon to use as a folder indication - defaults to `..`
- windows_registry_icon: `string` - the icon to display when in the Windows registry - defaults to `\uE0B1`
- style: `enum` - how to display the current path
- mapped_locations: `map[string]string` - custom glyph/text for specific paths(only when `style` is set to `agnoster`,
`agnoster_full`, `agnoster_short`, `short`, or `folder`)
- mapped_locations: `map[string]string` - custom glyph/text for specific paths (only when `mapped_locations_enabled`
is set to `true`)
- mapped_locations_enabled: `boolean` - replace known locations in the path with the replacements before applying the
style. defaults to `true`
## Style
Style sets the way the path is displayed. Based on previous experience and popular themes, there are 4 flavors.
Style sets the way the path is displayed. Based on previous experience and popular themes, there are 5 flavors.
- agnoster
- agnoster_full
- agnoster_short
- short
- full
- folder
@ -61,15 +62,9 @@ Renders each folder name separated by the `folder_separator_icon`.
When more than 1 level deep, it renders one `folder_icon` followed by the name of the current folder separated by the `folder_separator_icon`.
### Short
Display `$PWD` as a string, replace `$HOME` with the `home_icon` if you're inside the `$HOME` location or
one of its children.
Specific folders can be customized using the `mapped_locations` property.
### Full
Display `$PWD` as a string
Display `$PWD` as a string.
### Folder

View file

@ -36,6 +36,8 @@ const (
Folder string = "folder"
// MappedLocations allows overriding certain location with an icon
MappedLocations Property = "mapped_locations"
// MappedLocationsEnabled enables overriding certain locations with an icon
MappedLocationsEnabled Property = "mapped_locations_enabled"
)
func (pt *path) enabled() bool {
@ -51,9 +53,10 @@ func (pt *path) string() string {
case AgnosterShort:
return pt.getAgnosterShortPath()
case Short:
return pt.getShortPath()
// "short" is a duplicate of "full", just here for backwards compatibility
fallthrough
case Full:
return pt.env.getcwd()
return pt.getFullPath()
case Folder:
return pt.getFolderPath()
default:
@ -66,8 +69,67 @@ func (pt *path) init(props *properties, env environmentInfo) {
pt.env = env
}
func (pt *path) getShortPath() string {
func (pt *path) getAgnosterPath() string {
buffer := new(bytes.Buffer)
pwd := pt.getPwd()
buffer.WriteString(pt.rootLocation())
pathDepth := pt.pathDepth(pwd)
for i := 1; i < pathDepth; i++ {
buffer.WriteString(fmt.Sprintf("%s%s", pt.props.getString(FolderSeparatorIcon, pt.env.getPathSeperator()), pt.props.getString(FolderIcon, "..")))
}
if pathDepth > 0 {
buffer.WriteString(fmt.Sprintf("%s%s", pt.props.getString(FolderSeparatorIcon, pt.env.getPathSeperator()), base(pwd, pt.env)))
}
return buffer.String()
}
func (pt *path) getAgnosterFullPath() string {
pwd := pt.getPwd()
pathSeparator := pt.env.getPathSeperator()
folderSeparator := pt.props.getString(FolderSeparatorIcon, pathSeparator)
if string(pwd[0]) == pathSeparator {
pwd = pwd[1:]
}
return strings.ReplaceAll(pwd, pathSeparator, folderSeparator)
}
func (pt *path) getAgnosterShortPath() string {
pathSeparator := pt.env.getPathSeperator()
folderSeparator := pt.props.getString(FolderSeparatorIcon, pathSeparator)
folderIcon := pt.props.getString(FolderIcon, "..")
root := pt.rootLocation()
pwd := pt.getPwd()
base := base(pwd, pt.env)
pathDepth := pt.pathDepth(pwd)
if pathDepth <= 0 {
return root
}
if pathDepth == 1 {
return fmt.Sprintf("%s%s%s", root, folderSeparator, base)
}
return fmt.Sprintf("%s%s%s%s%s", root, folderSeparator, folderIcon, folderSeparator, base)
}
func (pt *path) getFullPath() string {
return pt.getPwd()
}
func (pt *path) getFolderPath() string {
pwd := pt.getPwd()
return base(pwd, pt.env)
}
func (pt *path) getPwd() string {
pwd := pt.env.getcwd()
if pt.props.getBool(MappedLocationsEnabled, true) {
pwd = pt.replaceMappedLocations(pwd)
}
return pwd
}
func (pt *path) replaceMappedLocations(pwd string) string {
if strings.HasPrefix(pwd, "Microsoft.PowerShell.Core\\FileSystem::") {
pwd = strings.Replace(pwd, "Microsoft.PowerShell.Core\\FileSystem::", "", 1)
}
@ -104,57 +166,12 @@ func (pt *path) getShortPath() string {
return pwd
}
func (pt *path) getAgnosterPath() string {
buffer := new(bytes.Buffer)
pwd := pt.getShortPath()
buffer.WriteString(pt.rootLocation())
pathDepth := pt.pathDepth(pwd)
for i := 1; i < pathDepth; i++ {
buffer.WriteString(fmt.Sprintf("%s%s", pt.props.getString(FolderSeparatorIcon, pt.env.getPathSeperator()), pt.props.getString(FolderIcon, "..")))
}
if pathDepth > 0 {
buffer.WriteString(fmt.Sprintf("%s%s", pt.props.getString(FolderSeparatorIcon, pt.env.getPathSeperator()), base(pwd, pt.env)))
}
return buffer.String()
}
func (pt *path) getAgnosterFullPath() string {
pwd := pt.getShortPath()
pathSeparator := pt.env.getPathSeperator()
folderSeparator := pt.props.getString(FolderSeparatorIcon, pathSeparator)
if string(pwd[0]) == pathSeparator {
pwd = pwd[1:]
}
return strings.ReplaceAll(pwd, pathSeparator, folderSeparator)
}
func (pt *path) getAgnosterShortPath() string {
pathSeparator := pt.env.getPathSeperator()
folderSeparator := pt.props.getString(FolderSeparatorIcon, pathSeparator)
folderIcon := pt.props.getString(FolderIcon, "..")
root := pt.rootLocation()
base := base(pt.env.getcwd(), pt.env)
pathDepth := pt.pathDepth(pt.getShortPath())
if pathDepth <= 0 {
return root
}
if pathDepth == 1 {
return fmt.Sprintf("%s%s%s", root, folderSeparator, base)
}
return fmt.Sprintf("%s%s%s%s%s", root, folderSeparator, folderIcon, folderSeparator, base)
}
func (pt *path) getFolderPath() string {
pwd := pt.getShortPath()
return base(pwd, pt.env)
}
func (pt *path) inHomeDir(pwd string) bool {
return strings.HasPrefix(pwd, pt.env.homeDir())
}
func (pt *path) rootLocation() string {
pwd := pt.getShortPath()
pwd := pt.getPwd()
pwd = strings.TrimPrefix(pwd, pt.env.getPathSeperator())
splitted := strings.Split(pwd, pt.env.getPathSeperator())
rootLocation := splitted[0]
@ -162,9 +179,6 @@ func (pt *path) rootLocation() string {
}
func (pt *path) pathDepth(pwd string) int {
if pt.inHomeDir(pwd) {
pwd = strings.Replace(pwd, pt.env.homeDir(), "root", 1)
}
splitted := strings.Split(pwd, pt.env.getPathSeperator())
var validParts []string
for _, part := range splitted {

View file

@ -1,7 +1,6 @@
package main
import (
"math/rand"
"testing"
"github.com/distatus/battery"
@ -129,7 +128,6 @@ func (env *MockedEnvironment) doGet(url string) ([]byte, error) {
}
const (
homeGates = "/home/gates"
homeBill = "/home/bill"
homeJan = "/usr/home/jan"
homeBillWindows = "C:\\Users\\Bill"
@ -148,10 +146,9 @@ func TestIsInHomeDirTrue(t *testing.T) {
}
func TestIsInHomeDirLevelTrue(t *testing.T) {
level := rand.Intn(100)
home := homeBill
pwd := home
for i := 0; i < level; i++ {
for i := 0; i < 99; i++ {
pwd += levelDir
}
env := new(MockedEnvironment)
@ -290,71 +287,23 @@ func TestIsInHomeDirFalse(t *testing.T) {
assert.False(t, got)
}
func TestPathDepthInHome(t *testing.T) {
home := homeBill
pwd := home
env := new(MockedEnvironment)
env.On("homeDir", nil).Return(home)
env.On("getPathSeperator", nil).Return("/")
path := &path{
env: env,
}
got := path.pathDepth(pwd)
assert.Equal(t, 0, got)
}
func TestPathDepthInHomeTrailing(t *testing.T) {
home := "/home/bill/"
pwd := home + "/"
env := new(MockedEnvironment)
env.On("homeDir", nil).Return(home)
env.On("getPathSeperator", nil).Return("/")
path := &path{
env: env,
}
got := path.pathDepth(pwd)
assert.Equal(t, 0, got)
}
func TestPathDepthInHomeMultipleLevelsDeep(t *testing.T) {
level := rand.Intn(100)
home := homeBill
pwd := home
for i := 0; i < level; i++ {
pwd += levelDir
}
env := new(MockedEnvironment)
env.On("homeDir", nil).Return(home)
env.On("getPathSeperator", nil).Return("/")
path := &path{
env: env,
}
got := path.pathDepth(pwd)
assert.Equal(t, level, got)
}
func TestPathDepthOutsideHomeMultipleLevelsDeep(t *testing.T) {
level := rand.Intn(100)
home := homeGates
func TestPathDepthMultipleLevelsDeep(t *testing.T) {
pwd := "/usr"
for i := 0; i < level; i++ {
for i := 0; i < 99; i++ {
pwd += levelDir
}
env := new(MockedEnvironment)
env.On("homeDir", nil).Return(home)
env.On("getPathSeperator", nil).Return("/")
path := &path{
env: env,
}
got := path.pathDepth(pwd)
assert.Equal(t, level, got)
assert.Equal(t, 99, got)
}
func TestPathDepthOutsideHomeZeroLevelsDeep(t *testing.T) {
home := homeGates
func TestPathDepthZeroLevelsDeep(t *testing.T) {
pwd := "/usr/"
env := new(MockedEnvironment)
env.On("homeDir", nil).Return(home)
env.On("getPathSeperator", nil).Return("/")
path := &path{
env: env,
@ -363,11 +312,9 @@ func TestPathDepthOutsideHomeZeroLevelsDeep(t *testing.T) {
assert.Equal(t, 0, got)
}
func TestPathDepthOutsideHomeOneLevelDeep(t *testing.T) {
home := homeGates
func TestPathDepthOneLevelDeep(t *testing.T) {
pwd := "/usr/location"
env := new(MockedEnvironment)
env.On("homeDir", nil).Return(home)
env.On("getPathSeperator", nil).Return("/")
path := &path{
env: env,
@ -624,3 +571,43 @@ func TestWritePathInfoUnixOutsideHomeOneLevels(t *testing.T) {
got := testWritePathInfo(home, "/mnt/folder/location", "/")
assert.Equal(t, want, got)
}
func TestGetPwd(t *testing.T) {
cases := []struct {
MappedLocationsEnabled bool
Pwd string
Expected string
}{
{MappedLocationsEnabled: true, Pwd: "", Expected: ""},
{MappedLocationsEnabled: true, Pwd: "/usr", Expected: "/usr"},
{MappedLocationsEnabled: true, Pwd: "/usr/home", Expected: "~"},
{MappedLocationsEnabled: true, Pwd: "/usr/home/abc", Expected: "~/abc"},
{MappedLocationsEnabled: true, Pwd: "/a/b/c/d", Expected: "#"},
{MappedLocationsEnabled: true, Pwd: "/a/b/c/d/e/f/g", Expected: "#/e/f/g"},
{MappedLocationsEnabled: true, Pwd: "/z/y/x/w", Expected: "/z/y/x/w"},
{MappedLocationsEnabled: false, Pwd: "", Expected: ""},
{MappedLocationsEnabled: false, Pwd: "/usr/home/abc", Expected: "/usr/home/abc"},
{MappedLocationsEnabled: false, Pwd: "/a/b/c/d/e/f/g", Expected: "/a/b/c/d/e/f/g"},
}
for _, tc := range cases {
env := new(MockedEnvironment)
env.On("getPathSeperator", nil).Return("/")
env.On("homeDir", nil).Return("/usr/home")
env.On("getcwd", nil).Return(tc.Pwd)
path := &path{
env: env,
props: &properties{
values: map[Property]interface{}{
MappedLocationsEnabled: tc.MappedLocationsEnabled,
MappedLocations: map[string]string{
"/a/b/c/d": "#",
},
},
},
}
got := path.getPwd()
assert.Equal(t, tc.Expected, got)
}
}

View file

@ -19,7 +19,7 @@
"foreground": "#ffffff",
"background": "#C678DD",
"properties": {
"style": "short"
"style": "full"
}
},
{

View file

@ -10,7 +10,7 @@
"foreground": "#ffffff",
"properties": {
"prefix": "",
"style": "short"
"style": "full"
}
},
{

View file

@ -56,7 +56,7 @@
"style": "plain",
"foreground": "#ffffff",
"properties": {
"style": "short",
"style": "full",
"prefix": "<#CB4B16>┖[</>",
"postfix": "<#CB4B16>]></>"
}

View file

@ -27,12 +27,12 @@
"style": "plain",
"foreground": "#ffffff",
"background": "#007ACC",
"properties" : {
"folder_icon": "\uF115",
"folder_separator_icon": "\uE0B1",
"style": "short",
"prefix": "<transparent>\uE0B0</> ",
"postfix": " "
"properties": {
"folder_icon": "\uF115",
"folder_separator_icon": "\uE0B1",
"style": "full",
"prefix": "<transparent>\uE0B0</> ",
"postfix": " "
}
},
{

View file

@ -22,7 +22,7 @@
"properties": {
"folder_icon": "\uF115",
"folder_separator_icon": "\uE0B1",
"style": "short"
"style": "full"
}
},
{

View file

@ -27,7 +27,7 @@
"properties": {
"folder_icon": "\uF115",
"folder_separator_icon": "\uE0B1",
"style": "short"
"style": "full"
}
},
{

View file

@ -25,7 +25,7 @@
"foreground": "#26C6DA",
"background": "#546E7A",
"properties": {
"style": "short",
"style": "full",
"postfix": " "
}
},

View file

@ -28,7 +28,7 @@
"foreground": "#77E4F7",
"properties": {
"prefix": "",
"style": "short"
"style": "full"
}
},
{

View file

@ -20,8 +20,8 @@
"powerline_symbol": "\uE0B0",
"foreground": "#100e23",
"background": "#91ddff",
"properties" : {
"style": "short"
"properties": {
"style": "full"
}
},
{

View file

@ -24,7 +24,7 @@
"style": "plain",
"foreground": "#0973C0",
"properties": {
"style": "short"
"style": "full"
}
},
{