87 comments

[ 5.9 ms ] story [ 160 ms ] thread
There are some invaluable little snippets in there.
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)

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
Using :x kinda solves the :Wq issue
By the way :X is encrypt. Now guess how I know that... :)
I DID NOT know that and I withdraw my advice above :)
Also, :wq always writes; :x only writes when the buffer is modified (like :up | q).
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.
What do you use for leader?
:
That's awful, 2 keystrokes for <leader>? Use \ for leader, or , for leader and \ for ;
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.

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 \?
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.
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.
(comment deleted)
Why not take it one step further with:

  nore <Space> :
Let your thumbs do the work.
imap jj <Esc>
No need to create an alias avoid hitting escape:

  C-c works in most cases
  C-] works always
I prefer not having to press Ctrl. I also map jj to Esc.
I remap my Caps lock key to escape. That's one of the first things I do in a new machine.
I just remap CAPS to Control.
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>>
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.
git clone git://github.com/myname/vimrc.git

That's too much effort? Enjoy your default configs with no syntax highlighting etc.

I've got `cd .dotfiles ; hg pull ; hg up` in my bash to solve this (+ ssh agent to not require logins all the time)
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
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.

<Ctrl-C> works the same as <Esc> and does the same job of jumping back into normal mode.
Ctrl-[, too. But for some reason it's not as smooth for me. This idea of mapping semicolon came from a command layout rethink experiment I originally did on emacs. Always been meaning to reconstruct that more fully some day. Vim doesn't make it possible to define new first-class modes, so it will probably have to be a from-scratch editor (if I ever get around to it).
Or bind Caps Lock to <Esc>:

     $ xmodmap -e "clear lock"; xmodmap -e "keycode 0x42 = Escape"
I'm hooked on Caps Lock being an additional Ctrl. That helps for emacs-style bindings too (like bash).
I have mapped Caps Lock to switch between input and command mode. I use F10 as a "placeholder" to avoid triggering an actual changing of caps lock mode.

    # .Xmodmap:
    keycode 66 = F10
    clear Lock

    # .vimrc
    imap <F10> <ESC>
    nmap <F10> i
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.
I also "set undodir=/tmp" so that it doesn't litter my working directory with persistent undo files.
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.

(comment deleted)

  dfranke@ancalagon:~$ ls ~/.vimrc
  ls: cannot access /home/dfranke/.vimrc: No such file or directory
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>

  "	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
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.

  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.
See :he ball for why the command is named the way it is, ball as in buffer all ;-)
Or you could alias vim to vim -p.

Obligatory comment about the tabbar not being a replacement for :ls. Many things in Vim don't respect the one buffer = one tab paradigm.

(comment deleted)
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?
Vim == modal

Without modal interface vim is just another editor. Modal is fundamental to vim's power.

Gvim in insert mode is essentially a "normal" editor, I.e. You can use it like ms notepad. But that would defeat the whole purpose. It takes memorizing about a dozen key bindings to be proficient with basic editing, and then you're off to the races. You'll have no problem.
I'm not a vim scripter, but I'd be willing to bet you could make a (very very simple) script that would dump you back into input mode after a single command. That, or use a gui vim and ignore the whole command-mode thing (probably augmented with the before-mentioned script) and use buttons.
You might be interested in Cream:

http://cream.sourceforge.net/

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.