LinuxDays Introduction to Vim
Lecturer: Lukas Tobler HS2017, Version 1.0 A brief history
● 1976: Vi, Bill Joy
● 1984: GNU Emacs, Richard Stallman
● 1991: Vim, Bram Moolenaar (Amiga 2000)
[2] Richard Stallman [3] Bram Moolenaar What is Vim?
● Vi IMproved
● Text editor (think Notepad++, but good)
● Edits plain old text
● Program source code
● But also creative writing, note taking, …
Screenshot
Editor learning curves
Why is it good?
● Very efficient way to edit text
● No mouse input required!
● No awkward keyboard shortcuts
● Commands are composable (Vim is a “language”)
● “Ergonomic”
Why is it good?
● Can navigate large code bases comfortably
● Distraction free environment
Why is it good?
● Highly flexible, configurable, extensible
● Available everywhere (Linux, BSDs, Mac, Win, ...)
● Free software, will never go away!
● Lots of fun
The test of time
[1] Orignial presentation by Bram Moolenaar: Vim 25 The test of time
[1] Orignial presentation by Bram Moolenaar: Vim 25 What it is not
● Not an IDE (pretty close though)
● Cannot replace Eclipse, IntelliJ, Visual Studio, PhpStorm, …
● But doesn’t have to!
What should I edit then?
● You don’t need/have an IDE for lots of things – C, C++, Python, Haskell, Rust, Go, Fortran – Build systems: Makefiles, CMake – Web development: HTML, CSS, JavaScript, PHP, Ruby – LaTeX, Markdown – System administration: Shell scripts, config files
Where to get it
● Newest Version: Vim 8.0
● Linux: package manager. vim, gvim (might be named differently, beware different versions!)
● Mac: comes preinstalled, but use MacVim instead (→ Homebrew package manger)
● Windows: download from vim.org
If you depend on IDEs
● Don’t worry!
● Eclipse: Vrapper
● IntelliJ: IdeaVim
● Visual Studio: VsVim
Lets get into it
● Vim is very different from any other editor you might have used!
“Empty your cup so that it may be filled; become devoid to gain totality.” - Bruce Lee
Modal editing
● Few CTRL keybindings ● “Letter” keybindings ● Different modes! – Normal mode – Insert mode – Visual mode – Command line mode
Transitions
Normal
ESC v, V
i, I, a, o, ... ESC, d, y, ...
Insert Visual c, r, ...
Command Line Mode - Demo
● Enter with :
● :e[dit] edit a file
● :q[uit] quit
● :q[uit]! quit without saving
● :w[rite] save the open file (write)
● :wq write and quit
Command Line Mode - Demo
● Vim help pages
● :h[elp]
● :help [topic] e.g. :help write
● CTRL-] follow a link
● CTRL-t jump back
● … or google it.
Normal Mode - Demo
● Navigation
● Cursor movement
● Deleting
● Copy/Paste
● Text modification
ADM-3A keyboard
System settings - recommendations
● Swap Caps Lock and Escape – Caps Lock is a comfortable key, but nobody uses it – Linux (temporary):
$ setxkbmap ch -option caps:swapescape
ch, de, en_US
Arrow keys are the devil - Demo
● Don’t use arrow keys! It slows you down.
k up
h left l right
j down
Scrolling - Demo
● Don’t use j, k to scroll! Instead:
● Ctrl-e One line down
● Ctrl-y One line up
● Ctrl-d Half page down
● Ctrl-u Half page up
● Ctrl-f One page down
● Ctrl-b One page up
● Remember only the ones you like! System settings - recommendations
● Increase keyboard auto-repeat rate – Linux (temporary):
$ xset r rate 230 30
Delay in ms Repeat speed in Hz
Undo / Redo
● u undo ● Ctrl-r redo
Movement: Words
● w, W start of next (big) word ● e, E end of a (big) word ● b, B backwards to start of (big) word
What is a word?
● This is an example sentence.
“small” word: only letters & numbers.
● This one has a “string_literal” in it.
“big” word: anything thats not a space.
Actions: Deleting stuff
● d Delete ● dd Delete line ● D Delete rest of line ● x Delete character
Actions: Changing stuff
● c Change ● cc Change line ● C Change rest of line ● rx Replace character with x
Examples - Demo
● dW delete word forward ● dB delete word backward ● ciw change inside word
Movement
● h,j,k,l left, down, up, right ● 0, $ start / end of line ● ^ first non-whitespace character ● gg, G start / end of file
Find things - Demo
● fx go to next occurrence of x ● Fx go to previous of x ● tx go to before occurrence of x ● Tx go to after previous of x ● /findme go to next occurrence of findme
Composition “theory”
● Vim sentence: verb modifier object ● Verb: v (visual), c (change), d (delete), y (yank) ● Modifiers: i (inside), a (around) ● Object (“movement”): w (word), s (sentence), p (paragraph), f (find), ...
● → cip “change inside paragraph”
Compose! (Examples)
● dj delete downwards ● di” delete inside “” ● 3dw delete three words ● c$ change until end of line ● ^ct; change from start of line until just before “;” ● ggdG delete the entire file ● d/word delete until the next occurrence of “word”
Number prefix
● Most commands can be prefixed with a number:
● 100G Go to line 100
Command repetition
● . Repeat last command
Insert Mode - Demo
● Type to insert text
● i Go to insert mode
● ESC Back to normal mode
Ways to get into insert mode
● a append after cursor ● A append at end of line ● o new line below cursor ● O new line above cursor
Copy / Paste
● y “yank” (copy) ● p paste
● No Ctrl-V / Ctrl-C! However, copy paste behaviour depends on terminal. GNOME: Ctrl-Shift-c, Ctrl-Shift-v ● Can use middle mouse click!
Yanking
● yy yank line ● yiw yank inside word
Visual mode - Demo
● v visual mode (character selection) ● V visual mode (line selection)
Sync system clipboard with Vim
● Put this in ~/.vimrc:
● set clipboard=unnamedplus
Search and replace
● The command can be used for arbitrary complex edits. Example: Search / Replace
● :s/before/after/g replace “before” with “after” on this line
● :%s/before/after/g replace “before” with “after” on every line
Buffers - Demo
● A buffer holds a file in memory
● Editing a file creates buffer
● Accidentally opened a new file and you didn’t save the old one? No problem!
● :ls, :buffers list buffers
● :b[uffer] [n] open n-th buffer
Many more options/commands available!
Tabs - Demo
● :tabnew Open new tab
● gt, Ctrl-PageUp Next tab
● gT, Ctrl-PageDown Previous tab
Useful key mapping: nnoremap gn :tabnew
Windows - Demo
● Ctrl-w {h,j,k,l} Select left/down/up/right
● Ctrl-w {H,J,K,L} Move left/down/up/right
● Ctrl-w v New vertical split
● Ctrl-w s New horizontal split
● Ctrl-w r Rotate layout
● Ctrl-w w Next window
● Can use mouse to select/resize panes!
I need a terminal! - Demo
● Ctrl-z suspend Vim to the background
● $ fg bring it back
● Really a shell feature, not Vim
● Useful at exams ;)
ctags - Demo
● Tool for easy code navigation
● For most languages
● Works like the Vim help page!
● Generate tags with command line tool: $ ctags -R
● :!ctags -R Generate tags from inside Vim
● Ctrl-] Jump to definition
● Ctrl-t Go back in the stack
Plugins - Demo
● Thousands of plugins are available ● Use a plugin manager, e.g. vim-plug [9]
Plugins: NERDTree (file browser)
[4] Plugins: vim-fugitive (git wrapper)
[5] Plugins: YouCompleteMe
[6] Plugins: multiple cursors ([7])
● Demo!
Plugins: Color themes
[8] PaperColor Theme Your next steps
● Use VIM ● Go through vimtutor ● Look for cheatsheets, or make your own
Sources
● [1] Vim 25 presentation, Bram Moolenaar, November 2nd 2016: https://www.youtube.com/watch?v=ayc_qpB-93o
● [2] Bram Moolenaar: https://upload.wikimedia.org/wikipedia/commons/thumb/f/ff/Bram_Moolenaar_in_2007.jpg/220px-Bram _Moolenaar_in_2007.jpg ● [3] Richard Stallman: https://i1.wp.com/hipertextual.com/files/2015/03/manifiesto-gnu-richard_stallman.jpg?resize=600%2C4 00 ● [4] NERDTree: https://github.com/scrooloose/nerdtree
● [5] vim-fugitive: https://github.com/tpope/vim-fugitive
● [6] YouCompleteMe: https://github.com/Valloric/YouCompleteMe
● [7] vim-multiple-cursors: https://github.com/terryma/vim-multiple-cursors
● [8] PaperColor Theme: https://github.com/NLKNguyen/papercolor-theme
● [9] vim-plug: https://github.com/junegunn/vim-plug