From 8350566c14f541e40855321f56cef5e30ecdadee Mon Sep 17 00:00:00 2001 From: Julian Ospald Date: Sun, 11 Oct 2020 13:50:17 +0200 Subject: [PATCH] Update --- after/ftplugin/haskell.vim | 122 +++++--------------- after/ftplugin/rust.vim | 12 +- after/plugin/plugin_settings.vim | 171 +++++++++++++++++++++++++--- autoload/plug.vim | 190 ++++++++++++++++++++++++------- coc-settings.json | 114 +++++++++++++++++++ plugin/keys.vim | 168 +++++++++++++++++---------- vimrc | 54 ++++++--- 7 files changed, 599 insertions(+), 232 deletions(-) create mode 100644 coc-settings.json diff --git a/after/ftplugin/haskell.vim b/after/ftplugin/haskell.vim index 4ec554b..c75c56d 100644 --- a/after/ftplugin/haskell.vim +++ b/after/ftplugin/haskell.vim @@ -9,6 +9,7 @@ call CmdAlias('hasktags', '!hasktags -c .') " from " https://raw.githubusercontent.com/begriffs/haskell-vim-now/master/git-hscope call CmdAlias('codex', 'call system("haskell-ctags")call LoadHscope()') +call CmdAlias('Cc', 'Clap commits') map ctg :codex @@ -18,7 +19,6 @@ set tags=tags;/,codex.tags;/ " nnoremap gd " nnoremap cgd :cs find g =expand("") -nnoremap cgd :Tags =expand("") nnoremap :cs find c =expand("") set cscopeprg=do_at_stack_root\ hscope @@ -55,14 +55,24 @@ let g:haskell_indent_disable = 0 " let g:haskell_enable_arrowsyntax = 1 " let g:haskell_enable_pattern_synonyms = 1 " let g:haskell_enable_typeroles = 1 -" let g:haskell_indent_if = 3 -" let g:haskell_indent_case = 5 -" let g:haskell_indent_let = 4 -let g:haskell_indent_where = 2 -" let g:haskell_indent_do = 3 -" let g:haskell_indent_in = 1 -let g:haskell_disable_TH = 1 +let g:haskell_indent_if = 0 +let g:haskell_indent_case = 4 +let g:haskell_indent_let = 4 +let g:haskell_indent_where = 6 +let g:haskell_indent_before_where = 2 +let g:haskell_indent_after_bare_where = 2 +let g:haskell_indent_do = 4 +let g:haskell_indent_in = 0 +let g:haskell_indent_guard = 4 +" let g:haskell_disable_TH = 1 +" vim-hindent +let g:hindent_on_save = 0 +let g:hindent_indent_size = 4 +let g:hindent_line_length = 80 + +" vim-stylishhask +let g:stylishask_on_save = 0 " haskellmode-vim function! HaskellDocCurrentWord() @@ -73,8 +83,8 @@ endfunction " done by LSP now nmap :call HaskellDocCurrentWord() -nmap :silent update HsimportModule -nmap :silent update HsimportSymbol +" nmap :silent update HsimportModule +" nmap :silent update HsimportSymbol " liquid-types @@ -94,30 +104,6 @@ let g:vim_annotations_offset = '/.liquid/' " endfunction - -" nnoremap ld :call LanguageClient#textDocument_definition() -" nnoremap lr :call LanguageClient#textDocument_rename() -" nnoremap lf :call LanguageClient#textDocument_formatting() -" nnoremap lt :call LanguageClient#textDocument_typeDefinition() -" nnoremap lx :call LanguageClient#textDocument_references() -" nnoremap la :call LanguageClient_workspace_applyEdit() -" nnoremap lc :call LanguageClient#textDocument_completion() -" nnoremap lh :call LanguageClient#textDocument_hover() -" nnoremap ls :call LanguageClient_textDocument_documentSymbol() -" nnoremap lm :call LanguageClient_contextMenu() -" nnoremap :call LanguageClient#textDocument_hover() - - -" deoplete -"call deoplete#custom#option('sources',{ -" \ '_': ['buffer'], -" \ 'haskell': ['neosnippet', 'buffer', 'file', 'neco-ghc'] -" \ }) -" " \ 'haskell': ['neosnippet', 'buffer', 'file', 'neco-ghc'] -"call deoplete#enable() -"call deoplete#enable_logging('DEBUG', $HOME . '/deoplete.log') -"" inoremap pumvisible() ? "\" : "\" - let g:ghcmod_hlint_options = ['--ignore=Eta reduce $'] " ALE @@ -132,73 +118,17 @@ let g:ale_haskell_argon_error_level = 14 let g:ale_haskell_argon_warn_level = 10 let g:ale_haskell_argon_info_level = 6 -" completion -" -" neco-ghc -" let g:necoghc_enable_detailed_browse = 1 -" let g:haskellmode_completion_ghc = 0 -" autocmd FileType haskell setlocal omnifunc=necoghc#omnifunc -" let g:ycm_semantic_triggers = {'haskell' : ['.']} - -" let g:ycm_language_server = [ { 'name': 'haskell', 'filetypes': [ 'haskell', 'hs', 'lhs' ], 'cmdline': [ 'hie-wrapper' ], 'project_root_files': [ '.stack.yaml', 'cabal.config', 'package.yaml', 'cabal.project' ] } ] - - - -" clear search -" nmap :noh:GhcModTypeClear -" imap :noh:GhcModTypeClear - -" unmap -" unmap - -" nmap :GhcModType - -" for intero -" if has("nvim") - " let g:ale_enabled = 0 - - " " let g:intero_backend = { - " " \ 'command': 'cabal new-repl', - " " \ 'options': '', - " " \ 'cwd': expand('%:p:h'), - " " \} - - " " Intero starts automatically. Set this if you'd like to prevent that. - " let g:intero_start_immediately = 1 - - " " Enable type information on hover (when holding cursor at point for ~1 second). - " let g:intero_type_on_hover = 1 - - " " Change the intero window size; default is 10. - " let g:intero_window_size = 15 - - " " Sets the intero window to split vertically; default is horizontal - " " let g:intero_vertical_split = 1 - - " " let g:intero_ghci_options = '-dynamic' - - " " OPTIONAL: Make the update time shorter, so the type info will trigger faster. - " set updatetime=1000 let g:neoformat_enabled_haskell = ['brittany'] - " map t InteroGenericType - " nnoremap jd :InteroGoToDef - " map T InteroType - " nnoremap it :InteroTypeInsert - " nnoremap ist :InteroSetTargets -" endif - - - " LSP let g:LanguageClient_rootMarkers = ['cabal.project', '*.cabal', 'stack.yaml'] " \ 'haskell': ['ghcide', "--lsp"], let g:LanguageClient_serverCommands = { - \ 'haskell': ['hie-wrapper', '--lsp'], + \ 'haskell': ['haskell-language-server-wrapper', '--lsp'], \ } @@ -207,8 +137,8 @@ let g:echodoc#enable_at_startup = 1 call deoplete#enable() call deoplete#custom#source('LanguageClient', - \ 'min_pattern_length', - \ 2) + \ 'min_pattern_length', + \ 2) inoremap pumvisible() ? "\" : "\" @@ -247,3 +177,9 @@ let g:tagbar_type_haskell = { \ } \ } + +" vista +let g:vista_ctags_cmd = { + \ 'haskell': 'hasktags -x -o - -c', + \ } +let g:vista_fzf_preview = ['right:0%'] diff --git a/after/ftplugin/rust.vim b/after/ftplugin/rust.vim index 28a372a..b846543 100644 --- a/after/ftplugin/rust.vim +++ b/after/ftplugin/rust.vim @@ -41,12 +41,12 @@ let g:tagbar_ctags_bin = '/usr/bin/exuberant-ctags' " let g:autofmt_autosave = 0 " deoplete -call deoplete#custom#option('sources',{ - \ '_': ['buffer'], - \ 'rust': ['ultisnips', 'buffer', 'file', 'LanguageClient'] - \ }) -inoremap pumvisible() ? "\" : "\" -call deoplete#enable() +" call deoplete#custom#option('sources',{ + " \ '_': ['buffer'], + " \ 'rust': ['ultisnips', 'buffer', 'file', 'LanguageClient'] + " \ }) +" inoremap pumvisible() ? "\" : "\" +" call deoplete#enable() let g:LanguageClient_serverCommands = { \ 'rust': ['~/.cargo/bin/ra_lsp_server'], diff --git a/after/plugin/plugin_settings.vim b/after/plugin/plugin_settings.vim index 606a4d0..4ebc01d 100644 --- a/after/plugin/plugin_settings.vim +++ b/after/plugin/plugin_settings.vim @@ -4,16 +4,155 @@ let g:echodoc#enable_at_startup = 1 let g:echodoc#type = 'signature' +" function! ConfigureCocNVIM() +" " ============ coc.nvim =========== + " " if hidden is not set, TextEdit might fail. + " set hidden + + " " Some servers have issues with backup files, see #649 + " set nobackup + " set nowritebackup + + " " Better display for messages + " "set cmdheight=2 + + " " You will have bad experience for diagnostic messages when it's default 4000. + " set updatetime=300 + + " " don't give |ins-completion-menu| messages. + " set shortmess+=c + + " " always show signcolumns + " set signcolumn=yes + + " " Use tab for trigger completion with characters ahead and navigate. + " " Use command ':verbose imap ' to make sure tab is not mapped by other plugin. + " inoremap + " \ pumvisible() ? "\" : + " \ check_back_space() ? "\" : + " \ coc#refresh() + " inoremap pumvisible() ? "\" : "\" + + " function! s:check_back_space() abort + " let col = col('.') - 1 + " return !col || getline('.')[col - 1] =~# '\s' + " endfunction + + " " Use to trigger completion. + " inoremap coc#refresh() + + " " Use to confirm completion, `u` means break undo chain at current position. + " " Coc only does snippet and additional edit on confirm. + " inoremap pumvisible() ? "\" : "\u\" + " " Or use `complete_info` if your vim support it, like: + " " inoremap complete_info()["selected"] != "-1" ? "\" : "\u\" + + " " Use `[g` and `]g` to navigate diagnostics + " nmap ,g (coc-diagnostic-prev) + " nmap .g (coc-diagnostic-next) + + " " Remap keys for gotos + " nmap gd (coc-definition) + " nmap gy (coc-type-definition) + " nmap gi (coc-implementation) + " nmap gr (coc-references) + + " " Use K to show documentation in preview window + " nnoremap K :call show_documentation() + + " function! s:show_documentation() + " if (index(['vim','help'], &filetype) >= 0) + " execute 'h '.expand('') + " else + " call CocActionAsync('doHover') + " endif + " endfunction + + " " Highlight symbol under cursor on CursorHold + " autocmd CursorHold * silent call CocActionAsync('highlight') + + " " Remap for rename current word + " nmap rn (coc-rename) + + " " Remap for format selected region + " " xmap f (coc-format-selected) + " " nmap f (coc-format-selected) + + " augroup mygroup + " autocmd! + " " Setup formatexpr specified filetype(s). + " autocmd FileType typescript,json setl formatexpr=CocAction('formatSelected') + " " Update signature help on jump placeholder + " autocmd User CocJumpPlaceholder call CocActionAsync('showSignatureHelp') + " augroup end + + " " Remap for do codeAction of selected region, ex: `aap` for current paragraph + " xmap a (coc-codeaction-selected) + " nmap a (coc-codeaction-selected) + + " " Remap for do codeAction of current line + " nmap ac (coc-codeaction) + " " Fix autofix problem of current line + " nmap qf (coc-fix-current) + + " " Create mappings for function text object, requires document symbols feature of languageserver. + " xmap if (coc-funcobj-i) + " xmap af (coc-funcobj-a) + " omap if (coc-funcobj-i) + " omap af (coc-funcobj-a) + + " " Use for select selections ranges, needs server support, like: coc-tsserver, coc-python + " nmap (coc-range-select) + " xmap (coc-range-select) + + " " Use `:Format` to format current buffer + " command! -nargs=0 Format :call CocAction('format') + + " " Use `:Fold` to fold current buffer + " command! -nargs=? Fold :call CocAction('fold', ) + + " " use `:OR` for organize import of current buffer + " command! -nargs=0 OR :call CocAction('runCommand', 'editor.action.organizeImport') + + " " Add status line support, for integration with other plugin, checkout `:h coc-status` + " set statusline^=%{coc#status()}%{get(b:,'coc_current_function','')} + + " " Using CocList + " " Show all diagnostics + " nnoremap .a :CocList diagnostics + " " Manage extensions + " nnoremap .e :CocList extensions + " " Show commands + " nnoremap c :CocList commands + " " Find symbol of current document + " nnoremap .o :CocList outline + " " Search workspace symbols + " nnoremap s :CocList -I symbols + " " Do default action for next item. + " nnoremap j :CocNext + " " Do default action for previous item. + " nnoremap k :CocPrev + " " Resume latest coc list + " nnoremap p :CocListResume +" endfunction + + +" autocmd! User coc.nvim call ConfigureCocNVIM() + +" function s:CocStop() + " :CocDisable + " call coc#rpc#start_server() +" endfunction + +" command! -nargs=0 CocStop :call s:CocStop() + "LanguageClient-neovim " Required for operations modifying multiple buffers like rename. set hidden -nnoremap lc :call LanguageClient_contextMenu() -" Or map each action separately -nnoremap T :call LanguageClient#textDocument_hover() -nnoremap gd :call LanguageClient#textDocument_definition() -nnoremap :call LanguageClient#textDocument_rename() + let g:LanguageClient_autoStart = 0 let g:LanguageClient_diagnosticsEnable = 1 +let g:LanguageClient_diagnosticsList = "Quickfix" let g:LanguageClient_diagnosticsDisplay = { \ 1: { \ "name": "Error", @@ -58,13 +197,6 @@ let g:LanguageClient_loggingFile = expand('~/LanguageClient.log') let g:LanguageClient_serverStderr = expand('~/LanguageServer.log') - - -if !has("nvim") - " lj - let g:LustyJugglerSuppressRubyWarning = 1 -endif - " neosnippet " Plugin key-mappings. " Note: It must be "imap" and "smap". It uses mappings. @@ -152,11 +284,6 @@ let NERDCreateDefaultMappings=0 let g:haddock_browser='/usr/bin/firefox' let g:haddock_browser_callformat='%s file://%s >/dev/null 2>&1 &' -" ctrlp -let g:ctrlp_user_command = 'fd --type f --color=never "" %s' -let g:ctrlp_use_caching = 1 -let g:ctrlp_match_func = { 'match': 'cpsm#CtrlPMatch' } - " fzf " --column: Show column number " --line-number: Show line number @@ -180,7 +307,6 @@ command! -nargs=* Rag " fastfold -nmap zuz (FastFoldUpdate) let g:fastfold_savehook = 1 let g:fastfold_fold_command_suffixes = ['x','X','a','A','o','O','c','C'] let g:fastfold_fold_movement_commands = [']z', '[z', 'zj', 'zk'] @@ -207,10 +333,19 @@ let g:tagbar_map_togglecaseinsensitive = 'zi' let g:NERDTreeMapActivateNode = '' let g:NERDTreeMapCustomOpen = '' let g:NERDTreeMapOpenExpl = 'n' +let g:NERDTreeMapJumpNextSibling = '' " let g:NERDTreeMapOpenSplit = '' +" use NERDTree instead of netrw +autocmd StdinReadPre * let s:std_in=1 +autocmd VimEnter * if argc() == 1 && isdirectory(argv()[0]) && !exists("s:std_in") | exe 'NERDTree' argv()[0] | wincmd p | ene | exe 'cd '.argv()[0] | endif " overwrite nonsense from editorconfig let g:EditorConfig_max_line_indicator = 'none' " let g:EditorConfig_preserve_formatoptions = 1 +" vim current word +let g:vim_current_word#highlight_current_word = 0 +hi default link CurrentWordTwins CursorColumn +" vista +let g:vista#renderer#enable_icon = 0 diff --git a/autoload/plug.vim b/autoload/plug.vim index 78fdc03..7914bfe 100644 --- a/autoload/plug.vim +++ b/autoload/plug.vim @@ -179,7 +179,7 @@ function! s:define_commands() endif if has('win32') \ && &shellslash - \ && (&shell =~# 'cmd\.exe' || &shell =~# 'powershell\.exe') + \ && (&shell =~# 'cmd\(\.exe\)\?$' || &shell =~# 'powershell\(\.exe\)\?$') return s:err('vim-plug does not support shell, ' . &shell . ', when shellslash is set.') endif if !has('nvim') @@ -251,7 +251,7 @@ endfunction function! plug#end() if !exists('g:plugs') - return s:err('Call plug#begin() first') + return s:err('plug#end() called without calling plug#begin() first') endif if exists('#PlugLOD') @@ -372,7 +372,7 @@ endfunction function! s:git_version_requirement(...) if !exists('s:git_version') - let s:git_version = map(split(split(s:system('git --version'))[2], '\.'), 'str2nr(v:val)') + let s:git_version = map(split(split(s:system(['git', '--version']))[2], '\.'), 'str2nr(v:val)') endif return s:version_requirement(s:git_version, a:000) endfunction @@ -419,7 +419,7 @@ if s:is_win let batchfile = s:plug_tempname().'.bat' call writefile(s:wrap_cmds(a:cmd), batchfile) let cmd = plug#shellescape(batchfile, {'shell': &shell, 'script': 0}) - if &shell =~# 'powershell\.exe' + if &shell =~# 'powershell\(\.exe\)\?$' let cmd = '& ' . cmd endif return [batchfile, cmd] @@ -632,17 +632,39 @@ function! plug#(repo, ...) let g:plugs[name] = spec let s:loaded[name] = get(s:loaded, name, 0) catch - return s:err(v:exception) + return s:err(repo . ' ' . v:exception) endtry endfunction function! s:parse_options(arg) let opts = copy(s:base_spec) let type = type(a:arg) + let opt_errfmt = 'Invalid argument for "%s" option of :Plug (expected: %s)' if type == s:TYPE.string + if empty(a:arg) + throw printf(opt_errfmt, 'tag', 'string') + endif let opts.tag = a:arg elseif type == s:TYPE.dict call extend(opts, a:arg) + for opt in ['branch', 'tag', 'commit', 'rtp', 'dir', 'as'] + if has_key(opts, opt) + \ && (type(opts[opt]) != s:TYPE.string || empty(opts[opt])) + throw printf(opt_errfmt, opt, 'string') + endif + endfor + for opt in ['on', 'for'] + if has_key(opts, opt) + \ && type(opts[opt]) != s:TYPE.list + \ && (type(opts[opt]) != s:TYPE.string || empty(opts[opt])) + throw printf(opt_errfmt, opt, 'string or list') + endif + endfor + if has_key(opts, 'do') + \ && type(opts.do) != s:TYPE.funcref + \ && (type(opts.do) != s:TYPE.string || empty(opts.do)) + throw printf(opt_errfmt, 'do', 'string or funcref') + endif if has_key(opts, 'dir') let opts.dir = s:dirpath(s:plug_expand(opts.dir)) endif @@ -864,8 +886,15 @@ endfunction function! s:chsh(swap) let prev = [&shell, &shellcmdflag, &shellredir] - if !s:is_win && a:swap - set shell=sh shellredir=>%s\ 2>&1 + if !s:is_win + set shell=sh + endif + if a:swap + if &shell =~# 'powershell\(\.exe\)\?$' || &shell =~# 'pwsh$' + let &shellredir = '2>&1 | Out-File -Encoding UTF8 %s' + elseif &shell =~# 'sh' || &shell =~# 'cmd\(\.exe\)\?$' + set shellredir=>%s\ 2>&1 + endif endif return prev endfunction @@ -898,7 +927,7 @@ function! s:regress_bar() endfunction function! s:is_updated(dir) - return !empty(s:system_chomp('git log --pretty=format:"%h" "HEAD...HEAD@{1}"', a:dir)) + return !empty(s:system_chomp(['git', 'log', '--pretty=format:%h', 'HEAD...HEAD@{1}'], a:dir)) endfunction function! s:do(pull, force, todo) @@ -935,6 +964,7 @@ function! s:do(pull, force, todo) endif elseif type == s:TYPE.funcref try + call s:load_plugin(spec) let status = installed ? 'installed' : (updated ? 'updated' : 'unchanged') call spec.do({ 'name': name, 'status': status, 'force': a:force }) catch @@ -961,7 +991,7 @@ endfunction function! s:checkout(spec) let sha = a:spec.commit - let output = s:system('git rev-parse HEAD', a:spec.dir) + let output = s:system(['git', 'rev-parse', 'HEAD'], a:spec.dir) if !v:shell_error && !s:hash_match(sha, s:lines(output)[0]) let output = s:system( \ 'git fetch --depth 999999 && git checkout '.plug#shellescape(sha).' --', a:spec.dir) @@ -1079,11 +1109,16 @@ function! s:update_impl(pull, force, args) abort normal! 2G silent! redraw - let s:clone_opt = get(g:, 'plug_shallow', 1) ? - \ '--depth 1' . (s:git_version_requirement(1, 7, 10) ? ' --no-single-branch' : '') : '' + let s:clone_opt = [] + if get(g:, 'plug_shallow', 1) + call extend(s:clone_opt, ['--depth', '1']) + if s:git_version_requirement(1, 7, 10) + call add(s:clone_opt, '--no-single-branch') + endif + endif if has('win32unix') || has('wsl') - let s:clone_opt .= ' -c core.eol=lf -c core.autocrlf=input' + call extend(s:clone_opt, ['-c', 'core.eol=lf', '-c', 'core.autocrlf=input']) endif let s:submodule_opt = s:git_version_requirement(2, 8) ? ' --jobs='.threads : '' @@ -1264,7 +1299,7 @@ function! s:job_cb(fn, job, ch, data) endfunction function! s:nvim_cb(job_id, data, event) dict abort - return a:event == 'stdout' ? + return (a:event == 'stdout' || a:event == 'stderr') ? \ s:job_cb('s:job_out_cb', self, 0, join(a:data, "\n")) : \ s:job_cb('s:job_exit_cb', self, 0, a:data) endfunction @@ -1273,12 +1308,15 @@ function! s:spawn(name, cmd, opts) let job = { 'name': a:name, 'running': 1, 'error': 0, 'lines': [''], \ 'new': get(a:opts, 'new', 0) } let s:jobs[a:name] = job - let cmd = has_key(a:opts, 'dir') ? s:with_cd(a:cmd, a:opts.dir, 0) : a:cmd - let argv = s:is_win ? ['cmd', '/s', '/c', '"'.cmd.'"'] : ['sh', '-c', cmd] if s:nvim + if has_key(a:opts, 'dir') + let job.cwd = a:opts.dir + endif + let argv = a:cmd call extend(job, { \ 'on_stdout': function('s:nvim_cb'), + \ 'on_stderr': function('s:nvim_cb'), \ 'on_exit': function('s:nvim_cb'), \ }) let jid = s:plug_call('jobstart', argv, job) @@ -1291,9 +1329,16 @@ function! s:spawn(name, cmd, opts) \ 'Invalid arguments (or job table is full)'] endif elseif s:vim8 + let cmd = join(map(copy(a:cmd), 'plug#shellescape(v:val, {"script": 0})')) + if has_key(a:opts, 'dir') + let cmd = s:with_cd(cmd, a:opts.dir, 0) + endif + let argv = s:is_win ? ['cmd', '/s', '/c', '"'.cmd.'"'] : ['sh', '-c', cmd] let jid = job_start(s:is_win ? join(argv, ' ') : argv, { \ 'out_cb': function('s:job_cb', ['s:job_out_cb', job]), + \ 'err_cb': function('s:job_cb', ['s:job_out_cb', job]), \ 'exit_cb': function('s:job_cb', ['s:job_exit_cb', job]), + \ 'err_mode': 'raw', \ 'out_mode': 'raw' \}) if job_status(jid) == 'run' @@ -1304,7 +1349,7 @@ function! s:spawn(name, cmd, opts) let job.lines = ['Failed to start job'] endif else - let job.lines = s:lines(call('s:system', [cmd])) + let job.lines = s:lines(call('s:system', has_key(a:opts, 'dir') ? [a:cmd, a:opts.dir] : [a:cmd])) let job.error = v:shell_error != 0 let job.running = 0 endif @@ -1401,8 +1446,14 @@ while 1 " Without TCO, Vim stack is bound to explode let [error, _] = s:git_validate(spec, 0) if empty(error) if pull - let fetch_opt = (has_tag && !empty(globpath(spec.dir, '.git/shallow'))) ? '--depth 99999999' : '' - call s:spawn(name, printf('git fetch %s %s 2>&1', fetch_opt, prog), { 'dir': spec.dir }) + let cmd = ['git', 'fetch'] + if has_tag && !empty(globpath(spec.dir, '.git/shallow')) + call extend(cmd, ['--depth', '99999999']) + endif + if !empty(prog) + call add(cmd, prog) + endif + call s:spawn(name, cmd, { 'dir': spec.dir }) else let s:jobs[name] = { 'running': 0, 'lines': ['Already installed'], 'error': 0 } endif @@ -1410,12 +1461,14 @@ while 1 " Without TCO, Vim stack is bound to explode let s:jobs[name] = { 'running': 0, 'lines': s:lines(error), 'error': 1 } endif else - call s:spawn(name, - \ printf('git clone %s %s %s %s 2>&1', - \ has_tag ? '' : s:clone_opt, - \ prog, - \ plug#shellescape(spec.uri, {'script': 0}), - \ plug#shellescape(s:trim(spec.dir), {'script': 0})), { 'new': 1 }) + let cmd = ['git', 'clone'] + if !has_tag + call extend(cmd, s:clone_opt) + endif + if !empty(prog) + call add(cmd, prog) + endif + call s:spawn(name, extend(cmd, [spec.uri, s:trim(spec.dir)]), { 'new': 1 }) endif if !s:jobs[name].running @@ -1452,7 +1505,7 @@ G_NVIM = vim.eval("has('nvim')") == '1' G_PULL = vim.eval('s:update.pull') == '1' G_RETRIES = int(vim.eval('get(g:, "plug_retries", 2)')) + 1 G_TIMEOUT = int(vim.eval('get(g:, "plug_timeout", 60)')) -G_CLONE_OPT = vim.eval('s:clone_opt') +G_CLONE_OPT = ' '.join(vim.eval('s:clone_opt')) G_PROGRESS = vim.eval('s:progress_opt(1)') G_LOG_PROB = 1.0 / int(vim.eval('s:update.threads')) G_STOP = thr.Event() @@ -1989,7 +2042,7 @@ function! s:update_ruby() end } if VIM::evaluate('s:mac_gui') == 1 - clone_opt = VIM::evaluate('s:clone_opt') + clone_opt = VIM::evaluate('s:clone_opt').join(' ') progress = VIM::evaluate('s:progress_opt(1)') nthr.times do mtx.synchronize do @@ -2055,13 +2108,29 @@ function! s:shellesc_sh(arg) return "'".substitute(a:arg, "'", "'\\\\''", 'g')."'" endfunction +" Escape the shell argument based on the shell. +" Vim and Neovim's shellescape() are insufficient. +" 1. shellslash determines whether to use single/double quotes. +" Double-quote escaping is fragile for cmd.exe. +" 2. It does not work for powershell. +" 3. It does not work for *sh shells if the command is executed +" via cmd.exe (ie. cmd.exe /c sh -c command command_args) +" 4. It does not support batchfile syntax. +" +" Accepts an optional dictionary with the following keys: +" - shell: same as Vim/Neovim 'shell' option. +" If unset, fallback to 'cmd.exe' on Windows or 'sh'. +" - script: If truthy and shell is cmd.exe, escape for batchfile syntax. function! plug#shellescape(arg, ...) + if a:arg =~# '^[A-Za-z0-9_/:.-]\+$' + return a:arg + endif let opts = a:0 > 0 && type(a:1) == s:TYPE.dict ? a:1 : {} let shell = get(opts, 'shell', s:is_win ? 'cmd.exe' : 'sh') let script = get(opts, 'script', 1) - if shell =~# 'cmd\.exe' + if shell =~# 'cmd\(\.exe\)\?$' return s:shellesc_cmd(a:arg, script) - elseif shell =~# 'powershell\.exe' || shell =~# 'pwsh$' + elseif shell =~# 'powershell\(\.exe\)\?$' || shell =~# 'pwsh$' return s:shellesc_ps1(a:arg) endif return s:shellesc_sh(a:arg) @@ -2105,8 +2174,24 @@ function! s:system(cmd, ...) let batchfile = '' try let [sh, shellcmdflag, shrd] = s:chsh(1) - let cmd = a:0 > 0 ? s:with_cd(a:cmd, a:1) : a:cmd - if s:is_win + if type(a:cmd) == s:TYPE.list + " Neovim's system() supports list argument to bypass the shell + " but it cannot set the working directory for the command. + " Assume that the command does not rely on the shell. + if has('nvim') && a:0 == 0 + return system(a:cmd) + endif + let cmd = join(map(copy(a:cmd), 'plug#shellescape(v:val, {"shell": &shell, "script": 0})')) + if &shell =~# 'powershell\(\.exe\)\?$' + let cmd = '& ' . cmd + endif + else + let cmd = a:cmd + endif + if a:0 > 0 + let cmd = s:with_cd(cmd, a:1, type(a:cmd) != s:TYPE.list) + endif + if s:is_win && type(a:cmd) != s:TYPE.list let [batchfile, cmd] = s:batchfile(cmd) endif return system(cmd) @@ -2159,9 +2244,10 @@ function! s:git_validate(spec, check_branch) \ branch, a:spec.branch) endif if empty(err) - let [ahead, behind] = split(s:lastline(s:system(printf( - \ 'git rev-list --count --left-right HEAD...origin/%s', - \ a:spec.branch), a:spec.dir)), '\t') + let [ahead, behind] = split(s:lastline(s:system([ + \ 'git', 'rev-list', '--count', '--left-right', + \ printf('HEAD...origin/%s', a:spec.branch) + \ ], a:spec.dir)), '\t') if !v:shell_error && ahead if behind " Only mention PlugClean if diverged, otherwise it's likely to be @@ -2185,7 +2271,9 @@ endfunction function! s:rm_rf(dir) if isdirectory(a:dir) - call s:system((s:is_win ? 'rmdir /S /Q ' : 'rm -rf ') . plug#shellescape(a:dir)) + return s:system(s:is_win + \ ? 'rmdir /S /Q '.plug#shellescape(a:dir) + \ : ['rm', '-rf', a:dir]) endif endfunction @@ -2267,6 +2355,7 @@ endfunction function! s:delete(range, force) let [l1, l2] = a:range let force = a:force + let err_count = 0 while l1 <= l2 let line = getline(l1) if line =~ '^- ' && isdirectory(line[2:]) @@ -2275,11 +2364,22 @@ function! s:delete(range, force) let answer = force ? 1 : s:ask('Delete '.line[2:].'?', 1) let force = force || answer > 1 if answer - call s:rm_rf(line[2:]) + let err = s:rm_rf(line[2:]) setlocal modifiable - call setline(l1, '~'.line[1:]) - let s:clean_count += 1 - call setline(4, printf('Removed %d directories.', s:clean_count)) + if empty(err) + call setline(l1, '~'.line[1:]) + let s:clean_count += 1 + else + delete _ + call append(l1 - 1, s:format_message('x', line[1:], err)) + let l2 += len(s:lines(err)) + let err_count += 1 + endif + let msg = printf('Removed %d directories.', s:clean_count) + if err_count > 0 + let msg .= printf(' Failed to remove %d directories.', err_count) + endif + call setline(4, msg) setlocal nomodifiable endif endif @@ -2294,7 +2394,7 @@ function! s:upgrade() let new = tmp . '/plug.vim' try - let out = s:system(printf('git clone --depth 1 %s %s', plug#shellescape(s:plug_src), plug#shellescape(tmp))) + let out = s:system(['git', 'clone', '--depth', '1', s:plug_src, tmp]) if v:shell_error return s:err('Error upgrading vim-plug: '. out) endif @@ -2489,11 +2589,13 @@ function! s:diff() call s:append_ul(2, origin ? 'Pending updates:' : 'Last update:') for [k, v] in plugs let range = origin ? '..origin/'.v.branch : 'HEAD@{1}..' - let cmd = 'git log --graph --color=never ' - \ . (s:git_version_requirement(2, 10, 0) ? '--no-show-signature ' : '') - \ . join(map(['--pretty=format:%x01%h%x01%d%x01%s%x01%cr', range], 'plug#shellescape(v:val)')) + let cmd = ['git', 'log', '--graph', '--color=never'] + if s:git_version_requirement(2, 10, 0) + call add(cmd, '--no-show-signature') + endif + call extend(cmd, ['--pretty=format:%x01%h%x01%d%x01%s%x01%cr', range]) if has_key(v, 'rtp') - let cmd .= ' -- '.plug#shellescape(v.rtp) + call extend(cmd, ['--', v.rtp]) endif let diff = s:system_chomp(cmd, v.dir) if !empty(diff) @@ -2561,7 +2663,7 @@ function! s:snapshot(force, ...) abort let names = sort(keys(filter(copy(g:plugs), \'has_key(v:val, "uri") && !has_key(v:val, "commit") && isdirectory(v:val.dir)'))) for name in reverse(names) - let sha = s:system_chomp('git rev-parse --short HEAD', g:plugs[name].dir) + let sha = s:system_chomp(['git', 'rev-parse', '--short', 'HEAD'], g:plugs[name].dir) if !empty(sha) call append(anchor, printf("silent! let g:plugs['%s'].commit = '%s'", name, sha)) redraw diff --git a/coc-settings.json b/coc-settings.json new file mode 100644 index 0000000..d22fc66 --- /dev/null +++ b/coc-settings.json @@ -0,0 +1,114 @@ +{ + "languageserver": { + "haskell": { + "trace.server": "verbose", + "command": "haskell-language-server-wrapper", + "args": ["--lsp", "-d", "-l", "/home/jule/hls-server.log"], + "rootPatterns": [ + "*.cabal", + "stack.yaml", + "cabal.config", + "cabal.project", + "package.yaml" + ], + "filetypes": [ + "hs", + "lhs", + "haskell" + ], + "initializationOptions": { + "languageServerHaskell": { + "hlintOn": true + } + } + }, + "bash": { + "trace.server": "verbose", + "command": "bash-language-server", + "args": ["start"], + "filetypes": ["sh"], + "ignoredRootPaths": ["~"] + }, + // install: https://github.com/mattn/efm-langserver + // and: https://github.com/Kuniwak/vint + "efm": { + "command": "efm-langserver", + "args": [], + // custom config path + //"args": ["-c", "/home/jule/.config/efm-langserver/config.yaml"], + "filetypes": ["vim"] + }, + "python": { + "command": "python", + "args": [ + "-mpyls", + "-vv", + "--log-file", + "/tmp/lsp_python.log" + ], + "trace.server": "verbose", + "filetypes": [ + "python" + ], + "settings": { + "pyls": { + "enable": true, + "trace": { + "server": "verbose" + }, + "commandPath": "", + "configurationSources": [ + "pycodestyle" + ], + "plugins": { + "jedi_completion": { + "enabled": true + }, + "jedi_hover": { + "enabled": true + }, + "jedi_references": { + "enabled": true + }, + "jedi_signature_help": { + "enabled": true + }, + "jedi_symbols": { + "enabled": true, + "all_scopes": true + }, + "mccabe": { + "enabled": true, + "threshold": 15 + }, + "preload": { + "enabled": true + }, + "pycodestyle": { + "enabled": true + }, + "pydocstyle": { + "enabled": false, + "match": "(?!test_).*\\.py", + "matchDir": "[^\\.].*" + }, + "pyflakes": { + "enabled": true + }, + "rope_completion": { + "enabled": true + }, + "yapf": { + "enabled": true + } + } + } + } + } + }, + "coc.preferences.hoverTarget": "float", + "diagnostic.virtualText": true, + "diagnostic.enableSign": true, + "suggest.floatEnable": true +} + diff --git a/plugin/keys.vim b/plugin/keys.vim index 3048741..be0fa5a 100644 --- a/plugin/keys.vim +++ b/plugin/keys.vim @@ -165,6 +165,10 @@ nmap pc :pc " inoremap :wincmd j " inoremap :wincmd h " inoremap :wincmd l +nnoremap :wincmd k +nnoremap :wincmd j +nnoremap :wincmd h +nnoremap :wincmd l nnoremap :wincmd k nnoremap :wincmd j nnoremap :wincmd h @@ -187,12 +191,9 @@ nmap :exec("tjump ".expand("")) nmap :split:exec("tjump ".expand("")) " trigger NERDTree, Tagbar $ Co. -nmap n :NERDTreeToggle -nmap t :TagbarToggle +" nmap n :NERDTreeToggle +" nmap t :TagbarToggle " nmap f "zyaw :exe ":Ack ".@z."" -nmap :CtrlP -nmap :CtrlPTag -nmap :CtrlPBuffer " grep word under cursor nnoremap f :lgr! "\b\b":cw @@ -243,23 +244,13 @@ vnoremap 10 " F keys -nmap :noh -imap :noh -nmap :YcmCompleter GoToDeclaration -nmap :YcmCompleter GoTo -nmap :YcmCompleter GoTo:wincmd o +" nmap :noh +" imap :noh noremap :FufBuffer nmap :call ManCurrentWord() -nmap :call DevHelpCurrentWord() -nnoremap :call NERDComment("n", "Toggle") -vnoremap :call NERDComment("v", "Toggle") +" nmap :call DevHelpCurrentWord() " nmap -" plugins etc -noremap :NERDTreeToggle -noremap :TagbarToggle -inoremap :TagbarToggle - " remap visual block nnoremap @@ -280,52 +271,113 @@ inoremap :call Paste("i") nnoremap ggVG inoremap :call Select() +nnoremap cd :cd %:p:h:pwd + +nnoremap cc :cclose +nnoremap co :copen + +function! ToggleQuickFix() + if empty(filter(getwininfo(), 'v:val.quickfix')) + copen + else + cclose + endif +endfunction + +function! ToggleLocList() + if empty(filter(getwininfo(), 'v:val.loclist')) + lopen + else + lclose + endif +endfunction + +nnoremap :call ToggleQuickFix() +nnoremap :call ToggleLocList() + + + + +" PLUGINS + + +" NERDTree +noremap :NERDTreeToggle +" noremap :TagbarToggle +inoremap :TagbarToggle + +" vista +nmap :Vista!! +" nmap :Vista finder fzf + +" NERDComment +nnoremap :call NERDComment("n", "Toggle") +vnoremap :call NERDComment("v", "Toggle") + +" YCM +nmap :YcmCompleter GoTo:wincmd o + +" vim-clap +nnoremap ag :Clap grep2 ++query= +" nnoremap tg :call fzf#vim#tags(expand(''), {'options': '--exact --select-1 --exit-0'}) +nnoremap tg :Clap proj_tags ++query= +nmap :Clap files +nmap :Clap tags +nmap :Clap buffers + " fzf -nnoremap ag :call fzf#vim#ag(expand(''), WithGitRoot()) -nnoremap tg :call fzf#vim#tags(expand(''), {'options': '--exact --select-1 --exit-0'}) +" nnoremap ag :call fzf#vim#ag(expand(''), WithGitRoot()) +" nnoremap tg :call fzf#vim#tags(expand(''), {'options': '--exact --select-1 --exit-0'}) +" nnoremap tg :Tags =expand("") +" nmap :GFiles +" nmap :Tags +" nmap :Buffers " gitgutter nmap ggt :GitGutterToggle nmap nh (GitGutterNextHunk) nmap bh (GitGutterPrevHunk) -" ctrlp - let g:ctrlp_prompt_mappings = { - \ 'PrtBS()': ['', ''], - \ 'PrtDelete()': [''], - \ 'PrtDeleteWord()': [''], - \ 'PrtClear()': [''], - \ 'PrtSelectMove("j")': ['', ''], - \ 'PrtSelectMove("k")': ['', ''], - \ 'PrtSelectMove("t")': ['', ''], - \ 'PrtSelectMove("b")': ['', ''], - \ 'PrtSelectMove("u")': ['', ''], - \ 'PrtSelectMove("d")': ['', ''], - \ 'PrtHistory(-1)': [''], - \ 'PrtHistory(1)': [''], - \ 'AcceptSelection("e")': ['', '<2-LeftMouse>'], - \ 'AcceptSelection("h")': ['', '', ''], - \ 'AcceptSelection("t")': [''], - \ 'AcceptSelection("v")': ['', ''], - \ 'ToggleFocus()': [''], - \ 'ToggleRegex()': [''], - \ 'ToggleByFname()': [''], - \ 'ToggleType(1)': ['', ''], - \ 'ToggleType(-1)': ['', ''], - \ 'PrtExpandDir()': [''], - \ 'PrtInsert("c")': ['', ''], - \ 'PrtInsert()': [''], - \ 'PrtCurStart()': [''], - \ 'PrtCurEnd()': [''], - \ 'PrtCurLeft()': ['', '', ''], - \ 'PrtCurRight()': ['', ''], - \ 'PrtClearCache()': [''], - \ 'PrtDeleteEnt()': [''], - \ 'CreateNewFile()': [''], - \ 'MarkToOpen()': [''], - \ 'OpenMulti()': [''], - \ 'PrtExit()': ['', '', ''], - \ } +" tig +" let g:tig_explorer_keymap_edit = '' +" let g:tig_explorer_keymap_tabedit = '' +" let g:tig_explorer_keymap_split = '' +" let g:tig_explorer_keymap_vsplit = '' +" nnoremap T :TigOpenCurrentFile +" nnoremap t :TigOpenProjectRootDir +" nnoremap g :TigGrep +" nnoremap r :TigGrepResume +" vnoremap g y:TigGrep" +" nnoremap cg ::TigGrep +" nnoremap b :TigBlame +" ghcup +" nnoremap ghc :GHCup -nnoremap cd :cd %:p:h:pwd +" git gutter +omap ic (GitGutterTextObjectInnerPending) +omap ac (GitGutterTextObjectOuterPending) +xmap ic (GitGutterTextObjectInnerVisual) +xmap ac (GitGutterTextObjectOuterVisual) + +" fastfold +nmap zuz (FastFoldUpdate) + +"LanguageClient-neovim +" Required for operations modifying multiple buffers like rename. +set hidden +nnoremap lc :call LanguageClient_contextMenu() +" Or map each action separately +nnoremap T :call LanguageClient#textDocument_hover() +nnoremap gd :call LanguageClient#textDocument_definition() +" nnoremap :call LanguageClient#textDocument_rename() +" nnoremap ld :call LanguageClient#textDocument_definition() +" nnoremap lr :call LanguageClient#textDocument_rename() +" nnoremap lf :call LanguageClient#textDocument_formatting() +" nnoremap lt :call LanguageClient#textDocument_typeDefinition() +" nnoremap lx :call LanguageClient#textDocument_references() +" nnoremap la :call LanguageClient_workspace_applyEdit() +" nnoremap lc :call LanguageClient#textDocument_completion() +" nnoremap lh :call LanguageClient#textDocument_hover() +" nnoremap ls :call LanguageClient_textDocument_documentSymbol() +" nnoremap lm :call LanguageClient_contextMenu() diff --git a/vimrc b/vimrc index 51dfa49..de94e41 100644 --- a/vimrc +++ b/vimrc @@ -7,10 +7,11 @@ set shortmess+=A filetype plugin on filetype indent on -set backspace=2 " make backspace work like most other programs +set backspace=indent,eol,start " backspace through everything in insert mode set cmdheight=1 -let g:ctrlp_map = '' +set wildmenu +" set wildmode=longest,list,full " vim-plug settings (Plugin declaration) call plug#begin('~/.vim/plugged') @@ -23,11 +24,12 @@ Plug 'vim-scripts/genindent.vim' " Plug 'idris-hackers/idris-vim' "Plug 'yegappan/mru' Plug 'scrooloose/nerdcommenter' -Plug 'scrooloose/nerdtree', { 'on': 'NERDTreeToggle' } +Plug 'scrooloose/nerdtree', { 'on': 'NERDTreeToggle' } | + \ Plug 'Xuyuanp/nerdtree-git-plugin', { 'on': 'NERDTreeToggle' } "Plug 'vim-scripts/promela.vim' "Plug 'AndrewRadev/simple_bookmarks.vim' "Plug 'Keithbsmiley/swift.vim' -Plug 'majutsushi/tagbar' +" Plug 'majutsushi/tagbar' "Plug 'ternjs/tern_for_vim' Plug 'xolox/vim-easytags' Plug 'xolox/vim-misc' @@ -36,10 +38,10 @@ Plug 'Shougo/vimproc.vim', {'do' : 'make'} Plug 'sjbach/lusty' " Plug 'vim-airline/vim-airline' " Plug 'vim-airline/vim-airline-themes' -Plug 'kien/ctrlp.vim' Plug 'nixprime/cpsm', { 'do': 'PY3=ON ./install.sh' } -Plug 'junegunn/fzf', { 'do': './install --bin' } -Plug 'junegunn/fzf.vim' +" Plug 'junegunn/fzf', { 'do': './install --bin' } +" Plug 'junegunn/fzf.vim' +Plug 'liuchengxu/vista.vim' Plug 'sbdchd/neoformat' Plug 'AndrewRadev/bufferize.vim' " Plug 'vimwiki/vimwiki' @@ -49,6 +51,13 @@ Plug 'tpope/vim-scriptease' Plug 'Konfekt/FastFold' " Plug 'lambdalisue/vim-fullscreen' Plug 'editorconfig/editorconfig-vim' +" Plug 'iberianpig/tig-explorer.vim' +Plug 'hasufell/ghcup.vim' +Plug 'junegunn/vim-easy-align' +Plug 'dominikduda/vim_current_word' + +" finder +Plug 'liuchengxu/vim-clap', { 'do': { -> clap#installer#force_download() } } " scm @@ -63,8 +72,8 @@ Plug 'LucHermitte/local_vimrc' " completion Plug 'Valloric/YouCompleteMe', { 'do': './install.py --clang-completer --go-completer --rust-completer --system-boost --system-libclang', - \ 'for': ['c', 'go', 'clojure'], - \ } + \ 'for': ['c', 'go', 'clojure'], + \ } " deoplete for haskell if has('nvim') Plug 'Shougo/deoplete.nvim', { 'do': ':UpdateRemotePlugins', @@ -83,9 +92,9 @@ endif " setting this per-language breaks "let g:LanguageClient_autoStart = 1", " Use release branch (Recommend) Plug 'autozimu/LanguageClient-neovim', { - \ 'branch': 'next', - \ 'do': 'bash ./install.sh' - \ } + \ 'branch': 'next', + \ 'do': 'bash ./install.sh' + \ } " linting/compilation Plug 'w0rp/ale', { @@ -101,6 +110,7 @@ Plug 'w0rp/ale', { " completion based on ghc-mod, not LSP " Plug 'eagletmt/neco-ghc', { 'for': 'haskell' } " Plug 'lukerandall/haskellmode-vim', { 'for': 'haskell' } +" Plug 'axelf4/vim-haskell' Plug 'neovimhaskell/haskell-vim', { 'for': ['haskell', 'cabal']} " Plug 'ucsd-progsys/liquid-types.vim', { 'for': 'haskell' } Plug 'bitc/lushtags', { @@ -111,7 +121,9 @@ Plug 'bitc/lushtags', { " Plug 'itchyny/vim-haskell-indent', { 'for': 'haskell' } " Plug 'dan-t/vim-hsimport', { 'for': 'haskell' } Plug 'Twinside/vim-hoogle', { 'for': 'haskell' } -" Plug 'axelf4/vim-haskell', { 'for': 'haskell' } +" Plug 'alx741/vim-hindent', { 'for': 'haskell' } +Plug 'alx741/vim-stylishask', { 'for': 'haskell' } + Plug 'luochen1990/rainbow', { 'for': ['clojure', 'haskell', 'python'] } @@ -160,6 +172,21 @@ endif " Plug 'noahfrederick/vim-hemisu' " Plug 'morhetz/gruvbox' +" coc +" Plug 'neoclide/coc.nvim', {'do': 'yarn install --frozen-lockfile', 'for': ['haskell', 'rust', 'sh', 'python', 'vim']} +" Plug 'neoclide/coc-tsserver', {'do': 'yarn install --frozen-lockfile', 'for': ['typescript']} +" "Plug 'neoclide/coc-git', {'do': 'yarn install --frozen-lockfile'} +" " Plug 'neoclide/coc-rls', {'do': 'yarn install --frozen-lockfile', 'for': ['rust']} +" Plug 'fannheyward/coc-rust-analyzer', {'do': 'yarn install --frozen-lockfile', 'for': ['rust']} +" Plug 'neoclide/coc-prettier', {'do': 'yarn install --frozen-lockfile', 'for': ['haskell', 'rust', 'sh']} +" " Plug 'neoclide/coc-python', {'do': 'yarn install --frozen-lockfile', 'for': ['python']} +" "Plug 'neoclide/coc-vetur', {'do': 'yarn install --frozen-lockfile', 'for': ['haskell']} +" Plug 'neoclide/coc-json', {'do': 'yarn install --frozen-lockfile', 'for': ['json']} +" " Plug 'neoclide/coc-eslint', {'do': 'yarn install --frozen-lockfile', 'for': ['']} +" Plug 'neoclide/coc-yaml', {'do': 'yarn install --frozen-lockfile', 'for': ['yaml']} +" " Plug 'neoclide/coc-highlight', {'do': 'yarn install --frozen-lockfile', 'for': ['']} +" Plug 'josa42/coc-sh', {'do': 'yarn install --frozen-lockfile', 'for': ['']} + " unmanaged Plug '~/.vim/unmanaged-vim-plug/bufonly' Plug '~/.vim/unmanaged-vim-plug/colorschemedegrade' @@ -227,6 +254,7 @@ set shiftwidth=4 set directory=~/.vimtmp set modeline set modelines=1 +set autoindent let g:nickID = 'hasufell'