1" netrwPlugin.vim: Handles file transfer and remote directory listing across a network 2" PLUGIN SECTION 3" Date: Nov 07, 2014 4" Maintainer: Charles E Campbell <[email protected]> 5" GetLatestVimScripts: 1075 1 :AutoInstall: netrw.vim 6" Copyright: Copyright (C) 1999-2013 Charles E. Campbell {{{1 7" Permission is hereby granted to use and distribute this code, 8" with or without modifications, provided that this copyright 9" notice is copied with it. Like anything else that's free, 10" netrw.vim, netrwPlugin.vim, and netrwSettings.vim are provided 11" *as is* and comes with no warranty of any kind, either 12" expressed or implied. By using this plugin, you agree that 13" in no event will the copyright holder be liable for any damages 14" resulting from the use of this software. 15" 16" But be doers of the Word, and not only hearers, deluding your own selves {{{1 17" (James 1:22 RSV) 18" =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- 19" Load Once: {{{1 20if &cp || exists("g:loaded_netrwPlugin") 21 finish 22endif 23let g:loaded_netrwPlugin = "v153" 24if v:version < 702 25 echohl WarningMsg 26 echo "***warning*** you need vim version 7.2 for this version of netrw" 27 echohl None 28 finish 29endif 30if v:version < 703 || (v:version == 703 && !has("patch465")) 31 echohl WarningMsg 32 echo "***warning*** this version of netrw needs vim 7.3.465 or later" 33 echohl Normal 34 finish 35endif 36let s:keepcpo = &cpo 37set cpo&vim 38"DechoRemOn 39 40" --------------------------------------------------------------------- 41" Public Interface: {{{1 42 43" Local Browsing Autocmds: {{{2 44augroup FileExplorer 45 au! 46 au BufLeave * if &ft != "netrw"|let w:netrw_prvfile= expand("%:p")|endif 47 au BufEnter * sil call s:LocalBrowse(expand("<amatch>")) 48 au VimEnter * sil call s:VimEnter(expand("<amatch>")) 49 if has("win32") || has("win95") || has("win64") || has("win16") 50 au BufEnter .* sil call s:LocalBrowse(expand("<amatch>")) 51 endif 52augroup END 53 54" Network Browsing Reading Writing: {{{2 55augroup Network 56 au! 57 au BufReadCmd file://* call netrw#FileUrlRead(expand("<amatch>")) 58 au BufReadCmd ftp://*,rcp://*,scp://*,http://*,file://*,https://*,dav://*,davs://*,rsync://*,sftp://* exe "sil doau BufReadPre ".fnameescape(expand("<amatch>"))|call netrw#Nread(2,expand("<amatch>"))|exe "sil doau BufReadPost ".fnameescape(expand("<amatch>")) 59 au FileReadCmd ftp://*,rcp://*,scp://*,http://*,file://*,https://*,dav://*,davs://*,rsync://*,sftp://* exe "sil doau FileReadPre ".fnameescape(expand("<amatch>"))|call netrw#Nread(1,expand("<amatch>"))|exe "sil doau FileReadPost ".fnameescape(expand("<amatch>")) 60 au BufWriteCmd ftp://*,rcp://*,scp://*,http://*,file://*,dav://*,davs://*,rsync://*,sftp://* exe "sil doau BufWritePre ".fnameescape(expand("<amatch>"))|exe 'Nwrite '.fnameescape(expand("<amatch>"))|exe "sil doau BufWritePost ".fnameescape(expand("<amatch>")) 61 au FileWriteCmd ftp://*,rcp://*,scp://*,http://*,file://*,dav://*,davs://*,rsync://*,sftp://* exe "sil doau FileWritePre ".fnameescape(expand("<amatch>"))|exe "'[,']".'Nwrite '.fnameescape(expand("<amatch>"))|exe "sil doau FileWritePost ".fnameescape(expand("<amatch>")) 62 try 63 au SourceCmd ftp://*,rcp://*,scp://*,http://*,file://*,https://*,dav://*,davs://*,rsync://*,sftp://* exe 'Nsource '.fnameescape(expand("<amatch>")) 64 catch /^Vim\%((\a\+)\)\=:E216/ 65 au SourcePre ftp://*,rcp://*,scp://*,http://*,file://*,https://*,dav://*,davs://*,rsync://*,sftp://* exe 'Nsource '.fnameescape(expand("<amatch>")) 66 endtry 67augroup END 68 69" Commands: :Nread, :Nwrite, :NetUserPass {{{2 70com! -count=1 -nargs=* Nread call netrw#SavePosn()<bar>call netrw#NetRead(<count>,<f-args>)<bar>call netrw#RestorePosn() 71com! -range=% -nargs=* Nwrite call netrw#SavePosn()<bar><line1>,<line2>call netrw#NetWrite(<f-args>)<bar>call netrw#RestorePosn() 72com! -nargs=* NetUserPass call NetUserPass(<f-args>) 73com! -nargs=* Nsource call netrw#SavePosn()<bar>call netrw#NetSource(<f-args>)<bar>call netrw#RestorePosn() 74com! -nargs=? Ntree call netrw#SetTreetop(<q-args>) 75 76" Commands: :Explore, :Sexplore, Hexplore, Vexplore, Lexplore {{{2 77com! -nargs=* -bar -bang -count=0 -complete=dir Explore call netrw#Explore(<count>,0,0+<bang>0,<q-args>) 78com! -nargs=* -bar -bang -count=0 -complete=dir Sexplore call netrw#Explore(<count>,1,0+<bang>0,<q-args>) 79com! -nargs=* -bar -bang -count=0 -complete=dir Hexplore call netrw#Explore(<count>,1,2+<bang>0,<q-args>) 80com! -nargs=* -bar -bang -count=0 -complete=dir Vexplore call netrw#Explore(<count>,1,4+<bang>0,<q-args>) 81com! -nargs=* -bar -count=0 -complete=dir Texplore call netrw#Explore(<count>,0,6 ,<q-args>) 82com! -nargs=* -bar -bang Nexplore call netrw#Explore(-1,0,0,<q-args>) 83com! -nargs=* -bar -bang Pexplore call netrw#Explore(-2,0,0,<q-args>) 84com! -nargs=* -bar -bang -count=0 -complete=dir Lexplore call netrw#Lexplore(<count>,<bang>0,<q-args>) 85 86" Commands: NetrwSettings {{{2 87com! -nargs=0 NetrwSettings call netrwSettings#NetrwSettings() 88com! -bang NetrwClean call netrw#Clean(<bang>0) 89 90" Maps: 91if !exists("g:netrw_nogx") 92 if maparg('gx','n') == "" 93 if !hasmapto('<Plug>NetrwBrowseX') 94 nmap <unique> gx <Plug>NetrwBrowseX 95 endif 96 nno <silent> <Plug>NetrwBrowseX :call netrw#BrowseX(expand((exists("g:netrw_gx")? g:netrw_gx : '<cfile>')),netrw#CheckIfRemote())<cr> 97 endif 98 if maparg('gx','v') == "" 99 if !hasmapto('<Plug>NetrwBrowseXVis') 100 vmap <unique> gx <Plug>NetrwBrowseXVis 101 endif 102 vno <silent> <Plug>NetrwBrowseXVis :<c-u>call netrw#BrowseXVis()<cr> 103 endif 104endif 105 106" --------------------------------------------------------------------- 107" LocalBrowse: invokes netrw#LocalBrowseCheck() on directory buffers {{{2 108fun! s:LocalBrowse(dirname) 109 " Unfortunate interaction -- only DechoMsg debugging calls can be safely used here. 110 " Otherwise, the BufEnter event gets triggered when attempts to write to 111 " the DBG buffer are made. 112 113 if !exists("s:vimentered") 114 " If s:vimentered doesn't exist, then the VimEnter event hasn't fired. It will, 115 " and so s:VimEnter() will then be calling this routine, but this time with s:vimentered defined. 116" call Dfunc("s:LocalBrowse(dirname<".a:dirname.">) (s:vimentered doesn't exist)") 117" call Dret("s:LocalBrowse") 118 return 119 endif 120 121" call Dfunc("s:LocalBrowse(dirname<".a:dirname.">) (s:vimentered=".s:vimentered.")") 122 123 if has("amiga") 124 " The check against '' is made for the Amiga, where the empty 125 " string is the current directory and not checking would break 126 " things such as the help command. 127" call Decho("(LocalBrowse) dirname<".a:dirname."> (isdirectory, amiga)") 128 if a:dirname != '' && isdirectory(a:dirname) 129 sil! call netrw#LocalBrowseCheck(a:dirname) 130 if exists("w:netrw_bannercnt") && line('.') < w:netrw_bannercnt 131 exe w:netrw_bannercnt 132 endif 133 endif 134 135 elseif isdirectory(a:dirname) 136" call Decho("(LocalBrowse) dirname<".a:dirname."> ft=".&ft." (isdirectory, not amiga)") 137" call Dredir("LocalBrowse ft last set: ","verbose set ft") 138 sil! call netrw#LocalBrowseCheck(a:dirname) 139 if exists("w:netrw_bannercnt") && line('.') < w:netrw_bannercnt 140 exe w:netrw_bannercnt 141 endif 142 143 else 144 " not a directory, ignore it 145" call Decho("(LocalBrowse) dirname<".a:dirname."> not a directory, ignoring...") 146 endif 147 148" call Dret("s:LocalBrowse") 149endfun 150 151" --------------------------------------------------------------------- 152" s:VimEnter: after all vim startup stuff is done, this function is called. {{{2 153" Its purpose: to look over all windows and run s:LocalBrowse() on 154" them, which checks if they're directories and will create a directory 155" listing when appropriate. 156" It also sets s:vimentered, letting s:LocalBrowse() know that s:VimEnter() 157" has already been called. 158fun! s:VimEnter(dirname) 159" call Dfunc("s:VimEnter(dirname<".a:dirname.">) expand(%)<".expand("%").">") 160 let curwin = winnr() 161 let s:vimentered = 1 162 windo call s:LocalBrowse(expand("%:p")) 163 exe curwin."wincmd w" 164" call Dret("s:VimEnter") 165endfun 166 167" --------------------------------------------------------------------- 168" NetrwStatusLine: {{{1 169fun! NetrwStatusLine() 170" let g:stlmsg= "Xbufnr=".w:netrw_explore_bufnr." bufnr=".bufnr("%")." Xline#".w:netrw_explore_line." line#".line(".") 171 if !exists("w:netrw_explore_bufnr") || w:netrw_explore_bufnr != bufnr("%") || !exists("w:netrw_explore_line") || w:netrw_explore_line != line(".") || !exists("w:netrw_explore_list") 172 let &stl= s:netrw_explore_stl 173 if exists("w:netrw_explore_bufnr")|unlet w:netrw_explore_bufnr|endif 174 if exists("w:netrw_explore_line")|unlet w:netrw_explore_line|endif 175 return "" 176 else 177 return "Match ".w:netrw_explore_mtchcnt." of ".w:netrw_explore_listlen 178 endif 179endfun 180 181" ------------------------------------------------------------------------ 182" NetUserPass: set username and password for subsequent ftp transfer {{{1 183" Usage: :call NetUserPass() -- will prompt for userid and password 184" :call NetUserPass("uid") -- will prompt for password 185" :call NetUserPass("uid","password") -- sets global userid and password 186fun! NetUserPass(...) 187 188 " get/set userid 189 if a:0 == 0 190" call Dfunc("NetUserPass(a:0<".a:0.">)") 191 if !exists("g:netrw_uid") || g:netrw_uid == "" 192 " via prompt 193 let g:netrw_uid= input('Enter username: ') 194 endif 195 else " from command line 196" call Dfunc("NetUserPass(a:1<".a:1.">) {") 197 let g:netrw_uid= a:1 198 endif 199 200 " get password 201 if a:0 <= 1 " via prompt 202" call Decho("a:0=".a:0." case <=1:") 203 let g:netrw_passwd= inputsecret("Enter Password: ") 204 else " from command line 205" call Decho("a:0=".a:0." case >1: a:2<".a:2.">") 206 let g:netrw_passwd=a:2 207 endif 208" call Dret("NetUserPass") 209endfun 210 211" ------------------------------------------------------------------------ 212" Modelines And Restoration: {{{1 213let &cpo= s:keepcpo 214unlet s:keepcpo 215" vim:ts=8 fdm=marker 216