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

Vim keybindings? #1361

Closed
ianyepan opened this issue Nov 4, 2019 · 4 comments
Closed

Vim keybindings? #1361

ianyepan opened this issue Nov 4, 2019 · 4 comments
Labels
P3 A lower priority bug or feature request type-enhancement A request for a change that isn't a bug
Milestone

Comments

@ianyepan
Copy link

ianyepan commented Nov 4, 2019

As titled, it would be very nice if we could have the option to choose vim keybindings (similar to interactive platforms like LeetCode, Repl.it, HackerRank).

@RedBrogdon RedBrogdon added type-enhancement A request for a change that isn't a bug P3 A lower priority bug or feature request labels Nov 4, 2019
@RedBrogdon RedBrogdon added this to the Backlog milestone Nov 4, 2019
@RedBrogdon
Copy link
Contributor

Interesting idea. Anyone else who's been missing vim keybindings should give the issue a thumb's up.

We use CodeMirror as our in-browser editor, and it looks like their vim keybindings aren't currently maintained:

https://github.com/codemirror/codemirror/issues?q=is%3Aissue+is%3Aopen+label%3Avim

This could be a great chance for someone who's been looking for a spot to get involved in open source.

@mnordine
Copy link

mnordine commented Dec 5, 2019

Ace seems to support vim bindings well. It's used on the Rust playground: https://play.rust-lang.org/.
Very nice experience there. Any chance on switching to Ace?

@domesticmouse
Copy link
Member

@mnordine that would require bringing the Ace Dart bindings up to date. It was last updated back in 2016.

@timmaffett
Copy link
Contributor

timmaffett commented Mar 10, 2022

I thought I would put this here just for the interested parties, and to illustrate how nice and complete codemirror's vim support actually is...

