From ba04fb2af75110c0e26ad6b36e959a5f4c3a05b8 Mon Sep 17 00:00:00 2001 From: sammyette Date: Sat, 9 Sep 2023 10:51:58 -0700 Subject: [PATCH] feat: allow numbered substitutions in aliases (#258) --- CHANGELOG.md | 3 +++ aliases.go | 22 +++++++++++++++++++++- main.go | 4 ++++ 3 files changed, 28 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 36b82da..48722dc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,9 @@ - `hilbish.notification` signal when a message/notification is sent - `notifyJobFinish` opt to send a notification when background jobs are completed. +- Allow numbered arg substitutions in aliases. + - Example: `hilbish.alias('hello', 'echo %1 says hello')` allows the user to run `hello hilbish` + which will output `hilbish says hello`. [#219]: https://github.com/Rosettea/Hilbish/issues/219 ### Fixed diff --git a/aliases.go b/aliases.go index bfacc43..fc5777e 100644 --- a/aliases.go +++ b/aliases.go @@ -1,6 +1,8 @@ package main import ( + "regexp" + "strconv" "strings" "sync" @@ -46,9 +48,27 @@ func (a *aliasModule) Resolve(cmdstr string) string { a.mu.RLock() defer a.mu.RUnlock() - args := strings.Split(cmdstr, " ") + arg, _ := regexp.Compile(`[\\]?%\d+`) + + args, _ := splitInput(cmdstr) for a.aliases[args[0]] != "" { alias := a.aliases[args[0]] + alias = arg.ReplaceAllStringFunc(alias, func(a string) string { + idx, _ := strconv.Atoi(a[1:]) + if strings.HasPrefix(a, "\\") || idx == 0 { + return strings.TrimPrefix(a, "\\") + } + + if idx + 1 > len(args) { + return a + } + val := args[idx] + args = cut(args, idx) + cmdstr = strings.Join(args, " ") + + return val + }) + cmdstr = alias + strings.TrimPrefix(cmdstr, args[0]) cmdArgs, _ := splitInput(cmdstr) args = cmdArgs diff --git a/main.go b/main.go index 300f333..52ba63d 100644 --- a/main.go +++ b/main.go @@ -324,3 +324,7 @@ func getVersion() string { return v.String() } + +func cut(slice []string, idx int) []string { + return append(slice[:idx], slice[idx + 1:]...) +}