2017-04-01 07:48:28 -04:00
![VIM ](https://dnp4pehkvoo6n.cloudfront.net/43c5af597bd5c1a64eb1829f011c208f/as/Ultimate%20Vimrc.svg )
2017-02-16 17:24:21 -05:00
2012-05-29 17:32:24 -04:00
# The Ultimate vimrc
2012-05-29 12:19:29 -04:00
2017-04-01 07:58:59 -04:00
Over the last 10 years, I have used and tweaked Vim. This configuration is the ultimate vimrc (or at least my version of it).
2012-05-29 17:32:24 -04:00
There are two versions:
2017-04-01 07:19:29 -04:00
* **The Basic**: If you want something small just copy [basic.vim ](https://github.com/amix/vimrc/blob/master/vimrcs/basic.vim ) into your ~/.vimrc and you will have a good basic setup
2017-04-01 07:58:59 -04:00
* **The Awesome**: Includes a ton of useful plugins, color schemes, and configurations
2012-05-29 17:32:24 -04:00
2017-04-01 07:58:59 -04:00
I would, of course, recommend using the awesome version.
2012-05-29 17:32:24 -04:00
2017-11-26 06:26:23 -05:00
2012-05-30 13:04:21 -04:00
## How to install the Awesome version?
2018-03-12 10:52:13 -04:00
### Install for your own user only
2017-04-01 07:19:29 -04:00
The awesome version includes a lot of great plugins, configurations and color schemes that make Vim a lot better. To install it simply do following from your terminal:
2012-05-29 17:32:24 -04:00
2018-03-12 10:52:13 -04:00
git clone --depth=1 https://github.com/amix/vimrc.git ~/.vim_runtime
sh ~/.vim_runtime/install_awesome_vimrc.sh
### Install for multiple users
To install for multiple users, the repository needs to be cloned to a location accessible for all the intended users.
2017-11-26 06:26:23 -05:00
2018-03-12 10:52:13 -04:00
git clone --depth=1 https://github.com/amix/vimrc.git /opt/vim_runtime
sh ~/.vim_runtime/install_awesome_parameterized.sh /opt/vim_runtime user0 user1 user2
# to install for all users with home directories
sh ~/.vim_runtime/install_awesome_parameterized.sh /opt/vim_runtime --all
Naturally, `/opt/vim_runtime` can be any directory, as long as all the users specified have read access.
2017-11-26 06:26:23 -05:00
## Fonts
2018-03-10 20:14:20 -05:00
I recommend using [IBM Plex Mono font ](https://github.com/IBM/plex ) (it's an open-source and awesome font that can make your code beautiful). The Awesome vimrc is already setup to try to use it.
2017-11-26 06:26:23 -05:00
Some other fonts that Awesome will try to use:
* [Hack ](http://sourcefoundry.org/hack/ )
* [Source Code Pro ](https://adobe-fonts.github.io/source-code-pro/ )
2012-05-29 17:32:24 -04:00
2015-03-24 12:53:58 -04:00
## How to install the Basic version?
2017-11-26 06:26:23 -05:00
2017-04-01 07:58:59 -04:00
The basic version is just one file and no plugins. Just copy [basic.vim ](https://github.com/amix/vimrc/blob/master/vimrcs/basic.vim ) and paste it into your vimrc.
2015-03-24 12:53:58 -04:00
2017-04-01 07:58:59 -04:00
The basic version is useful to install on remote servers where you don't need many plugins, and you don't do many edits.
2015-03-24 12:53:58 -04:00
2018-02-20 16:37:04 -05:00
git clone --depth=1 https://github.com/amix/vimrc.git ~/.vim_runtime
2015-03-24 12:53:58 -04:00
sh ~/.vim_runtime/install_basic_vimrc.sh
2012-05-30 13:04:21 -04:00
## How to install on Windows?
2012-05-30 12:31:10 -04:00
2018-03-31 11:05:46 -04:00
Use [gitforwindows ](http://gitforwindows.org/ ) to checkout the repository and run the installation instructions above. No special instructions needed ;-)
2012-05-30 12:31:10 -04:00
2016-07-15 00:39:02 -04:00
## How to install on Linux
If you have vim aliased as `vi` instead of `vim` , make sure to either alias it: `alias vi=vim` . Otherwise, `apt-get install vim`
2017-11-26 06:26:23 -05:00
2012-08-15 23:22:34 -04:00
## How to update to latest version?
2017-04-01 07:58:59 -04:00
Just do a git rebase!
2012-08-15 23:22:34 -04:00
cd ~/.vim_runtime
git pull --rebase
2019-12-01 14:19:59 -05:00
python update_plugins.py
2012-08-15 23:22:34 -04:00
2012-05-29 17:45:13 -04:00
## Some screenshots
Colors when editing a Python file:
2017-04-01 07:58:59 -04:00
2017-04-01 08:05:50 -04:00
![Screenshot 1 ](https://dnp4pehkvoo6n.cloudfront.net/07583008e4da885801657e8781777844/as/Python%20editing.png )
2012-05-29 17:45:13 -04:00
2012-05-30 12:31:10 -04:00
[NERD Tree ](https://github.com/scrooloose/nerdtree ) plugin in a terminal window:
2017-04-01 08:05:50 -04:00
![Screenshot 3 ](https://dnp4pehkvoo6n.cloudfront.net/ae719203166585d64728f28398f4b1b7/as/Terminal%20usage.png )
2012-05-30 13:04:21 -04:00
2015-01-01 03:11:57 -05:00
Distraction free mode using [goyo.vim ](https://github.com/junegunn/goyo.vim ) and [vim-zenroom2 ](https://github.com/amix/vim-zenroom2 ):
2017-04-01 08:05:50 -04:00
![Screenshot 4 ](https://dnp4pehkvoo6n.cloudfront.net/f0dcc4c9739148c56cbf8285a910ac41/as/Zen%20mode.png )
2013-12-29 08:20:35 -05:00
2012-05-29 17:45:13 -04:00
2013-12-29 08:25:09 -05:00
## Included Plugins
2012-05-29 17:32:24 -04:00
2017-04-01 07:58:59 -04:00
I recommend reading the docs of these plugins to understand them better. Each plugin provides a much better Vim experience!
2012-05-29 17:32:24 -04:00
2017-04-01 08:29:02 -04:00
* [ack.vim ](https://github.com/mileszs/ack.vim ): Vim plugin for `the_silver_searcher` (ag) or ack -- a wicked fast grep
2017-04-01 07:19:29 -04:00
* [bufexplorer.zip ](https://github.com/vim-scripts/bufexplorer.zip ): Quickly and easily switch between buffers. This plugin can be opened with `<leader+o>`
* [ctrlp.vim ](https://github.com/ctrlpvim/ctrlp.vim ): Fuzzy file, buffer, mru and tag finder. It's mapped to `<Ctrl+F>`
* [goyo.vim ](https://github.com/junegunn/goyo.vim ) and [vim-zenroom2 ](https://github.com/amix/vim-zenroom2 ):
* [lightline.vim ](https://github.com/itchyny/lightline.vim ): A light and configurable statusline/tabline for Vim
2012-05-29 17:32:24 -04:00
* [NERD Tree ](https://github.com/scrooloose/nerdtree ): A tree explorer plugin for vim
2012-05-29 17:50:00 -04:00
* [open_file_under_cursor.vim ](https://github.com/amix/open_file_under_cursor.vim ): Open file under cursor when pressing `gf`
2017-04-01 07:19:29 -04:00
* [pathogen.vim ](https://github.com/tpope/vim-pathogen ): Manage your vim runtimepath
* [snipmate.vim ](https://github.com/garbas/vim-snipmate ): snipmate.vim aims to be a concise vim script that implements some of TextMate's snippets features in Vim
2019-11-16 11:06:47 -05:00
* [ale ](https://github.com/w0rp/ale ): Syntax and lint checking for vim (ALE requires NeoVim >= 0.2.0 or Vim 8 with +timers +job +channel)
2017-04-01 07:19:29 -04:00
* [vim-commentary ](https://github.com/tpope/vim-commentary ): Comment stuff out. Use `gcc` to comment out a line (takes a count), `gc` to comment out the target of a motion. `gcu` uncomments a set of adjacent commented lines.
* [vim-expand-region ](https://github.com/terryma/vim-expand-region ): Allows you to visually select increasingly larger regions of text using the same key combination
* [vim-fugitive ](https://github.com/tpope/vim-fugitive ): A Git wrapper so awesome, it should be illegal
2013-04-13 13:54:26 -04:00
* [vim-indent-object ](https://github.com/michaeljsmith/vim-indent-object ): Defines a new text object representing lines of code at the same indent level. Useful for python/vim scripts
2013-04-16 09:27:16 -04:00
* [vim-multiple-cursors ](https://github.com/terryma/vim-multiple-cursors ): Sublime Text style multiple selections for Vim, CTRL+N is remapped to CTRL+S (due to YankRing)
2016-05-14 08:00:48 -04:00
* [vim-yankstack ](https://github.com/maxbrunsfeld/vim-yankstack ): Maintains a history of previous yanks, changes and deletes
2018-03-31 11:04:41 -04:00
* [vim-zenroom2 ](https://github.com/amix/vim-zenroom2 ) Remove all clutter and focus only on the essential. Similar to iA Writer or Write Room
2019-11-16 12:40:53 -05:00
* [gist-vim ](https://github.com/mattn/gist-vim ) Easily create gists from Vim using the `:Gist` command
2012-05-29 17:32:24 -04:00
2013-12-29 08:25:09 -05:00
## Included color schemes
2012-05-29 17:32:24 -04:00
2017-04-01 06:52:19 -04:00
* [peaksea ](https://github.com/vim-scripts/peaksea ): The default
2012-05-29 17:32:24 -04:00
* [vim-colors-solarized ](https://github.com/altercation/vim-colors-solarized )
* [vim-irblack ](https://github.com/wgibbs/vim-irblack )
* [mayansmoke ](https://github.com/vim-scripts/mayansmoke )
* [vim-pyte ](https://github.com/therubymug/vim-pyte )
2013-12-29 08:25:09 -05:00
## Included modes
2012-05-29 17:32:24 -04:00
* [vim-coffee-script ](https://github.com/kchmck/vim-coffee-script )
* [vim-less ](https://github.com/groenewege/vim-less )
* [vim-bundle-mako ](https://github.com/sophacles/vim-bundle-mako )
2019-11-30 15:00:26 -05:00
* [vim-markdown ](https://github.com/plasticboy/vim-markdown )
2013-04-13 13:54:26 -04:00
* [nginx.vim ](https://github.com/vim-scripts/nginx.vim ): Highlights configuration files for nginx
2019-11-16 14:16:20 -05:00
* [rust.vim ](https://github.com/rust-lang/rust.vim )
2019-11-16 12:43:18 -05:00
* [vim-ruby ](https://github.com/vim-ruby/vim-ruby )
* [typescript-vim ](https://github.com/leafgarland/typescript-vim )
* [vim-javascript ](https://github.com/pangloss/vim-javascript )
2019-11-16 14:16:20 -05:00
* [vim-python-pep8-indent ](https://github.com/Vimjas/vim-python-pep8-indent )
2012-05-29 17:32:24 -04:00
## How to include your own stuff?
2017-04-01 07:58:59 -04:00
After you have installed the setup, you can create ** ~/.vim_runtime/my_configs.vim** to fill in any configurations that are important for you. For instance, my **my_configs.vim** looks like this:
2012-05-29 17:32:24 -04:00
~/.vim_runtime (master)> cat my_configs.vim
map < leader > ct :cd ~/Desktop/Todoist/todoist< cr >
map < leader > cw :cd ~/Desktop/Wedoist/wedoist< cr >
2017-04-01 07:58:59 -04:00
You can also install your plugins, for instance, via pathogen you can install [vim-rails ](https://github.com/tpope/vim-rails ):
2012-05-29 17:32:24 -04:00
cd ~/.vim_runtime
2018-03-31 11:05:20 -04:00
git clone git://github.com/tpope/vim-rails.git my_plugins/vim-rails
2017-04-01 07:58:59 -04:00
2012-05-29 17:51:17 -04:00
## Key Mappings
2017-04-01 07:36:01 -04:00
The [leader ](http://learnvimscriptthehardway.stevelosh.com/chapters/06.html#leader ) is `,` , so whenever you see `<leader>` it means `,` .
2017-04-01 07:58:59 -04:00
2012-05-29 17:32:24 -04:00
### Normal mode mappings
2013-04-14 11:48:31 -04:00
2016-06-26 07:26:53 -04:00
Fast saving of a buffer (`< leader > w`):
2012-05-29 17:32:24 -04:00
nmap < leader > w :w!< cr >
2012-05-30 12:31:10 -04:00
Map `<Space>` to `/` (search) and `<Ctrl>+<Space>` to `?` (backwards search):
2012-05-29 17:32:24 -04:00
map < space > /
2019-11-30 06:54:13 -05:00
map < C-space > ?
2012-05-29 17:32:24 -04:00
map < silent > < leader > < cr > :noh< cr >
2017-04-01 07:58:59 -04:00
Disable highlights when you press `<leader><cr>` :
2012-05-29 17:32:24 -04:00
map < silent > < leader > < cr > :noh< cr >
2016-06-26 07:26:53 -04:00
Smart way to move between windows (`< ctrl > j` etc.):
2012-05-29 17:32:24 -04:00
map < C-j > < C-W > j
map < C-k > < C-W > k
map < C-h > < C-W > h
map < C-l > < C-W > l
2017-04-01 07:58:59 -04:00
Closing of the current buffer(s) (`< leader > bd` and (`< leader > ba`)):
2012-05-29 17:32:24 -04:00
" Close current buffer
map < leader > bd :Bclose< cr >
" Close all buffers
map < leader > ba :1,1000 bd!< cr >
Useful mappings for managing tabs:
map < leader > tn :tabnew< cr >
map < leader > to :tabonly< cr >
map < leader > tc :tabclose< cr >
map < leader > tm :tabmove
" Opens a new tab with the current buffer's path
" Super useful when editing files in the same directory
2019-11-30 06:54:13 -05:00
map < leader > te :tabedit < C-r > =expand("%:p:h")< cr > /
2012-05-29 17:32:24 -04:00
2017-04-01 07:58:59 -04:00
Switch [CWD ](http://vim.wikia.com/wiki/Set_working_directory_to_the_current_file ) to the directory of the open buffer:
2012-05-29 17:32:24 -04:00
map < leader > cd :cd %:p:h< cr > :pwd< cr >
2017-04-01 08:29:02 -04:00
Open `ack.vim` for fast search:
2012-05-29 17:32:24 -04:00
2017-04-01 08:29:02 -04:00
map < leader > g :Ack
2012-05-29 17:32:24 -04:00
Quickly open a buffer for scripbble:
map < leader > q :e ~/buffer< cr >
Toggle paste mode on and off:
map < leader > pp :setlocal paste!< cr >
### Visual mode mappings
2012-05-30 12:31:10 -04:00
Visual mode pressing `*` or `#` searches for the current selection:
2012-05-29 17:32:24 -04:00
vnoremap < silent > * :call VisualSelection('f')< CR >
vnoremap < silent > # :call VisualSelection('b')< CR >
2017-04-01 08:29:02 -04:00
When you press gv you `Ack.vim` after the selected text:
2012-05-29 17:32:24 -04:00
2017-04-01 07:19:29 -04:00
vnoremap < silent > gv :call VisualSelection('gv', '')< CR >
2012-05-29 17:32:24 -04:00
When you press `<leader>r` you can search and replace the selected text:
vnoremap < silent > < leader > r :call VisualSelection('replace')< CR >
Surround the visual selection in parenthesis/brackets/etc.:
vnoremap $1 < esc > `>a)< esc > `< i ( < esc >
vnoremap $2 < esc > `>a]< esc > `< i [ < esc >
vnoremap $3 < esc > `>a}< esc > `< i { < esc >
vnoremap $$ < esc > `>a"< esc > `< i " < esc >
vnoremap $q < esc > `>a'< esc > `< i ' < esc >
vnoremap $e < esc > `>a"< esc > `< i " < esc >
2017-04-01 07:58:59 -04:00
### Insert mode mappings
Quickly insert parenthesis/brackets/etc.:
inoremap $1 ()< esc > i
inoremap $2 []< esc > i
inoremap $3 {}< esc > i
inoremap $4 {< esc > o}< esc > O
inoremap $q ''< esc > i
inoremap $e ""< esc > i
inoremap $t < >< esc > i
Insert the current date and time (useful for timestamps):
2019-11-30 06:54:13 -05:00
iab xdate < C-r > =strftime("%d/%m/%y %H:%M:%S")< cr >
2017-04-01 07:58:59 -04:00
2012-05-29 17:32:24 -04:00
### Command line mappings
2012-05-30 12:31:10 -04:00
$q is super useful when browsing on the command line. It deletes everything until the last slash:
2012-05-29 17:32:24 -04:00
cno $q < C- \>eDeleteTillSlash ()< cr >
2012-05-30 12:31:10 -04:00
Bash like keys for the command line:
2012-05-29 17:32:24 -04:00
cnoremap < C-A > < Home >
cnoremap < C-E > < End >
cnoremap < C-K > < C-U >
cnoremap < C-P > < Up >
cnoremap < C-N > < Down >
2017-04-01 07:19:29 -04:00
Write the file as sudo (works only on Unix). Super useful when you open a file and you don't have permissions to save your changes. [Vim tip ](http://vim.wikia.com/wiki/Su-write ):
2013-04-13 13:45:21 -04:00
:W
2012-05-29 17:32:24 -04:00
2019-11-30 06:54:13 -05:00
### Plugin related mappings
Open [bufexplorer ](https://github.com/vim-scripts/bufexplorer.zip ) to see and manage the current buffers (`< leader > o`):
map < leader > o :BufExplorer< cr >
2020-05-10 11:04:55 -04:00
Open [ctrlp.vim ](https://github.com/kien/ctrlp.vim ) plugin to quickly find a file or a buffer (`< leader > j` or `<ctrl>f` ):
" Quickly find and open a file in the CWD
let g:ctrlp_map = '< C-f > '
2019-11-30 06:54:13 -05:00
2020-05-10 11:04:55 -04:00
" Quickly find and open a recently opened file
2019-11-30 06:54:13 -05:00
map < leader > f :MRU< CR >
2020-05-10 11:04:55 -04:00
" Quickly find and open a buffer
map < leader > b :CtrlPBuffer< cr >
2019-11-30 06:54:13 -05:00
[NERD Tree ](https://github.com/scrooloose/nerdtree ) mappings:
map < leader > nn :NERDTreeToggle< cr >
map < leader > nb :NERDTreeFromBookmark
map < leader > nf :NERDTreeFind< cr >
[goyo.vim ](https://github.com/junegunn/goyo.vim ) and [vim-zenroom2 ](https://github.com/amix/vim-zenroom2 ) lets you only focus on one thing at a time. It removes all the distractions and centers the content. It has a special look when editing Markdown, reStructuredText and textfiles. It only has one mapping. (`< leader > z`)
map < leader > z :Goyo< cr >
[vim-multiple-cursors ](https://github.com/terryma/vim-multiple-cursors ) mappings to manage multiple cursors at once:
let g:multi_cursor_start_word_key = '< C-s > '
let g:multi_cursor_select_all_word_key = '< A-s > '
let g:multi_cursor_start_key = 'g< C-s > '
let g:multi_cursor_select_all_key = 'g< A-s > '
let g:multi_cursor_next_key = '< C-s > '
let g:multi_cursor_prev_key = '< C-p > '
let g:multi_cursor_skip_key = '< C-x > '
let g:multi_cursor_quit_key = '< Esc > '
[vim-yankstack ](https://github.com/maxbrunsfeld/vim-yankstack ) mappings to manage the kill-ring (clipboard):
nmap < C-p > < Plug > yankstack_substitute_older_paste
nmap < C-n > < Plug > yankstack_substitute_newer_paste
[ctrl-p ](https://github.com/ctrlpvim/ctrlp.vim ) mappings to easily find and open a file, buffer, etc.:
let g:ctrlp_map = '< C-f > '
map < leader > j :CtrlP< cr >
map < C-b > :CtrlPBuffer< cr >
[vim-snipmate ](https://github.com/garbas/vim-snipmate ) mappings to autocomplete via snippets:
ino < C-j > < C-r > =snipMate#TriggerSnippet()< cr >
snor < C-j > < esc > i< right > < C-r > =snipMate#TriggerSnippet()< cr >
[vim-surround ](https://github.com/tpope/vim-surround ) mappings to easily surround a string with `_()` gettext annotation:
vmap Si S(i_< esc > f)
au FileType mako vmap Si S"i${ _(< esc > 2f"a) }< esc >
[ale ](https://github.com/dense-analysis/ale ) to easily go to the next Ale syntax/lint error:
nmap < silent > < leader > a < Plug > (ale_next_wrap)
2012-05-29 17:32:24 -04:00
### Spell checking
2017-04-01 07:58:59 -04:00
Pressing `<leader>ss` will toggle spell checking:
2012-05-29 17:32:24 -04:00
map < leader > ss :setlocal spell!< cr >
2017-04-01 07:58:59 -04:00
Shortcuts using `<leader>` instead of special characters:
2012-05-29 17:32:24 -04:00
map < leader > sn ]s
map < leader > sp [s
map < leader > sa zg
map < leader > s? z=
2017-04-01 07:58:59 -04:00
### Cope
Query `:help cope` if you are unsure what cope is. It's super useful!
2012-05-29 17:32:24 -04:00
2017-04-01 08:29:02 -04:00
When you search with `Ack.vim` , display your results in cope by doing:
2012-05-30 12:31:10 -04:00
`<leader>cc`
2012-05-29 17:32:24 -04:00
To go to the next search result do:
2012-05-30 12:31:10 -04:00
`<leader>n`
2012-05-29 17:32:24 -04:00
To go to the previous search results do:
2012-05-30 12:31:10 -04:00
`<leader>p`
2017-04-01 07:58:59 -04:00
Cope mappings:
2012-05-29 17:32:24 -04:00
map < leader > cc :botright cope< cr >
map < leader > co ggVGy:tabnew< cr > :set syntax=qf< cr > pgg
map < leader > n :cn< cr >
map < leader > p :cp< cr >
2017-04-01 07:58:59 -04:00
2016-02-18 12:17:21 -05:00
## How to uninstall
2017-04-01 07:58:59 -04:00
Just do following:
2016-02-18 12:17:21 -05:00
* Remove `~/.vim_runtime`
2017-03-06 03:53:46 -05:00
* Remove any lines that reference `.vim_runtime` in your `~/.vimrc`
2019-04-19 04:33:56 -04:00
## Doist
Maintaining this Vim configuration isn't my day job. Daily I am the founder of [Doist ](https://doist.com/ ). You could come and help us build the workplace of the future while living a balanced life (anywhere in the world 🌍🌎🌏).
2019-04-19 04:55:47 -04:00
PS: Using Vim isn't a requirement 😄