373 lines
9.9 KiB
VimL
373 lines
9.9 KiB
VimL
set background=dark
|
|
set t_RB=
|
|
colorscheme molokai
|
|
|
|
|
|
if &compatible
|
|
set nocompatible
|
|
endif
|
|
|
|
" ---------------------------------------------------------------------------
|
|
" Leader key
|
|
" ---------------------------------------------------------------------------
|
|
let mapleader = " "
|
|
let maplocalleader = " "
|
|
nnoremap <Space> <Nop>
|
|
set timeoutlen=500
|
|
|
|
" ---------------------------------------------------------------------------
|
|
" Sensible interface defaults
|
|
" ---------------------------------------------------------------------------
|
|
syntax enable
|
|
filetype plugin indent on
|
|
|
|
set number
|
|
set relativenumber
|
|
set cursorline
|
|
set ruler
|
|
set showcmd
|
|
set showmode
|
|
set laststatus=2
|
|
set showtabline=2
|
|
set wildmenu
|
|
set wildmode=longest:full,full
|
|
set scrolloff=4
|
|
set sidescrolloff=4
|
|
set splitbelow
|
|
set splitright
|
|
set hidden
|
|
set confirm
|
|
set mouse=a
|
|
|
|
" Search as you type; keep searches case-sensitive only when capitals are used.
|
|
set incsearch
|
|
set hlsearch
|
|
set ignorecase
|
|
set smartcase
|
|
|
|
" Comfortable editing defaults.
|
|
set backspace=indent,eol,start
|
|
set autoindent
|
|
set smartindent
|
|
set expandtab
|
|
set tabstop=2
|
|
set shiftwidth=2
|
|
set softtabstop=2
|
|
|
|
" Python convention: four-space indentation.
|
|
augroup simple_indentation
|
|
autocmd!
|
|
autocmd FileType python setlocal expandtab tabstop=4 shiftwidth=4 softtabstop=4
|
|
augroup END
|
|
|
|
" Use the desktop clipboard when this Vim build supports it.
|
|
if has('clipboard')
|
|
set clipboard=unnamedplus
|
|
endif
|
|
|
|
" ---------------------------------------------------------------------------
|
|
" Built-in file browser (netrw): tree-style sidebar, no plugin required
|
|
" ---------------------------------------------------------------------------
|
|
let g:netrw_banner = 0
|
|
let g:netrw_liststyle = 3
|
|
let g:netrw_winsize = 25
|
|
let g:netrw_keepdir = 1
|
|
let g:netrw_altv = 1
|
|
|
|
" Space-e: toggle the file browser on the left.
|
|
nnoremap <silent> <leader>e :Lexplore<CR>
|
|
|
|
" Useful keys while the file browser is focused:
|
|
" Enter open file or directory
|
|
" t open file in a new tab
|
|
" - go to the parent directory
|
|
" R rename selected file
|
|
" D delete selected file
|
|
" % create a new file
|
|
" d create a new directory
|
|
|
|
" ---------------------------------------------------------------------------
|
|
" Tabs
|
|
" ---------------------------------------------------------------------------
|
|
nnoremap <silent> <Tab> gt
|
|
nnoremap <silent> <S-Tab> gT
|
|
nnoremap <silent> <leader>t :tabnew<CR>
|
|
nnoremap <silent> <leader>c :tabclose<CR>
|
|
|
|
" Move the current tab left or right.
|
|
nnoremap <silent> <leader>[ :tabmove -1<CR>
|
|
nnoremap <silent> <leader>] :tabmove +1<CR>
|
|
|
|
" ---------------------------------------------------------------------------
|
|
" Everyday shortcuts (each is Leader plus one key)
|
|
" ---------------------------------------------------------------------------
|
|
nnoremap <silent> <leader>s :write<CR>
|
|
nnoremap <silent> <leader>q :quit<CR>
|
|
nnoremap <silent> <leader>x :write<CR>:quit<CR>
|
|
nnoremap <silent> <leader>/ :nohlsearch<CR>
|
|
|
|
" Move between split windows.
|
|
nnoremap <silent> <leader>h <C-w>h
|
|
nnoremap <silent> <leader>j <C-w>j
|
|
nnoremap <silent> <leader>k <C-w>k
|
|
nnoremap <silent> <leader>l <C-w>l
|
|
|
|
" ---------------------------------------------------------------------------
|
|
" Project navigation
|
|
" ---------------------------------------------------------------------------
|
|
|
|
" Search recursively from Vim's current directory.
|
|
set path+=**
|
|
|
|
" Ignore generated and dependency directories.
|
|
set wildignore+=*/.git/*
|
|
set wildignore+=*/node_modules/*
|
|
set wildignore+=*/dist/*
|
|
set wildignore+=*/build/*
|
|
set wildignore+=*/coverage/*
|
|
|
|
" Space-f: type part of a filename and press Tab.
|
|
nnoremap <leader>f :find<Space>
|
|
|
|
" Space-o: show previously opened files.
|
|
nnoremap <silent> <leader>o :browse oldfiles<CR>
|
|
|
|
" Space-b: list buffers, then type the buffer number and press Enter.
|
|
nnoremap <leader>b :buffers<CR>:buffer<Space>
|
|
|
|
|
|
|
|
|
|
|
|
function! ProjectSearch()
|
|
let l:query = input('Search project: ')
|
|
|
|
if empty(l:query)
|
|
return
|
|
endif
|
|
|
|
execute 'silent vimgrep /\V'
|
|
\ . escape(l:query, '/\')
|
|
\ . '/gj **/*'
|
|
|
|
copen
|
|
endfunction
|
|
|
|
nnoremap <silent> <leader>g :call ProjectSearch()<CR>
|
|
nnoremap <silent> <leader>n :cnext<CR>
|
|
nnoremap <silent> <leader>p :cprevious<CR>
|
|
|
|
|
|
function! ReindentFile()
|
|
let l:view = winsaveview()
|
|
normal! gg=G
|
|
call winrestview(l:view)
|
|
endfunction
|
|
|
|
nnoremap <silent> <leader>i :call ReindentFile()<CR>
|
|
xnoremap <silent> <leader>i =gv
|
|
|
|
|
|
" Save all modified files.
|
|
nnoremap <silent> <leader>a :wall<CR>
|
|
|
|
" Splits.
|
|
nnoremap <silent> <leader>v :vsplit<CR>
|
|
nnoremap <silent> <leader>- :split<CR>
|
|
nnoremap <silent> <leader>= <C-w>=
|
|
|
|
" Reload the configuration after editing ~/.vimrc.
|
|
nnoremap <silent> <leader>r :source $MYVIMRC<CR>
|
|
|
|
" Quickly leave Insert mode.
|
|
inoremap jk <Esc>
|
|
|
|
" ---------------------------------------------------------------------------
|
|
" Keymap help screen
|
|
" ---------------------------------------------------------------------------
|
|
|
|
function! ShowKeymapHelp()
|
|
" Open the help in a temporary buffer.
|
|
enew
|
|
silent file Vim-Keymaps
|
|
|
|
setlocal buftype=nofile
|
|
setlocal bufhidden=wipe
|
|
setlocal noswapfile
|
|
setlocal nobuflisted
|
|
setlocal nomodified
|
|
setlocal wrap
|
|
setlocal nonumber
|
|
setlocal norelativenumber
|
|
setlocal nocursorline
|
|
|
|
call setline(1, [
|
|
\ 'VIM KEYMAPS',
|
|
\ '===========',
|
|
\ '',
|
|
\ '',
|
|
\ 'FILES AND BROWSING',
|
|
\ ' Space e Toggle file browser',
|
|
\ ' Space f Find project file',
|
|
\ ' Space o Recently opened files',
|
|
\ ' Space b List open buffers',
|
|
\ ' Space a Create new parent directories and files',
|
|
\ '',
|
|
\ 'Inside the file browser:',
|
|
\ ' Enter Open file or directory',
|
|
\ ' t Open file in new tab',
|
|
\ ' - Parent directory',
|
|
\ ' R Rename file',
|
|
\ ' D Delete file',
|
|
\ '',
|
|
\ 'TABS',
|
|
\ ' Tab Next tab',
|
|
\ ' Shift-Tab Previous tab',
|
|
\ ' Space t Create new tab',
|
|
\ ' Space c Close current tab',
|
|
\ ' Space [ Move tab left',
|
|
\ ' Space ] Move tab right',
|
|
\ '',
|
|
\ 'SEARCH',
|
|
\ ' Space g Search text in project',
|
|
\ ' Space n Next search result',
|
|
\ ' Space p Previous search result',
|
|
\ ' Space / Clear search highlighting',
|
|
\ '',
|
|
\ 'EDITING',
|
|
\ ' Space s Save current file',
|
|
\ ' Space a Save all files',
|
|
\ ' Space i Auto-indent entire file',
|
|
\ ' jk Leave Insert mode',
|
|
\ '',
|
|
\ 'WINDOWS',
|
|
\ ' Space v Vertical split',
|
|
\ ' Space - Horizontal split',
|
|
\ ' Space = Equalize split sizes',
|
|
\ ' Space h Move to left window',
|
|
\ ' Space j Move to lower window',
|
|
\ ' Space k Move to upper window',
|
|
\ ' Space l Move to right window',
|
|
\ '',
|
|
\ 'VIM',
|
|
\ ' Space q Quit',
|
|
\ ' Space x Save and quit',
|
|
\ ' Space r Reload .vimrc',
|
|
\ ' Space ? Show this screen',
|
|
\ '',
|
|
\ 'Press q or Esc to close this screen.',
|
|
\ 'Press Space e to open the file browser.',
|
|
\ ])
|
|
|
|
setlocal nomodifiable
|
|
normal! gg
|
|
|
|
" These mappings work only inside this help screen.
|
|
nnoremap <silent> <buffer> q :bdelete!<CR>
|
|
nnoremap <silent> <buffer> <Esc> :bdelete!<CR>
|
|
endfunction
|
|
|
|
" Show the help screen manually.
|
|
nnoremap <silent> <leader>? :call ShowKeymapHelp()<CR>
|
|
|
|
" Detect whether Vim is receiving piped input.
|
|
let g:vim_reading_stdin = 0
|
|
|
|
augroup keymap_help_startup
|
|
autocmd!
|
|
autocmd StdinReadPre * let g:vim_reading_stdin = 1
|
|
|
|
" Show the help only when Vim starts without a filename.
|
|
autocmd VimEnter *
|
|
\ if argc() == 0 && !g:vim_reading_stdin |
|
|
\ call ShowKeymapHelp() |
|
|
\ endif
|
|
augroup END
|
|
|
|
|
|
|
|
|
|
|
|
" ---------------------------------------------------------------------------
|
|
" Space+a inside filemanager create parent directories and files
|
|
" ---------------------------------------------------------------------------
|
|
function! NetrwAddPath()
|
|
let l:base = b:netrw_curdir
|
|
let l:name = input('New path (end with / for directory): ')
|
|
|
|
if empty(l:name)
|
|
return
|
|
endif
|
|
|
|
let l:path = simplify(l:base . '/' . l:name)
|
|
|
|
" A trailing slash means: create directories only.
|
|
if l:name =~# '/$'
|
|
try
|
|
call mkdir(l:path, 'p')
|
|
silent execute 'keepalt edit! ' . fnameescape(l:base)
|
|
"silent execute "normal \<C-L>"
|
|
echo 'Created directory: ' . l:path
|
|
catch
|
|
echohl ErrorMsg
|
|
echomsg 'Cannot create directory: ' . v:exception
|
|
echohl None
|
|
endtry
|
|
return
|
|
endif
|
|
|
|
" Create all missing parent directories.
|
|
let l:parent = fnamemodify(l:path, ':h')
|
|
|
|
try
|
|
call mkdir(l:parent, 'p')
|
|
|
|
" Create only when the file does not already exist.
|
|
if getftype(l:path) ==# ''
|
|
call writefile([], l:path, 'b')
|
|
elseif isdirectory(l:path)
|
|
throw 'Path is a directory: ' . l:path
|
|
endif
|
|
catch
|
|
echohl ErrorMsg
|
|
echomsg 'Cannot create file: ' . v:exception
|
|
echohl None
|
|
return
|
|
endtry
|
|
|
|
|
|
" Refresh the Netrw file listing.
|
|
"silent execute "normal \<C-L>"
|
|
silent execute 'keepalt edit! ' . fnameescape(l:base)
|
|
|
|
" Find the main editing window.
|
|
let l:target_window = winnr('#')
|
|
|
|
" Find the main editing window.
|
|
let l:target_window = winnr('#')
|
|
|
|
if l:target_window == 0
|
|
\ || getbufvar(winbufnr(l:target_window), '&filetype') ==# 'netrw'
|
|
let l:target_window = 0
|
|
|
|
for l:window in range(1, winnr('$'))
|
|
if getbufvar(winbufnr(l:window), '&filetype') !=# 'netrw'
|
|
let l:target_window = l:window
|
|
break
|
|
endif
|
|
endfor
|
|
endif
|
|
|
|
" Open the new file in the main editing area.
|
|
if l:target_window > 0
|
|
execute l:target_window . 'wincmd w'
|
|
endif
|
|
|
|
execute 'edit ' . fnameescape(l:path)
|
|
endfunction
|
|
|
|
augroup netrw_custom_mappings
|
|
autocmd!
|
|
autocmd FileType netrw nnoremap <buffer> <leader>a :call NetrwAddPath()<CR>
|
|
augroup END
|