My .vimrc and other files: https://gitlab.com/tuckerw/vimrc/
It’s also a submodule in my dotfiles repo: https://gitlab.com/tuckerw/dotfiles/
Clone repo:
mv ~/.vim ~/.vim.bak
git clone https://gitlab.com/tuckerw/vimrc.git ~/.vim
cat ~/.vim/README.mdOr just get the .vimrc file:
cd
wget https://gitlab.com/tuckerw/vimrc/raw/master/.vimrc # OR
curl -O https://gitlab.com/tuckerw/vimrc/raw/master/.vimrcVim is referred to as a ‘modal text-editor’. This means that, unlike other text-editors that can be thought of as always operating in ‘insert mode’, vim has multiple modes, each which allows you to accomplish different things, often with blinding speed and efficiency.
i to enter insert mode, and <Esc> to exit and return to normal mode:wq. Entered by typing : from normal modev to enter visual modeThere are so many reasons… I’ll have to fill out this section later.
The first thing you should do is launch vimtutor by simply typing vimtutor into your terminal. Vimtutor should take an hour or less. It launches you into a vim session editing a buffer containing the vimtutor text. All you need to do is follow along, navigating and editing the buffer as the text instructs.
After having run through vimtutor you’ll have a good grasp of the basics, though you may not remember all of it! At this point I recommend you simply begin using vim to edit files.
Vim Adventures: a 2.5D Vim game:
https://vim-adventures.com/
Try to adhere to the following precepts to get the hang of vim more quickly:
Esc)h, j, k, l, and other movement keys to navigate!i, a, I, A, o, O, etc.) to enter insert mode when you wish to add textdaw to delete the word under your cursor, instead of entering insert mode with i and then repeatedly hitting delete to erase the word.vimrc initially; first learn all the robust functionality that stock vim provides!:wq everytime you want to test your changes! Use :sh to exit vim in a subshell, run commands, then use <C-d> to return to vim. This way you retain undo history, buffers, registers, macros, etc.:!command e.g. :!git status to run the command and see the output before returning to vimhttps://devhints.io/vim
vim filename.ext open filename.txt from the command line in vim
vim filename1.ext filename2.ext open multiple files from the command line
i enter insert mode to type characters into the file
<Esc> exit insert mode, returning to normal mode
:q quit vim, closing all buffers
:q! force-quit vim, not saving any unwritten changes
:wq, :x, ZZ save current buffer and quit vim
u undo
<C-r> redo (<C-r> denotes typing Ctrl + r simultaneously)
Here are some basic settings I’d recommend. As mentioned, you can add these to your ~/.vimrc file.
" Be IMproved
set nocompatible
" Enable syntax
syntax on
" allow editing multiple buffers with unsaved changes
set hidden
" expand tabs to spaces
set expandtab
" set default indent to 4 spaces
set tabstop=4
set shiftwidth=4
set ci
" enable mouse mode
set mouse=aThe first thing to learn in vim is the basic movements.
h go back/left a character
l go forward/right a character
j go up a line
k go down a line
gj go up a visual line (on wrapped lines)
gk go down a visual line (on wrapped lines)
w go forward a word
W go forward a Word (space-delimited)
e go forward to end of word
E go forward to end of Word (space-delimited)
b go backward a word
B go backward a Word (space-delimited)
ge go backward to end of word
gE go backward to end of Word (space-delimited)
gg go to beginning of file
G go to end of file
} go to next empty line (i.e. line after end of paragraph)
{ go to previous empty line (i.e. line before start of paragraph)
]] go to next function/heading (if vim settings and filetype support it)
[[ go to previous function/heading (if vim settings and filetype support it)
<integer>gg, <integer>G go to line <integer>
:<integer> go to line <integer>
<integer>% go to <integer> percent of file
/search-pattern go to next occurrence of search-pattern
?search-pattern go to previous occurrence of search-pattern
f<character> go to next occurrence of character on current line
F<character> go to previous occurrence of character on current line
t<character> go to character before next occurrence of character on current line
T<character> go to character after previous occurrence of character on current line
; equivalent to last f / F / t / T command
, equivalent to the reverse of last f / F / t / T command
'<char> go to line of mark <char>
`<char> go to line and column of mark <char>
i / a )p paragraph
s sentence
t tag e.g. <div class="red"><p>text</p></div>
' single-quoted region e.g. 'this is a string'
" double-quoted region e.g. "this is a string"
(, ) parentheses block e.g. (index, value)
[, ] square-brace block e.g. ['one', 'two']
{, } curly-brace block e.g. { i++; closeSession(); }
<, > ankle-brace block e.g. <input type="hidden" name="test">
zt Scroll page so current line is at top of page
zz Scroll page so current line is at middle of page
zb Scroll page so current line is at bottom of page
H Move cursor to top of page
M Move cursor to middle of page
L Move cursor to bottom of page
zh Scroll page one column left (requires :set nowrap)
zl Scroll page one column right (requires :set nowrap)
:set sidescroll=n Set page to scroll horizontally by n columns automatically (requires :set nowrap)
<C-e> Scroll page one line down
<C-y> Scroll page one line up
<C-u> Scroll half a page up
<C-d> Scroll half a page down
<C-b> Scroll one page up
<C-f> Scroll one page down
<C-o> Go to previous instance in jump list
<C-i> Go to next instance in jump list
i inner
a around
Now that you have basic movements down, it’s time to learn actions. Note that most actions can be combined with a movement in some way.
r replace character under curser or every character in selection with next character entered
x delete character under curser or in selection
s delete character under curser or in selection and enter insert mode (equivalent of cl)
o add newline below current line and enter insert mode
O add newline above current line and enter insert mode
J join current line to next line with a space between
= autoformat line(s)
>> indent line(s)
<< de-indent line(s)
y yank
d delete
c change
v visual select
V visual select by line
<C-v> visual-block select
gu make lowercase
gU make uppercase
g~ switch capitalization
~ switch capitalization under cursor
gq break lines at 80 characters or whatever setting
:sort sort alphabetically
:sort i sort case-insensitively
(Under Construction)
gj
gk
g^
g0
g$
gq
gf
C-^
gJ join like `J` but without spaces
gu
gU
~
g~
g& run previous sed replacement on whole file
g* like `*` but without word boundaries (`\<` `\>`)viw select inner word
daw delete around word
c3aw change around 3 words
gUi" make everything in the quoted region uppercase
vip:sort sort the lines in a paragraph
== auto-indent line
=5ap auto-indent current paragraph plus the next 4
>i} indent all lines inside curly braces ({ ... })
* - Search for word under cursor
<C-r> 0 - paste contents of register 0 when in insert mode (any register can be substituted)
<C-r> " - paste contents of register " when in insert mode (any register can be substituted)
:registers - show contents of registers
a-z A-Z - normal available registers
+ - clipboard register
0-9 - number registers (more details later)
:marks list all marks
:jumps list all jumps
:changes list all changes
m[a-z] mark current line/column with lowercase letter
m[A-Z] mark current line/column/file with uppercase letter
'[a-z] jump to mark line in current file
'[A-Z] jump to mark line in any file
`[a-z] jump to mark line and column in current file
`[A-Z] jump to mark line and column in any file
<C-o> Go to previous instance in jump list
<C-i> Go to next instance in jump list
g; go to previous instance in change list
g, go to next instance in change list
[c go to previous changed line (if using gitgutter plugin)
]c go to next changed line (if using gitgutter plugin)
Buffers are essentially your open files. Tabs, on the other hand, are better thought of as workspaces: Arrangements of buffers, splits, etc.
:ls list open buffers
:tabs list open tabs
:args list args
:e file.ext open file.ext in new buffer
:b file.ext switch to file.ext buffer
:tabe file.ext open file.ext in new tab
gt go forward a tab
gT go backward a tab
:bn go forward a buffer
:bp go backward a buffer
:b 1 go to buffer 1
:bfirst go to first buffer
:blast go to last buffer
bufdo %s#search#replace#g | update replace search with `replace in every buffer and save each
In my .vimrc only:
gb go forward a buffer
gB go backward a buffer
With these mappings:
" move among buffers
map gB :bprev<CR>
map gb :bnext<CR>:bd exit buffer
:bd! force-exit buffer, even with unsaved changes
:tabclose exit tab
:tabclose! force-exit tab
:arga file.ext add file.exe to the arglist
:argd file.ext remove file.exe from the arglist
:args one.ext two.ext manually populate arglist with one.ext and two.ext
:args **/*.ext glob all *.ext files into the arglist
:args `find . -type f -name '*.ext'` populate arglist from find command
`[a-z] jump to mark line and column in current file
:next go forward an arglist file
:prev go back an arglist file
:first go to first arglist file
:last go to last arglist file
argdo %s#search#replace#g | update replace search with `replace in every arglist file and save each
u undo
<C-r> redo
g- go back 1 text-change (can get to ‘lost’ text-states unlike normal undo and redo)
g+ go forward 1 text-change (can get to ‘lost’ text-states unlike normal undo and redo)
:earlier 3 undo last 3 changes
:earlier 5m go back to state from 5 minutes ago
:earlier 5h go back to state from 5 hours ago
:earlier 1d go back to state from 1 day ago
:later 3 redo last 3 changes
:later 5m go forward to state 5 minutes from now
:later 5h go forward to state 5 hours from now
:later 1d go forward to state 1 day from now
qa start recording macro into register a
q stop recording macro
qA append further commands onto macro in register a
@a execute macro a
@@ execute last macro executed
Insert Mode Cheatsheet <C-o> Enter insert-normal mode, where you can do a normal-mode command then return to insert-mode
<C-o>3k go up 3 lines and stay in insert mode
<C-o>zz center current line vertically and stay in insert mode
<C-o>!!git status | head paste output of git status | head directly into buffer
:options
:options | resizew|tabs write and list tabs
w|!git status write and see git status
w|!git status write and see git status
:w|silent !tmux split-window -h "git diff" write and run git diff command in new vertical tmux split
:w|silent !tmux split-window -h "ls -althr; read;" write and run ls -althr command in new vertical tmux split, returning focus to vim, and keeping pane open with read;
q: view commands
q/ view searches
Enter Executes
<C-c> copies to command line
Ignore whitespace:
:set diffopt+=iwhiteall
:h diffoptSet a nice colorscheme:
:colo eveningAlso useful for colors:
:syntax off]c advance to the next block with differences
[c reverse search for the previous block with differences
do (diff obtain) bring changes from the other file to the current file
dp (diff put) send changes from the current file to the other file
zo unfold/unhide text
zc refold/rehide text
zr unfold both files completely
zm fold both files completely
:'<,'>diffget equiv. of do in visual mode
:'<,'>diffput equiv. of dp in visual mode
:diffupdate rescan files for changes
:h copy-diffs view help for vimdiff
Settings for ~/.gitconfig:
git config—global merge.tool vimdiff
git config—global merge.conflictstyle diff3
git config—global mergetool.prompt false
# don't automatically mark conflicts as resolved when exiting vimdiff
git config—global mergetool.vimdiff.trustExitCode falseRun mergetool after conflicts arise on attempted merge:
git mergetool <file>:diffg LO get from LOCAL
:diffg RE get from REMOTE
:diffg BA get from BASE
:[range]g/pattern/cmdWhere cmd is an ed command! (Will be listed below)
Learn ed:
$ info—vi-keys EdIn place with sed (saves a .bak file):
sed -i.bak "s/\[\([a-zA-Z]\w*\)\]/\[\"\1\"\]/g" test.phpSearch pattern in vim:
\[[a-zA-z]\w*\]Search-and-replace in vim:
%s#\[[a-zA-z]\w*\]#\[\'\0\'\]#c`zf`   => create fold
`zf%`  => create fold to matching brace etc.
`zf5j` => create fold to 5 lines down
`zo`   => open fold
`zc`   => close fold
`za`   => toggle fold
`zm`   => increase global fold level
`zM`   => close all folds
`zr`   => decrease global fold level
`zR`   => open all folds:Vex Open default file-explorer (Netrw) in vertical-split
:Vex! Open default file-explorer (Netrw) in vertical-split on opposite-side (to the right)
:Sex Open default file-explorer (Netrw) in horizontal-split
:Hex! Open default file-explorer (Netrw) in horizontal-split on opposite side (on the top)
:Tex Open default file-explorer (Netrw) in new tab
:Ex Open default file-explorer (Netrw) in current buffer
s Change sort between name, time, and filesize
r Reverse sort-order
gh toggle hidden files
i Change between listing modes
Enter open file/directory
o open in new horizontal split
v open in new vertical split
t open in new tab
A helpful list of Netrw Commands
gresp -i fullsize | vim - -c "%normal gf gb" -c 'bd!' -c ':bn':set expandtab
:set tabstop=4
:set shiftwidth=4
:set ft={php,js,html,c,...}
:set ci:set cursorline
:set cursorcolumnvim scp://user@server//path/to/folder/
vim scp://user@server//path/to/document" Remap if_ to if
:inoremap if_ if () {<CR>}<esc>k<esc>4li
" Remap ie_ to if/else
:inoremap ie_ if () {<cr>} else {<cr>}<esc>kk<esc>4li
" Remap iee_ to if/elseif/else
:inoremap iee_ if () {<cr>} elseif () {<cr>} else {<cr>}<esc>2k<esc>4li
" Remap fn_ to function
:inoremap fn_ function () {<cr>}<esc>kf(i
" Remap pr_ to print "<pre>" . print_r(, true) . "</pre>";
:inoremap pr_ print "<pre>" . print_r(, true) . "</pre>";<esc>F,imaps // to search for visually selected text
vnoremap // y/\V<C-R>=escape(@",'/\')<CR><CR>maps 
nnoremap <leader>/ :%s///gn<CR>let g:indentLine_color_term ='darkblue' | eShow relevant help
:h highlShow all highlight groups
:so $VIMRUNTIME/syntax/hitest.vimShow highlight settings for given group
:hi LineNrSet highlight settings for given group
:hi LineNr term=underline ctermfg=103 ctermbg=236 guifg=#878787 guibg=#303030<C-k> letter + symbol General format
<C-k> e' é
<C-k> D* Δ
<C-k> d* δ
<C-k> O/ Ø
Type Greek letters with Digraphs
/\(\("https:\/\/\)\?{\?\(" \?\. \?\)\?\$GLOBALS\["\?\(frontend_domain\|backend_document_root\)"\?\]\( \?\. \?"\)}\?\/\)\?artistsimages\|artistimages\|"aws_samples"
/"\?\(https:\/\/"\? \?\. \?\)\?{\?$GLOBALS\["\?\w\+"\?\]}\?\( \?\. \?"\)\?\/\?artistsimages\|artistimages\|"aws_samples"
/"\?\(https:\/\/\("\? \?\. \?\)\?\)\?{\?$GLOBALS\["\?\w\+"\?\]}\?\( \?\. \?"\)\?\/\?artistsimages\|artistimages\|"aws_samples"
/'\?"\?\(https:\/\/\("\? \?\. \?\)\?\)\?{\?$GLOBALS\["\?\w\+"\?\]}\?\( \?\. \?"\)\?\/\?artistsimages\|artists\?images\|"aws_samples"
/'\?"\?\(https:\/\/\("\? \?\. \?\)\?\)\?{\?$GLOBALS\["\?\w\+"\?\]}\?\( \?\. \?"\)\?\/\?artists\?images\|'\?\/\?artists\?images\|"aws_samples"
/"\?\(https:\/\/\("\? \?\. \?\)\?\)\?{\?$GLOBALS\["\?\w\+"\?\]}\?\( \?\. \?"\)\?\/\?artists\?images\|\/\?artists\?images\|"aws_samples"
/"\?\(https:\/\/\(www\.callforentry\.org\)\?\("\? \?\. \?\)\?\)\?\({\?$GLOBALS\["\?\w\+"\?\]}\?\)\?\( \?\. \?"\)\?\/\?artists\?images\|\/\?artists\?images\|"aws_samples"
/"\?\(https:\/\/\(www\.callforentry\.org\)\?\("\? \?\. \?\)\?\)\?\(<?= \)\?\({\?$GLOBALS\["\?\w\+"\?\]}\?\)\?\( ?>\)\?\( \?\. \?"\)\?\/\?artists\?images\|\/\?artists\?images\|"aws_samples"