Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Cursor control in complete suggestion? #128

Open
emicklei opened this issue Mar 21, 2020 · 6 comments
Open

Cursor control in complete suggestion? #128

emicklei opened this issue Mar 21, 2020 · 6 comments

Comments

@emicklei
Copy link

Hi,

I am looking for a way to move the cursor into a completed suggestion.
For example, if I type p and it completes to play(""), I would like the cursor to be positioned right after the first ".

I tried adding an ANSI escape sequence \033[2D (move cursor back 2x) but it is not being interpreted. An alternative could be to have a post complete func and a way to tell the *State that a cursor move is requested (programmatic CtrlB).

Before working on such a feature, I would like to have some feedback on this.

Thx,
Ernest

@peterh
Copy link
Owner

peterh commented Mar 22, 2020

The last time we needed more features, we upgraded Completer with WordCompleter. This time, it probably makes sense to upgrade WordCompleter to PosCompleter

Something like

type WordAndPos struct {
    Word string // completion string
    Pos int // position of cursor within completion string
}
type PosCompleter func(line string, pos int) (head string, completions []WordAndPos, tail string)

(except with a better name than WordAndPos)

Thoughts?

@emicklei
Copy link
Author

yes, I like this proposal. Finding a good name is always a challenge.
Maybe to generalise this, instead of returning a Pos int, we could have a CursorInstruction that be used to do:

  • set position (like WordPos)
  • move word back
  • set to end
  • create a selection (future feature?)

@peterh
Copy link
Owner

peterh commented Mar 24, 2020

"Move word back" and "set to end" are redundant when you have "set position". I especially want to avoid things like "move word back" when "word" is so poorly defined (and subject to change; See #113 for discussion)

liner isn't a text editor. I try to keep it as close to bash as possible. Unless bash has selections that I'm not aware of (which is possible, bash has lots of features that I'm not aware of) "create a selection" sounds like a feature that liner won't ever have.

@emicklei
Copy link
Author

fair enough. let's keep it simple. Suggestion:

  • type EditableWordCompleter
  • func(line string, pos int) (head string, completions []EditableWord, tail string)

Rationale: putting the cursor "in" the completed word is for the purpose of editing it after completion

@peterh
Copy link
Owner

peterh commented Mar 26, 2020

I don't know if I like that more or less than PosCompleter. As they say, there are only two hard things in programming: Naming, Caching, and off-by-one errors.

You're doing the work, I'll let you choose the name (within reason).

@emicklei
Copy link
Author

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants