7 Commits

Author SHA1 Message Date
T.v.Dein
d2db420837 Merge pull request #25 from TLINDEN/doc/fix-formating
fix pod formatting (fixes #24)
2023-12-05 20:09:42 +01:00
T.v.Dein
b4f53d2dd6 Merge pull request #26 from TLINDEN/feature/add-shortcuts
added a couple of command shortcuts
2023-12-05 20:06:05 +01:00
ec4d86f727 added a couple of shortcuts 2023-12-05 20:01:32 +01:00
4c6caa7114 fix pod formatting (fixes #24) 2023-12-04 18:03:58 +01:00
T.v.Dein
252e7eb8d9 Feature/edit stack command (#23)
* add edit feature
* bump version
2023-12-04 13:53:18 +01:00
T.v.Dein
416c163d94 Merge pull request #22 from TLINDEN/doc/improve
add converter docs
2023-11-14 20:01:19 +01:00
d93fbe33dc add converter docs 2023-11-14 20:00:09 +01:00
5 changed files with 185 additions and 9 deletions

16
calc.go
View File

@@ -121,19 +121,27 @@ func (c *Calc) GetCompleteCustomFuncalls() func(string) []string {
} }
for command := range c.SettingsCommands { for command := range c.SettingsCommands {
completions = append(completions, command) if len(command) > 1 {
completions = append(completions, command)
}
} }
for command := range c.ShowCommands { for command := range c.ShowCommands {
completions = append(completions, command) if len(command) > 1 {
completions = append(completions, command)
}
} }
for command := range c.StackCommands { for command := range c.StackCommands {
completions = append(completions, command) if len(command) > 1 {
completions = append(completions, command)
}
} }
for command := range c.Commands { for command := range c.Commands {
completions = append(completions, command) if len(command) > 1 {
completions = append(completions, command)
}
} }
return completions return completions

View File

@@ -18,8 +18,12 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
package main package main
import ( import (
"bufio"
"fmt" "fmt"
"os" "os"
"os/exec"
"strconv"
"strings"
) )
type CommandFunction func(*Calc) type CommandFunction func(*Calc)
@@ -184,6 +188,102 @@ func (c *Calc) SetCommands() {
} }
}, },
), ),
"edit": NewCommand(
"edit the stack interactively",
func(c *Calc) {
if c.stack.Len() == 0 {
fmt.Println("empty stack")
return
}
c.stack.Backup()
// put the stack contents into a tmp file
tmp, err := os.CreateTemp("", "stack")
if err != nil {
fmt.Println(err)
return
}
defer os.Remove(tmp.Name())
comment := `# add or remove numbers as you wish.
# each number must be on its own line.
# numbers must be floating point formatted.
`
_, err = tmp.WriteString(comment)
if err != nil {
fmt.Println(err)
return
}
for _, item := range c.stack.All() {
_, err = fmt.Fprintf(tmp, "%f\n", item)
if err != nil {
fmt.Println(err)
return
}
}
tmp.Close()
// determine which editor to use
editor := "vi"
enveditor, present := os.LookupEnv("EDITOR")
if present {
if editor != "" {
if _, err := os.Stat(editor); err == nil {
editor = enveditor
}
}
}
// execute editor with our tmp file containing current stack
cmd := exec.Command(editor, tmp.Name())
cmd.Stdin = os.Stdin
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
err = cmd.Run()
if err != nil {
fmt.Println("could not run editor command: ", err)
return
}
// read the file back in
modified, err := os.Open(tmp.Name())
if err != nil {
fmt.Println("Error opening file:", err)
return
}
defer modified.Close()
// reset the stack
c.stack.Clear()
// and put the new contents (if legit) back onto the stack
scanner := bufio.NewScanner(modified)
for scanner.Scan() {
line := strings.TrimSpace(c.Comment.ReplaceAllString(scanner.Text(), ""))
if line == "" {
continue
}
num, err := strconv.ParseFloat(line, 64)
if err != nil {
fmt.Printf("%s is not a floating point number!\n", line)
continue
}
c.stack.Push(num)
}
if err := scanner.Err(); err != nil {
fmt.Println("Error reading from file:", err)
}
},
),
} }
// general commands // general commands
@@ -205,6 +305,15 @@ func (c *Calc) SetCommands() {
// aliases // aliases
c.Commands["quit"] = c.Commands["exit"] c.Commands["quit"] = c.Commands["exit"]
c.SettingsCommands["undebug"] = c.SettingsCommands["nodebug"]
c.SettingsCommands["show"] = c.SettingsCommands["showstack"] c.SettingsCommands["d"] = c.SettingsCommands["debug"]
c.SettingsCommands["b"] = c.SettingsCommands["batch"]
c.SettingsCommands["s"] = c.SettingsCommands["showstack"]
c.ShowCommands["h"] = c.ShowCommands["history"]
c.ShowCommands["p"] = c.ShowCommands["dump"]
c.ShowCommands["v"] = c.ShowCommands["vars"]
c.StackCommands["c"] = c.StackCommands["clear"]
c.StackCommands["u"] = c.StackCommands["undo"]
} }

