
What is in your .vimrc - nyellin
http://stackoverflow.com/questions/164847/what-is-in-your-vimrc
======
gbog
These vimrc posts are not always very useful. Actually, it should be reminded
that each line in vimrc may have bad side-effects. It may increase Vim
instance loading time, and increase editing footprint, or slowdown processes
like highlighting and scrolling.

Moreover, and probably worse, each specific configuration increases the
distance between your daily Vim-fu and the one you'll have to use on another
user or another machine. And these occasions have been, in my experience,
those when great Vim-fu was the most critical (eg. trying to keep your hand on
a dying server on a flooded connection, or showing off your skills on your
boss's Mac during plane trip). All this holds for bashrc too. The closest to
the default is the best, to some extent.

I take vimrc posts as good occasions to proofread mine and remove all unused
stuff. I just commented out a very weird "set notagbsearch" which was probably
killing my <ctrl>-].

~~~
hack_edu
I like your style. Care to share yours?

~~~
gbog
Vim 7 in terminal exclusively:

I have the classic things about backspace, black background, statusbar,
hlsearch, autocomplete, etc.

Then I have a few shortcuts on <Function keys>, because these cannot override
other bindings. The most important is <F9> linked to pastetoggle.

I also have some specific settings for my current main language (Python).

I try to avoid rebinding normal keys because it can kill you when you get used
to your tweaks and have to use another instance, but one thing I do is _imap
<ins> <Nop>_, because I hate being suddenly thrown in replace mode.

Plugins I have grep.vim linked to <F3> and I'm currently trying
NERD_commenter.vim on <F6>

------
bretthopper
Good ones I've come across (with useful comments):

<https://github.com/sjl/dotfiles/blob/master/vim/.vimrc>

<https://github.com/cloudhead/dotfiles/blob/master/.vimrc>

<https://github.com/rtomayko/dotfiles/blob/rtomayko/.vimrc>

<https://github.com/nvie/vimrc/blob/master/vimrc>

<https://github.com/vgod/vimrc/blob/master/vimrc>

<https://github.com/spf13/spf13-vim/blob/master/.vimrc>

~~~
Vitaly
a whole packaged deal at <https://github.com/astrails/dotvim>

tons of extensions and custom bindings. good README.

------
mitjak
I don't have much to add to the thread except for:

    
    
        set undofile
    

which will allow for persistent undo, i.e. undoing changes even after closing
a file.

~~~
thristian
I also "set undodir=/tmp" so that it doesn't litter my working directory with
persistent undo files.

~~~
telemachos
I prefer a variant of that. You can specify more than one place (that is,
first choice, second choice, etc.) with a comma-separated list. I do this:

    
    
        " Vim 7.3, now with persistent undo
        set undofile
        set undodir=$HOME/.vim_undo,/tmp
    

That way, if I've remembered to create a _.vim_undo_ folder, they go there
(best option). Otherwise, _/tmp_. (You can do the same thing when specifying
places for swap and backup files.)

As the comment suggests, the undo feature is only 7.3 or better.

------
unfasten
Insert single characters: Press 's' in normal mode and the next character you
type will be inserted at the cursor and put you back in normal. Press 'S'
(Capital S or shift+s) and the character will be inserted after the cursor
like 'a' append. This is also repeatable, so you can insert a character and
then do '5.' to insert it 5 times, still leaving you in normal mode
afterwards. Being repeatable is the reasoning I read for it being a function.
I picked this up from the Vim wikia site awhile ago.

    
    
        " Insert single char (repeatable)
        function! RepeatChar(char, count)
            return repeat(a:char, a:count)
        endfunction
        nnoremap <silent> s :<C-U>exec "normal i".RepeatChar(nr2char(getchar()), v:count1)<CR>
        nnoremap <silent> S :<C-U>exec "normal a".RepeatChar(nr2char(getchar()), v:count1)<CR>
    
    

Press 'F5' to run the file you're editing, assuming it has a shebang.

    
    
        " Run current file if it has a shebang
        function! <SID>CallInterpreter()
            if match(getline(1), '^\#!') == 0
                let l:interpreter = getline(1)[2:]
                exec ("!".l:interpreter." %:p")
            else
                echohl ErrorMsg | echo "Err: No shebang present in file, canceling execution" | echohl None
            endif
        endfun
        map <F5> :call <SID>CallInterpreter()<CR>
    
    

