From 7217c7749e5403c9c7856c1d12c7986eb9c3b460 Mon Sep 17 00:00:00 2001 From: Yaroslav Date: Tue, 31 Mar 2020 17:52:49 +0300 Subject: Goodbye vim, been using neovim for ages now; home directory cleanup --- dotfiles/.local/share/nvim/site/autoload/node.vim | 110 ++++++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100644 dotfiles/.local/share/nvim/site/autoload/node.vim (limited to 'dotfiles/.local/share/nvim/site/autoload/node.vim') diff --git a/dotfiles/.local/share/nvim/site/autoload/node.vim b/dotfiles/.local/share/nvim/site/autoload/node.vim new file mode 100644 index 0000000..3954e4c --- /dev/null +++ b/dotfiles/.local/share/nvim/site/autoload/node.vim @@ -0,0 +1,110 @@ +" Vim by default sets the filetype to JavaScript for the following suffices. +" And, yes, it has .jsx there. +let node#suffixesadd = [".js", ".json", ".es", ".jsx"] + +function! node#initialize(root) + let b:node_root = a:root + + command! -bar -bang -nargs=1 -buffer -complete=customlist,s:complete Nedit + \ exe s:nedit(, bufname("%"), "edit") + command! -bar -bang -nargs=1 -buffer -complete=customlist,s:complete Nopen + \ exe s:nopen(, bufname("%"), "edit") + + nnoremap NodeGotoFile + \ :call edit(expand(""), bufname("%")) + nnoremap NodeSplitGotoFile + \ :call edit(expand(""), bufname("%"), "split") + nnoremap NodeVSplitGotoFile + \ :call edit(expand(""), bufname("%"), "vsplit") + nnoremap NodeTabGotoFile + \ :call edit(expand(""), bufname("%"), "tab split") + + silent doautocmd User Node +endfunction + +function! node#javascript() + " This might be called multiple times if multiple filetypes match. + if exists("b:node_javascript") && b:node_javascript | return | endif + let b:node_javascript = 1 + + setlocal path-=/usr/include + let &l:suffixesadd .= "," . join(g:node#suffixesadd, ",") + let &l:include = '\NodeGotoFile") + " Split gotofiles don't take a count for the new window's width, but for + " opening the nth file. Though Node.vim doesn't support counts atm. + nmap gf NodeGotoFile + nmap f NodeSplitGotoFile + nmap NodeSplitGotoFile + nmap gf NodeTabGotoFile + endif +endfunction + +function! s:edit(name, from, ...) + if empty(a:name) | return | endif + let dir = isdirectory(a:from) ? a:from : fnamemodify(a:from, ":h") + let command = a:0 == 1 ? a:1 : "edit" + + " If just a plain filename with no directory part, check if it exists: + if a:name !~# '^\v(/|\./|\.\./)' && filereadable(dir . "/" . a:name) + let path = dir . "/" . a:name + else + let path = node#lib#find(a:name, dir) + end + + if empty(path) + return s:error("E447: Can't find file \"" . a:name . "\" in path") + endif + + exe command . " " . fnameescape(path) +endfunction + +function! s:nedit(name, from, ...) + let command = a:0 == 1 ? a:1 : "edit" + call s:edit(a:name, b:node_root, command) +endfunction + +function! s:nopen(name, from, ...) + let command = a:0 == 1 ? a:1 : "edit" + call s:nedit(a:name, a:from, command) + if exists("b:node_root") | exe "lcd " . fnameescape(b:node_root) | endif +endfunction + +function! s:complete(arg, cmd, cursor) + let matches = node#lib#glob(s:dirname(a:arg)) + + " Show private modules (_*) only if explicitly asked: + if a:arg[0] != "_" | call filter(matches, "v:val[0] != '_'") | endif + + let filter = "stridx(v:val, a:arg) == 0" + let ignorecase = 0 + let ignorecase = ignorecase || exists("&fileignorecase") && &fileignorecase + let ignorecase = ignorecase || exists("&wildignorecase") && &wildignorecase + if ignorecase | let filter = "stridx(tolower(v:val),tolower(a:arg)) == 0" | en + + return filter(matches, filter) +endfunction + +function! s:dirname(path) + let dirname = fnamemodify(a:path, ":h") + if dirname == "." | return "" | endif + + " To not change the amount of final consecutive slashes, using this + " dirname/basename trick: + let basename = fnamemodify(a:path, ":t") + return a:path[0 : 0 - len(basename) - 1] +endfunction + +" Using the built-in :echoerr prints a stacktrace, which isn't that nice. +function! s:error(msg) + echohl ErrorMsg + echomsg a:msg + echohl NONE + let v:errmsg = a:msg +endfunction -- cgit v1.2.3