Check out aiproxy.pro

Vim cheat sheet

Vim gotcha, undofile not working

Make sure to create the undo dir manually. Vim won’t automatically create it.

mkdir ~/.vim/undo  

Then, set this in ~/.vimrc

set undofile  
set undodir=~/.vim/undo/  

This will make undo span multiple vim sessions.
Closing and re-opening vim won’t interfere with undo history.

How to delete to the end of the line from cursor

D in normal mode

How to use marks

How to record and repeat a macro

How to use ctags with vim

Build tags for macOS with:

brew install universal-ctags  
cd <my-proj>  
ctags -R *  

Add tags to ~/.gitexcludes

Modify ~/.vimrc to contain:

Plug 'vim-scripts/taglist.vim'  
set tags=./tags;  
noremap <leader>t :TlistToggle<CR>  

In vim:
- Use \t to toggle the tag list
- Use C-] to jump to a tag
- Use C-w C-] to split the window before jumping to tag
- Use :tn to go to the next tag and :tp for previous
- Use :ta <tagname> to jump to a tag (supports autocomplete)
- Use vim -t <tagname> to start vim at a tag
- Use :ts to see a list of matching tags, or :ts <tagname>

In taglist, use s to sort symbol list alphabetically, and s again to undo.

Autocomplete cheat sheet

How to increment numbers and decrement numbers

In normal mode or visual mode
increment with C-a
Decrement with C-x

Increment all these to 2 by visually selecting them and then C-a


Increment these to 2,3,4 by visually selecting them and then g C-a


How to use fzf with vim

Open a file in vim that I’ve fuzzy matched using fzf:

vim $(fzf)  

How to open the current directory in Finder from vim

:! open %:p:h  

How to find which version of python vim was compiled with:

:py3 import sys; print(sys.version)  

Which spit out
3.12.3 (main, Apr 9 2024, 08:09:14) [Clang 15.0.0 (clang-1500.3.9.4)]

Can also use vim --version and look at -L/opt/homebrew/opt/python@3.12 line.

I modified the 3.12 environment myself with:

/opt/homebrew/opt/python@3.12/bin (stable) $ ./pip3 install ollama --break-system-packages  

How to check the file encoding of a file

:set fileencoding  

How to format json of a visual selection

Create the visual selection, then

!jq .  

How to format full json file

Careful, this is destructive.
Open json file in vim, then
:%!python -m json.tool

How to call a function I’ve defined in ~/.vimrc

:call TrimWhiteSpace()

How to turn off auto-indent

Some plugins set the indentexpr variable
Investigate it with :set indentexpr?
Turn it off with :set indentexpr=

How to open the command line window

In normal mode, use q:
If already in command mode, use C-f

How to move to beginning of line in command mode

C-e works to move to the end of line in command mode,
but C-a does not move to the start by default.


cnoremap <C-a> <Home>  
cnoremap <C-e> <End>  
cnoremap <C-p> <Up>  
cnoremap <C-n> <Down>  
" cnoremap <C-b> <Left>  
" cnoremap <C-f> <Right>  
" cnoremap <M-b> <S-Left>  
" cnoremap <M-f> <S-Right>  

I don’t use the <M-b> and <M-f> shortcuts, and prefer the default
<S-Left> and <S-Right> settings, which I also change in my .bash_profile
to navigate left and right by a word.

I also don’t use C-f because it breaks a handy feature of vim.
If already in command mode, C-f opens the full command window.


How to sort lines

I use a visual selection and then :sort

How to run the current file being edited

Use the %, for example:

!clear && python %  

Nerdtree cheat sheet

How to use vim-surround

Surround word under cursor with quotes: ysiw"
Change the surrounding from single to double quotes: cs'"
Delete the single quotes surrounding: ds'

How to use easymotion

I use easymotion for jumping to a specific word in the window.
I find it works better than incremental search because I already have my eye on
where I want to go. Sometimes with incremental search I fat finger a character
and the buffer jumps to an odd location and then I’m disoriented.

I use easymotion and map

nmap <Leader>s <Plug>(easymotion-sn)  