I don't actually use this one a lot, but it can be handy. F10 to switch
between the line numbering modes, in Vim versions that have relative line
numbering (>= 7.3)

    
    
        " Toggle line numbering modes
        " Default to relativenumber in newer vim, otherwise regular numbering
        if v:version >= 703
            set relativenumber
            let s:relativenumber = 0
            function! <SID>ToggleRelativeNumber()
                if s:relativenumber == 0
                    set number
                    let s:relativenumber = 1
                elseif s:relativenumber == 1
                    set relativenumber
                    let s:relativenumber = 2
                else
                    set norelativenumber
                    let s:relativenumber = 0
                endif
            endfunction
            map <silent><F10> :call <SID>ToggleRelativeNumber()<CR>
        else
            set number
        endif

------
ashley_woodard
This is an _ugly_ hack I came up with to layout my windows how I like them. I
have NERDTree and Taglist in a horizontally split window to the left and
MiniBufExplorer across the top of the screen. See <http://yfrog.com/h7sg7fp>

    
    
      autocmd VimEnter * call<SID>LayoutWindows()
    
      function! s:LayoutWindows()
        execute 'NERDTree'
        let nerdtree_buffer = bufnr(t:NERDTreeBufName)
        execute 'wincmd q'
        execute 'Tlist'
        execute 'wincmd h'
        execute 'split'
        execute 'b' . nerdtree_buffer
    
        let mbe_window = bufwinnr("-MiniBufExplorer-")
        if mbe_window != -1
          execute mbe_window . "wincmd w"
          execute 'wincmd K'
        endif
    
        execute 'resize +20'
        execute 'wincmd l'
      endfunction

~~~
ajtaylor
That does it! I've read about both these extensions before, but tomorrow
morning I'm taking the time to set them up on my machines. The setup looks
like exactly what I've been wanting. Split windows only go so far, and still
doesn't let me easily have more than a few buffers visible at once.

------
Pewpewarrows
Managed using the "homesick" command-line utility to propagate changes to all
my working machines:

[https://github.com/Pewpewarrows/dotfiles/blob/master/home/.v...](https://github.com/Pewpewarrows/dotfiles/blob/master/home/.vimrc)

~~~
nyellin
Thank you. Here is a link to _homesick_ for others:

<https://github.com/technicalpickles/homesick>

------
joelthelion
It's a shame that SO doesn't allow these types of questions anymore. They are
very useful for beginners who want to know how experienced users actually use
the tool.

The fact that they cannot be answered objectively doesn't make them less
useful, and contrary to what is stated in the FAQ, the question and answers
model is perfectly suited to this type of question.

~~~
tommi
It's because it's more like a discussion than a question. And it's more suited
here anyway: <http://superuser.com/>

~~~
joelthelion
Not really: "What's in your .vimrc?" is a question.

Don't get me started on the idea to have separate "sites" for every topic. It
creates a lot of noise, confuses beginners and serves no practical purposes
that tags can't fulfil.

~~~
spiffytech
StackOverflow, and it's family of sites, aim to answer questions that can have
a single "most correct" answer. While "what's in your .vimrc"-style questions
are undoubtedly helpful, they are beyond the scope of SO et al.

~~~
joelthelion
Yes, and they shouldn't, which is my point.

------
duggan
I'm not sure how many man-hours were lost to fatfingering :wq as :Wq or :w as
:W, but a simple alias has solved that particular bit of grief:

    
    
       cnoreabbrev Wq wq
       cnoreabbrev W w
    

The rest of my .vimrc mostly belongs to the guy I caught the vim addiction
from, but sets some useful defaults:
<https://github.com/duggan/dotfiles/blob/master/.vimrc>

~~~
nagnatron
Using :x kinda solves the :Wq issue

~~~
huhtenberg
By the way :X is _encrypt_. Now guess how I know that... :)

~~~
nagnatron
I DID NOT know that and I withdraw my advice above :)

------
_sh
I work with multiple files a lot, so I'm always navigating between split
screens and across buffers.

    
    
      " Split windows/multiple files
      " use <Ctrl>+s to split the current window
      nmap <C-S> <C-W>s
      " use <Ctrl>+j/<Ctrl>+k to move up/down through split windows
      nmap <C-J> <C-W>j
      nmap <C-K> <C-W>k
      " use <Ctrl>+-/<Ctrl>+= to maximise/equalise the size of split windows
      nmap <C--> <C-W>_
      nmap <C-=> <C-W>=
      " use <Ctrl>+h/<Ctrl>+l to move back/forth through files:
      nmap <C-L> :next<CR>
      nmap <C-H> :prev<CR>
    

Note these use the same 'hjkl' navigation keys.

------
jonasb
The most important thing I've learnt recently regarding Vim config is
Pathogen. <https://github.com/tpope/vim-pathogen>

With it it's much easier to keep plugins separate and encourages putting your
own tweaks in custom plugins.

