Compare commits

...

10 Commits

Author SHA1 Message Date
TorchedSammy 117a4580b4
chore: merge from upstream master 2022-10-10 18:55:28 -04:00
TorchedSammy 0db7f96fd7
build: disable cgo in builds 2022-10-10 18:55:03 -04:00
TorchedSammy 300248de54 docs: [ci] generate new docs 2022-10-10 22:41:10 +00:00
TorchedSammy 3ee2b03330
feat: make prompt optional in hilbish.read 2022-10-10 18:40:29 -04:00
TorchedSammy 3bec2c91a8
fix: create an empty line reader instance for hilbish.read (closes #190) 2022-10-10 18:26:54 -04:00
TorchedSammy b4ca5bfda3
fix(readline): put cursor at end of text when exiting editor 2022-10-10 18:19:24 -04:00
TorchedSammy 308e257872
fix(readline): take into account newlines when calculating amount of lines taken up by input
this does not really fix the issue of multiline input
being broken completely, but prevents the prompt
being reprinted on input
2022-10-10 18:17:58 -04:00
TorchedSammy 7db2a2c826
fix: check if there is cmd input before attempting to add to history (closes #206) 2022-10-10 18:11:09 -04:00
TorchedSammy 22f6ea8a3e
docs: remove getting started from readme toc 2022-10-10 17:34:08 -04:00
TorchedSammy 91596fa81c
docs: document drop in windows support 2022-10-10 17:33:36 -04:00
8 changed files with 39 additions and 23 deletions

View File

@ -2,6 +2,8 @@
## Unreleased ## Unreleased
**NOTE:** Hilbish now uses [Task] insead of Make for builds. **NOTE:** Hilbish now uses [Task] insead of Make for builds.
Windows support is also now at a lower tier; The only thing guaranteed is
Hilbish *compiling* on Windows.
[Task]: https://taskfile.dev/#/ [Task]: https://taskfile.dev/#/

View File

@ -31,7 +31,6 @@ and aims to be infinitely configurable. If something isn't, open an issue!
- [AUR](#AUR) - [AUR](#AUR)
- [Nixpkgs](#Nixpkgs) - [Nixpkgs](#Nixpkgs)
- [Manual Build](#Manual-Build) - [Manual Build](#Manual-Build)
- [Getting Started](#Getting-Started)
- [Contributing](#Contributing) - [Contributing](#Contributing)
# Screenshots # Screenshots
@ -42,6 +41,10 @@ and aims to be infinitely configurable. If something isn't, open an issue!
</div> </div>
# Installation # Installation
**NOTE:** Hilbish is not guaranteed to work properly on Windows, starting
from the 2.0 version. It will still be able to compile, but functionality
may be lacking.
## Prebuilt binaries ## Prebuilt binaries
Go [here](https://nightly.link/Rosettea/Hilbish/workflows/build/master) for Go [here](https://nightly.link/Rosettea/Hilbish/workflows/build/master) for
builds on the master branch. builds on the master branch.

View File

@ -13,13 +13,13 @@ vars:
tasks: tasks:
default: default:
cmds: cmds:
- go build {{.GOFLAGS}} - CGO_ENABLED=0 go build {{.GOFLAGS}}
vars: vars:
GOFLAGS: '-ldflags "-s -w -X main.gitCommit=$(git rev-parse --short HEAD) -X main.gitBranch=$(git rev-parse --abbrev-ref HEAD)"' GOFLAGS: '-ldflags "-s -w -X main.gitCommit=$(git rev-parse --short HEAD) -X main.gitBranch=$(git rev-parse --abbrev-ref HEAD)"'
build: build:
cmds: cmds:
- go build {{.GOFLAGS}} - CGO_ENABLED=0 go build {{.GOFLAGS}}
install: install:
cmds: cmds:

22
api.go
View File

@ -250,21 +250,27 @@ func hlcwd(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) {
} }
// read(prompt) -> input? // read(prompt?) -> input?
// Read input from the user, using Hilbish's line editor/input reader. // Read input from the user, using Hilbish's line editor/input reader.
// This is a separate instance from the one Hilbish actually uses. // This is a separate instance from the one Hilbish actually uses.
// Returns `input`, will be nil if ctrl + d is pressed, or an error occurs (which shouldn't happen) // Returns `input`, will be nil if ctrl + d is pressed, or an error occurs (which shouldn't happen)
// --- @param prompt string // --- @param prompt string
func hlread(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) { func hlread(t *rt.Thread, c *rt.GoCont) (rt.Cont, error) {
if err := c.Check1Arg(); err != nil { luaprompt := c.Arg(0)
return nil, err if typ := luaprompt.Type(); typ != rt.StringType && typ != rt.NilType {
return nil, errors.New("expected #1 to be a string")
} }
luaprompt, err := c.StringArg(0) prompt, ok := luaprompt.TryString()
if err != nil { if !ok {
return nil, err // if we are here and `luaprompt` is not a string, it's nil
// substitute with an empty string
prompt = ""
} }
lualr := newLineReader("", true)
lualr.SetPrompt(luaprompt) lualr := &lineReader{
rl: readline.NewInstance(),
}
lualr.SetPrompt(prompt)
input, err := lualr.Read() input, err := lualr.Read()
if err != nil { if err != nil {

View File

@ -41,7 +41,7 @@ These will be formatted and replaced with the appropriate values.
`%u` - Name of current user `%u` - Name of current user
`%h` - Hostname of device `%h` - Hostname of device
read(prompt) -> input? > Read input from the user, using Hilbish's line editor/input reader. read(prompt?) -> input? > Read input from the user, using Hilbish's line editor/input reader.
This is a separate instance from the one Hilbish actually uses. This is a separate instance from the one Hilbish actually uses.
Returns `input`, will be nil if ctrl + d is pressed, or an error occurs (which shouldn't happen) Returns `input`, will be nil if ctrl + d is pressed, or an error occurs (which shouldn't happen)

View File

@ -1,5 +1,6 @@
local bait = require 'bait' local bait = require 'bait'
bait.catch('command.exit', function(_, cmd, priv) bait.catch('command.exit', function(_, cmd, priv)
if not cmd then return end
if not priv and hilbish.opts.history then hilbish.history.add(cmd) end if not priv and hilbish.opts.history then hilbish.history.add(cmd) end
end) end)

View File

@ -1,6 +1,10 @@
package readline package readline
import "golang.org/x/text/width" import (
"strings"
"golang.org/x/text/width"
)
// updateHelpers is a key part of the whole refresh process: // updateHelpers is a key part of the whole refresh process:
// it should coordinate reprinting the input line, any Infos and completions // it should coordinate reprinting the input line, any Infos and completions
@ -52,19 +56,19 @@ func (rl *Instance) updateReferences() {
rl.posY = 0 rl.posY = 0
rl.fullY = 0 rl.fullY = 0
var fullLine, cPosLine int var curLine []rune
if len(rl.currentComp) > 0 { if len(rl.currentComp) > 0 {
fullLine = getWidth(rl.lineComp) curLine = rl.lineComp
cPosLine = getWidth(rl.lineComp[:rl.pos])
} else { } else {
fullLine = getWidth(rl.line) curLine = rl.line
cPosLine = getWidth(rl.line[:rl.pos])
} }
fullLine := getWidth(curLine)
cPosLine := getWidth(curLine[:rl.pos])
// We need the X offset of the whole line // We need the X offset of the whole line
toEndLine := rl.promptLen + fullLine toEndLine := rl.promptLen + fullLine
fullOffset := toEndLine / GetTermWidth() fullOffset := toEndLine / GetTermWidth()
rl.fullY = fullOffset rl.fullY = fullOffset + strings.Count(string(curLine), "\n")
fullRest := toEndLine % GetTermWidth() fullRest := toEndLine % GetTermWidth()
rl.fullX = fullRest rl.fullX = fullRest

View File

@ -245,7 +245,7 @@ func (rl *Instance) vi(r rune) {
} }
// Keep the previous cursor position // Keep the previous cursor position
prev := rl.pos //prev := rl.pos
new, err := rl.StartEditorWithBuffer(multiline, "") new, err := rl.StartEditorWithBuffer(multiline, "")
if err != nil || len(new) == 0 || string(new) == string(multiline) { if err != nil || len(new) == 0 || string(new) == string(multiline) {
@ -257,11 +257,11 @@ func (rl *Instance) vi(r rune) {
// Clean the shell and put the new buffer, with adjusted pos if needed. // Clean the shell and put the new buffer, with adjusted pos if needed.
rl.clearLine() rl.clearLine()
rl.line = new rl.line = new
if prev > len(rl.line) { rl.pos = len(rl.line)
rl.pos = len(rl.line) - 1 /*if prev > len(rl.line) {
} else { } else {
rl.pos = prev rl.pos = prev
} }*/
case 'w': case 'w':
// If we were not yanking // If we were not yanking