forked from mirror/readline
#22 support more vim shortcut
* c<motion>, d<motion> (change, delete) * x (delete character) * r (replace character)
This commit is contained in:
parent
8e340f3ee8
commit
e967bfcedb
10
runebuf.go
10
runebuf.go
|
@ -137,6 +137,16 @@ func (r *RuneBuffer) MoveForward() {
|
|||
})
|
||||
}
|
||||
|
||||
func (r *RuneBuffer) IsCursorInEnd() bool {
|
||||
return r.idx == len(r.buf)
|
||||
}
|
||||
|
||||
func (r *RuneBuffer) Replace(ch rune) {
|
||||
r.Refresh(func() {
|
||||
r.buf[r.idx] = ch
|
||||
})
|
||||
}
|
||||
|
||||
func (r *RuneBuffer) Erase() {
|
||||
r.Refresh(func() {
|
||||
r.idx = 0
|
||||
|
|
23
vim.go
23
vim.go
|
@ -53,6 +53,25 @@ func (o *opVim) handleVimNormalMovement(r rune, readNext func() rune) (t rune, h
|
|||
rb.MoveToLineStart()
|
||||
case '$':
|
||||
rb.MoveToLineEnd()
|
||||
case 'x':
|
||||
rb.Delete()
|
||||
if rb.IsCursorInEnd() {
|
||||
rb.MoveBackward()
|
||||
}
|
||||
case 'r':
|
||||
rb.Replace(readNext())
|
||||
case 'd':
|
||||
next := readNext()
|
||||
switch next {
|
||||
case 'd':
|
||||
rb.Erase()
|
||||
case 'w':
|
||||
rb.DeleteWord()
|
||||
case 'h':
|
||||
rb.Backspace()
|
||||
case 'l':
|
||||
rb.Delete()
|
||||
}
|
||||
case 'b', 'B':
|
||||
rb.MoveToPrevWord()
|
||||
case 'w', 'W', 'e', 'E':
|
||||
|
@ -94,6 +113,10 @@ func (o *opVim) handleVimNormalEnterInsert(r rune, readNext func() rune) (t rune
|
|||
rb.Erase()
|
||||
case 'w':
|
||||
rb.DeleteWord()
|
||||
case 'h':
|
||||
rb.Backspace()
|
||||
case 'l':
|
||||
rb.Delete()
|
||||
}
|
||||
default:
|
||||
return r, false
|
||||
|
|
Loading…
Reference in New Issue