2012-05-29 16:12:10 -04:00
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Maintainer:
2018-03-31 11:04:41 -04:00
" Amir Salihefendic — @amix3k
2012-05-29 16:12:10 -04:00
"
2012-05-30 12:31:10 -04:00
" Awesome_version:
" Get this config, nice color schemes and lots of plugins!
"
" Install the awesome version from:
"
" https://github.com/amix/vimrc
"
2012-05-29 16:12:10 -04:00
" Sections:
" -> General
" -> VIM user interface
" -> Colors and Fonts
" -> Files and backups
" -> Text, tab and indent related
" -> Visual mode related
" -> Moving around, tabs and buffers
" -> Status line
" -> Editing mappings
" -> vimgrep searching and cope displaying
" -> Spell checking
" -> Misc
" -> Helper functions
"
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" => General
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Sets how many lines of history VIM has to remember
2015-07-13 06:21:10 -04:00
set history = 500
2012-05-29 16:12:10 -04:00
" Enable filetype plugins
filetype plugin on
filetype indent on
" Set to auto read when a file is changed from the outside
set autoread
" With a map leader it's possible to do extra key combinations
" like <leader>w saves the current file
2019-08-06 18:51:11 -04:00
let mapleader = " "
2012-05-29 16:12:10 -04:00
" Fast saving
nmap < leader > w :w ! < cr >
2013-04-13 13:45:21 -04:00
" :W sudo saves the file
" (useful for handling the permission-denied error)
command W w ! sudo tee % > /dev/ null
2012-05-29 16:12:10 -04:00
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" => VIM user interface
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Set 7 lines to the cursor - when moving vertically using j/k
set so = 7
2014-05-21 23:25:51 -04:00
" Avoid garbled characters in Chinese language windows OS
let $LANG = 'en'
set langmenu = en
source $VIMRUNTIME /delmenu .vim
source $VIMRUNTIME /menu .vim
2017-10-06 08:44:18 -04:00
" Turn on the Wild menu
2012-05-29 16:12:10 -04:00
set wildmenu
" Ignore compiled files
set wildignore = *.o , *~ , *.pyc
2012-08-15 22:29:05 -04:00
if has ( "win16" ) | | has ( "win32" )
set wildignore + = .git \*, .hg \*, .svn \*
2016-07-03 07:58:02 -04:00
else
set wildignore + = */.git/ *, */.hg/ *, */.svn/ *, */.DS_Store
2012-08-15 22:29:05 -04:00
endif
2012-05-29 16:12:10 -04:00
"Always show current position
set ruler
" Height of the command bar
set cmdheight = 2
" A buffer becomes hidden when it is abandoned
set hid
" Configure backspace so it acts as it should act
set backspace = eol , start , indent
set whichwrap + = < , > , h , l
" Ignore case when searching
set ignorecase
" When searching try to be smart about cases
set smartcase
" Highlight search results
set hlsearch
" Makes search act like search in modern browsers
set incsearch
" Don't redraw while executing macros (good performance config)
set lazyredraw
" For regular expressions turn magic on
set magic
" Show matching brackets when text indicator is over them
set showmatch
" How many tenths of a second to blink when matching brackets
set mat = 2
" No annoying sound on errors
set noerrorbells
set novisualbell
set t_vb =
set tm = 500
2016-09-15 19:08:54 -04:00
" Properly disable sound on errors on MacVim
if has ( "gui_macvim" )
autocmd GUIEnter * set vb t_vb =
endif
2012-08-24 18:00:53 -04:00
" Add a bit extra margin to the left
set foldcolumn = 1
2012-05-29 16:12:10 -04:00
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" => Colors and Fonts
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Enable syntax highlighting
syntax enable
2016-09-02 04:29:18 -04:00
" Enable 256 colors palette in Gnome Terminal
if $COLORTERM = = 'gnome-terminal'
set t_Co = 256
endif
2012-05-30 12:31:10 -04:00
try
colorscheme desert
catch
endtry
2012-05-29 16:12:10 -04:00
set background = dark
" Set extra options when running in GUI mode
if has ( "gui_running" )
set guioptions - = T
2012-07-02 18:57:21 -04:00
set guioptions - = e
2012-05-29 16:12:10 -04:00
set t_Co = 256
set guitablabel = %M \ %t
endif
" Set utf8 as standard encoding and en_US as the standard language
set encoding = utf8
" Use Unix as the standard file type
set ffs = unix , dos , mac
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" => Files, backups and undo
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Turn backup off, since most stuff is in SVN, git et.c anyway...
set nobackup
set nowb
set noswapfile
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" => Text, tab and indent related
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Use spaces instead of tabs
set expandtab
" Be smart when using tabs ;)
set smarttab
2014-10-14 09:30:33 -04:00
" 1 tab == 4 spaces
set shiftwidth = 4
set tabstop = 4
2012-05-29 16:12:10 -04:00
" Linebreak on 500 characters
set lbr
set tw = 500
2016-08-26 08:14:22 -04:00
set ai "Auto indent
set si "Smart indent
2012-05-29 16:12:10 -04:00
set wrap "Wrap lines
""""""""""""""""""""""""""""""
" => Visual mode related
""""""""""""""""""""""""""""""
" Visual mode pressing * or # searches for the current selection
" Super useful! From an idea by Michael Naumann
2016-03-28 16:26:02 -04:00
vnoremap < silent > * :< C - u > call VisualSelection ( '' , '' ) < CR > /<C-R>=@/ < CR > < CR >
vnoremap < silent > # :< C - u > call VisualSelection ( '' , '' ) < CR > ?< C - R > = @/< CR > < CR >
2012-05-29 16:12:10 -04:00
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" => Moving around, tabs, windows and buffers
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
2019-08-06 18:51:11 -04:00
" Treat long lines as break lines (useful when moving around in them)
map j gj
map k gk
2012-05-29 16:12:10 -04:00
" Map <Space> to / (search) and Ctrl-<Space> to ? (backwards search)
map < space > /
map < c - space > ?
2012-05-29 17:32:24 -04:00
" Disable highlight when <leader><cr> is pressed
2012-05-29 16:12:10 -04:00
map < silent > < leader > < cr > :noh < cr >
" Smart way to move between windows
map < C - j > < C - W > j
map < C - k > < C - W > k
map < C - h > < C - W > h
map < C - l > < C - W > l
" Close the current buffer
2015-12-08 08:19:59 -05:00
map < leader > bd :Bclose < cr > :tabclose < cr > gT
2012-05-29 16:12:10 -04:00
" Close all the buffers
2015-07-13 06:21:10 -04:00
map < leader > ba :bufdo bd < cr >
2012-05-29 16:12:10 -04:00
2015-09-05 06:42:44 -04:00
map < leader > l :bnext < cr >
map < leader > h :bprevious < cr >
2012-05-29 16:12:10 -04:00
" Useful mappings for managing tabs
map < leader > tn :tabnew < cr >
map < leader > to :tabonly < cr >
map < leader > tc :tabclose < cr >
map < leader > tm :tabmove
2012-07-02 18:57:21 -04:00
map < leader > t < leader > :tabnext
2012-05-29 16:12:10 -04:00
2014-08-15 07:21:18 -04:00
" Let 'tl' toggle between this and the last accessed tab
let g :lasttab = 1
nmap < Leader > tl :exe "tabn " .g :lasttab < CR >
au TabLeave * let g :lasttab = tabpagenr ( )
2012-05-29 16:12:10 -04:00
" 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 > = expand ( "%:p:h" ) < cr > /
" Switch CWD to the directory of the open buffer
map < leader > cd :cd %:p :h < cr > :pwd < cr >
" Specify the behavior when switching between buffers
try
set switchbuf = useopen , usetab , newtab
set stal = 2
catch
endtry
" Return to last edit position when opening files (You want this!)
2016-05-14 11:57:26 -04:00
au BufReadPost * if line ( "'\"" ) > 1 && line ( "'\"" ) < = line ( "$" ) | exe "normal! g'\"" | endif
2012-05-29 16:12:10 -04:00
""""""""""""""""""""""""""""""
" => Status line
""""""""""""""""""""""""""""""
" Always show the status line
set laststatus = 2
" Format the status line
2016-04-26 16:04:59 -04:00
set statusline = \ %{HasPaste ( ) }%F %m %r %h \ %w \ \ CWD :\ %r %{getcwd ( ) }%h \ \ \ Line :\ %l \ \ Column :\ %c
2012-05-29 16:12:10 -04:00
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" => Editing mappings
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
2019-08-06 18:51:11 -04:00
" Remap VIM ESC to normal mode from insert mode using jj
" only issue when you need to literally type two jj's in insert mode therefore you must type slowly
imap jj < Esc >
" Just like traditional Select All, Ctrl+a
map < C - a > ggVG
2012-05-29 16:12:10 -04:00
" Remap VIM 0 to first non-blank character
map 0 ^
2019-08-06 18:51:11 -04:00
" Remap VIM H to first non-blank character
map H ^
" Remap VIM L to last blank character
map L $
" Clears highlighting
map < C - n > :noh < return >
" Replace word by occurence, press '.' to move to the next occurence which auto replaces with new word. I use it to rename variables. So far I haven't found a mapping that does it by scope reliably like vscode.
nnoremap gr *``cgn
" This loop remaps all 'alt key + character' to '\e + character'
" On my vim(windows, but some other windows users didn't have a problem)
" it won't recognize the Meta key when Alt is pressed
" https://vi.stackexchange.com/questions/2350/how-to-map-alt-key/2363
" for i in range(97,122)
" let c = nr2char(i)
" execute "set <M-".c.">=\e".c.""
" " On the 'j' iteration it would look like this
" " --> execute \"set <M-j>=\ej"
" endfor
2016-04-29 18:56:36 -04:00
" Move a line of text using ALT+[jk] or Command+[jk] on mac
2012-05-29 16:12:10 -04:00
nmap < M - j > mz :m + < cr > `z
nmap < M - k > mz :m -2 < cr > `z
vmap < M - j > :m '> + < cr > `< my `> mzgv `yo `z
vmap < M - k > :m '< -2 < cr > `> my `< mzgv `yo `z
if has ( "mac" ) | | has ( "macunix" )
nmap < D - j > < M - j >
nmap < D - k > < M - k >
vmap < D - j > < M - j >
vmap < D - k > < M - k >
endif
2017-04-01 08:12:35 -04:00
" Delete trailing white space on save, useful for some filetypes ;)
fun ! CleanExtraSpaces ( )
let save_cursor = getpos ( "." )
let old_query = getreg ( '/' )
silent ! %s /\s\+$/ /e
call setpos ( '.' , save_cursor )
call setreg ( '/' , old_query )
endfun
if has ( "autocmd" )
autocmd BufWritePre *.txt , *.js , *.py , *.wiki , *.sh , *.coffee :call CleanExtraSpaces ( )
endif
2012-05-29 16:12:10 -04:00
2019-08-06 18:51:11 -04:00
" These two mappings are a quality of life improvement of copy/pasting from the clipboard
" Effectively this paste map applies the indent within the pasted content from the indent level that you're at when you invoke the pasting
" http://tilvim.com/2014/03/18/a-better-paste.html
map < Leader > p :set paste < CR > o < esc > "*]p :set nopaste < cr >
vmap < Leader > y "+y
2012-05-29 16:12:10 -04:00
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" => Spell checking
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Pressing ,ss will toggle and untoggle spell checking
map < leader > ss :setlocal spell ! < cr >
" Shortcuts using <leader>
map < leader > sn ]s
map < leader > sp [s
map < leader > sa zg
map < leader > s ? z =
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" => Misc
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Remove the Windows ^M - when the encodings gets messed up
noremap < Leader > m mmHmt :%s /<C-V><cr>/ /ge < cr > 'tzt' m
2014-01-06 19:25:41 -05:00
" Quickly open a buffer for scribble
2012-05-29 16:12:10 -04:00
map < leader > q :e ~ /buffer < cr >
2014-01-06 19:25:41 -05:00
" Quickly open a markdown buffer for scribble
map < leader > x :e ~ /buffer .md < cr >
2012-05-29 16:12:10 -04:00
" Toggle paste mode on and off
2019-08-06 18:51:11 -04:00
" map <leader>pp :setlocal paste!<cr>
2012-05-29 16:12:10 -04:00
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" => Helper functions
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Returns true if paste mode is enabled
function ! HasPaste ( )
if &paste
return 'PASTE MODE '
2015-05-21 20:55:12 -04:00
endif
2012-05-29 16:12:10 -04:00
return ''
endfunction
" Don't close window, when deleting a buffer
command ! Bclose call < SID > BufcloseCloseIt ( )
function ! < SID > BufcloseCloseIt ( )
2018-03-31 10:52:11 -04:00
let l :currentBufNum = bufnr ( "%" )
let l :alternateBufNum = bufnr ( "#" )
if buflisted ( l :alternateBufNum )
buffer #
else
bnext
endif
if bufnr ( "%" ) = = l :currentBufNum
new
endif
if buflisted ( l :currentBufNum )
execute ( "bdelete! " .l :currentBufNum )
endif
2012-05-29 16:12:10 -04:00
endfunction
2017-07-16 08:42:14 -04:00
function ! CmdLine ( str )
2018-03-31 10:52:11 -04:00
call feedkeys ( ":" . a :str )
2017-07-16 08:42:14 -04:00
endfunction
function ! VisualSelection ( direction , extra_filter ) range
let l :saved_reg = @"
execute "normal! vgvy"
let l :pattern = escape ( @", " \\/.*'$^~ []")
let l :pattern = substitute ( l :pattern , "\n$" , "" , "" )
if a :direction = = 'gv'
call CmdLine ( "Ack '" . l :pattern . "' " )
elseif a :direction = = 'replace'
call CmdLine ( "%s" . '/' . l :pattern . '/' )
endif
let @/ = l :pattern
let @" = l :saved_reg
endfunction