------
fauziassegaff
generally speaking, this .vimrc is most core config file that had a most use
for me, been messing around with it before, and finally i use janus carl and
huda <https://github.com/carlhuda/janus> (had to thanks to them) for their
distro of the .vimrc configuration, it include just all what i need for my
macvim, it has a good plugins and configurations to where i can start of
developments.

for others that don't want to mess around with vimrc configs (although its
fun)just give it a shot and hopefully, and will happifly accept an
contribution

git clone git://github.com/carlhuda/janus.git

(don't forget to rake it after)

------
jonathanwallace
I forked a great vim_config for ruby/rails coding and made a few tweaks of my
own.

<https://github.com/wallace/vim_config>

------
marshray

      "	Shift-Alt-S    -- (C++) - change the current    word/identifier in a quoted
      " string to an ostream expression.
      " For example, put the  cursor on on the 'xxx' in:
      "       cout << "value = xxx\n";
      " hit Shift-Alt-S and it changes to:
      "       cout << "value = " << xxx << "\n";
      inoremap <S-A-s> <Esc>lbdei" << <Esc>pa << "<Esc>bb
      inoremap ^[S     <Esc>lbdei" << <Esc>pa << "<Esc>bb
       noremap <S-A-s>      lbdei" << <Esc>pa << "<Esc>bb
       noremap ^[S          lbdei" << <Esc>pa << "<Esc>bb
      onoremap <S-A-s> <C-c>lbdei" << <Esc>pa << "<Esc>bb
      onoremap ^[S     <C-c>lbdei" << <Esc>pa << "<Esc>bb

------
oinksoft
This is one of my favorite bits from my .vimrc. It lets you use !find with
location list:

    
    
      function! g:Find(...)
          let subexpr = 'substitute(v:val, ".*", "\"&\" 0: found", "")'
          let found = join(map(split(system('find ' . join(a:000, ' ')), '\n'), subexpr), "\n")
          exec 'lgete "' fnameescape(found) '" | lop'
      endfunction
    
      command! -nargs=+ Find call g:Find(<f-args>)
    

The :Find command above passes its arguments to `find`.

I use splits heavily, and these mappings for navigating and resizing splits
are indispensable:

    
    
      nnoremap <C-K> <C-W>k
      nnoremap <C-J> <C-W>j
      nnoremap <C-H> <C-W>h
      nnoremap <C-L> <C-W>l
      nnoremap _ 3<C-W><LT>
      nnoremap + 3<C-W>>

------
viraptor
Interesting bits:

make sure I'm scrolling visual lines, not real lines

    
    
        noremap j gj
        noremap k gk
    

ctrl+l/h for changing tabs

    
    
        noremap <C-l> gt
        noremap <C-h> gT
    

Search improvements:

    
    
        set incsearch
        set hlsearch
    

Best theme ever (very objective of course):

    
    
        let g:inkpot_black_background = 1
        colors inkpot
    

Making sure tmp files are stored in only one location, not all around the
system:

    
    
        if ! isdirectory(expand('~/vimtmp'))
            call mkdir(expand('~/vimtmp'))
        endif
        if isdirectory(expand('~/vimtmp'))
            set directory=~/vimtmp
        else
            set directory=.,/var/tmp,/tmp
        endif

------
gcr

      nnoremap \ta <Esc>:tab ball<CR>
    

Now you can run `vim foo bar baz` and then when open just type `\ta` and it
will open them cleanly in three different tabs. Why they renamed a command
"tab ball" I will never know.

~~~
X-Istence
See :he ball for why the command is named the way it is, ball as in buffer all
;-)

------
marshray
I made a little convention of marking 's' and 'd' as the top and bottom of a
range of lines. Then I define several handy utilities like:

    
    
      "	Shift-Alt-Z    #-comment range 's,'d
      inoremap <S-A-z> <Esc>:'s,'ds/^/#/g<CR>:noh<CR>
      inoremap ^[Z     <Esc>:'s,'ds/^/#/g<CR>:noh<CR>
       noremap <S-A-z>      :'s,'ds/^/#/g<CR>:noh<CR>
       noremap ^[Z          :'s,'ds/^/#/g  <CR>:noh<CR>
      onoremap <S-A-z> <C-c>:'s,'ds/^/#/g<CR>:noh<CR>
      onoremap ^[Z     <C-c>:'s,'ds/^/#/g<CR>:noh<CR>

------
cpeterso

      " Automagically save files when focus is lost
      autocmd BufLeave,FocusLost silent! wall
    
      " Highlight whitespace at the end of a line
      highlight ExtraWhitespace ctermbg=Black guibg=Black
      match ExtraWhitespace /\s\+$/
      autocmd BufWinEnter * match ExtraWhitespace /\s\+$/
      autocmd InsertEnter * match ExtraWhitespace /\s\+\%#\@<!$/
      autocmd InsertLeave * match ExtraWhitespace /\s\+$/
      autocmd BufWinLeave * call clearmatches()
    
      " Disable man key
      nnoremap K <nop>

------
LeafStorm
While the flexibility and portability of Vim is quite attractive, I doubt I
could really retrain myself to use the modal interface. Are there
packages/scripts/whatever that would allow one to use Vim in the way that one
would use a more "normal" text editor?

~~~
seabee
You might be interested in Cream:

<http://cream.sourceforge.net/>

~~~
hetman
It's worth mentioning that Cream is completely Vim underneath, however, by
default it uses the Common User Access interface for user input like most
modern editors.

It is also possible to enable traditional Vim input using expert mode, CUA is
retained in insert mode making it very easy for anyone not familiar with Vim
to get started and transition.

------
mun2mun
My favourite two lines (found in another .vimrc long time ago).

    
    
       set switchbuf=useopen,usetab
    

Files opened from buffer if exists. Handy for command-t plugin.

    
    
       autocmd BufReadPost * normal `"
    

Remembers the cursor position of files.

------
sliverstorm
I go with whatever the default is. I've logged on to hundreds of *nix machines
in just the past few years, and it's completely not worth the effort to try
and maintain a concurrent configuration.

~~~
viraptor
I've got `cd .dotfiles ; hg pull ; hg up` in my bash to solve this (+ ssh
agent to not require logins all the time)

------
markbao
from those answers:

    
    
        nore ; :
        nore , ;
    

Do this now. Probably not the vimrc line that has saved me the most time...
but definitely saved me the most pinky pain.

~~~
nyellin
What do you use for leader?

~~~
cma
:

~~~
wahnfrieden
That's awful, 2 keystrokes for <leader>? Use \ for leader, or , for leader and
\ for ;

~~~
nyellin
That's no better, I think. There is no standard location for \

Try using <space> instead. The default binding is useless for the largest key.

~~~
wahnfrieden
Why does it matter if there's no standard location? Do you use the ; command
that often in vim anyway that this would be an issue if it were mapped to \?

~~~
nyellin
Ymmv but it unfortunately matters for me. I switch between my work PC and
personal Macbook daily. The different positions for \ drive me crazy, but as
least it's rarely used on Macs due to sane file paths. Using a moving key in
Vim is a bad idea.

~~~
wahnfrieden
I just can't imagine prioritizing many commands over the <leader> key, which
gets a load of use from me. Try space then, I guess.

------
marshray
I map semicolon to <Esc>, and ctrl-l to insert a semicolon in insert mode.

<Esc> is one of the most frequent commands, no reason it should be on one of
the farthest keys.

~~~
freyrs3
Or bind Caps Lock to <Esc>:

    
    
         $ xmodmap -e "clear lock"; xmodmap -e "keycode 0x42 = Escape"

~~~
marshray
I'm hooked on Caps Lock being an additional Ctrl. That helps for emacs-style
bindings too (like bash).

------
ElliotH
See also: [http://stackoverflow.com/questions/154097/whats-in-your-
emac...](http://stackoverflow.com/questions/154097/whats-in-your-emacs)

------
IznastY
imap jj <Esc>

~~~
pyre
No need to create an alias avoid hitting escape:

    
    
      C-c works in most cases
      C-] works always

~~~
rbonvall
I prefer not having to press Ctrl. I also map jj to Esc.

~~~
statictype
I remap my Caps lock key to escape. That's one of the first things I do in a
new machine.

~~~
pyre
I just remap CAPS to Control.

------
hackingOnAJet
<https://github.com/brianholderchow/vim-bhclo>

------
dfranke

      dfranke@ancalagon:~$ ls ~/.vimrc
      ls: cannot access /home/dfranke/.vimrc: No such file or directory

------
Oompa
<https://github.com/skalnik/vim_config>

------
amix
I keep mine at <http://amix.dk/vim/vimrc.html>

------
jedberg
I keep mine here

<http://www.jedberg.net/vimrc>

~~~
chris24
That link errors out. I think you meant to post this:
<http://www.jedberg.net/jedberg_vimrc>

~~~
jedberg
Yep you're right, but it won't let me edit. :/

------
james2vegas
I don't have one, I have a .nexrc

------
ConceitedCode
There are some invaluable little snippets in there.

------
pointyhat
Cobwebs: syntax on; set ts=4; set sw=4; set ai;

Keep it simple :)

