Vim

From Things and Stuff Wiki
Jump to navigation Jump to search


Vim is a powerful text editor. Keystrokes can be chained together to combine actions, movements and selections into coolness. Folk using Vim 20 years still don't know it all.

Quick

Guides

Video

  • 7 Habits For Effective Text Editing 2.0
    • "A large percentage of time behind the computer screen is spent on editing text. Investing a little time in learning more efficient ways to use a text editor pays itself back fairly quickly. This presentation will give an overview of the large number of ways of using Vim in a smart way to edit programs, structured text and documentation. Examples will be used to make clear how learning a limited number of habits will avoid wasting time and lower the number of mistakes. Bram Moolenaar is mostly known for being the benevolent dictator of the text editor Vim."

Main stuff

vim filename
  open file (or buffer if file doens't exist)
:e filename
  open filename in vim

:w
  save
:w filename
  save as
:q
  quit if saved
:x
  save if changed and quit, same as :wq
ZZ
  save as above
ZQ
  even if not saved (also :q!)

:ex . - explore files in file directory. opens in split pans if file modified.
:Sex - as above but forces split
:Vex - as above but vertical split
:Tex - as above but in new tab
  <enter> - open file
  o - open file in new split buffer
Ctrl-N
  autocomplete keyword forwards
Ctrl-P
  autocomplete keyword backwards

Moving around

zz - centre screen on cursor
zt - move screen top to cursor
zb - move screen bottom to cursor
Ctrl-e
  Moves screen up one line
Ctrl-y
  Moves screen down one line
Ctrl-u
  Moves screen up ½ page
Ctrl-d
  Moves screen down ½ page
Ctrl-b
  Moves screen up one page
Ctrl-f
  Moves screen down one page [2]
0 - line beginning
^ - first non-whitespace character
$ - line end
e - forward word
E - forward WORD
b - back word
B - back WORD
{ - beginning of previous
} - next paragraph
( - beginning of previous
) - next sentence
% - current brace

/ - find text
* - jump to next occurrence of work
n - repeat forwards
N - repeat backwards
H - cursor to top of screen (high)
M - cursor to middle of screen (middle)
L - cursor to bottom of screen (low)
Ctrl-D  move cursor down half-page
Ctrl-U  move cursor up half-page
gg - start of file
G - end of file
123G - move to line 123
:123 - move to line 123 (easier imo)
ma - mark cursor position 'a'
'a - move to mark position 'a'

Split windows

Windows are like tmux panes, awesome clients. Windows can hold file buffers or things like Nerdtree. Tabs are a set of windows and not covered here yet.

:sp [filename]
  open file in new window
Ctrl-W w
  move forward window
Ctrl-W W
  move backwards window
Ctrl-W then h, j, k, l
  select window left, below, above, right
Ctrl-W h
  swap buffer in active window with the window below
Ctrl-W k
  as above, to above
Ctrl-W h
  as above, to left
Ctrl-W l
  as above, to right
Ctrl-W x
  switch windows around
Ctrl-W _
  maximize window horizontally
Ctrl-W |
  maximize window vertically

Buffers

:b [buffer number of any part of name]
  switch to buffer
set wildchar=<Tab> wildmenu wildmode=full
  with this, :b [tab] gives a menu

Operations

. - repeat last change
u - undo last change
Ctrl-u - undo whilst in insert mode 
U - undo all changes to current line
Ctrl-r - redo
i - insert at cursor
I - insert at line beginning

a - append after the cursor
A - append at the end of the line

o - add ('open') line below and insert
O - add line above and insert
x - delete character under cursor
X - delete character before cursor
y - yank (copy) current text
  yy - yank current line
p - paste yanked text after cursor/line
P - pasted yanked text before cursor/line

d - delete and yank (cut)
  df* - delete to (find) and including *
  dl - delete character (alias: "x")
  dd - delete current line including linebreak
  dw - delete to end of word from cursor
  d$ - delete to end of line from cursor
  diw - delete inner word
  diW - delete inner WORD
  daw - delete word, up to delimiter
  daW - delete WORD, including previous space
  dis -   delete inner sentence
  das -  delete a sentence
  dib -  delete inner '(' ')' block
  dab -  delete a '(' ')' block
  dip -  delete inner paragraph
  dap -  delete a paragraph
  diB -  delete inner '{' '}' block
  daB -  delete a '{' '}' block

c - change (delete and insert)
  cc - delete current line including linebreak, insert
  cw - delete to end of word from cursor, insert
  c$ - delete to end of line from cursor, insert
  ciw - delete inner word, insert
  ci" - change inner quoted string
  ci( - change inner brackets
  ci[ - change inner contents of [].. ci], ci) for insert on closing bracket
  caw - change an object
  caW - change an object, including space
  etc.

v - visual select text
  viw - visual inner word
  viw~ - visual inner word, toggle case
  vip - visual inner paragraph
  vec - visual, end of word, change highlighted
V - visual select lines
Ctrl-v - visual select a block

s - change one character and insert

Ctrl-Y - copy character from line above
Ctrl-E - copy character from line below

Ctrl-N - auto-completion next match
Ctrl-P - auto-completion previous match
 
> - indent right
< - indent left
V=  - visual select lines, then reformat with =
= - fix indentation for selection
== - fix indentation for one line
:s/foo/bar/ - search and replace first occurrence
:s/foo/bar/s - search and replace, global current line
:%s/foo/bar/g - search and replace, global whole file
:%s/foo/bar/gc - search and replace, with confirm

:g/text string/d - delete all lines with text string
:!g/text string/d - delete all lines without text string [3]
  :g!/^\s*#/d - delete all lines without a #
qa - start recording macro 'a', q - stop recording
qA - start appending to macro 'a'
@a - play macro a
@@ - execute again
3@a - play macro 3 thrice

:let @a='macrogoeshere' - write macro manually
Ctrl-R Ctrl-R a - insert mode
:let @a='Ctrl-R Ctrl-R a - edit existing macro

Git

:Gwrite - git add file
:Gread - git checkout (revert) open to staged version
:Gremove - git rm and close buffer
:Gmove - git mv file. with /, relative to git root; without, relative to file
:Gcommit - git commit, opens message buffer
:Gblame - open split window with git blame details
:Gbrowse - open Github, else git instaweb for local sevrer

vimdiff resolution:

:diffget [buffer] - get diff from another buffer
:diffput [buffer] - put diff into another buffer
:diffupdate - update diff colouring
dg - get from other buffer pane (only 2 pane)
dp - put to other buffer pane (works in 3 pane)
[c - jump to previous changeset
]c - jump to next changeset
:only - close buffers other than active

Folds

Folds are sections of text reduced to one line (based on brackets, indentation, etc.). Folding is on by default. I have the foldlevel dialed up to 20 to avoid them.

zo - open fold
zO - open fold recursively
zc - close fold
zC - close fold resursive
zR - open all folds
zM - close all
zj - go down and up a fold
zk - go up a fold

Handy

:e scp://root@example.com/~user/folder/.config - open remote file
$ vim scp://root@example.com/~user/folder/.config
:reg - list register contents
K - in normal mode, run man for current word (opens "man word" in shell)

Vimscripts

Management

Git

GitHub

Syntax

Tools

To sort

to check;

gc{motion}
  toggle comments (for small comments)
gcc
  toggle comment for the current line
gC{motion}
  comment region
gCc
  comment the current line

Mouse?