Then use \s and start typing.
I also sometimes use \\f if I want to jump to a specific character that is
not in the same line as my cursor.

How to show a vertical column as a wrap guide

Turn on with :set colorcolumn=110
Turn off with set colorcolumn=0

Tabs cheat sheet

I don’t use tabs often.
- The thing at the top is called the tabline
- Create a new tab with :tabnew
- Switch between tabs with gt or :tabn :tabp

It’s enticing to use set autochdir when working with tabs, but I leave it off because I lose all rails.vim shortcuts.

How to get started

Run vimtutor

How to show all tab matches in command mode

Normally when I’m in command mode and press tab I get a single completion at a time.
Add this to ~/.vimrc

set wildmode=longest,list  

then when I use :e pattern<Tab> I get a command buffer with height to acccommodate all matches.

I use this less, though, now that ctrl-p is in my fingertips.

How to see the full directory

:e .

Or use nerdtree

How to change the working directory to file’s directory

:cd %:h  

Note: this changes the working directory for all tabs

How to save your wrist on macOS

Settings > Keyboard > Keyboard Shortcuts > Modifier Keys > map caps lock to control  

How to use escape alternatives

Once you have mapped caps lock to control, C-[ is a viable alternative for escape.
I also map escape to jj in insert mode:

imap jj <Esc>  

C-c also works as escape in insert mode out of the box.

How to view the output of a command in vim

Pipe to view -, e.g. ps aux | view -

How to replace text up to a specific character

cf a will delete upto and including the next ‘a’ and drop you in insert mode
ct a will delete upto the next ‘a’ and drop you in insert mode

These are special cases of movement with f,F,t,T
Repeat with ; (forward) or , backwards

How to repeat deletes

Similar to the tip above, use dta to delete to the ‘a’, then d; to repeat in forward direction.

How to replace a full line

cc deletes the full line and drops you in insert mode

How to split windows

:sp splits windows horizontally
:vsp splits windows vertically
:vsp <my-file> splits windows and opens the my-file
ctrl-ww moves between views
C-w r swaps the order of split windows

How to resize windows

:vertical resize 80  
:vertical resize +5  
:vertical resize -5  

I use the following mappings:

nmap <Leader>= :vertical resize +5<CR>  
nmap <Leader>- :vertical resize -5<CR>  

How to move between windows

Move left one pane: C-w h
Move right one pane: C-w l
Move down one pane: C-w j
move up one pane: C-w k

If I only have two panes open, it’s easy to move between them with C-w w

How to navigate buffers

Toggle between the two most recent buffers with C-Shift-6
Move forward a buffer with tab key or :bn or hammer ctrl-i
Move backward with :bp hammer ctrl-o

To open a buffer window, I use a simple mapping in ~/.vimrc on \bb

nmap <Leader>bb :ls<CR>:buffer<Space>  

A nice plugin is also bufexplorer:
Install with Plug 'jlanzarotta/bufexplorer'
Open bufexplorer with \be
Navigate with normal motion, press enter to open a buffer

Can also use vanilla vim feature:

:b start-typing-and-hit-tab-for-fuzzy-search  

How to use matchit

% is the matchit power key. It can:
- match end of function/method
- cycle through if/then/else branches
- match html tags such as <div> with </div>
- match open and close parens (this is built into vim and does not depend on matchit)

Use :help matchit

The modern equivalent looks to be vim-matchup

Rails vim stuff

Outdated, I believe. I think all of these start with E now:
:R will switch between controller and view
:Rprev will open up browser
:Rserver starts mongrel
:Rserver! restarts it
:Rserver!- stops it

How to jump to a file

Use gf to jump to file under cursor.
Works with rails partials if vim rails is installed.

How to jump to dependencies in ruby

A good trick with ctags is to symlink actionpack and then run ctags again, this
way I can jump to view helpers

How to reload ~/.vimrc

:source ~/.vimrc  

How to jump to a line

Jump to line 30 with :30 or 30G

How to make the meta key work on macOS

Go to Terminal > Settings > Profiles > Keyboard > Use option as meta key

How to use vimgrep

I mainly use ack.vim, but it can be handy:

:vimgrep PATTERN **/*.erb  

open results with :copen
Move between results :cprev or :cnext

How to repeat a movement

Only certain motions can be repeated.
Using f,F,t, or T movements can be repeated with ; to move forwards or , to move backwards

How to move to the last edited line


How to move to the last edited position


How to move to the next occurrence of the word under the cursor

Forward: *
Backward: #

How to toggle numbers and relative numbers

Turn on numbers: :set nu
Turn off numbers: :set nonu
Turn on relative numbers: :set rnu
Turn off relative numbers: :set nornu

How to move a paragraph at a time

Down: }
Up: {

How to toggle invisibles

:set list  
:set nolist  

How to reformat text

In visual mode, use =

How to retab a file from tabs to spaces

:set expandtab  

How to remove whitespace at the end of every line


How to search and replace in a visual selection

Type S-v and select
then type :s/$/,/ to replace all end of lines with a comma

How to use regex backreferences in find and replace

Note the backreference \1. This will change ‘xyzfoo’ to ‘barxyz’


Can also use tricks like converting the matched backreference to uppercase.
This will change ‘xyzfoo’ to ‘barXYZ’


How to search and replace

I use visual mode and select an area that I want to search/replace in, then:


If I want to replace all instances in a whole file (with confirmation), I use:


Collection of search and replace tips: http://vim.wikia.com/wiki/Search_and_replace
How to use a regex and incsearch in search and replace: http://stackoverflow.com/a/1295244/143447

How to insert a newline as part of a substitution command

Use \r. For example, to turn spaces into newlines:

s/ /\r/g  

How to bulk rename files with vim

Plug ‘qpkorr/vim-renamer’
Open a directory with vim, then type :Renamer
Make modifications, then type :Ren

How to enter a new line below current line

Normal mode: o
Insert mode: C-o o

C-o o is a special case of a general pattern: use C-o to temporarily leave insert mode.

How to turn off autocommenting

I wanted to turn autocommenting off, the feature that adds a new comment on a newline if you hit enter in an existing comment.
Added to ~/.vim/after/ftplugin/ruby.vim:

set fo=cql  

Used this to determine what was overwriting my vimrc settings:

:verbose set fo  

In what order does vim load certain settings?

:help startup

How to search with ack

I use Plug 'mileszs/ack.vim'

Use it and follow symlinks:
:Ack –follow ‘pattern’

Use it with a certain filetype:
:Ack –csharp ‘pattern’

How to delete without copying deleted text to register

I often yank in normal mode, then x or d something, then go to paste and paste the wrong thing.

Three solutions:
1. Use vim-scripts/YankRing.vim and punch C-k after pasting
2. Remember to use gv after deleting and yank again
3. Delete without copying text with "_d

I use 1. Paste something with p, then hit ctrl+k and ctrl+j to cycle through options. Set:

let g:yankring_replace_n_pkey = '<c-k>'  
let g:yankring_replace_n_nkey = '<c-j>'  

Discussion: http://stackoverflow.com/questions/54255/i-vim-is-there-a-way-to-delete-without-putting-text-in-the-register

How to combine yank with motion

Yank to the end of the line with y$
Yank word under cursor with yiw
Yank whole line with Y

How to paste a specific yanked register

In insert mode, paste register zero with: C-r C-p 0

How to do a visual block selection of ragged line endings


How to reselect the previous visual selection


How to undo

Normal mode undo: u
Normal mode redo: C-r
Insert mode undo: ctrl-u
Also see undotree for much more power and control.

How to background and foreground vim

I tend to do this more on accident than on purpose.

If I suddenly see:

[1]+  Stopped                 vim  

Enter fg to bring the vim process back to the foreground.

How to toggle case sensitivity

I do this for case insensitive searching, or when using find and replace:

set :ic  
set :noic  

How to force save afile that I’ve opened as read-only

:w !sudo tee %

How to set a filetype to get syntax highlighting

For example, apache conf files don’t always show up highlighted in vim

:setf apache  

How to jump to a symbol when opening vim

ctags -R *  
vim -t MyType  

How to open two files split

Split vertically: vim -O a b
Split horizontally: vim -o a b

How to toggle highlighted search results

set :hls or set :nohls
I use h to toggle:

nmap <leader>h :set invhls<cr>  

How to replace text across multiple lines with a visual selection

ctrl+v {movement} s

How to switch between header files and implementation files

Jump to header file with: :e %<.h
Jump to implementation file with: :e %<.m
Split header and implementation: :vsp %<.h

How to toggle word wrap behavior

:set wrap
:set nowrap

How to set a maximum line width

:set tw=110

How to reformat text to satisfy new line width

How to refresh the ctrl-p plugin

I often run into a stale file list in ctrl-p. Use F5 to refresh

How to ignore node_modules with ctrl-p

let g:ctrlp_custom_ignore = 'node_modules'  

How to paste text to the command line

I often need to yank text (e.g. yiw) and paste it to the command line:

Yank some text with y
Open command line with :
Use C-r " to paste it

How to paste the text under the cursor to the command line

There is a shorter way than the approach above. Place the cursor on a word and :C-r-w. Do not let go of control between the r and w.
:C-r-f also seems to work

How to copy to system clipboard

Copy to system clipboard in visual mode: "=y
Paste from system clipboard in normal mode: "=p
Paste from system clipboard in insert mode: cmd-v
Paste from system clipboard with better formatting: C-r C-p *

I no longer use these, maybe vim versions improved pasting:

:set paste  
:set nopaste  

Paste in normal mode:

  :r! cat  
  <paste in contents>  

How to check the current value of a vim setting

Append a question mark. For example, :set statusline?

How to find which plugin is touching my variable

For example, to find what is touching textwidth, use:

:verbose set textwidth?  

How to align assignments on an equals sign

Get the tabular plugin. I use Plug 'godlygeek/tabular'
Then, to align text on equals:

:Tab /=  

How to use spellcheck

Turn on spellcheck with :set spell
Turn off spellcheck with :set nospell
Move between words with ]s or [s
Suggest fixes with zs
Add a word to dictionary with zg
Undo add with zug

How to comment and uncomment code

I use \c to toggle comments using Plug 'tomtom/tcomment_vim'

vmap <nowait> <leader>c :TComment<CR>  

How to modify ultisnips

How to see all loaded plugins

source: http://stackoverflow.com/a/48952/143447

How to indent

I usually use visual block mode, where indent and deindent is a single > or <, e.g.:


In normal mode use >> or <<.
Can also put a count in front of it, e.g. 5>>

In insert mode, use ctrl-i and ctrl-d

How to select the word under the cursor

I prefer viw because you the cursor can be anywhere within the word, then y to yank.

How to move the viewport without moving the cursor

Move viewport up: C-e
Move viewport down: C-y
Move viewport so that cursor is in center: zz
Move viewport so that cursor is at top: zt
Move viewport so that cursor is at bottom: zb

How to scroll

Scroll half page up, moving cursor: C-u
Scroll half page down, moving cursor: C-d

How to profile vim

:profile start profile.log  
:profile func *  
:profile file *  
" At this point do slow actions  
:profile pause  
:noautocmd qall!  

source: http://stackoverflow.com/questions/12213597/how-to-see-which-plugins-are-making-vim-slow/12216578#12216578

How to pull up documentation

I believe S-k is supposed to do this, but I use S-k for a project wide
search of word under the cursor. Should find a new mapping for that.

How to view help of all commands

:help index  

Then navigate with ctags-like navigation (use ctrl-] to follow a highlighted tag)

How to determine if vim recognizes your keystroke

In insert mode, use ctrl-v then punch the key combination.
Try it with ctrl-v ctrl-rightArrow

How to move backwards and forwards by a word in normal mode

forward by first character of each word: w
backward by first character of each word: b
forward by last character of each word: e

How to move backwards and forwards by a word in insert mode




I don’t think I did anything special to set that up.

How to find key representation to map

In insert mode, hit ctrl-k and then type a key to see how to map it.
E.g., hit ctrl-k and then backspace, vim will output

Code completions

I map ctrl-space to ctlr-n so that autocomplete is the same between Xcode and vim

inoremap <c-@> <c-n>