----(below notes from testing------------------

I tried to systematically try all of the following commands, and there were
only a few Ctrl sequence commands (which did not work because the browser owns them)
(Browser Hijacks: Ctrl+w, Ctrl+h, Ctrl+j,Ctrl+t,Ctrl+n,Ctrl+p,Ctrl+r, and Ctrl+o browser hijacks)

Other than that ALL of the below key combos work nicely.

I used the nice, rather complete, Vim cheatsheet at https://vim.rtorr.com/ as my basis

Cursor movement

h - move cursor left
j - move cursor down
k - move cursor up
l - move cursor right
gj - move cursor down (multi-line text)
gk - move cursor up (multi-line text)
H - move to top of screen
M - move to middle of screen
L - move to bottom of screen
w - jump forwards to the start of a word
W - jump forwards to the start of a word (words can contain punctuation)
e - jump forwards to the end of a word
E - jump forwards to the end of a word (words can contain punctuation)
b - jump backwards to the start of a word
B - jump backwards to the start of a word (words can contain punctuation)
ge - jump backwards to the end of a word
gE - jump backwards to the end of a word (words can contain punctuation)
% - move to matching character (default supported pairs: '()', '{}', '[]' - use :h matchpairs in vim for more info)
0 - jump to the start of the line
^ - jump to the first non-blank character of the line
$ - jump to the end of the line
g_ - jump to the last non-blank character of the line
gg - go to the first line of the document
G - go to the last line of the document
5gg or 5G - go to line 5
gd - move to local declaration
gD - move to global declaration
fx - jump to next occurrence of character x
tx - jump to before next occurrence of character x
Fx - jump to the previous occurrence of character x
Tx - jump to after previous occurrence of character x
; - repeat previous f, t, F or T movement
, - repeat previous f, t, F or T movement, backwards
} - jump to next paragraph (or function/block, when editing code)
{ - jump to previous paragraph (or function/block, when editing code)
zz - center cursor on screen
Ctrl + e - move screen down one line (without moving cursor)    WORKS
Ctrl + y - move screen up one line (without moving cursor)      WORKS
Ctrl + b - move back one full screen                            WORKS
Ctrl + f - move forward one full screen                         WORKS
Ctrl + d - move forward 1/2 a screen                            WORKS
Ctrl + u - move back 1/2 a screen                               WORKS

Tip Prefix a cursor movement command with a number to repeat it. For example, 4j moves down 4 lines.

Insert mode - inserting/appending text

i - insert before the cursor
I - insert at the beginning of the line
a - insert (append) after the cursor
A - insert (append) at the end of the line
o - append (open) a new line below the current line
O - append (open) a new line above the current line
ea - insert (append) at the end of the word

THESE CONTROL SEQUENCES ARE OWNED BY BROWSER SO DO NOT WORK -------->>
There are mostly other options for these

Ctrl + h - delete the character before the cursor during insert mode  [BROWSER OPENS HISTORY]
Ctrl + w - delete word before the cursor during insert mode  [BROWSER CLOSES WINDOW]
Ctrl + j - begin new line during insert mode  [BROWSER opens DOWNLOADS]
Ctrl + t - indent (move right) line one shiftwidth during insert mode [BROWSER OPENS NEW TAB]
	instead >> works indent in visual mode, once each time - but then our autocomplete dialog opens up - 
	>> works find without visual mode selection
Ctrl + n - insert (auto-complete) next match before the cursor during insert mode [BROWSER OPENS NEW WINDOW]
Ctrl + p - insert (auto-complete) previous match before the cursor during insert mode [BROWSER OPENS PRINT DIALOG]
Ctrl + rx - insert the contents of register x      [BROWSER RELOADS window]
	there are other ways to insert registers
Ctrl + ox - Temporarily enter normal mode to issue one normal-mode command x.   [BROWSER OPENS SAVE AS dialog]

----<---------------- THESE CONTROL SEQUENCES ARE OWNED BY BROWSER SO DO NOT WORK

Ctrl + d - de-indent (move left) line one shiftwidth during insert mode <<<<WORKS!!!!!!!

Esc - exit insert mode

Editing

r - replace a single character.
R - replace more than one character, until ESC is pressed.
J - join line below to the current one with one space in between
gJ - join line below to the current one without space in between
gwip - reflow paragraph
g~ - switch case up to motion
gu - change to lowercase up to motion
gU - change to uppercase up to motion
cc - change (replace) entire line
C - change (replace) to the end of the line
c$ - change (replace) to the end of the line
ciw - change (replace) entire word
cw or ce - change (replace) to the end of the word
s - delete character and substitute text
S - delete line and substitute text (same as cc)
xp - transpose two letters (delete and paste)
u - undo
U - restore (undo) last changed line
Ctrl + r - redo                              WORKS
. - repeat last command

Marking text (visual mode)

v - start visual mode, mark lines, then do a command (like y-yank)
V - start linewise visual mode
o - move to other end of marked area
Ctrl + v - start visual block mode
O - move to other corner of block
aw - mark a word
ab - a block with ()
aB - a block with {}
at - a block with <> tags
ib - inner block with ()
iB - inner block with {}
it - inner block with <> tags
Esc - exit visual mode

Tip Instead of b or B one can also use ( or { respectively.
Visual commands

>> - shift text right
<< - shift text left
y - yank (copy) marked text
d - delete marked text
~ - switch case
u - change marked text to lowercase
U - change marked text to uppercase

Registers

:reg[isters] - show registers content
"xy - yank into register x
"xp - paste contents of register x
"+y - yank into the system clipboard register
"+p - paste from the system clipboard register

Tip Registers are being stored in ~/.viminfo, and will be loaded again on next restart of vim.
Tip Special registers:

0 - last yank
" - unnamed register, last delete or yank
% - current file name
# - alternate file name
* - clipboard contents (X11 primary)
+ - clipboard contents (X11 clipboard)
/ - last search pattern
: - last command-line
. - last inserted text
- - last small (less than a line) delete
= - expression register
_ - black hole register

Marks and positions

:marks - list of marks
ma - set current position for mark A
`a - jump to position of mark A
y`a - yank text to position of mark A
`0 - go to the position where Vim was previously exited
`" - go to the position when last editing this file
`. - go to the position of the last change in this file
`` - go to the position before the last jump
:ju[mps] - list of jumps
Ctrl + i - go to newer position in jump list
Ctrl + o - go to older position in jump list
:changes - list of changes
g, - go to newer position in change list
g; - go to older position in change list
Ctrl + ] - jump to the tag under cursor

Tip To jump to a mark you can either use a backtick (`) or an apostrophe (').
Using an apostrophe jumps to the beginning (first non-blank) of the line holding the mark.

Marks

Marks allow you to jump to designated points in your code.
m{a-z} - Set mark {a-z} at cursor position
A capital mark {A-Z} sets a global mark and will work between files
'{a-z} - Move the cursor to the start of the line where the mark was set
'' - Go back to the previous jump location

Text Objects

Say you have def (arg1, arg2, arg3), where your cursor is somewhere in the middle of the parenthesis.
di( deletes everything between the parenthesis. That says “change everything inside the nearest parenthesis”. Without text objects, you would need to do T(dt).

(Tried a few other text object commands and they also worked)

Macros

qa - record macro a
q - stop recording macro
@a - run macro a
@@ - rerun last run macro

Cut and paste

yy - yank (copy) a line
2yy - yank (copy) 2 lines
yw - yank (copy) the characters of the word from the cursor position to the start of the next word
yiw - yank (copy) word under the cursor
yaw - yank (copy) word under the cursor and the space after or before it
y$ - yank (copy) to end of line
p - put (paste) the clipboard after cursor
P - put (paste) before cursor
gp - put (paste) the clipboard after cursor and leave cursor after the new text
gP - put (paste) before cursor and leave cursor after the new text
dd - delete (cut) a line
2dd - delete (cut) 2 lines
dw - delete (cut) the characters of the word from the cursor position to the start of the next word
diw - delete (cut) word under the cursor
daw - delete (cut) word under the cursor and the space after or before it
D - delete (cut) to the end of the line
d$ - delete (cut) to the end of the line
x - delete (cut) character

Indent text

>> - indent (move right) line one shiftwidth
<< - de-indent (move left) line one shiftwidth
>% - indent a block with () or {} (cursor on brace)
>ib - indent inner block with ()
>at - indent a block with <> tags
3== - re-indent 3 lines
=% - re-indent a block with () or {} (cursor on brace)
=iB - re-indent inner block with {}
gg=G - re-indent entire buffer
]p - paste and adjust indent to current line

Search and replace

/pattern - search for pattern
?pattern - search backward for pattern
\vpattern - 'very magic' pattern: non-alphanumeric characters are interpreted as special regex symbols (no escaping needed)
n - repeat search in same direction
N - repeat search in opposite direction
:%s/old/new/g - replace all old with new throughout file
:%s/old/new/gc - replace all old with new throughout file with confirmations
:noh[lsearch] - remove highlighting of search matches

CodeWarrior Vim ':' commands (below taken from vim.js code)

{ name: 'colorscheme', shortName: 'colo' },
{ name: 'map' },
{ name: 'imap', shortName: 'im' },
{ name: 'nmap', shortName: 'nm' },
{ name: 'vmap', shortName: 'vm' },
{ name: 'unmap' },
{ name: 'write', shortName: 'w' },
{ name: 'undo', shortName: 'u' },
{ name: 'redo', shortName: 'red' },
{ name: 'set', shortName: 'se' },
{ name: 'setlocal', shortName: 'setl' },
{ name: 'setglobal', shortName: 'setg' },
{ name: 'sort', shortName: 'sor' },
{ name: 'substitute', shortName: 's', possiblyAsync: true },
{ name: 'nohlsearch', shortName: 'noh' },
{ name: 'yank', shortName: 'y' },
{ name: 'delmarks', shortName: 'delm' },
{ name: 'registers', shortName: 'reg', excludeFromCommandHistory: true },
{ name: 'vglobal', shortName: 'v' },
{ name: 'global', shortName: 'g' }

Other CodeWarrior Vim specific commands - Change the theme!

:colorscheme [themename] - will display current them or let you changte it
(dartpad|darkpad are only stylessheets we have loaded by default)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
P3 A lower priority bug or feature request type-enhancement A request for a change that isn't a bug
Projects
None yet
Development

No branches or pull requests

5 participants