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

vi keybindings not always faithful #1

Open
driusan opened this issue May 18, 2016 · 2 comments
Open

vi keybindings not always faithful #1

driusan opened this issue May 18, 2016 · 2 comments
Labels

Comments

@driusan
Copy link
Owner

driusan commented May 18, 2016

Some vi-style keybindings aren't properly implemented, or at least aren't implemented in the same
manner as vi (for instance, l and h don't stop at line boundaries, and there seems to be a nasty bug in dd where ndd deletes 1 too many lines, and dd without a number doesn't delete the whole line.

This results in some commands working unexpectedly, and is a little confusing until you get used to it. There should be automated tests to ensure that they work as expected and don't have any more regressions.

p also acts as P for ergonomic reasons, which should be documented. (I never use p but use P all the time in vim.)

@josephholsten
Copy link
Contributor

so, there's infinite keybindings in vim, but at least nvi has a constrained set. here's the output of nvi's :viusage:

^A search forward for cursor word
^B scroll up by screens
^C interrupt an operation (e.g. read, write, search)
^D scroll down by half screens (setting count)
^E scroll down by lines
^F scroll down by screens
^G file status
^H move left by characters
^J move down by lines
^L redraw screen
^M move down by lines (to first non-blank)
^N move down by lines
^P move up by lines
^R redraw screen
^T tag pop
^U half page up (set count)
^V input a literal character
^W move to next screen
^Y page up by lines
^Z suspend editor
^[ <escape> exit input mode, cancel partial commands
 ^\ switch to ex mode
^] tag push cursor word
^^ switch to previous file
   <space> move right by columns
 ! filter through command(s) to motion
 # number increment/decrement
 $ move to last column
 % move to match
 & repeat substitution
 ' move to mark (to first non-blank)
 ( move back sentence
 ) move forward sentence
 + move down by lines (to first non-blank)
 , reverse last F, f, T or t search
 - move up by lines (to first non-blank)
 . repeat the last command
 / search forward
 0 move to first character
 : ex command
 ; repeat last F, f, T or t search
 < shift lines left to motion
 > shift lines right to motion
 ? search backward
 @ execute buffer
 A append to the line
 B move back bigword
 C change to end-of-line
 D delete to end-of-line
 E move to end of bigword
 F character in line backward search
 G move to line
 H move to count lines from screen top
 I insert before first nonblank
 J join lines
 L move to screen bottom
 M move to screen middle
 N reverse last search
 O insert above line
 P insert before cursor from buffer
 Q switch to ex mode
 R replace characters
 S substitute for the line(s)
 T before character in line backward search
 U Restore the current line
 W move to next bigword
 X delete character before cursor
 Y copy line
ZZ save file and exit
[[ move back section
]] move forward section
 ^ move to first non-blank
 _ move to first non-blank
 ` move to mark
 a append after cursor
 b move back word
 c change to motion
 d delete to motion
 e move to end of word
 f character in line forward search
 h move left by columns
 i insert before cursor
 j move down by lines
 k move up by lines
 l move right by columns
 m set mark
 n repeat last search
 o append after line
 p insert after cursor from buffer
 r replace character
 s substitute character
 t before character in line forward search
 u undo last change
 w move to next word
 x delete character
 y copy text to motion into a cut buffer
 z reposition the screen
 { move back paragraph
 | move to column
 } move forward paragraph
 ~ reverse case

@josephholsten
Copy link
Contributor

josephholsten commented Jun 9, 2016

acme, of course, doesn't have as nicely documented keybindings. And it had been a while since I had to find them in the source, I forgot how hard it was to find the first time. But at least they're all in one humongous switch: https://github.com/9fans/plan9port/blob/master/src/cmd/acme/text.c#L657

Short version, ignoring motion commands, is:

^A: beginning of line
^E: end of line
%C: copy
%Z: undo
%X: cut
%V: paste
^F: complete
^H: erase character
^U: erase line
^W: erase word

Where ^ means Control, and % means Control or Command or whatever the reasonable windows meta happens to be.

driusan added a commit that referenced this issue Jun 19, 2016
Finally fixed the `<n>dd` command so that it deletes the correct number of
lines and doesn't leave a character straggling when there's no modifier, making
progress towards addressing issue #1.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

2 participants