" Find the filepath to the currently active pyenv pythons and use these as the " python programs. " let g:python_host_prog=system("pyenv which python | xargs echo -n") let g:python_host_prog="/usr/bin/python" let g:python3_host_prog=system("pyenv which python3 | xargs echo -n") filetype off " required " set the runtime path to include Vundle and initialize set rtp+=/usr/local/Cellar/fzf/HEAD call plug#begin() function! DoRemote(arg) UpdateRemotePlugins endfunction " let Vundle manage Vundle, required " Plug 'Valloric/YouCompleteMe' Plug 'tpope/vim-unimpaired' Plug 'sudar/vim-arduino-syntax' Plug 'bling/vim-airline' Plug 'docunext/closetag.vim' Plug 'critiqjo/lldb.nvim' " Plug 'rizzatti/dash.vim' Plug 'terryma/vim-expand-region' " Plug 'sophacles/vim-processing' Plug 'tpope/vim-fugitive' " Plug 'othree/html5.vim' Plug 'klen/python-mode' " Plug 'derekwyatt/vim-scala' " Plug 'jplaut/vim-arduino-ino' " Plug 'stevearc/vim-arduino' " Plug 'altercation/vim-colors-solarized' " Plug 'rstacruz/sparkup' " Plug 'scrooloose/syntastic' Plug 'majutsushi/tagbar' Plug 'christoomey/vim-tmux-navigator' " Plug 'jelera/vim-javascript-syntax' Plug 'tpope/vim-obsession' Plug 'nvie/vim-togglemouse' Plug 'benmills/vimux' Plug 'julienr/vimux-pyutils' Plug 'embear/vim-localvimrc' Plug 'tpope/vim-surround' " Plug 'easymotion/vim-easymotion' Plug 'Yggdroot/indentLine' " Plug 'mindriot101/vim-yapf' Plug 'scrooloose/nerdtree' " Plug 'vim-scripts/TaskList.vim' " Plug 'xolox/vim-notes' " Plug 'xolox/vim-misc' Plug 'tpope/vim-vinegar' Plug 'vim-scripts/MatlabFilesEdition' Plug 'lervag/vimtex' " Plug 'bjoernd/vim-ycm-tex' Plug 'mhinz/vim-startify' " Plug 'Konfekt/FastFold' "Plug 'Shougo/deoplete.nvim', { 'do': function('DoRemote') } Plug 'roxma/nvim-completion-manager' Plug 'tpope/vim-dispatch' " Plug 'justmao945/vim-clang' Plug 'zchee/deoplete-clang' Plug 'zchee/deoplete-jedi' " Plug 'benekastah/neomake' Plug 'w0rp/ale' Plug 'junegunn/fzf', { 'dir': '~/.fzf', 'do': './install --all' } Plug 'jlanzarotta/bufexplorer' Plug 'chriskempson/base16-vim', { 'commit': '98aa775c5fd9156ada4f912a9af41f1c020da55d' } Plug 'vim-airline/vim-airline-themes' Plug 'danro/rename.vim' Plug 'roxma/python-support.nvim' "Plug 'Shougo/neco-syntax' "Plug 'Shougo/neoinclude.vim' " Plug 'vim-scripts/LanguageTool' "Plug 'vim-latex/vim-latex' Plug 'roman/golden-ratio' Plug 'ludovicchabant/vim-gutentags' "Plug 'SirVer/ultisnips' Plug 'honza/vim-snippets' call plug#end() " required filetype on filetype plugin on filetype indent on " backup files (~) in a common location if possible " set backup " set backupdir=~/.vim/_backup/,~/tmp " turn on undo files, put them in a common location set undofile set undodir=~/.vim/_undo/ if filereadable(expand("~/.vimrc_background")) let base16colorspace=256 source ~/.vimrc_background endif " =================================== " General vim settings " ==================================== " Set the default shell set shell=zsh " Set spell checker language set spelllang=en_gb " Allow the use of the mouse in vim set mouse=a "Disable .swp files set noswapfile " set the ruler to display cursor position on set ruler " set syntax highlighting on syntax on " set tabs to have 4 spaces set ts=4 " Keep cursor near middle of page set scrolloff=10 " indent when moving to the next line while writing code set autoindent " expand tabs into spaces set expandtab " when using the >> or << commands, shift lines by 4 spaces set shiftwidth=4 " remove 4 spaces as if it were a tab set softtabstop=4 " show a visual line under the cursor's current line set cursorline " enable all Python syntax highlighting features let python_highlight_all = 1 " show the matching part of the pair for [] {} and () set showmatch " Set number line? set nu " Turn off beeps when you do something wrong. set noerrorbells " Set numbers to display relative to current cursor position in the file set relativenumber " Ignore case when using search set ignorecase " Show search result before moving to it set incsearch " Visual autocomplete for command menu set wildmenu " Redraw only when we need to. set lazyredraw " Set line wrap to 79 charachters. set tw=79 " Change directory to the directory of the current file. " set autochdir set list " Display unprintable characters f12 - switches set showbreak=↪\ set listchars=tab:••,trail:•,extends:»,precedes:«,eol:⏎,nbsp:• " Unprintable chars mapping " ==================================== " Indent highlighting settings " ==================================== let g:indentLine_char = '•' let g:indentLine_color_term = 19 let g:indentLine_enabled = 1 "let g:indentLine_leadingSpaceChar = '·' "let g:indentLine_leadingSpaceEnabled = 1 let g:indentLine_faster = 1 " ==================================== " LaTeX Settings " ==================================== " OPTIONAL: Starting with Vim 7, the filetype of empty .tex files defaults to " 'plaintex' instead of 'tex', which results in vim-latex not being loaded. " The following changes the default filetype back to 'tex': let g:tex_flavor='latex' let g:tex_conceal = "" " autocmd BufWritePost *.tex Dispatch! latexmk -xelatex " ==================================== " Startify Settings " ==================================== nnoremap m :Startify " ==================================== " Neomake Settings " ==================================== set errorformat=%f:%l:%m " if has('autocmd') " autocmd! BufWritePost * Neomake " autocmd! BufReadPost,FileReadPost * Neomake " endif " " " Enable neomake debugging via :messages " " let g:neomake_verbose = 3 " " " " let g:neomake_java_javac_maker = { " \ 'errorformat': " \ '%E%f:%l: %trror: %m,' . " \ '%W%f:%l: %tarning: %m,' . " \ '%E%f:%l: %m,'. " \ '%Z%p^,'. " \ '%-G%.%#', " \ } " let g:neomake_java_enabled_makers = ['javac'] " " let g:neomake_matlab_mlint_maker = { " \ 'errorformat': " \ 'L %l (C %c): %*[a-zA-Z0-9]: %m,'. " \ 'L %l (C %c-%*[0-9]): %*[a-zA-Z0-9]: %m', " \ 'args': ['%:p', '-id'], " \ 'defaults': { 'type': 'W' }, " \} " " let g:neomake_matlab_enabled_makers = ['mlint'] " " "let g:neomake_cpp_clang_args = ["-std=c++14"] " "let g:neomake_open_list = 2 " " " let g:neomake_python_enabled_makers = ['pep8', 'pylint'] " " " " let g:neomake_warning_sign = { " " \ 'text': '✹', " " \ 'texthl': 'WarningMsg', " " \ } " " " " let g:neomake_error_sign = { " " \ 'text': '✖', " " \ 'texthl': 'ErrorMsg', " " \ } " ==================================== " Easymotion Settings " ==================================== "let g:EasyMotion_do_mapping = 0 " Disable default mappings " Bi-directional find motion " Jump to anywhere you want with minimal keystrokes, with just one key binding. " `s{char}{label}` " nmap s (easymotion-s) " or " `s{char}{char}{label}` " Need one more keystroke, but on average, it may be more comfortable. " nmap s (easymotion-s2) " Turn on case insensitive feature " let g:EasyMotion_smartcase = 1 " JK motions: Line motions " map j (easymotion-j) " map k (easymotion-k) " Word jump " map w (easymotion-w) " map e (easymotion-e) " map bb (easymotion-b) " map B (easymotion-B) " easymotion highlight colors " hi link EasyMotionTarget Search " hi link EasyMotionTarget2First Search " hi link EasyMotionTarget2Second Search " hi link EasyMotionShade Comment " ==================================== " solarized settings " ==================================== " Set to the dark solarized colour scheme " colorscheme solarized " set background=dark " let g:solarized_termtrans = 1 "let g:solarized_termcolors=16 "let g:solarized_visibility="high" "let g:solarized_contrast = "high" " hi Visual term=reverse cterm=reverse guibg=Grey " ==================================== " NerdTree Settings " ==================================== " Fix nerdtree arrow problems let g:NERDTreeDirArrows=0 " ==================================== " Bufexplorer Settings " ==================================== let g:bufExplorerSortBy='name' let g:bufExplorerShowRelativePath=1 let g:bufExplorerFindActive=0 " ==================================== " Netrw Settings " ==================================== let g:netrw_liststyle=3 " ==================================== " LocalVimrc Settings " ==================================== " Set events to check for local vimrcs on let g:localvimrc_event = [ "BufWinEnter", "VimEnter" ] " Save preferences for which lvimrc files to load so vim doesn't ask every " time let g:localvimrc_persistent = 2 " ==================================== " Airline settings " ==================================== " Enable tabline let g:airline#extensions#tabline#enabled = 1 " Set tabs to display the name of the currently active file let g:airline#extensions#tabline#fnamemod = ':t' let g:airline#extensions#tabline#show_tab_nr = 0 let g:airline#extensions#tabline#fnametruncate = 4 "let g:airline#extensions#tabline#buffer_nr_format = '%s:' " Don't make a new tab for every buffer let g:airline#extensions#tabline#show_buffers = 0 "Remove seperators and makes airline look cleaner let g:airline_left_sep='' let g:airline_right_sep='' let g:airline_skip_empty_sections = 1 " let g:airline_section_z='' " Show airline even when only one file is open set laststatus=2 " This allows buffers to be hidden if you've modified a buffer. " This is almost a must if you wish to use buffers in this way. set hidden set switchbuf=usetab,newtab " Move to the next buffer "nnoremap l :tabnext " Move to the previous buffer "nnoremap :tabprev "let g:airline#extensions#tabline#buffer_idx_mode = 1 nmap 1 AirlineSelectTab1 nmap 2 AirlineSelectTab2 nmap 3 AirlineSelectTab3 nmap 4 AirlineSelectTab4 nmap 5 AirlineSelectTab5 nmap 6 AirlineSelectTab6 nmap 7 AirlineSelectTab7 nmap 8 AirlineSelectTab8 nmap 9 AirlineSelectTab9 nmap h AirlineSelectPrevTab nmap l AirlineSelectNextTab let g:airline_theme = 'base16' " ==================================== " Closetag for HTML settings... " ==================================== autocmd FileType html,htmldjango,jinjahtml,eruby,mako let b:closetag_html_style=1 autocmd FileType html,xhtml,xml,htmldjango,jinjahtml,eruby,mako source ~/.vim/bundle/closetag.vim/plugin/closetag.vim autocmd FileType html,xhtml,xml,htmldjango,jinjahtml,eruby,mako set smarttab " ==================================== " Pymode setting " ==================================== let g:pymode_options = 1 " Disable automatic folding of classes and functions let g:pymode_folding = 0 " Set the maximum line length before wrapping text let g:pymode_options_max_line_length = 79 " Set the display of a coloured column to represent the maximum line length " location let g:pymode_options_colorcolumn = 1 " Turn indenting on let g:pymode_indent = 1 " Don't check for errors every time a file is written let g:pymode_lint_on_write = 0 " Turn linting off let g:pymode_lint = 0 " Turn syntax highlighting on let g:pymode_syntax = 1 " Disable rope due to hanging bug let g:pymode_rope = 0 " Enable all extra syntax highlighting options let g:pymode_syntax_all = 1 let g:pymode_run = 0 let g:pymode_run_bind = '' " Disable adding breakpoints with leader b let g:pymode_breakpoint = 0 " ==================================== " ProSession Settings " ==================================== let g:prosession_tmux_title = 1 let g:prosession_load_on_startup = 1 " ==================================== " Syntastic " ==================================== " set statusline+=%#warningmsg# " set statusline+=%{SyntasticStatuslineFlag()} " set statusline+=%* " let g:syntastic_mode_map = { " \ "mode": "passive", " \ "active_filetypes": [], " \ "passive_filetypes": [] } " let g:syntastic_always_populate_loc_list = 1 " " " Check for errors when opening a new file " let g:syntastic_check_on_open = 1 " " " Don't check for errors if quiting after writing " let g:syntastic_check_on_wq = 0 " " let g:syntastic_check_on_w = 0 " " map c :SyntasticCheck " " " Set the checkers to be used for finding syntax errors " let g:syntastic_python_checkers = ['pylint', 'pep8'] " " let g:syntastic_matlab_checkers = ['mlint'] " " function! TogglePep257() " let c = 0 " let found = 0 " for i in g:syntastic_python_checkers " if i == 'pep257' " call remove(g:syntastic_python_checkers, c) " let found = 1 " endif " let c += 1 " endfor " if found == 0 " call add(g:syntastic_python_checkers, 'pep257') " endif " :SyntasticCheck " endfunction " " " Function for toggling the error window " function! ToggleErrors() " let old_last_winnr = winnr('$') " lclose " if old_last_winnr == winnr('$') " " Nothing was closed, open syntastic error location panel " Errors " endif " endfunction " " let g:syntastic_auto_loc_list = 0 " " " Run all checkers and then create list of errors rather than showing error " " lists individually " let g:syntastic_aggregate_errors = 1 " " " " Set JavaScript syntax checkers " let g:syntastic_javascript_checkers = ['jshint'] autocmd CursorMovedI * if pumvisible() == 0|pclose|endif autocmd InsertLeave * if pumvisible() == 0|pclose|endif set conceallevel=0 set concealcursor=vin " Complete options (disable preview scratch window, longest removed to aways " show menu) set completeopt=longest,menuone " Limit popup menu height set pumheight=40" " for python completions let g:python_support_python3_requirements = add(get(g:,'python_support_python3_requirements',[]),'jedi') " language specific completions on markdown file let g:python_support_python3_requirements = add(get(g:,'python_support_python3_requirements',[]),'mistune') " utils, optional let g:python_support_python3_requirements = add(get(g:,'python_support_python3_requirements',[]),'psutil') let g:python_support_python3_requirements = add(get(g:,'python_support_python3_requirements',[]),'setproctitle') " ==================================== " DeoPlete Settings " ==================================== " Use deoplete. " let g:deoplete#enable_at_startup = 1 " " Unsure what these do but things seem to work so not touching... took from here: https://github.com/zchee/deoplete-clang/issues/15 " set completeopt+=noinsert " set completeopt-=preview " let g:deoplete#enable_smart_case = 1 " let g:deoplete#auto_completion_start_length = 0 " let g:min_pattern_length = 0 " Allow navigation through auto-completions using tab. " deoplete tab-complete inoremap pumvisible() ? "\" : "\" inoremap pumvisible() ? "\" : "\" " ==================================== " UltiSnips Settings " ==================================== "let g:UltiSnipsExpandTrigger = "(ultisnips_expand)" "let g:UltiSnipsJumpForwardTrigger="" "let g:UltiSnipsJumpBackwardTrigger="" "let g:UltiSnipsRemoveSelectModeMappings = 0 "imap (expand_or_nl) (has_key(v:completed_item,'snippet')?"\":"\") "imap (pumvisible() ? "\\(cm_inject_snippet)\(expand_or_nl)" : "\") "" optional "inoremap =cm#sources#ultisnips#trigger_or_popup("\(ultisnips_expand)") " inoremap pumvisible() ? "\" : "\u\" "inoremap =my_cr_function() "inoremap deoplete#mappings#smart_close_popup()."\" " "function! s:my_cr_function() abort " return pumvisible() ? deoplete#mappings#close_popup() : "\" "endfunction " Set paths to homebrew clang library and executable for deoplete clang "let g:deoplete#sources#clang#libclang_path = "/usr/local/Cellar/llvm/HEAD/lib/libclang.dylib" "let g:deoplete#sources#clang#clang_header = "/usr/local/Cellar/llvm/HEAD/lib/clang" " Disable vim-clang diagnostic window let g:clang_diagsopt = '' " Ensure buffer based completion is shown alongside plugin completions such as " clang or jedi. " call deoplete#custom#set('buffer', 'rank', 9999) " ==================================== " YouCompleteMe Settings (Deprecated as of DeoPlete) " ==================================== " let g:ycm_path_to_python_interpreter ='/usr/bin/python' " ==================================== " Bufexplorer Settings " ==================================== imap :ToggleBufExplorer map :ToggleBufExplorer " ==================================== " VIMUX Commands " ==================================== " Prompt for a command to run map vp :VimuxPromptCommand " Run last command executed by RunVimTmuxCommand map vl :VimuxRunLastCommand " Inspect runner pane map vi :VimuxInspectRunner " Close all other tmux panes in current window map vq :VimuxCloseRunner " Interrupt any command running in the runner pane map vs :VimuxInterruptRunner " ==================================== " Tagbar Settings " ==================================== " Focus on tagbar when it is opened let g:tagbar_autofocus = 1 " ==================================== " LLDB Settings " ==================================== nmap LLBreakSwitch vmap LLStdInSelected nnoremap :LLstdin nnoremap :LLmode debug nnoremap :LLmode code nnoremap :LL continue nnoremap :LL process interrupt nnoremap :LL print =expand('') vnoremap :LL print =lldb#util#get_selection() " ==================================== " LanguageTool Settings " ==================================== let g:languagetool_jar=system("find $(brew --prefix)/Cellar -name \"languagetool-commandline.jar\" -print -quit | xargs echo -n") " ==================================== " Golden Ratio settings " ==================================== let g:golden_ratio_exclude_nonmodifiable = 1 " ==================================== " Custom key bindings " ==================================== " Disable arrow keys map map map map " Set space as leader key map " Backspace over tabs properly (I think...) set backspace=indent,eol,start " Show commands used in the botom right set showcmd " Activate/deactivate the Tagbar nmap :TagbarToggle " Map the error window toggle to nmap :call ToggleErrors() " To open a new empty tab nmap n :enew " Move to the next buffer nmap bl :bnext " Move to the previous buffer nmap bh :bprevious " Close the current buffer and move to the previous one " This replicates the idea of closing a tab nmap bq :bpspbnbd nmap tq :close " Toggle the NerdTree file browser menu nnoremap :NERDTreeToggle " Toggle session monitoring nmap o :Obsess "Remove all trailing whitespace by pressing F5 fun! TrimWhitespace() let l:save = winsaveview() %s/\s\+$//e call winrestview(l:save) endfun command! TrimWhitespace call TrimWhitespace() noremap tw :call TrimWhitespace() " Copy too and from the system clipboard with standard yank and paste commands " but with leader vmap y "+y vmap d "+d nmap p "+p nmap P "+P vmap p "+p vmap P "+P " Set clipboard to system clipboard set clipboard=unnamed function! ClipboardYank() call system('pbcopy', @@) endfunction function! ClipboardPaste() let @@ = system('pbpaste') endfunction vnoremap y y:call ClipboardYank() vnoremap d d:call ClipboardYank() nnoremap p :call ClipboardPaste()p " Enter visual line by hitting leader twice "nmap V " Map v to use expand-region plugin for selecting char, then word, then " paragraph vmap v (expand_region_expand) vmap (expand_region_shrink) " Stop strange window from popping up when accidentally press q: map q: :q map Q: :q map Q; :q map q; :q " nmap :wincmd hcall Splitresize() " nmap :wincmd jcall Splitresize() " nmap :wincmd kcall Splitresize() " nmap :wincmd lcall Splitresize() " Navigate from terminal windows whilst in terminal mode tnoremap :wincmd h tnoremap :wincmd j tnoremap :wincmd k tnoremap :wincmd l inoremap :wincmd h inoremap :wincmd j inoremap :wincmd k inoremap :wincmd l " Clear search highlighting nnoremap :noh " Always enter terminal windows in terminal mode autocmd BufWinEnter,WinEnter term://* startinsert " Window resizing mappings /*{{{*/ " if bufwinnr(1) " noremap :vertical resize +1 " noremap :vertical resize -1 " noremap :resize +1 " noremap :resize -1 " endif nmap r R " window navigation/manipulation "nmap h :topleft vnew "nmap l :botright vnew "nmap k :topleft new "nmap j :botright new " Quickly open a terminal nmap t :tabedit tnoremap " Quickly edit/reload the vimrc file nmap ev :e $MYVIMRC "nmap sv :so $MYVIMRC nnoremap er :vsp ~/.zshrc " Call yapf formatting " nnoremap y :call Yapf() " move vertically by visual line. If lines are wrapped due to lack of screen " space they are still navigated as expected nnoremap j gj nnoremap k gk " ==================================== function! s:ag_to_qf(line) let parts = split(a:line, ':') return {'filename': parts[0], 'lnum': parts[1], 'col': parts[2], \ 'text': join(parts[3:], ':')} endfunction function! s:ag_handler(lines) if len(a:lines) < 2 | return | endif let cmd = get({'ctrl-x': 'split', \ 'ctrl-v': 'vertical split', \ 'ctrl-t': 'tabe'}, a:lines[0], 'e') let list = map(a:lines[1:], 's:ag_to_qf(v:val)') let first = list[0] execute cmd escape(first.filename, ' %#\') execute first.lnum execute 'normal!' first.col.'|zz' if len(list) > 1 call setqflist(list) copen wincmd p endif endfunction command! -nargs=* Ag call fzf#run({ \ 'source': printf('ag --nogroup --column --color "%s"', \ escape(empty() ? '^(?=.)' : , '"\')), \ 'sink*': function('ag_handler'), \ 'options': '--ansi --expect=ctrl-t,ctrl-v,ctrl-x --delimiter : --nth 4.. '. \ '--multi --bind=ctrl-a:select-all,ctrl-d:deselect-all '. \ '--color hl:68,hl+:110', \ 'down': '50%' \ }) " Source local vim script for the current machine " (Keep this at bottom to overwrite configs above with system specific " configs) "if filereadable(expand("./vimrc.local")) " source ./vimrc.local "endif " Be aware of whether you are right or left vertical split " so you can use arrows more naturally. " Inspired by https://github.com/ethagnawl. function! g:IntelligentVerticalResize(direction) abort let l:window_resize_count = 5 let l:current_window_is_last_window = (winnr() == winnr('$')) if (a:direction ==# 'left') let [l:modifier_1, l:modifier_2] = ['+', '-'] else let [l:modifier_1, l:modifier_2] = ['-', '+'] endif let l:modifier = l:current_window_is_last_window ? l:modifier_1 : l:modifier_2 let l:command = 'vertical resize ' . l:modifier . l:window_resize_count . '' execute l:command endfunction nnoremap :call IntelligentVerticalResize('right') nnoremap :call IntelligentVerticalResize('left') function! s:buflist() redir => ls silent ls redir END return split(ls, '\n') endfunction function! s:bufopen(e) execute 'buffer' matchstr(a:e, '^[ 0-9]*') endfunction nnoremap :call fzf#run({ \ 'source': reverse(buflist()), \ 'sink': function('bufopen'), \ 'options': '+m', \ 'down': len(buflist()) + 2 \ }) " When switching colorscheme in terminal vim change the profile in iTerm as well. "if !has('gui_running') " function! s:change_iterm2_profile() " let dual_colorschemes = ["solarized"] " if exists('g:colors_name') " let profile = g:colors_name " if index(dual_colorschemes, g:colors_name) >= 0 " let profile .= '_'.&background " endif " let escape = '\033]50;SetProfile='.profile.'\x7' " if exists('$TMUX') " let escape = '\033Ptmux;'.substitute(escape, '\\033', '\\033\\033', 'g').'\033\\' " endif " silent call system("printf '".escape."' > /dev/tty") " endif " endfunction " " autocmd VimEnter,ColorScheme * call s:change_iterm2_profile() "endif " if $TERM_PROGRAM == 'iTerm.app' " if exists('$ITERM_PROFILE') " if ($ITERM_PROFILE == 'solarized_dark') " set t_Co=16 " let g:solarized_termcolors=16 " let g:solarized_termtrans=1 " set background=dark " colorscheme solarized " elseif ($ITERM_PROFILE == 'solarized_light') " set t_Co=16 " let g:solarized_termcolors=16 " let g:solarized_termtrans=1 " set background=light " colorscheme solarized " endif " endif " endif " if (v:version >= 700) highlight SpellBad ctermfg=126 term=Reverse guisp=126 gui=undercurl ctermbg=None highlight SpellCap ctermfg=Green term=Reverse guisp=Green gui=undercurl ctermbg=None highlight SpellLocal ctermfg=Cyan term=Underline guisp=Cyan gui=undercurl ctermbg=None highlight SpellRare ctermfg=Magenta term=underline guisp=Magenta gui=undercurl ctermbg=None endif " version 7+ hi NonText ctermfg=19 guifg=gray