vimrc/README.md

412 lines
16 KiB
Markdown
Raw Normal View History

2017-04-01 11:48:28 +00:00
![VIM](https://dnp4pehkvoo6n.cloudfront.net/43c5af597bd5c1a64eb1829f011c208f/as/Ultimate%20Vimrc.svg)
2012-05-29 21:32:24 +00:00
# The Ultimate vimrc
2012-05-29 16:19:29 +00:00
2017-04-01 11:58:59 +00: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 21:32:24 +00:00
There are two versions:
2017-04-01 11:19:29 +00: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 11:58:59 +00:00
* **The Awesome**: Includes a ton of useful plugins, color schemes, and configurations
2012-05-29 21:32:24 +00:00
2017-04-01 11:58:59 +00:00
I would, of course, recommend using the awesome version.
2012-05-29 21:32:24 +00:00
2017-11-26 11:26:23 +00:00
## How to install the Awesome version?
### Install for your own user only
2017-04-01 11:19:29 +00: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 21:32:24 +00: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 11:26:23 +00:00
git clone --depth=1 https://github.com/amix/vimrc.git /opt/vim_runtime
sh /opt/vim_runtime/install_awesome_parameterized.sh /opt/vim_runtime user0 user1 user2
# to install for all users with home directories, note that root will not be included
sh /opt/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 11:26:23 +00:00
## Fonts
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 look beautiful). The Awesome vimrc is already setup to try to use it.
2017-11-26 11:26:23 +00: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 21:32:24 +00:00
2015-03-24 16:53:58 +00:00
## How to install the Basic version?
2017-11-26 11:26:23 +00:00
2017-04-01 11:58:59 +00: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 16:53:58 +00:00
2017-04-01 11:58:59 +00: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 16:53:58 +00:00
2018-02-20 21:37:04 +00:00
git clone --depth=1 https://github.com/amix/vimrc.git ~/.vim_runtime
2015-03-24 16:53:58 +00:00
sh ~/.vim_runtime/install_basic_vimrc.sh
## How to install on Windows?
Use [gitforwindows](http://gitforwindows.org/) to checkout the repository and run the installation instructions above. No special instructions needed ;-)
2016-07-15 04:39:02 +00: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 11:26:23 +00:00
## How to update to latest version?
2017-04-01 11:58:59 +00:00
Just do a git rebase!
2023-08-20 14:37:28 +00:00
cd ~/.vim_runtime
git reset --hard
git clean -d --force
git pull --rebase
python update_plugins.py # use python3 if python is unavailable
2012-05-29 21:45:13 +00:00
## Some screenshots
Colors when editing a Python file:
2017-04-01 11:58:59 +00:00
2017-04-01 12:05:50 +00:00
![Screenshot 1](https://dnp4pehkvoo6n.cloudfront.net/07583008e4da885801657e8781777844/as/Python%20editing.png)
2012-05-29 21:45:13 +00:00
[NERD Tree](https://github.com/preservim/nerdtree) plugin in a terminal window:
2017-04-01 12:05:50 +00:00
![Screenshot 3](https://dnp4pehkvoo6n.cloudfront.net/ae719203166585d64728f28398f4b1b7/as/Terminal%20usage.png)
Distraction free mode using [goyo.vim](https://github.com/junegunn/goyo.vim) and [vim-zenroom2](https://github.com/amix/vim-zenroom2):
2017-04-01 12:05:50 +00:00
![Screenshot 4](https://dnp4pehkvoo6n.cloudfront.net/f0dcc4c9739148c56cbf8285a910ac41/as/Zen%20mode.png)
2012-05-29 21:45:13 +00:00
2013-12-29 13:25:09 +00:00
## Included Plugins
2012-05-29 21:32:24 +00:00
2017-04-01 11:58:59 +00:00
I recommend reading the docs of these plugins to understand them better. Each plugin provides a much better Vim experience!
2012-05-29 21:32:24 +00: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 11:19:29 +00: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
* [NERD Tree](https://github.com/preservim/nerdtree): A tree explorer plugin for vim
2012-05-29 21:50:00 +00: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 11:19:29 +00: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
* [ale](https://github.com/dense-analysis/ale): Syntax and lint checking for vim (ALE requires NeoVim >= 0.2.0 or Vim 8 with +timers +job +channel)
2023-04-01 20:49:41 +00: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
2017-04-01 11:19:29 +00:00
* [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 17:54:26 +00: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
* [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 12:00:48 +00:00
* [vim-yankstack](https://github.com/maxbrunsfeld/vim-yankstack): Maintains a history of previous yanks, changes and deletes
* [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 17:40:53 +00:00
* [gist-vim](https://github.com/mattn/gist-vim) Easily create gists from Vim using the `:Gist` command
2021-07-04 21:01:36 +00:00
* [vim-indent-guides](https://github.com/nathanaelkane/vim-indent-guides) Is a plugin for visually displaying indent levels in Vim
2023-04-01 20:49:41 +00:00
* [editorconfig-vim](https://github.com/editorconfig/editorconfig-vim) EditorConfig helps maintain consistent coding styles for multiple developers working on the same project across various editors and IDEs
* [copilot.vim](https://github.com/github/copilot.vim) Plugin for GitHub Copilot (AI autocompletion FTW 😅)
2012-05-29 21:32:24 +00:00
2013-12-29 13:25:09 +00:00
## Included color schemes
2012-05-29 21:32:24 +00:00
Type `:colorscheme <Tab>` to try out color schemes on the fly or add the command to **my_configs.vim** (see below), for example `colorscheme pyte`.
2021-08-04 13:52:11 +00:00
* [peaksea](https://github.com/vim-scripts/peaksea): The default
* [dracula](https://github.com/dracula/vim)
2012-05-29 21:32:24 +00: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 13:25:09 +00:00
## Included modes
2012-05-29 21:32:24 +00: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)
* [vim-markdown](https://github.com/plasticboy/vim-markdown)
2013-04-13 17:54:26 +00:00
* [nginx.vim](https://github.com/vim-scripts/nginx.vim): Highlights configuration files for nginx
* [rust.vim](https://github.com/rust-lang/rust.vim)
* [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)
* [vim-python-pep8-indent](https://github.com/Vimjas/vim-python-pep8-indent)
2012-05-29 21:32:24 +00:00
## How to include your own stuff?
2017-04-01 11:58:59 +00: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 21:32:24 +00: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 11:58:59 +00: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 21:32:24 +00:00
cd ~/.vim_runtime
git clone git://github.com/tpope/vim-rails.git my_plugins/vim-rails
2017-04-01 11:58:59 +00:00
You can also install plugins without any plugin manager (vim 8+ required):
2022-10-15 19:50:31 +00:00
* Create pack plugin directory:\
`mkdir -p ~/.vim_runtime/pack/plugins/start`
2022-10-15 19:50:31 +00:00
* Clone the plugin that you want in that directory, for example:\
`git clone --depth=1 git://github.com/maxmellon/vim-jsx-pretty ~/.vim_runtime/pack/plugins/start/vim-jsx-pretty`
2012-05-29 21:51:17 +00:00
## Key Mappings
The [leader](http://learnvimscriptthehardway.stevelosh.com/chapters/06.html#leader) is `,`, so whenever you see `<leader>` it means `,`.
2017-04-01 11:58:59 +00:00
2012-05-29 21:32:24 +00:00
### Normal mode mappings
2016-06-26 11:26:53 +00:00
Fast saving of a buffer (`<leader>w`):
2012-05-29 21:32:24 +00:00
2023-08-20 14:37:28 +00:00
```vim
nmap <leader>w :w!<cr>
```
2012-05-29 21:32:24 +00:00
2023-08-20 14:37:28 +00:00
Map `<Space>` to `/` (search) and `<Ctrl>+<Space>` to `?` (backwards search):
```vim
map <space> /
map <C-space> ?
```
2017-04-01 11:58:59 +00:00
Disable highlights when you press `<leader><cr>`:
2012-05-29 21:32:24 +00:00
2023-08-20 14:37:28 +00:00
```vim
map <silent> <leader><cr> :noh<cr>
```
2016-06-26 11:26:53 +00:00
Smart way to move between windows (`<ctrl>j` etc.):
2023-08-20 14:37:28 +00:00
```vim
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 11:58:59 +00:00
Closing of the current buffer(s) (`<leader>bd` and (`<leader>ba`)):
2023-08-20 14:37:28 +00:00
```vim
" Close current buffer
map <leader>bd :Bclose<cr>
" Close all buffers
map <leader>ba :1,1000 bd!<cr>
```
2012-05-29 21:32:24 +00:00
Useful mappings for managing tabs:
2023-08-20 14:37:28 +00:00
```vim
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
map <leader>te :tabedit <C-r>=escape(expand("%:p:h"), " ")<cr>/
```
2017-04-01 11:58:59 +00:00
Switch [CWD](http://vim.wikia.com/wiki/Set_working_directory_to_the_current_file) to the directory of the open buffer:
2023-08-20 14:37:28 +00:00
```vim
map <leader>cd :cd %:p:h<cr>:pwd<cr>
```
Open `ack.vim` for fast search:
2023-08-20 14:37:28 +00:00
```vim
map <leader>g :Ack
```
2012-05-29 21:32:24 +00:00
Quickly open a buffer for scripbble:
2023-08-20 14:37:28 +00:00
```vim
map <leader>q :e ~/buffer<cr>
```
2012-05-29 21:32:24 +00:00
Toggle paste mode on and off:
2023-08-20 14:37:28 +00:00
```vim
map <leader>pp :setlocal paste!<cr>
```
2012-05-29 21:32:24 +00:00
### Visual mode mappings
Visual mode pressing `*` or `#` searches for the current selection:
2023-08-20 14:37:28 +00:00
```vim
vnoremap <silent> * :call VisualSelection('f')<CR>
vnoremap <silent> # :call VisualSelection('b')<CR>
```
When you press gv you `Ack.vim` after the selected text:
2023-08-20 14:37:28 +00:00
```vim
vnoremap <silent> gv :call VisualSelection('gv', '')<CR>
```
2012-05-29 21:32:24 +00:00
When you press `<leader>r` you can search and replace the selected text:
2023-08-20 14:37:28 +00:00
```vim
vnoremap <silent> <leader>r :call VisualSelection('replace')<CR>
```
2012-05-29 21:32:24 +00:00
Surround the visual selection in parenthesis/brackets/etc.:
2023-08-20 14:37:28 +00:00
```vim
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 11:58:59 +00:00
### Insert mode mappings
Quickly insert parenthesis/brackets/etc.:
2023-08-20 14:37:28 +00:00
```vim
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
```
2017-04-01 11:58:59 +00:00
Insert the current date and time (useful for timestamps):
2023-08-20 14:37:28 +00:00
```vim
iab xdate <C-r>=strftime("%d/%m/%y %H:%M:%S")<cr>
```
2012-05-29 21:32:24 +00:00
### Command line mappings
$q is super useful when browsing on the command line. It deletes everything until the last slash:
2023-08-20 14:37:28 +00:00
```vim
cno $q <C-\>eDeleteTillSlash()<cr>
```
Bash like keys for the command line:
2023-08-20 14:37:28 +00:00
```vim
cnoremap <C-A> <Home>
cnoremap <C-E> <End>
cnoremap <C-K> <C-U>
2012-05-29 21:32:24 +00:00
2023-08-20 14:37:28 +00:00
cnoremap <C-P> <Up>
cnoremap <C-N> <Down>
```
2012-05-29 21:32:24 +00:00
2017-04-01 11:19:29 +00: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):
:W
### Plugin related mappings
Open [bufexplorer](https://github.com/vim-scripts/bufexplorer.zip) to see and manage the current buffers (`<leader>o`):
2023-08-20 14:37:28 +00:00
```vim
map <leader>o :BufExplorer<cr>
```
Open [ctrlp.vim](https://github.com/kien/ctrlp.vim) plugin to quickly find a file or a buffer (`<leader>j` or `<ctrl>f`):
2023-08-20 14:37:28 +00:00
```vim
" Quickly find and open a file in the CWD
let g:ctrlp_map = '<C-f>'
2023-08-20 14:37:28 +00:00
" Quickly find and open a recently opened file
map <leader>f :MRU<CR>
2023-08-20 14:37:28 +00:00
" Quickly find and open a buffer
map <leader>b :CtrlPBuffer<cr>
```
[NERD Tree](https://github.com/preservim/nerdtree) mappings:
2023-08-20 14:37:28 +00:00
```vim
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`)
2023-08-20 14:37:28 +00:00
```vim
map <leader>z :Goyo<cr>
```
[vim-multiple-cursors](https://github.com/terryma/vim-multiple-cursors) mappings to manage multiple cursors at once:
2023-08-20 14:37:28 +00:00
```vim
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):
2023-08-20 14:37:28 +00:00
```vim
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.:
2023-08-20 14:37:28 +00:00
```vim
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:
2023-08-20 14:37:28 +00:00
```vim
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:
2023-08-20 14:37:28 +00:00
```vim
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:
2023-08-20 14:37:28 +00:00
```vim
nmap <silent> <leader>a <Plug>(ale_next_wrap)
```
2021-07-04 21:01:36 +00:00
[vim-indent-guides](https://github.com/nathanaelkane/vim-indent-guides) the default mapping to toggle the plugin is (`<leader>ig`)
You can also use the following commands inside Vim:
:IndentGuidesEnable
:IndentGuidesDisable
:IndentGuidesToggle
[vim-fugitive](https://github.com/tpope/vim-fugitive) to copy the link to the line of a Git repository to the clipboard:
2023-08-20 14:37:28 +00:00
```vim
nnoremap <leader>v :.GBrowse!<CR>
xnoremap <leader>v :'<'>GBrowse!<CR>
```
2012-05-29 21:32:24 +00:00
### Spell checking
2017-04-01 11:58:59 +00:00
Pressing `<leader>ss` will toggle spell checking:
2023-08-20 14:37:28 +00:00
```vim
map <leader>ss :setlocal spell!<cr>
```
2017-04-01 11:58:59 +00:00
Shortcuts using `<leader>` instead of special characters:
2023-08-20 14:37:28 +00:00
```vim
map <leader>sn ]s
map <leader>sp [s
map <leader>sa zg
map <leader>s? z=
```
2021-07-04 21:07:53 +00:00
### Running Code
To run code directly from vim, press `F5`. The currently open code will execute without you having to type anything.
2023-08-20 14:37:28 +00:00
Can be used to execute code written in C, C++, Java, Python, Go, Octave, Bash scripts and HTML. To edit how you want your code to be executed, make changes in the file `~/.vim_runtime/vimrcs/extended.vim`
2017-04-01 11:58:59 +00:00
### Cope
Query `:help cope` if you are unsure what cope is. It's super useful!
2012-05-29 21:32:24 +00:00
When you search with `Ack.vim`, display your results in cope by doing:
`<leader>cc`
2012-05-29 21:32:24 +00:00
To go to the next search result do:
`<leader>n`
2012-05-29 21:32:24 +00:00
To go to the previous search results do:
`<leader>p`
2017-04-01 11:58:59 +00:00
Cope mappings:
2023-08-20 14:37:28 +00:00
```vim
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 11:58:59 +00:00
2016-02-18 17:17:21 +00:00
## How to uninstall
2017-04-01 11:58:59 +00:00
Just do following:
2016-02-18 17:17:21 +00:00
* Remove `~/.vim_runtime`
2017-03-06 08:53:46 +00:00
* Remove any lines that reference `.vim_runtime` in your `~/.vimrc`
2019-04-19 08:33:56 +00:00
2020-07-11 03:39:05 +00:00
## Looking for a remote-first job?
2019-04-19 08:33:56 +00:00
2020-07-11 03:39:05 +00:00
Maintaining this Vim configuration isn't my day job. Daily I am the founder/CEO 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 08:33:56 +00:00
2019-04-19 08:55:47 +00:00
PS: Using Vim isn't a requirement 😄
2021-07-04 21:01:36 +00:00