View File

@@ -30,7 +30,7 @@ import (
lua "github.com/yuin/gopher-lua" lua "github.com/yuin/gopher-lua"
) )
const VERSION string = "2.0.10" const VERSION string = "2.0.11"
const Usage string = `This is rpn, a reverse polish notation calculator cli. const Usage string = `This is rpn, a reverse polish notation calculator cli.

48
rpn.go
View File

@@ -132,6 +132,14 @@ DESCRIPTION
x multiply (alias: *) x multiply (alias: *)
^ power ^ power
Bitwise operators:
and bitwise and
or bitwise or
xor bitwise xor
< left shift
> right shift
Percent functions: Percent functions:
% percent % percent
@@ -153,19 +161,44 @@ DESCRIPTION
log10 log1p log2 logb pow round roundtoeven sin sinh tan tanh trunc y0 log10 log1p log2 logb pow round roundtoeven sin sinh tan tanh trunc y0
y1 copysign dim hypot y1 copysign dim hypot
Commands: Conversion functions:
cm-to-inch
inch-to-cm
gallons-to-liters
liters-to-gallons
yards-to-meters
meters-to-yards
miles-to-kilometers
kilometers-to-miles
Configuration Commands:
[no]batch toggle batch mode (nobatch turns it off) [no]batch toggle batch mode (nobatch turns it off)
[no]debug toggle debug output (nodebug turns it off) [no]debug toggle debug output (nodebug turns it off)
[no]showstack show the last 5 items of the stack (noshowtack turns it off) [no]showstack show the last 5 items of the stack (noshowtack turns it off)
Show commands:
dump display the stack contents dump display the stack contents
hex show last stack item in hex form (converted to int)
history display calculation history
vars show list of variables
Stack manipulation commands:
clear clear the whole stack clear clear the whole stack
shift remove the last element of the stack shift remove the last element of the stack
reverse reverse the stack elements reverse reverse the stack elements
swap exchange the last two stack elements swap exchange the last two stack elements
dup duplicate last stack item dup duplicate last stack item
history display calculation history undo undo last operation
edit edit the stack interactively using vi or $EDITOR
Other commands:
help|? show this message help|? show this message
manual show manual
quit|exit|c-d|c-c exit program quit|exit|c-d|c-c exit program
Register variables: Register variables:
@@ -175,6 +208,17 @@ DESCRIPTION
Refer to https://pkg.go.dev/math for details about those functions. Refer to https://pkg.go.dev/math for details about those functions.
There are also a number of shortcuts for some commands available:
d debug
b batch
s showstack
h history
p dump (aka print)
v vars
c clear
u undo
INTERACTIVE REPL INTERACTIVE REPL
While you can use rpn in the command-line, the best experience you'll While you can use rpn in the command-line, the best experience you'll
have is the interactive repl (read eval print loop). Just execute "rpn" have is the interactive repl (read eval print loop). Just execute "rpn"

15
rpn.pod
View File

@@ -186,20 +186,24 @@ Configuration Commands:
[no]showstack show the last 5 items of the stack (noshowtack turns it off) [no]showstack show the last 5 items of the stack (noshowtack turns it off)
Show commands: Show commands:
dump display the stack contents dump display the stack contents
hex show last stack item in hex form (converted to int) hex show last stack item in hex form (converted to int)
history display calculation history history display calculation history
vars show list of variables vars show list of variables
Stack manipulation commands: Stack manipulation commands:
clear clear the whole stack clear clear the whole stack
shift remove the last element of the stack shift remove the last element of the stack
reverse reverse the stack elements reverse reverse the stack elements
swap exchange the last two stack elements swap exchange the last two stack elements
dup duplicate last stack item dup duplicate last stack item
undo undo last operation undo undo last operation
edit edit the stack interactively using vi or $EDITOR
Other commands: Other commands:
help|? show this message help|? show this message
manual show manual manual show manual
quit|exit|c-d|c-c exit program quit|exit|c-d|c-c exit program
@@ -212,6 +216,17 @@ Register variables:
Refer to https://pkg.go.dev/math for details about those functions. Refer to https://pkg.go.dev/math for details about those functions.
There are also a number of shortcuts for some commands available:
d debug
b batch
s showstack
h history
p dump (aka print)
v vars
c clear
u undo
=head1 INTERACTIVE REPL =head1 INTERACTIVE REPL
While you can use rpn in the command-line, the best experience you'll While you can use rpn in the command-line, the best experience you'll