From 5919dd2bca2d975075bd3fd530bf724639d74053 Mon Sep 17 00:00:00 2001 From: stefan <stefan@eb2d0018-73a3-4aeb-bfe9-1def61c9ec69> Date: Fri, 26 Sep 2008 13:18:32 +0000 Subject: [PATCH] + MultipleSearch GetLatestVimScripts + wget.exe git-svn-id: https://vimsuite.svn.sourceforge.net/svnroot/vimsuite/trunk@170 eb2d0018-73a3-4aeb-bfe9-1def61c9ec69 --- vimfiles.stefan/plugin/vimsuite.vim | 2 +- vimfiles.stefan/tools/wget.exe | Bin 0 -> 258048 bytes vimfiles/GetLatest/GetLatestVimScripts.dat | 11 +- vimfiles/autoload/MultipleSearch.vim | 343 + vimfiles/autoload/netrw.vim | 15053 ++++++++++--------- vimfiles/autoload/netrwSettings.vim | 411 +- vimfiles/autoload/tcomment.vim | 557 + vimfiles/autoload/vimball.vim | 141 +- vimfiles/doc/MultipleSearch.txt | 106 + vimfiles/doc/pi_netrw.txt | 6096 ++++---- vimfiles/doc/pi_vimball.txt | 63 +- vimfiles/doc/tComment.txt | 2 +- vimfiles/doc/tags | 29 +- vimfiles/plugin/MultipleSearch.vim | 51 + vimfiles/plugin/matrix.vim | 22 +- vimfiles/plugin/netrwPlugin.vim | 44 +- vimfiles/plugin/tComment.vim | 713 +- vimfiles/plugin/vimballPlugin.vim | 4 +- vimfiles/syntax/netrw.vim | 207 +- 19 files changed, 12714 insertions(+), 11141 deletions(-) create mode 100644 vimfiles.stefan/tools/wget.exe create mode 100644 vimfiles/autoload/MultipleSearch.vim create mode 100644 vimfiles/autoload/tcomment.vim create mode 100644 vimfiles/doc/MultipleSearch.txt create mode 100644 vimfiles/plugin/MultipleSearch.vim diff --git a/vimfiles.stefan/plugin/vimsuite.vim b/vimfiles.stefan/plugin/vimsuite.vim index f05bf2e..4853bdf 100644 --- a/vimfiles.stefan/plugin/vimsuite.vim +++ b/vimfiles.stefan/plugin/vimsuite.vim @@ -885,7 +885,7 @@ function s:GetLatestVimScriptsThroughProxy() " reset HOME let $HOME = home endfunction -let g:GetLatestVimScripts_wget= "c:/tools/wget/wget.exe" +let g:GetLatestVimScripts_wget= expand(g:vimfiles . '/tools/wget.exe') let g:GetLatestVimScripts_mv= "move" " merge diff --git a/vimfiles.stefan/tools/wget.exe b/vimfiles.stefan/tools/wget.exe new file mode 100644 index 0000000000000000000000000000000000000000..53971ad91f5254f5507f50f8bf275f16b3fec356 GIT binary patch literal 258048 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�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	Ctf!lR#(BgF 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 QhQMeDjE2By2#^~B0I6VE1ONa4 literal 0 HcmV?d00001 diff --git a/vimfiles/GetLatest/GetLatestVimScripts.dat b/vimfiles/GetLatest/GetLatestVimScripts.dat index 53b617c..3813b12 100644 --- a/vimfiles/GetLatest/GetLatestVimScripts.dat +++ b/vimfiles/GetLatest/GetLatestVimScripts.dat @@ -1,7 +1,7 @@ ScriptID SourceID Filename -------------------------- -1075 8501 netrw.vim -1502 8515 vimball.vim +1075 9221 netrw.vim +1502 8743 vimball.vim 1008 3118 srec.vim (ftplugin) 1009 3119 srec.vim (syntax file) 475 2535 latex-suite (install in vimfiles.latex) @@ -10,8 +10,8 @@ ScriptID SourceID Filename 862 2635 cscope_quickfix.vim 51 171 cscope_macros.vim 102 5306 DirDiff.vim -1189 6533 matrix.vim -1173 7588 tcomment +1189 8687 matrix.vim +1173 8689 tcomment 948 2878 Scons Compiler plugin 1709 6421 Scons Syntax file 1772 7248 DAMOS.zip DAMOS tools (von Stefan) @@ -28,6 +28,7 @@ ScriptID SourceID Filename 2092 8095 reloaded.vim (matrix colorscheme) 848 8203 SrchRplcHiGrp.vim (Search/Replace on Syntax Group) 294 8407 Align.vim -642 8136 getscript.vim +479 9276 MultipleSearch 642 8136 :AutoInstall: GetLatestVimScripts.vim 1066 7618 :AutoInstall: cecutil.vim +642 8136 :AutoInstall: getscript.vim diff --git a/vimfiles/autoload/MultipleSearch.vim b/vimfiles/autoload/MultipleSearch.vim new file mode 100644 index 0000000..a258748 --- /dev/null +++ b/vimfiles/autoload/MultipleSearch.vim @@ -0,0 +1,343 @@ +" File: MultipleSearch.vim (global plugin) +" Last Changed: 13 Aug 2008 +" Maintainer: Dan Sharp <dwsharp at hotmail dot com> +" Version: 1.3 +" License: Vim License + +"----------------------------------------------------------------------------- +" MultipleSearch allows you to have the results of multiple searches displayed +" on the screen at the same time. Each search highlights its results in a +" different color, and all searches are displayed at once. After the maximum +" number of colors is used, the script starts over with the first color. +" +" The command syntax is: +" :Search <pattern1> +" which will highlight all occurrences of <pattern1> in the current buffer. A +" subsequent :Search <pattern2> will highlight all occurrences of <pattern2> +" in the current buffer, retaining the highlighting of <pattern1> as well. +" <pattern1> and <pattern2> are any search pattern like you would use in a +" normal /<pattern> search. +" +" The :Search command honors Vim's 'ignorecase' and 'smartcase' settings for +" its own search. You can use the \c and \C flags in the search pattern to +" force case matching no matter the setting of 'ignorecase' and 'smartcase'. +" +" The :SearchBuffers command works just like :Search, but the search occurs in +" all currently listed buffers (i.e., those that appear in the output of :ls). +" The match in all buffers will have the same color. This is different than +" :bufdo Search <pattern> because in that case, each buffer will highlight the +" match in a different color. +" +" To clear the highlighting, issue the command :SearchReset (for the current +" buffer) or :SearchBuffersReset (for all buffers). +" +" You can specify the maximum number of different colors to use by setting the +" g:MultipleSearchMaxColors variable in your .vimrc. The default setting is +" four, but the script should handle as much as your terminal / GUI can +" display. The g:MultipleSearchColorSequence variable lets you list the +" colors you want displayed, and in what order. To make the text more +" readable, you can set the g:MultipleSearchTextColorSequence variable to a +" list of colors for the text, each position corresponding to the color in the +" same position in g:MultipleSearchColorSequence. + +" If you change one of the preference variables, you can issue the command +" :SearchReinit +" to update the script with your new selections. + +" Supporters: +" Thanks to Peter Valach for suggestions and testing! +" Thanks to Jeff Mei for the suggestion and testing of the :SearchBuffers +" command. +" Thanks to Amber Hassan for fixing a problem with a search pattern containing +" quote characters! +" Thanks to Manuel Picaza for the mapping to :Search the word under the +" cursor. +" ---------------------------------------------------------------------------- + +" This script uses continuation lines, so make sure it runs using +" Vim-default 'cpoptions'. +let s:save_cpo = &cpo +set cpo&vim + +" FUNCTIONS +" -------------------------------------------------- + +" ----- +" Strntok: Utility function to implement C-like strntok() by Michael Geddes +" and Benji Fisher at http://groups.yahoo.com/group/vimdev/message/26788 +" ----- +function! s:Strntok( s, tok, n) + return matchstr( a:s.a:tok[0], '\v(\zs([^'.a:tok.']*)\ze['.a:tok.']){'.a:n.'}') +endfun + +" ----- +" MultipleSearchInit: Initialize the higlight groups. This function will add +" highlighting groups if g:MultipSearchMaxColors has increased since the +" plugin was first loaded. +" ----- +function! s:MultipleSearchInit() + " Specify a maximum number of colors to use. + if exists('g:MultipleSearchMaxColors') + let s:MaxColors = g:MultipleSearchMaxColors + else + let s:MaxColors = 4 + endif + + " Define the sequence of colors to use for searches. + if exists('g:MultipleSearchColorSequence') + let s:ColorSequence = g:MultipleSearchColorSequence + else + let s:ColorSequence = "red,yellow,blue,green,magenta,cyan,gray,brown" + endif + + " Define the text color for searches, so that it can still be read against the + " colored background. + if exists('g:MultipleSearchTextColorSequence') + let s:TextColorSequence = g:MultipleSearchTextColorSequence + else + let s:TextColorSequence = "white,black,white,black,white,black,black,white" + endif + + " Start off with the first color + let s:colorToUse = 0 + + let s:colorsInUse = 0 + + " Sanity check: make sure MaxColors is not larger than the number of + " colors in ColorSequence or the corresponding TextColorSequence. + let s:MaxColors = s:Min(s:MaxColors, s:ItemCount(s:ColorSequence . ','), + \ s:ItemCount(s:TextColorSequence . ',')) + + let loopCount = 0 + while loopCount < s:MaxColors + " Define the colors to use + let bgColor = s:Strntok(s:ColorSequence, ',', loopCount + 1) + let fgColor = s:Strntok(s:TextColorSequence, ',', loopCount + 1) + execute 'highlight MultipleSearch' . loopCount + \ . ' ctermbg=' . bgColor . ' guibg=' . bgColor + \ . ' ctermfg=' . fgColor . ' guifg=' . fgColor + let loopCount = loopCount + 1 + endwhile +endfunction + +" ----- +" ItemCount: Returns the number of items in the given string. +" ----- +function! s:ItemCount(string) + let itemCount = 0 + let newstring = a:string + let pos = stridx(newstring, ',') + while pos > -1 + let itemCount = itemCount + 1 + let newstring = strpart(newstring, pos + 1) + let pos = stridx(newstring, ',') + endwhile + return itemCount +endfunction + +" ----- +" Min: Returns the minimum of the given parameters. +" ----- +function! s:Min(...) + let min = a:1 + let index = 2 + while index <= a:0 + execute "if min > a:" . index . " | let min = a:" . index . " | endif" + let index = index + 1 + endwhile + return min +endfunction + +" ----- +" GetNextSequenceNumber: Determine the next Search color to use. +" ----- +function! s:GetNextSequenceNumber() + let sequenceNumber = s:colorToUse % s:MaxColors + let s:colorToUse = s:colorToUse + 1 + if s:colorToUse >= s:MaxColors + let s:colorToUse = 0 + endif + return sequenceNumber +endfunction + +" ----- +" DoSearch: The main searching function that highlights all matches in the +" current buffer. +" ----- +function! s:DoSearch(useSearch, forwhat) + " Clear the previous highlighting for this color + execute 'silent syntax clear ' . a:useSearch + + " Should it be a case-sensitive match or case-insensitive? + if &ignorecase == 1 + " If 'smartcase' is on and our search pattern has an upper-case + " character, do a case sensitive match. + if &smartcase == 1 + " match() respects 'ignorecase', so turn it off for now + set noignorecase + + if match(a:forwhat, '\u') > -1 + syntax case match + else + syntax case ignore + endif + + " Be sure to turn 'ignorecase' back on! + set ignorecase + else + syntax case ignore + endif + else + syntax case match + endif + + " Highlight the new search + execute 'syntax match ' . a:useSearch . ' "' . a:forwhat . '" containedin=ALL' + let @/ = a:forwhat +endfunction + +" ----- +" MultipleSearch: Highlight the given pattern in the next available color. +" Vim versions prior to 7.0 don't support the autoload mechanism, so define +" the main function without the autoload prefix. +" ----- +if v:version < 700 + function! MultipleSearch(allBuffers, forwhat) + call s:MultipleSearchCommon(a:allBuffers, a:forwhat) + endfunction +else + function! MultipleSearch#MultipleSearch(allBuffers, forwhat) + call s:MultipleSearchCommon(a:allBuffers, a:forwhat) + endfunction +endif + +" ----- +" MultipleSearchCommon: Highlight the given pattern in the next available color. +" ----- +function! s:MultipleSearchCommon(allBuffers, forwhat) + let patt = a:forwhat + + if( l:patt =~ "[^\\\\]'" ) " if single quote not escaped + let l:patt = escape(l:patt,"'") " escape single quotes with a \ char + endif + + if( l:patt =~ '[^\\]"' ) " if double quote not escaped + let l:patt = escape(l:patt, '"') " escape double quotes with a \ char + endif + + "let patt = escape(a:forwhat,"'") " escape single quotes with a \ char + "let l:patt = escape(l:patt, '"') " escape double quotes with a \ char + + " Determine which search color to use. + let s:curr_sequence = s:GetNextSequenceNumber() + let s:patterns{s:curr_sequence} = l:patt + let s:searchSequence = s:curr_sequence + if s:colorsInUse < s:MaxColors + let s:colorsInUse += 1 + endif + let useSearch = "MultipleSearch" . s:curr_sequence + + if a:allBuffers + " If a:allBuffers is on, we want to show the match in all currently + " listed buffers. + let counter = 1 + let bufCount = bufnr("$") + let current = bufnr("%") + let lz_save = &lazyredraw + + " Loop through all the buffers and perform the search in each one. + while counter <= bufCount + if buflisted(counter) + exec "buffer " . counter + call s:DoSearch(useSearch, l:patt) + endif + let counter = counter + 1 + endwhile + exec "buffer " . current + let &lazyredraw = lz_save + else + " Otherwise, just search in the current buffer. + call s:DoSearch(useSearch, l:patt) + endif +endfunction + +" --- +" DoReset: Clear the highlighting +" --- +function! s:DoReset() + let seq = 0 + while seq < s:MaxColors + execute 'syntax clear MultipleSearch' . seq + let seq = seq + 1 + endwhile +endfunction + +" ----- +" MultipleSearchReset: Clear all the current search selections. +" ----- +function! s:MultipleSearchReset(allBuffers) + let s:colorToUse = 0 + let s:colorsInUse = 0 + if a:allBuffers == 1 + " If a:allBuffers is on, we want to clear the match in all + " currently listed buffers. + let current = bufnr("%") + bufdo call s:DoReset() + execute "buffer " . current + else + " Otherwise, just clear the current buffer. + call s:DoReset() + endif +endfunction + +" ----- +" SearchNext: Switch to the next search item to cycle through with n and N +" ----- +function! s:SearchNext(direction) + if a:direction == 0 + let s:searchSequence += 1 + if s:searchSequence >= s:colorsInUse + let s:searchSequence = 0 + endif + else + let s:searchSequence -= 1 + if s:searchSequence < 0 + let s:searchSequence = s:colorsInUse - 1 + endif + endif + + let @/ = s:patterns{s:searchSequence} + call search(s:patterns{s:searchSequence}) +endfunction + + +" Initialize the script the first time through. +call <SID>MultipleSearchInit() + +let &cpo = s:save_cpo + +" COMMANDS +" ------------------------------------------------ + +" Clear the current search selections and start over with the first color in +" the sequence. +if !(exists(":SearchReset") == 2) + command -nargs=0 SearchReset :silent call <SID>MultipleSearchReset(0) +endif + +" Clear the current search selections and start over with the first color in +" the sequence. +if !(exists(":SearchBuffersReset") == 2) + command -nargs=0 SearchBuffersReset :silent call <SID>MultipleSearchReset(1) +endif + +" Reinitialize the script after changing one of the global preferences. +if !(exists(":SearchReinit") == 2) + command -nargs=0 SearchReinit :silent call <SID>MultipleSearchInit() +endif + +" Set the current search pattern to the next one in the list +nnoremap <silent> <Leader>n :call <SID>SearchNext(0)<CR> +" +" Set the current search pattern to the previous one in the list +nnoremap <silent> <Leader>N :call <SID>SearchNext(1)<CR> diff --git a/vimfiles/autoload/netrw.vim b/vimfiles/autoload/netrw.vim index f17adf7..1f7ef38 100644 --- a/vimfiles/autoload/netrw.vim +++ b/vimfiles/autoload/netrw.vim @@ -1,7214 +1,7839 @@ -" netrw.vim: Handles file transfer and remote directory listing across -" AUTOLOAD SECTION -" Date: Mar 28, 2008 -" Version: 123 -" Maintainer: Charles E Campbell, Jr <NdrOchip@ScampbellPfamily.AbizM-NOSPAM> -" GetLatestVimScripts: 1075 1 :AutoInstall: netrw.vim -" Copyright: Copyright (C) 1999-2007 Charles E. Campbell, Jr. {{{1 -" Permission is hereby granted to use and distribute this code, -" with or without modifications, provided that this copyright -" notice is copied with it. Like anything else that's free, -" netrw.vim, netrwPlugin.vim, and netrwSettings.vim are provided -" *as is* and come with no warranty of any kind, either -" expressed or implied. By using this plugin, you agree that -" in no event will the copyright holder be liable for any damages -" resulting from the use of this software. -"redraw!|call DechoSep()|call inputsave()|call input("Press <cr> to continue")|call inputrestore() -" -" But be doers of the Word, and not only hearers, deluding your own selves {{{1 -" (James 1:22 RSV) -" =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- -" Load Once: {{{1 -if &cp || exists("g:loaded_netrw") - finish -endif -if !exists("s:NOTE") - let s:NOTE = 0 - let s:WARNING = 1 - let s:ERROR = 2 -endif -let g:loaded_netrw = "v123" -if v:version < 700 - call netrw#ErrorMsg(s:WARNING,"you need vim version 7.0 or later for version ".g:loaded_netrw." of netrw",1) - finish -endif -let s:keepcpo= &cpo -setlocal cpo&vim -"DechoTabOn -"call Decho("doing autoload/netrw.vim version ".g:loaded_netrw) - -" ====================== -" Netrw Variables: {{{1 -" ====================== - -" --------------------------------------------------------------------- -" Netrw Constants: {{{2 -if !exists("g:NETRW_BOOKMARKMAX") - let g:NETRW_BOOKMARKMAX= 0 -endif -if !exists("g:NETRW_DIRHIST_CNT") - let g:NETRW_DIRHIST_CNT= 0 -endif -if !exists("s:LONGLIST") - let s:THINLIST = 0 - let s:LONGLIST = 1 - let s:WIDELIST = 2 - let s:TREELIST = 3 - let s:MAXLIST = 4 -endif - -" --------------------------------------------------------------------- -" Default values for netrw's global protocol variables {{{2 -if !exists("g:netrw_dav_cmd") - let g:netrw_dav_cmd = "cadaver" -endif -if !exists("g:netrw_fetch_cmd") - if executable("fetch") - let g:netrw_fetch_cmd = "fetch -o" - else - let g:netrw_fetch_cmd = "" - endif -endif -if !exists("g:netrw_ftp_cmd") - let g:netrw_ftp_cmd = "ftp" -endif -if !exists("g:netrw_http_cmd") - if executable("curl") - let g:netrw_http_cmd = "curl -o" - elseif executable("wget") - let g:netrw_http_cmd = "wget -q -O" - elseif executable("fetch") - let g:netrw_http_cmd = "fetch -o" - else - let g:netrw_http_cmd = "" - endif -endif -if !exists("g:netrw_rcp_cmd") - let g:netrw_rcp_cmd = "rcp" -endif -if !exists("g:netrw_rsync_cmd") - let g:netrw_rsync_cmd = "rsync" -endif -if !exists("g:netrw_scp_cmd") - let g:netrw_scp_cmd = "scp -q" -endif -if !exists("g:netrw_sftp_cmd") - let g:netrw_sftp_cmd = "sftp" -endif -if !exists("g:netrw_ssh_cmd") - let g:netrw_ssh_cmd= "ssh" -endif - -if (has("win32") || has("win95") || has("win64") || has("win16")) - \ && exists("g:netrw_use_nt_rcp") - \ && g:netrw_use_nt_rcp - \ && executable( $SystemRoot .'/system32/rcp.exe') - let s:netrw_has_nt_rcp = 1 - let s:netrw_rcpmode = '-b' -else - let s:netrw_has_nt_rcp = 0 - let s:netrw_rcpmode = '' -endif - -" --------------------------------------------------------------------- -" Default values for netrw's global variables {{{2 -" Cygwin Detection ------- {{{3 -if !exists("g:netrw_cygwin") - if has("win32") || has("win95") || has("win64") || has("win16") - if &shell =~ '\%(\<bash\>\|\<zsh\>\)\%(\.exe\)\=$' - let g:netrw_cygwin= 1 - else - let g:netrw_cygwin= 0 - endif - else - let g:netrw_cygwin= 0 - endif -endif -" Default values - a-c ---------- {{{3 -if !exists("g:netrw_alto") - let g:netrw_alto= &sb -endif -if !exists("g:netrw_altv") - let g:netrw_altv= &spr -endif -if !exists("g:netrw_browse_split") - let g:netrw_browse_split= 0 -endif -if !exists("g:netrw_chgwin") - let g:netrw_chgwin = -1 -endif -if !exists("g:netrw_compress") - let g:netrw_compress= "gzip" -endif -" Default values - d-f ---------- {{{3 -if !exists("g:NETRW_DIRHIST_CNT") - let g:NETRW_DIRHIST_CNT= 0 -endif -if !exists("g:netrw_decompress") - let g:netrw_decompress= { ".gz" : "gunzip" , ".bz2" : "bunzip2" , ".zip" : "unzip" , ".tar" : "tar -xf"} -endif -if !exists("g:netrw_dirhistmax") - let g:netrw_dirhistmax= 10 -endif -if !exists("g:netrw_fastbrowse") - let g:netrw_fastbrowse= 1 -endif -if !exists("g:netrw_ftp_browse_reject") - let g:netrw_ftp_browse_reject='^total\s\+\d\+$\|^Trying\s\+\d\+.*$\|^KERBEROS_V\d rejected\|^Security extensions not\|No such file\|: connect to address [0-9a-fA-F:]*: No route to host$' -endif -if !exists("g:netrw_ftp_list_cmd") - if has("unix") || (exists("g:netrw_cygwin") && g:netrw_cygwin) - let g:netrw_ftp_list_cmd = "ls -lF" - let g:netrw_ftp_timelist_cmd = "ls -tlF" - let g:netrw_ftp_sizelist_cmd = "ls -slF" - else - let g:netrw_ftp_list_cmd = "dir" - let g:netrw_ftp_timelist_cmd = "dir" - let g:netrw_ftp_sizelist_cmd = "dir" - endif -endif -if !exists("g:netrw_ftpmode") - let g:netrw_ftpmode= "binary" -endif -" Default values - h-lh ---------- {{{3 -if !exists("g:netrw_hide") - let g:netrw_hide= 1 -endif -if !exists("g:netrw_ignorenetrc") - if &shell =~ '\c\<\%(cmd\|4nt\)\.exe$' - let g:netrw_ignorenetrc= 1 - else - let g:netrw_ignorenetrc= 0 - endif -endif -if !exists("g:netrw_keepdir") - let g:netrw_keepdir= 1 -endif -if !exists("g:netrw_list_cmd") - if g:netrw_scp_cmd =~ '^pscp' && executable("pscp") - " provide a 'pscp' listing command - if (has("win32") || has("win95") || has("win64") || has("win16")) && filereadable("c:\\private.ppk") - let g:netrw_scp_cmd ="pscp -i C:\\private.ppk" - endif - let g:netrw_list_cmd= g:netrw_scp_cmd." -ls USEPORT HOSTNAME:" - elseif executable(g:netrw_ssh_cmd) - " provide a default listing command - let g:netrw_list_cmd= g:netrw_ssh_cmd." USEPORT HOSTNAME ls -FLa" - else -" call Decho(g:netrw_ssh_cmd." is not executable") - let g:netrw_list_cmd= "" - endif -endif -if !exists("g:netrw_list_hide") - let g:netrw_list_hide= "" -endif -" Default values - lh-lz ---------- {{{3 -if !exists("g:netrw_localcopycmd") - if has("win32") || has("win95") || has("win64") || has("win16") - if g:netrw_cygwin - let g:netrw_localcopycmd= "cp" - else - let g:netrw_localcopycmd= "copy" - endif - elseif has("unix") || has("macunix") - let g:netrw_localcopycmd= "cp" - else - let g:netrw_localcopycmd= "" - endif -endif -if !exists("g:netrw_local_mkdir") - let g:netrw_local_mkdir= "mkdir" -endif -if !exists("g:netrw_localmovecmd") - if has("win32") || has("win95") || has("win64") || has("win16") - if g:netrw_cygwin - let g:netrw_localmovecmd= "mv" - else - let g:netrw_localmovecmd= "move" - endif - elseif has("unix") || has("macunix") - let g:netrw_localmovecmd= "mv" - else - let g:netrw_localmovecmd= "" - endif -endif -if !exists("g:netrw_local_rmdir") - let g:netrw_local_rmdir= "rmdir" -endif -if !exists("g:netrw_liststyle") - let g:netrw_liststyle= s:THINLIST -endif -if g:netrw_liststyle < 0 || g:netrw_liststyle >= s:MAXLIST - " sanity check - let g:netrw_liststyle= s:THINLIST -endif -if g:netrw_liststyle == s:LONGLIST && g:netrw_scp_cmd !~ '^pscp' - let g:netrw_list_cmd= g:netrw_list_cmd." -l" -endif -" Default values - m-r ---------- {{{3 -if !exists("g:netrw_markfileesc") - let g:netrw_markfileesc= '*./[\~' -endif -if !exists("g:netrw_maxfilenamelen") - let g:netrw_maxfilenamelen= 32 -endif -if !exists("g:netrw_menu") - let g:netrw_menu= 1 -endif -if !exists("g:netrw_mkdir_cmd") - let g:netrw_mkdir_cmd= g:netrw_ssh_cmd." USEPORT HOSTNAME mkdir" -endif -if !exists("g:netrw_mousemaps") - if exists("&mouse") && &mouse =~ '[anh]' - let g:netrw_mousemaps= 1 - else - let g:netrw_mousemaps= 0 - endif -endif -if !exists("g:netrw_retmap") - let g:netrw_retmap= 0 -endif -if !exists("g:netrw_preview") - let g:netrw_preview= 0 -endif -if !exists("g:netrw_scpport") - let g:netrw_scpport= "-P" -endif -if !exists("g:netrw_sshport") - let g:netrw_sshport= "-p" -endif -if !exists("g:netrw_rename_cmd") - let g:netrw_rename_cmd= g:netrw_ssh_cmd." USEPORT HOSTNAME mv" -endif -if !exists("g:netrw_rm_cmd") - let g:netrw_rm_cmd = g:netrw_ssh_cmd." USEPORT HOSTNAME rm" -endif -if !exists("g:netrw_rmdir_cmd") - let g:netrw_rmdir_cmd = g:netrw_ssh_cmd." USEPORT HOSTNAME rmdir" -endif -if !exists("g:netrw_rmf_cmd") - let g:netrw_rmf_cmd = g:netrw_ssh_cmd." USEPORT HOSTNAME rm -f" -endif -" Default values - s ---------- {{{3 -if exists("g:netrw_silent") && g:netrw_silent != 0 - let g:netrw_silentxfer= "silent " -else - let g:netrw_silentxfer= "" -endif -if !exists("g:netrw_shq") - if exists("&shq") && &shq != "" - let g:netrw_shq= &shq - elseif exists("&sxq") && &sxq != "" - let g:netrw_shq= &sxq - elseif has("win32") || has("win95") || has("win64") || has("win16") - if g:netrw_cygwin - let g:netrw_shq= "'" - else - let g:netrw_shq= '"' - endif - else - let g:netrw_shq= "'" - endif -" call Decho("g:netrw_shq<".g:netrw_shq.">") -endif -if !exists("g:netrw_sort_by") - " alternatives: date size - let g:netrw_sort_by= "name" -endif -if !exists("g:netrw_sort_direction") - " alternative: reverse (z y x ...) - let g:netrw_sort_direction= "normal" -endif -if !exists("g:netrw_sort_sequence") - let g:netrw_sort_sequence= '[\/]$,\.h$,\.c$,\.cpp$,*,\.o$,\.obj$,\.info$,\.swp$,\.bak$,\~$' -endif -if !exists("g:netrw_special_syntax") - let g:netrw_special_syntax= 0 -endif -if !exists("g:netrw_ssh_browse_reject") - let g:netrw_ssh_browse_reject='^total\s\+\d\+$' -endif -if !has("patch192") - if !exists("g:netrw_use_noswf") - let g:netrw_use_noswf= 1 - endif -else - let g:netrw_use_noswf= 0 -endif -" Default values - t-w ---------- {{{3 -if !exists("g:netrw_ctags") - let g:netrw_ctags= "ctags" -endif -if !exists("g:netrw_timefmt") - let g:netrw_timefmt= "%c" -endif -if !exists("g:NetrwTopLvlMenu") - let g:NetrwTopLvlMenu= "Netrw." -endif -if !exists("g:netrw_use_errorwindow") - let g:netrw_use_errorwindow= 1 -endif -if !exists("g:netrw_win95ftp") - let g:netrw_win95ftp= 1 -endif -if !exists("g:netrw_winsize") - let g:netrw_winsize= "" -endif -" --------------------------------------------------------------------- -" Default values for netrw's script variables: {{{2 -if !exists("g:netrw_cd_escape") - let g:netrw_cd_escape="[]#*$%'\" ?`!&();<>\\" -endif -if !exists("g:netrw_fname_escape") - let g:netrw_fname_escape= ' ?&;%' -endif -if !exists("g:netrw_glob_escape") - let g:netrw_glob_escape= '[]*?`{~$' -endif -if !exists("g:netrw_tmpfile_escape") - let g:netrw_tmpfile_escape= ' &;' -endif - -" BufEnter event ignored by decho when following variable is true -" Has a side effect that doau BufReadPost doesn't work, so -" files read by network transfer aren't appropriately highlighted. -"let g:decho_bufenter = 1 "Decho - -" ============================== -" Netrw Utility Functions: {{{1 -" ============================== - -" ------------------------------------------------------------------------ -" s:NetrwOptionSave: save options and set to "standard" form {{{2 -" 06/08/07 : removed call to NetrwSafeOptions(), either placed -" immediately after NetrwOptionSave() calls in NetRead -" and NetWrite, or after the s:NetrwEnew() call in -" NetrwBrowse. -" vt: normally its "w:" or "s:" (a variable type) -fun! s:NetrwOptionSave(vt) -" call Dfunc("s:NetrwOptionSave(vt<".a:vt.">) win#".winnr()." buf#".bufnr("%")."<".bufname(bufnr("%")).">") - -" call Decho(a:vt."netrw_optionsave".(exists("{a:vt}netrw_optionsave")? ("=".{a:vt}netrw_optionsave) : " doesn't exist")) - if !exists("{a:vt}netrw_optionsave") - let {a:vt}netrw_optionsave= 1 - else -" call Dret("s:NetrwOptionSave : options already saved") - return - endif -" call Decho("fo=".&fo.(exists("&acd")? " acd=".&acd : " acd doesn't exist")) - - " Save current settings and current directory - let s:yykeep = @@ - if exists("&l:acd") - let {a:vt}netrw_acdkeep = &l:acd - endif - let {a:vt}netrw_aikeep = &l:ai - let {a:vt}netrw_awkeep = &l:aw - let {a:vt}netrw_cikeep = &l:ci - let {a:vt}netrw_cinkeep = &l:cin - let {a:vt}netrw_cinokeep = &l:cino - let {a:vt}netrw_comkeep = &l:com - let {a:vt}netrw_cpokeep = &l:cpo - if g:netrw_keepdir - let {a:vt}netrw_dirkeep = getcwd() - endif - let {a:vt}netrw_fokeep = &l:fo " formatoptions - let {a:vt}netrw_gdkeep = &l:gd " gdefault - let {a:vt}netrw_hidkeep = &l:hidden - let {a:vt}netrw_magickeep = &l:magic - let {a:vt}netrw_repkeep = &l:report - let {a:vt}netrw_spellkeep = &l:spell - let {a:vt}netrw_twkeep = &l:tw " textwidth - let {a:vt}netrw_wigkeep = &l:wig " wildignore - if has("win32") && !has("win95") - let {a:vt}netrw_swfkeep= &l:swf " swapfile - endif - if &go =~ 'a' | silent! let {a:vt}netrw_regstar = @* | endif - silent! let {a:vt}netrw_regslash= @/ - -" call Dret("s:NetrwOptionSave : win#".winnr()." buf#".bufnr("%")) -endfun - -" ------------------------------------------------------------------------ -" s:NetrwOptionRestore: restore options {{{2 -fun! s:NetrwOptionRestore(vt) -" call Dfunc("s:NetrwOptionRestore(vt<".a:vt.">) win#".winnr()." buf#".bufnr("%")) - if !exists("{a:vt}netrw_optionsave") -" call Decho("ro=".&ro." ma=".&ma." mod=".&mod." wrap=".&wrap) -" call Dret("s:NetrwOptionRestore : ".a:vt."netrw_optionsave doesn't exist") - return - endif - unlet {a:vt}netrw_optionsave - - if exists("&acd") - if exists("{a:vt}netrw_acdkeep") -" call Decho("g:netrw_keepdir=".g:netrw_keepdir.": getcwd<".getcwd()."> acd=".&acd) - let curdir = getcwd() - let &l:acd = {a:vt}netrw_acdkeep - unlet {a:vt}netrw_acdkeep - if &l:acd -" call Decho("exe cd ".escape(curdir,g:netrw_cd_escape)) " NOTE: was g:netrw_fname_escape for some reason - exe "lcd ".escape(curdir,g:netrw_cd_escape) - endif - endif - endif - if exists("{a:vt}netrw_aikeep") |let &l:ai = {a:vt}netrw_aikeep |unlet {a:vt}netrw_aikeep |endif - if exists("{a:vt}netrw_awkeep") |let &l:aw = {a:vt}netrw_awkeep |unlet {a:vt}netrw_awkeep |endif - if exists("{a:vt}netrw_cikeep") |let &l:ci = {a:vt}netrw_cikeep |unlet {a:vt}netrw_cikeep |endif - if exists("{a:vt}netrw_cinkeep") |let &l:cin = {a:vt}netrw_cinkeep |unlet {a:vt}netrw_cinkeep |endif - if exists("{a:vt}netrw_cinokeep") |let &l:cino = {a:vt}netrw_cinokeep |unlet {a:vt}netrw_cinokeep |endif - if exists("{a:vt}netrw_comkeep") |let &l:com = {a:vt}netrw_comkeep |unlet {a:vt}netrw_comkeep |endif - if exists("{a:vt}netrw_cpokeep") |let &l:cpo = {a:vt}netrw_cpokeep |unlet {a:vt}netrw_cpokeep |endif - if exists("{a:vt}netrw_dirkeep") && isdirectory({a:vt}netrw_dirkeep) && g:netrw_keepdir - let dirkeep = substitute({a:vt}netrw_dirkeep,'\\','/','g') - let dirkeep = escape(dirkeep,g:netrw_cd_escape) - if exists("{a:vt}netrw_dirkeep") |exe "lcd ".dirkeep|unlet {a:vt}netrw_dirkeep |endif - endif - if exists("{a:vt}netrw_fokeep") |let &l:fo = {a:vt}netrw_fokeep |unlet {a:vt}netrw_fokeep |endif - if exists("{a:vt}netrw_gdkeep") |let &l:gd = {a:vt}netrw_gdkeep |unlet {a:vt}netrw_gdkeep |endif - if exists("{a:vt}netrw_hidkeep") |let &l:hidden = {a:vt}netrw_hidkeep |unlet {a:vt}netrw_hidkeep |endif - if exists("{a:vt}netrw_magic") |let &l:magic = {a:vt}netrw_magic |unlet {a:vt}netrw_magic |endif - if exists("{a:vt}netrw_repkeep") |let &l:report = {a:vt}netrw_repkeep |unlet {a:vt}netrw_repkeep |endif - if exists("{a:vt}netrw_spellkeep")|let &l:spell = {a:vt}netrw_spellkeep |unlet {a:vt}netrw_spellkeep|endif - if exists("{a:vt}netrw_twkeep") |let &l:tw = {a:vt}netrw_twkeep |unlet {a:vt}netrw_twkeep |endif - if exists("{a:vt}netrw_wigkeep") |let &l:wig = {a:vt}netrw_wigkeep |unlet {a:vt}netrw_wigkeep |endif - if exists("s:yykeep") |let @@ = s:yykeep |unlet s:yykeep |endif - if exists("{a:vt}netrw_swfkeep") - if &directory == "" - " user hasn't specified a swapfile directory; - " netrw will temporarily set the swapfile directory - " to the current directory as returned by getcwd(). - let &l:directory = getcwd() - silent! let &l:swf = {a:vt}netrw_swfkeep - setlocal directory= - unlet {a:vt}netrw_swfkeep - elseif &l:swf != {a:vt}netrw_swfkeep - " following line causes a Press ENTER in windows -- can't seem to work around it!!! - silent! let &l:swf= {a:vt}netrw_swfkeep - unlet {a:vt}netrw_swfkeep - endif - endif - if exists("{a:vt}netrw_regstar") |silent! let @*= {a:vt}netrw_regstar |unlet {a:vt}netrw_regstar |endif - if exists("{a:vt}netrw_regslash")|silent! let @/= {a:vt}netrw_regslash|unlet {a:vt}netrw_regslash|endif -" call Decho("g:netrw_keepdir=".g:netrw_keepdir.": getcwd<".getcwd()."> acd=".&acd) - -" call Decho("fo=".&fo.(exists("&acd")? " acd=".&acd : " acd doesn't exist")) -" call Decho("ro=".&ro." ma=".&ma." mod=".&mod." wrap=".&wrap) -" call Dret("s:NetrwOptionRestore : win#".winnr()." buf#".bufnr("%")) -endfun - -" --------------------------------------------------------------------- -" s:NetrwSafeOptions: sets options to help netrw do its job {{{2 -fun! s:NetrwSafeOptions() -" call Dfunc("s:NetrwSafeOptions() win#".winnr()." buf#".bufnr("%")."<".bufname(bufnr("%")).">") -" call Decho("window's ft=".&ft) - setlocal cino= - setlocal com= - setlocal cpo-=aA - if exists("&acd") | setlocal noacd | endif - setlocal nocin noai noci magic nospell nohid wig= noaw - setlocal fo=nroql2 - setlocal tw=0 - setlocal report=10000 - if g:netrw_use_noswf && has("win32") && !has("win95") - setlocal noswf - endif -" call Decho("fo=".&fo.(exists("&acd")? " acd=".&acd : " acd doesn't exist")) -" call Dret("s:NetrwSafeOptions") -endfun - -" --------------------------------------------------------------------- -" netrw#NetrwClean: remove netrw {{{2 -" supports :NetrwClean -- remove netrw from first directory on runtimepath -" :NetrwClean! -- remove netrw from all directories on runtimepath -fun! netrw#NetrwClean(sys) -" call Dfunc("netrw#NetrwClean(sys=".a:sys.")") - - if a:sys - let choice= confirm("Remove personal and system copies of netrw?","&Yes\n&No") - else - let choice= confirm("Remove personal copy of netrw?","&Yes\n&No") - endif -" call Decho("choice=".choice) - let diddel= 0 - let diddir= "" - - if choice == 1 - for dir in split(&rtp,',') - if filereadable(dir."/plugin/netrwPlugin.vim") -" call Decho("removing netrw-related files from ".dir) - if s:System("delete",dir."/plugin/netrwPlugin.vim") |call netrw#ErrorMsg(1,"unable to remove ".dir."/plugin/netrwPlugin.vim",55) |endif - if s:System("delete",dir."/autoload/netrwFileHandlers.vim")|call netrw#ErrorMsg(1,"unable to remove ".dir."/autoload/netrwFileHandlers.vim",55)|endif - if s:System("delete",dir."/autoload/netrwSettings.vim") |call netrw#ErrorMsg(1,"unable to remove ".dir."/autoload/netrwSettings.vim",55) |endif - if s:System("delete",dir."/autoload/netrw.vim") |call netrw#ErrorMsg(1,"unable to remove ".dir."/autoload/netrw.vim",55) |endif - if s:System("delete",dir."/syntax/netrw.vim") |call netrw#ErrorMsg(1,"unable to remove ".dir."/syntax/netrw.vim",55) |endif - if s:System("delete",dir."/syntax/netrwlist.vim") |call netrw#ErrorMsg(1,"unable to remove ".dir."/syntax/netrwlist.vim",55) |endif - let diddir= dir - let diddel= diddel + 1 - if !a:sys|break|endif - endif - endfor - endif - - echohl WarningMsg - if diddel == 0 - echomsg "netrw is either not installed or not removable" - elseif diddel == 1 - echomsg "removed one copy of netrw from <".diddir.">" - else - echomsg "removed ".diddel." copies of netrw" - endif - echohl None - -" call Dret("netrw#NetrwClean") -endfun - -" ------------------------------------------------------------------------ -" Netrw Transfer Functions: {{{1 -" =============================== - -" ------------------------------------------------------------------------ -" netrw#NetRead: responsible for reading a file over the net {{{2 -" mode: =0 read remote file and insert before current line -" =1 read remote file and insert after current line -" =2 replace with remote file -" =3 obtain file, but leave in temporary format -fun! netrw#NetRead(mode,...) -" call Dfunc("netrw#NetRead(mode=".a:mode.",...) a:0=".a:0." ".g:loaded_netrw) - - " save options {{{3 - call s:NetrwOptionSave("w:") - call s:NetrwSafeOptions() - - " interpret mode into a readcmd {{{3 - if a:mode == 0 " read remote file before current line - let readcmd = "0r" - elseif a:mode == 1 " read file after current line - let readcmd = "r" - elseif a:mode == 2 " replace with remote file - let readcmd = "%r" - elseif a:mode == 3 " skip read of file (leave as temporary) - let readcmd = "t" - else - exe a:mode - let readcmd = "r" - endif - let ichoice = (a:0 == 0)? 0 : 1 -" call Decho("readcmd<".readcmd."> ichoice=".ichoice) - - " Get Temporary Filename {{{3 - let tmpfile= s:GetTempfile("") - if tmpfile == "" -" call Dret("netrw#NetRead : unable to get a tempfile!") - return - endif - - while ichoice <= a:0 - - " attempt to repeat with previous host-file-etc - if exists("b:netrw_lastfile") && a:0 == 0 -" call Decho("using b:netrw_lastfile<" . b:netrw_lastfile . ">") - let choice = b:netrw_lastfile - let ichoice= ichoice + 1 - - else - exe "let choice= a:" . ichoice -" call Decho("no lastfile: choice<" . choice . ">") - - if match(choice,"?") == 0 - " give help - echomsg 'NetRead Usage:' - echomsg ':Nread machine:path uses rcp' - echomsg ':Nread "machine path" uses ftp with <.netrc>' - echomsg ':Nread "machine id password path" uses ftp' - echomsg ':Nread dav://machine[:port]/path uses cadaver' - echomsg ':Nread fetch://machine/path uses fetch' - echomsg ':Nread ftp://[user@]machine[:port]/path uses ftp autodetects <.netrc>' - echomsg ':Nread http://[user@]machine/path uses http wget' - echomsg ':Nread rcp://[user@]machine/path uses rcp' - echomsg ':Nread rsync://machine[:port]/path uses rsync' - echomsg ':Nread scp://[user@]machine[[:#]port]/path uses scp' - echomsg ':Nread sftp://[user@]machine[[:#]port]/path uses sftp' - sleep 4 - break - - elseif match(choice,'^"') != -1 - " Reconstruct Choice if choice starts with '"' -" call Decho("reconstructing choice") - if match(choice,'"$') != -1 - " case "..." - let choice=strpart(choice,1,s:Strlen(choice)-2) - else - " case "... ... ..." - let choice = strpart(choice,1,s:Strlen(choice)-1) - let wholechoice = "" - - while match(choice,'"$') == -1 - let wholechoice = wholechoice . " " . choice - let ichoice = ichoice + 1 - if ichoice > a:0 - if !exists("g:netrw_quiet") - call netrw#ErrorMsg(s:ERROR,"Unbalanced string in filename '". wholechoice ."'",3) - endif -" call Dret("netrw#NetRead :2 getcwd<".getcwd().">") - return - endif - let choice= a:{ichoice} - endwhile - let choice= strpart(wholechoice,1,s:Strlen(wholechoice)-1) . " " . strpart(choice,0,s:Strlen(choice)-1) - endif - endif - endif - -" call Decho("choice<" . choice . ">") - let ichoice= ichoice + 1 - - " Determine method of read (ftp, rcp, etc) {{{3 - call s:NetrwMethod(choice) - let tmpfile= s:GetTempfile(b:netrw_fname) " apply correct suffix - - " Check if NetrwBrowse() should be handling this request -" call Decho("checking if NetrwBrowse() should handle choice<".choice."> with netrw_list_cmd<".g:netrw_list_cmd.">") - if choice =~ "^.*[\/]$" && b:netrw_method != 5 && choice !~ '^http://' -" call Decho("yes, choice matches '^.*[\/]$'") - keepjumps call s:NetrwBrowse(0,choice) -" call Dret("netrw#NetRead :3 getcwd<".getcwd().">") - return - endif - - " ============ - " Perform Protocol-Based Read {{{3 - " =========================== - if exists("g:netrw_silent") && g:netrw_silent == 0 && &ch >= 1 - echo "(netrw) Processing your read request..." - endif - - "......................................... - " rcp: NetRead Method #1 {{{3 - if b:netrw_method == 1 " read with rcp -" call Decho("read via rcp (method #1)") - " ER: nothing done with g:netrw_uid yet? - " ER: on Win2K" rcp machine[.user]:file tmpfile - " ER: if machine contains '.' adding .user is required (use $USERNAME) - " ER: the tmpfile is full path: rcp sees C:\... as host C - if s:netrw_has_nt_rcp == 1 - if exists("g:netrw_uid") && ( g:netrw_uid != "" ) - let uid_machine = g:netrw_machine .'.'. g:netrw_uid - else - " Any way needed it machine contains a '.' - let uid_machine = g:netrw_machine .'.'. $USERNAME - endif - else - if exists("g:netrw_uid") && ( g:netrw_uid != "" ) - let uid_machine = g:netrw_uid .'@'. g:netrw_machine - else - let uid_machine = g:netrw_machine - endif - endif -" call Decho("executing: !".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".g:netrw_shq.uid_machine.":".escape(b:netrw_fname,' ?&;')." ".tmpfile.g:netrw_shq) - exe g:netrw_silentxfer."!".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".g:netrw_shq.uid_machine.":".escape(b:netrw_fname,' ?&;')." ".tmpfile.g:netrw_shq - let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method) - let b:netrw_lastfile = choice - - "......................................... - " ftp + <.netrc>: NetRead Method #2 {{{3 - elseif b:netrw_method == 2 " read with ftp + <.netrc> -" call Decho("read via ftp+.netrc (method #2)") - let netrw_fname= b:netrw_fname - call s:SaveBufVars()|new|call s:RestoreBufVars() - setlocal ff=unix - exe "put ='".g:netrw_ftpmode."'" -" call Decho("filter input: ".getline(".")) - if exists("g:netrw_ftpextracmd") - exe "put ='".g:netrw_ftpextracmd."'" -" call Decho("filter input: ".getline(".")) - endif - exe "put ='".'get \"'.netrw_fname.'\" '.tmpfile."'" -" call Decho("filter input: ".getline(".")) - if exists("g:netrw_port") && g:netrw_port != "" -" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port) - exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port - else -" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine) - exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".g:netrw_machine - endif - " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar) - if getline(1) !~ "^$" && !exists("g:netrw_quiet") && getline(1) !~ '^Trying ' - let debugkeep= &debug - setlocal debug=msg - call netrw#ErrorMsg(s:ERROR,getline(1),4) - let &debug= debugkeep - endif - call s:SaveBufVars()|bd!|call s:RestoreBufVars() - let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method) - let b:netrw_lastfile = choice - - "......................................... - " ftp + machine,id,passwd,filename: NetRead Method #3 {{{3 - elseif b:netrw_method == 3 " read with ftp + machine, id, passwd, and fname - " Construct execution string (four lines) which will be passed through filter -" call Decho("read via ftp+mipf (method #3)") - let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape) - call s:SaveBufVars()|new|call s:RestoreBufVars() - setlocal ff=unix - if exists("g:netrw_port") && g:netrw_port != "" - put ='open '.g:netrw_machine.' '.g:netrw_port -" call Decho("filter input: ".getline(".")) - else - put ='open '.g:netrw_machine -" call Decho("filter input: ".getline(".")) - endif - - if exists("g:netrw_ftp") && g:netrw_ftp == 1 - put =g:netrw_uid -" call Decho("filter input: ".getline(".")) - put ='\"'.s:netrw_passwd.'\"' -" call Decho("filter input: ".getline(".")) - else - put ='user \"'.g:netrw_uid.'\" \"'.s:netrw_passwd.'\"' -" call Decho("filter input: ".getline(".")) - endif - - if exists("g:netrw_ftpmode") && g:netrw_ftpmode != "" - put =g:netrw_ftpmode -" call Decho("filter input: ".getline(".")) - endif - if exists("g:netrw_ftpextracmd") - exe "put ='".g:netrw_ftpextracmd."'" -" call Decho("filter input: ".getline(".")) - endif - put ='get \"'.netrw_fname.'\" '.tmpfile -" call Decho("filter input: ".getline(".")) - - " perform ftp: - " -i : turns off interactive prompting from ftp - " -n unix : DON'T use <.netrc>, even though it exists - " -n win32: quit being obnoxious about password - norm! 1Gdd -" call Decho("executing: %!".g:netrw_ftp_cmd." -i -n") - exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i -n" - " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar) - if getline(1) !~ "^$" -" call Decho("error<".getline(1).">") - if !exists("g:netrw_quiet") - call netrw#ErrorMsg(s:ERROR,getline(1),5) - endif - endif - call s:SaveBufVars()|bd!|call s:RestoreBufVars() - let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method) - let b:netrw_lastfile = choice - - "......................................... - " scp: NetRead Method #4 {{{3 - elseif b:netrw_method == 4 " read with scp -" call Decho("read via scp (method #4)") - if exists("g:netrw_port") && g:netrw_port != "" - let useport= " ".g:netrw_scpport." ".g:netrw_port - else - let useport= "" - endif -" call Decho("exe g:netrw_silentxfer.!".g:netrw_scp_cmd.useport." ".g:netrw_shq.g:netrw_machine.":".escape(b:netrw_fname,g:netrw_fname_escape).g:netrw_shq." ".tmpfile) - exe g:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".g:netrw_shq.g:netrw_machine.":".escape(b:netrw_fname,g:netrw_fname_escape).g:netrw_shq." ".tmpfile - let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method) - let b:netrw_lastfile = choice - - "......................................... - " http: NetRead Method #5 (wget) {{{3 - elseif b:netrw_method == 5 -" call Decho("read via http (method #5)") - if g:netrw_http_cmd == "" - if !exists("g:netrw_quiet") - call netrw#ErrorMsg(s:ERROR,"neither the wget nor the fetch command is available",6) - endif -" call Dret("netrw#NetRead :4 getcwd<".getcwd().">") - return - endif - - let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape) - if match(b:netrw_fname,"#") == -1 - " simple wget -" call Decho('using simple wget (# not in b:netrw_fname<'.b:netrw_fname.">)") -" call Decho("exe ".g:netrw_silentxfer."!".g:netrw_http_cmd." ".g:netrw_shq.tmpfile.g:netrw_shq." ".g:netrw_shq."http://".g:netrw_machine.netrw_fname.g:netrw_shq) - exe g:netrw_silentxfer."!".g:netrw_http_cmd." ".g:netrw_shq.tmpfile.g:netrw_shq." ".g:netrw_shq."http://".g:netrw_machine.netrw_fname.g:netrw_shq - let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method) - - else - " wget plus a jump to an in-page marker (ie. http://abc/def.html#aMarker) -" call Decho(("wget/curl plus jump (# in b:netrw_fname<".b:netrw_fname.">)") - let netrw_html= substitute(netrw_fname,"#.*$","","") - let netrw_tag = substitute(netrw_fname,"^.*#","","") -" call Decho("netrw_html<".netrw_html.">") -" call Decho("netrw_tag <".netrw_tag.">") -" call Decho("exe ".g:netrw_silentxfer."!".g:netrw_http_cmd." ".g:netrw_shq.tmpfile.g:netrw_shq." ".g:netrw_shq."http://".g:netrw_machine.netrw_html.g:netrw_shq) - exe g:netrw_silentxfer."!".g:netrw_http_cmd." ".g:netrw_shq.tmpfile.g:netrw_shq." ".g:netrw_shq."http://".g:netrw_machine.netrw_html.g:netrw_shq - let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method) -" call Decho('<\s*a\s*name=\s*"'.netrw_tag.'"/') - exe 'norm! 1G/<\s*a\s*name=\s*"'.netrw_tag.'"/'."\<CR>" - endif - let b:netrw_lastfile = choice - setlocal ro - - "......................................... - " cadaver: NetRead Method #6 {{{3 - elseif b:netrw_method == 6 -" call Decho("read via cadaver (method #6)") - - " Construct execution string (four lines) which will be passed through filter - let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape) - new - setlocal ff=unix - if exists("g:netrw_port") && g:netrw_port != "" - put ='open '.g:netrw_machine.' '.g:netrw_port - else - put ='open '.g:netrw_machine - endif - put ='user '.g:netrw_uid.' '.s:netrw_passwd - put ='get '.netrw_fname.' '.tmpfile - put ='quit' - - " perform cadaver operation: - norm! 1Gdd -" call Decho("executing: %!".g:netrw_dav_cmd) - exe g:netrw_silentxfer."%!".g:netrw_dav_cmd - bd! - let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method) - let b:netrw_lastfile = choice - - "......................................... - " rsync: NetRead Method #7 {{{3 - elseif b:netrw_method == 7 -" call Decho("read via rsync (method #7)") - let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape) -" call Decho("exe ".g:netrw_silentxfer."!".g:netrw_rsync_cmd." ".g:netrw_shq.g:netrw_machine.":".netrw_fname.g:netrw_shq." ".tmpfile) - exe g:netrw_silentxfer."!".g:netrw_rsync_cmd." ".g:netrw_shq.g:netrw_machine.":".netrw_fname.g:netrw_shq." ".tmpfile - let result = s:NetrwGetFile(readcmd,tmpfile, b:netrw_method) - let b:netrw_lastfile = choice - - "......................................... - " fetch: NetRead Method #8 {{{3 - " fetch://[user@]host[:http]/path - elseif b:netrw_method == 8 -" call Decho("read via fetch (method #8)") - let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape) - if g:netrw_fetch_cmd == "" - if !exists("g:netrw_quiet") - call netrw#ErrorMsg(s:ERROR,"fetch command not available",7) - endif -" call Dret("NetRead") - endif - if exists("g:netrw_option") && g:netrw_option == ":http" - let netrw_option= "http" - else - let netrw_option= "ftp" - endif -" call Decho("read via fetch for ".netrw_option) - - if exists("g:netrw_uid") && g:netrw_uid != "" && exists("s:netrw_passwd") && s:netrw_passwd != "" -" call Decho("exe ".g:netrw_silentxfer."!".g:netrw_fetch_cmd." ".tmpfile." ".g:netrw_shq.netrw_option."://".g:netrw_uid.':'.s:netrw_passwd.'@'.g:netrw_machine."/".netrw_fname.g:netrw_shq) - exe g:netrw_silentxfer."!".g:netrw_fetch_cmd." ".tmpfile." ".g:netrw_shq.netrw_option."://".g:netrw_uid.':'.s:netrw_passwd.'@'.g:netrw_machine."/".netrw_fname.g:netrw_shq - else -" call Decho("exe ".g:netrw_silentxfer."!".g:netrw_fetch_cmd." ".tmpfile." ".g:netrw_shq.netrw_option."://".g:netrw_machine."/".netrw_fname.g:netrw_shq) - exe g:netrw_silentxfer."!".g:netrw_fetch_cmd." ".tmpfile." ".g:netrw_shq.netrw_option."://".g:netrw_machine."/".netrw_fname.g:netrw_shq - endif - - let result = s:NetrwGetFile(readcmd,tmpfile, b:netrw_method) - let b:netrw_lastfile = choice - setlocal ro - - "......................................... - " sftp: NetRead Method #9 {{{3 - elseif b:netrw_method == 9 -" call Decho("read via sftp (method #9)") - let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape) -" call Decho("exe ".g:netrw_silentxfer."!".g:netrw_sftp_cmd." ".g:netrw_shq.g:netrw_machine.":".netrw_fname.g:netrw_shq." ".tmpfile) - exe g:netrw_silentxfer."!".g:netrw_sftp_cmd." ".g:netrw_shq.g:netrw_machine.":".netrw_fname.g:netrw_shq." ".tmpfile - let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method) - let b:netrw_lastfile = choice - - "......................................... - " Complain {{{3 - else - call netrw#ErrorMsg(s:WARNING,"unable to comply with your request<" . choice . ">",8) - endif - endwhile - - " cleanup {{{3 - if exists("b:netrw_method") -" call Decho("cleanup b:netrw_method and b:netrw_fname") - unlet b:netrw_method - unlet b:netrw_fname - endif - if s:FileReadable(tmpfile) && tmpfile !~ '.tar.bz2$' && tmpfile !~ '.tar.gz$' && tmpfile !~ '.zip' && tmpfile !~ '.tar' && readcmd != 't' -" call Decho("cleanup by deleting tmpfile<".tmpfile.">") - call s:System("delete",tmpfile) - endif - call s:NetrwOptionRestore("w:") - -" call Dret("netrw#NetRead :5 getcwd<".getcwd().">") -endfun - -" ------------------------------------------------------------------------ -" netrw#NetWrite: responsible for writing a file over the net {{{2 -fun! netrw#NetWrite(...) range -" call Dfunc("netrw#NetWrite(a:0=".a:0.") ".g:loaded_netrw) - - " option handling - let mod= 0 - call s:NetrwOptionSave("w:") - call s:NetrwSafeOptions() - - " Get Temporary Filename {{{3 - let tmpfile= s:GetTempfile("") - if tmpfile == "" -" call Dret("netrw#NetWrite : unable to get a tempfile!") - return - endif - - if a:0 == 0 - let ichoice = 0 - else - let ichoice = 1 - endif - - let curbufname= expand("%") -" call Decho("curbufname<".curbufname.">") - if &binary - " For binary writes, always write entire file. - " (line numbers don't really make sense for that). - " Also supports the writing of tar and zip files. -" call Decho("(write entire file) silent exe w! ".v:cmdarg." ".tmpfile) - silent exe "w! ".v:cmdarg." ".tmpfile - elseif g:netrw_cygwin - " write (selected portion of) file to temporary - let cygtmpfile= substitute(tmpfile,'/cygdrive/\(.\)','\1:','') -" call Decho("(write selected portion) silent exe ".a:firstline."," . a:lastline . "w! ".v:cmdarg." ".cygtmpfile) - silent exe a:firstline."," . a:lastline . "w! ".v:cmdarg." ".cygtmpfile - else - " write (selected portion of) file to temporary -" call Decho("(write selected portion) silent exe ".a:firstline."," . a:lastline . "w! ".v:cmdarg." ".tmpfile) - silent exe a:firstline."," . a:lastline . "w! ".v:cmdarg." ".tmpfile - endif - - if curbufname == "" - " if the file is [No Name], and one attempts to Nwrite it, the buffer takes - " on the temporary file's name. Deletion of the temporary file during - " cleanup then causes an error message. - 0file! - endif - - " While choice loop: {{{3 - while ichoice <= a:0 - - " Process arguments: {{{4 - " attempt to repeat with previous host-file-etc - if exists("b:netrw_lastfile") && a:0 == 0 -" call Decho("using b:netrw_lastfile<" . b:netrw_lastfile . ">") - let choice = b:netrw_lastfile - let ichoice= ichoice + 1 - else - exe "let choice= a:" . ichoice - - " Reconstruct Choice if choice starts with '"' - if match(choice,"?") == 0 - echomsg 'NetWrite Usage:"' - echomsg ':Nwrite machine:path uses rcp' - echomsg ':Nwrite "machine path" uses ftp with <.netrc>' - echomsg ':Nwrite "machine id password path" uses ftp' - echomsg ':Nwrite dav://[user@]machine/path uses cadaver' - echomsg ':Nwrite fetch://[user@]machine/path uses fetch' - echomsg ':Nwrite ftp://machine[#port]/path uses ftp (autodetects <.netrc>)' - echomsg ':Nwrite rcp://machine/path uses rcp' - echomsg ':Nwrite rsync://[user@]machine/path uses rsync' - echomsg ':Nwrite scp://[user@]machine[[:#]port]/path uses scp' - echomsg ':Nwrite sftp://[user@]machine/path uses sftp' - sleep 4 - break - - elseif match(choice,"^\"") != -1 - if match(choice,"\"$") != -1 - " case "..." - let choice=strpart(choice,1,s:Strlen(choice)-2) - else - " case "... ... ..." - let choice = strpart(choice,1,s:Strlen(choice)-1) - let wholechoice = "" - - while match(choice,"\"$") == -1 - let wholechoice= wholechoice . " " . choice - let ichoice = ichoice + 1 - if choice > a:0 - if !exists("g:netrw_quiet") - call netrw#ErrorMsg(s:ERROR,"Unbalanced string in filename '". wholechoice ."'",13) - endif -" call Dret("netrw#NetWrite") - return - endif - let choice= a:{ichoice} - endwhile - let choice= strpart(wholechoice,1,s:Strlen(wholechoice)-1) . " " . strpart(choice,0,s:Strlen(choice)-1) - endif - endif - endif - let ichoice= ichoice + 1 -" call Decho("choice<" . choice . "> ichoice=".ichoice) - - " Determine method of write (ftp, rcp, etc) {{{4 - call s:NetrwMethod(choice) - - " ============= - " Perform Protocol-Based Write {{{4 - " ============================ - if exists("g:netrw_silent") && g:netrw_silent == 0 && &ch >= 1 - echo "(netrw) Processing your write request..." - endif - - "......................................... - " rcp: NetWrite Method #1 {{{4 - if b:netrw_method == 1 -" call Decho("write via rcp (method #1)") - if s:netrw_has_nt_rcp == 1 - if exists("g:netrw_uid") && ( g:netrw_uid != "" ) - let uid_machine = g:netrw_machine .'.'. g:netrw_uid - else - let uid_machine = g:netrw_machine .'.'. $USERNAME - endif - else - if exists("g:netrw_uid") && ( g:netrw_uid != "" ) - let uid_machine = g:netrw_uid .'@'. g:netrw_machine - else - let uid_machine = g:netrw_machine - endif - endif - let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape) -" call Decho("executing: !".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".g:netrw_shq.tmpfile.g:netrw_shq." ".uid_machine.":".netrw_fname) - exe g:netrw_silentxfer."!".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".g:netrw_shq.tmpfile.g:netrw_shq." ".uid_machine.":".netrw_fname - let b:netrw_lastfile = choice - - "......................................... - " ftp + <.netrc>: NetWrite Method #2 {{{4 - elseif b:netrw_method == 2 -" call Decho("write via ftp+.netrc (method #2)") - let netrw_fname= b:netrw_fname - new - setlocal ff=unix - exe "put ='".g:netrw_ftpmode."'" -" call Decho(" filter input: ".getline(".")) - if exists("g:netrw_ftpextracmd") - exe "put ='".g:netrw_ftpextracmd."'" -" call Decho("filter input: ".getline(".")) - endif - exe "put ='".'put \"'.tmpfile.'\" \"'.netrw_fname.'\"'."'" -" call Decho(" filter input: ".getline(".")) - if exists("g:netrw_port") && g:netrw_port != "" -" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port) - exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port - else -" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine) - exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".g:netrw_machine - endif - " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar) - if getline(1) !~ "^$" - if !exists("g:netrw_quiet") - call netrw#ErrorMsg(s:ERROR,getline(1),14) - endif - let mod=1 - endif - bd! - let b:netrw_lastfile = choice - - "......................................... - " ftp + machine, id, passwd, filename: NetWrite Method #3 {{{4 - elseif b:netrw_method == 3 - " Construct execution string (four lines) which will be passed through filter -" call Decho("read via ftp+mipf (method #3)") - let netrw_fname= b:netrw_fname - new - setlocal ff=unix - if exists("g:netrw_port") && g:netrw_port != "" - put ='open '.g:netrw_machine.' '.g:netrw_port -" call Decho("filter input: ".getline(".")) - else - put ='open '.g:netrw_machine -" call Decho("filter input: ".getline(".")) - endif - if exists("g:netrw_ftp") && g:netrw_ftp == 1 - put =g:netrw_uid -" call Decho("filter input: ".getline(".")) - put ='\"'.s:netrw_passwd.'\"' -" call Decho("filter input: ".getline(".")) - else - put ='user \"'.g:netrw_uid.'\" \"'.s:netrw_passwd.'\"' -" call Decho("filter input: ".getline(".")) - endif - put ='put \"'.tmpfile.'\" \"'.netrw_fname.'\"' -" call Decho("filter input: ".getline(".")) - " save choice/id/password for future use - let b:netrw_lastfile = choice - - " perform ftp: - " -i : turns off interactive prompting from ftp - " -n unix : DON'T use <.netrc>, even though it exists - " -n win32: quit being obnoxious about password - norm! 1Gdd -" call Decho("executing: %!".g:netrw_ftp_cmd." -i -n") - exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i -n" - " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar) - if getline(1) !~ "^$" - if !exists("g:netrw_quiet") - call netrw#ErrorMsg(s:ERROR,getline(1),15) - endif - let mod=1 - endif - bd! - - "......................................... - " scp: NetWrite Method #4 {{{4 - elseif b:netrw_method == 4 -" call Decho("write via scp (method #4)") - let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape) - if exists("g:netrw_port") && g:netrw_port != "" - let useport= " ".g:netrw_scpport." ".g:netrw_port - else - let useport= "" - endif -" call Decho("exe ".g:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".g:netrw_shq.tmpfile.g:netrw_shq." ".g:netrw_shq.g:netrw_machine.":".netrw_fname.g:netrw_shq) - exe g:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".g:netrw_shq.tmpfile.g:netrw_shq." ".g:netrw_shq.g:netrw_machine.":".netrw_fname.g:netrw_shq - let b:netrw_lastfile = choice - - "......................................... - " http: NetWrite Method #5 {{{4 - elseif b:netrw_method == 5 -" call Decho("write via http (method #5)") - if !exists("g:netrw_quiet") - call netrw#ErrorMsg(s:ERROR,"currently <netrw.vim> does not support writing using http:",16) - endif - - "......................................... - " dav: NetWrite Method #6 (cadaver) {{{4 - elseif b:netrw_method == 6 -" call Decho("write via cadaver (method #6)") - - " Construct execution string (four lines) which will be passed through filter - let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape) - new - setlocal ff=unix - if exists("g:netrw_port") && g:netrw_port != "" - put ='open '.g:netrw_machine.' '.g:netrw_port - else - put ='open '.g:netrw_machine - endif - put ='user '.g:netrw_uid.' '.s:netrw_passwd - put ='put '.tmpfile.' '.netrw_fname - - " perform cadaver operation: - norm! 1Gdd -" call Decho("executing: %!".g:netrw_dav_cmd) - exe g:netrw_silentxfer."%!".g:netrw_dav_cmd - bd! - let b:netrw_lastfile = choice - - "......................................... - " rsync: NetWrite Method #7 {{{4 - elseif b:netrw_method == 7 -" call Decho("write via rsync (method #7)") - let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape) -" call Decho("executing: !".g:netrw_rsync_cmd." ".tmpfile." ".g:netrw_machine.":".netrw_fname) - exe g:netrw_silentxfer."!".g:netrw_rsync_cmd." ".tmpfile." ".g:netrw_machine.":".netrw_fname - let b:netrw_lastfile = choice - - "......................................... - " sftp: NetWrite Method #9 {{{4 - elseif b:netrw_method == 9 -" call Decho("read via sftp (method #9)") - let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape) - if exists("g:netrw_uid") && ( g:netrw_uid != "" ) - let uid_machine = g:netrw_uid .'@'. g:netrw_machine - else - let uid_machine = g:netrw_machine - endif - new - setlocal ff=unix - put ='put \"'.escape(tmpfile,'\').'\" '.netrw_fname -" call Decho("filter input: ".getline(".")) - norm! 1Gdd -" call Decho("executing: %!".g:netrw_sftp_cmd.' '.uid_machine) - exe g:netrw_silentxfer."%!".g:netrw_sftp_cmd.' '.uid_machine - bd! - let b:netrw_lastfile= choice - - "......................................... - " Complain {{{4 - else - call netrw#ErrorMsg(s:WARNING,"unable to comply with your request<" . choice . ">",17) - endif - endwhile - - " Cleanup: {{{3 -" call Decho("cleanup") - if s:FileReadable(tmpfile) -" call Decho("tmpfile<".tmpfile."> readable, will now delete it") - call s:System("delete",tmpfile) - endif - call s:NetrwOptionRestore("w:") - - if a:firstline == 1 && a:lastline == line("$") - " restore modifiability; usually equivalent to set nomod - let &mod= mod - endif - -" call Dret("netrw#NetWrite") -endfun - -" --------------------------------------------------------------------- -" netrw#NetSource: source a remotely hosted vim script {{{2 -" uses NetRead to get a copy of the file into a temporarily file, -" then sources that file, -" then removes that file. -fun! netrw#NetSource(...) -" call Dfunc("netrw#NetSource() a:0=".a:0) - if a:0 > 0 && a:1 == '?' - " give help - echomsg 'NetSource Usage:' - echomsg ':Nsource dav://machine[:port]/path uses cadaver' - echomsg ':Nsource fetch://machine/path uses fetch' - echomsg ':Nsource ftp://[user@]machine[:port]/path uses ftp autodetects <.netrc>' - echomsg ':Nsource http://[user@]machine/path uses http wget' - echomsg ':Nsource rcp://[user@]machine/path uses rcp' - echomsg ':Nsource rsync://machine[:port]/path uses rsync' - echomsg ':Nsource scp://[user@]machine[[:#]port]/path uses scp' - echomsg ':Nsource sftp://[user@]machine[[:#]port]/path uses sftp' - sleep 4 - else - let i= 1 - while i <= a:0 - call netrw#NetRead(3,a:{i}) -" call Decho("s:netread_tmpfile<".s:netrw_tmpfile.">") - if s:FileReadable(s:netrw_tmpfile) -" call Decho("exe so ".s:netrw_tmpfile) - exe "so ".s:netrw_tmpfile - call delete(s:netrw_tmpfile) - unlet s:netrw_tmpfile - else - call netrw#ErrorMsg(s:ERROR,"unable to source <".a:{i}.">!",48) - endif - let i= i + 1 - endwhile - endif -" call Dret("netrw#NetSource") -endfun - -" =========================================== -" s:NetrwGetFile: Function to read temporary file "tfile" with command "readcmd". {{{2 -" readcmd == %r : replace buffer with newly read file -" == 0r : read file at top of buffer -" == r : read file after current line -" == t : leave file in temporary form (ie. don't read into buffer) -fun! s:NetrwGetFile(readcmd, tfile, method) -" call Dfunc("NetrwGetFile(readcmd<".a:readcmd.">,tfile<".a:tfile."> method<".a:method.">)") - - " readcmd=='t': simply do nothing - if a:readcmd == 't' -" call Decho("ro=".&ro." ma=".&ma." mod=".&mod." wrap=".&wrap) -" call Dret("NetrwGetFile : skip read of <".a:tfile.">") - return - endif - - " get name of remote filename (ie. url and all) - let rfile= bufname("%") -" call Decho("rfile<".rfile.">") - - if exists("*NetReadFixup") - " for the use of NetReadFixup (not otherwise used internally) - let line2= line("$") - endif - - if a:readcmd[0] == '%' - " get file into buffer -" call Decho("get file into buffer") - - " rename the current buffer to the temp file (ie. tfile) - if g:netrw_cygwin - let tfile= substitute(a:tfile,'/cygdrive/\(.\)','\1:','') - else - let tfile= a:tfile - endif -" " call Decho("exe silent! keepalt file ".tfile) - exe "silent! keepalt file ".tfile - - " edit temporary file (ie. read the temporary file in) - if rfile =~ '\.zip$' -" call Decho("handling remote zip file with zip#Browse(tfile<".tfile.">)") - call zip#Browse(tfile) - elseif rfile =~ '\.tar$' -" call Decho("handling remote tar file with tar#Browse(tfile<".tfile.">)") - call tar#Browse(tfile) - elseif rfile =~ '\.tar\.gz' -" call Decho("handling remote gzip-compressed tar file") - call tar#Browse(tfile) - elseif rfile =~ '\.tar\.bz2' -" call Decho("handling remote bz2-compressed tar file") - call tar#Browse(tfile) - else -" call Decho("edit temporary file") - e! - endif - - " rename buffer back to remote filename -" call Decho("exe silent! keepalt file ".escape(rfile,' ')) - exe "silent! keepalt file ".escape(rfile,' ') - if a:method == 5 - set ft=html - else - filetype detect - endif -" call Dredir("renamed buffer back to remote filename<".rfile."> : expand(%)<".expand("%").">","ls!") - let line1 = 1 - let line2 = line("$") - - elseif s:FileReadable(a:tfile) - " read file after current line -" call Decho("read file<".a:tfile."> after current line") - let curline = line(".") - let lastline= line("$") -" call Decho("exe<".a:readcmd." ".v:cmdarg." ".a:tfile."> line#".curline) - exe a:readcmd." ".v:cmdarg." ".a:tfile - let line1= curline + 1 - let line2= line("$") - lastline + 1 - - else - " not readable -" call Decho("ro=".&ro." ma=".&ma." mod=".&mod." wrap=".&wrap) -" call Decho("tfile<".a:tfile."> not readable") - call netrw#ErrorMsg(s:WARNING,"file <".a:tfile."> not readable",9) -" call Dret("NetrwGetFile : tfile<".a:tfile."> not readable") - return - endif - - " User-provided (ie. optional) fix-it-up command - if exists("*NetReadFixup") -" call Decho("calling NetReadFixup(method<".a:method."> line1=".line1." line2=".line2.")") - call NetReadFixup(a:method, line1, line2) -" else " Decho -" call Decho("NetReadFixup() not called, doesn't exist (line1=".line1." line2=".line2.")") - endif - - if has("gui") && has("menu") && has("gui_running") && &go =~ 'm' - " update the Buffers menu - call s:UpdateBuffersMenu() - endif - -" call Decho("readcmd<".a:readcmd."> cmdarg<".v:cmdarg."> tfile<".a:tfile."> readable=".s:FileReadable(a:tfile)) - - " make sure file is being displayed -" redraw! - -" call Decho("ro=".&ro." ma=".&ma." mod=".&mod." wrap=".&wrap) -" call Dret("NetrwGetFile") -endfun - -" ------------------------------------------------------------------------ -" s:NetrwMethod: determine method of transfer {{{2 -" method == 1: rcp -" 2: ftp + <.netrc> -" 3: ftp + machine, id, password, and [path]filename -" 4: scp -" 5: http (wget) -" 6: cadaver -" 7: rsync -" 8: fetch -" 9: sftp -fun! s:NetrwMethod(choice) " globals: method machine id passwd fname -" call Dfunc("NetrwMethod(a:choice<".a:choice.">)") - - " initialization - let b:netrw_method = 0 - let g:netrw_machine = "" - let b:netrw_fname = "" - let g:netrw_port = "" - let g:netrw_choice = a:choice - - " Patterns: - " mipf : a:machine a:id password filename Use ftp - " mf : a:machine filename Use ftp + <.netrc> or g:netrw_uid s:netrw_passwd - " ftpurm : ftp://[user@]host[[#:]port]/filename Use ftp + <.netrc> or g:netrw_uid s:netrw_passwd - " rcpurm : rcp://[user@]host/filename Use rcp - " rcphf : [user@]host:filename Use rcp - " scpurm : scp://[user@]host[[#:]port]/filename Use scp - " httpurm : http://[user@]host/filename Use wget - " davurm : [s]dav://host[:port]/path Use cadaver - " rsyncurm : rsync://host[:port]/path Use rsync - " fetchurm : fetch://[user@]host[:http]/filename Use fetch (defaults to ftp, override for http) - " sftpurm : sftp://[user@]host/filename Use scp - let mipf = '^\(\S\+\)\s\+\(\S\+\)\s\+\(\S\+\)\s\+\(\S\+\)$' - let mf = '^\(\S\+\)\s\+\(\S\+\)$' - let ftpurm = '^ftp://\(\([^/@]\{-}\)@\)\=\([^/#:]\{-}\)\([#:]\d\+\)\=/\(.*\)$' - let rcpurm = '^rcp://\%(\([^/@]\{-}\)@\)\=\([^/]\{-}\)/\(.*\)$' - let rcphf = '^\(\(\h\w*\)@\)\=\(\h\w*\):\([^@]\+\)$' - let scpurm = '^scp://\([^/#:]\+\)\%([#:]\(\d\+\)\)\=/\(.*\)$' - let httpurm = '^http://\([^/]\{-}\)\(/.*\)\=$' - let davurm = '^s\=dav://\([^/]\+\)/\(.*/\)\([-_.~[:alnum:]]\+\)$' - let rsyncurm = '^rsync://\([^/]\{-}\)/\(.*\)\=$' - let fetchurm = '^fetch://\(\([^/@]\{-}\)@\)\=\([^/#:]\{-}\)\(:http\)\=/\(.*\)$' - let sftpurm = '^sftp://\([^/]\{-}\)/\(.*\)\=$' - -" call Decho("determine method:") - " Determine Method - " rcp://user@hostname/...path-to-file - if match(a:choice,rcpurm) == 0 -" call Decho("rcp://...") - let b:netrw_method = 1 - let userid = substitute(a:choice,rcpurm,'\1',"") - let g:netrw_machine = substitute(a:choice,rcpurm,'\2',"") - let b:netrw_fname = substitute(a:choice,rcpurm,'\3',"") - if userid != "" - let g:netrw_uid= userid - endif - - " scp://user@hostname/...path-to-file - elseif match(a:choice,scpurm) == 0 -" call Decho("scp://...") - let b:netrw_method = 4 - let g:netrw_machine = substitute(a:choice,scpurm,'\1',"") - let g:netrw_port = substitute(a:choice,scpurm,'\2',"") - let b:netrw_fname = substitute(a:choice,scpurm,'\3',"") - - " http://user@hostname/...path-to-file - elseif match(a:choice,httpurm) == 0 -" call Decho("http://...") - let b:netrw_method = 5 - let g:netrw_machine= substitute(a:choice,httpurm,'\1',"") - let b:netrw_fname = substitute(a:choice,httpurm,'\2',"") - - " dav://hostname[:port]/..path-to-file.. - elseif match(a:choice,davurm) == 0 -" call Decho("dav://...") - let b:netrw_method= 6 - if a:choice =~ '^s' - let g:netrw_machine= 'https://'.substitute(a:choice,davurm,'\1/\2',"") - else - let g:netrw_machine= 'http://'.substitute(a:choice,davurm,'\1/\2',"") - endif - let b:netrw_fname = substitute(a:choice,davurm,'\3',"") - - " rsync://user@hostname/...path-to-file - elseif match(a:choice,rsyncurm) == 0 -" call Decho("rsync://...") - let b:netrw_method = 7 - let g:netrw_machine= substitute(a:choice,rsyncurm,'\1',"") - let b:netrw_fname = substitute(a:choice,rsyncurm,'\2',"") - - " ftp://[user@]hostname[[:#]port]/...path-to-file - elseif match(a:choice,ftpurm) == 0 -" call Decho("ftp://...") - let userid = substitute(a:choice,ftpurm,'\2',"") - let g:netrw_machine= substitute(a:choice,ftpurm,'\3',"") - let g:netrw_port = substitute(a:choice,ftpurm,'\4',"") - let b:netrw_fname = substitute(a:choice,ftpurm,'\5',"") - if userid != "" - let g:netrw_uid= userid - endif - if exists("g:netrw_uid") && exists("s:netrw_passwd") - let b:netrw_method = 3 - else - if s:FileReadable(expand("$HOME/.netrc")) && !g:netrw_ignorenetrc - let b:netrw_method= 2 - else - if !exists("g:netrw_uid") || g:netrw_uid == "" - call NetUserPass() - elseif !exists("s:netrw_passwd") || s:netrw_passwd == "" - call NetUserPass(g:netrw_uid) - " else just use current g:netrw_uid and s:netrw_passwd - endif - let b:netrw_method= 3 - endif - endif - - elseif match(a:choice,fetchurm) == 0 -" call Decho("fetch://...") - let b:netrw_method = 8 - let g:netrw_userid = substitute(a:choice,fetchurm,'\2',"") - let g:netrw_machine= substitute(a:choice,fetchurm,'\3',"") - let b:netrw_option = substitute(a:choice,fetchurm,'\4',"") - let b:netrw_fname = substitute(a:choice,fetchurm,'\5',"") - - " Issue an ftp : "machine id password [path/]filename" - elseif match(a:choice,mipf) == 0 -" call Decho("(ftp) host id pass file") - let b:netrw_method = 3 - let g:netrw_machine = substitute(a:choice,mipf,'\1',"") - let g:netrw_uid = substitute(a:choice,mipf,'\2',"") - let s:netrw_passwd = substitute(a:choice,mipf,'\3',"") - let b:netrw_fname = substitute(a:choice,mipf,'\4',"") - - " Issue an ftp: "hostname [path/]filename" - elseif match(a:choice,mf) == 0 -" call Decho("(ftp) host file") - if exists("g:netrw_uid") && exists("s:netrw_passwd") - let b:netrw_method = 3 - let g:netrw_machine = substitute(a:choice,mf,'\1',"") - let b:netrw_fname = substitute(a:choice,mf,'\2',"") - - elseif s:FileReadable(expand("$HOME/.netrc")) - let b:netrw_method = 2 - let g:netrw_machine = substitute(a:choice,mf,'\1',"") - let b:netrw_fname = substitute(a:choice,mf,'\2',"") - endif - - " sftp://user@hostname/...path-to-file - elseif match(a:choice,sftpurm) == 0 -" call Decho("sftp://...") - let b:netrw_method = 9 - let g:netrw_machine= substitute(a:choice,sftpurm,'\1',"") - let b:netrw_fname = substitute(a:choice,sftpurm,'\2',"") - - " Issue an rcp: hostname:filename" (this one should be last) - elseif match(a:choice,rcphf) == 0 -" call Decho("(rcp) [user@]host:file) rcphf<".rcphf.">") - let b:netrw_method = 1 - let userid = substitute(a:choice,rcphf,'\2',"") - let g:netrw_machine= substitute(a:choice,rcphf,'\3',"") - let b:netrw_fname = substitute(a:choice,rcphf,'\4',"") -" call Decho('\1<'.substitute(a:choice,rcphf,'\1',"").">") -" call Decho('\2<'.substitute(a:choice,rcphf,'\2',"").">") -" call Decho('\3<'.substitute(a:choice,rcphf,'\3',"").">") -" call Decho('\4<'.substitute(a:choice,rcphf,'\4',"").">") - if userid != "" - let g:netrw_uid= userid - endif - - else - if !exists("g:netrw_quiet") - call netrw#ErrorMsg(s:WARNING,"cannot determine method",45) - endif - let b:netrw_method = -1 - endif - - " remove any leading [:#] from port number - if g:netrw_port != "" - let g:netrw_port = substitute(g:netrw_port,'[#:]\+','','') - endif - -" call Decho("a:choice <".a:choice.">") -" call Decho("b:netrw_method <".b:netrw_method.">") -" call Decho("g:netrw_machine<".g:netrw_machine.">") -" call Decho("g:netrw_port <".g:netrw_port.">") -" if exists("g:netrw_uid") "Decho -" call Decho("g:netrw_uid <".g:netrw_uid.">") -" endif "Decho -" if exists("s:netrw_passwd") "Decho -" call Decho("s:netrw_passwd <".s:netrw_passwd.">") -" endif "Decho -" call Decho("b:netrw_fname <".b:netrw_fname.">") -" call Dret("NetrwMethod : b:netrw_method=".b:netrw_method) -endfun - -" ------------------------------------------------------------------------ -" NetReadFixup: this sort of function is typically written by the user {{{2 -" to handle extra junk that their system's ftp dumps -" into the transfer. This function is provided as an -" example and as a fix for a Windows 95 problem: in my -" experience, win95's ftp always dumped four blank lines -" at the end of the transfer. -if has("win95") && exists("g:netrw_win95ftp") && g:netrw_win95ftp - fun! NetReadFixup(method, line1, line2) -" call Dfunc("NetReadFixup(method<".a:method."> line1=".a:line1." line2=".a:line2.")") - if method == 3 " ftp (no <.netrc>) - let fourblanklines= line2 - 3 - silent fourblanklines.",".line2."g/^\s*/d" - endif -" call Dret("NetReadFixup") - endfun -endif - -" --------------------------------------------------------------------- -" NetUserPass: set username and password for subsequent ftp transfer {{{2 -" Usage: :call NetUserPass() -- will prompt for userid and password -" :call NetUserPass("uid") -- will prompt for password -" :call NetUserPass("uid","password") -- sets global userid and password -fun! NetUserPass(...) - - " get/set userid - if a:0 == 0 -" call Dfunc("NetUserPass(a:0<".a:0.">)") - if !exists("g:netrw_uid") || g:netrw_uid == "" - " via prompt - let g:netrw_uid= input('Enter username: ') - endif - else " from command line -" call Dfunc("NetUserPass(a:1<".a:1.">) {") - let g:netrw_uid= a:1 - endif - - " get password - if a:0 <= 1 " via prompt -" call Decho("a:0=".a:0." case <=1:") - let s:netrw_passwd= inputsecret("Enter Password: ") - else " from command line -" call Decho("a:0=".a:0." case >1: a:2<".a:2.">") - let s:netrw_passwd=a:2 - endif - -" call Dret("NetUserPass") -endfun - -" =========================================== -" Shared Browsing Support: {{{1 -" =========================================== - -" --------------------------------------------------------------------- -" s:BrowserMaps: {{{2 -fun! s:BrowserMaps(islocal) -" call Dfunc("s:BrowserMaps(islocal=".a:islocal.") b:netrw_curdir<".b:netrw_curdir.">") - if a:islocal - nnoremap <buffer> <silent> <cr> :call netrw#LocalBrowseCheck(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord()))<cr> - nnoremap <buffer> <silent> - :exe "norm! 0"<bar>call netrw#LocalBrowseCheck(<SID>NetrwBrowseChgDir(1,'../'))<cr> - nnoremap <buffer> <silent> a :call <SID>NetrwHide(1)<cr> - nnoremap <buffer> <silent> mb :<c-u>call <SID>NetrwBookmarkDir(0,b:netrw_curdir)<cr> - nnoremap <buffer> <silent> mc :<c-u>call <SID>NetrwMarkFileCopy(1)<cr> - nnoremap <buffer> <silent> md :<c-u>call <SID>NetrwMarkFileDiff(1)<cr> - nnoremap <buffer> <silent> me :<c-u>call <SID>NetrwMarkFileEdit(1)<cr> - nnoremap <buffer> <silent> mf :<c-u>call <SID>NetrwMarkFile(1,<SID>NetrwGetWord())<cr> - nnoremap <buffer> <silent> mh :<c-u>call <SID>NetrwMarkHideSfx(1)<cr> - nnoremap <buffer> <silent> mm :<c-u>call <SID>NetrwMarkFileMove(1)<cr> - nnoremap <buffer> <silent> mp :<c-u>call <SID>NetrwMarkFilePrint(1)<cr> - nnoremap <buffer> <silent> mr :<c-u>call <SID>NetrwMarkFileRegexp(1)<cr> - nnoremap <buffer> <silent> ms :<c-u>call <SID>NetrwMarkFileSource(1)<cr> - nnoremap <buffer> <silent> mT :<c-u>call <SID>NetrwMarkFileTag(1)<cr> - nnoremap <buffer> <silent> mt :<c-u>call <SID>NetrwMarkFileTgt(1)<cr> - nnoremap <buffer> <silent> mu :<c-u>call <SID>NetrwUnMarkFile(1)<cr> - nnoremap <buffer> <silent> mx :<c-u>call <SID>NetrwMarkFileExe(1)<cr> - nnoremap <buffer> <silent> mz :<c-u>call <SID>NetrwMarkFileCompress(1)<cr> - nnoremap <buffer> <silent> gb :<c-u>call <SID>NetrwBookmarkDir(1,b:netrw_curdir)<cr> - nnoremap <buffer> <silent> gh :<c-u>call <SID>NetrwHidden(1)<cr> - nnoremap <buffer> <silent> c :exe "lcd ".escape(b:netrw_curdir,g:netrw_cd_escape)<cr> - nnoremap <buffer> <silent> C :let g:netrw_chgwin= winnr()<cr> - nnoremap <buffer> <silent> d :call <SID>NetrwMakeDir("")<cr> - nnoremap <buffer> <silent> i :call <SID>NetrwListStyle(1)<cr> - nnoremap <buffer> <silent> o :call <SID>NetrwSplit(3)<cr> - nnoremap <buffer> <silent> O :call <SID>NetrwObtain(0)<cr> - nnoremap <buffer> <silent> p :call <SID>NetrwPreview(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord(),1))<cr> - nnoremap <buffer> <silent> P :call <SID>NetrwPrevWinOpen(1)<cr> - nnoremap <buffer> <silent> qb :<c-u>call <SID>NetrwBookmarkDir(2,b:netrw_curdir)<cr> - nnoremap <buffer> <silent> qf :<c-u>call <SID>NetrwFileInfo(1,<SID>NetrwGetWord())<cr> - nnoremap <buffer> <silent> r :let g:netrw_sort_direction= (g:netrw_sort_direction =~ 'n')? 'r' : 'n'<bar>exe "norm! 0"<bar>call <SID>NetrwRefresh(1,<SID>NetrwBrowseChgDir(1,'./'))<cr> - nnoremap <buffer> <silent> s :call <SID>NetrwSortStyle(1)<cr> - nnoremap <buffer> <silent> S :call <SID>NetSortSequence(1)<cr> - nnoremap <buffer> <silent> t :call <SID>NetrwSplit(4)<cr> - nnoremap <buffer> <silent> u :<c-u>call <SID>NetrwBookmarkDir(4,expand("%"))<cr> - nnoremap <buffer> <silent> U :<c-u>call <SID>NetrwBookmarkDir(5,expand("%"))<cr> - nnoremap <buffer> <silent> v :call <SID>NetrwSplit(5)<cr> - nnoremap <buffer> <silent> x :call netrw#NetrwBrowseX(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord(),0),0)"<cr> - if !hasmapto('<Plug>NetrwHideEdit') - nmap <buffer> <unique> <c-h> <Plug>NetrwHideEdit - endif - nnoremap <buffer> <silent> <Plug>NetrwHideEdit :call <SID>NetrwHideEdit(1)<cr> - if !hasmapto('<Plug>NetrwRefresh') - nmap <buffer> <unique> <c-l> <Plug>NetrwRefresh - endif - nnoremap <buffer> <silent> <Plug>NetrwRefresh :call <SID>NetrwRefresh(1,<SID>NetrwBrowseChgDir(1,'./'))<cr> - if s:didstarstar || !mapcheck("<s-down>","n") - nnoremap <buffer> <silent> <s-down> :Nexplore<cr> - endif - if s:didstarstar || !mapcheck("<s-up>","n") - nnoremap <buffer> <silent> <s-up> :Pexplore<cr> - endif - if g:netrw_mousemaps == 1 - nnoremap <buffer> <silent> <leftmouse> <leftmouse>:call <SID>NetrwLeftmouse(1)<cr> - nnoremap <buffer> <silent> <middlemouse> <leftmouse>:call <SID>NetrwPrevWinOpen(1)<cr> - nnoremap <buffer> <silent> <s-leftmouse> <leftmouse>:call <SID>NetrwMarkFile(1,<SID>NetrwGetWord())<cr> - exe 'nnoremap <buffer> <silent> <rightmouse> <leftmouse>:call <SID>NetrwLocalRm("'.b:netrw_curdir.'")<cr>' - exe 'vnoremap <buffer> <silent> <rightmouse> <leftmouse>:call <SID>NetrwLocalRm("'.b:netrw_curdir.'")<cr>' - endif - exe 'nnoremap <buffer> <silent> <del> :call <SID>NetrwLocalRm("'.b:netrw_curdir.'")<cr>' - exe 'vnoremap <buffer> <silent> <del> :call <SID>NetrwLocalRm("'.b:netrw_curdir.'")<cr>' - exe 'nnoremap <buffer> <silent> D :call <SID>NetrwLocalRm("'.b:netrw_curdir.'")<cr>' - exe 'vnoremap <buffer> <silent> D :call <SID>NetrwLocalRm("'.b:netrw_curdir.'")<cr>' - exe 'nnoremap <buffer> <silent> R :call <SID>NetrwLocalRename("'.b:netrw_curdir.'")<cr>' - exe 'vnoremap <buffer> <silent> R :call <SID>NetrwLocalRename("'.b:netrw_curdir.'")<cr>' - exe 'nnoremap <buffer> <silent> <Leader>m :call <SID>NetrwMakeDir("")<cr>' - nnoremap <buffer> <F1> :he netrw-dir<cr> - - else " remote - call s:RemotePathAnalysis(b:netrw_curdir) - nnoremap <buffer> <silent> <cr> :call <SID>NetrwBrowse(0,<SID>NetrwBrowseChgDir(0,<SID>NetrwGetWord()))<cr> - nnoremap <buffer> <silent> <c-l> :call <SID>NetrwRefresh(0,<SID>NetrwBrowseChgDir(0,'./'))<cr> - nnoremap <buffer> <silent> - :exe "norm! 0"<bar>call <SID>NetrwBrowse(0,<SID>NetrwBrowseChgDir(0,'../'))<cr> - nnoremap <buffer> <silent> a :call <SID>NetrwHide(0)<cr> - nnoremap <buffer> <silent> mb :<c-u>call <SID>NetrwBookmarkDir(0,b:netrw_curdir)<cr> - nnoremap <buffer> <silent> mc :<c-u>call <SID>NetrwMarkFileCopy(0)<cr> - nnoremap <buffer> <silent> md :<c-u>call <SID>NetrwMarkFileDiff(0)<cr> - nnoremap <buffer> <silent> me :<c-u>call <SID>NetrwMarkFileEdit(0)<cr> - nnoremap <buffer> <silent> mf :<c-u>call <SID>NetrwMarkFile(0,<SID>NetrwGetWord())<cr> - nnoremap <buffer> <silent> mh :<c-u>call <SID>NetrwMarkHideSfx(0)<cr> - nnoremap <buffer> <silent> mm :<c-u>call <SID>NetrwMarkFileMove(0)<cr> - nnoremap <buffer> <silent> mp :<c-u>call <SID>NetrwMarkFilePrint(0)<cr> - nnoremap <buffer> <silent> mr :<c-u>call <SID>NetrwMarkFileRegexp(0)<cr> - nnoremap <buffer> <silent> ms :<c-u>call <SID>NetrwMarkFileSource(0)<cr> - nnoremap <buffer> <silent> mT :<c-u>call <SID>NetrwMarkFileTag(0)<cr> - nnoremap <buffer> <silent> mt :<c-u>call <SID>NetrwMarkFileTgt(0)<cr> - nnoremap <buffer> <silent> mu :<c-u>call <SID>NetrwUnMarkFile(0)<cr> - nnoremap <buffer> <silent> mx :<c-u>call <SID>NetrwMarkFileExe(0)<cr> - nnoremap <buffer> <silent> mz :<c-u>call <SID>NetrwMarkFileCompress(0)<cr> - nnoremap <buffer> <silent> gb :<c-u>call <SID>NetrwBookmarkDir(1,b:netrw_cur)<cr> - nnoremap <buffer> <silent> gh :<c-u>call <SID>NetrwHidden(0)<cr> - nnoremap <buffer> <silent> C :let g:netrw_chgwin= winnr()<cr> - nnoremap <buffer> <silent> i :call <SID>NetrwListStyle(0)<cr> - nnoremap <buffer> <silent> o :call <SID>NetrwSplit(0)<cr> - nnoremap <buffer> <silent> O :call <SID>NetrwObtain(0)<cr> - nnoremap <buffer> <silent> p :call <SID>NetrwPreview(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord(),1))<cr> - nnoremap <buffer> <silent> P :call <SID>NetrwPrevWinOpen(0)<cr> - nnoremap <buffer> <silent> qb :<c-u>call <SID>NetrwBookmarkDir(2,b:netrw_curdir)<cr> - nnoremap <buffer> <silent> qf :<c-u>call <SID>NetrwFileInfo(0,<SID>NetrwGetWord())<cr> - nnoremap <buffer> <silent> r :let g:netrw_sort_direction= (g:netrw_sort_direction =~ 'n')? 'r' : 'n'<bar>exe "norm! 0"<bar>call <SID>NetrwBrowse(0,<SID>NetrwBrowseChgDir(0,'./'))<cr> - nnoremap <buffer> <silent> s :call <SID>NetrwSortStyle(0)<cr> - nnoremap <buffer> <silent> S :call <SID>NetSortSequence(0)<cr> - nnoremap <buffer> <silent> t :call <SID>NetrwSplit(1)<cr> - nnoremap <buffer> <silent> u :<c-u>call <SID>NetrwBookmarkDir(4,b:netrw_curdir)<cr> - nnoremap <buffer> <silent> U :<c-u>call <SID>NetrwBookmarkDir(5,b:netrw_curdir)<cr> - nnoremap <buffer> <silent> v :call <SID>NetrwSplit(2)<cr> - nnoremap <buffer> <silent> x :call netrw#NetrwBrowseX(<SID>NetrwBrowseChgDir(0,<SID>NetrwGetWord()),1)<cr> - if !hasmapto('<Plug>NetrwHideEdit') - nmap <buffer> <c-h> <Plug>NetrwHideEdit - endif - nnoremap <buffer> <silent> <Plug>NetrwHideEdit :call <SID>NetrwHideEdit(0)<cr> - if !hasmapto('<Plug>NetrwRefresh') - nmap <buffer> <c-l> <Plug>NetrwRefresh - endif - nnoremap <buffer> <silent> <Plug>NetrwRefresh :call <SID>NetrwRefresh(0,<SID>NetrwBrowseChgDir(0,'./'))<cr> - if g:netrw_mousemaps == 1 - nnoremap <buffer> <silent> <leftmouse> <leftmouse>:call <SID>NetrwLeftmouse(0)<cr> - nnoremap <buffer> <silent> <middlemouse> <leftmouse>:call <SID>NetrwPrevWinOpen(0)<cr> - nnoremap <buffer> <silent> <s-leftmouse> <leftmouse>:call <SID>NetrwMarkFile(0,<SID>NetrwGetWord())<cr> - exe 'nnoremap <buffer> <silent> <rightmouse> <leftmouse>:call <SID>NetrwRemoteRm("'.s:user.s:machine.'","'.s:path.'")<cr>' - exe 'vnoremap <buffer> <silent> <rightmouse> <leftmouse>:call <SID>NetrwRemoteRm("'.s:user.s:machine.'","'.s:path.'")<cr>' - endif - exe 'nnoremap <buffer> <silent> <del> :call <SID>NetrwRemoteRm("'.s:user.s:machine.'","'.s:path.'")<cr>' - exe 'vnoremap <buffer> <silent> <del> :call <SID>NetrwRemoteRm("'.s:user.s:machine.'","'.s:path.'")<cr>' - exe 'nnoremap <buffer> <silent> d :call <SID>NetrwMakeDir("'.s:user.s:machine.'")<cr>' - exe 'nnoremap <buffer> <silent> D :call <SID>NetrwRemoteRm("'.s:user.s:machine.'","'.s:path.'")<cr>' - exe 'vnoremap <buffer> <silent> D :call <SID>NetrwRemoteRm("'.s:user.s:machine.'","'.s:path.'")<cr>' - exe 'nnoremap <buffer> <silent> R :call <SID>NetrwRemoteRename("'.s:user.s:machine.'","'.s:path.'")<cr>' - exe 'vnoremap <buffer> <silent> R :call <SID>NetrwRemoteRename("'.s:user.s:machine.'","'.s:path.'")<cr>' - nnoremap <buffer> <F1> :he netrw-browse-cmds<cr> - endif - call s:SetRexDir(a:islocal,b:netrw_curdir) -" call Dret("s:BrowserMaps") -endfun - -" --------------------------------------------------------------------- -" s:ExplorePatHls: converts an Explore pattern into a regular expression search pattern {{{2 -fun! s:ExplorePatHls(pattern) -" call Dfunc("s:ExplorePatHls(pattern<".a:pattern.">)") - let repat= substitute(a:pattern,'^**/\{1,2}','','') -" call Decho("repat<".repat.">") - let repat= escape(repat,'][.\') -" call Decho("repat<".repat.">") - let repat= '\<'.substitute(repat,'\*','\\(\\S\\+ \\)*\\S\\+','g').'\>' -" call Dret("s:ExplorePatHls repat<".repat.">") - return repat -endfun - -" --------------------------------------------------------------------- -" s:NetrwBookmarkDir: {{{2 -" 0: (user: <b>) bookmark current directory -" 1: (user: <B>) change to the bookmarked directory -" 2: (user: <q>) list bookmarks -" 3: (browsing) record current directory history -" 4: (user: <u>) go up (previous) bookmark -" 5: (user: <U>) go down (next) bookmark -fun! s:NetrwBookmarkDir(chg,curdir) -" call Dfunc("NetrwBookmarkDir(chg=".a:chg." curdir<".a:curdir.">) cnt=".v:count." bookmarkcnt=".g:NETRW_BOOKMARKMAX." histcnt=".g:NETRW_DIRHIST_CNT." bookmax=".g:NETRW_BOOKMARKMAX." histmax=".g:netrw_dirhistmax) - - if a:chg == 0 - " bookmark the current directory -" call Decho("(user: <b>) bookmark the current directory") - if v:count > 0 - " handle bookmark# specified via the count - let g:NETRW_BOOKMARKDIR_{v:count}= a:curdir - if !exists("g:NETRW_BOOKMARKMAX") - let g:NETRW_BOOKMARKMAX= v:count - elseif v:count > g:NETRW_BOOKMARKMAX - let g:NETRW_BOOKMARKMAX= v:count - endif - else - " handle no count specified - let g:NETRW_BOOKMARKMAX = g:NETRW_BOOKMARKMAX + 1 - let g:NETRW_BOOKMARKDIR_{g:NETRW_BOOKMARKMAX} = a:curdir - endif - echo "bookmarked the current directory" - - elseif a:chg == 1 - " change to the bookmarked directory -" call Decho("(user: <B>) change to the bookmarked directory") - if exists("g:NETRW_BOOKMARKDIR_{v:count}") - exe "e ".g:NETRW_BOOKMARKDIR_{v:count} - else - echomsg "Sorry, bookmark#".v:count." doesn't exist!" - endif - - elseif a:chg == 2 -" redraw! - let didwork= 0 - " list user's bookmarks -" call Decho("(user: <q>) list user's bookmarks") - if exists("g:NETRW_BOOKMARKMAX") -" call Decho("list bookmarks [0,".g:NETRW_BOOKMARKMAX."]") - let cnt= 0 - while cnt <= g:NETRW_BOOKMARKMAX - if exists("g:NETRW_BOOKMARKDIR_{cnt}") -" call Decho("Netrw Bookmark#".cnt.": ".g:NETRW_BOOKMARKDIR_{cnt}) - echo "Netrw Bookmark#".cnt.": ".g:NETRW_BOOKMARKDIR_{cnt} - let didwork= 1 - endif - let cnt= cnt + 1 - endwhile - endif - - " list directory history - let cnt = g:NETRW_DIRHIST_CNT - let first = 1 - let histcnt = 0 - while ( first || cnt != g:NETRW_DIRHIST_CNT ) -" call Decho("first=".first." cnt=".cnt." dirhist_cnt=".g:NETRW_DIRHIST_CNT) - let histcnt= histcnt + 1 - if exists("g:NETRW_DIRHIST_{cnt}") -" call Decho("Netrw History#".histcnt.": ".g:NETRW_DIRHIST_{cnt}) - echo "Netrw History#".histcnt.": ".g:NETRW_DIRHIST_{cnt} - let didwork= 1 - endif - let first = 0 - let cnt = ( cnt - 1 ) % g:netrw_dirhistmax - if cnt < 0 - let cnt= cnt + g:netrw_dirhistmax - endif - endwhile - if didwork - call inputsave()|call input("Press <cr> to continue")|call inputrestore() - endif - - elseif a:chg == 3 - " saves most recently visited directories (when they differ) -" call Decho("(browsing) record curdir history") - if !exists("g:NETRW_DIRHIST_0") || g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT} != a:curdir - let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT + 1 ) % g:netrw_dirhistmax -" let g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}= substitute(a:curdir,'[/\\]$','','e') - let g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}= a:curdir -" call Decho("save dirhist#".g:NETRW_DIRHIST_CNT."<".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}.">") - endif - - elseif a:chg == 4 - " u: change to the previous directory stored on the history list -" call Decho("(user: <u>) chg to prev dir from history") - let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT - 1 ) % g:netrw_dirhistmax - if g:NETRW_DIRHIST_CNT < 0 - let g:NETRW_DIRHIST_CNT= g:NETRW_DIRHIST_CNT + g:netrw_dirhistmax - endif - if exists("g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}") -" call Decho("changedir u#".g:NETRW_DIRHIST_CNT."<".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}.">") - if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("b:netrw_curdir") - setlocal ma noro -" call Decho("setlocal ma noro") - %d - setlocal nomod -" call Decho("setlocal nomod") - endif -" call Decho("exe e! ".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}) - exe "e! ".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT} - else - let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT + 1 ) % g:netrw_dirhistmax - echo "Sorry, no predecessor directory exists yet" - endif - - elseif a:chg == 5 - " U: change to the subsequent directory stored on the history list -" call Decho("(user: <U>) chg to next dir from history") - let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT + 1 ) % g:netrw_dirhistmax - if exists("g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}") -" call Decho("changedir U#".g:NETRW_DIRHIST_CNT."<".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}.">") - if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("b:netrw_curdir") - setlocal ma noro -" call Decho("setlocal ma noro") - %d -" call Decho("removed all lines from buffer (%d)") - setlocal nomod -" call Decho("setlocal nomod") - endif -" call Decho("exe e! ".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}) - exe "e! ".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT} - else - let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT - 1 ) % g:netrw_dirhistmax - if g:NETRW_DIRHIST_CNT < 0 - let g:NETRW_DIRHIST_CNT= g:NETRW_DIRHIST_CNT + g:netrw_dirhistmax - endif - echo "Sorry, no successor directory exists yet" - endif - endif - call s:NetrwBookmarkMenu() -" call Dret("NetrwBookmarkDir") -endfun - -" --------------------------------------------------------------------- -" s:NetrwBrowse: This function uses the command in g:netrw_list_cmd to provide a {{{2 -" list of the contents of a local or remote directory. It is assumed that the -" g:netrw_list_cmd has a string, USEPORT HOSTNAME, that needs to be substituted -" with the requested remote hostname first. -fun! s:NetrwBrowse(islocal,dirname) - if !exists("w:netrw_liststyle")|let w:netrw_liststyle= g:netrw_liststyle|endif -" call Dfunc("s:NetrwBrowse(islocal=".a:islocal." dirname<".a:dirname.">) liststyle=".w:netrw_liststyle." ".g:loaded_netrw." buf#".bufnr("%")."<".bufname("%").">") -" call Decho("tab#".tabpagenr()." win#".winnr()) -" call Dredir("ls!") - - if exists("s:netrw_skipbrowse") - unlet s:netrw_skipbrowse -" call Decho("ro=".&ro." ma=".&ma." mod=".&mod." wrap=".&wrap) -" call Dret("s:NetrwBrowse : s:netrw_skipbrowse=".s:netrw_skipbrowse) - return - endif - - call s:NetrwOptionSave("w:") - call s:NetrwSafeOptions() - - " re-instate any marked files - if exists("s:netrwmarkfilelist_{bufnr('%')}") -" call Decho("clearing marked files") - exe "2match netrwMarkFile /".s:netrwmarkfilemtch_{bufnr("%")}."/" - endif - - if a:islocal && exists("w:netrw_acdkeep") && w:netrw_acdkeep -" call Decho("handle w:netrw_acdkeep:") -" call Decho("lcd ".escape(a:dirname,g:netrw_cd_escape)." (due to w:netrw_acdkeep=".w:netrw_acdkeep." - acd=".&acd.")") - exe 'lcd '.escape(a:dirname,g:netrw_cd_escape) -" call Decho("getcwd<".getcwd().">") - - elseif !a:islocal && a:dirname !~ '[\/]$' && a:dirname !~ '^"' - " looks like a regular file, attempt transfer -" call Decho("attempt transfer as regular file<".a:dirname.">") - - " remove any filetype indicator from end of dirname, except for the {{{3 - " "this is a directory" indicator (/). - " There shouldn't be one of those here, anyway. - let path= substitute(a:dirname,'[*=@|]\r\=$','','e') -" call Decho("new path<".path.">") - call s:RemotePathAnalysis(a:dirname) - - " remote-read the requested file into current buffer {{{3 - mark ' - call s:NetrwEnew(a:dirname) - setlocal ma noro -" call Decho("setlocal ma noro") - let b:netrw_curdir= a:dirname -" call Decho("exe silent! keepalt file ".s:method."://".s:user.s:machine."/".escape(s:path,g:netrw_cd_escape)." (bt=".&bt.")") - exe "silent! keepalt file ".s:method."://".s:user.s:machine."/".escape(s:path,g:netrw_cd_escape) - exe "silent keepalt doau BufReadPre ".s:fname - silent call netrw#NetRead(2,s:method."://".s:user.s:machine."/".s:path) - if s:path !~ '.tar.bz2$' && s:path !~ '.tar.gz' - " netrw.vim and tar.vim have already handled decompression of the tarball; avoiding gzip.vim error - exe "silent keepalt doau BufReadPost ".s:fname - endif - - " save certain window-oriented variables into buffer-oriented variables {{{3 - call s:SetBufWinVars() - call s:NetrwOptionRestore("w:") - setlocal ma nomod - -" call Decho("ro=".&ro." ma=".&ma." mod=".&mod." wrap=".&wrap) -" call Dret("s:NetrwBrowse : file<".s:fname.">") - return - endif - - " use buffer-oriented WinVars if buffer ones exist but window ones don't {{{3 - call s:UseBufWinVars() - - " set up some variables {{{3 - let b:netrw_browser_active = 1 - let dirname = a:dirname - let s:last_sort_by = g:netrw_sort_by - - " set up menu {{{3 - call s:NetrwMenu(1) - - " set up buffer {{{3 - let reusing= s:NetrwGetBuffer(a:islocal,dirname) - " maintain markfile highlighting - if exists("s:netrwmarkfilemtch_{bufnr('%')}") && s:netrwmarkfilemtch_{bufnr("%")} != "" -" call Decho("bufnr(%)=".bufnr('%')) -" call Decho("exe 2match netrwMarkFile /".s:netrwmarkfilemtch_{bufnr("%")}."/") - exe "2match netrwMarkFile /".s:netrwmarkfilemtch_{bufnr("%")}."/" - else -" call Decho("2match none") - 2match none - endif - if reusing - call s:NetrwOptionRestore("w:") - setlocal noma nomod nowrap -" call Decho("ro=".&ro." ma=".&ma." mod=".&mod." wrap=".&wrap) -" call Dret("s:NetrwBrowse : re-using buffer") - return - endif - - " set b:netrw_curdir to the new directory name {{{3 -" call Decho("set b:netrw_curdir to the new directory name:") - let b:netrw_curdir= dirname - if b:netrw_curdir =~ '[/\\]$' - let b:netrw_curdir= substitute(b:netrw_curdir,'[/\\]$','','e') - endif - if b:netrw_curdir == '' - if has("amiga") - " On the Amiga, the empty string connotes the current directory - let b:netrw_curdir= getcwd() - else - " under unix, when the root directory is encountered, the result - " from the preceding substitute is an empty string. - let b:netrw_curdir= '/' - endif - endif - if !a:islocal && b:netrw_curdir !~ '/$' - let b:netrw_curdir= b:netrw_curdir.'/' - endif -" call Decho("b:netrw_curdir<".b:netrw_curdir.">") - - " ------------ - " (local only) {{{3 - " ------------ - if a:islocal -" call Decho("local only:") - - " Set up ShellCmdPost handling. Append current buffer to browselist - call s:LocalFastBrowser() - - " handle g:netrw_keepdir: set vim's current directory to netrw's notion of the current directory {{{3 - if !g:netrw_keepdir -" call Decho("handle g:netrw_keepdir=".g:netrw_keepdir.": getcwd<".getcwd()."> acd=".&acd) -" call Decho('exe cd '.escape(b:netrw_curdir,g:netrw_cd_escape)) - try - exe 'lcd '.escape(b:netrw_curdir,g:netrw_cd_escape) - catch /^Vim\%((\a\+)\)\=:E472/ - call netrw#ErrorMsg(s:ERROR,"unable to change directory to <".b:netrw_curdir."> (permissions?)",33) - if exists("w:netrw_prvdir") - let b:netrw_curdir= w:netrw_prvdir - else - call s:NetrwOptionRestore("w:") - setlocal noma nomod nowrap - let b:netrw_curdir= dirname -" call Decho("ro=".&ro." ma=".&ma." mod=".&mod." wrap=".&wrap) -" call Dret("s:NetrwBrowse : reusing buffer#".(exists("bufnum")? bufnum : 'N/A')."<".dirname."> getcwd<".getcwd().">") - return - endif - endtry - endif - - " -------------------------------- - " remote handling: {{{3 - " -------------------------------- - else -" call Decho("remote only:") - - " analyze a:dirname and g:netrw_list_cmd {{{4 -" call Decho("b:netrw_curdir<".(exists("b:netrw_curdir")? b:netrw_curdir : "doesn't exist")."> a:dirname<".a:dirname.">") - if a:dirname =~ "^NetrwTreeListing\>" - let dirname= b:netrw_curdir -" call Decho("(dirname was ".a:dirname.") dirname<".dirname.">") - elseif exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("b:netrw_curdir") - let dirname= substitute(b:netrw_curdir,'\\','/','g') - if dirname !~ '/$' - let dirname= dirname.'/' - endif - let b:netrw_curdir = dirname -" call Decho("(liststyle is TREELIST) dirname<".dirname.">") - else - let dirname = substitute(a:dirname,'\\','/','g') -" call Decho("(normal) dirname<".dirname.">") - endif - - let dirpat = '^\(\w\{-}\)://\(\w\+@\)\=\([^/]\+\)/\(.*\)$' - if dirname !~ dirpat - if !exists("g:netrw_quiet") - call netrw#ErrorMsg(s:ERROR,"netrw doesn't understand your dirname<".dirname.">",20) - endif - call s:NetrwOptionRestore("w:") - setlocal noma nomod nowrap -" call Decho("ro=".&ro." ma=".&ma." mod=".&mod." wrap=".&wrap) -" call Dret("s:NetrwBrowse : badly formatted dirname<".dirname.">") - return - endif - let b:netrw_curdir= dirname -" call Decho("b:netrw_curdir<".b:netrw_curdir."> (remote)") - endif " (additional remote handling) - - " ----------------------- - " Directory Listing: {{{3 - " ----------------------- - call s:BrowserMaps(a:islocal) - call s:PerformListing(a:islocal) - -" call Decho("ro=".&ro." ma=".&ma." mod=".&mod." wrap=".&wrap) -" call Dret("s:NetrwBrowse : did PerformListing") - return -endfun - -" --------------------------------------------------------------------- -" s:NetrwFileInfo: supports qf (query for file information) {{{2 -fun! s:NetrwFileInfo(islocal,fname) -" call Dfunc("s:NetrwFileInfo(islocal=".a:islocal." fname<".a:fname.">)") - if a:islocal - if (has("unix") || has("macunix")) && executable("/bin/ls") - echo system("/bin/ls -lsad ".a:fname) - else - " use vim functions to return information about file below cursor - if !isdirectory(a:fname) && !filereadable(a:fname) && a:fname =~ '[*@/]' - let fname= substitute(a:fname,".$","","") - else - let fname= a:fname - endif - let t = getftime(fname) - let sz = getfsize(fname) - echo a:fname.": ".sz." ".strftime(g:netrw_timefmt,getftime(fname)) -" call Decho(fname.": ".sz." ".strftime(g:netrw_timefmt,getftime(fname))) - endif - else - echo "sorry, \"qf\" not supported yet for remote files" - endif -" call Dret("s:NetrwFileInfo") -endfun - -" --------------------------------------------------------------------- -" s:NetrwGetBuffer: {{{2 -" returns 0=cleared buffer -" 1=re-used buffer -fun! s:NetrwGetBuffer(islocal,dirname) -" call Dfunc("s:NetrwGetBuffer(islocal=".a:islocal." dirname<".a:dirname.">) liststyle=".g:netrw_liststyle) - let dirname= a:dirname - - " re-use buffer if possible {{{3 -" call Decho("--re-use a buffer if possible--") - if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST - " find NetrwTreeList buffer if there is one - if exists("w:netrw_treebufnr") && w:netrw_treebufnr > 0 -" call Decho(" re-use w:netrw_treebufnr=".w:netrw_treebufnr) - let eikeep= &ei - set ei=all - exe "b ".w:netrw_treebufnr - let &ei= eikeep -" call Dret("s:NetrwGetBuffer : bufnum#".bufnum."<NetrwTreeListing>") - return - endif - let bufnum= -1 -" call Decho(" liststyle=TREE but w:netrw_treebufnr doesn't exist") - - else - " find buffer number of buffer named precisely the same as dirname {{{3 -" call Decho("--find buffer numnber of buffer named precisely the same as dirname--") -" call Dredir("ls!") - - " get dirname and associated buffer number - let bufnum = bufnr(escape(dirname,'\')) -" call Decho(" find buffer<".dirname.">'s number ") -" call Decho(" bufnr(dirname<".escape(dirname,'\').">)=".bufnum) - - if bufnum < 0 && dirname !~ '/$' - " trying appending a trailing / -" call Decho(" try appending a trailing / to dirname<".dirname.">") - let bufnum= bufnr(escape(dirname.'/','\')) - if bufnum > 0 - let dirname= dirname.'/' - endif - endif - - if bufnum < 0 && dirname =~ '/$' - " trying removing a trailing / -" call Decho(" try removing a trailing / from dirname<".dirname.">") - let bufnum= bufnr(escape(substitute(dirname,'/$','',''),'\')) - if bufnum > 0 - let dirname= substitute(dirname,'/$','','') - endif - endif - -" call Decho(" findbuf1: bufnum=bufnr('".dirname."')=".bufnum." bufname(".bufnum.")<".bufname(bufnum)."> (initial)") - " note: !~ was used just below, but that means using ../ to go back would match (ie. abc/def/ and abc/ matches) - if bufnum > 0 && bufname(bufnum) != dirname && bufname(bufnum) != '.' - " handle approximate matches -" call Decho(" handling approx match: bufnum#%d<".bufname(bufnum)."> approx= dirname<".dirname.">") - let ibuf = 1 - let buflast = bufnr("$") -" call Decho(" findbuf2: buflast=".buflast) - while ibuf <= buflast - let bname= substitute(bufname(ibuf),'\\','/','g') -" call Decho(" findbuf3: dirname<".dirname."> bufname(".ibuf.")<".bname.">") - if bname != '' && bname !~ '/' && dirname =~ '/'.bname.'/\=$' | break | endif - if bname =~ '^'.dirname.'/\=$' | break | endif - if dirname =~ '^'.bname.'/$' | break | endif - let ibuf= ibuf + 1 - endwhile - if ibuf > buflast - let bufnum= -1 - else - let bufnum= ibuf - endif -" call Decho(" findbuf4: bufnum=".bufnum." (ibuf=".ibuf." buflast=".buflast.")") - endif - endif - - " get enew buffer and name it -or- re-use buffer {{{3 -" call Decho("--get enew buffer and name it OR re-use buffer-- (bufnum=".bufnum.")") - mark ' - if bufnum < 0 || !bufexists(bufnum) - call s:NetrwEnew(dirname) -" call Decho(" got enew buffer#".bufnr("%")." (altbuf<".expand("#").">)") - " name the buffer - if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST - " Got enew buffer; transform into a NetrwTreeListing -" call Decho("--transform enew buffer#".bufnr("%")." into a NetrwTreeListing --") - if !exists("s:netrw_treelistnum") - let s:netrw_treelistnum= 1 - else - let s:netrw_treelistnum= s:netrw_treelistnum + 1 - endif - let w:netrw_treebufnr= bufnr("%") -" call Decho(" exe silent! keepalt file NetrwTreeListing ".s:netrw_treelistnum) - exe 'silent! keepalt file NetrwTreeListing\ '.s:netrw_treelistnum - nnoremap <silent> <buffer> [ :silent call <SID>TreeListMove('[')<cr> - nnoremap <silent> <buffer> ] :silent call <SID>TreeListMove(']')<cr> - nnoremap <silent> <buffer> [[ :silent call <SID>TreeListMove('[')<cr> - nnoremap <silent> <buffer> ]] :silent call <SID>TreeListMove(']')<cr> -" call Decho(" tree listing#".s:netrw_treelistnum." bufnr=".w:netrw_treebufnr) - else -" let v:errmsg= "" " Decho - let escdirname= escape(dirname,g:netrw_cd_escape) -" call Decho(" errmsg<".v:errmsg."> bufnr(".escdirname.")=".bufnr(escdirname)."<".bufname(bufnr(escdirname)).">") -" call Decho(' exe silent! keepalt file '.escdirname) - exe 'silent! keepalt file '.escdirname -" call Decho(" errmsg<".v:errmsg."> bufnr(".escdirname.")=".bufnr(escdirname)."<".bufname(bufnr(escdirname)).">") - endif -" call Decho(" named enew buffer#".bufnr("%")."<".bufname("%").">") - - else " Re-use the buffer -" call Decho("--re-use buffer#".bufnum.": --") - let eikeep= &ei - set ei=all - if getline(2) =~ '^" Netrw Directory Listing' -" call Decho(" re-use buffer#".bufnum."<".((bufnum > 0)? bufname(bufnum) : "")."> using: keepalt b ".bufnum) - exe "keepalt b ".bufnum - else -" call Decho(" reusing buffer#".bufnum."<".((bufnum > 0)? bufname(bufnum) : "")."> using: b ".bufnum) - exe "b ".bufnum - endif - if bufname("%") == '.' - exe "silent! keepalt file ".escape(getcwd(),' ') - endif - let &ei= eikeep - if line("$") <= 1 - call s:NetrwListSettings(a:islocal) -" call Dret("s:NetrwGetBuffer 0 : re-using buffer#".bufnr("%").", but its empty, so refresh it") - return 0 - elseif exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST -" call Decho("--re-use tree listing--") -" call Decho(" clear buffer<".expand("%")."> with :%d") - silent %d - call s:NetrwListSettings(a:islocal) -" call Dret("s:NetrwGetBuffer 0 : re-using buffer#".bufnr("%").", but treelist mode always needs a refresh") - return 0 - else -" call Dret("s:NetrwGetBuffer 1 : buf#".bufnr("%")) - return 1 - endif - endif - - " do netrw settings: make this buffer not-a-file, modifiable, not line-numbered, etc {{{3 - " fastbrowse Local Remote Hiding a buffer implies it may be re-used (fast) - " slow 0 D D Deleting a buffer implies it will not be re-used (slow) - " med 1 D H - " fast 2 H H -" call Decho("--do netrw settings: make this buffer not-a-file, modifiable, not line-numbered, etc--") - let fname= expand("%") - call s:NetrwListSettings(a:islocal) - exe "keepalt file ".escape(fname,' ') - - " delete all lines from buffer {{{3 -" call Decho("--delete all lines from buffer--") -" call Decho(" clear buffer<".expand("%")."> with :%d") - keepalt silent! %d - -" call Dret("s:NetrwGetBuffer 0 : buf#".bufnr("%")) - return 0 -endfun - -" --------------------------------------------------------------------- -" s:NetrwGetcwd: get the current directory. {{{2 -" Change backslashes to forward slashes, if any. -" If doesc is true, escape certain troublesome characters -fun! s:NetrwGetcwd(doesc) -" call Dfunc("NetrwGetcwd(doesc=".a:doesc.")") - let curdir= substitute(getcwd(),'\\','/','ge') - if curdir !~ '[\/]$' - let curdir= curdir.'/' - endif - if a:doesc - let curdir= escape(curdir,g:netrw_cd_escape) - endif -" call Dret("NetrwGetcwd <".curdir.">") - return curdir -endfun - -" --------------------------------------------------------------------- -" s:NetrwGetWord: it gets the directory named under the cursor {{{2 -fun! s:NetrwGetWord() -" call Dfunc("s:NetrwGetWord() line#".line(".")." liststyle=".g:netrw_liststyle." virtcol=".virtcol(".")) - call s:UseBufWinVars() - - " insure that w:netrw_liststyle is set up - if !exists("w:netrw_liststyle") - if exists("g:netrw_liststyle") - let w:netrw_liststyle= g:netrw_liststyle - else - let w:netrw_liststyle= s:THINLIST - endif -" call Decho("w:netrw_liststyle=".w:netrw_liststyle) - endif - - if exists("w:netrw_bannercnt") && line(".") < w:netrw_bannercnt - " Active Banner support -" call Decho("active banner handling") - norm! 0 - let dirname= "./" - let curline= getline(".") - - if curline =~ '"\s*Sorted by\s' - norm s - let s:netrw_skipbrowse= 1 - echo 'Pressing "s" also works' - - elseif curline =~ '"\s*Sort sequence:' - let s:netrw_skipbrowse= 1 - echo 'Press "S" to edit sorting sequence' - - elseif curline =~ '"\s*Quick Help:' - norm ? - let s:netrw_skipbrowse= 1 - echo 'Pressing "?" also works' - - elseif curline =~ '"\s*\%(Hiding\|Showing\):' - norm a - let s:netrw_skipbrowse= 1 - echo 'Pressing "a" also works' - - elseif line("$") > w:netrw_bannercnt - exe 'silent keepjumps '.w:netrw_bannercnt - endif - - elseif w:netrw_liststyle == s:THINLIST -" call Decho("thin column handling") - norm! 0 - let dirname= getline(".") - - elseif w:netrw_liststyle == s:LONGLIST -" call Decho("long column handling") - norm! 0 - let dirname= substitute(getline("."),'^\(\%(\S\+ \)*\S\+\).\{-}$','\1','e') - - elseif w:netrw_liststyle == s:TREELIST -" call Decho("treelist handling") - let dirname= substitute(getline("."),'^\(| \)*','','e') - - else -" call Decho("obtain word from wide listing") - let dirname= getline(".") - - if !exists("b:netrw_cpf") - let b:netrw_cpf= 0 - exe 'silent keepjumps '.w:netrw_bannercnt.',$g/^./if virtcol("$") > b:netrw_cpf|let b:netrw_cpf= virtcol("$")|endif' -" call Decho("computed cpf") - endif - -" call Decho("buf#".bufnr("%")."<".bufname("%").">") - let filestart = (virtcol(".")/b:netrw_cpf)*b:netrw_cpf -" call Decho("filestart= ([virtcol=".virtcol(".")."]/[b:netrw_cpf=".b:netrw_cpf."])*b:netrw_cpf=".filestart." bannercnt=".w:netrw_bannercnt) -" call Decho("1: dirname<".dirname.">") - if filestart > 0|let dirname= substitute(dirname,'^.\{'.filestart.'}','','')|endif -" call Decho("2: dirname<".dirname.">") - let dirname = substitute(dirname,'^\(.\{'.b:netrw_cpf.'}\).*$','\1','e') -" call Decho("3: dirname<".dirname.">") - let dirname = substitute(dirname,'\s\+$','','e') -" call Decho("4: dirname<".dirname.">") - endif - - " symlinks are indicated by a trailing "@". Remove it before further processing. - let dirname= substitute(dirname,"@$","","") - - " executables are indicated by a trailing "*". Remove it before further processing. - let dirname= substitute(dirname,"\*$","","") - -" call Dret("s:NetrwGetWord <".dirname.">") - return dirname -endfun - -" --------------------------------------------------------------------- -" s:NetrwListSettings: {{{2 -fun! s:NetrwListSettings(islocal) -" call Dfunc("s:NetrwListSettings(islocal=".a:islocal.")") - let fname= bufname("%") - setlocal bt=nofile nobl ma nonu nowrap noro -" call Decho("setlocal bt=nofile nobl ma nonu nowrap noro") - exe "keepalt file ".escape(fname,' ') - if g:netrw_use_noswf - setlocal noswf - endif -" call Dredir("ls!") -" call Decho("exe setlocal ts=".g:netrw_maxfilenamelen) - exe "setlocal ts=".g:netrw_maxfilenamelen - setlocal isk+=.,~,- - if g:netrw_fastbrowse > a:islocal - setlocal bh=hide - else - setlocal bh=delete - endif -" call Dret("s:NetrwListSettings") -endfun - -" --------------------------------------------------------------------- -" s:NetrwListStyle: {{{2 -" islocal=0: remote browsing -" =1: local browsing -fun! s:NetrwListStyle(islocal) -" call Dfunc("NetrwListStyle(islocal=".a:islocal.") w:netrw_liststyle=".w:netrw_liststyle) - let fname = s:NetrwGetWord() - if !exists("w:netrw_liststyle")|let w:netrw_liststyle= g:netrw_liststyle|endif - let w:netrw_liststyle = (w:netrw_liststyle + 1) % s:MAXLIST -" call Decho("fname<".fname.">") -" call Decho("chgd w:netrw_liststyle to ".w:netrw_liststyle) -" call Decho("b:netrw_curdir<".(exists("b:netrw_curdir")? b:netrw_curdir : "doesn't exist").">") - - if w:netrw_liststyle == s:THINLIST - " use one column listing -" call Decho("use one column list") - let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge') - - elseif w:netrw_liststyle == s:LONGLIST - " use long list -" call Decho("use long list") - let g:netrw_list_cmd = g:netrw_list_cmd." -l" - - elseif w:netrw_liststyle == s:WIDELIST - " give wide list -" call Decho("use wide list") - let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge') - - elseif w:netrw_liststyle == s:TREELIST -" call Decho("use tree list") - let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge') - - else - call netrw#ErrorMsg(s:WARNING,"bad value for g:netrw_liststyle (=".w:netrw_liststyle.")",46) - let g:netrw_liststyle = s:THINLIST - let w:netrw_liststyle = g:netrw_liststyle - let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge') - endif - setlocal ma noro -" call Decho("setlocal ma noro") - - " clear buffer - this will cause NetrwBrowse/LocalBrowseCheck to do a refresh -" call Decho("clear buffer<".expand("%")."> with :%d") - %d - - " refresh the listing - let svpos= netrw#NetrwSavePosn() - call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./')) - call netrw#NetrwRestorePosn(svpos) - - " keep cursor on the filename - silent keepjumps $ - let result= search('\%(^\%(|\+\s\)\=\|\s\{2,}\)\zs'.escape(fname,'.\[]*$^').'\%(\s\{2,}\|$\)','bc') -" call Decho("search result=".result." w:netrw_bannercnt=".(exists("w:netrw_bannercnt")? w:netrw_bannercnt : 'N/A')) - if result <= 0 && exists("w:netrw_bannercnt") - exe "keepjumps ".w:netrw_bannercnt - endif - -" call Dret("NetrwListStyle".(exists("w:netrw_liststyle")? ' : w:netrw_liststyle='.w:netrw_liststyle : "")) -endfun - -" --------------------------------------------------------------------- -" s:NetrwBookmarkMenu: Uses menu priorities {{{2 -" .2.[cnt] for bookmarks, and -" .3.[cnt] for history -" (see s:NetrwMenu()) -fun! s:NetrwBookmarkMenu() - if !exists("s:netrw_menucnt") - return - endif -" call Dfunc("NetrwBookmarkMenu() bookmarkcnt=".g:NETRW_BOOKMARKMAX." histcnt=".g:NETRW_DIRHIST_CNT." menucnt=".s:netrw_menucnt) - - " the following test assures that gvim is running, has menus available, and has menus enabled. - if has("gui") && has("menu") && has("gui_running") && &go =~ 'm' && g:netrw_menu - if exists("g:NetrwTopLvlMenu") - exe 'silent! unmenu '.g:NetrwTopLvlMenu.'Bookmark' - endif - - " show bookmarked places - let cnt = 0 - while cnt <= g:NETRW_BOOKMARKMAX - if exists("g:NETRW_BOOKMARKDIR_{cnt}") - let bmdir= escape(g:NETRW_BOOKMARKDIR_{cnt},'.') -" call Decho('silent! menu '.g:NetrwMenuPriority.".2.".cnt." ".g:NetrwTopLvlMenu.'Bookmark.'.bmdir.' :e '.g:NETRW_BOOKMARKDIR_{cnt}) - exe 'silent! menu '.g:NetrwMenuPriority.".2.".cnt." ".g:NetrwTopLvlMenu.'Bookmarks.'.bmdir.' :e '.g:NETRW_BOOKMARKDIR_{cnt}."\<cr>" - endif - let cnt= cnt + 1 - endwhile - - " show directory browsing history - let cnt = g:NETRW_DIRHIST_CNT - let first = 1 - let histcnt = 0 - while ( first || cnt != g:NETRW_DIRHIST_CNT ) - let histcnt = histcnt + 1 - let priority = g:NETRW_DIRHIST_CNT + histcnt - if exists("g:NETRW_DIRHIST_{cnt}") - let bmdir= escape(g:NETRW_DIRHIST_{cnt},'.') -" call Decho('silent! menu '.g:NetrwMenuPriority.".3.".priority." ".g:NetrwTopLvlMenu.'History.'.bmdir.' :e '.g:NETRW_DIRHIST_{cnt}) - exe 'silent! menu '.g:NetrwMenuPriority.".3.".priority." ".g:NetrwTopLvlMenu.'History.'.bmdir.' :e '.g:NETRW_DIRHIST_{cnt}."\<cr>" - endif - let first = 0 - let cnt = ( cnt - 1 ) % g:netrw_dirhistmax - if cnt < 0 - let cnt= cnt + g:netrw_dirhistmax - endif - endwhile - endif -" call Dret("NetrwBookmarkMenu") -endfun - -" --------------------------------------------------------------------- -" s:NetrwBrowseChgDir: constructs a new directory based on the current {{{2 -" directory and a new directory name. Also, if the -" "new directory name" is actually a file, -" NetrwBrowseChgDir() edits the file. -fun! s:NetrwBrowseChgDir(islocal,newdir,...) -" call Dfunc("s:NetrwBrowseChgDir(islocal=".a:islocal."> newdir<".a:newdir.">) a:0=".a:0." curpos<".string(getpos("."))."> b:netrw_curdir<".(exists("b:netrw_curdir")? b:netrw_curdir : "").">") - - if !exists("b:netrw_curdir") -" call Decho("(NetrwBrowseChgDir) b:netrw_curdir doesn't exist!") - echoerr "(NetrwBrowseChgDir) b:netrw_curdir doesn't exist!" -" call Dret("s:NetrwBrowseChgDir") - return - endif - - call s:NetrwOptionSave("s:") - call s:NetrwSafeOptions() - let nbcd_curpos = netrw#NetrwSavePosn() - let dirname = substitute(b:netrw_curdir,'\\','/','ge') - let newdir = a:newdir - let dolockout = 0 - - " set up o/s-dependent directory recognition pattern - if has("amiga") - let dirpat= '[\/:]$' - else - let dirpat= '[\/]$' - endif -" call Decho("dirname<".dirname."> dirpat<".dirpat.">") - - if dirname !~ dirpat - " apparently vim is "recognizing" that it is in a directory and - " is removing the trailing "/". Bad idea, so I put it back. - let dirname= dirname.'/' -" call Decho("adjusting dirname<".dirname.">") - endif - - if newdir !~ dirpat - " ------------ - " edit a file: - " ------------ -" call Decho('case "handling a file": newdir<'.newdir.'> !~ dirpat<'.dirpat.">") - if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("w:netrw_treedict") && newdir !~ '^\(/\|\a:\)' - let dirname= s:NetrwTreeDir() - if dirname =~ '/$' - let dirname= dirname.newdir - else - let dirname= s:NetrwTreeDir()."/".newdir - endif -" call Decho("tree listing") - elseif newdir =~ '^\(/\|\a:\)' - let dirname= newdir - else - let dirname= s:ComposePath(dirname,newdir) - endif -" call Decho("handling a file: dirname<".dirname."> (a:0=".a:0.")") - " this lets NetrwBrowseX avoid the edit - if a:0 < 1 -" call Decho("dirname<".dirname."> netrw_cd_escape<".g:netrw_cd_escape."> browse_split=".g:netrw_browse_split) -" call Decho("set up windows for editing<".escape(dirname,g:netrw_cd_escape)."> didsplit=".(exists("s:didsplit")? s:didsplit : "doesn't exist")) - call s:NetrwOptionRestore("s:") - if !exists("s:didsplit") - if g:netrw_browse_split == 1 - new - wincmd _ - elseif g:netrw_browse_split == 2 - rightb vert new - wincmd | - elseif g:netrw_browse_split == 3 - tabnew - elseif g:netrw_browse_split == 4 - if s:NetrwPrevWinOpen(2) == 3 -" call Dret("s:NetrwBrowseChgDir") - return - endif - else - " handling a file, didn't split, so remove menu -" call Decho("handling a file+didn't split, so remove menu") - call s:NetrwMenu(0) - " optional change to window - if g:netrw_chgwin >= 1 - exe g:netrw_chgwin."wincmd w" - endif - endif - endif - " the point where netrw actually edits the (local) file - " if its local only: LocalBrowseCheck() doesn't edit a file, but NetrwBrowse() will - if a:islocal -" call Decho("edit local file: exe e! ".escape(dirname,g:netrw_cd_escape)) - exe "e! ".escape(dirname,g:netrw_cd_escape) - let dolockout= 1 - else -" call Decho("remote file: NetrwBrowse will edit it") - let dolockout= 1 - endif - endif - - elseif newdir =~ '^/' - " --------------------------------- - " just go to the new directory spec - " --------------------------------- -" call Decho('case "just go to new directory spec": newdir<'.newdir.'>') - let dirname= newdir - call s:SetRexDir(a:islocal,dirname) - call s:NetrwOptionRestore("s:") - - elseif newdir == './' - " -------------------------- - " refresh the directory list - " -------------------------- -" call Decho('case "refresh directory listing": newdir == "./"') - call s:SetRexDir(a:islocal,dirname) - - elseif newdir == '../' - " ------------------- - " go up one directory - " ------------------- -" call Decho('case "go up one directory": newdir == "../"') - - if w:netrw_liststyle == s:TREELIST && exists("w:netrw_treedict") - " force a refresh -" call Decho("clear buffer<".expand("%")."> with :%d") - setlocal noro ma -" call Decho("setlocal noro ma") - keepjumps %d - endif - - if has("amiga") - " amiga -" call Decho('case "go up one directory": newdir == "../" and amiga') - if a:islocal - let dirname= substitute(dirname,'^\(.*[/:]\)\([^/]\+$\)','\1','') - let dirname= substitute(dirname,'/$','','') - else - let dirname= substitute(dirname,'^\(.*[/:]\)\([^/]\+/$\)','\1','') - endif -" call Decho("amiga: dirname<".dirname."> (go up one dir)") - - else - " unix or cygwin -" call Decho('case "go up one directory": newdir == "../" and unix or cygwin') - if a:islocal - let dirname= substitute(dirname,'^\(.*\)/\([^/]\+\)/$','\1','') - if dirname == "" - let dirname= '/' - endif - else - let dirname= substitute(dirname,'^\(\a\+://.\{-}/\{1,2}\)\(.\{-}\)\([^/]\+\)/$','\1\2','') - endif -" call Decho("unix: dirname<".dirname."> (go up one dir)") - endif - call s:SetRexDir(a:islocal,dirname) - - elseif exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("w:netrw_treedict") -" call Decho('case liststyle is TREELIST and w:netrw_treedict exists') - " force a refresh (for TREELIST, wait for NetrwTreeDir() to force the refresh) - setlocal noro ma -" call Decho("setlocal noro ma") - if !(exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("b:netrw_curdir")) -" call Decho("clear buffer<".expand("%")."> with :%d") - keepjumps %d - endif - let treedir = s:NetrwTreeDir() - let s:treecurpos = nbcd_curpos - let haskey= 0 -" call Decho("w:netrw_treedict<".string(w:netrw_treedict).">") - - " search treedict for tree dir as-is - if has_key(w:netrw_treedict,treedir) -" call Decho('....searched for treedir<'.treedir.'> : found it!') - let haskey= 1 - else -" call Decho('....searched for treedir<'.treedir.'> : not found') - endif - - " search treedict for treedir with a / appended - if !haskey && treedir !~ '/$' - if has_key(w:netrw_treedict,treedir."/") - let treedir= treedir."/" -" call Decho('....searched.for treedir<'.treedir.'> found it!') - let haskey = 1 - else -" call Decho('....searched for treedir<'.treedir.'/> : not found') - endif - endif - - " search treedict for treedir with any trailing / elided - if !haskey && treedir =~ '/$' - let treedir= substitute(treedir,'/$','','') - if has_key(w:netrw_treedict,treedir) -" call Decho('....searched.for treedir<'.treedir.'> found it!') - let haskey = 1 - else -" call Decho('....searched for treedir<'.treedir.'> : not found') - endif - endif - - if haskey - " close tree listing for selected subdirectory -" call Decho("closing selected subdirectory<".dirname.">") - call remove(w:netrw_treedict,treedir) -" call Decho("removed entry<".dirname."> from treedict") -" call Decho("yielding treedict<".string(w:netrw_treedict).">") - let dirname= w:netrw_treetop - else - " go down one directory - let dirname= substitute(treedir,'/*$','/','') -" call Decho("go down one dir: treedir<".treedir.">") - endif - call s:SetRexDir(a:islocal,dirname) - - else - " go down one directory - let dirname= s:ComposePath(dirname,newdir) -" call Decho("go down one dir: dirname<".dirname."> newdir<".newdir.">") - call s:SetRexDir(a:islocal,dirname) - endif - - call s:NetrwOptionRestore("s:") - if dolockout -" call Decho("doing modification lockout settings: ma nomod noro") - setlocal ma nomod noro -" call Decho("setlocal ma nomod noro") - endif - -" call Dret("s:NetrwBrowseChgDir <".dirname."> : curpos<".string(getpos(".")).">") - return dirname -endfun - -" --------------------------------------------------------------------- -" s:NetrwBrowseX: allows users to write custom functions to operate on {{{2 -" files given their extension. Passes 0=local, 1=remote -fun! netrw#NetrwBrowseX(fname,remote) -" call Dfunc("NetrwBrowseX(fname<".a:fname."> remote=".a:remote.")") - - " set up the filename - " (lower case the extension, make a local copy of a remote file) - let exten= substitute(a:fname,'.*\.\(.\{-}\)','\1','e') - if has("win32") || has("win95") || has("win64") || has("win16") - let exten= substitute(exten,'^.*$','\L&\E','') - endif - let fname= escape(a:fname,"%#") -" call Decho("fname<".fname."> after escape()") - - " seems kde systems often have gnome-open due to dependencies, even though - " gnome-open's subsidiary display tools are largely absent. Kde systems - " usually have "kdeinit" running, though... (tnx Mikolaj Machowski) - if !exists("s:haskdeinit") - if has("unix") - let s:haskdeinit= s:System("system",'ps -e') =~ 'kdeinit' - if v:shell_error - let s:haskdeinit = 0 - endif - else - let s:haskdeinit= 0 - endif -" call Decho("setting s:haskdeinit=".s:haskdeinit) - endif - - if a:remote == 1 - " create a local copy - let fname= fnamemodify(tempname(),":r").".".exten -" call Decho("a:remote=".a:remote.": create a local copy of <".a:fname."> as <".fname.">") - exe "silent keepjumps bot 1new ".a:fname - setlocal bh=delete -" call Decho("read <".fname.">, now writing: exe w! ".fname) - exe "silent! w! ".fname - q - endif -" call Decho("exten<".exten."> "."netrwFileHandlers#NFH_".exten."():exists=".exists("*netrwFileHandlers#NFH_".exten)) - - " set up redirection - if &srr =~ "%s" - if (has("win32") || has("win95") || has("win64") || has("win16")) - let redir= substitute(&srr,"%s","nul","") - else - let redir= substitute(&srr,"%s","/dev/null","") - endif - elseif (has("win32") || has("win95") || has("win64") || has("win16")) - let redir= &srr . "nul" - else - let redir= &srr . "/dev/null" - endif -" call Decho("redir{".redir."} srr{".&srr."}") - - " extract any viewing options. Assumes that they're set apart by quotes. - if exists("g:netrw_browsex_viewer") - if g:netrw_browsex_viewer =~ '\s' - let viewer = substitute(g:netrw_browsex_viewer,'\s.*$','','') - let viewopt = substitute(g:netrw_browsex_viewer,'^\S\+\s*','','')." " - let oviewer = '' - let cnt = 1 - while !executable(viewer) && viewer != oviewer - let viewer = substitute(g:netrw_browsex_viewer,'^\(\(^\S\+\s\+\)\{'.cnt.'}\S\+\)\(.*\)$','\1','') - let viewopt = substitute(g:netrw_browsex_viewer,'^\(\(^\S\+\s\+\)\{'.cnt.'}\S\+\)\(.*\)$','\3','')." " - let cnt = cnt + 1 - let oviewer = viewer -" call Decho("!exe: viewer<".viewer."> viewopt<".viewopt.">") - endwhile - else - let viewer = g:netrw_browsex_viewer - let viewopt = "" - endif -" call Decho("viewer<".viewer."> viewopt<".viewopt.">") - endif - - " execute the file handler - if exists("g:netrw_browsex_viewer") && g:netrw_browsex_viewer == '-' -" call Decho("g:netrw_browsex_viewer<".g:netrw_browsex_viewer.">") - let ret= netrwFileHandlers#Invoke(exten,fname) - - elseif exists("g:netrw_browsex_viewer") && executable(viewer) -" call Decho("g:netrw_browsex_viewer<".g:netrw_browsex_viewer.">") -" call Decho("exe silent !".viewer." ".viewopt.g:netrw_shq.escape(fname,'%#').g:netrw_shq.redir) - exe "silent !".viewer." ".viewopt.g:netrw_shq.escape(fname,'%#').g:netrw_shq.redir - let ret= v:shell_error - - elseif has("win32") || has("win64") -" call Decho('exe silent !start rundll32 url.dll,FileProtocolHandler '.g:netrw_shq.escape(fname, '%#').g:netrw_shq) - exe 'silent !start rundll32 url.dll,FileProtocolHandler '.g:netrw_shq.escape(fname, '%#').g:netrw_shq - call inputsave()|call input("Press <cr> to continue")|call inputrestore() - let ret= v:shell_error - - elseif has("unix") && executable("gnome-open") && !s:haskdeinit -" call Decho("exe silent !gnome-open ".g:netrw_shq.escape(fname,'%#').g:netrw_shq." ".redir) - exe "silent !gnome-open ".g:netrw_shq.escape(fname,'%#').g:netrw_shq.redir - let ret= v:shell_error - - elseif has("unix") && executable("kfmclient") && s:haskdeinit -" call Decho("exe silent !kfmclient exec ".g:netrw_shq.escape(fname,'%#').g:netrw_shq." ".redir) - exe "silent !kfmclient exec ".g:netrw_shq.escape(fname,'%#').g:netrw_shq." ".redir - let ret= v:shell_error - - elseif has("macunix") && executable("open") -" call Decho("exe silent !open '".escape(fname,'%#')."' ".redir) - exe silent !open '".escape(fname,'%#')."' ".redir - let ret= v:shell_error - - else - " netrwFileHandlers#Invoke() always returns 0 - let ret= netrwFileHandlers#Invoke(exten,fname) - endif - - " if unsuccessful, attempt netrwFileHandlers#Invoke() - if ret - let ret= netrwFileHandlers#Invoke(exten,fname) - endif - -" redraw! - - " cleanup: remove temporary file, - " delete current buffer if success with handler, - " return to prior buffer (directory listing) - " Feb 12, 2008: had to de-activiate removal of - " temporary file because it wasn't getting seen. -" if a:remote == 1 && fname != a:fname -" call Decho("deleting temporary file<".fname.">") -" call s:System("delete",fname) -" endif - - if a:remote == 1 - setlocal bh=delete bt=nofile - if g:netrw_use_noswf - setlocal noswf - endif - exe "norm! \<c-o>" -" redraw! - endif - -" call Dret("NetrwBrowseX") -endfun - -" --------------------------------------------------------------------- -" netrw#Explore: launch the local browser in the directory of the current file {{{2 -" dosplit==0: the window will be split iff the current file has -" been modified -" dosplit==1: the window will be split before running the local -" browser -fun! netrw#Explore(indx,dosplit,style,...) -" call Dfunc("netrw#Explore(indx=".a:indx." dosplit=".a:dosplit." style=".a:style.",a:1<".a:1.">) &modified=".&modified." a:0=".a:0) - if !exists("b:netrw_curdir") - let b:netrw_curdir= getcwd() -" call Decho("set b:netrw_curdir<".b:netrw_curdir."> (used getcwd)") - endif - let curfile= b:netrw_curdir -" call Decho("curfile<".curfile.">") - - " save registers - silent! let keepregstar = @* - silent! let keepregplus = @+ - silent! let keepregslash= @/ - - " if dosplit or file has been modified - if a:dosplit || &modified || a:style == 6 -" call Decho("case: dosplit=".a:dosplit." modified=".&modified." a:style=".a:style) - call s:SaveWinVars() - - if a:style == 0 " Explore, Sexplore -" call Decho("style=0: Explore or Sexplore") - exe g:netrw_winsize."wincmd s" - - elseif a:style == 1 "Explore!, Sexplore! -" call Decho("style=1: Explore! or Sexplore!") - exe g:netrw_winsize."wincmd v" - - elseif a:style == 2 " Hexplore -" call Decho("style=2: Hexplore") - exe "bel ".g:netrw_winsize."wincmd s" - - elseif a:style == 3 " Hexplore! -" call Decho("style=3: Hexplore!") - exe "abo ".g:netrw_winsize."wincmd s" - - elseif a:style == 4 " Vexplore -" call Decho("style=4: Vexplore") - exe "lefta ".g:netrw_winsize."wincmd v" - - elseif a:style == 5 " Vexplore! -" call Decho("style=5: Vexplore!") - exe "rightb ".g:netrw_winsize."wincmd v" - - elseif a:style == 6 " Texplore - call s:SaveBufVars() -" call Decho("style = 6: Texplore") - tabnew - call s:RestoreBufVars() - endif - call s:RestoreWinVars() - endif - norm! 0 - - if a:0 > 0 -" call Decho("case [a:0=".a:0."]>0: a:1<".a:1.">") - if a:1 =~ '^\~' && (has("unix") || (exists("g:netrw_cygwin") && g:netrw_cygwin)) - let dirname= substitute(a:1,'\~',expand("$HOME"),'') -" call Decho("using dirname<".dirname."> (case: ~ && unix||cygwin)") - elseif a:1 == '.' - let dirname= exists("b:netrw_curdir")? b:netrw_curdir : getcwd() - if dirname !~ '/$' - let dirname= dirname."/" - endif -" call Decho("using dirname<".dirname."> (case: ".(exists("b:netrw_curdir")? "b:netrw_curdir" : "getcwd()").")") - elseif a:1 =~ '\$' - let dirname= expand(a:1) - else - let dirname= a:1 -" call Decho("using dirname<".dirname.">") - endif - else - " clear explore -" call Decho("clearing explore variables") - 2match none - if exists("s:explore_match") |unlet s:explore_match |endif - if exists("s:explore_indx") |unlet s:explore_indx |endif - if exists("s:dirstarstar") |unlet s:dirstarstar |endif - if exists("s:dirstarstar") |unlet s:dirstarstar |endif - if exists("w:netrw_explore_indx") |unlet w:netrw_explore_indx |endif - if exists("w:netrw_explore_listlen")|unlet w:netrw_explore_listlen|endif - if exists("w:netrw_explore_list") |unlet w:netrw_explore_list |endif - if exists("w:netrw_explore_bufnr") |unlet w:netrw_explore_bufnr |endif -" redraw! - echo " " - echo " " -" call Dret("netrw#Explore : cleared list") - return - endif - - if dirname =~ '/\*\*/' - " handle .../**/.../filepat -" call Decho("case Explore .../**/.../filepat") - let prefixdir= substitute(dirname,'^\(.\{-}\)\*\*.*$','\1','') - if prefixdir =~ '^/' || (prefixdir =~ '^\a:/' && (has("win32") || has("win95") || has("win64") || has("win16"))) - let b:netrw_curdir = prefixdir - else - let b:netrw_curdir= getcwd().'/'.prefixdir - endif - let dirname= substitute(dirname,'^.\{-}\(\*\*/.*\)$','\1','') - let starpat= 4; -" call Decho("pwd<".getcwd()."> dirname<".dirname.">") -" call Decho("case Explore ../**/../filepat (starpat=".starpat.")") - - elseif dirname =~ '^\*//' - " starpat=1: Explore *//pattern (current directory only search for files containing pattern) -" call Decho("case Explore *//pattern") - let pattern= substitute(dirname,'^\*//\(.*\)$','\1','') - let starpat= 1 -" call Decho("Explore *//pat: (starpat=".starpat.") dirname<".dirname."> -> pattern<".pattern.">") - if &hls | let keepregslash= s:ExplorePatHls(pattern) | endif - - elseif dirname =~ '^\*\*//' - " starpat=2: Explore **//pattern (recursive descent search for files containing pattern) -" call Decho("case Explore **//pattern") - let pattern= substitute(dirname,'^\*\*//','','') - let starpat= 2 -" call Decho("Explore **//pat: (starpat=".starpat.") dirname<".dirname."> -> pattern<".pattern.">") - - elseif dirname =~ '^\*/' - " starpat=3: Explore */filepat (search in current directory for filenames matching filepat) - let starpat= 3 -" call Decho("case Explore */filepat (starpat=".starpat.")") - - elseif dirname=~ '^\*\*/' - " starpat=4: Explore **/filepat (recursive descent search for filenames matching filepat) - let starpat= 4 -" call Decho("case Explore **/filepat (starpat=".starpat.")") - else - let starpat= 0 - endif - - if starpat == 0 && a:indx >= 0 - " [Explore Hexplore Vexplore Sexplore] [dirname] -" call Decho("case dirname<".dirname."> a:indx=".a:indx.": Explore Hexplore Vexplore Sexplore") - if dirname == "" - let dirname= substitute(expand("%:p"),'^\(.*[/\\]\)[^/\\]*$','\1','e') - endif - if dirname =~ '^scp:' || dirname =~ '^ftp:' -" call Decho("calling NetrwBrowse(0,dirname<".dirname.">)") - call s:NetrwBrowse(0,dirname) - else - if dirname == ""|let dirname= getcwd()|endif -" call Decho("calling LocalBrowseCheck(dirname<".dirname.">)") - call netrw#LocalBrowseCheck(dirname) - endif - -" call Decho("curfile<".curfile.">") - if has("win32") || has("win95") || has("win64") || has("win16") - call search('\<'.substitute(curfile,'^.*[/\\]','','e').'\>','cW') - else - call search('\<'.substitute(curfile,'^.*/','','e').'\>','cW') - endif - - " starpat=1: Explore *//pattern (current directory only search for files containing pattern) - " starpat=2: Explore **//pattern (recursive descent search for files containing pattern) - " starpat=3: Explore */filepat (search in current directory for filenames matching filepat) - " starpat=4: Explore **/filepat (recursive descent search for filenames matching filepat) - elseif a:indx <= 0 - " Nexplore, Pexplore, Explore: handle starpat -" call Decho("case Nexplore, Pexplore, <s-down>, <s-up>: starpat=".starpat." a:indx=".a:indx) - if !mapcheck("<s-up>","n") && !mapcheck("<s-down>","n") && exists("b:netrw_curdir") -" call Decho("set up <s-up> and <s-down> maps") - let s:didstarstar= 1 - nnoremap <buffer> <silent> <s-up> :Pexplore<cr> - nnoremap <buffer> <silent> <s-down> :Nexplore<cr> - endif - - if has("path_extra") -" call Decho("starpat=".starpat.": has +path_extra") - if !exists("w:netrw_explore_indx") - let w:netrw_explore_indx= 0 - endif - let indx = a:indx -" call Decho("starpat=".starpat.": set indx= [a:indx=".indx."]") -" - if indx == -1 - " Nexplore -" call Decho("case Nexplore with starpat=".starpat.": (indx=".indx.")") - if !exists("w:netrw_explore_list") " sanity check - call netrw#ErrorMsg(s:WARNING,"using Nexplore or <s-down> improperly; see help for netrw-starstar",40) - silent! let @* = keepregstar - silent! let @+ = keepregstar - silent! let @/ = keepregslash -" call Dret("netrw#Explore") - return - endif - let indx= w:netrw_explore_indx - if indx < 0 | let indx= 0 | endif - if indx >= w:netrw_explore_listlen | let indx= w:netrw_explore_listlen - 1 | endif - let curfile= w:netrw_explore_list[indx] -" call Decho("indx=".indx." curfile<".curfile.">") - while indx < w:netrw_explore_listlen && curfile == w:netrw_explore_list[indx] - let indx= indx + 1 -" call Decho("indx=".indx." (Nexplore while loop)") - endwhile - if indx >= w:netrw_explore_listlen | let indx= w:netrw_explore_listlen - 1 | endif -" call Decho("Nexplore: indx= [w:netrw_explore_indx=".w:netrw_explore_indx."]=".indx) - - elseif indx == -2 - " Pexplore -" call Decho("case Pexplore with starpat=".starpat.": (indx=".indx.")") - if !exists("w:netrw_explore_list") " sanity check - call netrw#ErrorMsg(s:WARNING,"using Pexplore or <s-up> improperly; see help for netrw-starstar",41) - silent! let @* = keepregstar - silent! let @+ = keepregstar - silent! let @/ = keepregslash -" call Dret("netrw#Explore") - return - endif - let indx= w:netrw_explore_indx - if indx < 0 | let indx= 0 | endif - if indx >= w:netrw_explore_listlen | let indx= w:netrw_explore_listlen - 1 | endif - let curfile= w:netrw_explore_list[indx] -" call Decho("indx=".indx." curfile<".curfile.">") - while indx >= 0 && curfile == w:netrw_explore_list[indx] - let indx= indx - 1 -" call Decho("indx=".indx." (Pexplore while loop)") - endwhile - if indx < 0 | let indx= 0 | endif -" call Decho("Pexplore: indx= [w:netrw_explore_indx=".w:netrw_explore_indx."]=".indx) - - else - " Explore -- initialize - " build list of files to Explore with Nexplore/Pexplore -" call Decho("starpat=".starpat.": case Explore: initialize (indx=".indx.")") - let w:netrw_explore_indx= 0 - if !exists("b:netrw_curdir") - let b:netrw_curdir= getcwd() - endif -" call Decho("starpat=".starpat.": b:netrw_curdir<".b:netrw_curdir.">") - - " switch on starpat to build the w:netrw_explore_list of files - if starpat == 1 - " starpat=1: Explore *//pattern (current directory only search for files containing pattern) -" call Decho("starpat=".starpat.": build *//pattern list") - exe "vimgrep /".pattern."/gj ".b:netrw_curdir."/*" - let w:netrw_explore_list = map(getqflist(),'bufname(v:val.bufnr)') - if &hls | let keepregslash= s:ExplorePatHls(pattern) | endif - - elseif starpat == 2 - " starpat=2: Explore **//pattern (recursive descent search for files containing pattern) -" call Decho("starpat=".starpat.": build **//pattern list") - try - exe "silent vimgrep /".pattern."/gj "."**/*" - catch /^Vim\%((\a\+)\)\=:E480/ - call netrw#ErrorMsg(s:WARNING,'no files matched pattern<'.pattern.'>',45) - if &hls | let keepregslash= s:ExplorePatHls(pattern) | endif - silent! let @* = keepregstar - silent! let @+ = keepregstar - silent! let @/ = keepregslash -" call Dret("netrw#Explore : no files matched pattern") - return - endtry - let s:netrw_curdir = b:netrw_curdir - let w:netrw_explore_list = getqflist() - let w:netrw_explore_list = map(w:netrw_explore_list,'s:netrw_curdir."/".bufname(v:val.bufnr)') - - elseif starpat == 3 - " starpat=3: Explore */filepat (search in current directory for filenames matching filepat) -" call Decho("starpat=".starpat.": build */filepat list") - let dirname = substitute(dirname,'^\*/','','') - let w:netrw_explore_list= split(expand(b:netrw_curdir."/".dirname),'\n') - if &hls | let keepregslash= s:ExplorePatHls(dirname) | endif - - elseif starpat == 4 - " starpat=4: Explore **/filepat (recursive descent search for filenames matching filepat) -" call Decho("starpat=".starpat.": build **/filepat list") - let w:netrw_explore_list= split(expand(b:netrw_curdir."/".dirname),'\n') - if &hls | let keepregslash= s:ExplorePatHls(dirname) | endif - endif " switch on starpat to build w:netrw_explore_list - - let w:netrw_explore_listlen = len(w:netrw_explore_list) -" call Decho("w:netrw_explore_list<".string(w:netrw_explore_list).">") -" call Decho("w:netrw_explore_listlen=".w:netrw_explore_listlen) - - if w:netrw_explore_listlen == 0 || (w:netrw_explore_listlen == 1 && w:netrw_explore_list[0] =~ '\*\*\/') - call netrw#ErrorMsg(s:WARNING,"no files matched",42) - silent! let @* = keepregstar - silent! let @+ = keepregstar - silent! let @/ = keepregslash -" call Dret("netrw#Explore : no files matched") - return - endif - endif " if indx ... endif - - " NetrwStatusLine support - for exploring support - let w:netrw_explore_indx= indx -" call Decho("explorelist<".join(w:netrw_explore_list,',')."> len=".w:netrw_explore_listlen) - - " wrap the indx around, but issue a note - if indx >= w:netrw_explore_listlen || indx < 0 -" call Decho("wrap indx (indx=".indx." listlen=".w:netrw_explore_listlen.")") - let indx = (indx < 0)? ( w:netrw_explore_listlen - 1 ) : 0 - let w:netrw_explore_indx= indx - call netrw#ErrorMsg(s:NOTE,"no more files match Explore pattern",43) - sleep 1 - endif - - exe "let dirfile= w:netrw_explore_list[".indx."]" -" call Decho("dirfile=w:netrw_explore_list[indx=".indx."]= <".dirfile.">") - let newdir= substitute(dirfile,'/[^/]*$','','e') -" call Decho("newdir<".newdir.">") - -" call Decho("calling LocalBrowseCheck(newdir<".newdir.">)") - call netrw#LocalBrowseCheck(newdir) - if !exists("w:netrw_liststyle") - let w:netrw_liststyle= g:netrw_liststyle - endif - if w:netrw_liststyle == s:THINLIST || w:netrw_liststyle == s:LONGLIST - call search('^'.substitute(dirfile,"^.*/","","").'\>',"W") - else - call search('\<'.substitute(dirfile,"^.*/","","").'\>',"w") - endif - let w:netrw_explore_mtchcnt = indx + 1 - let w:netrw_explore_bufnr = bufnr("%") - let w:netrw_explore_line = line(".") - call s:SetupNetrwStatusLine('%f %h%m%r%=%9*%{NetrwStatusLine()}') -" call Decho("explore: mtchcnt=".w:netrw_explore_mtchcnt." bufnr=".w:netrw_explore_bufnr." line#".w:netrw_explore_line) - - else -" call Decho("your vim does not have +path_extra") - if !exists("g:netrw_quiet") - call netrw#ErrorMsg(s:WARNING,"your vim needs the +path_extra feature for Exploring with **!",44) - endif - silent! let @* = keepregstar - silent! let @+ = keepregstar - silent! let @/ = keepregslash -" call Dret("netrw#Explore : missing +path_extra") - return - endif - - else -" call Decho("case Explore newdir<".dirname.">") - if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && dirname =~ '/' - silent! unlet w:netrw_treedict - silent! unlet w:netrw_treetop - endif - let newdir= dirname - if !exists("b:netrw_curdir") - call netrw#LocalBrowseCheck(getcwd()) - else - call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,newdir)) - endif - endif - - " visual display of **/ **// */ Exploration files - if exists("w:netrw_explore_indx") && exists("b:netrw_curdir") - if !exists("s:explore_prvdir") || s:explore_prvdir != b:netrw_curdir - " only update match list if current directory isn't the same as before - let s:explore_prvdir = b:netrw_curdir - let s:explore_match = "" - let dirlen = strlen(b:netrw_curdir) - if b:netrw_curdir !~ '/$' - let dirlen= dirlen + 1 - endif - let prvfname= "" - for fname in w:netrw_explore_list -" call Decho("fname<".fname.">") - if fname =~ '^'.b:netrw_curdir - if s:explore_match == "" - let s:explore_match= '\<'.escape(strpart(fname,dirlen),g:netrw_markfileesc."'".g:netrw_markfileesc."'").'\>' - else - let s:explore_match= s:explore_match.'\|\<'.escape(strpart(fname,dirlen),g:netrw_markfileesc."'".g:netrw_markfileesc."'").'\>' - endif - elseif fname !~ '^/' && fname != prvfname - if s:explore_match == "" - let s:explore_match= '\<'.escape(fname,g:netrw_markfileesc."'".g:netrw_markfileesc."'").'\>' - else - let s:explore_match= s:explore_match.'\|\<'.escape(fname,g:netrw_markfileesc."'".g:netrw_markfileesc."'").'\>' - endif - endif - let prvfname= fname - endfor -" call Decho("explore_match<".s:explore_match.">") - exe "2match netrwMarkFile /".s:explore_match."/" - endif - echo "<s-up>==Pexplore <s-down>==Nexplore" - else - 2match none - if exists("s:explore_match") | unlet s:explore_match | endif - if exists("s:explore_prvdir") | unlet s:explore_prvdir | endif - echo " " -" call Decho("cleared explore match list") - endif - - silent! let @* = keepregstar - silent! let @+ = keepregstar - silent! let @/ = keepregslash -" call Dret("netrw#Explore : @/<".@/.">") -endfun - -" --------------------------------------------------------------------- -" s:NetrwHide: this function is invoked by the "a" map for browsing {{{2 -" and switches the hiding mode. The actual hiding is done by -" s:NetrwListHide(). -" g:netrw_hide= 0: show all -" 1: show not-hidden files -" 2: show hidden files only -fun! s:NetrwHide(islocal) -" call Dfunc("NetrwHide(islocal=".a:islocal.") g:netrw_hide=".g:netrw_hide) - let svpos= netrw#NetrwSavePosn() - - if exists("s:netrwmarkfilelist_{bufnr('%')}") -" call Decho(((g:netrw_hide == 1)? "unhide" : "hide")." files in markfilelist<".string(s:netrwmarkfilelist_{bufnr("%")}).">") -" call Decho("g:netrw_list_hide<".g:netrw_list_hide.">") - - " hide the files in the markfile list - for fname in s:netrwmarkfilelist_{bufnr("%")} -" call Decho("match(g:netrw_list_hide<".g:netrw_list_hide.'> fname<\<'.fname.'\>>)='.match(g:netrw_list_hide,'\<'.fname.'\>')." isk=".&isk) - if match(g:netrw_list_hide,'\<'.fname.'\>') != -1 - " remove fname from hiding list - let g:netrw_list_hide= substitute(g:netrw_list_hide,'..\<'.escape(fname,g:netrw_fname_escape).'\>..','','') - let g:netrw_list_hide= substitute(g:netrw_list_hide,',,',',','g') - let g:netrw_list_hide= substitute(g:netrw_list_hide,'^,\|,$','','') -" call Decho("unhide: g:netrw_list_hide<".g:netrw_list_hide.">") - else - " append fname to hiding list - if exists("g:netrw_list_hide") && g:netrw_list_hide != "" - let g:netrw_list_hide= g:netrw_list_hide.',\<'.escape(fname,g:netrw_fname_escape).'\>' - else - let g:netrw_list_hide= '\<'.escape(fname,g:netrw_fname_escape).'\>' - endif -" call Decho("hide: g:netrw_list_hide<".g:netrw_list_hide.">") - endif - endfor - unlet s:netrwmarkfilelist_{bufnr("%")} - unlet s:netrwmarkfilemtch_{bufnr("%")} - 2match none - let g:netrw_hide= 1 - - else - - " switch between show-all/show-not-hidden/show-hidden - let g:netrw_hide=(g:netrw_hide+1)%3 - exe "norm! 0" - if g:netrw_hide && g:netrw_list_hide == "" - call netrw#ErrorMsg(s:WARNING,"your hiding list is empty!",49) -" call Dret("NetrwHide") - return - endif - endif - - call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./')) - call netrw#NetrwRestorePosn(svpos) -" call Dret("NetrwHide") -endfun - -" --------------------------------------------------------------------- -" s:NetrwHidden: invoked by "gh" {{{2 -fun! s:NetrwHidden(islocal) -" call Dfunc("s:NetrwHidden()") - " save current position - let svpos= netrw#NetrwSavePosn() - - if g:netrw_list_hide =~ '\(^\|,\)\\(^\\|\\s\\s\\)\\zs\\.\\S\\+' - " remove pattern from hiding list - let g:netrw_list_hide= substitute(g:netrw_list_hide,'\(^\|,\)\\(^\\|\\s\\s\\)\\zs\\.\\S\\+','','') - elseif strlen(g:netrw_list_hide) >= 1 - let g:netrw_list_hide= g:netrw_list_hide . ',\(^\|\s\s\)\zs\.\S\+' - else - let g:netrw_list_hide= '\(^\|\s\s\)\zs\.\S\+' - endif - - " refresh screen and return to saved position - call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./')) - call netrw#NetrwRestorePosn(svpos) -" call Dret("s:NetrwHidden") -endfun - -" --------------------------------------------------------------------- -" s:NetrwLeftmouse: handles the <leftmouse> when in a netrw browsing window {{{2 -fun! s:NetrwLeftmouse(islocal) -" call Dfunc("s:NetrwLeftmouse(islocal=".a:islocal.")") - if a:islocal - if exists("b:netrw_curdir") - call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,s:NetrwGetWord())) - endif - else - if exists("b:netrw_curdir") - call s:NetrwBrowse(0,s:NetrwBrowseChgDir(0,s:NetrwGetWord())) - endif - endif -" call Dret("s:NetrwLeftmouse") -endfun - -" --------------------------------------------------------------------- -" s:NetrwListHide: uses [range]g~...~d to delete files that match comma {{{2 -" separated patterns given in g:netrw_list_hide -fun! s:NetrwListHide() -" call Dfunc("NetrwListHide() hide=".g:netrw_hide." listhide<".g:netrw_list_hide.">") - - " find a character not in the "hide" string to use as a separator for :g and :v commands - " How-it-works: take the hiding command, convert it into a range. Duplicate - " characters don't matter. Remove all such characters from the '/~...90' - " string. Use the first character left as a separator character. - let listhide= g:netrw_list_hide - let sep = strpart(substitute('/~@#$%^&*{};:,<.>?|1234567890','['.escape(listhide,'-]^\').']','','ge'),1,1) -" call Decho("sep=".sep) - - while listhide != "" - if listhide =~ ',' - let hide = substitute(listhide,',.*$','','e') - let listhide = substitute(listhide,'^.\{-},\(.*\)$','\1','e') - else - let hide = listhide - let listhide = "" - endif - - " Prune the list by hiding any files which match - if g:netrw_hide == 1 -" call Decho("hiding<".hide."> listhide<".listhide.">") - exe 'silent keepjumps '.w:netrw_bannercnt.',$g'.sep.hide.sep.'d' - elseif g:netrw_hide == 2 -" call Decho("showing<".hide."> listhide<".listhide.">") - exe 'silent keepjumps '.w:netrw_bannercnt.',$g'.sep.hide.sep.'s@^@ /-KEEP-/ @' - endif - endwhile - if g:netrw_hide == 2 - exe 'silent keepjumps '.w:netrw_bannercnt.',$v@^ /-KEEP-/ @d' - exe 'silent keepjumps '.w:netrw_bannercnt.',$s@^\%( /-KEEP-/ \)\+@@e' - endif - -" call Dret("NetrwListHide") -endfun - -" --------------------------------------------------------------------- -" NetrwHideEdit: allows user to edit the file/directory hiding list -fun! s:NetrwHideEdit(islocal) -" call Dfunc("NetrwHideEdit(islocal=".a:islocal.")") - - " save current cursor position - let svpos= netrw#NetrwSavePosn() - - " get new hiding list from user - call inputsave() - let newhide= input("Edit Hiding List: ",g:netrw_list_hide) - call inputrestore() - let g:netrw_list_hide= newhide -" call Decho("new g:netrw_list_hide<".g:netrw_list_hide.">") - - " refresh the listing - silent call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,"./")) - - " restore cursor position - call netrw#NetrwRestorePosn(svpos) - -" call Dret("NetrwHideEdit") -endfun - -" --------------------------------------------------------------------- -" NetSortSequence: allows user to edit the sorting sequence -fun! s:NetSortSequence(islocal) -" call Dfunc("NetSortSequence(islocal=".a:islocal.")") - - let svpos= netrw#NetrwSavePosn() - call inputsave() - let newsortseq= input("Edit Sorting Sequence: ",g:netrw_sort_sequence) - call inputrestore() - - " refresh the listing - let g:netrw_sort_sequence= newsortseq - call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./')) - call netrw#NetrwRestorePosn(svpos) - -" call Dret("NetSortSequence") -endfun - -" --------------------------------------------------------------------- -" s:NetrwMakeDir: this function makes a directory (both local and remote) {{{2 -fun! s:NetrwMakeDir(usrhost) -" call Dfunc("NetrwMakeDir(usrhost<".a:usrhost.">)") - - " get name of new directory from user. A bare <CR> will skip. - " if its currently a directory, also request will be skipped, but with - " a message. - call inputsave() - let newdirname= input("Please give directory name: ") - call inputrestore() -" call Decho("newdirname<".newdirname.">") - - if newdirname == "" -" call Dret("NetrwMakeDir : user aborted with bare <cr>") - return - endif - - if a:usrhost == "" - - " Local mkdir: - " sanity checks - let fullnewdir= b:netrw_curdir.'/'.newdirname -" call Decho("fullnewdir<".fullnewdir.">") - if isdirectory(fullnewdir) - if !exists("g:netrw_quiet") - call netrw#ErrorMsg(s:WARNING,"<".newdirname."> is already a directory!",24) - endif -" call Dret("NetrwMakeDir : directory<".newdirname."> exists previously") - return - endif - if s:FileReadable(fullnewdir) - if !exists("g:netrw_quiet") - call netrw#ErrorMsg(s:WARNING,"<".newdirname."> is already a file!",25) - endif -" call Dret("NetrwMakeDir : file<".newdirname."> exists previously") - return - endif - - " requested new local directory is neither a pre-existing file or - " directory, so make it! - if exists("*mkdir") - call mkdir(fullnewdir,"p") - else - let netrw_origdir= s:NetrwGetcwd(1) - exe 'keepjumps cd '.b:netrw_curdir -" call Decho("netrw_origdir<".netrw_origdir.">: cd b:netrw_curdir<".b:netrw_curdir.">") -" call Decho("exe silent! !".g:netrw_local_mkdir.' '.g:netrw_shq.newdirname.g:netrw_shq) - exe "silent! !".g:netrw_local_mkdir.' '.g:netrw_shq.newdirname.g:netrw_shq - if !g:netrw_keepdir - exe 'keepjumps cd '.netrw_origdir -" call Decho("netrw_keepdir=".g:netrw_keepdir.": cd ".netrw_origdir." getcwd<".getcwd().">") - endif - endif - - if v:shell_error == 0 - " refresh listing -" call Decho("refresh listing") - let svpos= netrw#NetrwSavePosn() - call s:NetrwRefresh(1,s:NetrwBrowseChgDir(1,'./')) - call netrw#NetrwRestorePosn(svpos) - elseif !exists("g:netrw_quiet") - call netrw#ErrorMsg(s:ERROR,"unable to make directory<".newdirname.">",26) - endif -" redraw! - - else - " Remote mkdir: - let mkdircmd = s:MakeSshCmd(g:netrw_mkdir_cmd) - let newdirname= substitute(b:netrw_curdir,'^\%(.\{-}/\)\{3}\(.*\)$','\1','').newdirname -" call Decho("exe silent! !".mkdircmd." ".g:netrw_shq.newdirname.g:netrw_shq) - exe "silent! !".mkdircmd." ".g:netrw_shq.newdirname.g:netrw_shq - if v:shell_error == 0 - " refresh listing - let svpos= netrw#NetrwSavePosn() - call s:NetrwRefresh(0,s:NetrwBrowseChgDir(0,'./')) - call netrw#NetrwRestorePosn(svpos) - elseif !exists("g:netrw_quiet") - call netrw#ErrorMsg(s:ERROR,"unable to make directory<".newdirname.">",27) - endif -" redraw! - endif - -" call Dret("NetrwMakeDir") -endfun - -" --------------------------------------------------------------------- -" s:NetrwMarkFile: (invoked by mf) This function is used to both {{{2 -" mark and unmark files. If a markfile list exists, -" then the rename and delete functions will use it instead -" of whatever may happen to be under the cursor at that -" moment. When the mouse and gui are available, -" shift-leftmouse may also be used to mark files. -fun! s:NetrwMarkFile(islocal,fname) -" call Dfunc("s:NetrwMarkFile(islocal=".a:islocal." fname<".a:fname.">)") - let curbufnr= bufnr("%") - let curdir = b:netrw_curdir - if exists("s:netrwmarkfilelist_{curbufnr}") - " markfile list exists -" call Decho("starting s:netrwmarkfilelist_{curbufnr}<".string(s:netrwmarkfilelist_{curbufnr}).">") -" call Decho("starting s:netrwmarkfilemtch_{curbufnr}<".s:netrwmarkfilemtch_{curbufnr}.">") - - if index(s:netrwmarkfilelist_{curbufnr},a:fname) == -1 - " append filename to local-directory markfilelist -" call Decho("append filename<".a:fname."> to local markfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}).">") - call add(s:netrwmarkfilelist_{curbufnr},a:fname) - let s:netrwmarkfilemtch_{curbufnr}= s:netrwmarkfilemtch_{curbufnr}.'\|\<'.escape(a:fname,g:netrw_markfileesc."'".g:netrw_markfileesc."'").'\>' - - else - " remove filename from local markfilelist -" call Decho("remove filename<".a:fname."> from local markfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}).">") - call filter(s:netrwmarkfilelist_{curbufnr},'v:val != a:fname') - if s:netrwmarkfilelist_{curbufnr} == [] - " local markfilelist is empty; remove it entirely -" call Decho("markfile list now empty, unlet s:netrwmarkfilelist_".curbufnr." and ...mtch_".curbufnr) - call s:NetrwUnmarkList(curbufnr,curdir) - else - " rebuild match list to display markings correctly -" call Decho("rebuild s:netrwmarkfilemtch_".curbufnr) - let s:netrwmarkfilemtch_{curbufnr}= "" - let first = 1 - for fname in s:netrwmarkfilelist_{curbufnr} - if first - let s:netrwmarkfilemtch_{curbufnr}= s:netrwmarkfilemtch_{curbufnr}.'\<'.escape(fname,g:netrw_markfileesc."'".g:netrw_markfileesc."'").'\>' - else - let s:netrwmarkfilemtch_{curbufnr}= s:netrwmarkfilemtch_{curbufnr}.'\|\<'.escape(fname,g:netrw_markfileesc."'".g:netrw_markfileesc."'").'\>' - endif - let first= 0 - endfor -" call Decho("ending s:netrwmarkfilelist_"curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}).">") -" call Decho("ending s:netrwmarkfilemtch_"curbufnr."<".s:netrwmarkfilemtch_{curbufnr}.">") - endif - endif - - else - " initialize new markfilelist - -" call Decho("add fname<".a:fname."> to new markfilelist_".curbufnr) - let s:netrwmarkfilelist_{curbufnr}= [] - call add(s:netrwmarkfilelist_{curbufnr},a:fname) -" call Decho("ending s:netrwmarkfilelist_{curbufnr}<".string(s:netrwmarkfilelist_{curbufnr}).">") - - " build initial markfile matching pattern - if a:fname =~ '/$' - let s:netrwmarkfilemtch_{curbufnr}= '\<'.escape(a:fname,g:netrw_markfileesc) - else - let s:netrwmarkfilemtch_{curbufnr}= '\<'.escape(a:fname,g:netrw_markfileesc).'\>' - endif -" call Decho("ending s:netrwmarkfilemtch_".curbufnr."<".s:netrwmarkfilemtch_{curbufnr}.">") - endif - - " handle global markfilelist - if exists("s:netrwmarkfilelist") - let dname= s:ComposePath(b:netrw_curdir,a:fname) - if index(s:netrwmarkfilelist,dname) == -1 - " append new filename to global markfilelist - call add(s:netrwmarkfilelist,s:ComposePath(b:netrw_curdir,a:fname)) -" call Decho("append filename<".a:fname."> to global markfilelist<".string(s:netrwmarkfilelist).">") - else - " remove new filename from global markfilelist -" call Decho("filter(".string(s:netrwmarkfilelist).",'v:val != '.".dname.")") - call filter(s:netrwmarkfilelist,'v:val != "'.dname.'"') -" call Decho("ending s:netrwmarkfilelist <".string(s:netrwmarkfilelist).">") - if s:netrwmarkfilelist == [] - unlet s:netrwmarkfilelist - endif - endif - else - " initialize new global-directory markfilelist - let s:netrwmarkfilelist= [] - call add(s:netrwmarkfilelist,s:ComposePath(b:netrw_curdir,a:fname)) -" call Decho("init s:netrwmarkfilelist<".string(s:netrwmarkfilelist).">") - endif - - " set up 2match'ing to netrwmarkfilemtch list - if exists("s:netrwmarkfilemtch_{curbufnr}") && s:netrwmarkfilemtch_{curbufnr} != "" -" call Decho("exe 2match netrwMarkFile /".s:netrwmarkfilemtch_{curbufnr}."/") - exe "2match netrwMarkFile /".s:netrwmarkfilemtch_{curbufnr}."/" - else -" call Decho("2match none") - 2match none - endif -" call Dret("s:NetrwMarkFile : netrwmarkfilelist_".curbufnr."<".(exists("s:netrwmarkfilelist_{curbufnr}")? string(s:netrwmarkfilelist_{curbufnr}) : " doesn't exist").">") -endfun - -" --------------------------------------------------------------------- -" s:NetrwMarkFileCompress: (invoked by mz) This function is used to {{{2 -" compress/decompress files using the programs -" in g:netrw_compress and g:netrw_uncompress, -" using g:netrw_compress_suffix to know which to -" do. By default: -" g:netrw_compress = "gzip" -" g:netrw_decompress = { ".gz" : "gunzip" , ".bz2" : "bunzip2" , ".zip" : "unzip" , ".tar" : "tar -xf"} -fun! s:NetrwMarkFileCompress(islocal) -" call Dfunc("s:NetrwMarkFileCompress(islocal=".a:islocal.")") - let svpos = netrw#NetrwSavePosn() - let curdir = b:netrw_curdir - let curbufnr = bufnr("%") - - if exists("s:netrwmarkfilelist_{curbufnr}") && exists("g:netrw_compress") && exists("g:netrw_decompress") - for fname in s:netrwmarkfilelist_{curbufnr} - " for every filename in the marked list - for sfx in sort(keys(g:netrw_decompress)) - if fname =~ '\'.sfx.'$' - " fname has a suffix indicating that its compressed; apply associated decompression routine - let exe= g:netrw_decompress[sfx] -" call Decho("fname<".fname."> is compressed so decompress with <".exe.">") - if a:islocal - if g:netrw_keepdir - let fname= s:ComposePath(curdir,fname) - endif - else - let fname= b:netrw_curdir.fname - endif - if executable(exe) - if a:islocal - call system(exe." ".fname) - else - call s:RemoteSystem(exe." ".fname) - endif - else - call netrw#ErrorMsg(s:WARNING,"unable to apply<".exe."> to file<".fname.">",50) - endif - break - endif - endfor - if exists("exe") - unlet exe - elseif a:islocal - " fname not a compressed file, so compress it - call system(g:netrw_compress." ".s:ComposePath(b:netrw_curdir,fname)) - else - " fname not a compressed file, so compress it - call s:RemoteSystem(g:netrw_compress." ".fname) - endif - endfor - call s:NetrwUnmarkList(curbufnr,curdir) - call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./')) - call netrw#NetrwRestorePosn(svpos) - endif -" call Dret("s:NetrwMarkFileCompress") -endfun - -" --------------------------------------------------------------------- -" s:NetrwMarkFileCopy: (invoked by mc) copy marked files to target {{{2 -" If no marked files, then set up directory as the -" target. Currently does not support copying entire -" directories. Uses the global marked file list. -" Returns 1=success (used by NetrwMarkFileMove()) -" 0=failure -fun! s:NetrwMarkFileCopy(islocal) -" call Dfunc("s:NetrwMarkFileCopy(islocal=".a:islocal.") target<".(exists("s:netrwmftgt")? s:netrwmftgt : '---').">") - - " s:netrwmarkfilelist_{bufnr("%")}: the List of marked files - let curbufnr= bufnr("%") - if exists("s:netrwmarkfilelist") -" call Decho("s:netrwmarkfilelist<".string(s:netrwmarkfilelist).">") - let svpos = netrw#NetrwSavePosn() - let curdir = b:netrw_curdir - - " s:netrwmftgt : name of directory to copy files to - " s:netrwmfloc : =0 target directory is remote - " =1 target directory is local - if exists("s:netrwmftgt") && exists("s:netrwmfloc") -" call Decho("s:netrwmftgt<".s:netrwmftgt.">") -" call Decho("s:netrwmfloc=".s:netrwmfloc) - - for fname in s:netrwmarkfilelist -" call Decho("s:NetrwMarkFileCopy: fname<".fname.">") - - " sanity check - if (a:islocal && isdirectory(fname)) || (!a:islocal && fname =~ '/$') - call netrw#ErrorMsg(s:ERROR,"currently netrw can't copy entire directories such as <".fname.">",58) -" call Dret("s:NetrwMarkFileCopy 0 : currently netrw can't copy entire directories") - return 0 - endif - - if a:islocal && s:netrwmfloc - " local to local copy -" call Decho("local to local copy") -" call Decho("from b:netrw_curdir<".b:netrw_curdir."> fname<".fname."> to s:netrwmftgt<".s:netrwmftgt.">") - if executable(g:netrw_localcopycmd) -" call Decho("let ret= system(".g:netrw_localcopycmd." ".s:ComposePath(b:netrw_curdir,fname)." ".s:netrwmftgt.")") - let ret= system(g:netrw_localcopycmd." "." ".s:netrwmftgt) " global markfilelist verison - if v:shell_error < 0 - call netrw#ErrorMsg(s:ERROR,"command<".g:netrw_localcopycmd."> failed, aborting",54) - break - endif - else - call netrw#ErrorMsg(s:ERROR,"command<".g:netrw_localcopycmd."> is not executable!",57) - break - endif - - elseif !a:islocal && s:netrwmfloc - " remote to local copy -" call Decho("remote to local copy") -" call Decho("getcwd<".getcwd()."> b:netrw_curdir<".b:netrw_curdir.">") - call netrw#NetrwObtain(a:islocal,fname,s:netrwmftgt) - - elseif a:islocal && !s:netrwmfloc - " local to remote copy -" call Decho("local to remote copy") -" call Decho("getcwd<".getcwd()."> b:netrw_curdir<".b:netrw_curdir.">") - call s:NetrwUpload(fname,s:netrwmftgt) - - else - " remote to remote copy -" call Decho("remote to remote copy") - call s:NetrwUpload(fname,s:netrwmftgt) - endif - endfor - - " unmark all marked file lists - call s:NetrwUnmarkAll() - else - call netrw#ErrorMsg(s:ERROR,"missing a markfile copy target! (see help for netrw-mt)",56) - endif - - " refresh the listing - call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./')) - call netrw#NetrwRestorePosn(svpos) - else - call netrw#ErrorMsg(s:ERROR,"no files marked!",59) - endif - -" call Dret("s:NetrwMarkFileCopy 1") - return 1 -endfun - -" --------------------------------------------------------------------- -" s:NetrwMarkFileDiff: (invoked by md) This function is used to {{{2 -" invoke vim's diff mode on the marked files. -" Either two or three files can be so handled. -" Uses the global marked file list. -fun! s:NetrwMarkFileDiff(islocal) -" call Dfunc("s:NetrwMarkFileDiff(islocal=".a:islocal.") b:netrw_curdir<".b:netrw_curdir.">") - let curbufnr= bufnr("%") - if exists("s:netrwmarkfilelist_{curbufnr}") - - let cnt = 0 - let curdir = b:netrw_curdir - for fname in s:netrwmarkfilelist - let cnt= cnt + 1 - if !a:islocal - let fname= curdir.fname - endif - if cnt == 1 -" call Decho("diffthis: ".fname) - exe "e ".fname - diffthis - elseif cnt == 2 || cnt == 3 - vsplit - wincmd l -" call Decho("diffthis: ".fname) - exe "e ".fname - diffthis - else - break - endif - endfor - call s:NetrwUnmarkList(curbufnr,curdir) - endif -" call Dret("s:NetrwMarkFileDiff") -endfun - -" --------------------------------------------------------------------- -" s:NetrwMarkFileEdit: (invoked by me) put marked files on arg list and start editing them {{{2 -" Uses global markfilelist -fun! s:NetrwMarkFileEdit(islocal) -" call Dfunc("s:NetrwMarkFileEdit(islocal=".a:islocal.")") - - let curdir = b:netrw_curdir - let curbufnr = bufnr("%") - if exists("s:netrwmarkfilelist_{curbufnr}") - call s:SetRexDir(a:islocal,curdir) - if a:islocal && g:netrw_keepdir - " use complete paths if its local and keepdir enabled - let flist= "" - for fname in s:netrwmarkfilelist -" let flist= flist." ".s:ComposePath(curdir,fname) - let flist= flist." ".fname - endfor - else -" let flist= substitute(escape(join(s:netrwmarkfilelist_{curbufnr},"\t"),' '),"\t",' ','g') - let flist= substitute(escape(join(s:netrwmarkfilelist,"\t"),' '),"\t",' ','g') - endif - " unmark markedfile list -" call s:NetrwUnmarkList(curbufnr,curdir) - call s:NetrwUnmarkAll() -" call Decho("exe silent args ".flist) - exe "silent args ".flist - endif - -" call Dret("s:NetrwMarkFileEdit") -endfun - -" --------------------------------------------------------------------- -" s:NetrwMarkFileExe: (invoked by mx) execute arbitrary command on marked files, one at a time {{{2 -" Uses the local marked-file list. -fun! s:NetrwMarkFileExe(islocal) -" call Dfunc("s:NetrwMarkFileExe(islocal=".a:islocal.")") - let svpos = netrw#NetrwSavePosn() - let curdir = b:netrw_curdir - let curbufnr = bufnr("%") - - if exists("s:netrwmarkfilelist_{curbufnr}") - " get the command - call inputsave() - let cmd= input("Enter command: ","","file") - call inputrestore() -" call Decho("cmd<".cmd.">") - - " apply command to marked files. Substitute: filename -> % - " If no %, then append a space and the filename to the command - for fname in s:netrwmarkfilelist_{curbufnr} - if a:islocal - if g:netrw_keepdir - let fname= s:ComposePath(curdir,fname) - endif - else - let fname= b:netrw_curdir.fname - endif - if cmd =~ '%' - let xcmd= substitute(cmd,'%',fname,'g') - else - let xcmd= cmd.' '.fname - endif - if a:islocal -" call Decho("local: xcmd<".xcmd.">") - let ret= system(xcmd) - else -" call Decho("remote: xcmd<".xcmd.">") - let ret= s:RemoteSystem(xcmd) - endif - if v:shell_error < 0 - call netrw#ErrorMsg(s:ERROR,"command<".xcmd."> failed, aborting",54) - break - else - echo ret - endif - endfor - - " unmark marked file list - call s:NetrwUnmarkList(curbufnr,curdir) - - " refresh the listing - call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./')) - call netrw#NetrwRestorePosn(svpos) - else - call netrw#ErrorMsg(s:ERROR,"no files marked!",59) - endif - -" call Dret("s:NetrwMarkFileExe") -endfun - -" --------------------------------------------------------------------- -" s:NetrwMarkHideSfx: (invoked by mh) (un)hide files having same suffix -" as the marked file(s) (toggles suffix presence) -" Uses the local marked file list. -fun! s:NetrwMarkHideSfx(islocal) -" call Dfunc("s:NetrwMarkHideSfx(islocal=".a:islocal.")") - let svpos = netrw#NetrwSavePosn() - let curbufnr = bufnr("%") - - " s:netrwmarkfilelist_{curbufnr}: the List of marked files - if exists("s:netrwmarkfilelist_{curbufnr}") - - for fname in s:netrwmarkfilelist_{curbufnr} -" call Decho("s:NetrwMarkFileCopy: fname<".fname.">") - " construct suffix pattern - if fname =~ '\.' - let sfxpat= "^.*".substitute(fname,'^.*\(\.[^. ]\+\)$','\1','') - else - let sfxpat= '^\%(\%(\.\)\@!.\)*$' - endif - " determine if its in the hiding list or not - let inhidelist= 0 - if g:netrw_list_hide != "" - let itemnum = 0 - let hidelist= split(g:netrw_list_hide,',') - for hidepat in hidelist - if sfxpat == hidepat - let inhidelist= 1 - break - endif - let itemnum= itemnum + 1 - endfor - endif -" call Decho("fname<".fname."> inhidelist=".inhidelist." sfxpat<".sfxpat.">") - if inhidelist - " remove sfxpat from list - call remove(hidelist,itemnum) - let g:netrw_list_hide= join(hidelist,",") - elseif g:netrw_list_hide != "" - " append sfxpat to non-empty list - let g:netrw_list_hide= g:netrw_list_hide.",".sfxpat - else - " set hiding list to sfxpat - let g:netrw_list_hide= sfxpat - endif - endfor - - " refresh the listing - call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./')) - call netrw#NetrwRestorePosn(svpos) - else - call netrw#ErrorMsg(s:ERROR,"no files marked!",59) - endif - -" call Dret("s:NetrwMarkHideSfx") -endfun - -" --------------------------------------------------------------------- -" s:NetrwMarkFileMove: (invoked by mm) execute arbitrary command on marked files, one at a time {{{2 -" uses the global marked file list -fun! s:NetrwMarkFileMove(islocal) -" call Dfunc("s:NetrwMarkFileMove(islocal=".a:islocal.")") - - if exists("s:netrwmarkfilelist") - let svpos = netrw#NetrwSavePosn() - let curbufnr = bufnr("%") - let curdir = b:netrw_curdir - if exists("s:netrwmftgt") && exists("s:netrwmfloc") - - for fname in s:netrwmarkfilelist - let islocal= fname !~ '^\a\+://' -" call Decho("s:NetrwMarkFileMove: fname<".fname."> islocal=".islocal) - if islocal && s:netrwmfloc - " local to local move - " s:netrwmfloc= 0: target directory is remote - " = 1: target directory is local -" call Decho("local to local move") - if executable(g:netrw_localmovecmd) -" call Decho("let ret= system(".g:netrw_localmovecmd." ".fname." ".s:netrwmftgt.")") - let ret= system(g:netrw_localmovecmd." ".fname." ".s:netrwmftgt) - if v:shell_error < 0 - call netrw#ErrorMsg(s:ERROR,"command<".g:netrw_localmovecmd."> failed, aborting",54) - break - endif - else - call netrw#ErrorMsg(s:ERROR,"command<".g:netrw_localmovecmd."> is not executable!",57) - break - endif - elseif !islocal && s:netrwmfloc - " remote to local move -" call Decho("remote to local: copy and remove") -" call Decho("islocal =".islocal) -" call Decho("fname <".fname.">") -" call Decho("s:netrwmftgt<".s:netrwmftgt.">") - call netrw#NetrwObtain(islocal,fname,s:netrwmftgt) - let path = substitute(fname,'^\(.*/\)\(.\{-}\)$','\1','') - let barefname = substitute(fname,'^\(.*/\)\(.\{-}\)$','\2','') - let ok= s:NetrwRemoteRmFile(path,barefname,1) - elseif !islocal && s:netrwmfloc - " local to remote move -" call Decho("local to remote: copy and remove") - call s:NetrwUpload(fname,s:netrwmftgt) - let path = substitute(fname,'^\(.*/\)\(.\{-}\)$','\1','') - let barefname = substitute(fname,'^\(.*/\)\(.\{-}\)$','\2','') - let ok = s:NetrwLocalRmFile(path,barefname,1) - else - " remote to remote move -" call Decho("remote to remote: copy and remove") - call s:NetrwUpload(fname,s:netrwmftgt) - let path = substitute(fname,'^\(.*/\)\(.\{-}\)$','\1','') - let barefname = substitute(fname,'^\(.*/\)\(.\{-}\)$','\2','') - let ok = s:NetrwRemoteRmFile(path,barefname,1) - endif - endfor - endif - - " unmark marked file lists - call s:NetrwUnmarkAll() - - " refresh the listing and restore cursor position - call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./')) - call netrw#NetrwRestorePosn(svpos) - else - call netrw#ErrorMsg(s:ERROR,"no files marked!",59) - endif - -" call Dret("s:NetrwMarkFileMove") -endfun - -" --------------------------------------------------------------------- -" s:NetrwMarkFilePrint: (invoked by mp) This function prints marked files {{{2 -" using the hardcopy command. Local marked-file list only. -fun! s:NetrwMarkFilePrint(islocal) -" call Dfunc("s:NetrwMarkFilePrint(islocal=".a:islocal.")") - let curbufnr= bufnr("%") - if exists("s:netrwmarkfilelist_{curbufnr}") - let netrwmarkfilelist = s:netrwmarkfilelist_{curbufnr} - let curdir = b:netrw_curdir - call s:NetrwUnmarkList(curbufnr,curdir) - for fname in netrwmarkfilelist - if a:islocal - if g:netrw_keepdir - let fname= s:ComposePath(curdir,fname) - endif - else - let fname= curdir.fname - endif - 1split - " the autocmds will handle both local and remote files - exe "silent e ".fname -" call Decho("hardcopy ".fname) - hardcopy - q - endfor - 2match none - endif -" call Dret("s:NetrwMarkFilePrint") -endfun - -" --------------------------------------------------------------------- -" s:NetrwMarkFileRegexp: (invoked by mr) This function is used to mark {{{2 -" files when given a regexp (for which a prompt is -" issued). -fun! s:NetrwMarkFileRegexp(islocal) -" call Dfunc("s:NetrwMarkFileRegexp(islocal=".a:islocal.")") - - " get the regular expression - call inputsave() - let regexp= input("Enter regexp: ","","file") - call inputrestore() - - if a:islocal - " get the matching list of files using local glob() - let dirname = escape(b:netrw_curdir,g:netrw_glob_escape) - let filelist = glob(s:ComposePath(dirname,regexp)) - if filelist != "" - let filelist= filelist."\n" - endif - - " mark the list of files - while filelist != "" - if filelist =~ '\n' - let filename = substitute(filelist,'\n.*$','','e') - let filelist = substitute(filelist,'^.\{-}\n\(.*\)$','\1','e') - else - let filename = filelist - let filelist = "" - endif -" call Decho("filelist<".filelist.">") -" call Decho("filename<".filename.">") - call s:NetrwMarkFile(a:islocal,substitute(filename,'^.*/','','')) - endwhile - - else - - " convert displayed listing into a filelist - let eikeep = &ei - let areg = @a - silent %y a - set ei=all ma -" call Decho("set ei=all ma") - 1split - enew - silent norm! "ap - 2 - let bannercnt= search('^" =====','W') - exe "silent 1,".bannercnt."d" - set bt=nofile - if g:netrw_liststyle == s:LONGLIST - silent %s/\s\{2,}\S.*$//e - elseif g:netrw_liststyle == s:WIDELIST - silent %s/\s\{2,}/\r/ge - elseif g:netrw_liststyle == s:TREELIST - silent %s/^| //e - silent! g/^ .*$/d - endif - exe "silent! v/".escape(regexp,'/')."/d" - let filelist= getline(1,line("$")) - q! - for filename in filelist - call s:NetrwMarkFile(a:islocal,substitute(filename,'^.*/','','')) - endfor - unlet filelist - let @a = areg - let &ei = eikeep - endif - -" call Dret("s:NetrwMarkFileRegexp") -endfun - -" --------------------------------------------------------------------- -" s:NetrwMarkFileSource: (invoked by ms) This function sources marked files {{{2 -" Uses the local marked file list. -fun! s:NetrwMarkFileSource(islocal) -" call Dfunc("s:NetrwMarkFileSource(islocal=".a:islocal.")") - let curbufnr= bufnr("%") - if exists("s:netrwmarkfilelist_{curbufnr}") - let netrwmarkfilelist = s:netrwmarkfilelist_{bufnr("%")} - let curdir = b:netrw_curdir - call s:NetrwUnmarkList(curbufnr,curdir) - for fname in netrwmarkfilelist - if a:islocal - if g:netrw_keepdir - let fname= s:ComposePath(curdir,fname) - endif - else - let fname= curdir.fname - endif - " the autocmds will handle sourcing both local and remote files - exe "so ".fname - endfor - 2match none - endif -" call Dret("s:NetrwMarkFileSource") -endfun - -" --------------------------------------------------------------------- -" s:NetrwMarkFileTag: (invoked by mT) This function applies g:netrw_ctags to marked files {{{2 -" Uses the global markfilelist -fun! s:NetrwMarkFileTag(islocal) -" call Dfunc("s:NetrwMarkFileTag(islocal=".a:islocal.")") - let svpos = netrw#NetrwSavePosn() - let curdir = b:netrw_curdir - let curbufnr = bufnr("%") - - if exists("s:netrwmarkfilelist") -" call Decho("s:netrwmarkfilelist".string(s:netrwmarkfilelist).">") - if a:islocal && g:netrw_keepdir - let netrwmarkfilelist= "" - for fname in s:netrwmarkfilelist -" let netrwmarkfilelist= netrwmarkfilelist." ".s:ComposePath(curdir,fname) - let netrwmarkfilelist= netrwmarkfilelist." ".fname - endfor - else - let netrwmarkfilelist= string(s:netrwmarkfilelist) - let netrwmarkfilelist= substitute(netrwmarkfilelist,'[[\],]','','g') - endif - call s:NetrwUnmarkAll() - - if a:islocal - if executable(g:netrw_ctags) - if g:netrw_shq != "'" - let netrwmarkfilelist= substitute(netrwmarkfilelist,"'",g:netrw_shq,'g') - endif -" call Decho("call system(".g:netrw_ctags." ".netrwmarkfilelist.")") - call system(g:netrw_ctags." ".netrwmarkfilelist) - else - call netrw#ErrorMsg(s:ERROR,"g:netrw_ctags<".g:netrw_ctags."> is not executable!",51) - endif - else - let cmd= s:RemoteSystem(g:netrw_ctags." ".netrwmarkfilelist) - call netrw#NetrwObtain(a:islocal,"tags") - let curdir= b:netrw_curdir - 1split - e tags - let path= substitute(curdir,'^\(.*\)/[^/]*$','\1/','') -" call Decho("curdir<".curdir."> path<".path.">") - exe '%s/\t\(\S\+\)\t/\t'.escape(path,'/').'\1\t/e' - wq! - endif - 2match none - call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./')) - call netrw#NetrwRestorePosn(svpos) - endif - -" call Dret("s:NetrwMarkFileTag") -endfun - -" --------------------------------------------------------------------- -" s:NetrwMarkFileTgt: (invoked by mt) This function sets up a marked file target {{{2 -" Sets up two variables, -" s:netrwmftgt : holds the target directory -" s:netrwmfloc : 0=target directory is remote -" 1=target directory is local -fun! s:NetrwMarkFileTgt(islocal) -" call Dfunc("s:NetrwMarkFileTgt(islocal=".a:islocal.")") - let svpos = netrw#NetrwSavePosn() - let curdir = b:netrw_curdir - let hadtgt = exists("s:netrwmftgt") - - " set up target - if line(".") < w:netrw_bannercnt - " if cursor in banner region, use b:netrw_curdir for the target - let s:netrwmftgt= b:netrw_curdir -" call Decho("inbanner: s:netrwmftgt<".s:netrwmftgt.">") - - else - " get word under cursor. - " * If directory, use it for the target. - " * If file, use b:netrw_curdir for the target - let curword= s:NetrwGetWord() - let tgtdir = s:ComposePath(curdir,curword) - if isdirectory(tgtdir) - let s:netrwmftgt = tgtdir -" call Decho("isdir: s:netrwmftgt<".s:netrwmftgt.">") - else - let s:netrwmftgt = curdir -" call Decho("isfile: s:netrwmftgt<".s:netrwmftgt.">") - endif - endif - if a:islocal - " simplify the target (eg. /abc/def/../ghi -> /abc/ghi) - let s:netrwmftgt= simplify(s:netrwmftgt) -" call Decho("simplify: s:netrwmftgt<".s:netrwmftgt.">") - endif - if g:netrw_cygwin - let s:netrwmftgt= substitute(system("cygpath ".s:netrwmftgt),'\n$','','') - endif - let s:netrwmfloc= a:islocal - - if g:netrw_fastbrowse > 0 - call s:LocalBrowseShellCmdRefresh() - endif - call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./')) - call netrw#NetrwRestorePosn(svpos) - if !hadtgt - norm! j - endif - -" call Dret("s:NetrwMarkFileTgt") -endfun - -" --------------------------------------------------------------------- -" s:NetrwUnmarkList: delete local marked file lists and remove their contents from the global marked-file list {{{2 -fun! s:NetrwUnmarkList(curbufnr,curdir) -" call Dfunc("s:NetrwUnmarkList(curbufnr=".a:curbufnr." curdir<".a:curdir.">)") - - " remove all files in local marked-file list from global list - for mfile in s:netrwmarkfilelist_{a:curbufnr} - let dfile = s:ComposePath(a:curdir,mfile) " prepend directory to mfile - let idx = index(s:netrwmarkfilelist,dfile) " get index in list of dfile - call remove(s:netrwmarkfilelist,idx) " remove from global list - endfor - if s:netrwmarkfilelist == [] - unlet s:netrwmarkfilelist - endif - - " getting rid of the local marked-file lists is easy - unlet s:netrwmarkfilelist_{a:curbufnr} - unlet s:netrwmarkfilemtch_{a:curbufnr} - 2match none -" call Dret("s:NetrwUnmarkList") -endfun - -" --------------------------------------------------------------------- -" s:NetrwUnmarkAll: remove the global marked file list and all local ones {{{2 -fun! s:NetrwUnmarkAll() -" call Dfunc("s:NetrwUnmarkAll()") - if exists("s:netrwmarkfilelist") - unlet s:netrwmarkfilelist - endif - silent call s:NetrwUnmarkAll2() - 2match none -" call Dret("s:NetrwUnmarkAll") -endfun - -" --------------------------------------------------------------------- -" s:NetrwUnmarkAll2: {{{2 -fun! s:NetrwUnmarkAll2() -" call Dfunc("s:NetrwUnmarkAll2()") - redir => netrwmarkfilelist_let - let - redir END - let netrwmarkfilelist_list= split(netrwmarkfilelist_let,'\n') " convert let string into a let list - call filter(netrwmarkfilelist_list,"v:val =~ '^s:netrwmarkfilelist_'") " retain only those vars that start as s:netrwmarkfilelist_ - call map(netrwmarkfilelist_list,"substitute(v:val,'\\s.*$','','')") " remove what the entries are equal to - for flist in netrwmarkfilelist_list - let curbufnr= substitute(flist,'s:netrwmarkfilelist_','','') - unlet s:netrwmarkfilelist_{curbufnr} - unlet s:netrwmarkfilemtch_{curbufnr} - endfor -" call Dret("s:NetrwUnmarkAll2") -endfun - -" --------------------------------------------------------------------- -" s:NetrwUnMarkFile: {{{2 -fun! s:NetrwUnMarkFile(islocal) -" call Dfunc("s:NetrwUnMarkFile(islocal=".a:islocal.")") - let svpos = netrw#NetrwSavePosn() - let curbufnr = bufnr("%") - - " unmark marked file list (although I expect s:NetrwUpload() - " to do it, I'm just making sure) - if exists("s:netrwmarkfilelist_{bufnr('%')}") -" call Decho("unlet'ing: s:netrwmarkfile[list|mtch]_".bufnr("%")) - unlet s:netrwmarkfilelist - unlet s:netrwmarkfilelist_{curbufnr} - unlet s:netrwmarkfilemtch_{curbufnr} - 2match none - endif - -" call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./')) - call netrw#NetrwRestorePosn(svpos) -" call Dret("s:NetrwUnMarkFile") -endfun - -" =========================================== -" s:NetrwMenu: generates the menu for gvim and netrw {{{2 -fun! s:NetrwMenu(domenu) - - if !exists("g:NetrwMenuPriority") - let g:NetrwMenuPriority= 80 - endif - - if has("menu") && has("gui_running") && &go =~ 'm' && g:netrw_menu -" call Dfunc("NetrwMenu(domenu=".a:domenu.")") - - if !exists("s:netrw_menu_enabled") && a:domenu -" call Decho("initialize menu") - let s:netrw_menu_enabled= 1 - exe 'silent! menu '.g:NetrwMenuPriority.'.1 '.g:NetrwTopLvlMenu.'Help<tab><F1> <F1>' - call s:NetrwBookmarkMenu() " provide some history! uses priorities 2,3, reserves 4 - exe 'silent! menu '.g:NetrwMenuPriority.'.5 '.g:NetrwTopLvlMenu.'-Sep1- :' - exe 'silent! menu '.g:NetrwMenuPriority.'.6 '.g:NetrwTopLvlMenu.'Go\ Up\ Directory<tab>- -' - exe 'silent! menu '.g:NetrwMenuPriority.'.7 '.g:NetrwTopLvlMenu.'Apply\ Special\ Viewer<tab>x x' - exe 'silent! menu '.g:NetrwMenuPriority.'.8.1 '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Bookmark\ Current\ Directory<tab>mb mb' - exe 'silent! menu '.g:NetrwMenuPriority.'.8.2 '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Goto\ Bookmark<tab>gb gb' - exe 'silent! menu '.g:NetrwMenuPriority.'.8.3 '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Goto\ Prev\ Dir\ (History)<tab>u u' - exe 'silent! menu '.g:NetrwMenuPriority.'.8.4 '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Goto\ Next\ Dir\ (History)<tab>U U' - exe 'silent! menu '.g:NetrwMenuPriority.'.8.5 '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.List<tab>qb qb' - exe 'silent! menu '.g:NetrwMenuPriority.'.9.1 '.g:NetrwTopLvlMenu.'Browsing\ Control.Edit\ File\ Hiding\ List<tab>'."<ctrl-h> \<Plug>NetrwHideEdit" - exe 'silent! menu '.g:NetrwMenuPriority.'.9.2 '.g:NetrwTopLvlMenu.'Browsing\ Control.Edit\ Sorting\ Sequence<tab>S S' - exe 'silent! menu '.g:NetrwMenuPriority.'.9.3 '.g:NetrwTopLvlMenu.'Browsing\ Control.Refresh\ Listing<tab>'."<ctrl-l> \<Plug>NetrwRefresh" - exe 'silent! menu '.g:NetrwMenuPriority.'.9.4 '.g:NetrwTopLvlMenu.'Browsing\ Control.Settings/Options<tab>:NetrwSettings '.":NetrwSettings\<cr>" - exe 'silent! menu '.g:NetrwMenuPriority.'.10 '.g:NetrwTopLvlMenu.'Delete\ File/Directory<tab>D D' - exe 'silent! menu '.g:NetrwMenuPriority.'.11.1 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.In\ Current\ Window<tab><cr> '."\<cr>" - exe 'silent! menu '.g:NetrwMenuPriority.'.11.2 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.Preview\ File/Directory<tab>p p' - exe 'silent! menu '.g:NetrwMenuPriority.'.11.3 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.In\ Previous\ Window<tab>P P' - exe 'silent! menu '.g:NetrwMenuPriority.'.11.4 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.In\ New\ Window<tab>o o' - exe 'silent! menu '.g:NetrwMenuPriority.'.11.5 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.In\ New\ Vertical\ Window<tab>v v' - exe 'silent! menu '.g:NetrwMenuPriority.'.12.1 '.g:NetrwTopLvlMenu.'Explore.Directory\ Name :Explore ' - exe 'silent! menu '.g:NetrwMenuPriority.'.12.2 '.g:NetrwTopLvlMenu.'Explore.Filenames\ Matching\ Pattern\ (curdir\ only)<tab>:Explore\ */ :Explore */' - exe 'silent! menu '.g:NetrwMenuPriority.'.12.2 '.g:NetrwTopLvlMenu.'Explore.Filenames\ Matching\ Pattern\ (+subdirs)<tab>:Explore\ **/ :Explore **/' - exe 'silent! menu '.g:NetrwMenuPriority.'.12.3 '.g:NetrwTopLvlMenu.'Explore.Files\ Containing\ Pattern\ (curdir\ only)<tab>:Explore\ *// :Explore *//' - exe 'silent! menu '.g:NetrwMenuPriority.'.12.4 '.g:NetrwTopLvlMenu.'Explore.Files\ Containing\ Pattern\ (+subdirs)<tab>:Explore\ **// :Explore **//' - exe 'silent! menu '.g:NetrwMenuPriority.'.12.4 '.g:NetrwTopLvlMenu.'Explore.Next\ Match<tab>:Nexplore :Nexplore<cr>' - exe 'silent! menu '.g:NetrwMenuPriority.'.12.4 '.g:NetrwTopLvlMenu.'Explore.Prev\ Match<tab>:Pexplore :Pexplore<cr>' - exe 'silent! menu '.g:NetrwMenuPriority.'.13 '.g:NetrwTopLvlMenu.'Make\ Subdirectory<tab>d d' - exe 'silent! menu '.g:NetrwMenuPriority.'.14.1 '.g:NetrwTopLvlMenu.'Marked\ Files.Mark\ File<tab>mf mf' - exe 'silent! menu '.g:NetrwMenuPriority.'.14.2 '.g:NetrwTopLvlMenu.'Marked\ Files.Mark\ Files\ by\ Regexp<tab>mr mr' - exe 'silent! menu '.g:NetrwMenuPriority.'.14.3 '.g:NetrwTopLvlMenu.'Marked\ Files.Hide-Show-List\ Control<tab>a a' - exe 'silent! menu '.g:NetrwMenuPriority.'.14.4 '.g:NetrwTopLvlMenu.'Marked\ Files.Copy\ To\ Target<tab>mc mc' - exe 'silent! menu '.g:NetrwMenuPriority.'.14.5 '.g:NetrwTopLvlMenu.'Marked\ Files.Delete<tab>D D' - exe 'silent! menu '.g:NetrwMenuPriority.'.14.6 '.g:NetrwTopLvlMenu.'Marked\ Files.Diff<tab>md md' - exe 'silent! menu '.g:NetrwMenuPriority.'.14.7 '.g:NetrwTopLvlMenu.'Marked\ Files.Edit<tab>me me' - exe 'silent! menu '.g:NetrwMenuPriority.'.14.8 '.g:NetrwTopLvlMenu.'Marked\ Files.Exe\ Cmd<tab>mx mx' - exe 'silent! menu '.g:NetrwMenuPriority.'.14.9 '.g:NetrwTopLvlMenu.'Marked\ Files.Move\ To\ Target<tab>mm mm' - exe 'silent! menu '.g:NetrwMenuPriority.'.14.10 '.g:NetrwTopLvlMenu.'Marked\ Files.Obtain<tab>O O' - exe 'silent! menu '.g:NetrwMenuPriority.'.14.11 '.g:NetrwTopLvlMenu.'Marked\ Files.Print<tab>mp mp' - exe 'silent! menu '.g:NetrwMenuPriority.'.14.12 '.g:NetrwTopLvlMenu.'Marked\ Files.Replace<tab>R R' - exe 'silent! menu '.g:NetrwMenuPriority.'.14.13 '.g:NetrwTopLvlMenu.'Marked\ Files.Set\ Target<tab>mt mt' - exe 'silent! menu '.g:NetrwMenuPriority.'.14.14 '.g:NetrwTopLvlMenu.'Marked\ Files.Tag<tab>mT mT' - exe 'silent! menu '.g:NetrwMenuPriority.'.14.15 '.g:NetrwTopLvlMenu.'Marked\ Files.Zip/Unzip/Compress/Uncompress<tab>mz mz' - exe 'silent! menu '.g:NetrwMenuPriority.'.15 '.g:NetrwTopLvlMenu.'Obtain\ File<tab>O O' - exe 'silent! menu '.g:NetrwMenuPriority.'.16.1 '.g:NetrwTopLvlMenu.'Style.Listing\ Style\ (thin-long-wide-tree)<tab>i i' - exe 'silent! menu '.g:NetrwMenuPriority.'.16.2 '.g:NetrwTopLvlMenu.'Style.Normal-Hide-Show<tab>a a' - exe 'silent! menu '.g:NetrwMenuPriority.'.16.3 '.g:NetrwTopLvlMenu.'Style.Reverse\ Sorting\ Order<tab>'."r r" - exe 'silent! menu '.g:NetrwMenuPriority.'.16.4 '.g:NetrwTopLvlMenu.'Style.Sorting\ Method\ (name-time-size)<tab>s s' - exe 'silent! menu '.g:NetrwMenuPriority.'.17 '.g:NetrwTopLvlMenu.'Rename\ File/Directory<tab>R R' - exe 'silent! menu '.g:NetrwMenuPriority.'.18 '.g:NetrwTopLvlMenu.'Set\ Current\ Directory<tab>c c' - let s:netrw_menucnt= 28 - - elseif !a:domenu - let s:netrwcnt = 0 - let curwin = winnr() - windo if getline(2) =~ "Netrw" | let s:netrwcnt= s:netrwcnt + 1 | endif - exe curwin."wincmd w" - - if s:netrwcnt <= 1 -" call Decho("clear menus") - exe 'silent! unmenu '.g:NetrwTopLvlMenu -" call Decho('exe silent! unmenu '.g:NetrwTopLvlMenu.'*') - silent! unlet s:netrw_menu_enabled - endif - endif -" call Dret("NetrwMenu") - endif - -endfun - -" ========================================== -" s:NetrwObtain: obtain file under cursor or from markfile list {{{2 -fun! s:NetrwObtain(islocal) -" call Dfunc("NetrwObtain(islocal=".a:islocal.")") - - if exists("s:netrwmarkfilelist_{bufnr('%')}") - for fname in s:netrwmarkfilelist_{bufnr("%")} - let islocal= fname !~ '^\a\+://' - call netrw#NetrwObtain(islocal,fname) - endfor - call s:NetrwUnmarkList(bufnr('%'),b:netrw_curdir) - endif - if exists("s:netrwmarkfilelist") - for fname in s:netrwmarkfilelist - let islocal= fname !~ '^\a\+://' - call netrw#NetrwObtain(islocal,fname) - endfor - call s:NetrwUnmarkAll() - else - call netrw#NetrwObtain(a:islocal,expand("<cWORD>")) - endif - -" call Dret("NetrwObtain") -endfun - -" --------------------------------------------------------------------- -" netrw#NetrwObtain: {{{2 -fun! netrw#NetrwObtain(islocal,fname,...) -" call Dfunc("netrw#NetrwObtain(islocal=".a:islocal." fname<".a:fname.">) a:0=".a:0) - " NetrwStatusLine support - for obtaining support - - if a:islocal - - " obtain local file from getcwd() to b:netrw_curdir -" call Decho("obtain local file from ".getcwd()." to b:netrw_curdir<".b:netrw_curdir.">") - if exists("b:netrw_curdir") && getcwd() != b:netrw_curdir - let fname= expand("<cWORD>") - let fcopy= readfile(b:netrw_curdir."/".fname,"b") - call writefile(fcopy,getcwd()."/".fname,"b") - elseif !exists("b:netrw_curdir") - call netrw#ErrorMsg(s:ERROR,"local browsing directory doesn't exist!",36) - else - call netrw#ErrorMsg(s:WARNING,"local browsing directory and current directory are identical",37) - endif - - else - - " obtain a remote file to local directory (see tgtdir below) -" call Decho("obtain a remote file to local directory<".getcwd().">") - call s:SetupNetrwStatusLine('%f %h%m%r%=%9*Obtaining '.a:fname) - - " set up target directory (default is vim's idea of the current directory) - if a:0 > 0 - let tgtdir= a:1 - else - let tgtdir= getcwd() - endif -" call Decho("obtain a remote file<".a:fname."> to tgtdir<".tgtdir.">") - if exists("w:netrw_method") && w:netrw_method =~ '[235]' -" call Decho("method=".w:netrw_method) - if executable("ftp") -" call Decho("using ftp, method=".w:netrw_method) - let curdir = b:netrw_curdir - let path = substitute(curdir,'ftp://[^/]\+/','','e') - let curline= line(".") - let endline= line("$")+1 - setlocal ma noro -" call Decho("setlocal ma noro") - keepjumps $ -" call Decho("getcwd<".getcwd().">") -" call Decho("curdir<".curdir.">") -" call Decho("path<".path.">") -" call Decho("curline=".curline) -" call Decho("endline=".endline) - - "......................................... - if w:netrw_method == 2 - " ftp + <.netrc>: Method #2 - setlocal ff=unix - if path != "" - put ='cd '.path -" call Decho("ftp: cd ".path) - endif - if tgtdir != '.' - put ='lcd '.tgtdir - endif - put ='get '.a:fname -" call Decho("ftp: get ".a:fname) - put ='quit' -" call Decho("ftp: quit") - if exists("g:netrw_port") && g:netrw_port != "" -" call Decho("exe ".g:netrw_silentxfer.endline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port) - exe g:netrw_silentxfer.endline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port - else -" call Decho("exe ".g:netrw_silentxfer.endline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine) - exe g:netrw_silentxfer.endline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine - endif - - "......................................... - elseif w:netrw_method == 3 - " ftp + machine,id,passwd,filename: Method #3 - setlocal ff=unix - if exists("g:netrw_port") && g:netrw_port != "" - put ='open '.g:netrw_machine.' '.g:netrw_port -" call Decho('ftp: open '.g:netrw_machine.' '.g:netrw_port) - else - put ='open '.g:netrw_machine -" call Decho('ftp: open '.g:netrw_machine) - endif - - if exists("g:netrw_ftp") && g:netrw_ftp == 1 - put =g:netrw_uid - put ='\"'.s:netrw_passwd.'\"' -" call Decho('ftp: g:netrw_uid') -" call Decho('ftp: s:netrw_passwd') - else - put ='user \"'.g:netrw_uid.'\" \"'.s:netrw_passwd.'\"' -" call Decho('user '.g:netrw_uid.' '.s:netrw_passwd) - endif - - if path != "" - put ='cd '.path -" call Decho('ftp: cd '.a:path) - endif - if tgtdir != '.' - put ='lcd '.tgtdir -" call Decho('ftp: lcd '.tgtdir) - endif - put ='get '.a:fname -" call Decho("ftp: get ".a:fname) - put ='quit' -" call Decho("ftp: quit") - - " perform ftp: - " -i : turns off interactive prompting from ftp - " -n unix : DON'T use <.netrc>, even though it exists - " -n win32: quit being obnoxious about password -" call Decho("exe ".g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i -n") - exe g:netrw_silentxfer.endline.",$!".g:netrw_ftp_cmd." -i -n" - - "......................................... - else - call netrw#ErrorMsg(s:WARNING,"unable to comply with your request<" . choice . ">",28) - endif - " restore - exe "silent! ".endline.",$d" - exe "keepjumps ".curline - setlocal noma nomod ro - else -" call Decho("ftp not executable") - if !exists("g:netrw_quiet") - call netrw#ErrorMsg(s:ERROR,"this system doesn't support ftp",29) - endif - " restore status line - let &stl = s:netrw_users_stl - let &laststatus = s:netrw_users_ls - " restore NetrwMethod - if exists("keep_netrw_method") - call s:NetrwMethod(keep_netrw_choice) - let w:netrw_method = keep_netrw_wmethod - endif -" call Dret("NetrwObtain") - return - endif - - "......................................... - else - " scp: Method#4 - let curdir = b:netrw_curdir - let path = substitute(curdir,'scp://[^/]\+/','','e') - if exists("g:netrw_port") && g:netrw_port != "" - let useport= " ".g:netrw_scpport." ".g:netrw_port - else - let useport= "" - endif - if a:fname =~ '^\a\+:' - let fname= substitute(a:fname,'^.*/','','') - else - let fname= a:fname - endif - if path !~ '/$' - let path= path.'/' - endif -" call Decho("using scp: curdir <".curdir.">") -" call Decho("using scp: fname <".fname.">") -" call Decho("using scp: machine<".g:netrw_machine.">") -" call Decho("using scp: path <".path.">") -" call Decho("using scp: pwd <".getcwd().">") -" call Decho("using scp: tgtdir <".tgtdir.">") -" call Decho("using scp: useport<".useport.">") -" call Decho("executing: !".g:netrw_scp_cmd.useport." ".g:netrw_machine.":".path.escape(fname,' ?&')." ".tgtdir) - exe g:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".g:netrw_machine.":".path.escape(fname,' ?&')." ".tgtdir - endif - - " restore status line - let &stl = s:netrw_users_stl - let &laststatus = s:netrw_users_ls -" redraw! - - " restore NetrwMethod - if exists("keep_netrw_method") - call s:NetrwMethod(keep_netrw_choice) - let w:netrw_method = keep_netrw_wmethod - endif - endif - -" call Dret("netrw#NetrwObtain") -endfun - -" --------------------------------------------------------------------- -" s:NetrwPrevWinOpen: open file/directory in previous window. {{{2 -" If there's only one window, then the window will first be split. -" Returns: -" choice = 0 : didn't have to choose -" choice = 1 : saved modified file in window first -" choice = 2 : didn't save modified file, opened window -" choice = 3 : cancel open -fun! s:NetrwPrevWinOpen(islocal) -" call Dfunc("NetrwPrevWinOpen(islocal=".a:islocal.")") - - " grab a copy of the b:netrw_curdir to pass it along to newly split windows - let curdir = b:netrw_curdir - - " get last window number and the word currently under the cursor - let lastwinnr = winnr("$") - let curword = s:NetrwGetWord() - let choice = 0 -" call Decho("lastwinnr=".lastwinnr." curword<".curword.">") - - let didsplit = 0 - if lastwinnr == 1 - " if only one window, open a new one first -" call Decho("only one window, so open a new one (g:netrw_alto=".g:netrw_alto.")") - if g:netrw_preview -" call Decho("exe ".(g:netrw_alto? "top " : "bot ")."vert ".g:netrw_winsize."wincmd s") - exe (g:netrw_alto? "top " : "bot ")."vert ".g:netrw_winsize."wincmd s" - else -" call Decho("exe ".(g:netrw_alto? "bel " : "abo ").g:netrw_winsize."wincmd s") - exe (g:netrw_alto? "bel " : "abo ").g:netrw_winsize."wincmd s" - endif - let didsplit = 1 - - else - call s:SaveBufVars() -" call Decho("wincmd p") - wincmd p - call s:RestoreBufVars() - " if the previous window's buffer has been changed (is modified), - " and it doesn't appear in any other extant window, then ask the - " user if s/he wants to abandon modifications therein. - let bnr = winbufnr(0) - let bnrcnt = 0 - if &mod -" call Decho("detected: prev window's buffer has been modified: bnr=".bnr." winnr#".winnr()) - let eikeep= &ei - set ei=all - windo if winbufnr(0) == bnr | let bnrcnt=bnrcnt+1 | endif - exe bnr."wincmd p" - let &ei= eikeep -" call Decho("bnr=".bnr." bnrcnt=".bnrcnt." buftype=".&bt." winnr#".winnr()) - if bnrcnt == 1 - let bufname= bufname(winbufnr(winnr())) - let choice= confirm("Save modified file<".bufname.">?","&Yes\n&No\n&Cancel") -" call Decho("bufname<".bufname."> choice=".choice." winnr#".winnr()) - - if choice == 1 - " Yes -- write file & then browse - let v:errmsg= "" - silent w - if v:errmsg != "" - call netrw#ErrorMsg(s:ERROR,"unable to write <".bufname.">!",30) - if didsplit - q - else - wincmd p - endif -" call Dret("NetrwPrevWinOpen ".choice." : unable to write <".bufname.">") - return choice - endif - - elseif choice == 2 - " No -- don't worry about changed file, just browse anyway - setlocal nomod - call netrw#ErrorMsg(s:WARNING,bufname." changes to ".bufname." abandoned",31) - wincmd p - - else - " Cancel -- don't do this - if didsplit - q - else - wincmd p - endif -" call Dret("NetrwPrevWinOpen ".choice." : cancelled") - return choice - endif - endif - endif - endif - - " restore b:netrw_curdir (window split/enew may have lost it) - let b:netrw_curdir= curdir - if a:islocal < 2 - if a:islocal - call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(a:islocal,curword)) - else - call s:NetrwBrowse(a:islocal,s:NetrwBrowseChgDir(a:islocal,curword)) - endif - endif -" call Dret("NetrwPrevWinOpen ".choice) - return choice -endfun - -" --------------------------------------------------------------------- -" s:NetrwUpload: load fname to tgt (used by NetrwMarkFileCopy()) {{{2 -" fname may itself be a remote or local file -" tgt is assumed to be remote, so NetWrite will be used -" (indirectly via an autocmd) -fun! s:NetrwUpload(fname,tgt) -" call Dfunc("s:NetrwUpload(fname<".a:fname."> tgt<".a:tgt.">)") - - 1split - let efname= escape(a:fname,g:netrw_fname_escape) -" call Decho("exe e ".efname) - exe "e ".efname - if a:tgt =~ '/$' - let wfname= substitute(a:fname,'^.*/','','') - let wfname= escape(a:tgt.wfname,g:netrw_fname_escape) -" call Decho("exe w ".wfname) - exe "w ".wfname - else - let wfname= escape(a:tgt,g:netrw_fname_escape) -" call Decho("exe w ".wfname) - exe "w ".wfname - endif - q! - -" call Dret("s:NetrwUpload") -endfun - -" --------------------------------------------------------------------- -" s:NetrwPreview: {{{2 -fun! s:NetrwPreview(path) range -" call Dfunc("NetrwPreview(path<".a:path.">)") - call s:NetrwOptionSave("s:") - call s:NetrwSafeOptions() - if has("quickfix") - if !isdirectory(a:path) - exe (g:netrw_preview? "vert " : "")."pedit ".escape(a:path,g:netrw_fname_escape) - elseif !exists("g:netrw_quiet") - call netrw#ErrorMsg(s:WARNING,"sorry, cannot preview a directory such as <".a:path.">",38) - endif - elseif !exists("g:netrw_quiet") - call netrw#ErrorMsg(s:WARNING,"sorry, to preview your vim needs the quickfix feature compiled in",39) - endif - call s:NetrwOptionRestore("s:") -" call Dret("NetrwPreview") -endfun - -" --------------------------------------------------------------------- -" s:NetrwRefresh: {{{2 -fun! s:NetrwRefresh(islocal,dirname) -" call Dfunc("NetrwRefresh(islocal<".a:islocal.">,dirname=".a:dirname.") hide=".g:netrw_hide." sortdir=".g:netrw_sort_direction) - " at the current time (Mar 19, 2007) all calls to NetrwRefresh() call NetrwBrowseChgDir() first. - " NetrwBrowseChgDir() may clear the display; hence a NetrwSavePosn() may not work if its placed here. - " Also, NetrwBrowseChgDir() now does a NetrwSavePosn() itself. - setlocal ma noro -" call Decho("setlocal ma noro") -" call Decho("clear buffer<".expand("%")."> with :%d") - %d - if a:islocal - call netrw#LocalBrowseCheck(a:dirname) - else - call s:NetrwBrowse(a:islocal,a:dirname) - endif - call netrw#NetrwRestorePosn() - - " restore file marks - if exists("s:netrwmarkfilemtch_{bufnr('%')}") && s:netrwmarkfilemtch_{bufnr("%")} != "" -" call Decho("exe 2match netrwMarkFile /".s:netrwmarkfilemtch_{bufnr("%")}."/") - exe "2match netrwMarkFile /".s:netrwmarkfilemtch_{bufnr("%")}."/" - else -" call Decho("2match none") - 2match none - endif - -" redraw! -" call Dret("NetrwRefresh") -endfun - -" --------------------------------------------------------------------- -" s:NetrwSetSort: sets up the sort based on the g:netrw_sort_sequence {{{2 -" What this function does is to compute a priority for the patterns -" in the g:netrw_sort_sequence. It applies a substitute to any -" "files" that satisfy each pattern, putting the priority / in -" front. An "*" pattern handles the default priority. -fun! s:NetrwSetSort() -" call Dfunc("SetSort() bannercnt=".w:netrw_bannercnt) - if w:netrw_liststyle == s:LONGLIST - let seqlist = substitute(g:netrw_sort_sequence,'\$','\\%(\t\\|\$\\)','ge') - else - let seqlist = g:netrw_sort_sequence - endif - " sanity check -- insure that * appears somewhere - if seqlist == "" - let seqlist= '*' - elseif seqlist !~ '\*' - let seqlist= seqlist.',*' - endif - let priority = 1 - while seqlist != "" - if seqlist =~ ',' - let seq = substitute(seqlist,',.*$','','e') - let seqlist = substitute(seqlist,'^.\{-},\(.*\)$','\1','e') - else - let seq = seqlist - let seqlist = "" - endif - let eseq= escape(seq,'/') - if priority < 10 - let spriority= "00".priority.'\/' - elseif priority < 100 - let spriority= "0".priority.'\/' - else - let spriority= priority.'\/' - endif -" call Decho("priority=".priority." spriority<".spriority."> seq<".seq."> seqlist<".seqlist.">") - - " sanity check - if w:netrw_bannercnt > line("$") - " apparently no files were left after a Hiding pattern was used -" call Dret("SetSort : no files left after hiding") - return - endif - if seq == '*' - let starpriority= spriority - else - exe 'silent keepjumps '.w:netrw_bannercnt.',$g/'.eseq.'/s/^/'.spriority.'/' - exe 'silent keepjumps '.w:netrw_bannercnt.',$g/^\d\{3}\/\d\{3}\//s/^\d\{3}\///' - endif - let priority = priority + 1 - endwhile - if exists("starpriority") - exe 'silent keepjumps '.w:netrw_bannercnt.',$v/^\d\{3}\//s/^/'.starpriority.'/' - endif - - " Following line associated with priority -- items that satisfy a priority - " pattern get prefixed by ###/ which permits easy sorting by priority. - " Sometimes files can satisfy multiple priority patterns -- only the latest - " priority pattern needs to be retained. So, at this point, these excess - " priority prefixes need to be removed, but not directories that happen to - " be just digits themselves. - exe 'silent keepjumps '.w:netrw_bannercnt.',$s/^\(\d\{3}\/\)\%(\d\{3}\/\)\+\ze./\1/e' - -" call Dret("SetSort") -endfun - -" ===================================================================== -" s:NetrwSortStyle: change sorting style (name - time - size) and refresh display {{{2 -fun! s:NetrwSortStyle(islocal) -" call Dfunc("s:NetrwSortStyle(islocal=".a:islocal.") netrw_sort_by<".g:netrw_sort_by.">") - call s:NetrwSaveWordPosn() - let svpos= netrw#NetrwSavePosn() - - let g:netrw_sort_by= (g:netrw_sort_by =~ 'n')? 'time' : (g:netrw_sort_by =~ 't')? 'size' : 'name' - norm! 0 - call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./')) - call netrw#NetrwRestorePosn(svpos) - -" call Dret("s:NetrwSortStyle : netrw_sort_by<".g:netrw_sort_by.">") -endfun - -" --------------------------------------------------------------------- -" s:NetrwSplit: mode {{{2 -" =0 : net and o -" =1 : net and t -" =2 : net and v -" =3 : local and o -" =4 : local and t -" =5 : local and v -fun! s:NetrwSplit(mode) -" call Dfunc("s:NetrwSplit(mode=".a:mode.") alto=".g:netrw_alto." altv=".g:netrw_altv) - - call s:SaveWinVars() - - if a:mode == 0 - " remote and o -" call Decho("exe ".(g:netrw_alto? "bel " : "abo ").g:netrw_winsize."wincmd s") - exe (g:netrw_alto? "bel " : "abo ").g:netrw_winsize."wincmd s" - let s:didsplit= 1 - call s:RestoreWinVars() - call s:NetrwBrowse(0,s:NetrwBrowseChgDir(0,s:NetrwGetWord())) - unlet s:didsplit - - elseif a:mode == 1 - " remote and t - let cursorword = s:NetrwGetWord() -" call Decho("tabnew") - tabnew - let s:didsplit= 1 - call s:RestoreWinVars() - call s:NetrwBrowse(0,s:NetrwBrowseChgDir(0,cursorword)) - unlet s:didsplit - - elseif a:mode == 2 - " remote and v -" call Decho("exe ".(g:netrw_altv? "rightb " : "lefta ").g:netrw_winsize."wincmd v") - exe (g:netrw_altv? "rightb " : "lefta ").g:netrw_winsize."wincmd v" - let s:didsplit= 1 - call s:RestoreWinVars() - call s:NetrwBrowse(0,s:NetrwBrowseChgDir(0,s:NetrwGetWord())) - unlet s:didsplit - - elseif a:mode == 3 - " local and o -" call Decho("exe ".(g:netrw_alto? "bel " : "abo ").g:netrw_winsize."wincmd s") - exe (g:netrw_alto? "bel " : "abo ").g:netrw_winsize."wincmd s" - let s:didsplit= 1 - call s:RestoreWinVars() - call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,s:NetrwGetWord())) - unlet s:didsplit - - elseif a:mode == 4 - " local and t - let netrw_curdir= b:netrw_curdir - let cursorword = s:NetrwGetWord() -" call Decho("tabnew") - tabnew - let b:netrw_curdir= netrw_curdir - let s:didsplit= 1 - call s:RestoreWinVars() - call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,cursorword)) - unlet s:didsplit - - elseif a:mode == 5 - " local and v -" call Decho("exe ".(g:netrw_altv? "rightb " : "lefta ").g:netrw_winsize."wincmd v") - exe (g:netrw_altv? "rightb " : "lefta ").g:netrw_winsize."wincmd v" - let s:didsplit= 1 - call s:RestoreWinVars() - call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,s:NetrwGetWord())) - unlet s:didsplit - - else - call netrw#ErrorMsg(s:ERROR,"(NetrwSplit) unsupported mode=".a:mode,45) - endif - -" call Dret("s:NetrwSplit") -endfun - -" --------------------------------------------------------------------- -" NetrwStatusLine: {{{2 -fun! NetrwStatusLine() - -" vvv NetrwStatusLine() debugging vvv -" let g:stlmsg="" -" if !exists("w:netrw_explore_bufnr") -" let g:stlmsg="!X<explore_bufnr>" -" elseif w:netrw_explore_bufnr != bufnr("%") -" let g:stlmsg="explore_bufnr!=".bufnr("%") -" endif -" if !exists("w:netrw_explore_line") -" let g:stlmsg=" !X<explore_line>" -" elseif w:netrw_explore_line != line(".") -" let g:stlmsg=" explore_line!={line(.)<".line(".").">" -" endif -" if !exists("w:netrw_explore_list") -" let g:stlmsg=" !X<explore_list>" -" endif -" ^^^ NetrwStatusLine() debugging ^^^ - - 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") - " restore user's status line - let &stl = s:netrw_users_stl - let &laststatus = s:netrw_users_ls - if exists("w:netrw_explore_bufnr")|unlet w:netrw_explore_bufnr|endif - if exists("w:netrw_explore_line") |unlet w:netrw_explore_line |endif - return "" - else - return "Match ".w:netrw_explore_mtchcnt." of ".w:netrw_explore_listlen - endif -endfun - -" --------------------------------------------------------------------- -" s:NetrwTreeDir: determine tree directory given current cursor position {{{2 -" (full path directory with trailing slash returned) -fun! s:NetrwTreeDir() -" call Dfunc("NetrwTreeDir() curline#".line(".")."<".getline(".")."> b:netrw_curdir<".b:netrw_curdir."> tab#".tabpagenr()." win#".winnr()." buf#".bufnr("%")."<".bufname("%").">") - - let treedir= b:netrw_curdir -" call Decho("set initial treedir<".treedir.">") - let s:treecurpos= netrw#NetrwSavePosn() - - if w:netrw_liststyle == s:TREELIST -" call Decho("w:netrrw_liststyle is TREELIST:") -" call Decho("line#".line(".")." getline(.)<".getline('.')."> treecurpos<".string(s:treecurpos).">") - if getline('.') =~ '/$' - let treedir= substitute(getline('.'),'^\%(| \)*\([^|].\{-}\)$','\1','e') - else - let treedir= "" - endif - -" call Decho("treedir<".treedir.">") - - " detect user attempting to close treeroot - if getline('.') !~ '|' && getline('.') != '..' -" call Decho("user attempted to close treeroot") - " now force a refresh -" call Decho("clear buffer<".expand("%")."> with :%d") - keepjumps %d -" call Dret("NetrwTreeDir <".treedir."> : (side effect) s:treecurpos<".string(s:treecurpos).">") - return b:netrw_curdir - endif - - " elide all non-depth information - let depth = substitute(getline('.'),'^\(\%(| \)*\)[^|].\{-}$','\1','e') -" call Decho("depth<".depth."> 1st subst") - - " elide first depth - let depth = substitute(depth,'^| ','','') -" call Decho("depth<".depth."> 2nd subst") - - " construct treedir by searching backwards at correct depth -" call Decho("constructing treedir<".treedir."> depth<".depth.">") - while depth != "" && search('^'.depth.'[^|].\{-}/$','bW') - let dirname= substitute(getline("."),'^\(| \)*','','e') - let treedir= dirname.treedir - let depth = substitute(depth,'^| ','','') -" call Decho("constructing treedir<".treedir.">: dirname<".dirname."> while depth<".depth.">") - endwhile - if w:netrw_treetop =~ '/$' - let treedir= w:netrw_treetop.treedir - else - let treedir= w:netrw_treetop.'/'.treedir - endif -" call Decho("bufnr(.)=".bufnr("%")." line($)=".line("$")." line(.)=".line(".")) - endif - let treedir= substitute(treedir,'//$','/','') - -" " now force a refresh -"" call DECHO("clear buffer<".expand("%")."> with :%d") -" setlocal ma noro -" keepjumps %d - -" call Dret("NetrwTreeDir <".treedir."> : (side effect) s:treecurpos<".string(s:treecurpos).">") - return treedir -endfun - -" --------------------------------------------------------------------- -" s:NetrwTreeDisplay: recursive tree display {{{2 -fun! s:NetrwTreeDisplay(dir,depth) -" call Dfunc("NetrwTreeDisplay(dir<".a:dir."> depth<".a:depth.">)") - - " insure that there are no folds - setlocal nofen - - " install ../ and shortdir - if a:depth == "" - call setline(line("$")+1,'../') -" call Decho("setline#".line("$")." ../ (depth is zero)") - endif - if a:dir =~ '^\a\+://' - if a:dir == w:netrw_treetop - let shortdir= a:dir - else - let shortdir= substitute(a:dir,'^.*/\([^/]\+\)/$','\1/','e') - endif - call setline(line("$")+1,a:depth.shortdir) - else - let shortdir= substitute(a:dir,'^.*/','','e') - call setline(line("$")+1,a:depth.shortdir.'/') - endif -" call Decho("setline#".line("$")." shortdir<".a:depth.shortdir.">") - - " append a / to dir if its missing one - let dir= a:dir - if dir !~ '/$' - let dir= dir.'/' - endif - - " display subtrees (if any) - let depth= "| ".a:depth - -" call Decho("display subtrees with depth<".depth."> and current leaves") - for entry in w:netrw_treedict[a:dir] - let direntry= substitute(dir.entry,'/$','','e') -" call Decho("dir<".dir."> entry<".entry."> direntry<".direntry.">") - if entry =~ '/$' && has_key(w:netrw_treedict,direntry) -" call Decho("<".direntry."> is a key in treedict - display subtree for it") - call s:NetrwTreeDisplay(direntry,depth) - elseif entry =~ '/$' && has_key(w:netrw_treedict,direntry.'/') -" call Decho("<".direntry."/> is a key in treedict - display subtree for it") - call s:NetrwTreeDisplay(direntry.'/',depth) - else -" call Decho("<".entry."> is not a key in treedict (no subtree)") - call setline(line("$")+1,depth.entry) - endif - endfor -" call Dret("NetrwTreeDisplay") -endfun - -" --------------------------------------------------------------------- -" s:NetrwTreeListing: displays tree listing from treetop on down, using NetrwTreeDisplay() {{{2 -fun! s:NetrwTreeListing(dirname) - if w:netrw_liststyle == s:TREELIST -" call Dfunc("NetrwTreeListing() bufname<".expand("%").">") -" call Decho("curdir<".a:dirname.">") -" call Decho("win#".winnr().": w:netrw_treetop ".(exists("w:netrw_treetop")? "exists" : "doesn't exit")." w:netrw_treedict ".(exists("w:netrw_treedict")? "exists" : "doesn't exit")) - - " update the treetop -" call Decho("update the treetop") - if !exists("w:netrw_treetop") - let w:netrw_treetop= a:dirname -" call Decho("w:netrw_treetop<".w:netrw_treetop."> (reusing)") - elseif (w:netrw_treetop =~ ('^'.a:dirname) && s:Strlen(a:dirname) < s:Strlen(w:netrw_treetop)) || a:dirname !~ ('^'.w:netrw_treetop) - let w:netrw_treetop= a:dirname -" call Decho("w:netrw_treetop<".w:netrw_treetop."> (went up)") - endif - - " insure that we have at least an empty treedict - if !exists("w:netrw_treedict") - let w:netrw_treedict= {} - endif - - " update the directory listing for the current directory -" call Decho("updating dictionary with ".a:dirname.":[..directory listing..]") -" call Decho("bannercnt=".w:netrw_bannercnt." line($)=".line("$")) - exe "silent! keepjumps ".w:netrw_bannercnt.',$g@^\.\.\=/$@d' - let w:netrw_treedict[a:dirname]= getline(w:netrw_bannercnt,line("$")) -" call Decho("w:treedict[".a:dirname."]= ".w:netrw_treedict[a:dirname]) - exe "silent! keepjumps ".w:netrw_bannercnt.",$d" - - " if past banner, record word - if exists("w:netrw_bannercnt") && line(".") > w:netrw_bannercnt - let fname= expand("<cword>") - else - let fname= "" - endif -" call Decho("fname<".fname.">") - - " display from treetop on down - call s:NetrwTreeDisplay(w:netrw_treetop,"") - -" call Dret("NetrwTreeListing : bufname<".expand("%").">") - endif -endfun - -" --------------------------------------------------------------------- -" s:NetrwWideListing: {{{2 -fun! s:NetrwWideListing() - - if w:netrw_liststyle == s:WIDELIST -" call Dfunc("NetrwWideListing() w:netrw_liststyle=".w:netrw_liststyle.' fo='.&fo.' l:fo='.&l:fo) - " look for longest filename (cpf=characters per filename) - " cpf: characters per file - " fpl: files per line - " fpc: files per column - setlocal ma noro -" call Decho("setlocal ma noro") - let b:netrw_cpf= 0 - if line("$") >= w:netrw_bannercnt - exe 'silent keepjumps '.w:netrw_bannercnt.',$g/^./if virtcol("$") > b:netrw_cpf|let b:netrw_cpf= virtcol("$")|endif' - else -" call Dret("NetrwWideListing") - return - endif -" call Decho("max file strlen+1=".b:netrw_cpf) - let b:netrw_cpf= b:netrw_cpf + 1 - - " determine qty files per line (fpl) - let w:netrw_fpl= winwidth(0)/b:netrw_cpf - if w:netrw_fpl <= 0 - let w:netrw_fpl= 1 - endif -" call Decho("fpl= ".winwidth(0)."/[b:netrw_cpf=".b:netrw_cpf.']='.w:netrw_fpl) - - " make wide display - exe 'silent keepjumps '.w:netrw_bannercnt.',$s/^.*$/\=escape(printf("%-'.b:netrw_cpf.'s",submatch(0)),"\\")/' - let fpc = (line("$") - w:netrw_bannercnt + w:netrw_fpl)/w:netrw_fpl - let newcolstart = w:netrw_bannercnt + fpc - let newcolend = newcolstart + fpc - 1 -" call Decho("bannercnt=".w:netrw_bannercnt." fpl=".w:netrw_fpl." fpc=".fpc." newcol[".newcolstart.",".newcolend."]") - silent! let keepregstar = @* - while line("$") >= newcolstart - if newcolend > line("$") | let newcolend= line("$") | endif - let newcolqty= newcolend - newcolstart - exe newcolstart - if newcolqty == 0 - exe "silent keepjumps norm! 0\<c-v>$hx".w:netrw_bannercnt."G$p" - else - exe "silent keepjumps norm! 0\<c-v>".newcolqty.'j$hx'.w:netrw_bannercnt.'G$p' - endif - exe "silent keepjumps ".newcolstart.','.newcolend.'d' - exe 'silent keepjumps '.w:netrw_bannercnt - endwhile - silent! let @*= keepregstar - exe "silent keepjumps ".w:netrw_bannercnt.',$s/\s\+$//e' - setlocal noma nomod ro -" call Dret("NetrwWideListing") - endif - -endfun - -" --------------------------------------------------------------------- -" s:PerformListing: {{{2 -fun! s:PerformListing(islocal) -" call Dfunc("s:PerformListing(islocal=".a:islocal.") buf(%)=".bufnr("%")."<".bufname("%").">") - - call s:NetrwSafeOptions() - setlocal noro ma -" call Decho("setlocal noro ma") - -" if exists("g:netrw_silent") && g:netrw_silent == 0 && &ch >= 1 " Decho -" call Decho("(netrw) Processing your browsing request...") -" endif " Decho - -" call Decho('w:netrw_liststyle='.(exists("w:netrw_liststyle")? w:netrw_liststyle : 'n/a')) - if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("w:netrw_treedict") - " force a refresh for tree listings -" call Decho("force refresh for treelisting: clear buffer<".expand("%")."> with :%d") - keepjumps %d - endif - - " save current directory on directory history list - call s:NetrwBookmarkDir(3,b:netrw_curdir) - - " Set up the banner {{{3 -" call Decho("set up banner") - keepjumps put ='\" ============================================================================' - keepjumps put ='\" Netrw Directory Listing (netrw '.g:loaded_netrw.')' - keepjumps put ='\" '.b:netrw_curdir - keepjumps 1d - let w:netrw_bannercnt= 3 - exe "keepjumps ".w:netrw_bannercnt - - let sortby= g:netrw_sort_by - if g:netrw_sort_direction =~ "^r" - let sortby= sortby." reversed" - endif - - " Sorted by... {{{3 -" call Decho("handle specified sorting: g:netrw_sort_by<".g:netrw_sort_by.">") - if g:netrw_sort_by =~ "^n" -" call Decho("directories will be sorted by name") - " sorted by name - keepjumps put ='\" Sorted by '.sortby - keepjumps put ='\" Sort sequence: '.g:netrw_sort_sequence - let w:netrw_bannercnt= w:netrw_bannercnt + 2 - else -" call Decho("directories will be sorted by size or time") - " sorted by size or date - keepjumps put ='\" Sorted by '.sortby - let w:netrw_bannercnt= w:netrw_bannercnt + 1 - endif - exe "keepjumps ".w:netrw_bannercnt - - " show copy/move target, if any - if exists("s:netrwmftgt") && exists("s:netrwmfloc") -" call Decho("show copy/move target<".s:netrwmftgt.">") - if s:netrwmfloc - keepjumps put ='\" Copy/Move Tgt: '.s:netrwmftgt.' (local)' - else - keepjumps put ='\" Copy/Move Tgt: '.s:netrwmftgt.' (remote)' - endif - let w:netrw_bannercnt= w:netrw_bannercnt + 1 - else -" call Decho("s:netrwmftgt does not exist, don't make Copy/Move Tgt") - endif - exe "keepjumps ".w:netrw_bannercnt - - " Hiding... -or- Showing... {{{3 -" call Decho("handle hiding/showing (g:netrw_hide=".g:netrw_list_hide." g:netrw_list_hide<".g:netrw_list_hide.">)") - if g:netrw_list_hide != "" && g:netrw_hide - if g:netrw_hide == 1 - keepjumps put ='\" Hiding: '.g:netrw_list_hide - else - keepjumps put ='\" Showing: '.g:netrw_list_hide - endif - let w:netrw_bannercnt= w:netrw_bannercnt + 1 - endif - exe "keepjumps ".w:netrw_bannercnt - keepjumps put ='\" Quick Help: <F1>:help -:go up dir D:delete R:rename s:sort-by x:exec' - keepjumps put ='\" ============================================================================' - let w:netrw_bannercnt= w:netrw_bannercnt + 2 - - " bannercnt should index the line just after the banner - let w:netrw_bannercnt= w:netrw_bannercnt + 1 - exe "keepjumps ".w:netrw_bannercnt -" call Decho("bannercnt=".w:netrw_bannercnt." (should index line just after banner) line($)=".line("$")) - - " set up syntax highlighting {{{3 -" call Decho("set up syntax highlighting") - if has("syntax") - setlocal ft=netrw - if !exists("g:syntax_on") || !g:syntax_on - setlocal ft= - endif - endif - - " get list of files -" call Decho("Get list of files - islocal=".a:islocal) - if a:islocal - call s:LocalListing() - else " remote - call s:NetrwRemoteListing() - endif -" call Decho("w:netrw_bannercnt=".w:netrw_bannercnt." (banner complete)") - - " manipulate the directory listing (hide, sort) {{{3 - if line("$") >= w:netrw_bannercnt -" call Decho("manipulate directory listing (hide)") -" call Decho("g:netrw_hide=".g:netrw_hide." g:netrw_list_hide<".g:netrw_list_hide.">") - if g:netrw_hide && g:netrw_list_hide != "" - call s:NetrwListHide() - endif - if line("$") >= w:netrw_bannercnt -" call Decho("manipulate directory listing (sort) : g:netrw_sort_by<".g:netrw_sort_by.">") - - if g:netrw_sort_by =~ "^n" - " sort by name - call s:NetrwSetSort() - - if w:netrw_bannercnt < line("$") -" call Decho("g:netrw_sort_direction=".g:netrw_sort_direction." (bannercnt=".w:netrw_bannercnt.")") - if g:netrw_sort_direction =~ 'n' - " normal direction sorting - exe 'silent keepjumps '.w:netrw_bannercnt.',$sort' - else - " reverse direction sorting - exe 'silent keepjumps '.w:netrw_bannercnt.',$sort!' - endif - endif - " remove priority pattern prefix -" call Decho("remove priority pattern prefix") - exe 'silent keepjumps '.w:netrw_bannercnt.',$s/^\d\{3}\///e' - - elseif a:islocal - if w:netrw_bannercnt < line("$") -" call Decho("g:netrw_sort_direction=".g:netrw_sort_direction) - if g:netrw_sort_direction =~ 'n' -" call Decho('exe silent keepjumps '.w:netrw_bannercnt.',$sort') - exe 'silent keepjumps '.w:netrw_bannercnt.',$sort' - else -" call Decho('exe silent keepjumps '.w:netrw_bannercnt.',$sort!') - exe 'silent keepjumps '.w:netrw_bannercnt.',$sort!' - endif - endif - exe 'silent keepjumps '.w:netrw_bannercnt.',$s/^\d\{-}\///e' - endif - - elseif g:netrw_sort_direction =~ 'r' -" call Decho('reverse the sorted listing') - exe 'silent keepjumps '.w:netrw_bannercnt.'g/^/m '.w:netrw_bannercnt - endif - endif - - " convert to wide/tree listing {{{3 -" call Decho("modify display if wide/tree listing style") - call s:NetrwWideListing() - call s:NetrwTreeListing(b:netrw_curdir) - - if exists("w:netrw_bannercnt") && line("$") > w:netrw_bannercnt - " place cursor on the top-left corner of the file listing -" call Decho("place cursor on top-left corner of file listing") - exe 'silent keepjumps '.w:netrw_bannercnt - norm! 0 - endif - - " record previous current directory - let w:netrw_prvdir= b:netrw_curdir -" call Decho("record netrw_prvdir<".w:netrw_prvdir.">") - - " save certain window-oriented variables into buffer-oriented variables {{{3 - call s:SetBufWinVars() - call s:NetrwOptionRestore("w:") - - " set display to netrw display settings -" call Decho("set display to netrw display settings (noma nomod etc)") - setlocal noma nomod nonu nobl nowrap ro - if exists("s:treecurpos") - - call netrw#NetrwRestorePosn(s:treecurpos) - unlet s:treecurpos - endif - -" call Dret("s:PerformListing : curpos<".string(getpos(".")).">") -endfun - -" --------------------------------------------------------------------- -" s:SetupNetrwStatusLine: {{{2 -fun! s:SetupNetrwStatusLine(statline) -" call Dfunc("SetupNetrwStatusLine(statline<".a:statline.">)") - - if !exists("s:netrw_setup_statline") - let s:netrw_setup_statline= 1 -" call Decho("do first-time status line setup") - - if !exists("s:netrw_users_stl") - let s:netrw_users_stl= &stl - endif - if !exists("s:netrw_users_ls") - let s:netrw_users_ls= &laststatus - endif - - " set up User9 highlighting as needed - let keepa= @a - redir @a - try - hi User9 - catch /^Vim\%((\a\+)\)\=:E411/ - if &bg == "dark" - hi User9 ctermfg=yellow ctermbg=blue guifg=yellow guibg=blue - else - hi User9 ctermbg=yellow ctermfg=blue guibg=yellow guifg=blue - endif - endtry - redir END - let @a= keepa - endif - - " set up status line (may use User9 highlighting) - " insure that windows have a statusline - " make sure statusline is displayed - let &stl=a:statline - setlocal laststatus=2 -" call Decho("stl=".&stl) - redraw - -" call Dret("SetupNetrwStatusLine : stl=".&stl) -endfun - -" --------------------------------------------------------------------- -" Remote Directory Browsing Support: {{{1 -" =========================================== - -" --------------------------------------------------------------------- -" s:NetrwRemoteListing: {{{2 -fun! s:NetrwRemoteListing() -" call Dfunc("s:NetrwRemoteListing() b:netrw_curdir<".b:netrw_curdir.">)") - - call s:RemotePathAnalysis(b:netrw_curdir) - - " sanity check: - if exists("b:netrw_method") && b:netrw_method =~ '[235]' -" call Decho("b:netrw_method=".b:netrw_method) - if !executable("ftp") - if !exists("g:netrw_quiet") - call netrw#ErrorMsg(s:ERROR,"this system doesn't support remote directory listing via ftp",18) - endif - call s:NetrwOptionRestore("w:") -" call Dret("s:NetrwRemoteListing") - return - endif - - elseif !exists("g:netrw_list_cmd") || g:netrw_list_cmd == '' - if !exists("g:netrw_quiet") - if g:netrw_list_cmd == "" - call netrw#ErrorMsg(s:ERROR,g:netrw_ssh_cmd." is not executable on your system",47) - else - call netrw#ErrorMsg(s:ERROR,"this system doesn't support remote directory listing via ".g:netrw_list_cmd,19) - endif - endif - - call s:NetrwOptionRestore("w:") -" call Dret("s:NetrwRemoteListing") - return - endif " (remote handling sanity check) - - if exists("b:netrw_method") -" call Decho("setting w:netrw_method<".b:netrw_method.">") - let w:netrw_method= b:netrw_method - endif - - if s:method == "ftp" - " use ftp to get remote file listing -" call Decho("use ftp to get remote file listing") - let s:method = "ftp" - let listcmd = g:netrw_ftp_list_cmd - if g:netrw_sort_by =~ '^t' - let listcmd= g:netrw_ftp_timelist_cmd - elseif g:netrw_sort_by =~ '^s' - let listcmd= g:netrw_ftp_sizelist_cmd - endif -" call Decho("listcmd<".listcmd."> (using g:netrw_ftp_list_cmd)") - call s:NetrwRemoteFtpCmd(s:path,listcmd) -" exe "keepjumps ".w:netrw_bannercnt.',$g/^./call Decho("raw listing: ".getline("."))' - - if w:netrw_liststyle == s:THINLIST || w:netrw_liststyle == s:WIDELIST || w:netrw_liststyle == s:TREELIST - " shorten the listing -" call Decho("generate short listing") - exe "keepjumps ".w:netrw_bannercnt - - " cleanup - if g:netrw_ftp_browse_reject != "" - exe "silent! g/".g:netrw_ftp_browse_reject."/keepjumps d" - endif - silent! keepjumps %s/\r$//e - - " if there's no ../ listed, then put ./ and ../ in - let line1= line(".") - exe "keepjumps ".w:netrw_bannercnt - let line2= search('^\.\.\/\%(\s\|$\)','cnW') - if line2 == 0 -" call Decho("netrw is putting ./ and ../ into listing") - keepjumps put='../' - keepjumps put='./' - endif - exe "keepjumps ".line1 - keepjumps norm! 0 - -" call Decho("line1=".line1." line2=".line2." line(.)=".line(".")) - if search('^\d\{2}-\d\{2}-\d\{2}\s','n') " M$ ftp site cleanup -" call Decho("M$ ftp cleanup") - exe 'silent! keepjumps '.w:netrw_bannercnt.',$s/^\d\{2}-\d\{2}-\d\{2}\s\+\d\+:\d\+[AaPp][Mm]\s\+\%(<DIR>\|\d\+\)\s\+//' - else " normal ftp cleanup -" call Decho("normal ftp cleanup") - exe 'silent! keepjumps '.w:netrw_bannercnt.',$s/^\(\%(\S\+\s\+\)\{7}\S\+\)\s\+\(\S.*\)$/\2/e' - exe "silent! keepjumps ".w:netrw_bannercnt.',$g/ -> /s# -> .*/$#/#e' - exe "silent! keepjumps ".w:netrw_bannercnt.',$g/ -> /s# -> .*$#/#e' - endif - endif - - else - " use ssh to get remote file listing {{{3 -" call Decho("use ssh to get remote file listing: s:netrw_shq<".g:netrw_shq."> s:path<".s:path."> g:netrw_cd_escape<".g:netrw_cd_escape.">") - let listcmd= s:MakeSshCmd(g:netrw_list_cmd) -" call Decho("listcmd<".listcmd."> (using g:netrw_list_cmd)") - if g:netrw_scp_cmd =~ '^pscp' -" call Decho("1: exe silent r! ".listcmd.g:netrw_shq.s:path.g:netrw_shq) - exe "silent r! ".listcmd.g:netrw_shq.s:path.g:netrw_shq - " remove rubbish and adjust listing format of 'pscp' to 'ssh ls -FLa' like - g/^Listing directory/d - g/^d[-rwx][-rwx][-rwx]/s+$+/+e - silent g/^l[-rwx][-rwx][-rwx]/s+$+@+e - if g:netrw_liststyle != s:LONGLIST - g/^[dlsp-][-rwx][-rwx][-rwx]/s/^.*\s\(\S\+\)$/\1/e - endif - else - if s:path == "" -" call Decho("2: exe silent r! ".listcmd) - exe "silent r! ".listcmd - else -" call Decho("3: exe silent r! ".listcmd." ".g:netrw_shq.s:path.g:netrw_shq) - exe "silent r! ".listcmd." ".g:netrw_shq.s:path.g:netrw_shq - endif - endif - - " cleanup - if g:netrw_ftp_browse_reject != "" -" call Decho("(cleanup) exe silent! g/".g:netrw_ssh_browse_reject."/keepjumps d") - exe "silent! g/".g:netrw_ssh_browse_reject."/keepjumps d" - endif - endif - - if w:netrw_liststyle == s:LONGLIST - " do a long listing; these substitutions need to be done prior to sorting {{{3 -" call Decho("fix long listing:") - - if s:method == "ftp" - " cleanup - exe "keepjumps ".w:netrw_bannercnt - while getline(".") =~ g:netrw_ftp_browse_reject - keepjumps d - endwhile - " if there's no ../ listed, then put ./ and ../ in - let line1= line(".") - keepjumps 1 - silent keepjumps call search('^\.\.\/\%(\s\|$\)','W') - let line2= line(".") - if line2 == 0 - exe 'keepjumps '.w:netrw_bannercnt."put='./'" - if b:netrw_curdir != '/' - exe 'keepjumps '.w:netrw_bannercnt."put='../'" - endif - endif - exe "keepjumps ".line1 - keepjumps norm! 0 - endif - - if search('^\d\{2}-\d\{2}-\d\{2}\s','n') " M$ ftp site cleanup -" call Decho("M$ ftp site listing cleanup") - exe 'silent! keepjumps '.w:netrw_bannercnt.',$s/^\(\d\{2}-\d\{2}-\d\{2}\s\+\d\+:\d\+[AaPp][Mm]\s\+\%(<DIR>\|\d\+\)\s\+\)\(\w.*\)$/\2\t\1/' - elseif exists("w:netrw_bannercnt") && w:netrw_bannercnt <= line("$") -" call Decho("normal ftp site listing cleanup: bannercnt=".w:netrw_bannercnt." line($)=".line("$")) - exe 'silent keepjumps '.w:netrw_bannercnt.',$s/ -> .*$//e' - exe 'silent keepjumps '.w:netrw_bannercnt.',$s/^\(\%(\S\+\s\+\)\{7}\S\+\)\s\+\(\S.*\)$/\2\t\1/e' - exe 'silent keepjumps '.w:netrw_bannercnt - endif - endif - -" if exists("w:netrw_bannercnt") && w:netrw_bannercnt <= line("$") " Decho -" exe "keepjumps ".w:netrw_bannercnt.',$g/^./call Decho("listing: ".getline("."))' -" endif " Decho -" call Dret("s:NetrwRemoteListing") -endfun - -" --------------------------------------------------------------------- -" s:NetrwRemoteRm: remove/delete a remote file or directory {{{2 -fun! s:NetrwRemoteRm(usrhost,path) range -" call Dfunc("s:NetrwRemoteRm(usrhost<".a:usrhost."> path<".a:path.">) virtcol=".virtcol(".")) -" call Decho("firstline=".a:firstline." lastline=".a:lastline) - let svpos= netrw#NetrwSavePosn() - - let all= 0 - if exists("s:netrwmarkfilelist_{bufnr('%')}") - " remove all marked files - for fname in s:netrwmarkfilelist_{bufnr("%")} - let ok= s:NetrwRemoteRmFile(a:path,fname,all) - if ok =~ 'q\%[uit]' - break - elseif ok =~ 'a\%[ll]' - let all= 1 - endif - endfor - unlet s:netrwmarkfilelist_{bufnr("%")} - unlet s:netrwmarkfilemtch_{bufnr("%")} - 2match none - - else - " remove files specified by range - - " preparation for removing multiple files/directories - let ctr= a:firstline - - " remove multiple files and directories - while ctr <= a:lastline - exe ctr - let ok= s:NetrwRemoteRmFile(a:path,s:NetrwGetWord(),all) - if ok =~ 'q\%[uit]' - break - elseif ok =~ 'a\%[ll]' - let all= 1 - endif - let ctr= ctr + 1 - endwhile - endif - - " refresh the (remote) directory listing -" call Decho("refresh remote directory listing") - call s:NetrwRefresh(0,s:NetrwBrowseChgDir(0,'./')) - call netrw#NetrwRestorePosn(svpos) - -" call Dret("s:NetrwRemoteRm") -endfun - -" --------------------------------------------------------------------- -" s:NetrwRemoteRmFile: {{{2 -fun! s:NetrwRemoteRmFile(path,rmfile,all) -" call Dfunc("s:NetrwRemoteRmFile(path<".a:path."> rmfile<".a:rmfile.">) all=".a:all) - - let all= a:all - let ok = "" - - if a:rmfile !~ '^"' && (a:rmfile =~ '@$' || a:rmfile !~ '[\/]$') - " attempt to remove file -" call Decho("attempt to remove file (all=".all.")") - if !all - echohl Statement - call inputsave() - let ok= input("Confirm deletion of file<".a:rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ") - call inputrestore() - echohl NONE - if ok == "" - let ok="no" - endif - let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e') - if ok =~ 'a\%[ll]' - let all= 1 - endif - endif - - if all || ok =~ 'y\%[es]' || ok == "" - if exists("w:netrw_method") && (w:netrw_method == 2 || w:netrw_method == 3) - silent! keepjumps .,$d - call s:NetrwRemoteFtpCmd(a:path,"delete ".a:rmfile) - else - let netrw_rm_cmd= s:MakeSshCmd(g:netrw_rm_cmd) -" call Decho("netrw_rm_cmd<".netrw_rm_cmd.">") - if !exists("b:netrw_curdir") - call netrw#ErrorMsg(s:ERROR,"for some reason b:netrw_curdir doesn't exist!",53) - let ok="q" - else - let remotedir= substitute(b:netrw_curdir,'^.*//[^/]\+/\(.*\)$','\1','') -" call Decho("netrw_rm_cmd<".netrw_rm_cmd.">") -" call Decho("remotedir<".remotedir.">") -" call Decho("rmfile<".a:rmfile.">") - if remotedir != "" - let netrw_rm_cmd= netrw_rm_cmd." ".remotedir.escape(a:rmfile,g:netrw_cd_escape) - else - let netrw_rm_cmd= netrw_rm_cmd." ".escape(a:rmfile,g:netrw_cd_escape) - endif -" call Decho("call system(".netrw_rm_cmd.")") - let ret= system(netrw_rm_cmd) - if ret != 0 - call netrw#ErrorMsg(s:WARNING,"cmd<".netrw_rm_cmd."> failed",60) - endif -" call Decho("returned=".ret." errcode=".v:shell_error) - endif - endif - elseif ok =~ 'q\%[uit]' - break - endif - - else - " attempt to remove directory -" call Decho("attempt to remove directory") - if !all - call inputsave() - let ok= input("Confirm deletion of directory<".a:rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ") - call inputrestore() - if ok == "" - let ok="no" - endif - let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e') - if ok =~ 'a\%[ll]' - let all= 1 - endif - endif - - if all || ok =~ 'y\%[es]' || ok == "" - if exists("w:netrw_method") && (w:netrw_method == 2 || w:netrw_method == 3) - call s:NetrwRemoteFtpCmd(a:path,"rmdir ".a:rmfile) - else - let rmfile = substitute(a:path.a:rmfile,'/$','','') - let netrw_rmdir_cmd = s:MakeSshCmd(g:netrw_rmdir_cmd).' '.rmfile -" call Decho("attempt to remove dir: system(".netrw_rmdir_cmd.")") - let ret= s:System("system",netrw_rmdir_cmd) -" call Decho("returned=".ret." errcode=".v:shell_error) - - if v:shell_error != 0 -" call Decho("v:shell_error not 0") - let netrw_rmf_cmd= s:MakeSshCmd(g:netrw_rmf_cmd).' '.substitute(rmfile,'[\/]$','','e') -" call Decho("2nd attempt to remove dir: system(".netrw_rmf_cmd.")") - let ret= s:System("system",netrw_rmf_cmd) -" call Decho("returned=".ret." errcode=".v:shell_error) - - if v:shell_error != 0 && !exists("g:netrw_quiet") - call netrw#ErrorMsg(s:ERROR,"unable to remove directory<".rmfile."> -- is it empty?",22) - endif - endif - endif - - elseif ok =~ 'q\%[uit]' - break - endif - endif - -" call Dret("s:NetrwRemoteRmFile ".ok) - return ok -endfun - -" --------------------------------------------------------------------- -" s:NetrwRemoteFtpCmd: unfortunately, not all ftp servers honor options for ls {{{2 -" This function assumes that a long listing will be received. Size, time, -" and reverse sorts will be requested of the server but not otherwise -" enforced here. -fun! s:NetrwRemoteFtpCmd(path,listcmd) -" call Dfunc("NetrwRemoteFtpCmd(path<".a:path."> listcmd<".a:listcmd.">) netrw_method=".w:netrw_method) -" call Decho("line($)=".line("$")." bannercnt=".w:netrw_bannercnt) - - " because WinXX ftp uses unix style input - let ffkeep= &ff - setlocal ma ff=unix noro -" call Decho("setlocal ma ff=unix noro") - - " clear off any older non-banner lines - " note that w:netrw_bannercnt indexes the line after the banner -" call Decho('exe silent! keepjumps '.w:netrw_bannercnt.",$d (clear off old non-banner lines)") - exe "silent! keepjumps ".w:netrw_bannercnt.",$d" - - "......................................... - if w:netrw_method == 2 || w:netrw_method == 5 - " ftp + <.netrc>: Method #2 - if a:path != "" - put ='cd \"'.a:path.'\"' - endif - if exists("g:netrw_ftpextracmd") - exe "put ='".g:netrw_ftpextracmd."'" -" call Decho("filter input: ".getline(".")) - endif - exe "put ='".a:listcmd."'" -" exe "keepjumps ".w:netrw_bannercnt.',$g/^./call Decho("ftp#".line(".").": ".getline("."))' - if exists("g:netrw_port") && g:netrw_port != "" -" call Decho("exe ".g:netrw_silentxfer.w:netrw_bannercnt.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port) - exe g:netrw_silentxfer." keepjumps ".w:netrw_bannercnt.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port - else -" call Decho("exe ".g:netrw_silentxfer.w:netrw_bannercnt.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine) - exe g:netrw_silentxfer." keepjumps ".w:netrw_bannercnt.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine - endif - - "......................................... - elseif w:netrw_method == 3 - " ftp + machine,id,passwd,filename: Method #3 - setlocal ff=unix - if exists("g:netrw_port") && g:netrw_port != "" - put ='open '.g:netrw_machine.' '.g:netrw_port - else - put ='open '.g:netrw_machine - endif - - if exists("g:netrw_ftp") && g:netrw_ftp == 1 - put =g:netrw_uid - put ='\"'.s:netrw_passwd.'\"' - else - put ='user \"'.g:netrw_uid.'\" \"'.s:netrw_passwd.'\"' - endif - - if a:path != "" - put ='cd \"'.a:path.'\"' - endif - if exists("g:netrw_ftpextracmd") - exe "put ='".g:netrw_ftpextracmd."'" -" call Decho("filter input: ".getline(".")) - endif - exe "put ='".a:listcmd."'" - - " perform ftp: - " -i : turns off interactive prompting from ftp - " -n unix : DON'T use <.netrc>, even though it exists - " -n win32: quit being obnoxious about password -" exe w:netrw_bannercnt.',$g/^./call Decho("ftp#".line(".").": ".getline("."))' -" call Decho("exe ".g:netrw_silentxfer.w:netrw_bannercnt.",$!".g:netrw_ftp_cmd." -i -n") - exe g:netrw_silentxfer.w:netrw_bannercnt.",$!".g:netrw_ftp_cmd." -i -n" - - "......................................... - else - call netrw#ErrorMsg(s:WARNING,"unable to comply with your request<" . choice . ">",23) - endif - - " cleanup for Windows - if has("win32") || has("win95") || has("win64") || has("win16") - silent! keepjumps %s/\r$//e - endif - if a:listcmd == "dir" - " infer directory/link based on the file permission string - silent! keepjumps g/d\%([-r][-w][-x]\)\{3}/s@$@/@ - silent! keepjumps g/l\%([-r][-w][-x]\)\{3}/s/$/@/ - if w:netrw_liststyle == s:THINLIST || w:netrw_liststyle == s:WIDELIST || w:netrw_liststyle == s:TREELIST - exe "silent! keepjumps ".w:netrw_bannercnt.',$s/^\%(\S\+\s\+\)\{8}//e' - endif - endif - - " ftp's listing doesn't seem to include ./ or ../ - if !search('^\.\/$\|\s\.\/$','wn') - exe 'keepjumps '.w:netrw_bannercnt - put ='./' - endif - if !search('^\.\.\/$\|\s\.\.\/$','wn') - exe 'keepjumps '.w:netrw_bannercnt - put ='../' - endif - - " restore settings - let &ff= ffkeep -" call Dret("NetrwRemoteFtpCmd") -endfun - -" --------------------------------------------------------------------- -" s:NetrwRemoteRename: rename a remote file or directory {{{2 -fun! s:NetrwRemoteRename(usrhost,path) range -" call Dfunc("NetrwRemoteRename(usrhost<".a:usrhost."> path<".a:path.">)") - - " preparation for removing multiple files/directories - let svpos = netrw#NetrwSavePosn() - let ctr = a:firstline - let rename_cmd = s:MakeSshCmd(g:netrw_rename_cmd) - - " rename files given by the markfilelist - if exists("s:netrwmarkfilelist_{bufnr('%')}") - for oldname in s:netrwmarkfilelist_{bufnr("%")} -" call Decho("oldname<".oldname.">") - if exists("subfrom") - let newname= substitute(oldname,subfrom,subto,'') -" call Decho("subfrom<".subfrom."> subto<".subto."> newname<".newname.">") - else - call inputsave() - let newname= input("Moving ".oldname." to : ",oldname) - call inputrestore() - if newname =~ '^s/' - let subfrom = substitute(newname,'^s/\([^/]*\)/.*/$','\1','') - let subto = substitute(newname,'^s/[^/]*/\(.*\)/$','\1','') - let newname = substitute(oldname,subfrom,subto,'') -" call Decho("subfrom<".subfrom."> subto<".subto."> newname<".newname.">") - endif - endif - - if exists("w:netrw_method") && (w:netrw_method == 2 || w:netrw_method == 3) - call s:NetrwRemoteFtpCmd(a:path,"rename ".oldname." ".newname) - else - let oldname= a:path.oldname - let newname= a:path.newname -" call Decho("system(rename_cmd".' "'.escape(oldname," ").'" "'.escape(newname,g:netrw_cd_escape).'"') - let ret= s:System("system",rename_cmd.' "'.escape(oldname,g:netrw_cd_escape).'" "'.escape(newname,g:netrw_cd_escape).'"') - endif - - endfor - call s:NetrwUnMarkFile(1) - - else - - " attempt to rename files/directories - while ctr <= a:lastline - exe "keepjumps ".ctr - - let oldname= s:NetrwGetWord() -" call Decho("oldname<".oldname.">") - - call inputsave() - let newname= input("Moving ".oldname." to : ",oldname) - call inputrestore() - - if exists("w:netrw_method") && (w:netrw_method == 2 || w:netrw_method == 3) - call s:NetrwRemoteFtpCmd(a:path,"rename ".oldname." ".newname) - else - let oldname= a:path.oldname - let newname= a:path.newname -" call Decho("system(rename_cmd".' "'.escape(oldname," ").'" "'.escape(newname,g:netrw_cd_escape).'"') - let ret= s:System("system",rename_cmd.' "'.escape(oldname,g:netrw_cd_escape).'" "'.escape(newname,g:netrw_cd_escape).'"') - endif - - let ctr= ctr + 1 - endwhile - endif - - " refresh the directory - call s:NetrwRefresh(0,s:NetrwBrowseChgDir(0,'./')) - call netrw#NetrwRestorePosn(svpos) - -" call Dret("NetrwRemoteRename") -endfun - -" --------------------------------------------------------------------- -" Local Directory Browsing Support: {{{1 -" ========================================== - -" --------------------------------------------------------------------- -" netrw#LocalBrowseCheck: {{{2 -fun! netrw#LocalBrowseCheck(dirname) - " unfortunate interaction -- split window debugging can't be - " used here, must use D-echoRemOn or D-echoTabOn -- the BufEnter - " event triggers another call to LocalBrowseCheck() when attempts - " to write to the DBG buffer are made. - " The &ft == "netrw" test was installed because the BufEnter event - " would hit when re-entering netrw windows, creating unexpected - " refreshes (and would do so in the middle of NetrwSaveOptions(), too) -" call Dfunc("netrw#LocalBrowseCheck(dirname<".a:dirname.">") -" call Decho("isdir=".isdirectory(a:dirname)) - if isdirectory(a:dirname) -" call Decho(" ft=".&ft." b:netrw_curdir<".(exists("b:netrw_curdir")? b:netrw_curdir : " doesn't exist")."> dirname<".a:dirname.">"." line($)=".line("$")) - if &ft != "netrw" || (exists("b:netrw_curdir") && b:netrw_curdir != a:dirname) - silent! call s:NetrwBrowse(1,a:dirname) - elseif &ft == "netrw" && line("$") == 1 - silent! call s:NetrwBrowse(1,a:dirname) - endif - endif - " not a directory, ignore it -" call Dret("netrw#LocalBrowseCheck") -endfun - -" --------------------------------------------------------------------- -" s:LocalListing: does the job of "ls" for local directories {{{2 -fun! s:LocalListing() -" call Dfunc("s:LocalListing()") -" call Decho("&ma=".&ma) -" call Decho("&mod=".&mod) -" call Decho("&ro=".&ro) -" call Decho("bufname(%)<".bufname("%").">") - -" if exists("b:netrw_curdir") |call Decho('b:netrw_curdir<'.b:netrw_curdir.">") |else|call Decho("b:netrw_curdir doesn't exist") |endif -" if exists("g:netrw_sort_by")|call Decho('g:netrw_sort_by<'.g:netrw_sort_by.">")|else|call Decho("g:netrw_sort_by doesn't exist")|endif - - " get the list of files contained in the current directory - let dirname = escape(b:netrw_curdir,g:netrw_glob_escape) - let dirnamelen = s:Strlen(b:netrw_curdir) - let filelist = glob(s:ComposePath(dirname,"*")) -" call Decho("glob(dirname<".dirname."/*>)=".filelist) - if filelist != "" - let filelist= filelist."\n" - endif - let filelist= filelist.glob(s:ComposePath(dirname,".*")) -" call Decho("glob(dirname<".dirname."/.*>)=".filelist) - - " Coding choice: either elide ./ if present - " or include ./ if not present - if filelist =~ '[\\/]\.[\\/]\=\(\n\|$\)' - " elide /path/. from glob() entries if present - let filelist = substitute(filelist,'\n','\t','g') - let filelist = substitute(filelist,'^[^\t]\+[/\\]\.\t','','') - let filelist = substitute(filelist,'[^\t]\+[/\\]\.$','','') - let filelist = substitute(filelist,'\t\zs[^\t]\+[/\\]\.\t','','') - let filelist = substitute(filelist,'\t','\n','g') - endif -" if filelist !~ '[\\/]\.[\\/]\=\(\n\|$\)' - " include ./ in the glob() entry if its missing -" call Decho("forcibly tacking on .") -" if filelist == "" -" let filelist= s:ComposePath(dirname,"./") -" else -" let filelist= filelist."\n".s:ComposePath(b:netrw_curdir,"./") -" endif -" call Decho("filelist<".filelist.">") -" endif - if filelist !~ '[\\/]\.\.[\\/]\=\(\n\|$\)' - " include ../ in the glob() entry if its missing -" call Decho("forcibly tacking on ..") - let filelist= filelist."\n".s:ComposePath(b:netrw_curdir,"../") -" call Decho("filelist<".filelist.">") - endif - if b:netrw_curdir == '/' - " remove .. from filelist when current directory is root directory - let filelist= substitute(filelist,'/\.\.\n','','') -" call Decho("remove .. from filelist") - endif - let filelist= substitute(filelist,'\n\{2,}','\n','ge') - if !g:netrw_cygwin && (has("win32") || has("win95") || has("win64") || has("win16")) - " change all \s to /s - let filelist= substitute(filelist,'\','/','g') - else - " escape all \s to \\ - let filelist= substitute(filelist,'\','\\','g') - endif - -" call Decho("dirname<".dirname.">") -" call Decho("dirnamelen<".dirnamelen.">") -" call Decho("filelist<".filelist.">") - - while filelist != "" - if filelist =~ '\n' - let filename = substitute(filelist,'\n.*$','','e') - let filelist = substitute(filelist,'^.\{-}\n\(.*\)$','\1','e') - else - let filename = filelist - let filelist = "" - endif - if filename !~ '/\.$' && filename !~ '/\.\.$' && fnamemodify(filename,"") != resolve(filename) - " indicate a symbolic link -" call Decho("indicate <".filename."> is a symbolic link with trailing @") - let pfile= filename."@" - elseif isdirectory(filename) -" call Decho("indicate <".filename."> is a directory with trailing /") - let pfile= filename."/" - elseif exists("b:netrw_curdir") && b:netrw_curdir !~ '^.*://' && !isdirectory(filename) - if (has("win32") || has("win95") || has("win64") || has("win16")) - if filename =~ '\.[eE][xX][eE]$' || filename =~ '\.[cC][oO][mM]$' || filename =~ '\.[bB][aA][tT]$' - " indicate an executable -" call Decho("indicate <".filename."> is executable with trailing *") - let pfile= filename."*" - else - " normal file - let pfile= filename - endif - elseif executable(filename) - " indicate an executable -" call Decho("indicate <".filename."> is executable with trailing *") - let pfile= filename."*" - else - " normal file - let pfile= filename - endif - else - let pfile= filename - endif - if pfile =~ '//$' - let pfile= substitute(pfile,'//$','/','e') - endif - let pfile= strpart(pfile,dirnamelen) - let pfile= substitute(pfile,'^[/\\]','','e') -" call Decho(" ") -" call Decho("filename<".filename.">") -" call Decho("pfile <".pfile.">") - - if w:netrw_liststyle == s:LONGLIST - let sz = getfsize(filename) - let fsz = strpart(" ",1,15-s:Strlen(sz)).sz - let pfile= pfile."\t".fsz." ".strftime(g:netrw_timefmt,getftime(filename)) -" call Decho("sz=".sz." fsz=".fsz) - endif - - if g:netrw_sort_by =~ "^t" - " sort by time (handles time up to 1 quintillion seconds, US) -" call Decho("getftime(".filename.")=".getftime(filename)) - let t = getftime(filename) - let ft = strpart("000000000000000000",1,18-s:Strlen(t)).t -" call Decho("exe keepjumps put ='".ft.'/'.filename."'") - let ftpfile= ft.'/'.pfile - keepjumps silent! put=ftpfile - - elseif g:netrw_sort_by =~ "^s" - " sort by size (handles file sizes up to 1 quintillion bytes, US) -" call Decho("getfsize(".filename.")=".getfsize(filename)) - let sz = getfsize(filename) - let fsz = strpart("000000000000000000",1,18-s:Strlen(sz)).sz -" call Decho("exe keepjumps put ='".fsz.'/'.filename."'") - let fszpfile= fsz.'/'.pfile - keepjumps silent! put =fszpfile - - else - " sort by name -" call Decho("exe keepjumps put ='".pfile."'") - keepjumps silent! put=pfile - endif - endwhile - - " cleanup any windows mess at end-of-line - silent! keepjumps %s/\r$//e - setlocal ts=32 -" call Decho("setlocal ts=32") - -" call Dret("s:LocalListing") -endfun - -" --------------------------------------------------------------------- -" s:LocalBrowseShellCmdRefresh: this function is called after a user has {{{2 -" performed any shell command. The idea is to cause all local-browsing -" buffers to be refreshed after a user has executed some shell command, -" on the chance that s/he removed/created a file/directory with it. -fun! s:LocalBrowseShellCmdRefresh() -" call Dfunc("LocalBrowseShellCmdRefresh() browselist=".(exists("s:netrw_browselist")? string(s:netrw_browselist) : "empty")." ".tabpagenr("$")." tabs") - " determine which buffers currently reside in a tab - if !exists("s:netrw_browselist") -" call Dret("LocalBrowseShellCmdRefresh : browselist is empty") - return - endif - let itab = 1 - let buftablist = [] - while itab <= tabpagenr("$") - let buftablist = buftablist + tabpagebuflist() - let itab = itab + 1 - tabn - endwhile -" call Decho("buftablist".string(buftablist)) -" call Decho("s:netrw_browselist<".(exists("s:netrw_browselist")? string(s:netrw_browselist) : "").">") - " GO through all buffers on netrw_browselist (ie. just local-netrw buffers): - " | refresh any netrw window - " | wipe out any non-displaying netrw buffer - let curwin = winnr() - let ibl = 0 - for ibuf in s:netrw_browselist -" call Decho("bufwinnr(".ibuf.") index(buftablist,".ibuf.")=".index(buftablist,ibuf)) - if bufwinnr(ibuf) == -1 && index(buftablist,ibuf) == -1 -" call Decho("wiping buf#".ibuf,"<".bufname(ibuf).">") - exe "silent! bw ".ibuf - call remove(s:netrw_browselist,ibl) -" call Decho("browselist=".string(s:netrw_browselist)) - continue - elseif index(tabpagebuflist(),ibuf) != -1 -" call Decho("refresh buf#".ibuf.'-> win#'.bufwinnr(ibuf)) - exe bufwinnr(ibuf)."wincmd w" - call s:NetrwRefresh(1,s:NetrwBrowseChgDir(1,'./')) - endif - let ibl= ibl + 1 - endfor - exe curwin."wincmd w" - -" call Dret("LocalBrowseShellCmdRefresh") -endfun - -" --------------------------------------------------------------------- -" s:NetrwLocalRm: {{{2 -fun! s:NetrwLocalRm(path) range -" call Dfunc("NetrwLocalRm(path<".a:path.">)") -" call Decho("firstline=".a:firstline." lastline=".a:lastline) - - " preparation for removing multiple files/directories - let ret = 0 - let all = 0 - let svpos = netrw#NetrwSavePosn() - - if exists("s:netrwmarkfilelist_{bufnr('%')}") - " remove all marked files -" call Decho("remove all marked files") - for fname in s:netrwmarkfilelist_{bufnr("%")} - let ok= s:NetrwLocalRmFile(a:path,fname,all) - if ok =~ 'q\%[uit]' - break - elseif ok =~ 'a\%[ll]' - let all= 1 - endif - endfor - call s:NetrwUnMarkFile(1) - - else - " remove (multiple) files and directories -" call Decho("remove files in range [".a:firstline.",".a:lastline."]") - - let ctr = a:firstline - while ctr <= a:lastline - exe "keepjumps ".ctr - - " sanity checks - if line(".") < w:netrw_bannercnt - let ctr= ctr + 1 - continue - endif - let curword= s:NetrwGetWord() - if curword == "./" || curword == "../" - let ctr= ctr + 1 - continue - endif - let ok= s:NetrwLocalRmFile(a:path,curword,all) - if ok =~ 'q\%[uit]' - break - elseif ok =~ 'a\%[ll]' - let all= 1 - endif - let ctr= ctr + 1 - endwhile - endif - - " refresh the directory - call s:NetrwRefresh(1,s:NetrwBrowseChgDir(1,'./')) - call netrw#NetrwRestorePosn(svpos) - -" call Dret("NetrwLocalRm") -endfun - -" --------------------------------------------------------------------- -" s:NetrwLocalRmFile: remove file fname given the path {{{2 -" Give confirmation prompt unless all==1 -fun! s:NetrwLocalRmFile(path,fname,all) -" call Dfunc("s:NetrwLocalRmFile(path<".a:path."> fname<".a:fname."> all=".a:all) - - let all= a:all - let ok = "" - norm! 0 - let rmfile= s:ComposePath(a:path,a:fname) -" call Decho("rmfile<".rmfile.">") - - if rmfile !~ '^"' && (rmfile =~ '@$' || rmfile !~ '[\/]$') - " attempt to remove file - if !all - echohl Statement - call inputsave() - let ok= input("Confirm deletion of file<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ") - call inputrestore() - echohl NONE - if ok == "" - let ok="no" - endif -" call Decho("response: ok<".ok.">") - let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e') -" call Decho("response: ok<".ok."> (after sub)") - if ok =~ 'a\%[ll]' - let all= 1 - endif - endif - - if all || ok =~ 'y\%[es]' || ok == "" - let ret= s:System("delete",rmfile) -" call Decho("errcode=".v:shell_error." ret=".ret) - endif - - else - " attempt to remove directory - if !all - echohl Statement - call inputsave() - let ok= input("Confirm deletion of directory<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ") - call inputrestore() - let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e') - if ok == "" - let ok="no" - endif - if ok =~ 'a\%[ll]' - let all= 1 - endif - endif - let rmfile= substitute(rmfile,'[\/]$','','e') - - if all || ok =~ 'y\%[es]' || ok == "" -" call Decho("1st attempt: system(".g:netrw_local_rmdir.' "'.rmfile.'")') - call s:System("system",g:netrw_local_rmdir.' "'.rmfile.'"') -" call Decho("v:shell_error=".v:shell_error) - - if v:shell_error != 0 -" call Decho("2nd attempt to remove directory<".rmfile.">") - let errcode= s:System("delete",rmfile) -" call Decho("errcode=".errcode) - - if errcode != 0 - if has("unix") -" call Decho("3rd attempt to remove directory<".rmfile.">") - call s:System("system","rm ".rmfile) - if v:shell_error != 0 && !exists("g:netrw_quiet") - call netrw#ErrorMsg(s:ERROR,"unable to remove directory<".rmfile."> -- is it empty?",34) - endif - elseif !exists("g:netrw_quiet") - call netrw#ErrorMsg(s:ERROR,"unable to remove directory<".rmfile."> -- is it empty?",35) - endif - endif - endif - endif - endif - -" call Dret("s:NetrwLocalRmFile ".ok) - return ok -endfun - -" --------------------------------------------------------------------- -" s:NetrwLocalRename: rename a remote file or directory {{{2 -fun! s:NetrwLocalRename(path) range -" call Dfunc("NetrwLocalRename(path<".a:path.">)") - - " preparation for removing multiple files/directories - let ctr = a:firstline - let svpos= netrw#NetrwSavePosn() - - " rename files given by the markfilelist - if exists("s:netrwmarkfilelist_{bufnr('%')}") - for oldname in s:netrwmarkfilelist_{bufnr("%")} -" call Decho("oldname<".oldname.">") - if exists("subfrom") - let newname= substitute(oldname,subfrom,subto,'') -" call Decho("subfrom<".subfrom."> subto<".subto."> newname<".newname.">") - else - call inputsave() - let newname= input("Moving ".oldname." to : ",oldname) - call inputrestore() - if newname =~ '^s/' - let subfrom = substitute(newname,'^s/\([^/]*\)/.*/$','\1','') - let subto = substitute(newname,'^s/[^/]*/\(.*\)/$','\1','') -" call Decho("subfrom<".subfrom."> subto<".subto."> newname<".newname.">") - let newname = substitute(oldname,subfrom,subto,'') - endif - endif - let ret= rename(oldname,newname) - endfor - 2match none - unlet s:netrwmarkfilelist_{bufnr("%")} - unlet s:netrwmarkfilemtch_{bufnr("%")} - - else - - " attempt to rename files/directories - while ctr <= a:lastline - exe "keepjumps ".ctr - - " sanity checks - if line(".") < w:netrw_bannercnt - let ctr= ctr + 1 - continue - endif - let curword= s:NetrwGetWord() - if curword == "./" || curword == "../" - let ctr= ctr + 1 - continue - endif - - norm! 0 - let oldname= s:ComposePath(a:path,curword) -" call Decho("oldname<".oldname.">") - - call inputsave() - let newname= input("Moving ".oldname." to : ",substitute(oldname,'/*$','','e')) - call inputrestore() - - let ret= rename(oldname,newname) -" call Decho("renaming <".oldname."> to <".newname.">") - - let ctr= ctr + 1 - endwhile - endif - - " refresh the directory -" call Decho("refresh the directory listing") - call s:NetrwRefresh(1,s:NetrwBrowseChgDir(1,'./')) - call netrw#NetrwRestorePosn(svpos) - -" call Dret("NetrwLocalRename") -endfun - -" --------------------------------------------------------------------- -" s:LocalFastBrowser: handles setting up/taking down fast browsing for the local browser {{{2 -" -" Directory Is -" fastbrowse Local Remote -" slow 0 D D D=Deleting a buffer implies it will not be re-used (slow) -" med 1 D H H=Hiding a buffer implies it may be re-used (fast) -" fast 2 H H -fun! s:LocalFastBrowser() -" call Dfunc("LocalFastBrowser() g:netrw_fastbrowse=".g:netrw_fastbrowse) - - " initialize browselist, a list of buffer numbers that the local browser has used - if !exists("s:netrw_browselist") -" call Decho("initialize s:netrw_browselist") - let s:netrw_browselist= [] - endif - - " append current buffer to fastbrowse list - if empty(s:netrw_browselist) || bufnr("%") > s:netrw_browselist[-1] -" call Decho("appendng current buffer to browselist") - call add(s:netrw_browselist,bufnr("%")) -" call Decho("browselist=".string(s:netrw_browselist)) - endif - - " enable autocmd events to handle refreshing/removing local browser buffers - " If local browse buffer is currently showing: refresh it - " If local browse buffer is currently hidden : wipe it - if !exists("s:netrw_browser_shellcmd") && g:netrw_fastbrowse <= 1 -" call Decho("setting up local-browser shell command refresh") - let s:netrw_browser_shellcmd= 1 - augroup AuNetrwShellCmd - au! - if (has("win32") || has("win95") || has("win64") || has("win16")) - au ShellCmdPost * call s:LocalBrowseShellCmdRefresh() - else - au ShellCmdPost,FocusGained * call s:LocalBrowseShellCmdRefresh() - endif - augroup END - endif - - " user must have changed fastbrowse to its fast setting, so remove - " the associated autocmd events - if g:netrw_fastbrowse > 1 && exists("s:netrw_browser_shellcmd") -" call Decho("remove AuNetrwShellCmd autcmd group") - unlet s:netrw_browser_shellcmd - augroup AuNetrwShellCmd - au! - augroup END - augroup! AuNetrwShellCmd - endif - -" call Dret("LocalFastBrowser : browselist<".string(s:netrw_browselist).">") -endfun - -" --------------------------------------------------------------------- -" Support Functions: {{{1 - -" --------------------------------------------------------------------- -" s:UpdateBuffersMenu: does emenu Buffers.Refresh (but due to locale, the menu item may not be called that) {{{2 -" The Buffers.Refresh menu calls s:BMShow(); unfortunately, that means that that function -" can't be called except via emenu. But due to locale, that menu line may not be called -" Buffers.Refresh; hence, s:NetrwBMShow() utilizes a "cheat" to call that function anyway. -fun! s:UpdateBuffersMenu() -" call Dfunc("s:UpdateBuffersMenu()") - if has("gui") && has("menu") && has("gui_running") && &go =~ 'm' - try - silent emenu Buffers.Refresh\ menu - catch /^Vim\%((\a\+)\)\=:E/ - let v:errmsg= "" - silent call s:NetrwBMShow() - endtry - endif -" call Dret("s:UpdateBuffersMenu") -endfun - -" --------------------------------------------------------------------- -" s:NetrwBMShow: {{{2 -fun! s:NetrwBMShow() -" call Dfunc("s:NetrwBMShow()") - redir => bmshowraw - menu - redir END - let bmshowlist = split(bmshowraw,'\n') - if bmshowlist != [] - let bmshowfuncs= filter(bmshowlist,'v:val =~ "<SNR>\\d\\+_BMShow()"') - if bmshowfuncs != [] - let bmshowfunc = substitute(bmshowfuncs[0],'^.*:\(call.*BMShow()\).*$','\1','') - if bmshowfunc =~ '^call.*BMShow()' - exe "silent! ".bmshowfunc - endif - endif - endif -" call Dret("s:NetrwBMShow : bmshowfunc<".bmshowfunc.">") -endfun - -" --------------------------------------------------------------------- -" s:ComposePath: Appends a new part to a path taking different systems into consideration {{{2 -fun! s:ComposePath(base,subdir) -" call Dfunc("s:ComposePath(base<".a:base."> subdir<".a:subdir.">)") - if(has("amiga")) - let ec = a:base[s:Strlen(a:base)-1] - if ec != '/' && ec != ':' - let ret = a:base . "/" . a:subdir - else - let ret = a:base . a:subdir - endif - elseif a:subdir =~ '^\a:[/\\][^/\\]' && (has("win32") || has("win95") || has("win64") || has("win16")) - let ret= a:subdir - elseif a:base =~ '^\a\+://' - let urlbase = substitute(a:base,'^\(\a\+://.\{-}/\)\(.*\)$','\1','') - let curpath = substitute(a:base,'^\(\a\+://.\{-}/\)\(.*\)$','\2','') - let ret = urlbase.curpath.a:subdir -" call Decho("urlbase<".urlbase.">") -" call Decho("curpath<".curpath.">") -" call Decho("ret<".ret.">") - else - let ret = substitute(a:base."/".a:subdir,"//","/","g") - if a:base =~ '^//' - " keeping initial '//' for the benefit of network share listing support - let ret= '/'.ret - endif - endif -" call Dret("s:ComposePath ".ret) - return ret -endfun - -" --------------------------------------------------------------------- -" netrw#ErrorMsg: {{{2 -" 0=note = s:NOTE -" 1=warning = s:WARNING -" 2=error = s:ERROR -" Sep 17, 2007 : max errnum currently is 60 -fun! netrw#ErrorMsg(level,msg,errnum) -" call Dfunc("netrw#ErrorMsg(level=".a:level." msg<".a:msg."> errnum=".a:errnum.") g:netrw_use_errorwindow=".g:netrw_use_errorwindow) - - if a:level == 1 - let level= "**warning** (netrw) " - elseif a:level == 2 - let level= "**error** (netrw) " - else - let level= "**note** (netrw) " - endif - - if g:netrw_use_errorwindow - " (default) netrw creates a one-line window to show error/warning - " messages (reliably displayed) - - " record current window number for NetrwRestorePosn()'s benefit - let s:winBeforeErr= winnr() - - " getting messages out reliably is just plain difficult! - " This attempt splits the current window, creating a one line window. - if bufexists("NetrwMessage") && bufwinnr("NetrwMessage") > 0 - exe bufwinnr("NetrwMessage")."wincmd w" - set ma noro -" call Decho("set ma noro") - call setline(line("$")+1,level.a:msg) - $ - else - bo 1split - enew - setlocal bt=nofile - file NetrwMessage - call setline(line("$"),level.a:msg) - endif - if &fo !~ '[ta]' - syn clear - syn match netrwMesgNote "^\*\*note\*\*" - syn match netrwMesgWarning "^\*\*warning\*\*" - syn match netrwMesgError "^\*\*error\*\*" - hi link netrwMesgWarning WarningMsg - hi link netrwMesgError Error - endif - setlocal noma ro bh=wipe - - else - " (optional) netrw will show messages using echomsg. Even if the - " message doesn't appear, at least it'll be recallable via :messages -" redraw! - if a:level == s:WARNING - echohl WarningMsg - elseif a:level == s:ERROR - echohl Error - endif - echomsg level.a:msg -" call Decho("echomsg ***netrw*** ".a:msg) - echohl None - endif - -" call Dret("netrw#ErrorMsg") -endfun - -" --------------------------------------------------------------------- -" netrw#RFC2396: converts %xx into characters {{{2 -fun! netrw#RFC2396(fname) -" call Dfunc("netrw#RFC2396(fname<".a:fname.">)") - let fname = escape(substitute(a:fname,'%\(\x\x\)','\=nr2char("0x".submatch(1))','ge')," \t") -" call Dret("netrw#RFC2396 ".fname) - return fname -endfun - -" --------------------------------------------------------------------- -" s:FileReadable: o/s independent filereadable {{{2 -fun! s:FileReadable(fname) -" call Dfunc("s:FileReadable(fname<".a:fname.">)") - - if g:netrw_cygwin - let ret= filereadable(substitute(a:fname,'/cygdrive/\(.\)','\1:/','')) - else - let ret= filereadable(a:fname) - endif - -" call Dret("s:FileReadable ".ret) - return ret -endfun - -" --------------------------------------------------------------------- -" s:GetTempfile: gets a tempname that'll work for various o/s's {{{2 -" Places correct suffix on end of temporary filename, -" using the suffix provided with fname -fun! s:GetTempfile(fname) -" call Dfunc("s:GetTempfile(fname<".a:fname.">)") - - if !exists("b:netrw_tmpfile") - " get a brand new temporary filename - let tmpfile= tempname() -" call Decho("tmpfile<".tmpfile."> : from tempname()") - - let tmpfile= escape(substitute(tmpfile,'\','/','ge'),g:netrw_tmpfile_escape) -" call Decho("tmpfile<".tmpfile."> : chgd any \\ -> /") - - " sanity check -- does the temporary file's directory exist? - if !isdirectory(substitute(tmpfile,'[^/]\+$','','e')) -" call Decho("ro=".&ro." ma=".&ma." mod=".&mod." wrap=".&wrap) - call netrw#ErrorMsg(s:ERROR,"your <".substitute(tmpfile,'[^/]\+$','','e')."> directory is missing!",2) -" call Dret("s:GetTempfile getcwd<".getcwd().">") - return "" - endif - - " let netrw#NetSource() know about the tmpfile - let s:netrw_tmpfile= tmpfile " used by netrw#NetSource() -" call Decho("tmpfile<".tmpfile."> s:netrw_tmpfile<".s:netrw_tmpfile.">") - - " o/s dependencies - if g:netrw_cygwin != 0 - let tmpfile = substitute(tmpfile,'^\(\a\):','/cygdrive/\1','e') - elseif has("win32") || has("win95") || has("win64") || has("win16") - if !exists("+shellslash") || !&ssl - let tmpfile = substitute(tmpfile,'/','\','g') - endif - else - let tmpfile = tmpfile - endif - let b:netrw_tmpfile= tmpfile -" call Decho("o/s dependent fixed tempname<".tmpfile.">") - else - " re-use temporary filename - let tmpfile= b:netrw_tmpfile -" call Decho("tmpfile<".tmpfile."> re-using") - endif - - " use fname's suffix for the temporary file - if a:fname != "" - if a:fname =~ '\.[^./]\+$' -" call Decho("using fname<".a:fname.">'s suffix") - if a:fname =~ '.tar.gz' || a:fname =~ '.tar.bz2' - let suffix = ".tar".substitute(a:fname,'^.*\(\.[^./]\+\)$','\1','e') - else - let suffix = substitute(a:fname,'^.*\(\.[^./]\+\)$','\1','e') - endif - let suffix = escape(suffix,g:netrw_tmpfile_escape) -" call Decho("suffix<".suffix.">") - let tmpfile= substitute(tmpfile,'\.tmp$','','e') -" call Decho("chgd tmpfile<".tmpfile."> (removed any .tmp suffix)") - let tmpfile .= suffix -" call Decho("chgd tmpfile<".tmpfile."> (added ".suffix." suffix) netrw_fname<".b:netrw_fname.">") - let s:netrw_tmpfile= tmpfile " supports netrw#NetSource() - endif - endif - -" call Decho("ro=".&ro." ma=".&ma." mod=".&mod." wrap=".&wrap) -" call Dret("s:GetTempfile <".tmpfile.">") - return tmpfile -endfun - -" --------------------------------------------------------------------- -" s:MakeSshCmd: transforms input command using USEPORT HOSTNAME into {{{2 -" a correct command -fun! s:MakeSshCmd(sshcmd) -" call Dfunc("s:MakeSshCmd(sshcmd<".a:sshcmd.">)") - let sshcmd = substitute(a:sshcmd,'\<HOSTNAME\>',s:user.s:machine,'') - if exists("g:netrw_port") && g:netrw_port != "" - let sshcmd= substitute(sshcmd,"USEPORT",g:netrw_sshport.' '.g:netrw_port,'') - elseif exists("s:port") && s:port != "" - let sshcmd= substitute(sshcmd,"USEPORT",g:netrw_sshport.' '.s:port,'') - else - let sshcmd= substitute(sshcmd,"USEPORT ",'','') - endif -" call Dret("s:MakeSshCmd <".sshcmd.">") - return sshcmd -endfun - -" --------------------------------------------------------------------- -" s:RemoteSystem: runs a command on a remote host using ssh {{{2 -" Returns status -fun! s:RemoteSystem(cmd) -" call Dfunc("s:RemoteSystem(cmd<".a:cmd.">)") - if !executable(g:netrw_ssh_cmd) - call netrw#ErrorMsg(s:ERROR,"g:netrw_ssh_cmd<".g:netrw_ssh_cmd."> is not executable!",52) - elseif !exists("b:netrw_curdir") - call netrw#ErrorMsg(s:ERROR,"for some reason b:netrw_curdir doesn't exist!",53) - else - let cmd = s:MakeSshCmd(g:netrw_ssh_cmd." USEPORT HOSTNAME") - let remotedir= substitute(b:netrw_curdir,'^.*//[^/]\+/\(.*\)$','\1','') - if remotedir != "" - let cmd= cmd.' "lcd '."'".remotedir."';" - else - let cmd= cmd.' "' - endif - let cmd= cmd.a:cmd.'"' -" call Decho("call system(".cmd.")") - let ret= system(cmd) - endif -" call Dret("s:RemoteSystem ".ret) - return ret -endfun - -" --------------------------------------------------------------------- -" s:NetrwEnew: opens a new buffer, passes netrw buffer variables through {{{2 -fun! s:NetrwEnew(curdir) -" call Dfunc("s:NetrwEnew(curdir<".a:curdir.">) buf#".bufnr("%")."<".bufname("%").">") - - " grab a function-local-variable copy of buffer variables - if exists("b:netrw_bannercnt") |let netrw_bannercnt = b:netrw_bannercnt |endif - if exists("b:netrw_browser_active") |let netrw_browser_active = b:netrw_browser_active |endif - if exists("b:netrw_cpf") |let netrw_cpf = b:netrw_cpf |endif - if exists("b:netrw_curdir") |let netrw_curdir = b:netrw_curdir |endif - if exists("b:netrw_explore_bufnr") |let netrw_explore_bufnr = b:netrw_explore_bufnr |endif - if exists("b:netrw_explore_indx") |let netrw_explore_indx = b:netrw_explore_indx |endif - if exists("b:netrw_explore_line") |let netrw_explore_line = b:netrw_explore_line |endif - if exists("b:netrw_explore_list") |let netrw_explore_list = b:netrw_explore_list |endif - if exists("b:netrw_explore_listlen")|let netrw_explore_listlen = b:netrw_explore_listlen|endif - if exists("b:netrw_explore_mtchcnt")|let netrw_explore_mtchcnt = b:netrw_explore_mtchcnt|endif - if exists("b:netrw_fname") |let netrw_fname = b:netrw_fname |endif - if exists("b:netrw_lastfile") |let netrw_lastfile = b:netrw_lastfile |endif - if exists("b:netrw_liststyle") |let netrw_liststyle = b:netrw_liststyle |endif - if exists("b:netrw_method") |let netrw_method = b:netrw_method |endif - if exists("b:netrw_option") |let netrw_option = b:netrw_option |endif - if exists("b:netrw_prvdir") |let netrw_prvdir = b:netrw_prvdir |endif - - call s:NetrwOptionRestore("w:") -" call Decho("generate a buffer with keepjumps keepalt enew!") - keepjumps keepalt enew! - call s:NetrwOptionSave("w:") - - " copy function-local-variables to buffer variable equivalents - if exists("netrw_bannercnt") |let b:netrw_bannercnt = netrw_bannercnt |endif - if exists("netrw_browser_active") |let b:netrw_browser_active = netrw_browser_active |endif - if exists("netrw_cpf") |let b:netrw_cpf = netrw_cpf |endif - if exists("netrw_curdir") |let b:netrw_curdir = netrw_curdir |endif - if exists("netrw_explore_bufnr") |let b:netrw_explore_bufnr = netrw_explore_bufnr |endif - if exists("netrw_explore_indx") |let b:netrw_explore_indx = netrw_explore_indx |endif - if exists("netrw_explore_line") |let b:netrw_explore_line = netrw_explore_line |endif - if exists("netrw_explore_list") |let b:netrw_explore_list = netrw_explore_list |endif - if exists("netrw_explore_listlen")|let b:netrw_explore_listlen = netrw_explore_listlen|endif - if exists("netrw_explore_mtchcnt")|let b:netrw_explore_mtchcnt = netrw_explore_mtchcnt|endif - if exists("netrw_fname") |let b:netrw_fname = netrw_fname |endif - if exists("netrw_lastfile") |let b:netrw_lastfile = netrw_lastfile |endif - if exists("netrw_liststyle") |let b:netrw_liststyle = netrw_liststyle |endif - if exists("netrw_method") |let b:netrw_method = netrw_method |endif - if exists("netrw_option") |let b:netrw_option = netrw_option |endif - if exists("netrw_prvdir") |let b:netrw_prvdir = netrw_prvdir |endif - - let b:netrw_curdir= a:curdir - if b:netrw_curdir =~ '/$' - if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST - file NetrwTreeListing - nno <silent> <buffer> [ :silent call <SID>TreeListMove('[')<cr> - nno <silent> <buffer> ] :silent call <SID>TreeListMove(']')<cr> - else - exe "silent! keepalt file ".b:netrw_curdir - endif - endif - -" call Dret("s:NetrwEnew : buf#".bufnr("%")."<".bufname("%")."> expand(%)<".expand("%")."> expand(#)<".expand("#").">") -endfun - -" ------------------------------------------------------------------------ -" netrw#NetrwSavePosn: saves position of cursor on screen {{{2 -fun! netrw#NetrwSavePosn() -" call Dfunc("netrw#NetrwSavePosn()") - " Save current line and column - let w:netrw_winnr= winnr() - let w:netrw_line = line(".") - let w:netrw_col = virtcol(".") - - " Save top-of-screen line - norm! H0 - let w:netrw_hline= line(".") - - " set up string holding position parameters - let ret = "let w:netrw_winnr=".w:netrw_winnr."|let w:netrw_line=".w:netrw_line."|let w:netrw_col=".w:netrw_col."|let w:netrw_hline=".w:netrw_hline - - call netrw#NetrwRestorePosn() -" call Dret("netrw#NetrwSavePosn : winnr=".w:netrw_winnr." line=".w:netrw_line." col=".w:netrw_col." hline=".w:netrw_hline) - return ret -endfun - -" ------------------------------------------------------------------------ -" netrw#NetrwRestorePosn: restores the cursor and file position as saved by NetrwSavePosn() {{{2 -fun! netrw#NetrwRestorePosn(...) -" call Dfunc("netrw#NetrwRestorePosn() a:0=".a:0." winnr=".(exists("w:netrw_winnr")? w:netrw_winnr : -1)." line=".(exists("w:netrw_line")? w:netrw_line : -1)." col=".(exists("w:netrw_col")? w:netrw_col : -1)." hline=".(exists("w:netrw_hline")? w:netrw_hline : -1)) - let eikeep= &ei - set ei=all - if expand("%") == "NetrwMessage" - exe s:winBeforeErr."wincmd w" - endif - - if a:0 > 0 - exe a:1 - endif - - " restore window - if exists("w:netrw_winnr") -" call Decho("restore window: exe silent! ".w:netrw_winnr."wincmd w") - exe "silent! ".w:netrw_winnr."wincmd w" - endif - if v:shell_error == 0 - " as suggested by Bram M: redraw on no error - " allows protocol error messages to remain visible -" redraw! - endif - - " restore top-of-screen line - if exists("w:netrw_hline") -" call Decho("restore topofscreen: exe norm! ".w:netrw_hline."G0z") - exe "norm! ".w:netrw_hline."G0z\<CR>" - endif - - " restore position - if exists("w:netrw_line") && exists("w:netrw_col") -" call Decho("restore posn: exe norm! ".w:netrw_line."G0".w:netrw_col."|") - exe "norm! ".w:netrw_line."G0".w:netrw_col."\<bar>" - endif - - let &ei= eikeep -" call Dret("netrw#NetrwRestorePosn") -endfun - -" --------------------------------------------------------------------- -" s:NetrwSaveWordPosn: used to keep cursor on same word after refresh, {{{2 -" changed sorting, etc. Also see s:NetrwRestoreWordPosn(). -fun! s:NetrwSaveWordPosn() -" call Dfunc("NetrwSaveWordPosn()") - let s:netrw_saveword= '^'.escape(getline("."),g:netrw_cd_escape).'$' -" call Dret("NetrwSaveWordPosn : saveword<".s:netrw_saveword.">") -endfun - -" --------------------------------------------------------------------- -" s:NetrwRestoreWordPosn: used to keep cursor on same word after refresh, {{{2 -" changed sorting, etc. Also see s:NetrwSaveWordPosn(). -fun! s:NetrwRestoreWordPosn() -" call Dfunc("NetrwRestoreWordPosn()") - silent! call search(s:netrw_saveword,'w') -" call Dret("NetrwRestoreWordPosn") -endfun - -" --------------------------------------------------------------------- -" s:RemotePathAnalysis: {{{2 -fun! s:RemotePathAnalysis(dirname) -" call Dfunc("s:RemotePathAnalysis()") - - let dirpat = '^\(\w\{-}\)://\(\w\+@\)\=\([^/:#]\+\)\%([:#]\(\d\+\)\)\=/\(.*\)$' - let s:method = substitute(a:dirname,dirpat,'\1','') - let s:user = substitute(a:dirname,dirpat,'\2','') - let s:machine = substitute(a:dirname,dirpat,'\3','') - let s:port = substitute(a:dirname,dirpat,'\4','') - let s:path = substitute(a:dirname,dirpat,'\5','') - let s:fname = substitute(a:dirname,'^.*/\ze.','','') - -" call Decho("set up s:method <".s:method .">") -" call Decho("set up s:user <".s:user .">") -" call Decho("set up s:machine<".s:machine.">") -" call Decho("set up s:port <".s:port.">") -" call Decho("set up s:path <".s:path .">") -" call Decho("set up s:fname <".s:fname .">") - -" call Dret("s:RemotePathAnalysis") -endfun - -" --------------------------------------------------------------------- -" s:RestoreBufVars: {{{2 -fun! s:RestoreBufVars() -" call Dfunc("s:RestoreBufVars()") - - if exists("s:netrw_curdir") |let b:netrw_curdir = s:netrw_curdir |endif - if exists("s:netrw_lastfile") |let b:netrw_lastfile = s:netrw_lastfile |endif - if exists("s:netrw_method") |let b:netrw_method = s:netrw_method |endif - if exists("s:netrw_fname") |let b:netrw_fname = s:netrw_fname |endif - if exists("s:netrw_machine") |let b:netrw_machine = s:netrw_machine |endif - if exists("s:netrw_browser_active")|let b:netrw_browser_active = s:netrw_browser_active|endif - -" call Dret("s:RestoreBufVars") -endfun - -" --------------------------------------------------------------------- -" s:RestoreWinVars: (used by Explore() and NetrwSplit()) {{{2 -fun! s:RestoreWinVars() -" call Dfunc("s:RestoreWinVars()") - if exists("s:bannercnt") |let w:netrw_bannercnt = s:bannercnt |unlet s:bannercnt |endif - if exists("s:col") |let w:netrw_col = s:col |unlet s:col |endif - if exists("s:curdir") |let w:netrw_curdir = s:curdir |unlet s:curdir |endif - if exists("s:explore_bufnr") |let w:netrw_explore_bufnr = s:explore_bufnr |unlet s:explore_bufnr |endif - if exists("s:explore_indx") |let w:netrw_explore_indx = s:explore_indx |unlet s:explore_indx |endif - if exists("s:explore_line") |let w:netrw_explore_line = s:explore_line |unlet s:explore_line |endif - if exists("s:explore_listlen")|let w:netrw_explore_listlen = s:explore_listlen|unlet s:explore_listlen|endif - if exists("s:explore_list") |let w:netrw_explore_list = s:explore_list |unlet s:explore_list |endif - if exists("s:explore_mtchcnt")|let w:netrw_explore_mtchcnt = s:explore_mtchcnt|unlet s:explore_mtchcnt|endif - if exists("s:fpl") |let w:netrw_fpl = s:fpl |unlet s:fpl |endif - if exists("s:hline") |let w:netrw_hline = s:hline |unlet s:hline |endif - if exists("s:line") |let w:netrw_line = s:line |unlet s:line |endif - if exists("s:liststyle") |let w:netrw_liststyle = s:liststyle |unlet s:liststyle |endif - if exists("s:method") |let w:netrw_method = s:method |unlet s:method |endif - if exists("s:prvdir") |let w:netrw_prvdir = s:prvdir |unlet s:prvdir |endif - if exists("s:treedict") |let w:netrw_treedict = s:treedict |unlet s:treedict |endif - if exists("s:treetop") |let w:netrw_treetop = s:treetop |unlet s:treetop |endif - if exists("s:winnr") |let w:netrw_winnr = s:winnr |unlet s:winnr |endif -" call Dret("s:RestoreWinVars") -endfun - -" --------------------------------------------------------------------- -" s:SaveBufVars: {{{2 -fun! s:SaveBufVars() -" call Dfunc("s:SaveBufVars()") - - if exists("b:netrw_curdir") |let s:netrw_curdir = b:netrw_curdir |endif - if exists("b:netrw_lastfile") |let s:netrw_lastfile = b:netrw_lastfile |endif - if exists("b:netrw_method") |let s:netrw_method = b:netrw_method |endif - if exists("b:netrw_fname") |let s:netrw_fname = b:netrw_fname |endif - if exists("b:netrw_machine") |let s:netrw_machine = b:netrw_machine |endif - if exists("b:netrw_browser_active")|let s:netrw_browser_active = b:netrw_browser_active|endif - -" call Dret("s:SaveBufVars") -endfun - -" --------------------------------------------------------------------- -" s:SaveWinVars: (used by Explore() and NetrwSplit()) {{{2 -fun! s:SaveWinVars() -" call Dfunc("s:SaveWinVars()") - if exists("w:netrw_bannercnt") |let s:bannercnt = w:netrw_bannercnt |endif - if exists("w:netrw_col") |let s:col = w:netrw_col |endif - if exists("w:netrw_curdir") |let s:curdir = w:netrw_curdir |endif - if exists("w:netrw_explore_bufnr") |let s:explore_bufnr = w:netrw_explore_bufnr |endif - if exists("w:netrw_explore_indx") |let s:explore_indx = w:netrw_explore_indx |endif - if exists("w:netrw_explore_line") |let s:explore_line = w:netrw_explore_line |endif - if exists("w:netrw_explore_listlen")|let s:explore_listlen = w:netrw_explore_listlen|endif - if exists("w:netrw_explore_list") |let s:explore_list = w:netrw_explore_list |endif - if exists("w:netrw_explore_mtchcnt")|let s:explore_mtchcnt = w:netrw_explore_mtchcnt|endif - if exists("w:netrw_fpl") |let s:fpl = w:netrw_fpl |endif - if exists("w:netrw_hline") |let s:hline = w:netrw_hline |endif - if exists("w:netrw_line") |let s:line = w:netrw_line |endif - if exists("w:netrw_liststyle") |let s:liststyle = w:netrw_liststyle |endif - if exists("w:netrw_method") |let s:method = w:netrw_method |endif - if exists("w:netrw_prvdir") |let s:prvdir = w:netrw_prvdir |endif - if exists("w:netrw_treedict") |let s:treedict = w:netrw_treedict |endif - if exists("w:netrw_treetop") |let s:treetop = w:netrw_treetop |endif - if exists("w:netrw_winnr") |let s:winnr = w:netrw_winnr |endif -" call Dret("s:SaveWinVars") -endfun - -" --------------------------------------------------------------------- -" s:SetBufWinVars: (used by NetrwBrowse() and LocalBrowseCheck()) {{{2 -" To allow separate windows to have their own activities, such as -" Explore **/pattern, several variables have been made window-oriented. -" However, when the user splits a browser window (ex: ctrl-w s), these -" variables are not inherited by the new window. SetBufWinVars() and -" UseBufWinVars() get around that. -fun! s:SetBufWinVars() -" call Dfunc("s:SetBufWinVars()") - if exists("w:netrw_liststyle") |let b:netrw_liststyle = w:netrw_liststyle |endif - if exists("w:netrw_bannercnt") |let b:netrw_bannercnt = w:netrw_bannercnt |endif - if exists("w:netrw_method") |let b:netrw_method = w:netrw_method |endif - if exists("w:netrw_prvdir") |let b:netrw_prvdir = w:netrw_prvdir |endif - if exists("w:netrw_explore_indx") |let b:netrw_explore_indx = w:netrw_explore_indx |endif - if exists("w:netrw_explore_listlen")|let b:netrw_explore_listlen= w:netrw_explore_listlen|endif - if exists("w:netrw_explore_mtchcnt")|let b:netrw_explore_mtchcnt= w:netrw_explore_mtchcnt|endif - if exists("w:netrw_explore_bufnr") |let b:netrw_explore_bufnr = w:netrw_explore_bufnr |endif - if exists("w:netrw_explore_line") |let b:netrw_explore_line = w:netrw_explore_line |endif - if exists("w:netrw_explore_list") |let b:netrw_explore_list = w:netrw_explore_list |endif -" call Dret("s:SetBufWinVars") -endfun - -" --------------------------------------------------------------------- -" s:SetRexDir: set directory for :Rexplore {{{2 -fun! s:SetRexDir(islocal,dirname) -" call Dfunc("s:SetRexDir(islocal=".a:islocal." dirname<".a:dirname.">)") - " set up Rex and leftmouse-double-click - if a:islocal - exe 'com! Rexplore call netrw#LocalBrowseCheck("'.escape(a:dirname,g:netrw_cd_escape).'")' - if g:netrw_retmap - silent! unmap <2-leftmouse> - if !hasmapto("<Plug>NetrwReturn") - nmap <unique> <silent> <2-leftmouse> <Plug>NetrwReturn - endif - exe 'nnoremap <silent> <Plug>NetrwReturn :call netrw#LocalBrowseCheck("'.a:dirname.'")<cr>' - endif - else - exe 'com! Rexplore call s:NetrwBrowse(0,"'.escape(a:dirname,g:netrw_cd_escape).'")' - if g:netrw_retmap - silent! unmap <2-leftmouse> - if !hasmapto("<Plug>NetrwReturn") - nmap <unique> <silent> <2-leftmouse> <Plug>NetrwReturn - endif - exe 'nnoremap <silent> <Plug>NetrwReturn :call <SID>NetrwBrowse(0,"'.a:dirname.'")<cr>' - endif - endif -" call Dret("s:SetRexDir") -endfun - -" --------------------------------------------------------------------- -" s:Strlen: this function returns the length of a string, even if its {{{2 -" using two-byte etc characters. Depends on virtcol(). -" Currently, its only used if g:Align_xstrlen is set to a -" nonzero value. -fun! s:Strlen(x) -" call Dfunc("s:Strlen(x<".a:x.">") - let ret= strlen(substitute(a:x,'.','c','g')) -" call Dret("s:Strlen ".ret) - return ret -endfun - -" --------------------------------------------------------------------- -" s:System: using Steve Hall's idea to insure that Windows paths stay {{{2 -" acceptable. No effect on Unix paths. -" Examples of use: let result= s:System("system",path) -" let result= s:System("delete",path) -fun! s:System(cmd,path) -" call Dfunc("s:System(cmd<".a:cmd."> path<".a:path.">)") - - let path = a:path - if !g:netrw_cygwin && (has("win32") || has("win95") || has("win64") || has("win16")) - " system call prep - " remove trailing slash (Win95) - let path = substitute(path, '\(\\\|/\)$', '', 'g') - " remove escaped spaces - let path = substitute(path, '\ ', ' ', 'g') - " convert slashes to backslashes - let path = substitute(path, '/', '\', 'g') - if exists("+shellslash") - let sskeep= &shellslash - setlocal noshellslash - exe "let result= ".a:cmd."('".path."')" - let &shellslash = sskeep - else - exe "let result= ".a:cmd."(".g:netrw_shq.path.g:netrw_shq.")" - endif - else - exe "let result= ".a:cmd."('".path."')" - endif - -" call Dret("s:System result<".result.">") - return result -endfun - -" --------------------------------------------------------------------- -" s:TreeListMove: {{{2 -fun! s:TreeListMove(dir) -" call Dfunc("s:TreeListMove(dir<".a:dir.">)") - let curline = getline(".") - let prvline = (line(".") > 1)? getline(line(".")-1) : '' - let nxtline = (line(".") < line("$"))? getline(line(".")+1) : '' - let curindent= substitute(curline,'^\([| ]*\).\{-}$','\1','') - let indentm1 = substitute(curindent,'^| ','','') -" call Decho("prvline <".prvline."> #".line(".")-1) -" call Decho("curline <".curline."> #".line(".")) -" call Decho("nxtline <".nxtline."> #".line(".")+1) -" call Decho("curindent<".curindent.">") -" call Decho("indentm1 <".indentm1.">") - - if curline !~ '/$' -" call Decho('regfile') - if a:dir == '[' && prvline != '' - norm! 0 - let nl = search('^'.indentm1.'[^|]','bWe') " search backwards from regular file -" call Decho("regfile srch back: ".nl) - elseif a:dir == ']' && nxtline != '' - norm! $ - let nl = search('^'.indentm1.'[^|]','We') " search forwards from regular file -" call Decho("regfile srch fwd: ".nl) - endif - - elseif a:dir == '[' && prvline != '' - norm! 0 - let curline= line(".") - let nl = search('^'.curindent.'[^|]','bWe') " search backwards From directory, same indentation -" call Decho("dir srch back ind: ".nl) - if nl != 0 - if line(".") == curline-1 - let nl= search('^'.indentm1.'[^|]','bWe') " search backwards from directory, indentation - 1 -" call Decho("dir srch back ind-1: ".nl) - endif - endif - - elseif a:dir == ']' && nxtline != '' - norm! $ - let curline = line(".") - let nl = search('^'.curindent.'[^|]','We') " search forwards from directory, same indentation -" call Decho("dir srch fwd ind: ".nl) - if nl != 0 - if line(".") == curline+1 - let nl= search('^'.indentm1.'[^|]','We') " search forwards from directory, indentation - 1 -" call Decho("dir srch fwd ind-1: ".nl) - endif - endif - - endif - -" call Dret("s:TreeListMove") -endfun - -" --------------------------------------------------------------------- -" s:UseBufWinVars: (used by NetrwBrowse() and LocalBrowseCheck() {{{2 -" Matching function to BufferWinVars() -fun! s:UseBufWinVars() -" call Dfunc("s:UseBufWinVars()") - if exists("b:netrw_liststyle") && !exists("w:netrw_liststyle") |let w:netrw_liststyle = b:netrw_liststyle |endif - if exists("b:netrw_bannercnt") && !exists("w:netrw_bannercnt") |let w:netrw_bannercnt = b:netrw_bannercnt |endif - if exists("b:netrw_method") && !exists("w:netrw_method") |let w:netrw_method = b:netrw_method |endif - if exists("b:netrw_prvdir") && !exists("w:netrw_prvdir") |let w:netrw_prvdir = b:netrw_prvdir |endif - if exists("b:netrw_explore_indx") && !exists("w:netrw_explore_indx") |let w:netrw_explore_indx = b:netrw_explore_indx |endif - if exists("b:netrw_explore_listlen") && !exists("w:netrw_explore_listlen")|let w:netrw_explore_listlen = b:netrw_explore_listlen|endif - if exists("b:netrw_explore_mtchcnt") && !exists("w:netrw_explore_mtchcnt")|let w:netrw_explore_mtchcnt = b:netrw_explore_mtchcnt|endif - if exists("b:netrw_explore_bufnr") && !exists("w:netrw_explore_bufnr") |let w:netrw_explore_bufnr = b:netrw_explore_bufnr |endif - if exists("b:netrw_explore_line") && !exists("w:netrw_explore_line") |let w:netrw_explore_line = b:netrw_explore_line |endif - if exists("b:netrw_explore_list") && !exists("w:netrw_explore_list") |let w:netrw_explore_list = b:netrw_explore_list |endif -" call Dret("s:UseBufWinVars") -endfun - -" --------------------------------------------------------------------- -" Settings Restoration: {{{2 -let &cpo= s:keepcpo -unlet s:keepcpo - -" ------------------------------------------------------------------------ -" Modelines: {{{1 -" vim:ts=8 fdm=marker +" netrw.vim: Handles file transfer and remote directory listing across +" AUTOLOAD SECTION +" Date: Sep 02, 2008 +" Version: 133 +" Maintainer: Charles E Campbell, Jr <NdrOchip@ScampbellPfamily.AbizM-NOSPAM> +" GetLatestVimScripts: 1075 1 :AutoInstall: netrw.vim +" Copyright: Copyright (C) 1999-2008 Charles E. Campbell, Jr. {{{1 +" Permission is hereby granted to use and distribute this code, +" with or without modifications, provided that this copyright +" notice is copied with it. Like anything else that's free, +" netrw.vim, netrwPlugin.vim, and netrwSettings.vim are provided +" *as is* and come with no warranty of any kind, either +" expressed or implied. By using this plugin, you agree that +" in no event will the copyright holder be liable for any damages +" resulting from the use of this software. +"redraw!|call DechoSep()|call inputsave()|call input("Press <cr> to continue")|call inputrestore() +" +" But be doers of the Word, and not only hearers, deluding your own selves {{{1 +" (James 1:22 RSV) +" =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- +" Load Once: {{{1 +if &cp || exists("g:loaded_netrw") + finish +endif +if !exists("s:NOTE") + let s:NOTE = 0 + let s:WARNING = 1 + let s:ERROR = 2 +endif +let g:loaded_netrw = "v133" + +" sanity checks +if v:version < 700 + call netrw#ErrorMsg(s:WARNING,"you need vim version 7.0 or later for version ".g:loaded_netrw." of netrw",1) + finish +endif + +let s:keepcpo= &cpo +setlocal cpo&vim +"DechoTabOn +"call Decho("doing autoload/netrw.vim version ".g:loaded_netrw) + +" ====================== +" Netrw Variables: {{{1 +" ====================== + +" --------------------------------------------------------------------- +" Netrw Constants: {{{2 +if !exists("g:NETRW_BOOKMARKMAX") + let g:NETRW_BOOKMARKMAX= 0 +endif +if !exists("g:NETRW_DIRHIST_CNT") + let g:NETRW_DIRHIST_CNT= 0 +endif +if !exists("s:LONGLIST") + let s:THINLIST = 0 + let s:LONGLIST = 1 + let s:WIDELIST = 2 + let s:TREELIST = 3 + let s:MAXLIST = 4 +endif + +" --------------------------------------------------------------------- +" Default values for netrw's global protocol variables {{{2 +if !exists("g:netrw_dav_cmd") + let g:netrw_dav_cmd = "cadaver" +endif +if !exists("g:netrw_fetch_cmd") + if executable("fetch") + let g:netrw_fetch_cmd = "fetch -o" + else + let g:netrw_fetch_cmd = "" + endif +endif +if !exists("g:netrw_ftp_cmd") + let g:netrw_ftp_cmd = "ftp" +endif +if !exists("g:netrw_http_cmd") + if executable("elinks") + let g:netrw_http_cmd = "elinks" + let g:netrw_http_xcmd= "-dump >" + elseif executable("links") + let g:netrw_http_cmd = "links" + let g:netrw_http_xcmd= "-dump >" + elseif executable("curl") + let g:netrw_http_cmd = "curl -o" + elseif executable("wget") + let g:netrw_http_cmd = "wget -q -O" + elseif executable("fetch") + let g:netrw_http_cmd = "fetch -o" + else + let g:netrw_http_cmd = "" + endif +endif +if !exists("g:netrw_rcp_cmd") + let g:netrw_rcp_cmd = "rcp" +endif +if !exists("g:netrw_rsync_cmd") + let g:netrw_rsync_cmd = "rsync" +endif +if !exists("g:netrw_scp_cmd") + let g:netrw_scp_cmd = "scp -q" +endif +if !exists("g:netrw_sftp_cmd") + let g:netrw_sftp_cmd = "sftp" +endif +if !exists("g:netrw_ssh_cmd") + let g:netrw_ssh_cmd= "ssh" +endif + +if (has("win32") || has("win95") || has("win64") || has("win16")) + \ && exists("g:netrw_use_nt_rcp") + \ && g:netrw_use_nt_rcp + \ && executable( $SystemRoot .'/system32/rcp.exe') + let s:netrw_has_nt_rcp = 1 + let s:netrw_rcpmode = '-b' +else + let s:netrw_has_nt_rcp = 0 + let s:netrw_rcpmode = '' +endif + +" --------------------------------------------------------------------- +" Default values for netrw's global variables {{{2 +" Cygwin Detection ------- {{{3 +if !exists("g:netrw_cygwin") + if has("win32") || has("win95") || has("win64") || has("win16") + if &shell =~ '\%(\<bash\>\|\<zsh\>\)\%(\.exe\)\=$' + let g:netrw_cygwin= 1 + else + let g:netrw_cygwin= 0 + endif + else + let g:netrw_cygwin= 0 + endif +endif +" Default values - a-c ---------- {{{3 +if !exists("g:netrw_alto") + let g:netrw_alto= &sb +endif +if !exists("g:netrw_altv") + let g:netrw_altv= &spr +endif +if !exists("g:netrw_browse_split") + let g:netrw_browse_split= 0 +endif +if !exists("g:netrw_chgwin") + let g:netrw_chgwin = -1 +endif +if !exists("g:netrw_compress") + let g:netrw_compress= "gzip" +endif +if !exists("g:netrw_ctags") + let g:netrw_ctags= "ctags" +endif +if !exists("g:netrw_cursorline") + let g:netrw_cursorline= 1 + let s:netrw_usercul = &cursorline + let s:netrw_usercuc = &cursorcolumn +endif +" Default values - d-g ---------- {{{3 +if !exists("g:NETRW_DIRHIST_CNT") + let g:NETRW_DIRHIST_CNT= 0 +endif +if !exists("g:netrw_decompress") + let g:netrw_decompress= { ".gz" : "gunzip" , ".bz2" : "bunzip2" , ".zip" : "unzip" , ".tar" : "tar -xf"} +endif +if !exists("g:netrw_dirhistmax") + let g:netrw_dirhistmax= 10 +endif +if !exists("g:netrw_fastbrowse") + let g:netrw_fastbrowse= 1 +endif +if !exists("g:netrw_ftp_browse_reject") + let g:netrw_ftp_browse_reject='^total\s\+\d\+$\|^Trying\s\+\d\+.*$\|^KERBEROS_V\d rejected\|^Security extensions not\|No such file\|: connect to address [0-9a-fA-F:]*: No route to host$' +endif +if !exists("g:netrw_ftp_list_cmd") + if has("unix") || (exists("g:netrw_cygwin") && g:netrw_cygwin) + let g:netrw_ftp_list_cmd = "ls -lF" + let g:netrw_ftp_timelist_cmd = "ls -tlF" + let g:netrw_ftp_sizelist_cmd = "ls -slF" + else + let g:netrw_ftp_list_cmd = "dir" + let g:netrw_ftp_timelist_cmd = "dir" + let g:netrw_ftp_sizelist_cmd = "dir" + endif +endif +if !exists("g:netrw_ftpmode") + let g:netrw_ftpmode= "binary" +endif +" Default values - h-lh ---------- {{{3 +if !exists("g:netrw_hide") + let g:netrw_hide= 1 +endif +if !exists("g:netrw_ignorenetrc") + if &shell =~ '\c\<\%(cmd\|4nt\)\.exe$' + let g:netrw_ignorenetrc= 1 + else + let g:netrw_ignorenetrc= 0 + endif +endif +if !exists("g:netrw_keepdir") + let g:netrw_keepdir= 1 +endif +if !exists("g:netrw_list_cmd") + if g:netrw_scp_cmd =~ '^pscp' && executable("pscp") + " provide a 'pscp' listing command + if (has("win32") || has("win95") || has("win64") || has("win16")) && filereadable("c:\\private.ppk") + let g:netrw_scp_cmd ="pscp -i C:\\private.ppk" + endif + let g:netrw_list_cmd= g:netrw_scp_cmd." -ls USEPORT HOSTNAME:" + elseif executable(g:netrw_ssh_cmd) + " provide a default listing command + let g:netrw_list_cmd= g:netrw_ssh_cmd." USEPORT HOSTNAME ls -FLa" + else +" call Decho(g:netrw_ssh_cmd." is not executable") + let g:netrw_list_cmd= "" + endif +endif +if !exists("g:netrw_list_hide") + let g:netrw_list_hide= "" +endif +" Default values - lh-lz ---------- {{{3 +if !exists("g:netrw_localcopycmd") + if has("win32") || has("win95") || has("win64") || has("win16") + if g:netrw_cygwin + let g:netrw_localcopycmd= "cp" + else + let g:netrw_localcopycmd= "copy" + endif + elseif has("unix") || has("macunix") + let g:netrw_localcopycmd= "cp" + else + let g:netrw_localcopycmd= "" + endif +endif +if !exists("g:netrw_local_mkdir") + let g:netrw_local_mkdir= "mkdir" +endif +if !exists("g:netrw_localmovecmd") + if has("win32") || has("win95") || has("win64") || has("win16") + if g:netrw_cygwin + let g:netrw_localmovecmd= "mv" + else + let g:netrw_localmovecmd= "move" + endif + elseif has("unix") || has("macunix") + let g:netrw_localmovecmd= "mv" + else + let g:netrw_localmovecmd= "" + endif +endif +if !exists("g:netrw_local_rmdir") + let g:netrw_local_rmdir= "rmdir" +endif +if !exists("g:netrw_liststyle") + let g:netrw_liststyle= s:THINLIST +endif +if g:netrw_liststyle < 0 || g:netrw_liststyle >= s:MAXLIST + " sanity check + let g:netrw_liststyle= s:THINLIST +endif +if g:netrw_liststyle == s:LONGLIST && g:netrw_scp_cmd !~ '^pscp' + let g:netrw_list_cmd= g:netrw_list_cmd." -l" +endif +" Default values - m-r ---------- {{{3 +if !exists("g:netrw_markfileesc") + let g:netrw_markfileesc= '*./[\~' +endif +if !exists("g:netrw_maxfilenamelen") + let g:netrw_maxfilenamelen= 32 +endif +if !exists("g:netrw_menu") + let g:netrw_menu= 1 +endif +if !exists("g:netrw_mkdir_cmd") + let g:netrw_mkdir_cmd= g:netrw_ssh_cmd." USEPORT HOSTNAME mkdir" +endif +if !exists("g:netrw_mousemaps") + if exists("&mouse") && &mouse =~ '[anh]' + let g:netrw_mousemaps= 1 + else + let g:netrw_mousemaps= 0 + endif +endif +if !exists("g:netrw_retmap") + let g:netrw_retmap= 0 +endif +if !exists("g:netrw_preview") + let g:netrw_preview= 0 +endif +if !exists("g:netrw_scpport") + let g:netrw_scpport= "-P" +endif +if !exists("g:netrw_sshport") + let g:netrw_sshport= "-p" +endif +if !exists("g:netrw_rename_cmd") + let g:netrw_rename_cmd= g:netrw_ssh_cmd." USEPORT HOSTNAME mv" +endif +if !exists("g:netrw_rm_cmd") + let g:netrw_rm_cmd = g:netrw_ssh_cmd." USEPORT HOSTNAME rm" +endif +if !exists("g:netrw_rmdir_cmd") + let g:netrw_rmdir_cmd = g:netrw_ssh_cmd." USEPORT HOSTNAME rmdir" +endif +if !exists("g:netrw_rmf_cmd") + let g:netrw_rmf_cmd = g:netrw_ssh_cmd." USEPORT HOSTNAME rm -f" +endif +" Default values - s ---------- {{{3 + " set up shell quoting character +if exists("g:netrw_silent") && g:netrw_silent != 0 + let s:netrw_silentxfer= "silent " +else + let s:netrw_silentxfer= "" +endif +if !exists("g:netrw_sort_by") + " alternatives: date size + let g:netrw_sort_by= "name" +endif +if !exists("g:netrw_sort_options") + let g:netrw_sort_options= "" +endif +if !exists("g:netrw_sort_direction") + " alternative: reverse (z y x ...) + let g:netrw_sort_direction= "normal" +endif +if !exists("g:netrw_sort_sequence") + let g:netrw_sort_sequence= '[\/]$,\.h$,\.c$,\.cpp$,*,\.o$,\.obj$,\.info$,\.swp$,\.bak$,\~$' +endif +if !exists("g:netrw_special_syntax") + let g:netrw_special_syntax= 0 +endif +if !exists("g:netrw_ssh_browse_reject") + let g:netrw_ssh_browse_reject='^total\s\+\d\+$' +endif +if !has("patch192") + if !exists("g:netrw_use_noswf") + let g:netrw_use_noswf= 1 + endif +else + let g:netrw_use_noswf= 0 +endif +" Default values - t-w ---------- {{{3 +if !exists("g:netrw_timefmt") + let g:netrw_timefmt= "%c" +endif +if !exists("g:netrw_xstrlen") + let g:netrw_xstrlen= 1 +endif +if !exists("g:NetrwTopLvlMenu") + let g:NetrwTopLvlMenu= "Netrw." +endif +if !exists("g:netrw_use_errorwindow") + let g:netrw_use_errorwindow= 1 +endif +if !exists("g:netrw_win95ftp") + let g:netrw_win95ftp= 1 +endif +if !exists("g:netrw_winsize") + let g:netrw_winsize= "" +endif +" --------------------------------------------------------------------- +" Default values for netrw's script variables: {{{2 +if !exists("g:netrw_fname_escape") + let g:netrw_fname_escape= ' ?&;%' +endif +if !exists("g:netrw_glob_escape") + let g:netrw_glob_escape= '[]*?`{~$' +endif +if !exists("g:netrw_tmpfile_escape") + let g:netrw_tmpfile_escape= ' &;' +endif +let s:netrw_map_escape = "<|\n\r\\\<C-V>\"" + +" BufEnter event ignored by decho when following variable is true +" Has a side effect that doau BufReadPost doesn't work, so +" files read by network transfer aren't appropriately highlighted. +"let g:decho_bufenter = 1 "Decho + +" ============================== +" Netrw Utility Functions: {{{1 +" ============================== + +" ------------------------------------------------------------------------ +" s:NetrwOptionSave: save options and set to "standard" form {{{2 +" 06/08/07 : removed call to NetrwSafeOptions(), either placed +" immediately after NetrwOptionSave() calls in NetRead +" and NetWrite, or after the s:NetrwEnew() call in +" NetrwBrowse. +" vt: normally its "w:" or "s:" (a variable type) +fun! s:NetrwOptionSave(vt) +" call Dfunc("s:NetrwOptionSave(vt<".a:vt.">) win#".winnr()." buf#".bufnr("%")."<".bufname(bufnr("%")).">") + +" call Decho(a:vt."netrw_optionsave".(exists("{a:vt}netrw_optionsave")? ("=".{a:vt}netrw_optionsave) : " doesn't exist")) + if !exists("{a:vt}netrw_optionsave") + let {a:vt}netrw_optionsave= 1 + else +" call Dret("s:NetrwOptionSave : options already saved") + return + endif +" call Decho("fo=".&fo.(exists("&acd")? " acd=".&acd : " acd doesn't exist")) + + " Save current settings and current directory + let s:yykeep = @@ + if exists("&l:acd") + let {a:vt}netrw_acdkeep = &l:acd + endif + let {a:vt}netrw_aikeep = &l:ai + let {a:vt}netrw_awkeep = &l:aw + let {a:vt}netrw_cikeep = &l:ci + let {a:vt}netrw_cinkeep = &l:cin + let {a:vt}netrw_cinokeep = &l:cino + let {a:vt}netrw_comkeep = &l:com + let {a:vt}netrw_cpokeep = &l:cpo + if g:netrw_keepdir + let {a:vt}netrw_dirkeep = getcwd() + endif + let {a:vt}netrw_fokeep = &l:fo " formatoptions + let {a:vt}netrw_gdkeep = &l:gd " gdefault + let {a:vt}netrw_hidkeep = &l:hidden + let {a:vt}netrw_magickeep = &l:magic + let {a:vt}netrw_repkeep = &l:report + let {a:vt}netrw_spellkeep = &l:spell + let {a:vt}netrw_twkeep = &l:tw " textwidth + let {a:vt}netrw_wigkeep = &l:wig " wildignore + if has("win32") && !has("win95") + let {a:vt}netrw_swfkeep = &l:swf " swapfile + endif + if &go =~ 'a' | silent! let {a:vt}netrw_regstar = @* | endif + silent! let {a:vt}netrw_regslash= @/ + +" call Dret("s:NetrwOptionSave : win#".winnr()." buf#".bufnr("%")) +endfun + +" ------------------------------------------------------------------------ +" s:NetrwOptionRestore: restore options {{{2 +fun! s:NetrwOptionRestore(vt) +" call Dfunc("s:NetrwOptionRestore(vt<".a:vt.">) win#".winnr()." buf#".bufnr("%")) + if !exists("{a:vt}netrw_optionsave") +" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap) +" call Dret("s:NetrwOptionRestore : ".a:vt."netrw_optionsave doesn't exist") + return + endif + unlet {a:vt}netrw_optionsave + + if exists("&acd") + if exists("{a:vt}netrw_acdkeep") +" call Decho("g:netrw_keepdir=".g:netrw_keepdir.": getcwd<".getcwd()."> acd=".&acd) + let curdir = getcwd() + let &l:acd = {a:vt}netrw_acdkeep + unlet {a:vt}netrw_acdkeep + if &l:acd +" call Decho("exe keepjumps lcd ".fnameescape(curdir)) " NOTE: was g:netrw_fname_escape for some reason + try + if !exists("&l:acd") && !&l:acd + exe 'keepjumps lcd '.fnameescape(curdir) + endif + catch /^Vim\%((\a\+)\)\=:E472/ + call netrw#ErrorMsg(s:ERROR,"unable to change directory to <".curdir."> (permissions?)",61) + endtry + endif + endif + endif + if exists("{a:vt}netrw_aikeep") |let &l:ai = {a:vt}netrw_aikeep |unlet {a:vt}netrw_aikeep |endif + if exists("{a:vt}netrw_awkeep") |let &l:aw = {a:vt}netrw_awkeep |unlet {a:vt}netrw_awkeep |endif + if exists("{a:vt}netrw_cikeep") |let &l:ci = {a:vt}netrw_cikeep |unlet {a:vt}netrw_cikeep |endif + if exists("{a:vt}netrw_cinkeep") |let &l:cin = {a:vt}netrw_cinkeep |unlet {a:vt}netrw_cinkeep |endif + if exists("{a:vt}netrw_cinokeep") |let &l:cino = {a:vt}netrw_cinokeep |unlet {a:vt}netrw_cinokeep |endif + if exists("{a:vt}netrw_comkeep") |let &l:com = {a:vt}netrw_comkeep |unlet {a:vt}netrw_comkeep |endif + if exists("{a:vt}netrw_cpokeep") |let &l:cpo = {a:vt}netrw_cpokeep |unlet {a:vt}netrw_cpokeep |endif + if exists("{a:vt}netrw_dirkeep") && isdirectory({a:vt}netrw_dirkeep) && g:netrw_keepdir + let dirkeep = substitute({a:vt}netrw_dirkeep,'\\','/','g') + if exists("{a:vt}netrw_dirkeep") |exe "keepjumps lcd ".fnameescape(dirkeep)|unlet {a:vt}netrw_dirkeep |endif + endif + if exists("{a:vt}netrw_fokeep") |let &l:fo = {a:vt}netrw_fokeep |unlet {a:vt}netrw_fokeep |endif + if exists("{a:vt}netrw_gdkeep") |let &l:gd = {a:vt}netrw_gdkeep |unlet {a:vt}netrw_gdkeep |endif + if exists("{a:vt}netrw_hidkeep") |let &l:hidden = {a:vt}netrw_hidkeep |unlet {a:vt}netrw_hidkeep |endif + if exists("{a:vt}netrw_magic") |let &l:magic = {a:vt}netrw_magic |unlet {a:vt}netrw_magic |endif + if exists("{a:vt}netrw_repkeep") |let &l:report = {a:vt}netrw_repkeep |unlet {a:vt}netrw_repkeep |endif + if exists("{a:vt}netrw_spellkeep")|let &l:spell = {a:vt}netrw_spellkeep |unlet {a:vt}netrw_spellkeep|endif + if exists("{a:vt}netrw_twkeep") |let &l:tw = {a:vt}netrw_twkeep |unlet {a:vt}netrw_twkeep |endif + if exists("{a:vt}netrw_wigkeep") |let &l:wig = {a:vt}netrw_wigkeep |unlet {a:vt}netrw_wigkeep |endif + if exists("s:yykeep") |let @@ = s:yykeep |unlet s:yykeep |endif + if exists("{a:vt}netrw_swfkeep") + if &directory == "" + " user hasn't specified a swapfile directory; + " netrw will temporarily set the swapfile directory + " to the current directory as returned by getcwd(). + let &l:directory = getcwd() + silent! let &l:swf = {a:vt}netrw_swfkeep + setlocal directory= + unlet {a:vt}netrw_swfkeep + elseif &l:swf != {a:vt}netrw_swfkeep + " following line causes a Press ENTER in windows -- can't seem to work around it!!! + silent! let &l:swf= {a:vt}netrw_swfkeep + unlet {a:vt}netrw_swfkeep + endif + endif + if exists("{a:vt}netrw_regstar") |silent! let @*= {a:vt}netrw_regstar |unlet {a:vt}netrw_regstar |endif + if exists("{a:vt}netrw_regslash")|silent! let @/= {a:vt}netrw_regslash|unlet {a:vt}netrw_regslash|endif + +" call Decho("g:netrw_keepdir=".g:netrw_keepdir.": getcwd<".getcwd()."> acd=".&acd) +" call Decho("fo=".&fo.(exists("&acd")? " acd=".&acd : " acd doesn't exist")) +" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap) +" call Dret("s:NetrwOptionRestore : win#".winnr()." buf#".bufnr("%")) +endfun + +" --------------------------------------------------------------------- +" s:NetrwSafeOptions: sets options to help netrw do its job {{{2 +fun! s:NetrwSafeOptions() +" call Dfunc("s:NetrwSafeOptions() win#".winnr()." buf#".bufnr("%")."<".bufname(bufnr("%")).">") +" call Decho("window's ft=".&ft) + setlocal cino= + setlocal com= + setlocal cpo-=aA + if exists("&acd") | setlocal noacd | endif + setlocal nocin noai noci magic nospell nohid wig= noaw + setlocal fo=nroql2 + setlocal tw=0 + setlocal report=10000 + if g:netrw_use_noswf && has("win32") && !has("win95") + setlocal noswf + endif +" call Decho("fo=".&fo.(exists("&acd")? " acd=".&acd : " acd doesn't exist")) +" call Dret("s:NetrwSafeOptions") +endfun + +" --------------------------------------------------------------------- +" netrw#NetrwClean: remove netrw {{{2 +" supports :NetrwClean -- remove netrw from first directory on runtimepath +" :NetrwClean! -- remove netrw from all directories on runtimepath +fun! netrw#NetrwClean(sys) +" call Dfunc("netrw#NetrwClean(sys=".a:sys.")") + + if a:sys + let choice= confirm("Remove personal and system copies of netrw?","&Yes\n&No") + else + let choice= confirm("Remove personal copy of netrw?","&Yes\n&No") + endif +" call Decho("choice=".choice) + let diddel= 0 + let diddir= "" + + if choice == 1 + for dir in split(&rtp,',') + if filereadable(dir."/plugin/netrwPlugin.vim") +" call Decho("removing netrw-related files from ".dir) + if s:NetrwDelete(dir."/plugin/netrwPlugin.vim") |call netrw#ErrorMsg(1,"unable to remove ".dir."/plugin/netrwPlugin.vim",55) |endif + if s:NetrwDelete(dir."/autoload/netrwFileHandlers.vim")|call netrw#ErrorMsg(1,"unable to remove ".dir."/autoload/netrwFileHandlers.vim",55)|endif + if s:NetrwDelete(dir."/autoload/netrwSettings.vim") |call netrw#ErrorMsg(1,"unable to remove ".dir."/autoload/netrwSettings.vim",55) |endif + if s:NetrwDelete(dir."/autoload/netrw.vim") |call netrw#ErrorMsg(1,"unable to remove ".dir."/autoload/netrw.vim",55) |endif + if s:NetrwDelete(dir."/syntax/netrw.vim") |call netrw#ErrorMsg(1,"unable to remove ".dir."/syntax/netrw.vim",55) |endif + if s:NetrwDelete(dir."/syntax/netrwlist.vim") |call netrw#ErrorMsg(1,"unable to remove ".dir."/syntax/netrwlist.vim",55) |endif + let diddir= dir + let diddel= diddel + 1 + if !a:sys|break|endif + endif + endfor + endif + + echohl WarningMsg + if diddel == 0 + echomsg "netrw is either not installed or not removable" + elseif diddel == 1 + echomsg "removed one copy of netrw from <".diddir.">" + else + echomsg "removed ".diddel." copies of netrw" + endif + echohl None + +" call Dret("netrw#NetrwClean") +endfun + +" ------------------------------------------------------------------------ +" Netrw Transfer Functions: {{{1 +" =============================== + +" ------------------------------------------------------------------------ +" netrw#NetRead: responsible for reading a file over the net {{{2 +" mode: =0 read remote file and insert before current line +" =1 read remote file and insert after current line +" =2 replace with remote file +" =3 obtain file, but leave in temporary format +fun! netrw#NetRead(mode,...) +" call Dfunc("netrw#NetRead(mode=".a:mode.",...) a:0=".a:0." ".g:loaded_netrw) + + " save options {{{3 + call s:NetrwOptionSave("w:") + call s:NetrwSafeOptions() + + " interpret mode into a readcmd {{{3 + if a:mode == 0 " read remote file before current line + let readcmd = "0r" + elseif a:mode == 1 " read file after current line + let readcmd = "r" + elseif a:mode == 2 " replace with remote file + let readcmd = "%r" + elseif a:mode == 3 " skip read of file (leave as temporary) + let readcmd = "t" + else + exe a:mode + let readcmd = "r" + endif + let ichoice = (a:0 == 0)? 0 : 1 +" call Decho("readcmd<".readcmd."> ichoice=".ichoice) + + " Get Temporary Filename {{{3 + let tmpfile= s:GetTempfile("") + if tmpfile == "" +" call Dret("netrw#NetRead : unable to get a tempfile!") + return + endif + + while ichoice <= a:0 + + " attempt to repeat with previous host-file-etc + if exists("b:netrw_lastfile") && a:0 == 0 +" call Decho("using b:netrw_lastfile<" . b:netrw_lastfile . ">") + let choice = b:netrw_lastfile + let ichoice= ichoice + 1 + + else + exe "let choice= a:" . ichoice +" call Decho("no lastfile: choice<" . choice . ">") + + if match(choice,"?") == 0 + " give help + echomsg 'NetRead Usage:' + echomsg ':Nread machine:path uses rcp' + echomsg ':Nread "machine path" uses ftp with <.netrc>' + echomsg ':Nread "machine id password path" uses ftp' + echomsg ':Nread dav://machine[:port]/path uses cadaver' + echomsg ':Nread fetch://machine/path uses fetch' + echomsg ':Nread ftp://[user@]machine[:port]/path uses ftp autodetects <.netrc>' + echomsg ':Nread http://[user@]machine/path uses http wget' + echomsg ':Nread rcp://[user@]machine/path uses rcp' + echomsg ':Nread rsync://machine[:port]/path uses rsync' + echomsg ':Nread scp://[user@]machine[[:#]port]/path uses scp' + echomsg ':Nread sftp://[user@]machine[[:#]port]/path uses sftp' + sleep 4 + break + + elseif match(choice,'^"') != -1 + " Reconstruct Choice if choice starts with '"' +" call Decho("reconstructing choice") + if match(choice,'"$') != -1 + " case "..." + let choice=strpart(choice,1,strlen(choice)-2) + else + " case "... ... ..." + let choice = strpart(choice,1,strlen(choice)-1) + let wholechoice = "" + + while match(choice,'"$') == -1 + let wholechoice = wholechoice . " " . choice + let ichoice = ichoice + 1 + if ichoice > a:0 + if !exists("g:netrw_quiet") + call netrw#ErrorMsg(s:ERROR,"Unbalanced string in filename '". wholechoice ."'",3) + endif +" call Dret("netrw#NetRead :2 getcwd<".getcwd().">") + return + endif + let choice= a:{ichoice} + endwhile + let choice= strpart(wholechoice,1,strlen(wholechoice)-1) . " " . strpart(choice,0,strlen(choice)-1) + endif + endif + endif + +" call Decho("choice<" . choice . ">") + let ichoice= ichoice + 1 + + " Determine method of read (ftp, rcp, etc) {{{3 + call s:NetrwMethod(choice) + if !exists("b:netrw_method") || b:netrw_method < 0 +" call Dfunc("netrw#NetRead : unsupported method") + return + endif + let tmpfile= s:GetTempfile(b:netrw_fname) " apply correct suffix + + " Check if NetrwBrowse() should be handling this request +" call Decho("checking if NetrwBrowse() should handle choice<".choice."> with netrw_list_cmd<".g:netrw_list_cmd.">") + if choice =~ "^.*[\/]$" && b:netrw_method != 5 && choice !~ '^http://' +" call Decho("yes, choice matches '^.*[\/]$'") + keepjumps call s:NetrwBrowse(0,choice) +" call Dret("netrw#NetRead :3 getcwd<".getcwd().">") + return + endif + + " ============ + " Perform Protocol-Based Read {{{3 + " =========================== + if exists("g:netrw_silent") && g:netrw_silent == 0 && &ch >= 1 + echo "(netrw) Processing your read request..." + endif + + "......................................... + " rcp: NetRead Method #1 {{{3 + if b:netrw_method == 1 " read with rcp +" call Decho("read via rcp (method #1)") + " ER: nothing done with g:netrw_uid yet? + " ER: on Win2K" rcp machine[.user]:file tmpfile + " ER: if machine contains '.' adding .user is required (use $USERNAME) + " ER: the tmpfile is full path: rcp sees C:\... as host C + if s:netrw_has_nt_rcp == 1 + if exists("g:netrw_uid") && ( g:netrw_uid != "" ) + let uid_machine = g:netrw_machine .'.'. g:netrw_uid + else + " Any way needed it machine contains a '.' + let uid_machine = g:netrw_machine .'.'. $USERNAME + endif + else + if exists("g:netrw_uid") && ( g:netrw_uid != "" ) + let uid_machine = g:netrw_uid .'@'. g:netrw_machine + else + let uid_machine = g:netrw_machine + endif + endif +" call Decho("executing: !".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".shellescape(uid_machine.":".b:netrw_fname,1)." ".shellescape(tmpfile,1)) + exe s:netrw_silentxfer."!".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".shellescape(uid_machine.":".b:netrw_fname,1)." ".shellescape(tmpfile,1) + let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method) + let b:netrw_lastfile = choice + + "......................................... + " ftp + <.netrc>: NetRead Method #2 {{{3 + elseif b:netrw_method == 2 " read with ftp + <.netrc> +" call Decho("read via ftp+.netrc (method #2)") + let netrw_fname= b:netrw_fname + call s:SaveBufVars()|new|call s:RestoreBufVars() + let filtbuf= bufnr("%") + setlocal ff=unix + put =g:netrw_ftpmode +" call Decho("filter input: ".getline(line("$"))) + if exists("g:netrw_ftpextracmd") + put =g:netrw_ftpextracmd +" call Decho("filter input: ".getline(line("$"))) + endif + call setline(line("$")+1,'get "'.netrw_fname.'" '.tmpfile) +" call Decho("filter input: ".getline(line("$"))) + if exists("g:netrw_port") && g:netrw_port != "" +" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine." ".g:netrw_port,1)) + exe s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine." ".g:netrw_port,1) + else +" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)) + exe s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1) + endif + " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar) + if getline(1) !~ "^$" && !exists("g:netrw_quiet") && getline(1) !~ '^Trying ' + let debugkeep = &debug + setlocal debug=msg + call netrw#ErrorMsg(s:ERROR,getline(1),4) + let &debug = debugkeep + endif + call s:SaveBufVars() + bd! + if bufname("%") == "" && getline("$") == "" && line('$') == 1 + " needed when one sources a file in a nolbl setting window via ftp + q! + endif + call s:RestoreBufVars() + let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method) + let b:netrw_lastfile = choice + + "......................................... + " ftp + machine,id,passwd,filename: NetRead Method #3 {{{3 + elseif b:netrw_method == 3 " read with ftp + machine, id, passwd, and fname + " Construct execution string (four lines) which will be passed through filter +" call Decho("read via ftp+mipf (method #3)") + let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape) + call s:SaveBufVars()|new|call s:RestoreBufVars() + let filtbuf= bufnr("%") + setlocal ff=unix + if exists("g:netrw_port") && g:netrw_port != "" + put ='open '.g:netrw_machine.' '.g:netrw_port +" call Decho("filter input: ".getline('.')) + else + put ='open '.g:netrw_machine +" call Decho("filter input: ".getline('.')) + endif + + if exists("g:netrw_ftp") && g:netrw_ftp == 1 + put =g:netrw_uid +" call Decho("filter input: ".getline('.')) + put ='\"'.s:netrw_passwd.'\"' +" call Decho("filter input: ".getline('.')) + else + put ='user \"'.g:netrw_uid.'\" \"'.s:netrw_passwd.'\"' +" call Decho("filter input: ".getline('.')) + endif + + if exists("g:netrw_ftpmode") && g:netrw_ftpmode != "" + put =g:netrw_ftpmode +" call Decho("filter input: ".getline('.')) + endif + if exists("g:netrw_ftpextracmd") + put =g:netrw_ftpextracmd +" call Decho("filter input: ".getline('.')) + endif + put ='get \"'.netrw_fname.'\" '.tmpfile +" call Decho("filter input: ".getline('.')) + + " perform ftp: + " -i : turns off interactive prompting from ftp + " -n unix : DON'T use <.netrc>, even though it exists + " -n win32: quit being obnoxious about password + norm! 1Gdd +" call Decho("executing: %!".g:netrw_ftp_cmd." -i -n") + exe s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i -n" + " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar) + if getline(1) !~ "^$" +" call Decho("error<".getline(1).">") + if !exists("g:netrw_quiet") + call netrw#ErrorMsg(s:ERROR,getline(1),5) + endif + endif + call s:SaveBufVars()|bd!|call s:RestoreBufVars() + let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method) + let b:netrw_lastfile = choice + + "......................................... + " scp: NetRead Method #4 {{{3 + elseif b:netrw_method == 4 " read with scp +" call Decho("read via scp (method #4)") + if exists("g:netrw_port") && g:netrw_port != "" + let useport= " ".g:netrw_scpport." ".g:netrw_port + else + let useport= "" + endif +" call Decho("exe s:netrw_silentxfer.!".g:netrw_scp_cmd.useport." ".shellescape(g:netrw_machine.":".b:netrw_fname,1)." ".shellescape(tmpfile,1)) + exe s:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".shellescape(g:netrw_machine.":".b:netrw_fname,1)." ".shellescape(tmpfile,1) + let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method) + let b:netrw_lastfile = choice + + "......................................... + " http: NetRead Method #5 (wget) {{{3 + elseif b:netrw_method == 5 +" call Decho("read via http (method #5)") + if g:netrw_http_cmd == "" + if !exists("g:netrw_quiet") + call netrw#ErrorMsg(s:ERROR,"neither the wget nor the fetch command is available",6) + endif +" call Dret("netrw#NetRead :4 getcwd<".getcwd().">") + return + endif + + if match(b:netrw_fname,"#") == -1 || exists("g:netrw_http_xcmd") + " using g:netrw_http_cmd (usually elinks, links, curl, wget, or fetch) +" call Decho('using '.g:netrw_http_cmd.' (# not in b:netrw_fname<'.b:netrw_fname.">)") + if exists("g:netrw_http_xcmd") +" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_http_cmd." ".shellescape("http://".g:netrw_machine.b:netrw_fname,1)." ".g:netrw_http_xcmd." ".shellescape(tmpfile,1)) + exe s:netrw_silentxfer."!".g:netrw_http_cmd." ".shellescape("http://".g:netrw_machine.b:netrw_fname,1)." ".g:netrw_http_xcmd." ".shellescape(tmpfile,1) + else +" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_http_cmd." ".shellescape(tmpfile,1)." ".shellescape("http://".g:netrw_machine.b:netrw_fname,1)) + exe s:netrw_silentxfer."!".g:netrw_http_cmd." ".shellescape(tmpfile,1)." ".shellescape("http://".g:netrw_machine.b:netrw_fname,1) + endif + let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method) + + else + " wget/curl/fetch plus a jump to an in-page marker (ie. http://abc/def.html#aMarker) +" call Decho(("wget/curl plus jump (# in b:netrw_fname<".b:netrw_fname.">)") + let netrw_html= substitute(b:netrw_fname,"#.*$","","") + let netrw_tag = substitute(b:netrw_fname,"^.*#","","") +" call Decho("netrw_html<".netrw_html.">") +" call Decho("netrw_tag <".netrw_tag.">") +" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_http_cmd." ".shellescape(tmpfile,1)." ".shellescape("http://".g:netrw_machine.netrw_html,1)) + exe s:netrw_silentxfer."!".g:netrw_http_cmd." ".shellescape(tmpfile,1)." ".shellescape("http://".g:netrw_machine.netrw_html,1) + let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method) +" call Decho('<\s*a\s*name=\s*"'.netrw_tag.'"/') + exe 'norm! 1G/<\s*a\s*name=\s*"'.netrw_tag.'"/'."\<CR>" + endif + let b:netrw_lastfile = choice + setlocal ro + + "......................................... + " cadaver: NetRead Method #6 {{{3 + elseif b:netrw_method == 6 +" call Decho("read via cadaver (method #6)") + + " Construct execution string (four lines) which will be passed through filter + let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape) + new + setlocal ff=unix + if exists("g:netrw_port") && g:netrw_port != "" + put ='open '.g:netrw_machine.' '.g:netrw_port + else + put ='open '.g:netrw_machine + endif + put ='user '.g:netrw_uid.' '.s:netrw_passwd + put ='get '.netrw_fname.' '.tmpfile + put ='quit' + + " perform cadaver operation: + norm! 1Gdd +" call Decho("executing: %!".g:netrw_dav_cmd) + exe s:netrw_silentxfer."%!".g:netrw_dav_cmd + bd! + let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method) + let b:netrw_lastfile = choice + + "......................................... + " rsync: NetRead Method #7 {{{3 + elseif b:netrw_method == 7 +" call Decho("read via rsync (method #7)") +" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_rsync_cmd." ".shellescape(g:netrw_machine.":".b:netrw_fname,1)." ".shellescape(tmpfile,1)) + exe s:netrw_silentxfer."!".g:netrw_rsync_cmd." ".shellescape(g:netrw_machine.":".b:netrw_fname,1)." ".shellescape(tmpfile,1) + let result = s:NetrwGetFile(readcmd,tmpfile, b:netrw_method) + let b:netrw_lastfile = choice + + "......................................... + " fetch: NetRead Method #8 {{{3 + " fetch://[user@]host[:http]/path + elseif b:netrw_method == 8 +" call Decho("read via fetch (method #8)") + if g:netrw_fetch_cmd == "" + if !exists("g:netrw_quiet") + call netrw#ErrorMsg(s:ERROR,"fetch command not available",7) + endif +" call Dret("NetRead") + endif + if exists("g:netrw_option") && g:netrw_option == ":http" + let netrw_option= "http" + else + let netrw_option= "ftp" + endif +" call Decho("read via fetch for ".netrw_option) + + if exists("g:netrw_uid") && g:netrw_uid != "" && exists("s:netrw_passwd") && s:netrw_passwd != "" +" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_fetch_cmd." ".shellescape(tmpfile,1)." ".shellescape(netrw_option."://".g:netrw_uid.':'.s:netrw_passwd.'@'.g:netrw_machine."/".b:netrw_fname,1)) + exe s:netrw_silentxfer."!".g:netrw_fetch_cmd." ".shellescape(tmpfile,1)." ".shellescape(netrw_option."://".g:netrw_uid.':'.s:netrw_passwd.'@'.g:netrw_machine."/".b:netrw_fname,1) + else +" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_fetch_cmd." ".shellescape(tmpfile,1)." ".shellescape(netrw_option."://".g:netrw_machine."/".b:netrw_fname,1)) + exe s:netrw_silentxfer."!".g:netrw_fetch_cmd." ".shellescape(tmpfile,1)." ".shellescape(netrw_option."://".g:netrw_machine."/".b:netrw_fname,1) + endif + + let result = s:NetrwGetFile(readcmd,tmpfile, b:netrw_method) + let b:netrw_lastfile = choice + setlocal ro + + "......................................... + " sftp: NetRead Method #9 {{{3 + elseif b:netrw_method == 9 +" call Decho("read via sftp (method #9)") +" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_sftp_cmd." ".shellescape(g:netrw_machine.":".b:netrw_fname,1)." ".tmpfile) + exe s:netrw_silentxfer."!".g:netrw_sftp_cmd." ".shellescape(g:netrw_machine.":".b:netrw_fname,1)." ".tmpfile + let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method) + let b:netrw_lastfile = choice + + "......................................... + " Complain {{{3 + else + call netrw#ErrorMsg(s:WARNING,"unable to comply with your request<" . choice . ">",8) + endif + endwhile + + " cleanup {{{3 + if exists("b:netrw_method") +" call Decho("cleanup b:netrw_method and b:netrw_fname") + unlet b:netrw_method + unlet b:netrw_fname + endif + if s:FileReadable(tmpfile) && tmpfile !~ '.tar.bz2$' && tmpfile !~ '.tar.gz$' && tmpfile !~ '.zip' && tmpfile !~ '.tar' && readcmd != 't' +" call Decho("cleanup by deleting tmpfile<".tmpfile.">") + call s:NetrwDelete(fnameescape(tmpfile)) + endif + call s:NetrwOptionRestore("w:") + +" call Dret("netrw#NetRead :5 getcwd<".getcwd().">") +endfun + +" ------------------------------------------------------------------------ +" netrw#NetWrite: responsible for writing a file over the net {{{2 +fun! netrw#NetWrite(...) range +" call Dfunc("netrw#NetWrite(a:0=".a:0.") ".g:loaded_netrw) + + " option handling + let mod= 0 + call s:NetrwOptionSave("w:") + call s:NetrwSafeOptions() + + " Get Temporary Filename {{{3 + let tmpfile= s:GetTempfile("") + if tmpfile == "" +" call Dret("netrw#NetWrite : unable to get a tempfile!") + return + endif + + if a:0 == 0 + let ichoice = 0 + else + let ichoice = 1 + endif + + let curbufname= expand("%") +" call Decho("curbufname<".curbufname.">") + if &binary + " For binary writes, always write entire file. + " (line numbers don't really make sense for that). + " Also supports the writing of tar and zip files. +" call Decho("(write entire file) silent exe w! ".fnameescape(v:cmdarg)." ".fnameescape(tmpfile)) + silent exe "w! ".fnameescape(v:cmdarg)." ".fnameescape(tmpfile) + elseif g:netrw_cygwin + " write (selected portion of) file to temporary + let cygtmpfile= substitute(tmpfile,'/cygdrive/\(.\)','\1:','') +" call Decho("(write selected portion) silent exe ".a:firstline."," . a:lastline . "w! ".fnameescape(v:cmdarg)." ".fnameescape(cygtmpfile)) + silent exe a:firstline."," . a:lastline . "w! ".fnameescape(v:cmdarg)." ".fnameescape(cygtmpfile) + else + " write (selected portion of) file to temporary +" call Decho("(write selected portion) silent exe ".a:firstline."," . a:lastline . "w! ".fnameescape(v:cmdarg)." ".fnameescape(tmpfile)) + silent exe a:firstline."," . a:lastline . "w! ".fnameescape(v:cmdarg)." ".fnameescape(tmpfile) + endif + + if curbufname == "" + " if the file is [No Name], and one attempts to Nwrite it, the buffer takes + " on the temporary file's name. Deletion of the temporary file during + " cleanup then causes an error message. + 0file! + endif + + " While choice loop: {{{3 + while ichoice <= a:0 + + " Process arguments: {{{4 + " attempt to repeat with previous host-file-etc + if exists("b:netrw_lastfile") && a:0 == 0 +" call Decho("using b:netrw_lastfile<" . b:netrw_lastfile . ">") + let choice = b:netrw_lastfile + let ichoice= ichoice + 1 + else + exe "let choice= a:" . ichoice + + " Reconstruct Choice if choice starts with '"' + if match(choice,"?") == 0 + echomsg 'NetWrite Usage:"' + echomsg ':Nwrite machine:path uses rcp' + echomsg ':Nwrite "machine path" uses ftp with <.netrc>' + echomsg ':Nwrite "machine id password path" uses ftp' + echomsg ':Nwrite dav://[user@]machine/path uses cadaver' + echomsg ':Nwrite fetch://[user@]machine/path uses fetch' + echomsg ':Nwrite ftp://machine[#port]/path uses ftp (autodetects <.netrc>)' + echomsg ':Nwrite rcp://machine/path uses rcp' + echomsg ':Nwrite rsync://[user@]machine/path uses rsync' + echomsg ':Nwrite scp://[user@]machine[[:#]port]/path uses scp' + echomsg ':Nwrite sftp://[user@]machine/path uses sftp' + sleep 4 + break + + elseif match(choice,"^\"") != -1 + if match(choice,"\"$") != -1 + " case "..." + let choice=strpart(choice,1,strlen(choice)-2) + else + " case "... ... ..." + let choice = strpart(choice,1,strlen(choice)-1) + let wholechoice = "" + + while match(choice,"\"$") == -1 + let wholechoice= wholechoice . " " . choice + let ichoice = ichoice + 1 + if choice > a:0 + if !exists("g:netrw_quiet") + call netrw#ErrorMsg(s:ERROR,"Unbalanced string in filename '". wholechoice ."'",13) + endif +" call Dret("netrw#NetWrite") + return + endif + let choice= a:{ichoice} + endwhile + let choice= strpart(wholechoice,1,strlen(wholechoice)-1) . " " . strpart(choice,0,strlen(choice)-1) + endif + endif + endif + let ichoice= ichoice + 1 +" call Decho("choice<" . choice . "> ichoice=".ichoice) + + " Determine method of write (ftp, rcp, etc) {{{4 + call s:NetrwMethod(choice) + if !exists("b:netrw_method") || b:netrw_method < 0 +" call Dfunc("netrw#NetWrite : unsupported method") + return + endif + + " ============= + " Perform Protocol-Based Write {{{4 + " ============================ + if exists("g:netrw_silent") && g:netrw_silent == 0 && &ch >= 1 + echo "(netrw) Processing your write request..." +" call Decho("(netrw) Processing your write request...") + endif + + "......................................... + " rcp: NetWrite Method #1 {{{4 + if b:netrw_method == 1 +" call Decho("write via rcp (method #1)") + if s:netrw_has_nt_rcp == 1 + if exists("g:netrw_uid") && ( g:netrw_uid != "" ) + let uid_machine = g:netrw_machine .'.'. g:netrw_uid + else + let uid_machine = g:netrw_machine .'.'. $USERNAME + endif + else + if exists("g:netrw_uid") && ( g:netrw_uid != "" ) + let uid_machine = g:netrw_uid .'@'. g:netrw_machine + else + let uid_machine = g:netrw_machine + endif + endif +" call Decho("executing: !".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".shellescape(tmpfile,1)." ".shellescape(uid_machine.":".b:netrw_fname,1)) + exe s:netrw_silentxfer."!".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".shellescape(tmpfile,1)." ".shellescape(uid_machine.":".b:netrw_fname,1) + let b:netrw_lastfile = choice + + "......................................... + " ftp + <.netrc>: NetWrite Method #2 {{{4 + elseif b:netrw_method == 2 +" call Decho("write via ftp+.netrc (method #2)") + let netrw_fname= b:netrw_fname + new +" call Decho("filter input window#".winnr()) + setlocal ff=unix + put =g:netrw_ftpmode +" call Decho("filter input: ".getline('$')) + if exists("g:netrw_ftpextracmd") + put =g:netrw_ftpextracmd +" call Decho("filter input: ".getline("$")) + endif + call setline(line("$")+1,'put "'.tmpfile.'" "'.netrw_fname.'"') +" call Decho("filter input: ".getline("$")) + if exists("g:netrw_port") && g:netrw_port != "" +" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1)) + exe s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1) + else +" call Decho("filter input window#".winnr()) +" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)) + exe s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1) + endif + " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar) + if getline(1) !~ "^$" + if !exists("g:netrw_quiet") + call netrw#ErrorMsg(s:ERROR,getline(1),14) + endif + let mod=1 + endif + bd! + let b:netrw_lastfile = choice + + "......................................... + " ftp + machine, id, passwd, filename: NetWrite Method #3 {{{4 + elseif b:netrw_method == 3 + " Construct execution string (four lines) which will be passed through filter +" call Decho("read via ftp+mipf (method #3)") + let netrw_fname= b:netrw_fname + new + setlocal ff=unix + if exists("g:netrw_port") && g:netrw_port != "" + put ='open '.g:netrw_machine.' '.g:netrw_port +" call Decho("filter input: ".getline('.')) + else + put ='open '.g:netrw_machine +" call Decho("filter input: ".getline('.')) + endif + if exists("g:netrw_ftp") && g:netrw_ftp == 1 + put =g:netrw_uid +" call Decho("filter input: ".getline('.')) + put ='\"'.s:netrw_passwd.'\"' +" call Decho("filter input: ".getline('.')) + else + put ='user \"'.g:netrw_uid.'\" \"'.s:netrw_passwd.'\"' +" call Decho("filter input: ".getline('.')) + endif + put ='put \"'.tmpfile.'\" \"'.netrw_fname.'\"' +" call Decho("filter input: ".getline('.')) + " save choice/id/password for future use + let b:netrw_lastfile = choice + + " perform ftp: + " -i : turns off interactive prompting from ftp + " -n unix : DON'T use <.netrc>, even though it exists + " -n win32: quit being obnoxious about password + norm! 1Gdd +" call Decho("executing: %!".g:netrw_ftp_cmd." -i -n") + exe s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i -n" + " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar) + if getline(1) !~ "^$" + if !exists("g:netrw_quiet") + call netrw#ErrorMsg(s:ERROR,getline(1),15) + endif + let mod=1 + endif + bd! + + "......................................... + " scp: NetWrite Method #4 {{{4 + elseif b:netrw_method == 4 +" call Decho("write via scp (method #4)") + if exists("g:netrw_port") && g:netrw_port != "" + let useport= " ".g:netrw_scpport." ".fnameescape(g:netrw_port) + else + let useport= "" + endif +" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".shellescape(tmpfile,1)." ".shellescape(g:netrw_machine.":".b:netrw_fname,1)) + exe s:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".shellescape(tmpfile,1)." ".shellescape(g:netrw_machine.":".b:netrw_fname,1) + let b:netrw_lastfile = choice + + "......................................... + " http: NetWrite Method #5 {{{4 + elseif b:netrw_method == 5 +" call Decho("write via http (method #5)") + if !exists("g:netrw_quiet") + call netrw#ErrorMsg(s:ERROR,"currently <netrw.vim> does not support writing using http:",16) + endif + + "......................................... + " dav: NetWrite Method #6 (cadaver) {{{4 + elseif b:netrw_method == 6 +" call Decho("write via cadaver (method #6)") + + " Construct execution string (four lines) which will be passed through filter + let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape) + new + setlocal ff=unix + if exists("g:netrw_port") && g:netrw_port != "" + put ='open '.g:netrw_machine.' '.g:netrw_port + else + put ='open '.g:netrw_machine + endif + if exists("g:netrw_uid") && exists("s:netrw_passwd") + put ='user '.g:netrw_uid.' '.s:netrw_passwd + endif + put ='put '.tmpfile.' '.netrw_fname + + " perform cadaver operation: + norm! 1Gdd +" call Decho("executing: %!".g:netrw_dav_cmd) + exe s:netrw_silentxfer."%!".g:netrw_dav_cmd + bd! + let b:netrw_lastfile = choice + + "......................................... + " rsync: NetWrite Method #7 {{{4 + elseif b:netrw_method == 7 +" call Decho("write via rsync (method #7)") +" call Decho("executing: !".g:netrw_rsync_cmd." ".shellescape(tmpfile,1)." ".shellescape(g:netrw_machine.":".b:netrw_fname,1)) + exe s:netrw_silentxfer."!".g:netrw_rsync_cmd." ".shellescape(tmpfile,1)." ".shellescape(g:netrw_machine.":".b:netrw_fname,1) + let b:netrw_lastfile = choice + + "......................................... + " sftp: NetWrite Method #9 {{{4 + elseif b:netrw_method == 9 +" call Decho("read via sftp (method #9)") + let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape) + if exists("g:netrw_uid") && ( g:netrw_uid != "" ) + let uid_machine = g:netrw_uid .'@'. g:netrw_machine + else + let uid_machine = g:netrw_machine + endif + new + setlocal ff=unix + put ='put \"'.escape(tmpfile,'\').'\" '.netrw_fname +" call Decho("filter input: ".getline('.')) + norm! 1Gdd +" call Decho("executing: %!".g:netrw_sftp_cmd.' '.shellescape(uid_machine,1)) + exe s:netrw_silentxfer."%!".g:netrw_sftp_cmd.' '.shellescape(uid_machine,1) + bd! + let b:netrw_lastfile= choice + + "......................................... + " Complain {{{4 + else + call netrw#ErrorMsg(s:WARNING,"unable to comply with your request<" . choice . ">",17) + endif + endwhile + + " Cleanup: {{{3 +" call Decho("cleanup") + if s:FileReadable(tmpfile) +" call Decho("tmpfile<".tmpfile."> readable, will now delete it") + call s:NetrwDelete(tmpfile) + endif + call s:NetrwOptionRestore("w:") + + if a:firstline == 1 && a:lastline == line("$") + " restore modifiability; usually equivalent to set nomod + let &mod= mod + endif + +" call Dret("netrw#NetWrite") +endfun + +" --------------------------------------------------------------------- +" netrw#NetSource: source a remotely hosted vim script {{{2 +" uses NetRead to get a copy of the file into a temporarily file, +" then sources that file, +" then removes that file. +fun! netrw#NetSource(...) +" call Dfunc("netrw#NetSource() a:0=".a:0) + if a:0 > 0 && a:1 == '?' + " give help + echomsg 'NetSource Usage:' + echomsg ':Nsource dav://machine[:port]/path uses cadaver' + echomsg ':Nsource fetch://machine/path uses fetch' + echomsg ':Nsource ftp://[user@]machine[:port]/path uses ftp autodetects <.netrc>' + echomsg ':Nsource http://[user@]machine/path uses http wget' + echomsg ':Nsource rcp://[user@]machine/path uses rcp' + echomsg ':Nsource rsync://machine[:port]/path uses rsync' + echomsg ':Nsource scp://[user@]machine[[:#]port]/path uses scp' + echomsg ':Nsource sftp://[user@]machine[[:#]port]/path uses sftp' + sleep 4 + else + let i= 1 + while i <= a:0 + call netrw#NetRead(3,a:{i}) +" call Decho("(netrw#NetSource) s:netread_tmpfile<".s:netrw_tmpfile.">") + if s:FileReadable(s:netrw_tmpfile) +" call Decho("(netrw#NetSource) exe so ".fnameescape(s:netrw_tmpfile)) + exe "so ".fnameescape(s:netrw_tmpfile) +" call Decho("(netrw#NetSource) delete(".s:netrw_tmpfile.")") + call delete(s:netrw_tmpfile) + unlet s:netrw_tmpfile + else + call netrw#ErrorMsg(s:ERROR,"unable to source <".a:{i}.">!",48) + endif + let i= i + 1 + endwhile + endif +" call Dret("netrw#NetSource") +endfun + +" =========================================== +" s:NetrwGetFile: Function to read temporary file "tfile" with command "readcmd". {{{2 +" readcmd == %r : replace buffer with newly read file +" == 0r : read file at top of buffer +" == r : read file after current line +" == t : leave file in temporary form (ie. don't read into buffer) +fun! s:NetrwGetFile(readcmd, tfile, method) +" call Dfunc("NetrwGetFile(readcmd<".a:readcmd.">,tfile<".a:tfile."> method<".a:method.">)") + + " readcmd=='t': simply do nothing + if a:readcmd == 't' +" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap) +" call Dret("NetrwGetFile : skip read of <".a:tfile.">") + return + endif + + " get name of remote filename (ie. url and all) + let rfile= bufname("%") +" call Decho("rfile<".rfile.">") + + if exists("*NetReadFixup") + " for the use of NetReadFixup (not otherwise used internally) + let line2= line("$") + endif + + if a:readcmd[0] == '%' + " get file into buffer +" call Decho("get file into buffer") + + " rename the current buffer to the temp file (ie. tfile) + if g:netrw_cygwin + let tfile= substitute(a:tfile,'/cygdrive/\(.\)','\1:','') + else + let tfile= a:tfile + endif +" call Decho("exe silent! keepalt file ".fnameescape(tfile)) + exe "silent! keepalt file ".fnameescape(tfile) + + " edit temporary file (ie. read the temporary file in) + if rfile =~ '\.zip$' +" call Decho("handling remote zip file with zip#Browse(tfile<".tfile.">)") + call zip#Browse(tfile) + elseif rfile =~ '\.tar$' +" call Decho("handling remote tar file with tar#Browse(tfile<".tfile.">)") + call tar#Browse(tfile) + elseif rfile =~ '\.tar\.gz' +" call Decho("handling remote gzip-compressed tar file") + call tar#Browse(tfile) + elseif rfile =~ '\.tar\.bz2' +" call Decho("handling remote bz2-compressed tar file") + call tar#Browse(tfile) + else +" call Decho("edit temporary file") + e! + endif + + " rename buffer back to remote filename +" call Decho("exe silent! keepalt file ".fnameescape(rfile)) + exe "silent! keepalt file ".fnameescape(rfile) + if a:method == 5 + set ft=html + else + filetype detect + endif +" call Dredir("renamed buffer back to remote filename<".rfile."> : expand(%)<".expand("%").">","ls!") + let line1 = 1 + let line2 = line("$") + + elseif s:FileReadable(a:tfile) + " read file after current line +" call Decho("read file<".a:tfile."> after current line") + let curline = line(".") + let lastline= line("$") +" call Decho("exe<".a:readcmd." ".fnameescape(v:cmdarg)." ".fnameescape(a:tfile)."> line#".curline) + exe a:readcmd." ".fnameescape(v:cmdarg)." ".fnameescape(a:tfile) + let line1= curline + 1 + let line2= line("$") - lastline + 1 + + else + " not readable +" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap) +" call Decho("tfile<".a:tfile."> not readable") + call netrw#ErrorMsg(s:WARNING,"file <".a:tfile."> not readable",9) +" call Dret("NetrwGetFile : tfile<".a:tfile."> not readable") + return + endif + + " User-provided (ie. optional) fix-it-up command + if exists("*NetReadFixup") +" call Decho("calling NetReadFixup(method<".a:method."> line1=".line1." line2=".line2.")") + call NetReadFixup(a:method, line1, line2) +" else " Decho +" call Decho("NetReadFixup() not called, doesn't exist (line1=".line1." line2=".line2.")") + endif + + if has("gui") && has("menu") && has("gui_running") && &go =~ 'm' + " update the Buffers menu + call s:UpdateBuffersMenu() + endif + +" call Decho("readcmd<".a:readcmd."> cmdarg<".v:cmdarg."> tfile<".a:tfile."> readable=".s:FileReadable(a:tfile)) + + " make sure file is being displayed +" redraw! + +" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap) +" call Dret("NetrwGetFile") +endfun + +" ------------------------------------------------------------------------ +" s:NetrwMethod: determine method of transfer {{{2 +" Input: +" choice = url [protocol:]//[userid@]hostname[:port]/[path-to-file] +" Output: +" b:netrw_method= 1: rcp +" 2: ftp + <.netrc> +" 3: ftp + machine, id, password, and [path]filename +" 4: scp +" 5: http (wget) +" 6: cadaver +" 7: rsync +" 8: fetch +" 9: sftp +" g:netrw_machine= hostname +" b:netrw_fname = filename +" g:netrw_port = optional port number (for ftp) +" g:netrw_choice = copy of input url (choice) +fun! s:NetrwMethod(choice) +" call Dfunc("NetrwMethod(a:choice<".a:choice.">)") + + " record current g:netrw_machine, if any + " curmachine used if protocol == ftp and no .netrc + if exists("g:netrw_machine") + let curmachine= g:netrw_machine +" call Decho("curmachine<".curmachine.">") + else + let curmachine= "N O T A HOST" + endif + + " initialization + let b:netrw_method = 0 + let g:netrw_machine = "" + let b:netrw_fname = "" + let g:netrw_port = "" + let g:netrw_choice = a:choice + + " Patterns: + " mipf : a:machine a:id password filename Use ftp + " mf : a:machine filename Use ftp + <.netrc> or g:netrw_uid s:netrw_passwd + " ftpurm : ftp://[user@]host[[#:]port]/filename Use ftp + <.netrc> or g:netrw_uid s:netrw_passwd + " rcpurm : rcp://[user@]host/filename Use rcp + " rcphf : [user@]host:filename Use rcp + " scpurm : scp://[user@]host[[#:]port]/filename Use scp + " httpurm : http://[user@]host/filename Use wget + " davurm : dav[s]://host[:port]/path Use cadaver + " rsyncurm : rsync://host[:port]/path Use rsync + " fetchurm : fetch://[user@]host[:http]/filename Use fetch (defaults to ftp, override for http) + " sftpurm : sftp://[user@]host/filename Use scp + let mipf = '^\(\S\+\)\s\+\(\S\+\)\s\+\(\S\+\)\s\+\(\S\+\)$' + let mf = '^\(\S\+\)\s\+\(\S\+\)$' + let ftpurm = '^ftp://\(\([^/@]\{-}\)@\)\=\([^/#:]\{-}\)\([#:]\d\+\)\=/\(.*\)$' + let rcpurm = '^rcp://\%(\([^/@]\{-}\)@\)\=\([^/]\{-}\)/\(.*\)$' + let rcphf = '^\(\(\h\w*\)@\)\=\(\h\w*\):\([^@]\+\)$' + let scpurm = '^scp://\([^/#:]\+\)\%([#:]\(\d\+\)\)\=/\(.*\)$' + let httpurm = '^http://\([^/]\{-}\)\(/.*\)\=$' + let davurm = '^davs\=://\([^/]\+\)/\(.*/\)\([-_.~[:alnum:]]\+\)$' + let rsyncurm = '^rsync://\([^/]\{-}\)/\(.*\)\=$' + let fetchurm = '^fetch://\(\([^/@]\{-}\)@\)\=\([^/#:]\{-}\)\(:http\)\=/\(.*\)$' + let sftpurm = '^sftp://\([^/]\{-}\)/\(.*\)\=$' + +" call Decho("determine method:") + " Determine Method + " rcp://user@hostname/...path-to-file + if match(a:choice,rcpurm) == 0 +" call Decho("rcp://...") + let b:netrw_method = 1 + let userid = substitute(a:choice,rcpurm,'\1',"") + let g:netrw_machine = substitute(a:choice,rcpurm,'\2',"") + let b:netrw_fname = substitute(a:choice,rcpurm,'\3',"") + if userid != "" + let g:netrw_uid= userid + endif + + " scp://user@hostname/...path-to-file + elseif match(a:choice,scpurm) == 0 +" call Decho("scp://...") + let b:netrw_method = 4 + let g:netrw_machine = substitute(a:choice,scpurm,'\1',"") + let g:netrw_port = substitute(a:choice,scpurm,'\2',"") + let b:netrw_fname = substitute(a:choice,scpurm,'\3',"") + + " http://user@hostname/...path-to-file + elseif match(a:choice,httpurm) == 0 +" call Decho("http://...") + let b:netrw_method = 5 + let g:netrw_machine= substitute(a:choice,httpurm,'\1',"") + let b:netrw_fname = substitute(a:choice,httpurm,'\2',"") + + " dav://hostname[:port]/..path-to-file.. + elseif match(a:choice,davurm) == 0 +" call Decho("dav://...") + let b:netrw_method= 6 + if a:choice =~ '^s' + let g:netrw_machine= 'https://'.substitute(a:choice,davurm,'\1/\2',"") + else + let g:netrw_machine= 'http://'.substitute(a:choice,davurm,'\1/\2',"") + endif + let b:netrw_fname = substitute(a:choice,davurm,'\3',"") + + " rsync://user@hostname/...path-to-file + elseif match(a:choice,rsyncurm) == 0 +" call Decho("rsync://...") + let b:netrw_method = 7 + let g:netrw_machine= substitute(a:choice,rsyncurm,'\1',"") + let b:netrw_fname = substitute(a:choice,rsyncurm,'\2',"") + + " ftp://[user@]hostname[[:#]port]/...path-to-file + elseif match(a:choice,ftpurm) == 0 +" call Decho("ftp://...") + let userid = substitute(a:choice,ftpurm,'\2',"") + let g:netrw_machine= substitute(a:choice,ftpurm,'\3',"") + let g:netrw_port = substitute(a:choice,ftpurm,'\4',"") + let b:netrw_fname = substitute(a:choice,ftpurm,'\5',"") +" call Decho("g:netrw_machine<".g:netrw_machine.">") + if userid != "" + let g:netrw_uid= userid + endif + if exists("s:netrw_passwd") && curmachine != g:netrw_machine + " if there's a change in hostname, require password re-entry + unlet s:netrw_passwd + endif + if exists("g:netrw_uid") && exists("s:netrw_passwd") + let b:netrw_method = 3 + else + if s:FileReadable(expand("$HOME/.netrc")) && !g:netrw_ignorenetrc + let b:netrw_method= 2 + else + if !exists("g:netrw_uid") || g:netrw_uid == "" + call NetUserPass() + elseif !exists("s:netrw_passwd") || s:netrw_passwd == "" + call NetUserPass(g:netrw_uid) + " else just use current g:netrw_uid and s:netrw_passwd + endif + let b:netrw_method= 3 + endif + endif + + elseif match(a:choice,fetchurm) == 0 +" call Decho("fetch://...") + let b:netrw_method = 8 + let g:netrw_userid = substitute(a:choice,fetchurm,'\2',"") + let g:netrw_machine= substitute(a:choice,fetchurm,'\3',"") + let b:netrw_option = substitute(a:choice,fetchurm,'\4',"") + let b:netrw_fname = substitute(a:choice,fetchurm,'\5',"") + + " Issue an ftp : "machine id password [path/]filename" + elseif match(a:choice,mipf) == 0 +" call Decho("(ftp) host id pass file") + let b:netrw_method = 3 + let g:netrw_machine = substitute(a:choice,mipf,'\1',"") + let g:netrw_uid = substitute(a:choice,mipf,'\2',"") + let s:netrw_passwd = substitute(a:choice,mipf,'\3',"") + let b:netrw_fname = substitute(a:choice,mipf,'\4',"") + + " Issue an ftp: "hostname [path/]filename" + elseif match(a:choice,mf) == 0 +" call Decho("(ftp) host file") + if exists("g:netrw_uid") && exists("s:netrw_passwd") + let b:netrw_method = 3 + let g:netrw_machine = substitute(a:choice,mf,'\1',"") + let b:netrw_fname = substitute(a:choice,mf,'\2',"") + + elseif s:FileReadable(expand("$HOME/.netrc")) + let b:netrw_method = 2 + let g:netrw_machine = substitute(a:choice,mf,'\1',"") + let b:netrw_fname = substitute(a:choice,mf,'\2',"") + endif + + " sftp://user@hostname/...path-to-file + elseif match(a:choice,sftpurm) == 0 +" call Decho("sftp://...") + let b:netrw_method = 9 + let g:netrw_machine= substitute(a:choice,sftpurm,'\1',"") + let b:netrw_fname = substitute(a:choice,sftpurm,'\2',"") + + " Issue an rcp: hostname:filename" (this one should be last) + elseif match(a:choice,rcphf) == 0 +" call Decho("(rcp) [user@]host:file) rcphf<".rcphf.">") + let b:netrw_method = 1 + let userid = substitute(a:choice,rcphf,'\2',"") + let g:netrw_machine = substitute(a:choice,rcphf,'\3',"") + let b:netrw_fname = substitute(a:choice,rcphf,'\4',"") +" call Decho('\1<'.substitute(a:choice,rcphf,'\1',"").">") +" call Decho('\2<'.substitute(a:choice,rcphf,'\2',"").">") +" call Decho('\3<'.substitute(a:choice,rcphf,'\3',"").">") +" call Decho('\4<'.substitute(a:choice,rcphf,'\4',"").">") + if userid != "" + let g:netrw_uid= userid + endif + + else + if !exists("g:netrw_quiet") + call netrw#ErrorMsg(s:WARNING,"cannot determine method (format: protocol://[user@]hostname[:port]/[path])",45) + endif + let b:netrw_method = -1 + endif + + " remove any leading [:#] from port number + if g:netrw_port != "" + let g:netrw_port = substitute(g:netrw_port,'[#:]\+','','') + endif + +" call Decho("a:choice <".a:choice.">") +" call Decho("b:netrw_method <".b:netrw_method.">") +" call Decho("g:netrw_machine<".g:netrw_machine.">") +" call Decho("g:netrw_port <".g:netrw_port.">") +" if exists("g:netrw_uid") "Decho +" call Decho("g:netrw_uid <".g:netrw_uid.">") +" endif "Decho +" if exists("s:netrw_passwd") "Decho +" call Decho("s:netrw_passwd <".s:netrw_passwd.">") +" endif "Decho +" call Decho("b:netrw_fname <".b:netrw_fname.">") +" call Dret("NetrwMethod : b:netrw_method=".b:netrw_method) +endfun + +" ------------------------------------------------------------------------ +" NetReadFixup: this sort of function is typically written by the user {{{2 +" to handle extra junk that their system's ftp dumps +" into the transfer. This function is provided as an +" example and as a fix for a Windows 95 problem: in my +" experience, win95's ftp always dumped four blank lines +" at the end of the transfer. +if has("win95") && exists("g:netrw_win95ftp") && g:netrw_win95ftp + fun! NetReadFixup(method, line1, line2) +" call Dfunc("NetReadFixup(method<".a:method."> line1=".a:line1." line2=".a:line2.")") + + " sanity checks -- attempt to convert inputs to integers + let method = a:method + 0 + let line1 = a:line1 + 0 + let line2 = a:line2 + 0 + if type(method) != 0 || type(line1) != 0 || type(line2) != 0 || method < 0 || line1 <= 0 || line2 <= 0 +" call Dret("NetReadFixup") + return + endif + + if method == 3 " ftp (no <.netrc>) + let fourblanklines= line2 - 3 + if fourblanklines >= line1 + exe "silent ".fourblanklines.",".line2."g/^\s*$/d" + endif + endif + +" call Dret("NetReadFixup") + endfun +endif + +" --------------------------------------------------------------------- +" NetUserPass: set username and password for subsequent ftp transfer {{{2 +" Usage: :call NetUserPass() -- will prompt for userid and password +" :call NetUserPass("uid") -- will prompt for password +" :call NetUserPass("uid","password") -- sets global userid and password +fun! NetUserPass(...) + + " get/set userid + if a:0 == 0 +" call Dfunc("NetUserPass(a:0<".a:0.">)") + if !exists("g:netrw_uid") || g:netrw_uid == "" + " via prompt + let g:netrw_uid= input('Enter username: ') + endif + else " from command line +" call Dfunc("NetUserPass(a:1<".a:1.">) {") + let g:netrw_uid= a:1 + endif + + " get password + if a:0 <= 1 " via prompt +" call Decho("a:0=".a:0." case <=1:") + let s:netrw_passwd= inputsecret("Enter Password: ") + else " from command line +" call Decho("a:0=".a:0." case >1: a:2<".a:2.">") + let s:netrw_passwd=a:2 + endif + +" call Dret("NetUserPass") +endfun + +" =========================================== +" Shared Browsing Support: {{{1 +" =========================================== + +" --------------------------------------------------------------------- +" s:BrowserMaps: {{{2 +fun! s:BrowserMaps(islocal) +" call Dfunc("s:BrowserMaps(islocal=".a:islocal.") b:netrw_curdir<".b:netrw_curdir.">") + if a:islocal +" call Decho("make local maps") + nnoremap <buffer> <silent> <cr> :call netrw#LocalBrowseCheck(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord()))<cr> + nnoremap <buffer> <silent> - :exe "norm! 0"<bar>call netrw#LocalBrowseCheck(<SID>NetrwBrowseChgDir(1,'../'))<cr> + nnoremap <buffer> <silent> a :call <SID>NetrwHide(1)<cr> + nnoremap <buffer> <silent> mb :<c-u>call <SID>NetrwBookmarkDir(0,b:netrw_curdir)<cr> + nnoremap <buffer> <silent> mc :<c-u>call <SID>NetrwMarkFileCopy(1)<cr> + nnoremap <buffer> <silent> md :<c-u>call <SID>NetrwMarkFileDiff(1)<cr> + nnoremap <buffer> <silent> me :<c-u>call <SID>NetrwMarkFileEdit(1)<cr> + nnoremap <buffer> <silent> mf :<c-u>call <SID>NetrwMarkFile(1,<SID>NetrwGetWord())<cr> + nnoremap <buffer> <silent> mg :<c-u>call <SID>NetrwMarkFileGrep(1)<cr> + nnoremap <buffer> <silent> mh :<c-u>call <SID>NetrwMarkHideSfx(1)<cr> + nnoremap <buffer> <silent> mm :<c-u>call <SID>NetrwMarkFileMove(1)<cr> + nnoremap <buffer> <silent> mp :<c-u>call <SID>NetrwMarkFilePrint(1)<cr> + nnoremap <buffer> <silent> mr :<c-u>call <SID>NetrwMarkFileRegexp(1)<cr> + nnoremap <buffer> <silent> ms :<c-u>call <SID>NetrwMarkFileSource(1)<cr> + nnoremap <buffer> <silent> mT :<c-u>call <SID>NetrwMarkFileTag(1)<cr> + nnoremap <buffer> <silent> mt :<c-u>call <SID>NetrwMarkFileTgt(1)<cr> + nnoremap <buffer> <silent> mu :<c-u>call <SID>NetrwUnMarkFile(1)<cr> + nnoremap <buffer> <silent> mx :<c-u>call <SID>NetrwMarkFileExe(1)<cr> + nnoremap <buffer> <silent> mz :<c-u>call <SID>NetrwMarkFileCompress(1)<cr> + nnoremap <buffer> <silent> gb :<c-u>call <SID>NetrwBookmarkDir(1,b:netrw_curdir)<cr> + nnoremap <buffer> <silent> gh :<c-u>call <SID>NetrwHidden(1)<cr> + nnoremap <buffer> <silent> c :exe "keepjumps lcd ".fnameescape(b:netrw_curdir)<cr> + nnoremap <buffer> <silent> C :let g:netrw_chgwin= winnr()<cr> + nnoremap <buffer> <silent> d :call <SID>NetrwMakeDir("")<cr> + nnoremap <buffer> <silent> i :call <SID>NetrwListStyle(1)<cr> + nnoremap <buffer> <silent> o :call <SID>NetrwSplit(3)<cr> + nnoremap <buffer> <silent> O :call <SID>NetrwObtain(1)<cr> + nnoremap <buffer> <silent> p :call <SID>NetrwPreview(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord(),1))<cr> + nnoremap <buffer> <silent> P :call <SID>NetrwPrevWinOpen(1)<cr> + nnoremap <buffer> <silent> qb :<c-u>call <SID>NetrwBookmarkDir(2,b:netrw_curdir)<cr> + nnoremap <buffer> <silent> mB :<c-u>call <SID>NetrwBookmarkDir(6,b:netrw_curdir)<cr> + nnoremap <buffer> <silent> qf :<c-u>call <SID>NetrwFileInfo(1,<SID>NetrwGetWord())<cr> + nnoremap <buffer> <silent> r :let g:netrw_sort_direction= (g:netrw_sort_direction =~ 'n')? 'r' : 'n'<bar>exe "norm! 0"<bar>call <SID>NetrwRefresh(1,<SID>NetrwBrowseChgDir(1,'./'))<cr> + nnoremap <buffer> <silent> s :call <SID>NetrwSortStyle(1)<cr> + nnoremap <buffer> <silent> S :call <SID>NetSortSequence(1)<cr> + nnoremap <buffer> <silent> t :call <SID>NetrwSplit(4)<cr> + nnoremap <buffer> <silent> u :<c-u>call <SID>NetrwBookmarkDir(4,expand("%"))<cr> + nnoremap <buffer> <silent> U :<c-u>call <SID>NetrwBookmarkDir(5,expand("%"))<cr> + nnoremap <buffer> <silent> v :call <SID>NetrwSplit(5)<cr> + nnoremap <buffer> <silent> x :call netrw#NetrwBrowseX(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord(),0),0)"<cr> + nnoremap <buffer> <silent> % :call <SID>NetrwOpenFile(1)<cr> + if !hasmapto('<Plug>NetrwHideEdit') + nmap <buffer> <unique> <c-h> <Plug>NetrwHideEdit + endif + nnoremap <buffer> <silent> <Plug>NetrwHideEdit :call <SID>NetrwHideEdit(1)<cr> + if !hasmapto('<Plug>NetrwRefresh') + nmap <buffer> <unique> <c-l> <Plug>NetrwRefresh + endif + nnoremap <buffer> <silent> <Plug>NetrwRefresh :call <SID>NetrwRefresh(1,<SID>NetrwBrowseChgDir(1,'./'))<cr> + if s:didstarstar || !mapcheck("<s-down>","n") + nnoremap <buffer> <silent> <s-down> :Nexplore<cr> + endif + if s:didstarstar || !mapcheck("<s-up>","n") + nnoremap <buffer> <silent> <s-up> :Pexplore<cr> + endif + let mapsafecurdir = escape(b:netrw_curdir, s:netrw_map_escape) + if g:netrw_mousemaps == 1 + nnoremap <buffer> <silent> <leftmouse> <leftmouse>:call <SID>NetrwLeftmouse(1)<cr> + nnoremap <buffer> <silent> <middlemouse> <leftmouse>:call <SID>NetrwPrevWinOpen(1)<cr> + nnoremap <buffer> <silent> <s-leftmouse> <leftmouse>:call <SID>NetrwMarkFile(1,<SID>NetrwGetWord())<cr> + exe 'nnoremap <buffer> <silent> <rightmouse> <leftmouse>:call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>' + exe 'vnoremap <buffer> <silent> <rightmouse> <leftmouse>:call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>' + endif + exe 'nnoremap <buffer> <silent> <del> :call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>' + exe 'vnoremap <buffer> <silent> <del> :call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>' + exe 'nnoremap <buffer> <silent> D :call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>' + exe 'vnoremap <buffer> <silent> D :call <SID>NetrwLocalRm("'.mapsafecurdir.'")<cr>' + exe 'nnoremap <buffer> <silent> R :call <SID>NetrwLocalRename("'.mapsafecurdir.'")<cr>' + exe 'vnoremap <buffer> <silent> R :call <SID>NetrwLocalRename("'.mapsafecurdir.'")<cr>' + exe 'nnoremap <buffer> <silent> <Leader>m :call <SID>NetrwMakeDir("")<cr>' + nnoremap <buffer> <F1> :he netrw-quickhelp<cr> + + else " remote +" call Decho("make remote maps") + call s:RemotePathAnalysis(b:netrw_curdir) + nnoremap <buffer> <silent> <cr> :call <SID>NetrwBrowse(0,<SID>NetrwBrowseChgDir(0,<SID>NetrwGetWord()))<cr> + nnoremap <buffer> <silent> <c-l> :call <SID>NetrwRefresh(0,<SID>NetrwBrowseChgDir(0,'./'))<cr> + nnoremap <buffer> <silent> - :exe "norm! 0"<bar>call <SID>NetrwBrowse(0,<SID>NetrwBrowseChgDir(0,'../'))<cr> + nnoremap <buffer> <silent> a :call <SID>NetrwHide(0)<cr> + nnoremap <buffer> <silent> mb :<c-u>call <SID>NetrwBookmarkDir(0,b:netrw_curdir)<cr> + nnoremap <buffer> <silent> mc :<c-u>call <SID>NetrwMarkFileCopy(0)<cr> + nnoremap <buffer> <silent> md :<c-u>call <SID>NetrwMarkFileDiff(0)<cr> + nnoremap <buffer> <silent> me :<c-u>call <SID>NetrwMarkFileEdit(0)<cr> + nnoremap <buffer> <silent> mf :<c-u>call <SID>NetrwMarkFile(0,<SID>NetrwGetWord())<cr> + nnoremap <buffer> <silent> mg :<c-u>call <SID>NetrwMarkFileGrep(0)<cr> + nnoremap <buffer> <silent> mh :<c-u>call <SID>NetrwMarkHideSfx(0)<cr> + nnoremap <buffer> <silent> mm :<c-u>call <SID>NetrwMarkFileMove(0)<cr> + nnoremap <buffer> <silent> mp :<c-u>call <SID>NetrwMarkFilePrint(0)<cr> + nnoremap <buffer> <silent> mr :<c-u>call <SID>NetrwMarkFileRegexp(0)<cr> + nnoremap <buffer> <silent> ms :<c-u>call <SID>NetrwMarkFileSource(0)<cr> + nnoremap <buffer> <silent> mT :<c-u>call <SID>NetrwMarkFileTag(0)<cr> + nnoremap <buffer> <silent> mt :<c-u>call <SID>NetrwMarkFileTgt(0)<cr> + nnoremap <buffer> <silent> mu :<c-u>call <SID>NetrwUnMarkFile(0)<cr> + nnoremap <buffer> <silent> mx :<c-u>call <SID>NetrwMarkFileExe(0)<cr> + nnoremap <buffer> <silent> mz :<c-u>call <SID>NetrwMarkFileCompress(0)<cr> + nnoremap <buffer> <silent> gb :<c-u>call <SID>NetrwBookmarkDir(1,b:netrw_cur)<cr> + nnoremap <buffer> <silent> gh :<c-u>call <SID>NetrwHidden(0)<cr> + nnoremap <buffer> <silent> C :let g:netrw_chgwin= winnr()<cr> + nnoremap <buffer> <silent> i :call <SID>NetrwListStyle(0)<cr> + nnoremap <buffer> <silent> o :call <SID>NetrwSplit(0)<cr> + nnoremap <buffer> <silent> O :call <SID>NetrwObtain(0)<cr> + nnoremap <buffer> <silent> p :call <SID>NetrwPreview(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord(),1))<cr> + nnoremap <buffer> <silent> P :call <SID>NetrwPrevWinOpen(0)<cr> + nnoremap <buffer> <silent> qb :<c-u>call <SID>NetrwBookmarkDir(2,b:netrw_curdir)<cr> + nnoremap <buffer> <silent> mB :<c-u>call <SID>NetrwBookmarkDir(6,b:netrw_curdir)<cr> + nnoremap <buffer> <silent> qf :<c-u>call <SID>NetrwFileInfo(0,<SID>NetrwGetWord())<cr> + nnoremap <buffer> <silent> r :let g:netrw_sort_direction= (g:netrw_sort_direction =~ 'n')? 'r' : 'n'<bar>exe "norm! 0"<bar>call <SID>NetrwBrowse(0,<SID>NetrwBrowseChgDir(0,'./'))<cr> + nnoremap <buffer> <silent> s :call <SID>NetrwSortStyle(0)<cr> + nnoremap <buffer> <silent> S :call <SID>NetSortSequence(0)<cr> + nnoremap <buffer> <silent> t :call <SID>NetrwSplit(1)<cr> + nnoremap <buffer> <silent> u :<c-u>call <SID>NetrwBookmarkDir(4,b:netrw_curdir)<cr> + nnoremap <buffer> <silent> U :<c-u>call <SID>NetrwBookmarkDir(5,b:netrw_curdir)<cr> + nnoremap <buffer> <silent> v :call <SID>NetrwSplit(2)<cr> + nnoremap <buffer> <silent> x :call netrw#NetrwBrowseX(<SID>NetrwBrowseChgDir(0,<SID>NetrwGetWord()),1)<cr> + nnoremap <buffer> <silent> % :call <SID>NetrwOpenFile(0)<cr> + if !hasmapto('<Plug>NetrwHideEdit') + nmap <buffer> <c-h> <Plug>NetrwHideEdit + endif + nnoremap <buffer> <silent> <Plug>NetrwHideEdit :call <SID>NetrwHideEdit(0)<cr> + if !hasmapto('<Plug>NetrwRefresh') + nmap <buffer> <c-l> <Plug>NetrwRefresh + endif + + let mapsafepath = escape(s:path, s:netrw_map_escape) + let mapsafeusermach = escape(s:user.s:machine, s:netrw_map_escape) + + nnoremap <buffer> <silent> <Plug>NetrwRefresh :call <SID>NetrwRefresh(0,<SID>NetrwBrowseChgDir(0,'./'))<cr> + if g:netrw_mousemaps == 1 + nnoremap <buffer> <silent> <leftmouse> <leftmouse>:call <SID>NetrwLeftmouse(0)<cr> + nnoremap <buffer> <silent> <middlemouse> <leftmouse>:call <SID>NetrwPrevWinOpen(0)<cr> + nnoremap <buffer> <silent> <s-leftmouse> <leftmouse>:call <SID>NetrwMarkFile(0,<SID>NetrwGetWord())<cr> + exe 'nnoremap <buffer> <silent> <rightmouse> <leftmouse>:call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>' + exe 'vnoremap <buffer> <silent> <rightmouse> <leftmouse>:call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>' + endif + exe 'nnoremap <buffer> <silent> <del> :call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>' + exe 'vnoremap <buffer> <silent> <del> :call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>' + exe 'nnoremap <buffer> <silent> d :call <SID>NetrwMakeDir("'.mapsafeusermach.'")<cr>' + exe 'nnoremap <buffer> <silent> D :call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>' + exe 'vnoremap <buffer> <silent> D :call <SID>NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")<cr>' + exe 'nnoremap <buffer> <silent> R :call <SID>NetrwRemoteRename("'.mapsafeusermach.'","'.mapsafepath.'")<cr>' + exe 'vnoremap <buffer> <silent> R :call <SID>NetrwRemoteRename("'.mapsafeusermach.'","'.mapsafepath.'")<cr>' + nnoremap <buffer> <F1> :he netrw-quickhelp<cr> + endif + call s:SetRexDir(a:islocal,b:netrw_curdir) +" call Dret("s:BrowserMaps") +endfun + +" --------------------------------------------------------------------- +" s:ExplorePatHls: converts an Explore pattern into a regular expression search pattern {{{2 +fun! s:ExplorePatHls(pattern) +" call Dfunc("s:ExplorePatHls(pattern<".a:pattern.">)") + let repat= substitute(a:pattern,'^**/\{1,2}','','') +" call Decho("repat<".repat.">") + let repat= escape(repat,'][.\') +" call Decho("repat<".repat.">") + let repat= '\<'.substitute(repat,'\*','\\(\\S\\+ \\)*\\S\\+','g').'\>' +" call Dret("s:ExplorePatHls repat<".repat.">") + return repat +endfun + +" --------------------------------------------------------------------- +" s:NetrwBookmarkDir: {{{2 +" 0: (user: <mb>) bookmark current directory +" 1: (user: <gb>) change to the bookmarked directory +" 2: (user: <qb>) list bookmarks +" 3: (browsing) record current directory history +" 4: (user: <u>) go up (previous) bookmark +" 5: (user: <U>) go down (next) bookmark +" 6: (user: <mB>) delete bookmark +fun! s:NetrwBookmarkDir(chg,curdir) +" call Dfunc("NetrwBookmarkDir(chg=".a:chg." curdir<".a:curdir.">) cnt=".v:count." bookmarkcnt=".g:NETRW_BOOKMARKMAX." histcnt=".g:NETRW_DIRHIST_CNT." bookmax=".g:NETRW_BOOKMARKMAX." histmax=".g:netrw_dirhistmax) + + if a:chg == 0 + " bookmark the current directory +" call Decho("(user: <b>) bookmark the current directory") + if v:count > 0 + " handle bookmark# specified via the count + let g:NETRW_BOOKMARKDIR_{v:count}= a:curdir + if !exists("g:NETRW_BOOKMARKMAX") + let g:NETRW_BOOKMARKMAX= v:count + elseif v:count > g:NETRW_BOOKMARKMAX + let g:NETRW_BOOKMARKMAX= v:count + endif + else + " handle no count specified + let g:NETRW_BOOKMARKMAX = g:NETRW_BOOKMARKMAX + 1 + let g:NETRW_BOOKMARKDIR_{g:NETRW_BOOKMARKMAX} = a:curdir + endif + echo "bookmarked the current directory" + + elseif a:chg == 1 + " change to the bookmarked directory +" call Decho("(user: <B>) change to the bookmarked directory") + if exists("g:NETRW_BOOKMARKDIR_{v:count}") + exe "e ".fnameescape(g:NETRW_BOOKMARKDIR_{v:count}) + else + echomsg "Sorry, bookmark#".v:count." doesn't exist!" + endif + + elseif a:chg == 2 +" redraw! + let didwork= 0 + " list user's bookmarks +" call Decho("(user: <q>) list user's bookmarks") + if exists("g:NETRW_BOOKMARKMAX") +" call Decho("list bookmarks [0,".g:NETRW_BOOKMARKMAX."]") + let cnt= 0 + while cnt <= g:NETRW_BOOKMARKMAX + if exists("g:NETRW_BOOKMARKDIR_{cnt}") +" call Decho("Netrw Bookmark#".cnt.": ".g:NETRW_BOOKMARKDIR_{cnt}) + echo "Netrw Bookmark#".cnt.": ".g:NETRW_BOOKMARKDIR_{cnt} + let didwork= 1 + endif + let cnt= cnt + 1 + endwhile + endif + + " list directory history + let cnt = g:NETRW_DIRHIST_CNT + let first = 1 + let histcnt = 0 + while ( first || cnt != g:NETRW_DIRHIST_CNT ) +" call Decho("first=".first." cnt=".cnt." dirhist_cnt=".g:NETRW_DIRHIST_CNT) + let histcnt= histcnt + 1 + if exists("g:NETRW_DIRHIST_{cnt}") +" call Decho("Netrw History#".histcnt.": ".g:NETRW_DIRHIST_{cnt}) + echo "Netrw History#".histcnt.": ".g:NETRW_DIRHIST_{cnt} + let didwork= 1 + endif + let first = 0 + let cnt = ( cnt - 1 ) % g:netrw_dirhistmax + if cnt < 0 + let cnt= cnt + g:netrw_dirhistmax + endif + endwhile + if didwork + call inputsave()|call input("Press <cr> to continue")|call inputrestore() + endif + + elseif a:chg == 3 + " saves most recently visited directories (when they differ) +" call Decho("(browsing) record curdir history") + if !exists("g:NETRW_DIRHIST_0") || g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT} != a:curdir + let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT + 1 ) % g:netrw_dirhistmax +" let g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}= substitute(a:curdir,'[/\\]$','','e') + let g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}= a:curdir +" call Decho("save dirhist#".g:NETRW_DIRHIST_CNT."<".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}.">") + endif + + elseif a:chg == 4 + " u: change to the previous directory stored on the history list +" call Decho("(user: <u>) chg to prev dir from history") + let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT - 1 ) % g:netrw_dirhistmax + if g:NETRW_DIRHIST_CNT < 0 + let g:NETRW_DIRHIST_CNT= g:NETRW_DIRHIST_CNT + g:netrw_dirhistmax + endif + if exists("g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}") +" call Decho("changedir u#".g:NETRW_DIRHIST_CNT."<".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}.">") + if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("b:netrw_curdir") + setlocal ma noro +" call Decho("setlocal ma noro") + %d + setlocal nomod +" call Decho("setlocal nomod") + endif +" " call Decho("exe e! ".fnameescape(g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT})) + exe "e! ".fnameescape(g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}) + else + let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT + 1 ) % g:netrw_dirhistmax + echo "Sorry, no predecessor directory exists yet" + endif + + elseif a:chg == 5 + " U: change to the subsequent directory stored on the history list +" call Decho("(user: <U>) chg to next dir from history") + let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT + 1 ) % g:netrw_dirhistmax + if exists("g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}") +" call Decho("changedir U#".g:NETRW_DIRHIST_CNT."<".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}.">") + if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("b:netrw_curdir") + setlocal ma noro +" call Decho("setlocal ma noro") + %d +" call Decho("removed all lines from buffer (%d)") + setlocal nomod +" call Decho("setlocal nomod") + endif +" call Decho("exe e! ".fnameescape(g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT})) + exe "e! ".fnameescape(g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}) + else + let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT - 1 ) % g:netrw_dirhistmax + if g:NETRW_DIRHIST_CNT < 0 + let g:NETRW_DIRHIST_CNT= g:NETRW_DIRHIST_CNT + g:netrw_dirhistmax + endif + echo "Sorry, no successor directory exists yet" + endif + + elseif a:chg == 6 + if v:count > 0 && v:count == g:NETRW_BOOKMARKMAX + " delete the v:count'th bookmark +" call Decho("delete bookmark#".v:count."<".g:NETRW_BOOKMARKDIR_{g:NETRW_BOOKMARKMAX}.">") + unlet g:NETRW_BOOKMARKDIR_{g:NETRW_BOOKMARKMAX} + let g:NETRW_BOOKMARKMAX= g:NETRW_BOOKMARKMAX - 1 + + elseif v:count > 0 +" call Decho("delete by shifting bookmark#".v:count."<".g:NETRW_BOOKMARKDIR_{v:count}.">") + let cnt= v:count + while cnt < g:NETRW_BOOKMARKMAX + let g:NETRW_BOOKMARKDIR_{cnt} = g:NETRW_BOOKMARKDIR_{(cnt+1)} + let cnt = cnt + 1 + endwhile + unlet g:NETRW_BOOKMARKDIR_{g:NETRW_BOOKMARKMAX} + let g:NETRW_BOOKMARKMAX= g:NETRW_BOOKMARKMAX - 1 + + elseif exists("b:netrw_curdir") + " look for current directory amongst the bookmarks and remove that bookmark +" call Decho("search for bookmark<".b:netrw_curdir.">") + let cnt= 1 + while cnt <= g:NETRW_BOOKMARKMAX +" call Decho("checking: g:NETRW_BOOKMARKDIR_".cnt."<".g:NETRW_BOOKMARKDIR_{cnt}.">") + if g:NETRW_BOOKMARKDIR_{cnt} == b:netrw_curdir + if cnt < g:NETRW_BOOKMARKMAX +" call Decho("delete bookmark#".cnt."<".b:netrw_curdir.">") + while cnt < g:NETRW_BOOKMARMAX + let g:NETRW_BOOKMARKDIR_{cnt} = g:NETRW_BOOKMARKDIR_{(cnt+1)} + let cnt = cnt + 1 + endwhile + endif + unlet g:NETRW_BOOKMARKDIR_{g:NETRW_BOOKMARKMAX} + let g:NETRW_BOOKMARKMAX= g:NETRW_BOOKMARKMAX - 1 + endif + let cnt= cnt + 1 + endwhile + endif + + endif + call s:NetrwBookmarkMenu() +" call Dret("NetrwBookmarkDir") +endfun + +" --------------------------------------------------------------------- +" s:NetrwBrowse: This function uses the command in g:netrw_list_cmd to provide a {{{2 +" list of the contents of a local or remote directory. It is assumed that the +" g:netrw_list_cmd has a string, USEPORT HOSTNAME, that needs to be substituted +" with the requested remote hostname first. +fun! s:NetrwBrowse(islocal,dirname) + if !exists("w:netrw_liststyle")|let w:netrw_liststyle= g:netrw_liststyle|endif +" call Dfunc("s:NetrwBrowse(islocal=".a:islocal." dirname<".a:dirname.">) liststyle=".w:netrw_liststyle." ".g:loaded_netrw." buf#".bufnr("%")."<".bufname("%").">") +" call Decho("tab#".tabpagenr()." win#".winnr()) +" call Dredir("ls!") + + if exists("s:netrw_skipbrowse") + unlet s:netrw_skipbrowse +" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap) +" call Dret("s:NetrwBrowse : s:netrw_skipbrowse=".s:netrw_skipbrowse) + return + endif + if !exists("*shellescape") + call netrw#ErrorMsg(s:ERROR,"netrw can't run -- your vim is missing shellescape()",69) +" call Dret("s:NetrwBrowse : missing shellescape()") + return + endif + if !exists("*fnameescape") + call netrw#ErrorMsg(s:ERROR,"netrw can't run -- your vim is missing fnameescape()",70) +" call Dret("s:NetrwBrowse : missing fnameescape()") + return + endif + + call s:NetrwOptionSave("w:") + call s:NetrwSafeOptions() + + " re-instate any marked files + if exists("s:netrwmarkfilelist_{bufnr('%')}") +" call Decho("clearing marked files") + exe "2match netrwMarkFile /".s:netrwmarkfilemtch_{bufnr("%")}."/" + endif + + if a:islocal && exists("w:netrw_acdkeep") && w:netrw_acdkeep +" call Decho("handle w:netrw_acdkeep:") +" call Decho("keepjumps lcd ".fnameescape(a:dirname)." (due to w:netrw_acdkeep=".w:netrw_acdkeep." - acd=".&acd.")") + exe 'keepjumps lcd '.fnameescape(a:dirname) +" call Decho("getcwd<".getcwd().">") + + elseif !a:islocal && a:dirname !~ '[\/]$' && a:dirname !~ '^"' + " looks like a regular file, attempt transfer +" call Decho("attempt transfer as regular file<".a:dirname.">") + + " remove any filetype indicator from end of dirname, except for the {{{3 + " "this is a directory" indicator (/). + " There shouldn't be one of those here, anyway. + let path= substitute(a:dirname,'[*=@|]\r\=$','','e') +" call Decho("new path<".path.">") + call s:RemotePathAnalysis(a:dirname) + + " remote-read the requested file into current buffer {{{3 + mark ' + call s:NetrwEnew(a:dirname) + setlocal ma noro +" call Decho("setlocal ma noro") + let b:netrw_curdir= a:dirname +" call Decho("exe silent! keepalt file ".fnameescape(s:method."://".s:user.s:machine."/".s:path)." (bt=".&bt.")") + exe "silent! keepalt file ".fnameescape(s:method."://".s:user.s:machine."/".s:path) + exe "silent keepalt doau BufReadPre ".fnameescape(s:fname) + silent call netrw#NetRead(2,s:method."://".s:user.s:machine."/".s:path) + if s:path !~ '.tar.bz2$' && s:path !~ '.tar.gz' + " netrw.vim and tar.vim have already handled decompression of the tarball; avoiding gzip.vim error + exe "silent keepalt doau BufReadPost ".fnameescape(s:fname) + endif + + " save certain window-oriented variables into buffer-oriented variables {{{3 + call s:SetBufWinVars() + call s:NetrwOptionRestore("w:") + setlocal ma nomod + +" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap) +" call Dret("s:NetrwBrowse : file<".s:fname.">") + return + endif + + " use buffer-oriented WinVars if buffer ones exist but window ones don't {{{3 + call s:UseBufWinVars() + + " set up some variables {{{3 + let b:netrw_browser_active = 1 + let dirname = a:dirname + let s:last_sort_by = g:netrw_sort_by + + " set up menu {{{3 + call s:NetrwMenu(1) + + " set up buffer {{{3 + let reusing= s:NetrwGetBuffer(a:islocal,dirname) + " maintain markfile highlighting + if exists("s:netrwmarkfilemtch_{bufnr('%')}") && s:netrwmarkfilemtch_{bufnr("%")} != "" +" call Decho("bufnr(%)=".bufnr('%')) +" call Decho("exe 2match netrwMarkFile /".s:netrwmarkfilemtch_{bufnr("%")}."/") + exe "2match netrwMarkFile /".s:netrwmarkfilemtch_{bufnr("%")}."/" + else +" call Decho("2match none") + 2match none + endif + if reusing + call s:NetrwOptionRestore("w:") + setlocal noma nomod nowrap +" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap) +" call Dret("s:NetrwBrowse : re-using buffer") + return + endif + + " set b:netrw_curdir to the new directory name {{{3 +" call Decho("set b:netrw_curdir to the new directory name:") + let b:netrw_curdir= dirname + if b:netrw_curdir =~ '[/\\]$' + let b:netrw_curdir= substitute(b:netrw_curdir,'[/\\]$','','e') + endif + if b:netrw_curdir == '' + if has("amiga") + " On the Amiga, the empty string connotes the current directory + let b:netrw_curdir= getcwd() + else + " under unix, when the root directory is encountered, the result + " from the preceding substitute is an empty string. + let b:netrw_curdir= '/' + endif + endif + if !a:islocal && b:netrw_curdir !~ '/$' + let b:netrw_curdir= b:netrw_curdir.'/' + endif +" call Decho("b:netrw_curdir<".b:netrw_curdir.">") + + " ------------ + " (local only) {{{3 + " ------------ + if a:islocal +" call Decho("local only:") + + " Set up ShellCmdPost handling. Append current buffer to browselist + call s:LocalFastBrowser() + + " handle g:netrw_keepdir: set vim's current directory to netrw's notion of the current directory {{{3 + if !g:netrw_keepdir +" call Decho("handle g:netrw_keepdir=".g:netrw_keepdir.": getcwd<".getcwd()."> acd=".&acd) +" call Decho("l:acd".(exists("&l:acd")? "=".&l:acd : " doesn't exist")) + if !exists("&l:acd") || !&l:acd +" call Decho('exe keepjumps lcd '.fnameescape(b:netrw_curdir)) + try + exe 'keepjumps lcd '.fnameescape(b:netrw_curdir) + catch /^Vim\%((\a\+)\)\=:E472/ + call netrw#ErrorMsg(s:ERROR,"unable to change directory to <".b:netrw_curdir."> (permissions?)",61) + if exists("w:netrw_prvdir") + let b:netrw_curdir= w:netrw_prvdir + else + call s:NetrwOptionRestore("w:") + setlocal noma nomod nowrap + let b:netrw_curdir= dirname +" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap) +" call Dret("s:NetrwBrowse : reusing buffer#".(exists("bufnum")? bufnum : 'N/A')."<".dirname."> getcwd<".getcwd().">") + return + endif + endtry + endif + endif + + " -------------------------------- + " remote handling: {{{3 + " -------------------------------- + else +" call Decho("remote only:") + + " analyze a:dirname and g:netrw_list_cmd {{{4 +" call Decho("b:netrw_curdir<".(exists("b:netrw_curdir")? b:netrw_curdir : "doesn't exist")."> a:dirname<".a:dirname.">") + if a:dirname =~ "^NetrwTreeListing\>" + let dirname= b:netrw_curdir +" call Decho("(dirname was ".a:dirname.") dirname<".dirname.">") + elseif exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("b:netrw_curdir") + let dirname= substitute(b:netrw_curdir,'\\','/','g') + if dirname !~ '/$' + let dirname= dirname.'/' + endif + let b:netrw_curdir = dirname +" call Decho("(liststyle is TREELIST) dirname<".dirname.">") + else + let dirname = substitute(a:dirname,'\\','/','g') +" call Decho("(normal) dirname<".dirname.">") + endif + + let dirpat = '^\(\w\{-}\)://\(\w\+@\)\=\([^/]\+\)/\(.*\)$' + if dirname !~ dirpat + if !exists("g:netrw_quiet") + call netrw#ErrorMsg(s:ERROR,"netrw doesn't understand your dirname<".dirname.">",20) + endif + call s:NetrwOptionRestore("w:") + setlocal noma nomod nowrap +" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap) +" call Dret("s:NetrwBrowse : badly formatted dirname<".dirname.">") + return + endif + let b:netrw_curdir= dirname +" call Decho("b:netrw_curdir<".b:netrw_curdir."> (remote)") + endif " (additional remote handling) + + " ----------------------- + " Directory Listing: {{{3 + " ----------------------- + call s:BrowserMaps(a:islocal) + call s:PerformListing(a:islocal) + +" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap) +" call Dret("s:NetrwBrowse : did PerformListing") + return +endfun + +" --------------------------------------------------------------------- +" s:NetrwFileInfo: supports qf (query for file information) {{{2 +fun! s:NetrwFileInfo(islocal,fname) +" call Dfunc("s:NetrwFileInfo(islocal=".a:islocal." fname<".a:fname.">)") + if a:islocal + if (has("unix") || has("macunix")) && executable("/bin/ls") + if exists("b:netrw_curdir") +" call Decho('using ls with b:netrw_curdir<'.b:netrw_curdir.'>') + if b:netrw_curdir =~ '/$' + echo system("/bin/ls -lsad ".shellescape(b:netrw_curdir.a:fname)) + else + echo system("/bin/ls -lsad ".shellescape(b:netrw_curdir."/".a:fname)) + endif + else +" call Decho('using ls '.a:fname." using cwd<".getcwd().">") + echo system("/bin/ls -lsad ".shellescape(a:fname)) + endif + else + " use vim functions to return information about file below cursor +" call Decho("using vim functions to query for file info") + if !isdirectory(a:fname) && !filereadable(a:fname) && a:fname =~ '[*@/]' + let fname= substitute(a:fname,".$","","") + else + let fname= a:fname + endif + let t = getftime(fname) + let sz = getfsize(fname) + echo a:fname.": ".sz." ".strftime(g:netrw_timefmt,getftime(fname)) +" call Decho(fname.": ".sz." ".strftime(g:netrw_timefmt,getftime(fname))) + endif + else + echo "sorry, \"qf\" not supported yet for remote files" + endif +" call Dret("s:NetrwFileInfo") +endfun + +" --------------------------------------------------------------------- +" s:NetrwGetBuffer: {{{2 +" returns 0=cleared buffer +" 1=re-used buffer +fun! s:NetrwGetBuffer(islocal,dirname) +" call Dfunc("s:NetrwGetBuffer(islocal=".a:islocal." dirname<".a:dirname.">) liststyle=".g:netrw_liststyle) + let dirname= a:dirname + + " re-use buffer if possible {{{3 +" call Decho("--re-use a buffer if possible--") + if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST + " find NetrwTreeList buffer if there is one + if exists("w:netrw_treebufnr") && w:netrw_treebufnr > 0 +" call Decho(" re-use w:netrw_treebufnr=".w:netrw_treebufnr) + let eikeep= &ei + set ei=all + exe "b ".w:netrw_treebufnr + let &ei= eikeep +" call Dret("s:NetrwGetBuffer : bufnum#".bufnum."<NetrwTreeListing>") + return + endif + let bufnum= -1 +" call Decho(" liststyle=TREE but w:netrw_treebufnr doesn't exist") + + else + " find buffer number of buffer named precisely the same as dirname {{{3 +" call Decho("--find buffer numnber of buffer named precisely the same as dirname--") +" call Dredir("ls!") + + " get dirname and associated buffer number + let bufnum = bufnr(escape(dirname,'\')) +" call Decho(" find buffer<".dirname.">'s number ") +" call Decho(" bufnr(dirname<".escape(dirname,'\').">)=".bufnum) + + if bufnum < 0 && dirname !~ '/$' + " trying appending a trailing / +" call Decho(" try appending a trailing / to dirname<".dirname.">") + let bufnum= bufnr(escape(dirname.'/','\')) + if bufnum > 0 + let dirname= dirname.'/' + endif + endif + + if bufnum < 0 && dirname =~ '/$' + " trying removing a trailing / +" call Decho(" try removing a trailing / from dirname<".dirname.">") + let bufnum= bufnr(escape(substitute(dirname,'/$','',''),'\')) + if bufnum > 0 + let dirname= substitute(dirname,'/$','','') + endif + endif + +" call Decho(" findbuf1: bufnum=bufnr('".dirname."')=".bufnum." bufname(".bufnum.")<".bufname(bufnum)."> (initial)") + " note: !~ was used just below, but that means using ../ to go back would match (ie. abc/def/ and abc/ matches) + if bufnum > 0 && bufname(bufnum) != dirname && bufname(bufnum) != '.' + " handle approximate matches +" call Decho(" handling approx match: bufnum#%d<".bufname(bufnum)."> approx=dirname<".dirname.">") + let ibuf = 1 + let buflast = bufnr("$") +" call Decho(" findbuf2: buflast=".buflast) + while ibuf <= buflast + let bname= substitute(bufname(ibuf),'\\','/','g') + let bname= substitute(bname,'.\zs/$','','') +" call Decho(" findbuf3: dirname<".dirname."> bufname(".ibuf.")<".bname.">") + if bname != '' && dirname =~ '/'.bname.'/\=$' | break | endif + if bname =~ '^'.dirname.'/\=$' | break | endif + if dirname =~ '^'.bname.'/$' | break | endif + let ibuf= ibuf + 1 + endwhile + if ibuf > buflast + let bufnum= -1 + else + let bufnum= ibuf + endif +" call Decho(" findbuf4: bufnum=".bufnum." (ibuf=".ibuf." buflast=".buflast.")") + endif + endif + + " get enew buffer and name it -or- re-use buffer {{{3 +" call Decho("--get enew buffer and name it OR re-use buffer-- (bufnum=".bufnum.")") + mark ' + if bufnum < 0 || !bufexists(bufnum) + call s:NetrwEnew(dirname) +" call Decho(" got enew buffer#".bufnr("%")." (altbuf<".expand("#").">)") + " name the buffer + if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST + " Got enew buffer; transform into a NetrwTreeListing +" call Decho("--transform enew buffer#".bufnr("%")." into a NetrwTreeListing --") + if !exists("s:netrw_treelistnum") + let s:netrw_treelistnum= 1 + else + let s:netrw_treelistnum= s:netrw_treelistnum + 1 + endif + let w:netrw_treebufnr= bufnr("%") +" call Decho(" exe silent! keepalt file NetrwTreeListing ".fnameescape(s:netrw_treelistnum)) + exe 'silent! keepalt file NetrwTreeListing\ '.fnameescape(s:netrw_treelistnum) + nnoremap <silent> <buffer> [ :silent call <SID>TreeListMove('[')<cr> + nnoremap <silent> <buffer> ] :silent call <SID>TreeListMove(']')<cr> + nnoremap <silent> <buffer> [[ :silent call <SID>TreeListMove('[')<cr> + nnoremap <silent> <buffer> ]] :silent call <SID>TreeListMove(']')<cr> +" call Decho(" tree listing#".s:netrw_treelistnum." bufnr=".w:netrw_treebufnr) + else +" let v:errmsg= "" " Decho + let escdirname= fnameescape(dirname) +" call Decho(" errmsg<".v:errmsg."> bufnr(".escdirname.")=".bufnr(escdirname)."<".bufname(bufnr(escdirname)).">") +" call Decho(' exe silent! keepalt file '.escdirname) + exe 'silent! keepalt file '.escdirname +" call Decho(" errmsg<".v:errmsg."> bufnr(".escdirname.")=".bufnr(escdirname)."<".bufname(bufnr(escdirname)).">") + endif +" call Decho(" named enew buffer#".bufnr("%")."<".bufname("%").">") + + else " Re-use the buffer +" call Decho("--re-use buffer#".bufnum.": --") + let eikeep= &ei + set ei=all + if getline(2) =~ '^" Netrw Directory Listing' +" call Decho(" re-use buffer#".bufnum."<".((bufnum > 0)? bufname(bufnum) : "")."> using: keepalt b ".bufnum) + exe "keepalt b ".bufnum + else +" call Decho(" reusing buffer#".bufnum."<".((bufnum > 0)? bufname(bufnum) : "")."> using: b ".bufnum) + exe "b ".bufnum + endif + if bufname("%") == '.' +" call Decho("exe silent! keepalt file ".fnameescape(getcwd())) + exe "silent! keepalt file ".fnameescape(getcwd()) + endif + let &ei= eikeep + if line("$") <= 1 + call s:NetrwListSettings(a:islocal) +" call Dret("s:NetrwGetBuffer 0 : re-using buffer#".bufnr("%").", but its empty, so refresh it") + return 0 + elseif exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST +" call Decho("--re-use tree listing--") +" call Decho(" clear buffer<".expand("%")."> with :%d") + silent %d + call s:NetrwListSettings(a:islocal) +" call Dret("s:NetrwGetBuffer 0 : re-using buffer#".bufnr("%").", but treelist mode always needs a refresh") + return 0 + else +" call Dret("s:NetrwGetBuffer 1 : buf#".bufnr("%")) + return 1 + endif + endif + + " do netrw settings: make this buffer not-a-file, modifiable, not line-numbered, etc {{{3 + " fastbrowse Local Remote Hiding a buffer implies it may be re-used (fast) + " slow 0 D D Deleting a buffer implies it will not be re-used (slow) + " med 1 D H + " fast 2 H H +" call Decho("--do netrw settings: make this buffer not-a-file, modifiable, not line-numbered, etc--") + let fname= expand("%") + call s:NetrwListSettings(a:islocal) +" call Decho("exe keepalt file ".fnameescape(fname)) + exe "keepalt file ".fnameescape(fname) + + " delete all lines from buffer {{{3 +" call Decho("--delete all lines from buffer--") +" call Decho(" clear buffer<".expand("%")."> with :%d") + keepalt silent! %d + +" call Dret("s:NetrwGetBuffer 0 : buf#".bufnr("%")) + return 0 +endfun + +" --------------------------------------------------------------------- +" s:NetrwGetcwd: get the current directory. {{{2 +" Change backslashes to forward slashes, if any. +" If doesc is true, escape certain troublesome characters +fun! s:NetrwGetcwd(doesc) +" call Dfunc("NetrwGetcwd(doesc=".a:doesc.")") + let curdir= substitute(getcwd(),'\\','/','ge') + if curdir !~ '[\/]$' + let curdir= curdir.'/' + endif + if a:doesc + let curdir= fnameescape(curdir) + endif +" call Dret("NetrwGetcwd <".curdir.">") + return curdir +endfun + +" --------------------------------------------------------------------- +" s:NetrwGetWord: it gets the directory/file named under the cursor {{{2 +fun! s:NetrwGetWord() +" call Dfunc("s:NetrwGetWord() line#".line(".")." liststyle=".g:netrw_liststyle." virtcol=".virtcol(".")) + call s:UseBufWinVars() + + " insure that w:netrw_liststyle is set up + if !exists("w:netrw_liststyle") + if exists("g:netrw_liststyle") + let w:netrw_liststyle= g:netrw_liststyle + else + let w:netrw_liststyle= s:THINLIST + endif +" call Decho("w:netrw_liststyle=".w:netrw_liststyle) + endif + + if exists("w:netrw_bannercnt") && line(".") < w:netrw_bannercnt + " Active Banner support +" call Decho("active banner handling") + norm! 0 + let dirname= "./" + let curline= getline('.') + + if curline =~ '"\s*Sorted by\s' + norm s + let s:netrw_skipbrowse= 1 + echo 'Pressing "s" also works' + + elseif curline =~ '"\s*Sort sequence:' + let s:netrw_skipbrowse= 1 + echo 'Press "S" to edit sorting sequence' + + elseif curline =~ '"\s*Quick Help:' + norm ? + let s:netrw_skipbrowse= 1 + echo 'Pressing "?" also works' + + elseif curline =~ '"\s*\%(Hiding\|Showing\):' + norm a + let s:netrw_skipbrowse= 1 + echo 'Pressing "a" also works' + + elseif line("$") > w:netrw_bannercnt + exe 'silent keepjumps '.w:netrw_bannercnt + endif + + elseif w:netrw_liststyle == s:THINLIST +" call Decho("thin column handling") + norm! 0 + let dirname= getline('.') + + elseif w:netrw_liststyle == s:LONGLIST +" call Decho("long column handling") + norm! 0 + let dirname= substitute(getline('.'),'^\(\%(\S\+ \)*\S\+\).\{-}$','\1','e') + + elseif w:netrw_liststyle == s:TREELIST +" call Decho("treelist handling") + let dirname= substitute(getline('.'),'^\(| \)*','','e') + + else +" call Decho("obtain word from wide listing") + let dirname= getline('.') + + if !exists("b:netrw_cpf") + let b:netrw_cpf= 0 + exe 'silent keepjumps '.w:netrw_bannercnt.',$g/^./if virtcol("$") > b:netrw_cpf|let b:netrw_cpf= virtcol("$")|endif' +" call Decho("computed cpf=".b:netrw_cpf) + endif + +" call Decho("buf#".bufnr("%")."<".bufname("%").">") + let filestart = (virtcol(".")/b:netrw_cpf)*b:netrw_cpf +" call Decho("filestart= ([virtcol=".virtcol(".")."]/[b:netrw_cpf=".b:netrw_cpf."])*b:netrw_cpf=".filestart." bannercnt=".w:netrw_bannercnt) +" call Decho("1: dirname<".dirname.">") + if filestart == 0 + norm! 0ma + else + call cursor(line("."),filestart+1) + norm! ma + endif + let rega= @a + let eofname= filestart + b:netrw_cpf + 1 + if eofname <= col("$") + call cursor(line("."),filestart+b:netrw_cpf+1) + norm! "ay`a + else + norm! "ay$ + endif + let dirname = @a + let @a = rega +" call Decho("2: dirname<".dirname.">") + let dirname= substitute(dirname,'\s\+$','','e') +" call Decho("3: dirname<".dirname.">") + endif + + " symlinks are indicated by a trailing "@". Remove it before further processing. + let dirname= substitute(dirname,"@$","","") + + " executables are indicated by a trailing "*". Remove it before further processing. + let dirname= substitute(dirname,"\*$","","") + +" call Dret("s:NetrwGetWord <".dirname.">") + return dirname +endfun + +" --------------------------------------------------------------------- +" s:NetrwListSettings: {{{2 +fun! s:NetrwListSettings(islocal) +" call Dfunc("s:NetrwListSettings(islocal=".a:islocal.")") + let fname= bufname("%") +" call Decho("setlocal bt=nofile nobl ma nonu nowrap noro") + setlocal bt=nofile nobl ma nonu nowrap noro +" call Decho("exe keepalt file ".fnameescape(fname)) + exe "keepalt file ".fnameescape(fname) + if g:netrw_use_noswf + setlocal noswf + endif +" call Dredir("ls!") +" call Decho("exe setlocal ts=".g:netrw_maxfilenamelen) + exe "setlocal ts=".g:netrw_maxfilenamelen + setlocal isk+=.,~,- + if g:netrw_fastbrowse > a:islocal + setlocal bh=hide + else + setlocal bh=delete + endif +" call Dret("s:NetrwListSettings") +endfun + +" --------------------------------------------------------------------- +" s:NetrwListStyle: {{{2 +" islocal=0: remote browsing +" =1: local browsing +fun! s:NetrwListStyle(islocal) +" call Dfunc("NetrwListStyle(islocal=".a:islocal.") w:netrw_liststyle=".w:netrw_liststyle) + let fname = s:NetrwGetWord() + if !exists("w:netrw_liststyle")|let w:netrw_liststyle= g:netrw_liststyle|endif + let w:netrw_liststyle = (w:netrw_liststyle + 1) % s:MAXLIST +" call Decho("fname<".fname.">") +" call Decho("chgd w:netrw_liststyle to ".w:netrw_liststyle) +" call Decho("b:netrw_curdir<".(exists("b:netrw_curdir")? b:netrw_curdir : "doesn't exist").">") + + if w:netrw_liststyle == s:THINLIST + " use one column listing +" call Decho("use one column list") + let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge') + + elseif w:netrw_liststyle == s:LONGLIST + " use long list +" call Decho("use long list") + let g:netrw_list_cmd = g:netrw_list_cmd." -l" + + elseif w:netrw_liststyle == s:WIDELIST + " give wide list +" call Decho("use wide list") + let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge') + + elseif w:netrw_liststyle == s:TREELIST +" call Decho("use tree list") + let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge') + + else + call netrw#ErrorMsg(s:WARNING,"bad value for g:netrw_liststyle (=".w:netrw_liststyle.")",46) + let g:netrw_liststyle = s:THINLIST + let w:netrw_liststyle = g:netrw_liststyle + let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge') + endif + setlocal ma noro +" call Decho("setlocal ma noro") + + " clear buffer - this will cause NetrwBrowse/LocalBrowseCheck to do a refresh +" call Decho("clear buffer<".expand("%")."> with :%d") + %d + + " refresh the listing + let svpos= netrw#NetrwSavePosn() + call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./')) + call netrw#NetrwRestorePosn(svpos) + if w:netrw_liststyle != s:WIDELIST + if g:netrw_cursorline == 2 + setlocal cursorline + let &cursorcolumn= s:netrw_usercuc + elseif g:netrw_cursorline + setlocal cursorline +" call Decho("setlocal cursorline") + endif + else + if g:netrw_cursorline == 2 + setlocal cursorline cursorcolumn +" call Decho("setlocal cursorline cursorcolumn") + elseif g:netrw_cursorline + let &cursorline= s:netrw_usercul + endif + endif + + " keep cursor on the filename + silent keepjumps $ + let result= search('\%(^\%(|\+\s\)\=\|\s\{2,}\)\zs'.escape(fname,'.\[]*$^').'\%(\s\{2,}\|$\)','bc') +" call Decho("search result=".result." w:netrw_bannercnt=".(exists("w:netrw_bannercnt")? w:netrw_bannercnt : 'N/A')) + if result <= 0 && exists("w:netrw_bannercnt") + exe "keepjumps ".w:netrw_bannercnt + endif + +" call Dret("NetrwListStyle".(exists("w:netrw_liststyle")? ' : w:netrw_liststyle='.w:netrw_liststyle : "")) +endfun + +" --------------------------------------------------------------------- +" s:NetrwBookmarkMenu: Uses menu priorities {{{2 +" .2.[cnt] for bookmarks, and +" .3.[cnt] for history +" (see s:NetrwMenu()) +fun! s:NetrwBookmarkMenu() + if !exists("s:netrw_menucnt") + return + endif +" call Dfunc("NetrwBookmarkMenu() bookmarkcnt=".g:NETRW_BOOKMARKMAX." histcnt=".g:NETRW_DIRHIST_CNT." menucnt=".s:netrw_menucnt) + + " the following test assures that gvim is running, has menus available, and has menus enabled. + if has("gui") && has("menu") && has("gui_running") && &go =~ 'm' && g:netrw_menu + if exists("g:NetrwTopLvlMenu") +" call Decho("removing ".g:NetrwTopLvlMenu."Bookmarks menu item(s)") + exe 'silent! unmenu '.g:NetrwTopLvlMenu.'Bookmarks' + endif + + " show bookmarked places + let cnt = 1 + while cnt <= g:NETRW_BOOKMARKMAX + if exists("g:NETRW_BOOKMARKDIR_{cnt}") + let bmdir= escape(g:NETRW_BOOKMARKDIR_{cnt},'. ') +" call Decho('silent! menu '.g:NetrwMenuPriority.".2.".cnt." ".g:NetrwTopLvlMenu.'Bookmark.'.bmdir.' :e '.bmdir) + exe 'silent! menu '.g:NetrwMenuPriority.".2.".cnt." ".g:NetrwTopLvlMenu.'Bookmarks.'.bmdir.' :e '.bmdir."\<cr>" + endif + let cnt= cnt + 1 + endwhile + + " show directory browsing history + let cnt = g:NETRW_DIRHIST_CNT + let first = 1 + let histcnt = 0 + while ( first || cnt != g:NETRW_DIRHIST_CNT ) + let histcnt = histcnt + 1 + let priority = g:NETRW_DIRHIST_CNT + histcnt + if exists("g:NETRW_DIRHIST_{cnt}") + let bmdir= escape(g:NETRW_DIRHIST_{cnt},'/&? ') +" call Decho('silent! menu '.g:NetrwMenuPriority.".3.".priority." ".g:NetrwTopLvlMenu.'History.'.bmdir.' :e '.bmdir) + exe 'silent! menu '.g:NetrwMenuPriority.".3.".priority." ".g:NetrwTopLvlMenu.'History.'.bmdir.' :e '.bmdir."\<cr>" + endif + let first = 0 + let cnt = ( cnt - 1 ) % g:netrw_dirhistmax + if cnt < 0 + let cnt= cnt + g:netrw_dirhistmax + endif + endwhile + endif +" call Dret("NetrwBookmarkMenu") +endfun + +" --------------------------------------------------------------------- +" s:NetrwBrowseChgDir: constructs a new directory based on the current {{{2 +" directory and a new directory name. Also, if the +" "new directory name" is actually a file, +" NetrwBrowseChgDir() edits the file. +fun! s:NetrwBrowseChgDir(islocal,newdir,...) +" call Dfunc("s:NetrwBrowseChgDir(islocal=".a:islocal."> newdir<".a:newdir.">) a:0=".a:0." curpos<".string(getpos("."))."> b:netrw_curdir<".(exists("b:netrw_curdir")? b:netrw_curdir : "").">") + + if !exists("b:netrw_curdir") + " Don't try to change-directory: this can happen, for example, when netrw#ErrorMsg has been called + " and the current window is the NetrwMessage window. +" call Decho("(NetrwBrowseChgDir) b:netrw_curdir doesn't exist!") +" call Decho("getcwd<".getcwd().">") +" call Dredir("ls!") +" call Dret("s:NetrwBrowseChgDir") + return + endif + + call s:NetrwOptionSave("s:") + call s:NetrwSafeOptions() + let nbcd_curpos = netrw#NetrwSavePosn() + let s:nbcd_curpos_{bufnr('%')} = nbcd_curpos + let dirname = substitute(b:netrw_curdir,'\\','/','ge') + let newdir = a:newdir + let dolockout = 0 + + " set up o/s-dependent directory recognition pattern + if has("amiga") + let dirpat= '[\/:]$' + else + let dirpat= '[\/]$' + endif +" call Decho("dirname<".dirname."> dirpat<".dirpat.">") + + if dirname !~ dirpat + " apparently vim is "recognizing" that it is in a directory and + " is removing the trailing "/". Bad idea, so I put it back. + let dirname= dirname.'/' +" call Decho("adjusting dirname<".dirname.">") + endif + + if newdir !~ dirpat + " ------------ + " edit a file: + " ------------ +" call Decho('case "handling a file": newdir<'.newdir.'> !~ dirpat<'.dirpat.">") + if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("w:netrw_treedict") && newdir !~ '^\(/\|\a:\)' + let dirname= s:NetrwTreeDir() + if dirname =~ '/$' + let dirname= dirname.newdir + else + let dirname= s:NetrwTreeDir()."/".newdir + endif +" call Decho("tree listing") + elseif newdir =~ '^\(/\|\a:\)' + let dirname= newdir + else + let dirname= s:ComposePath(dirname,newdir) + endif +" call Decho("handling a file: dirname<".dirname."> (a:0=".a:0.")") + " this lets NetrwBrowseX avoid the edit + if a:0 < 1 +" call Decho("set up windows for editing<".fnameescape(dirname)."> didsplit=".(exists("s:didsplit")? s:didsplit : "doesn't exist")) + call s:NetrwOptionRestore("s:") + if !exists("s:didsplit") + if g:netrw_browse_split == 1 + new + wincmd _ + elseif g:netrw_browse_split == 2 + rightb vert new + wincmd | + elseif g:netrw_browse_split == 3 + tabnew + elseif g:netrw_browse_split == 4 + if s:NetrwPrevWinOpen(2) == 3 +" call Dret("s:NetrwBrowseChgDir") + return + endif + else + " handling a file, didn't split, so remove menu +" call Decho("handling a file+didn't split, so remove menu") + call s:NetrwMenu(0) + " optional change to window + if g:netrw_chgwin >= 1 + exe "keepjumps ".g:netrw_chgwin."wincmd w" + endif + endif + endif + " the point where netrw actually edits the (local) file + " if its local only: LocalBrowseCheck() doesn't edit a file, but NetrwBrowse() will + if a:islocal +" call Decho("edit local file: exe e! ".fnameescape(dirname)) + exe "e! ".fnameescape(dirname) + else +" call Decho("remote file: NetrwBrowse will edit it") + endif + let dolockout= 1 + endif + + elseif newdir =~ '^/' + " --------------------------------- + " just go to the new directory spec + " --------------------------------- +" call Decho('case "just go to new directory spec": newdir<'.newdir.'>') + let dirname= newdir + call s:SetRexDir(a:islocal,dirname) + call s:NetrwOptionRestore("s:") + + elseif newdir == './' + " -------------------------- + " refresh the directory list + " -------------------------- +" call Decho('case "refresh directory listing": newdir == "./"') + call s:SetRexDir(a:islocal,dirname) + + elseif newdir == '../' + " ------------------- + " go up one directory + " ------------------- +" call Decho('case "go up one directory": newdir == "../"') + + if w:netrw_liststyle == s:TREELIST && exists("w:netrw_treedict") + " force a refresh +" call Decho("clear buffer<".expand("%")."> with :%d") + setlocal noro ma +" call Decho("setlocal noro ma") + keepjumps %d + endif + + if has("amiga") + " amiga +" call Decho('case "go up one directory": newdir == "../" and amiga') + if a:islocal + let dirname= substitute(dirname,'^\(.*[/:]\)\([^/]\+$\)','\1','') + let dirname= substitute(dirname,'/$','','') + else + let dirname= substitute(dirname,'^\(.*[/:]\)\([^/]\+/$\)','\1','') + endif +" call Decho("amiga: dirname<".dirname."> (go up one dir)") + + else + " unix or cygwin +" call Decho('case "go up one directory": newdir == "../" and unix or cygwin') + if a:islocal + let dirname= substitute(dirname,'^\(.*\)/\([^/]\+\)/$','\1','') + if dirname == "" + let dirname= '/' + endif + else + let dirname= substitute(dirname,'^\(\a\+://.\{-}/\{1,2}\)\(.\{-}\)\([^/]\+\)/$','\1\2','') + endif +" call Decho("unix: dirname<".dirname."> (go up one dir)") + endif + call s:SetRexDir(a:islocal,dirname) + + elseif exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("w:netrw_treedict") +" call Decho('case liststyle is TREELIST and w:netrw_treedict exists') + " force a refresh (for TREELIST, wait for NetrwTreeDir() to force the refresh) + setlocal noro ma +" call Decho("setlocal noro ma") + if !(exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("b:netrw_curdir")) +" call Decho("clear buffer<".expand("%")."> with :%d") + keepjumps %d + endif + let treedir = s:NetrwTreeDir() + let s:treecurpos = nbcd_curpos + let haskey= 0 +" call Decho("w:netrw_treedict<".string(w:netrw_treedict).">") + + " search treedict for tree dir as-is + if has_key(w:netrw_treedict,treedir) +" call Decho('....searched for treedir<'.treedir.'> : found it!') + let haskey= 1 + else +" call Decho('....searched for treedir<'.treedir.'> : not found') + endif + + " search treedict for treedir with a / appended + if !haskey && treedir !~ '/$' + if has_key(w:netrw_treedict,treedir."/") + let treedir= treedir."/" +" call Decho('....searched.for treedir<'.treedir.'> found it!') + let haskey = 1 + else +" call Decho('....searched for treedir<'.treedir.'/> : not found') + endif + endif + + " search treedict for treedir with any trailing / elided + if !haskey && treedir =~ '/$' + let treedir= substitute(treedir,'/$','','') + if has_key(w:netrw_treedict,treedir) +" call Decho('....searched.for treedir<'.treedir.'> found it!') + let haskey = 1 + else +" call Decho('....searched for treedir<'.treedir.'> : not found') + endif + endif + + if haskey + " close tree listing for selected subdirectory +" call Decho("closing selected subdirectory<".dirname.">") + call remove(w:netrw_treedict,treedir) +" call Decho("removed entry<".dirname."> from treedict") +" call Decho("yielding treedict<".string(w:netrw_treedict).">") + let dirname= w:netrw_treetop + else + " go down one directory + let dirname= substitute(treedir,'/*$','/','') +" call Decho("go down one dir: treedir<".treedir.">") + endif + call s:SetRexDir(a:islocal,dirname) + + else + " go down one directory + let dirname= s:ComposePath(dirname,newdir) +" call Decho("go down one dir: dirname<".dirname."> newdir<".newdir.">") + call s:SetRexDir(a:islocal,dirname) + endif + + call s:NetrwOptionRestore("s:") + if dolockout +" call Decho("doing modification lockout settings: ma nomod noro") + setlocal ma nomod noro +" call Decho("setlocal ma nomod noro") + endif + +" call Dret("s:NetrwBrowseChgDir <".dirname."> : curpos<".string(getpos(".")).">") + return dirname +endfun + +" --------------------------------------------------------------------- +" s:NetrwBrowseX: allows users to write custom functions to operate on {{{2 +" files given their extension. Passes 0=local, 1=remote +fun! netrw#NetrwBrowseX(fname,remote) +" call Dfunc("NetrwBrowseX(fname<".a:fname."> remote=".a:remote.")") + + " set up the filename + " (lower case the extension, make a local copy of a remote file) + let exten= substitute(a:fname,'.*\.\(.\{-}\)','\1','e') + if has("win32") || has("win95") || has("win64") || has("win16") + let exten= substitute(exten,'^.*$','\L&\E','') + endif + + " seems kde systems often have gnome-open due to dependencies, even though + " gnome-open's subsidiary display tools are largely absent. Kde systems + " usually have "kdeinit" running, though... (tnx Mikolaj Machowski) + if !exists("s:haskdeinit") + if has("unix") + let s:haskdeinit= system("ps -e") =~ 'kdeinit' + if v:shell_error + let s:haskdeinit = 0 + endif + else + let s:haskdeinit= 0 + endif +" call Decho("setting s:haskdeinit=".s:haskdeinit) + endif + + if a:remote == 1 + " create a local copy + let fname= fnamemodify(tempname(),":r").".".exten +" call Decho("a:remote=".a:remote.": create a local copy of <".fname."> as <".fname.">") + exe "silent keepjumps bot 1new ".fnameescape(fname) + setlocal bh=delete +" call Decho("read <".fnameescape(fname).">, now writing: exe w! ".fnameescape(fname)) + exe "silent! w! ".fnameescape(fname) + q + else + let fname= a:fname + endif +" call Decho("exten<".exten."> "."netrwFileHandlers#NFH_".exten."():exists=".exists("*netrwFileHandlers#NFH_".exten)) + + " set up redirection + if &srr =~ "%s" + if (has("win32") || has("win95") || has("win64") || has("win16")) + let redir= substitute(&srr,"%s","nul","") + else + let redir= substitute(&srr,"%s","/dev/null","") + endif + elseif (has("win32") || has("win95") || has("win64") || has("win16")) + let redir= &srr . "nul" + else + let redir= &srr . "/dev/null" + endif +" call Decho("redir{".redir."} srr{".&srr."}") + + " extract any viewing options. Assumes that they're set apart by quotes. + if exists("g:netrw_browsex_viewer") + if g:netrw_browsex_viewer =~ '\s' + let viewer = substitute(g:netrw_browsex_viewer,'\s.*$','','') + let viewopt = substitute(g:netrw_browsex_viewer,'^\S\+\s*','','')." " + let oviewer = '' + let cnt = 1 + while !executable(viewer) && viewer != oviewer + let viewer = substitute(g:netrw_browsex_viewer,'^\(\(^\S\+\s\+\)\{'.cnt.'}\S\+\)\(.*\)$','\1','') + let viewopt = substitute(g:netrw_browsex_viewer,'^\(\(^\S\+\s\+\)\{'.cnt.'}\S\+\)\(.*\)$','\3','')." " + let cnt = cnt + 1 + let oviewer = viewer +" call Decho("!exe: viewer<".viewer."> viewopt<".viewopt.">") + endwhile + else + let viewer = g:netrw_browsex_viewer + let viewopt = "" + endif +" call Decho("viewer<".viewer."> viewopt<".viewopt.">") + endif + + " execute the file handler + if exists("g:netrw_browsex_viewer") && g:netrw_browsex_viewer == '-' +" call Decho("g:netrw_browsex_viewer<".g:netrw_browsex_viewer.">") + let ret= netrwFileHandlers#Invoke(exten,fname) + + elseif exists("g:netrw_browsex_viewer") && executable(viewer) +" call Decho("g:netrw_browsex_viewer<".g:netrw_browsex_viewer.">") +" call Decho("exe silent !".viewer." ".viewopt.shellescape(fname,1).redir) + exe "silent !".viewer." ".viewopt.shellescape(fname,1).redir + let ret= v:shell_error + + elseif has("win32") || has("win64") +" call Decho('exe silent !start rundll32 url.dll,FileProtocolHandler '.shellescape(fname,1)) + exe 'silent !start rundll32 url.dll,FileProtocolHandler '.shellescape(fname,1) + call inputsave()|call input("Press <cr> to continue")|call inputrestore() + let ret= v:shell_error + + elseif has("unix") && executable("gnome-open") && !s:haskdeinit +" call Decho("exe silent !gnome-open ".shellescape(fname,1)." ".redir) + exe "silent !gnome-open ".shellescape(fname,1).redir + let ret= v:shell_error + + elseif has("unix") && executable("kfmclient") && s:haskdeinit +" call Decho("exe silent !kfmclient exec ".shellescape(fname,1)." ".redir) + exe "silent !kfmclient exec ".shellescape(fname,1)." ".redir + let ret= v:shell_error + + elseif has("macunix") && executable("open") +" call Decho("exe silent !open ".shellescape(fname,1)." ".redir) + exe "silent !open ".shellescape(fname,1)." ".redir + let ret= v:shell_error + + else + " netrwFileHandlers#Invoke() always returns 0 + let ret= netrwFileHandlers#Invoke(exten,fname) + endif + + " if unsuccessful, attempt netrwFileHandlers#Invoke() + if ret + let ret= netrwFileHandlers#Invoke(exten,fname) + endif + + " restoring redraw! after external file handlers + redraw! + + " cleanup: remove temporary file, + " delete current buffer if success with handler, + " return to prior buffer (directory listing) + " Feb 12, 2008: had to de-activiate removal of + " temporary file because it wasn't getting seen. +" if a:remote == 1 && fname != a:fname +" call Decho("deleting temporary file<".fname.">") +" call s:NetrwDelete(fname) +" endif + + if a:remote == 1 + setlocal bh=delete bt=nofile + if g:netrw_use_noswf + setlocal noswf + endif + exe "norm! \<c-o>" +" redraw! + endif + +" call Dret("NetrwBrowseX") +endfun + +" --------------------------------------------------------------------- +" netrw#Explore: launch the local browser in the directory of the current file {{{2 +" dosplit==0: the window will be split iff the current file has +" been modified +" dosplit==1: the window will be split before running the local +" browser +fun! netrw#Explore(indx,dosplit,style,...) +" call Dfunc("netrw#Explore(indx=".a:indx." dosplit=".a:dosplit." style=".a:style.",a:1<".a:1.">) &modified=".&modified." a:0=".a:0) + if !exists("b:netrw_curdir") + let b:netrw_curdir= getcwd() +" call Decho("set b:netrw_curdir<".b:netrw_curdir."> (used getcwd)") + endif + let curfile= b:netrw_curdir +" call Decho("curfile<".curfile.">") + + " save registers + silent! let keepregstar = @* + silent! let keepregplus = @+ + silent! let keepregslash= @/ + + " if dosplit or file has been modified + if a:dosplit || &modified || a:style == 6 +" call Decho("case: dosplit=".a:dosplit." modified=".&modified." a:style=".a:style) + call s:SaveWinVars() + + if a:style == 0 " Explore, Sexplore +" call Decho("style=0: Explore or Sexplore") + exe g:netrw_winsize."wincmd s" + + elseif a:style == 1 "Explore!, Sexplore! +" call Decho("style=1: Explore! or Sexplore!") + exe g:netrw_winsize."wincmd v" + + elseif a:style == 2 " Hexplore +" call Decho("style=2: Hexplore") + exe "bel ".g:netrw_winsize."wincmd s" + + elseif a:style == 3 " Hexplore! +" call Decho("style=3: Hexplore!") + exe "abo ".g:netrw_winsize."wincmd s" + + elseif a:style == 4 " Vexplore +" call Decho("style=4: Vexplore") + exe "lefta ".g:netrw_winsize."wincmd v" + + elseif a:style == 5 " Vexplore! +" call Decho("style=5: Vexplore!") + exe "rightb ".g:netrw_winsize."wincmd v" + + elseif a:style == 6 " Texplore + call s:SaveBufVars() +" call Decho("style = 6: Texplore") + tabnew + call s:RestoreBufVars() + endif + call s:RestoreWinVars() + endif + norm! 0 + + if a:0 > 0 +" call Decho("case [a:0=".a:0."]>0: a:1<".a:1.">") + if a:1 =~ '^\~' && (has("unix") || (exists("g:netrw_cygwin") && g:netrw_cygwin)) + let dirname= substitute(a:1,'\~',expand("$HOME"),'') +" call Decho("using dirname<".dirname."> (case: ~ && unix||cygwin)") + elseif a:1 == '.' + let dirname= exists("b:netrw_curdir")? b:netrw_curdir : getcwd() + if dirname !~ '/$' + let dirname= dirname."/" + endif +" call Decho("using dirname<".dirname."> (case: ".(exists("b:netrw_curdir")? "b:netrw_curdir" : "getcwd()").")") + elseif a:1 =~ '\$' + let dirname= expand(a:1) + else + let dirname= a:1 +" call Decho("using dirname<".dirname.">") + endif + else + " clear explore +" call Decho("clearing explore variables") + 2match none + if exists("s:explore_match") |unlet s:explore_match |endif + if exists("s:explore_indx") |unlet s:explore_indx |endif + if exists("s:dirstarstar") |unlet s:dirstarstar |endif + if exists("s:dirstarstar") |unlet s:dirstarstar |endif + if exists("w:netrw_explore_indx") |unlet w:netrw_explore_indx |endif + if exists("w:netrw_explore_listlen")|unlet w:netrw_explore_listlen|endif + if exists("w:netrw_explore_list") |unlet w:netrw_explore_list |endif + if exists("w:netrw_explore_bufnr") |unlet w:netrw_explore_bufnr |endif +" redraw! + echo " " + echo " " +" call Dret("netrw#Explore : cleared list") + return + endif + + if dirname =~ '/\*\*/' + " handle .../**/.../filepat +" call Decho("case Explore .../**/.../filepat") + let prefixdir= substitute(dirname,'^\(.\{-}\)\*\*.*$','\1','') + if prefixdir =~ '^/' || (prefixdir =~ '^\a:/' && (has("win32") || has("win95") || has("win64") || has("win16"))) + let b:netrw_curdir = prefixdir + else + let b:netrw_curdir= getcwd().'/'.prefixdir + endif + let dirname= substitute(dirname,'^.\{-}\(\*\*/.*\)$','\1','') + let starpat= 4; +" call Decho("pwd<".getcwd()."> dirname<".dirname.">") +" call Decho("case Explore ../**/../filepat (starpat=".starpat.")") + + elseif dirname =~ '^\*//' + " starpat=1: Explore *//pattern (current directory only search for files containing pattern) +" call Decho("case Explore *//pattern") + let pattern= substitute(dirname,'^\*//\(.*\)$','\1','') + let starpat= 1 +" call Decho("Explore *//pat: (starpat=".starpat.") dirname<".dirname."> -> pattern<".pattern.">") + if &hls | let keepregslash= s:ExplorePatHls(pattern) | endif + + elseif dirname =~ '^\*\*//' + " starpat=2: Explore **//pattern (recursive descent search for files containing pattern) +" call Decho("case Explore **//pattern") + let pattern= substitute(dirname,'^\*\*//','','') + let starpat= 2 +" call Decho("Explore **//pat: (starpat=".starpat.") dirname<".dirname."> -> pattern<".pattern.">") + + elseif dirname =~ '^\*/' + " starpat=3: Explore */filepat (search in current directory for filenames matching filepat) + let starpat= 3 +" call Decho("case Explore */filepat (starpat=".starpat.")") + + elseif dirname=~ '^\*\*/' + " starpat=4: Explore **/filepat (recursive descent search for filenames matching filepat) + let starpat= 4 +" call Decho("case Explore **/filepat (starpat=".starpat.")") + else + let starpat= 0 + endif + + if starpat == 0 && a:indx >= 0 + " [Explore Hexplore Vexplore Sexplore] [dirname] +" call Decho("case dirname<".dirname."> a:indx=".a:indx.": Explore Hexplore Vexplore Sexplore") + if dirname == "" + let dirname= substitute(expand("%:p"),'^\(.*[/\\]\)[^/\\]*$','\1','e') + endif + if dirname =~ '^scp:' || dirname =~ '^ftp:' +" call Decho("calling NetrwBrowse(0,dirname<".dirname.">)") + call s:NetrwBrowse(0,dirname) + else + if dirname == ""|let dirname= getcwd()|endif +" call Decho("calling LocalBrowseCheck(dirname<".dirname.">)") + call netrw#LocalBrowseCheck(dirname) + endif + +" call Decho("curfile<".curfile.">") + if has("win32") || has("win95") || has("win64") || has("win16") + call search('\<'.substitute(curfile,'^.*[/\\]','','e').'\>','cW') + else + call search('\<'.substitute(curfile,'^.*/','','e').'\>','cW') + endif + + " starpat=1: Explore *//pattern (current directory only search for files containing pattern) + " starpat=2: Explore **//pattern (recursive descent search for files containing pattern) + " starpat=3: Explore */filepat (search in current directory for filenames matching filepat) + " starpat=4: Explore **/filepat (recursive descent search for filenames matching filepat) + elseif a:indx <= 0 + " Nexplore, Pexplore, Explore: handle starpat +" call Decho("case Nexplore, Pexplore, <s-down>, <s-up>: starpat=".starpat." a:indx=".a:indx) + if !mapcheck("<s-up>","n") && !mapcheck("<s-down>","n") && exists("b:netrw_curdir") +" call Decho("set up <s-up> and <s-down> maps") + let s:didstarstar= 1 + nnoremap <buffer> <silent> <s-up> :Pexplore<cr> + nnoremap <buffer> <silent> <s-down> :Nexplore<cr> + endif + + if has("path_extra") +" call Decho("starpat=".starpat.": has +path_extra") + if !exists("w:netrw_explore_indx") + let w:netrw_explore_indx= 0 + endif + let indx = a:indx +" call Decho("starpat=".starpat.": set indx= [a:indx=".indx."]") +" + if indx == -1 + " Nexplore +" call Decho("case Nexplore with starpat=".starpat.": (indx=".indx.")") + if !exists("w:netrw_explore_list") " sanity check + call netrw#ErrorMsg(s:WARNING,"using Nexplore or <s-down> improperly; see help for netrw-starstar",40) + silent! let @* = keepregstar + silent! let @+ = keepregstar + silent! let @/ = keepregslash +" call Dret("netrw#Explore") + return + endif + let indx= w:netrw_explore_indx + if indx < 0 | let indx= 0 | endif + if indx >= w:netrw_explore_listlen | let indx= w:netrw_explore_listlen - 1 | endif + let curfile= w:netrw_explore_list[indx] +" call Decho("indx=".indx." curfile<".curfile.">") + while indx < w:netrw_explore_listlen && curfile == w:netrw_explore_list[indx] + let indx= indx + 1 +" call Decho("indx=".indx." (Nexplore while loop)") + endwhile + if indx >= w:netrw_explore_listlen | let indx= w:netrw_explore_listlen - 1 | endif +" call Decho("Nexplore: indx= [w:netrw_explore_indx=".w:netrw_explore_indx."]=".indx) + + elseif indx == -2 + " Pexplore +" call Decho("case Pexplore with starpat=".starpat.": (indx=".indx.")") + if !exists("w:netrw_explore_list") " sanity check + call netrw#ErrorMsg(s:WARNING,"using Pexplore or <s-up> improperly; see help for netrw-starstar",41) + silent! let @* = keepregstar + silent! let @+ = keepregstar + silent! let @/ = keepregslash +" call Dret("netrw#Explore") + return + endif + let indx= w:netrw_explore_indx + if indx < 0 | let indx= 0 | endif + if indx >= w:netrw_explore_listlen | let indx= w:netrw_explore_listlen - 1 | endif + let curfile= w:netrw_explore_list[indx] +" call Decho("indx=".indx." curfile<".curfile.">") + while indx >= 0 && curfile == w:netrw_explore_list[indx] + let indx= indx - 1 +" call Decho("indx=".indx." (Pexplore while loop)") + endwhile + if indx < 0 | let indx= 0 | endif +" call Decho("Pexplore: indx= [w:netrw_explore_indx=".w:netrw_explore_indx."]=".indx) + + else + " Explore -- initialize + " build list of files to Explore with Nexplore/Pexplore +" call Decho("starpat=".starpat.": case Explore: initialize (indx=".indx.")") + let w:netrw_explore_indx= 0 + if !exists("b:netrw_curdir") + let b:netrw_curdir= getcwd() + endif +" call Decho("starpat=".starpat.": b:netrw_curdir<".b:netrw_curdir.">") + + " switch on starpat to build the w:netrw_explore_list of files + if starpat == 1 + " starpat=1: Explore *//pattern (current directory only search for files containing pattern) +" call Decho("starpat=".starpat.": build *//pattern list") + exe "vimgrep /".pattern."/gj ".fnameescape(b:netrw_curdir)."/*" + let w:netrw_explore_list = map(getqflist(),'bufname(v:val.bufnr)') + if &hls | let keepregslash= s:ExplorePatHls(pattern) | endif + + elseif starpat == 2 + " starpat=2: Explore **//pattern (recursive descent search for files containing pattern) +" call Decho("starpat=".starpat.": build **//pattern list") + try + exe "silent vimgrep /".pattern."/gj "."**/*" + catch /^Vim\%((\a\+)\)\=:E480/ + call netrw#ErrorMsg(s:WARNING,'no files matched pattern<'.pattern.'>',45) + if &hls | let keepregslash= s:ExplorePatHls(pattern) | endif + silent! let @* = keepregstar + silent! let @+ = keepregstar + silent! let @/ = keepregslash +" call Dret("netrw#Explore : no files matched pattern") + return + endtry + let s:netrw_curdir = b:netrw_curdir + let w:netrw_explore_list = getqflist() + let w:netrw_explore_list = map(w:netrw_explore_list,'s:netrw_curdir."/".bufname(v:val.bufnr)') + + elseif starpat == 3 + " starpat=3: Explore */filepat (search in current directory for filenames matching filepat) +" call Decho("starpat=".starpat.": build */filepat list") + let dirname = substitute(dirname,'^\*/','','') + if dirname !~ '\$*?[' && (!filereadable(dirname) || !filewritable(dirname)) +" call Dret("netrw#Explore : no files matched pattern") + call netrw#ErrorMsg(s:NOTE,"no files matched Explore pattern",72) + return + endif + let w:netrw_explore_list= split(expand(b:netrw_curdir."/".dirname),'\n') + if &hls | let keepregslash= s:ExplorePatHls(dirname) | endif + + elseif starpat == 4 + " starpat=4: Explore **/filepat (recursive descent search for filenames matching filepat) +" call Decho("starpat=".starpat.": build **/filepat list") + let w:netrw_explore_list= split(expand(b:netrw_curdir."/".dirname),'\n') + if &hls | let keepregslash= s:ExplorePatHls(dirname) | endif + endif " switch on starpat to build w:netrw_explore_list + + let w:netrw_explore_listlen = len(w:netrw_explore_list) +" call Decho("w:netrw_explore_list<".string(w:netrw_explore_list).">") +" call Decho("w:netrw_explore_listlen=".w:netrw_explore_listlen) + + if w:netrw_explore_listlen == 0 || (w:netrw_explore_listlen == 1 && w:netrw_explore_list[0] =~ '\*\*\/') + call netrw#ErrorMsg(s:WARNING,"no files matched",42) + silent! let @* = keepregstar + silent! let @+ = keepregstar + silent! let @/ = keepregslash +" call Dret("netrw#Explore : no files matched") + return + endif + endif " if indx ... endif + + " NetrwStatusLine support - for exploring support + let w:netrw_explore_indx= indx +" call Decho("explorelist<".join(w:netrw_explore_list,',')."> len=".w:netrw_explore_listlen) + + " wrap the indx around, but issue a note + if indx >= w:netrw_explore_listlen || indx < 0 +" call Decho("wrap indx (indx=".indx." listlen=".w:netrw_explore_listlen.")") + let indx = (indx < 0)? ( w:netrw_explore_listlen - 1 ) : 0 + let w:netrw_explore_indx= indx + call netrw#ErrorMsg(s:NOTE,"no more files match Explore pattern",43) + endif + + exe "let dirfile= w:netrw_explore_list[".indx."]" +" call Decho("dirfile=w:netrw_explore_list[indx=".indx."]= <".dirfile.">") + let newdir= substitute(dirfile,'/[^/]*$','','e') +" call Decho("newdir<".newdir.">") + +" call Decho("calling LocalBrowseCheck(newdir<".newdir.">)") + call netrw#LocalBrowseCheck(newdir) + if !exists("w:netrw_liststyle") + let w:netrw_liststyle= g:netrw_liststyle + endif + if w:netrw_liststyle == s:THINLIST || w:netrw_liststyle == s:LONGLIST + call search('^'.substitute(dirfile,"^.*/","","").'\>',"W") + else + call search('\<'.substitute(dirfile,"^.*/","","").'\>',"w") + endif + let w:netrw_explore_mtchcnt = indx + 1 + let w:netrw_explore_bufnr = bufnr("%") + let w:netrw_explore_line = line(".") + call s:SetupNetrwStatusLine('%f %h%m%r%=%9*%{NetrwStatusLine()}') +" call Decho("explore: mtchcnt=".w:netrw_explore_mtchcnt." bufnr=".w:netrw_explore_bufnr." line#".w:netrw_explore_line) + + else +" call Decho("your vim does not have +path_extra") + if !exists("g:netrw_quiet") + call netrw#ErrorMsg(s:WARNING,"your vim needs the +path_extra feature for Exploring with **!",44) + endif + silent! let @* = keepregstar + silent! let @+ = keepregstar + silent! let @/ = keepregslash +" call Dret("netrw#Explore : missing +path_extra") + return + endif + + else +" call Decho("case Explore newdir<".dirname.">") + if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && dirname =~ '/' + silent! unlet w:netrw_treedict + silent! unlet w:netrw_treetop + endif + let newdir= dirname + if !exists("b:netrw_curdir") + call netrw#LocalBrowseCheck(getcwd()) + else + call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,newdir)) + endif + endif + + " visual display of **/ **// */ Exploration files + if exists("w:netrw_explore_indx") && exists("b:netrw_curdir") + if !exists("s:explore_prvdir") || s:explore_prvdir != b:netrw_curdir + " only update match list if current directory isn't the same as before + let s:explore_prvdir = b:netrw_curdir + let s:explore_match = "" + let dirlen = strlen(b:netrw_curdir) + if b:netrw_curdir !~ '/$' + let dirlen= dirlen + 1 + endif + let prvfname= "" + for fname in w:netrw_explore_list +" call Decho("fname<".fname.">") + if fname =~ '^'.b:netrw_curdir + if s:explore_match == "" + let s:explore_match= '\<'.escape(strpart(fname,dirlen),g:netrw_markfileesc."'".g:netrw_markfileesc."'").'\>' + else + let s:explore_match= s:explore_match.'\|\<'.escape(strpart(fname,dirlen),g:netrw_markfileesc."'".g:netrw_markfileesc."'").'\>' + endif + elseif fname !~ '^/' && fname != prvfname + if s:explore_match == "" + let s:explore_match= '\<'.escape(fname,g:netrw_markfileesc."'".g:netrw_markfileesc."'").'\>' + else + let s:explore_match= s:explore_match.'\|\<'.escape(fname,g:netrw_markfileesc."'".g:netrw_markfileesc."'").'\>' + endif + endif + let prvfname= fname + endfor +" call Decho("explore_match<".s:explore_match.">") + exe "2match netrwMarkFile /".s:explore_match."/" + endif + echo "<s-up>==Pexplore <s-down>==Nexplore" + else + 2match none + if exists("s:explore_match") | unlet s:explore_match | endif + if exists("s:explore_prvdir") | unlet s:explore_prvdir | endif + echo " " +" call Decho("cleared explore match list") + endif + + silent! let @* = keepregstar + silent! let @+ = keepregstar + silent! let @/ = keepregslash +" call Dret("netrw#Explore : @/<".@/.">") +endfun + +" --------------------------------------------------------------------- +" s:NetrwHide: this function is invoked by the "a" map for browsing {{{2 +" and switches the hiding mode. The actual hiding is done by +" s:NetrwListHide(). +" g:netrw_hide= 0: show all +" 1: show not-hidden files +" 2: show hidden files only +fun! s:NetrwHide(islocal) +" call Dfunc("NetrwHide(islocal=".a:islocal.") g:netrw_hide=".g:netrw_hide) + let svpos= netrw#NetrwSavePosn() + + if exists("s:netrwmarkfilelist_{bufnr('%')}") +" call Decho(((g:netrw_hide == 1)? "unhide" : "hide")." files in markfilelist<".string(s:netrwmarkfilelist_{bufnr("%")}).">") +" call Decho("g:netrw_list_hide<".g:netrw_list_hide.">") + + " hide the files in the markfile list + for fname in s:netrwmarkfilelist_{bufnr("%")} +" call Decho("match(g:netrw_list_hide<".g:netrw_list_hide.'> fname<\<'.fname.'\>>)='.match(g:netrw_list_hide,'\<'.fname.'\>')." isk=".&isk) + if match(g:netrw_list_hide,'\<'.fname.'\>') != -1 + " remove fname from hiding list + let g:netrw_list_hide= substitute(g:netrw_list_hide,'..\<'.escape(fname,g:netrw_fname_escape).'\>..','','') + let g:netrw_list_hide= substitute(g:netrw_list_hide,',,',',','g') + let g:netrw_list_hide= substitute(g:netrw_list_hide,'^,\|,$','','') +" call Decho("unhide: g:netrw_list_hide<".g:netrw_list_hide.">") + else + " append fname to hiding list + if exists("g:netrw_list_hide") && g:netrw_list_hide != "" + let g:netrw_list_hide= g:netrw_list_hide.',\<'.escape(fname,g:netrw_fname_escape).'\>' + else + let g:netrw_list_hide= '\<'.escape(fname,g:netrw_fname_escape).'\>' + endif +" call Decho("hide: g:netrw_list_hide<".g:netrw_list_hide.">") + endif + endfor + call s:NetrwUnmarkList(bufnr("%"),b:netrw_curdir) + let g:netrw_hide= 1 + + else + + " switch between show-all/show-not-hidden/show-hidden + let g:netrw_hide=(g:netrw_hide+1)%3 + exe "norm! 0" + if g:netrw_hide && g:netrw_list_hide == "" + call netrw#ErrorMsg(s:WARNING,"your hiding list is empty!",49) +" call Dret("NetrwHide") + return + endif + endif + + call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./')) + call netrw#NetrwRestorePosn(svpos) +" call Dret("NetrwHide") +endfun + +" --------------------------------------------------------------------- +" s:NetrwHidden: invoked by "gh" {{{2 +fun! s:NetrwHidden(islocal) +" call Dfunc("s:NetrwHidden()") + " save current position + let svpos= netrw#NetrwSavePosn() + + if g:netrw_list_hide =~ '\(^\|,\)\\(^\\|\\s\\s\\)\\zs\\.\\S\\+' + " remove pattern from hiding list + let g:netrw_list_hide= substitute(g:netrw_list_hide,'\(^\|,\)\\(^\\|\\s\\s\\)\\zs\\.\\S\\+','','') + elseif strlen(g:netrw_list_hide) >= 1 + let g:netrw_list_hide= g:netrw_list_hide . ',\(^\|\s\s\)\zs\.\S\+' + else + let g:netrw_list_hide= '\(^\|\s\s\)\zs\.\S\+' + endif + + " refresh screen and return to saved position + call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./')) + call netrw#NetrwRestorePosn(svpos) +" call Dret("s:NetrwHidden") +endfun + +" --------------------------------------------------------------------- +" s:NetrwLeftmouse: handles the <leftmouse> when in a netrw browsing window {{{2 +fun! s:NetrwLeftmouse(islocal) +" call Dfunc("s:NetrwLeftmouse(islocal=".a:islocal.")") + if a:islocal + if exists("b:netrw_curdir") + call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,s:NetrwGetWord())) + endif + else + if exists("b:netrw_curdir") + call s:NetrwBrowse(0,s:NetrwBrowseChgDir(0,s:NetrwGetWord())) + endif + endif +" call Dret("s:NetrwLeftmouse") +endfun + +" --------------------------------------------------------------------- +" s:NetrwListHide: uses [range]g~...~d to delete files that match comma {{{2 +" separated patterns given in g:netrw_list_hide +fun! s:NetrwListHide() +" call Dfunc("NetrwListHide() hide=".g:netrw_hide." listhide<".g:netrw_list_hide.">") + + " find a character not in the "hide" string to use as a separator for :g and :v commands + " How-it-works: take the hiding command, convert it into a range. Duplicate + " characters don't matter. Remove all such characters from the '/~...90' + " string. Use the first character left as a separator character. + let listhide= g:netrw_list_hide + let sep = strpart(substitute('/~@#$%^&*{};:,<.>?|1234567890','['.escape(listhide,'-]^\').']','','ge'),1,1) +" call Decho("sep=".sep) + + while listhide != "" + if listhide =~ ',' + let hide = substitute(listhide,',.*$','','e') + let listhide = substitute(listhide,'^.\{-},\(.*\)$','\1','e') + else + let hide = listhide + let listhide = "" + endif + + " Prune the list by hiding any files which match + if g:netrw_hide == 1 +" call Decho("hiding<".hide."> listhide<".listhide.">") + exe 'silent keepjumps '.w:netrw_bannercnt.',$g'.sep.hide.sep.'d' + elseif g:netrw_hide == 2 +" call Decho("showing<".hide."> listhide<".listhide.">") + exe 'silent keepjumps '.w:netrw_bannercnt.',$g'.sep.hide.sep.'s@^@ /-KEEP-/ @' + endif + endwhile + if g:netrw_hide == 2 + exe 'silent keepjumps '.w:netrw_bannercnt.',$v@^ /-KEEP-/ @d' + exe 'silent keepjumps '.w:netrw_bannercnt.',$s@^\%( /-KEEP-/ \)\+@@e' + endif + +" call Dret("NetrwListHide") +endfun + +" --------------------------------------------------------------------- +" NetrwHideEdit: allows user to edit the file/directory hiding list +fun! s:NetrwHideEdit(islocal) +" call Dfunc("NetrwHideEdit(islocal=".a:islocal.")") + + " save current cursor position + let svpos= netrw#NetrwSavePosn() + + " get new hiding list from user + call inputsave() + let newhide= input("Edit Hiding List: ",g:netrw_list_hide) + call inputrestore() + let g:netrw_list_hide= newhide +" call Decho("new g:netrw_list_hide<".g:netrw_list_hide.">") + + " refresh the listing + silent call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,"./")) + + " restore cursor position + call netrw#NetrwRestorePosn(svpos) + +" call Dret("NetrwHideEdit") +endfun + +" --------------------------------------------------------------------- +" NetSortSequence: allows user to edit the sorting sequence +fun! s:NetSortSequence(islocal) +" call Dfunc("NetSortSequence(islocal=".a:islocal.")") + + let svpos= netrw#NetrwSavePosn() + call inputsave() + let newsortseq= input("Edit Sorting Sequence: ",g:netrw_sort_sequence) + call inputrestore() + + " refresh the listing + let g:netrw_sort_sequence= newsortseq + call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./')) + call netrw#NetrwRestorePosn(svpos) + +" call Dret("NetSortSequence") +endfun + +" --------------------------------------------------------------------- +" s:NetrwMakeDir: this function makes a directory (both local and remote) {{{2 +fun! s:NetrwMakeDir(usrhost) +" call Dfunc("NetrwMakeDir(usrhost<".a:usrhost.">)") + + " get name of new directory from user. A bare <CR> will skip. + " if its currently a directory, also request will be skipped, but with + " a message. + call inputsave() + let newdirname= input("Please give directory name: ") + call inputrestore() +" call Decho("newdirname<".newdirname.">") + + if newdirname == "" +" call Dret("NetrwMakeDir : user aborted with bare <cr>") + return + endif + + if a:usrhost == "" +" call Decho("local mkdir") + + " Local mkdir: + " sanity checks + let fullnewdir= b:netrw_curdir.'/'.newdirname +" call Decho("fullnewdir<".fullnewdir.">") + if isdirectory(fullnewdir) + if !exists("g:netrw_quiet") + call netrw#ErrorMsg(s:WARNING,"<".newdirname."> is already a directory!",24) + endif +" call Dret("NetrwMakeDir : directory<".newdirname."> exists previously") + return + endif + if s:FileReadable(fullnewdir) + if !exists("g:netrw_quiet") + call netrw#ErrorMsg(s:WARNING,"<".newdirname."> is already a file!",25) + endif +" call Dret("NetrwMakeDir : file<".newdirname."> exists previously") + return + endif + + " requested new local directory is neither a pre-existing file or + " directory, so make it! + if exists("*mkdir") + call mkdir(fullnewdir,"p") + else + let netrw_origdir= s:NetrwGetcwd(1) + exe 'keepjumps lcd '.fnameescape(b:netrw_curdir) +" call Decho("netrw_origdir<".netrw_origdir.">: lcd b:netrw_curdir<".fnameescape(b:netrw_curdir).">") +" call Decho("exe silent! !".g:netrw_local_mkdir.' '.shellescape(newdirname,1)) + exe "silent! !".g:netrw_local_mkdir.' '.shellescape(newdirname,1) + if !g:netrw_keepdir + exe 'keepjumps lcd '.fnameescape(netrw_origdir) +" call Decho("netrw_keepdir=".g:netrw_keepdir.": keepjumps lcd ".fnameescape(netrw_origdir)." getcwd<".getcwd().">") + endif + endif + + if v:shell_error == 0 + " refresh listing +" call Decho("refresh listing") + let svpos= netrw#NetrwSavePosn() + call s:NetrwRefresh(1,s:NetrwBrowseChgDir(1,'./')) + call netrw#NetrwRestorePosn(svpos) + elseif !exists("g:netrw_quiet") + call netrw#ErrorMsg(s:ERROR,"unable to make directory<".newdirname.">",26) + endif +" redraw! + + elseif !exists("b:netrw_method") || b:netrw_method == 4 + " Remote mkdir: +" call Decho("remote mkdir") + let mkdircmd = s:MakeSshCmd(g:netrw_mkdir_cmd) + let newdirname= substitute(b:netrw_curdir,'^\%(.\{-}/\)\{3}\(.*\)$','\1','').newdirname +" call Decho("exe silent! !".mkdircmd." ".shellescape(newdirname,1)) + exe "silent! !".mkdircmd." ".shellescape(newdirname,1) + if v:shell_error == 0 + " refresh listing + let svpos= netrw#NetrwSavePosn() + call s:NetrwRefresh(0,s:NetrwBrowseChgDir(0,'./')) + call netrw#NetrwRestorePosn(svpos) + elseif !exists("g:netrw_quiet") + call netrw#ErrorMsg(s:ERROR,"unable to make directory<".newdirname.">",27) + endif +" redraw! + + elseif b:netrw_method == 2 + " COMBAK -- future work + call netrw#ErrorMsg(s:ERROR,"making directories via ftp not currently supported",68) + elseif b:netrw_method == 3 + " COMBAK -- future work + call netrw#ErrorMsg(s:ERROR,"making directories via ftp not currently supported",68) + endif + +" call Dret("NetrwMakeDir") +endfun + +" --------------------------------------------------------------------- +" s:NetrwMarkFile: (invoked by mf) This function is used to both {{{2 +" mark and unmark files. If a markfile list exists, +" then the rename and delete functions will use it instead +" of whatever may happen to be under the cursor at that +" moment. When the mouse and gui are available, +" shift-leftmouse may also be used to mark files. +" +" Creates two lists +" s:netrwmarkfilelist -- holds complete paths to all marked files +" s:netrwmarkfilelist_# -- holds list of marked files in current-buffer's directory (#==bufnr()) +" +" Creates a marked file match string +" s:netrwmarfilemtch_# -- used with 2match to display marked files +" +" Creates a buffer version of islocal +" b:netrw_islocal +" +fun! s:NetrwMarkFile(islocal,fname) +" call Dfunc("s:NetrwMarkFile(islocal=".a:islocal." fname<".a:fname.">)") + let curbufnr= bufnr("%") + let curdir = b:netrw_curdir + if exists("s:netrwmarkfilelist_{curbufnr}") + " markfile list exists +" call Decho("starting s:netrwmarkfilelist_{curbufnr}<".string(s:netrwmarkfilelist_{curbufnr}).">") +" call Decho("starting s:netrwmarkfilemtch_{curbufnr}<".s:netrwmarkfilemtch_{curbufnr}.">") + let b:netrw_islocal= a:islocal + + if index(s:netrwmarkfilelist_{curbufnr},a:fname) == -1 + " append filename to buffer's markfilelist +" call Decho("append filename<".a:fname."> to local markfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}).">") + call add(s:netrwmarkfilelist_{curbufnr},a:fname) + let s:netrwmarkfilemtch_{curbufnr}= s:netrwmarkfilemtch_{curbufnr}.'\|\<'.escape(a:fname,g:netrw_markfileesc."'".g:netrw_markfileesc."'").'\>' + + else + " remove filename from buffer's markfilelist +" call Decho("remove filename<".a:fname."> from local markfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}).">") + call filter(s:netrwmarkfilelist_{curbufnr},'v:val != a:fname') + if s:netrwmarkfilelist_{curbufnr} == [] + " local markfilelist is empty; remove it entirely +" call Decho("markfile list now empty") + call s:NetrwUnmarkList(curbufnr,curdir) + else + " rebuild match list to display markings correctly +" call Decho("rebuild s:netrwmarkfilemtch_".curbufnr) + let s:netrwmarkfilemtch_{curbufnr}= "" + let first = 1 + for fname in s:netrwmarkfilelist_{curbufnr} + if first + let s:netrwmarkfilemtch_{curbufnr}= s:netrwmarkfilemtch_{curbufnr}.'\<'.escape(fname,g:netrw_markfileesc."'".g:netrw_markfileesc."'").'\>' + else + let s:netrwmarkfilemtch_{curbufnr}= s:netrwmarkfilemtch_{curbufnr}.'\|\<'.escape(fname,g:netrw_markfileesc."'".g:netrw_markfileesc."'").'\>' + endif + let first= 0 + endfor +" call Decho("ending s:netrwmarkfilelist_"curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}).">") +" call Decho("ending s:netrwmarkfilemtch_"curbufnr."<".s:netrwmarkfilemtch_{curbufnr}.">") + endif + endif + + else + " initialize new markfilelist + +" call Decho("add fname<".a:fname."> to new markfilelist_".curbufnr) + let s:netrwmarkfilelist_{curbufnr}= [] + call add(s:netrwmarkfilelist_{curbufnr},a:fname) +" call Decho("ending s:netrwmarkfilelist_{curbufnr}<".string(s:netrwmarkfilelist_{curbufnr}).">") + + " build initial markfile matching pattern + if a:fname =~ '/$' + let s:netrwmarkfilemtch_{curbufnr}= '\<'.escape(a:fname,g:netrw_markfileesc) + else + let s:netrwmarkfilemtch_{curbufnr}= '\<'.escape(a:fname,g:netrw_markfileesc).'\>' + endif +" call Decho("ending s:netrwmarkfilemtch_".curbufnr."<".s:netrwmarkfilemtch_{curbufnr}.">") + endif + + " handle global markfilelist + if exists("s:netrwmarkfilelist") + let dname= s:ComposePath(b:netrw_curdir,a:fname) + if index(s:netrwmarkfilelist,dname) == -1 + " append new filename to global markfilelist + call add(s:netrwmarkfilelist,s:ComposePath(b:netrw_curdir,a:fname)) +" call Decho("append filename<".a:fname."> to global markfilelist<".string(s:netrwmarkfilelist).">") + else + " remove new filename from global markfilelist +" call Decho("filter(".string(s:netrwmarkfilelist).",'v:val != '.".dname.")") + call filter(s:netrwmarkfilelist,'v:val != "'.dname.'"') +" call Decho("ending s:netrwmarkfilelist <".string(s:netrwmarkfilelist).">") + if s:netrwmarkfilelist == [] + unlet s:netrwmarkfilelist + endif + endif + else + " initialize new global-directory markfilelist + let s:netrwmarkfilelist= [] + call add(s:netrwmarkfilelist,s:ComposePath(b:netrw_curdir,a:fname)) +" call Decho("init s:netrwmarkfilelist<".string(s:netrwmarkfilelist).">") + endif + + " set up 2match'ing to netrwmarkfilemtch list + if exists("s:netrwmarkfilemtch_{curbufnr}") && s:netrwmarkfilemtch_{curbufnr} != "" +" call Decho("exe 2match netrwMarkFile /".s:netrwmarkfilemtch_{curbufnr}."/") + exe "2match netrwMarkFile /".s:netrwmarkfilemtch_{curbufnr}."/" + else +" call Decho("2match none") + 2match none + endif +" call Dret("s:NetrwMarkFile : netrwmarkfilelist_".curbufnr."<".(exists("s:netrwmarkfilelist_{curbufnr}")? string(s:netrwmarkfilelist_{curbufnr}) : " doesn't exist").">") +endfun + +" --------------------------------------------------------------------- +" s:NetrwMarkFileCompress: (invoked by mz) This function is used to {{{2 +" compress/decompress files using the programs +" in g:netrw_compress and g:netrw_uncompress, +" using g:netrw_compress_suffix to know which to +" do. By default: +" g:netrw_compress = "gzip" +" g:netrw_decompress = { ".gz" : "gunzip" , ".bz2" : "bunzip2" , ".zip" : "unzip" , ".tar" : "tar -xf"} +fun! s:NetrwMarkFileCompress(islocal) +" call Dfunc("s:NetrwMarkFileCompress(islocal=".a:islocal.")") + let svpos = netrw#NetrwSavePosn() + let curdir = b:netrw_curdir + let curbufnr = bufnr("%") + + if exists("s:netrwmarkfilelist_{curbufnr}") && exists("g:netrw_compress") && exists("g:netrw_decompress") + for fname in s:netrwmarkfilelist_{curbufnr} + " for every filename in the marked list + for sfx in sort(keys(g:netrw_decompress)) + if fname =~ '\'.sfx.'$' + " fname has a suffix indicating that its compressed; apply associated decompression routine + let exe= s:WinPath(g:netrw_decompress[sfx]) +" call Decho("fname<".fname."> is compressed so decompress with <".exe.">") + if a:islocal + if g:netrw_keepdir + let fname= shellescape(s:ComposePath(curdir,fname)) + endif + else + let fname= shellescape(b:netrw_curdir.fname,1) + endif + if executable(exe) + if a:islocal + call system(exe." ".fname) + else + call s:RemoteSystem(exe." ".fname) + endif + else + call netrw#ErrorMsg(s:WARNING,"unable to apply<".exe."> to file<".fname.">",50) + endif + break + endif + endfor + if exists("exe") + unlet exe + elseif a:islocal + " fname not a compressed file, so compress it + call system(s:WinPath(g:netrw_compress)." ".shellescape(s:ComposePath(b:netrw_curdir,fname))) + else + " fname not a compressed file, so compress it + call s:RemoteSystem(s:WinPath(g:netrw_compress)." ".shellescape(fname)) + endif + endfor + call s:NetrwUnmarkList(curbufnr,curdir) + call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./')) + call netrw#NetrwRestorePosn(svpos) + endif +" call Dret("s:NetrwMarkFileCompress") +endfun + +" --------------------------------------------------------------------- +" s:NetrwMarkFileCopy: (invoked by mc) copy marked files to target {{{2 +" If no marked files, then set up directory as the +" target. Currently does not support copying entire +" directories. Uses the local-buffer marked file list. +" Returns 1=success (used by NetrwMarkFileMove()) +" 0=failure +fun! s:NetrwMarkFileCopy(islocal) +" call Dfunc("s:NetrwMarkFileCopy(islocal=".a:islocal.") target<".(exists("s:netrwmftgt")? s:netrwmftgt : '---').">") + + " sanity checks + if !exists("s:netrwmarkfilelist_{bufnr('%')}") || empty(s:netrwmarkfilelist_{bufnr('%')}) + call netrw#ErrorMsg(2,"there are no marked files in this window (:help netrw-mf)",66) +" call Dret("s:NetrwMarkFileCopy 0") + return 0 + endif +" call Decho("sanity chk passed: s:netrwmarkfilelist_".bufnr('%')."<".string(s:netrwmarkfilelist_{bufnr('%')})) + if !exists("s:netrwmftgt") + call netrw#ErrorMsg(2,"your marked file target is empty! (:help netrw-mt)",67) +" call Dret("s:NetrwMarkFileCopy 0") + return 0 + endif +" call Decho("sanity chk passed: s:netrwmftgt<".s:netrwmftgt.">") + let curdir = b:netrw_curdir + let curbufnr = bufnr("%") + + if a:islocal && s:netrwmftgt_islocal + " Copy marked files, local directory to local directory +" call Decho("copy from local to local") + let args= join(map(deepcopy(s:netrwmarkfilelist_{bufnr('%')}),"shellescape(b:netrw_curdir.\"/\".v:val)")) +" call Decho("system(".g:netrw_localcopycmd." ".args." ".shellescape(s:netrwmftgt).")") + call system(s:WinPath(g:netrw_localcopycmd)." ".args." ".shellescape(s:netrwmftgt)) + + elseif a:islocal && !s:netrwmftgt_islocal + " Copy marked files, local directory to remote directory +" call Decho("copy from local to remote") + call s:NetrwUpload(s:netrwmarkfilelist_{bufnr('%')},s:netrwmftgt) + + elseif !a:islocal && s:netrwmftgt_islocal +" call Decho("copy from remote to local") + call netrw#NetrwObtain(a:islocal,s:netrwmarkfilelist_{bufnr('%')},s:netrwmftgt) + + elseif !a:islocal && !s:netrwmftgt_islocal +" call Decho("copy from remote to remote") + let curdir = getcwd() + let tmpdir = s:GetTempfile("") + if tmpdir !~ '/' + let tmpdir= curdir."/".tmpdir + endif + if exists("*mkdir") + call mkdir(tmpdir) + else + exe "silent! !".g:netrw_local_mkdir.' '.shellescape(tmpdir,1) + endif + if isdirectory(tmpdir) + exe "keepjumps lcd ".fnameescape(tmpdir) + call netrw#NetrwObtain(a:islocal,s:netrwmarkfilelist_{bufnr('%')},tmpdir) + let localfiles= map(deepcopy(s:netrwmarkfilelist_{bufnr('%')}),'substitute(v:val,"^.*/","","")') + call s:NetrwUpload(localfiles,s:netrwmftgt) + if getcwd() == tmpdir + for fname in s:netrwmarkfilelist_{bufnr('%')} + call s:NetrwDelete(fname) + endfor + exe "keepjumps lcd ".fnameescape(curdir) + exe "silent !".g:netrw_local_rmdir." ".shellescape(tmpdir,1) + else + exe "keepjumps lcd ".fnameescape(curdir) + endif + endif + endif + + " ------- + " cleanup + " ------- +" call Decho("cleanup") + + " remove markings from local buffer + call s:NetrwUnmarkList(curbufnr,curdir) + + " refresh buffers + if !s:netrwmftgt_islocal + call s:NetrwRefreshDir(s:netrwmftgt_islocal,s:netrwmftgt) + endif + if a:islocal + call s:NetrwRefreshDir(a:islocal,b:netrw_curdir) + endif + call s:LocalBrowseShellCmdRefresh() + +" call Dret("s:NetrwMarkFileCopy 1") + return 1 +endfun + +" --------------------------------------------------------------------- +" s:NetrwMarkFileDiff: (invoked by md) This function is used to {{{2 +" invoke vim's diff mode on the marked files. +" Either two or three files can be so handled. +" Uses the global marked file list. +fun! s:NetrwMarkFileDiff(islocal) +" call Dfunc("s:NetrwMarkFileDiff(islocal=".a:islocal.") b:netrw_curdir<".b:netrw_curdir.">") + let curbufnr= bufnr("%") + + if exists("s:netrwmarkfilelist_{curbufnr}") + let cnt = 0 + let curdir = b:netrw_curdir + for fname in s:netrwmarkfilelist + let cnt= cnt + 1 + if cnt == 1 +" call Decho("diffthis: fname<".fname.">") + exe "e ".fnameescape(fname) + diffthis + elseif cnt == 2 || cnt == 3 + vsplit + wincmd l +" call Decho("diffthis: ".fname) + exe "e ".fnameescape(fname) + diffthis + else + break + endif + endfor + call s:NetrwUnmarkList(curbufnr,curdir) + endif + +" call Dret("s:NetrwMarkFileDiff") +endfun + +" --------------------------------------------------------------------- +" s:NetrwMarkFileEdit: (invoked by me) put marked files on arg list and start editing them {{{2 +" Uses global markfilelist +fun! s:NetrwMarkFileEdit(islocal) +" call Dfunc("s:NetrwMarkFileEdit(islocal=".a:islocal.")") + + let curdir = b:netrw_curdir + let curbufnr = bufnr("%") + if exists("s:netrwmarkfilelist_{curbufnr}") + call s:SetRexDir(a:islocal,curdir) + let flist= join(map(deepcopy(s:netrwmarkfilelist), "fnameescape(v:val)")) + " unmark markedfile list +" call s:NetrwUnmarkList(curbufnr,curdir) + call s:NetrwUnmarkAll() +" call Decho("exe silent args ".flist) + exe "silent args ".flist + endif + +" call Dret("s:NetrwMarkFileEdit") +endfun + +" --------------------------------------------------------------------- +" s:NetrwMarkFileExe: (invoked by mx) execute arbitrary command on marked files, one at a time {{{2 +" Uses the local marked-file list. +fun! s:NetrwMarkFileExe(islocal) +" call Dfunc("s:NetrwMarkFileExe(islocal=".a:islocal.")") + let svpos = netrw#NetrwSavePosn() + let curdir = b:netrw_curdir + let curbufnr = bufnr("%") + + if exists("s:netrwmarkfilelist_{curbufnr}") + " get the command + call inputsave() + let cmd= input("Enter command: ","","file") + call inputrestore() +" call Decho("cmd<".cmd.">") + + " apply command to marked files. Substitute: filename -> % + " If no %, then append a space and the filename to the command + for fname in s:netrwmarkfilelist_{curbufnr} + if a:islocal + if g:netrw_keepdir + let fname= shellescape(s:WinPath(s:ComposePath(curdir,fname))) + endif + else + let fname= shellescape(s:WinPath(b:netrw_curdir.fname)) + endif + if cmd =~ '%' + let xcmd= substitute(cmd,'%',fname,'g') + else + let xcmd= cmd.' '.fname + endif + if a:islocal +" call Decho("local: xcmd<".xcmd.">") + let ret= system(xcmd) + else +" call Decho("remote: xcmd<".xcmd.">") + let ret= s:RemoteSystem(xcmd) + endif + if v:shell_error < 0 + call netrw#ErrorMsg(s:ERROR,"command<".xcmd."> failed, aborting",54) + break + else + echo ret + endif + endfor + + " unmark marked file list + call s:NetrwUnmarkList(curbufnr,curdir) + + " refresh the listing + call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./')) + call netrw#NetrwRestorePosn(svpos) + else + call netrw#ErrorMsg(s:ERROR,"no files marked!",59) + endif + +" call Dret("s:NetrwMarkFileExe") +endfun + +" --------------------------------------------------------------------- +" s:NetrwMarkHideSfx: (invoked by mh) (un)hide files having same suffix +" as the marked file(s) (toggles suffix presence) +" Uses the local marked file list. +fun! s:NetrwMarkHideSfx(islocal) +" call Dfunc("s:NetrwMarkHideSfx(islocal=".a:islocal.")") + let svpos = netrw#NetrwSavePosn() + let curbufnr = bufnr("%") + + " s:netrwmarkfilelist_{curbufnr}: the List of marked files + if exists("s:netrwmarkfilelist_{curbufnr}") + + for fname in s:netrwmarkfilelist_{curbufnr} +" call Decho("s:NetrwMarkFileCopy: fname<".fname.">") + " construct suffix pattern + if fname =~ '\.' + let sfxpat= "^.*".substitute(fname,'^.*\(\.[^. ]\+\)$','\1','') + else + let sfxpat= '^\%(\%(\.\)\@!.\)*$' + endif + " determine if its in the hiding list or not + let inhidelist= 0 + if g:netrw_list_hide != "" + let itemnum = 0 + let hidelist= split(g:netrw_list_hide,',') + for hidepat in hidelist + if sfxpat == hidepat + let inhidelist= 1 + break + endif + let itemnum= itemnum + 1 + endfor + endif +" call Decho("fname<".fname."> inhidelist=".inhidelist." sfxpat<".sfxpat.">") + if inhidelist + " remove sfxpat from list + call remove(hidelist,itemnum) + let g:netrw_list_hide= join(hidelist,",") + elseif g:netrw_list_hide != "" + " append sfxpat to non-empty list + let g:netrw_list_hide= g:netrw_list_hide.",".sfxpat + else + " set hiding list to sfxpat + let g:netrw_list_hide= sfxpat + endif + endfor + + " refresh the listing + call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./')) + call netrw#NetrwRestorePosn(svpos) + else + call netrw#ErrorMsg(s:ERROR,"no files marked!",59) + endif + +" call Dret("s:NetrwMarkHideSfx") +endfun + +" --------------------------------------------------------------------- +" s:NetrwMarkFileGrep: (invoked by mg) This function applies vimgrep to marked files {{{2 +" Uses the global markfilelist +fun! s:NetrwMarkFileGrep(islocal) +" call Dfunc("s:NetrwMarkFileGrep(islocal=".a:islocal.")") + let svpos = netrw#NetrwSavePosn() + let curbufnr = bufnr("%") + + if exists("s:netrwmarkfilelist") +" call Decho("s:netrwmarkfilelist".string(s:netrwmarkfilelist).">") + let netrwmarkfilelist= join(map(deepcopy(s:netrwmarkfilelist), "fnameescape(v:val)")) + call s:NetrwUnmarkAll() + + " ask user for pattern + call inputsave() + let pat= input("Enter pattern: ","") + call inputrestore() + if pat !~ '^\s' + if pat !~ '^/' + let pat= '/'.pat.'/' + endif + let pat= " ".pat + endif + + " use vimgrep for both local and remote +" call Decho("exe vimgrep".pat." ".netrwmarkfilelist) + exe "vimgrep".pat." ".netrwmarkfilelist + + 2match none + call netrw#NetrwRestorePosn(svpos) + endif + +" call Dret("s:NetrwMarkFileGrep") +endfun + +" --------------------------------------------------------------------- +" s:NetrwMarkFileMove: (invoked by mm) execute arbitrary command on marked files, one at a time {{{2 +" uses the global marked file list +" s:netrwmfloc= 0: target directory is remote +" = 1: target directory is local +fun! s:NetrwMarkFileMove(islocal) +" call Dfunc("s:NetrwMarkFileMove(islocal=".a:islocal.")") + let curdir = b:netrw_curdir + let curbufnr = bufnr("%") + + " sanity check + if !exists("s:netrwmarkfilelist_{bufnr('%')}") || empty(s:netrwmarkfilelist_{bufnr('%')}) + call netrw#ErrorMsg(2,"there are no marked files in this window (:help netrw-mf)",66) +" call Dret("s:NetrwMarkFileMove") + return + endif +" call Decho("sanity chk passed: s:netrwmarkfilelist_".bufnr('%')."<".string(s:netrwmarkfilelist_{bufnr('%')})) + if !exists("s:netrwmftgt") + call netrw#ErrorMsg(2,"your marked file target is empty! (:help netrw-mt)",67) +" call Dret("s:NetrwMarkFileCopy 0") + return 0 + endif +" call Decho("sanity chk passed: s:netrwmftgt<".s:netrwmftgt.">") + + if a:islocal && s:netrwmftgt_islocal + " move: local -> local +" call Decho("move from local to local") +" call Decho("(s:NetrwMarkFileMove) local to local move") + if executable(g:netrw_localmovecmd) + for fname in s:netrwmarkfilelist_{bufnr("%")} +" call Decho("system(".g:netrw_localmovecmd." ".shellescape(fname)." ".shellescape(s:netrwmftgt).")") + let ret= system(g:netrw_localmovecmd." ".shellescape(fname)." ".shellescape(s:netrwmftgt)) + if v:shell_error < 0 + call netrw#ErrorMsg(s:ERROR,"command<".g:netrw_localmovecmd."> failed, aborting",54) + break + endif + endfor + else + call netrw#ErrorMsg(s:ERROR,"command<".g:netrw_localmovecmd."> is not executable!",57) + endif + + elseif a:islocal && !s:netrwmftgt_islocal + " move: local -> remote +" call Decho("move from local to remote") +" call Decho("copy") + let mflist= s:netrwmarkfilelist_{bufnr("%")} + call s:NetrwMarkFileCopy(a:islocal) +" call Decho("remove") + for fname in mflist + let barefname = substitute(fname,'^\(.*/\)\(.\{-}\)$','\2','') + let ok = s:NetrwLocalRmFile(b:netrw_curdir,barefname,1) + endfor + unlet mflist + + elseif !a:islocal && s:netrwmftgt_islocal + " move: remote -> local +" call Decho("move from remote to local") +" call Decho("copy") + let mflist= s:netrwmarkfilelist_{bufnr("%")} + call s:NetrwMarkFileCopy(a:islocal) +" call Decho("remove") + for fname in mflist + let barefname = substitute(fname,'^\(.*/\)\(.\{-}\)$','\2','') + let ok = s:NetrwRemoteRmFile(b:netrw_curdir,barefname,1) + endfor + unlet mflist + + elseif !a:islocal && !s:netrwmftgt_islocal + " move: remote -> remote +" call Decho("move from remote to remote") +" call Decho("copy") + let mflist= s:netrwmarkfilelist_{bufnr("%")} + call s:NetrwMarkFileCopy(a:islocal) +" call Decho("remove") + for fname in mflist + let barefname = substitute(fname,'^\(.*/\)\(.\{-}\)$','\2','') + let ok = s:NetrwRemoteRmFile(b:netrw_curdir,barefname,1) + endfor + unlet mflist + endif + + " ------- + " cleanup + " ------- +" call Decho("cleanup") + + " remove markings from local buffer + call s:NetrwUnmarkList(curbufnr,curdir) " remove markings from local buffer + + " refresh buffers + if !s:netrwmftgt_islocal + call s:NetrwRefreshDir(s:netrwmftgt_islocal,s:netrwmftgt) + endif + if a:islocal + call s:NetrwRefreshDir(a:islocal,b:netrw_curdir) + endif + call s:LocalBrowseShellCmdRefresh() + +" call Dret("s:NetrwMarkFileMove") +endfun + +" --------------------------------------------------------------------- +" s:NetrwMarkFilePrint: (invoked by mp) This function prints marked files {{{2 +" using the hardcopy command. Local marked-file list only. +fun! s:NetrwMarkFilePrint(islocal) +" call Dfunc("s:NetrwMarkFilePrint(islocal=".a:islocal.")") + let curbufnr= bufnr("%") + if exists("s:netrwmarkfilelist_{curbufnr}") + let netrwmarkfilelist = s:netrwmarkfilelist_{curbufnr} + let curdir = b:netrw_curdir + call s:NetrwUnmarkList(curbufnr,curdir) + for fname in netrwmarkfilelist + if a:islocal + if g:netrw_keepdir + let fname= s:ComposePath(curdir,fname) + endif + else + let fname= curdir.fname + endif + 1split + " the autocmds will handle both local and remote files +" call Decho("exe silent e ".escape(fname,' ')) + exe "silent e ".fnameescape(fname) +" call Decho("hardcopy") + hardcopy + q + endfor + 2match none + endif +" call Dret("s:NetrwMarkFilePrint") +endfun + +" --------------------------------------------------------------------- +" s:NetrwMarkFileRegexp: (invoked by mr) This function is used to mark {{{2 +" files when given a regexp (for which a prompt is +" issued). +fun! s:NetrwMarkFileRegexp(islocal) +" call Dfunc("s:NetrwMarkFileRegexp(islocal=".a:islocal.")") + + " get the regular expression + call inputsave() + let regexp= input("Enter regexp: ","","file") + call inputrestore() + + if a:islocal + " get the matching list of files using local glob() +" call Decho("handle local regexp") + let dirname = escape(b:netrw_curdir,g:netrw_glob_escape) + let filelist = glob(s:ComposePath(dirname,regexp)) + if filelist != "" + let filelist= filelist."\n" + endif + + " mark the list of files + while filelist != "" + if filelist =~ '\n' + let filename = substitute(filelist,'\n.*$','','e') + let filelist = substitute(filelist,'^.\{-}\n\(.*\)$','\1','e') + else + let filename = filelist + let filelist = "" + endif +" call Decho("filelist<".filelist.">") +" call Decho("filename<".filename.">") + call s:NetrwMarkFile(a:islocal,substitute(filename,'^.*/','','')) + endwhile + + else +" call Decho("handle remote regexp") + + " convert displayed listing into a filelist + let eikeep = &ei + let areg = @a + silent %y a + set ei=all ma +" call Decho("set ei=all ma") + 1split + enew + silent norm! "ap + 2 + let bannercnt= search('^" =====','W') + exe "silent 1,".bannercnt."d" + set bt=nofile + if g:netrw_liststyle == s:LONGLIST + silent %s/\s\{2,}\S.*$//e + elseif g:netrw_liststyle == s:WIDELIST + silent %s/\s\{2,}/\r/ge + elseif g:netrw_liststyle == s:TREELIST + silent %s/^| //e + silent! g/^ .*$/d + endif + " convert regexp into the more usual glob-style format + let regexp= substitute(regexp,'\*','.*','g') +" call Decho("regexp<".regexp.">") + exe "silent! v/".escape(regexp,'/')."/d" + let filelist= getline(1,line("$")) + q! + for filename in filelist + call s:NetrwMarkFile(a:islocal,substitute(filename,'^.*/','','')) + endfor + unlet filelist + let @a = areg + let &ei = eikeep + endif + +" call Dret("s:NetrwMarkFileRegexp") +endfun + +" --------------------------------------------------------------------- +" s:NetrwMarkFileSource: (invoked by ms) This function sources marked files {{{2 +" Uses the local marked file list. +fun! s:NetrwMarkFileSource(islocal) +" call Dfunc("s:NetrwMarkFileSource(islocal=".a:islocal.")") + let curbufnr= bufnr("%") + if exists("s:netrwmarkfilelist_{curbufnr}") + let netrwmarkfilelist = s:netrwmarkfilelist_{bufnr("%")} + let curdir = b:netrw_curdir + call s:NetrwUnmarkList(curbufnr,curdir) + for fname in netrwmarkfilelist + if a:islocal + if g:netrw_keepdir + let fname= s:ComposePath(curdir,fname) + endif + else + let fname= curdir.fname + endif + " the autocmds will handle sourcing both local and remote files +" call Decho("exe so ".fnameescape(fname)) + exe "so ".fnameescape(fname) + endfor + 2match none + endif +" call Dret("s:NetrwMarkFileSource") +endfun + +" --------------------------------------------------------------------- +" s:NetrwMarkFileTag: (invoked by mT) This function applies g:netrw_ctags to marked files {{{2 +" Uses the global markfilelist +fun! s:NetrwMarkFileTag(islocal) +" call Dfunc("s:NetrwMarkFileTag(islocal=".a:islocal.")") + let svpos = netrw#NetrwSavePosn() + let curdir = b:netrw_curdir + let curbufnr = bufnr("%") + + if exists("s:netrwmarkfilelist") +" call Decho("s:netrwmarkfilelist".string(s:netrwmarkfilelist).">") + let netrwmarkfilelist= join(map(deepcopy(s:netrwmarkfilelist), "shellescape(v:val,".!a:islocal.")")) + call s:NetrwUnmarkAll() + + if a:islocal + if executable(g:netrw_ctags) +" call Decho("call system(".g:netrw_ctags." ".netrwmarkfilelist.")") + call system(g:netrw_ctags." ".netrwmarkfilelist) + else + call netrw#ErrorMsg(s:ERROR,"g:netrw_ctags<".g:netrw_ctags."> is not executable!",51) + endif + else + let cmd = s:RemoteSystem(g:netrw_ctags." ".netrwmarkfilelist) + call netrw#NetrwObtain(a:islocal,"tags") + let curdir= b:netrw_curdir + 1split + e tags + let path= substitute(curdir,'^\(.*\)/[^/]*$','\1/','') +" call Decho("curdir<".curdir."> path<".path.">") + exe '%s/\t\(\S\+\)\t/\t'.escape(path,"/\n\r\\").'\1\t/e' + wq! + endif + 2match none + call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./')) + call netrw#NetrwRestorePosn(svpos) + endif + +" call Dret("s:NetrwMarkFileTag") +endfun + +" --------------------------------------------------------------------- +" s:NetrwMarkFileTgt: (invoked by mt) This function sets up a marked file target {{{2 +" Sets up two variables, +" s:netrwmftgt : holds the target directory +" s:netrwmftgt_islocal : 0=target directory is remote +" 1=target directory is local +fun! s:NetrwMarkFileTgt(islocal) +" call Dfunc("s:NetrwMarkFileTgt(islocal=".a:islocal.")") + let svpos = netrw#NetrwSavePosn() + let curdir = b:netrw_curdir + let hadtgt = exists("s:netrwmftgt") + if !exists("w:netrw_bannercnt") + let w:netrw_bannercnt= b:netrw_bannercnt + endif + + " set up target + if line(".") < w:netrw_bannercnt + " if cursor in banner region, use b:netrw_curdir for the target + let s:netrwmftgt= b:netrw_curdir +" call Decho("inbanner: s:netrwmftgt<".s:netrwmftgt.">") + + else + " get word under cursor. + " * If directory, use it for the target. + " * If file, use b:netrw_curdir for the target + let curword= s:NetrwGetWord() + let tgtdir = s:ComposePath(curdir,curword) + if a:islocal && isdirectory(tgtdir) + let s:netrwmftgt = tgtdir +" call Decho("local isdir: s:netrwmftgt<".s:netrwmftgt.">") + elseif !a:islocal && tgtdir =~ '/$' + let s:netrwmftgt = tgtdir +" call Decho("remote isdir: s:netrwmftgt<".s:netrwmftgt.">") + else + let s:netrwmftgt = curdir +" call Decho("isfile: s:netrwmftgt<".s:netrwmftgt.">") + endif + endif + if a:islocal + " simplify the target (eg. /abc/def/../ghi -> /abc/ghi) + let s:netrwmftgt= simplify(s:netrwmftgt) +" call Decho("simplify: s:netrwmftgt<".s:netrwmftgt.">") + endif + if g:netrw_cygwin + let s:netrwmftgt= substitute(system("cygpath ".shellescape(s:netrwmftgt)),'\n$','','') + let s:netrwmftgt= substitute(s:netrwmftgt,'\n$','','') + endif + let s:netrwmftgt_islocal= a:islocal + + if g:netrw_fastbrowse > 0 + call s:LocalBrowseShellCmdRefresh() + endif + call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./')) + call netrw#NetrwRestorePosn(svpos) + if !hadtgt + norm! j + endif + +" call Dret("s:NetrwMarkFileTgt : netrwmftgt<".(exists("s:netrwmftgt")? s:netrwmftgt : "").">") +endfun + +" --------------------------------------------------------------------- +" s:NetrwOpenFile: query user for a filename and open it {{{2 +fun! s:NetrwOpenFile(islocal) +" call Dfunc("s:NetrwOpenFile(islocal=".a:islocal.")") + call inputsave() + let fname= input("Enter filename: ") + call inputrestore() + if fname !~ '[/\\]' + if exists("b:netrw_curdir") + if exists("g:netrw_quiet") + let netrw_quiet_keep = g:netrw_quiet + endif + let g:netrw_quiet = 1 + if b:netrw_curdir =~ '/$' + exe "e ".fnameescape(b:netrw_curdir.fname) + else + exe "e ".fnameescape(b:netrw_curdir."/".fname) + endif + if exists("netrw_quiet_keep") + let g:netrw_quiet= netrw_quiet_keep + else + unlet g:netrw_quiet + endif + endif + else + exe "e ".fnameescape(fname) + endif +" call Dret("s:NetrwOpenFile") +endfun + +" --------------------------------------------------------------------- +" s:NetrwUnmarkList: delete local marked file lists and remove their contents from the global marked-file list {{{2 +fun! s:NetrwUnmarkList(curbufnr,curdir) +" call Dfunc("s:NetrwUnmarkList(curbufnr=".a:curbufnr." curdir<".a:curdir.">)") + + " remove all files in local marked-file list from global list + if exists("s:netrwmarkfilelist_{a:curbufnr}") + for mfile in s:netrwmarkfilelist_{a:curbufnr} + let dfile = s:ComposePath(a:curdir,mfile) " prepend directory to mfile + let idx = index(s:netrwmarkfilelist,dfile) " get index in list of dfile + call remove(s:netrwmarkfilelist,idx) " remove from global list + endfor + if s:netrwmarkfilelist == [] + unlet s:netrwmarkfilelist + endif + + " getting rid of the local marked-file lists is easy + unlet s:netrwmarkfilelist_{a:curbufnr} + endif + if exists("s:netrwmarkfilemtch_{a:curbufnr}") + unlet s:netrwmarkfilemtch_{a:curbufnr} + endif + 2match none +" call Dret("s:NetrwUnmarkList") +endfun + +" --------------------------------------------------------------------- +" s:NetrwUnmarkAll: remove the global marked file list and all local ones {{{2 +fun! s:NetrwUnmarkAll() +" call Dfunc("s:NetrwUnmarkAll()") + if exists("s:netrwmarkfilelist") + unlet s:netrwmarkfilelist + endif + silent call s:NetrwUnmarkAll2() + 2match none +" call Dret("s:NetrwUnmarkAll") +endfun + +" --------------------------------------------------------------------- +" s:NetrwUnmarkAll2: {{{2 +fun! s:NetrwUnmarkAll2() +" call Dfunc("s:NetrwUnmarkAll2()") + redir => netrwmarkfilelist_let + let + redir END + let netrwmarkfilelist_list= split(netrwmarkfilelist_let,'\n') " convert let string into a let list + call filter(netrwmarkfilelist_list,"v:val =~ '^s:netrwmarkfilelist_'") " retain only those vars that start as s:netrwmarkfilelist_ + call map(netrwmarkfilelist_list,"substitute(v:val,'\\s.*$','','')") " remove what the entries are equal to + for flist in netrwmarkfilelist_list + let curbufnr= substitute(flist,'s:netrwmarkfilelist_','','') + unlet s:netrwmarkfilelist_{curbufnr} + unlet s:netrwmarkfilemtch_{curbufnr} + endfor +" call Dret("s:NetrwUnmarkAll2") +endfun + +" --------------------------------------------------------------------- +" s:NetrwUnMarkFile: {{{2 +fun! s:NetrwUnMarkFile(islocal) +" call Dfunc("s:NetrwUnMarkFile(islocal=".a:islocal.")") + let svpos = netrw#NetrwSavePosn() + let curbufnr = bufnr("%") + + " unmark marked file list (although I expect s:NetrwUpload() + " to do it, I'm just making sure) + if exists("s:netrwmarkfilelist_{bufnr('%')}") +" call Decho("unlet'ing: s:netrwmarkfile[list|mtch]_".bufnr("%")) + unlet s:netrwmarkfilelist + unlet s:netrwmarkfilelist_{curbufnr} + unlet s:netrwmarkfilemtch_{curbufnr} + 2match none + endif + +" call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./')) + call netrw#NetrwRestorePosn(svpos) +" call Dret("s:NetrwUnMarkFile") +endfun + +" --------------------------------------------------------------------- +" s:NetrwMenu: generates the menu for gvim and netrw {{{2 +fun! s:NetrwMenu(domenu) + + if !exists("g:NetrwMenuPriority") + let g:NetrwMenuPriority= 80 + endif + + if has("menu") && has("gui_running") && &go =~ 'm' && g:netrw_menu +" call Dfunc("NetrwMenu(domenu=".a:domenu.")") + + if !exists("s:netrw_menu_enabled") && a:domenu +" call Decho("initialize menu") + let s:netrw_menu_enabled= 1 + exe 'silent! menu '.g:NetrwMenuPriority.'.1 '.g:NetrwTopLvlMenu.'Help<tab><F1> <F1>' + call s:NetrwBookmarkMenu() " provide some history! uses priorities 2,3, reserves 4 + exe 'silent! menu '.g:NetrwMenuPriority.'.5 '.g:NetrwTopLvlMenu.'-Sep1- :' + exe 'silent! menu '.g:NetrwMenuPriority.'.6 '.g:NetrwTopLvlMenu.'Go\ Up\ Directory<tab>- -' + exe 'silent! menu '.g:NetrwMenuPriority.'.7 '.g:NetrwTopLvlMenu.'Apply\ Special\ Viewer<tab>x x' + exe 'silent! menu '.g:NetrwMenuPriority.'.8.1 '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Bookmark\ Current\ Directory<tab>mb mb' + exe 'silent! menu '.g:NetrwMenuPriority.'.8.2 '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Bookmark\ Delete<tab>mB mB' + exe 'silent! menu '.g:NetrwMenuPriority.'.8.3 '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Goto\ Bookmark<tab>gb gb' + exe 'silent! menu '.g:NetrwMenuPriority.'.8.4 '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Goto\ Prev\ Dir\ (History)<tab>u u' + exe 'silent! menu '.g:NetrwMenuPriority.'.8.5 '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Goto\ Next\ Dir\ (History)<tab>U U' + exe 'silent! menu '.g:NetrwMenuPriority.'.8.6 '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.List<tab>qb qb' + exe 'silent! menu '.g:NetrwMenuPriority.'.9.1 '.g:NetrwTopLvlMenu.'Browsing\ Control.Edit\ File\ Hiding\ List<tab>'."<ctrl-h> \<Plug>NetrwHideEdit" + exe 'silent! menu '.g:NetrwMenuPriority.'.9.2 '.g:NetrwTopLvlMenu.'Browsing\ Control.Edit\ Sorting\ Sequence<tab>S S' + exe 'silent! menu '.g:NetrwMenuPriority.'.9.3 '.g:NetrwTopLvlMenu.'Browsing\ Control.Quick\ Hide/Unhide\ Dot\ Files<tab>'."gh gh" + exe 'silent! menu '.g:NetrwMenuPriority.'.9.4 '.g:NetrwTopLvlMenu.'Browsing\ Control.Refresh\ Listing<tab>'."<ctrl-l> \<Plug>NetrwRefresh" + exe 'silent! menu '.g:NetrwMenuPriority.'.9.5 '.g:NetrwTopLvlMenu.'Browsing\ Control.Settings/Options<tab>:NetrwSettings '.":NetrwSettings\<cr>" + exe 'silent! menu '.g:NetrwMenuPriority.'.10 '.g:NetrwTopLvlMenu.'Delete\ File/Directory<tab>D D' + exe 'silent! menu '.g:NetrwMenuPriority.'.11.1 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.In\ Current\ Window<tab><cr> '."\<cr>" + exe 'silent! menu '.g:NetrwMenuPriority.'.11.2 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.Preview\ File/Directory<tab>p p' + exe 'silent! menu '.g:NetrwMenuPriority.'.11.3 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.In\ Previous\ Window<tab>P P' + exe 'silent! menu '.g:NetrwMenuPriority.'.11.4 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.In\ New\ Window<tab>o o' + exe 'silent! menu '.g:NetrwMenuPriority.'.11.5 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.In\ New\ Vertical\ Window<tab>v v' + exe 'silent! menu '.g:NetrwMenuPriority.'.12.1 '.g:NetrwTopLvlMenu.'Explore.Directory\ Name :Explore ' + exe 'silent! menu '.g:NetrwMenuPriority.'.12.2 '.g:NetrwTopLvlMenu.'Explore.Filenames\ Matching\ Pattern\ (curdir\ only)<tab>:Explore\ */ :Explore */' + exe 'silent! menu '.g:NetrwMenuPriority.'.12.2 '.g:NetrwTopLvlMenu.'Explore.Filenames\ Matching\ Pattern\ (+subdirs)<tab>:Explore\ **/ :Explore **/' + exe 'silent! menu '.g:NetrwMenuPriority.'.12.3 '.g:NetrwTopLvlMenu.'Explore.Files\ Containing\ Pattern\ (curdir\ only)<tab>:Explore\ *// :Explore *//' + exe 'silent! menu '.g:NetrwMenuPriority.'.12.4 '.g:NetrwTopLvlMenu.'Explore.Files\ Containing\ Pattern\ (+subdirs)<tab>:Explore\ **// :Explore **//' + exe 'silent! menu '.g:NetrwMenuPriority.'.12.4 '.g:NetrwTopLvlMenu.'Explore.Next\ Match<tab>:Nexplore :Nexplore<cr>' + exe 'silent! menu '.g:NetrwMenuPriority.'.12.4 '.g:NetrwTopLvlMenu.'Explore.Prev\ Match<tab>:Pexplore :Pexplore<cr>' + exe 'silent! menu '.g:NetrwMenuPriority.'.13 '.g:NetrwTopLvlMenu.'Make\ Subdirectory<tab>d d' + exe 'silent! menu '.g:NetrwMenuPriority.'.14.1 '.g:NetrwTopLvlMenu.'Marked\ Files.Mark\ File<tab>mf mf' + exe 'silent! menu '.g:NetrwMenuPriority.'.14.2 '.g:NetrwTopLvlMenu.'Marked\ Files.Mark\ Files\ by\ Regexp<tab>mr mr' + exe 'silent! menu '.g:NetrwMenuPriority.'.14.3 '.g:NetrwTopLvlMenu.'Marked\ Files.Hide-Show-List\ Control<tab>a a' + exe 'silent! menu '.g:NetrwMenuPriority.'.14.4 '.g:NetrwTopLvlMenu.'Marked\ Files.Copy\ To\ Target<tab>mc mc' + exe 'silent! menu '.g:NetrwMenuPriority.'.14.5 '.g:NetrwTopLvlMenu.'Marked\ Files.Delete<tab>D D' + exe 'silent! menu '.g:NetrwMenuPriority.'.14.6 '.g:NetrwTopLvlMenu.'Marked\ Files.Diff<tab>md md' + exe 'silent! menu '.g:NetrwMenuPriority.'.14.7 '.g:NetrwTopLvlMenu.'Marked\ Files.Edit<tab>me me' + exe 'silent! menu '.g:NetrwMenuPriority.'.14.8 '.g:NetrwTopLvlMenu.'Marked\ Files.Exe\ Cmd<tab>mx mx' + exe 'silent! menu '.g:NetrwMenuPriority.'.14.9 '.g:NetrwTopLvlMenu.'Marked\ Files.Move\ To\ Target<tab>mm mm' + exe 'silent! menu '.g:NetrwMenuPriority.'.14.10 '.g:NetrwTopLvlMenu.'Marked\ Files.Obtain<tab>O O' + exe 'silent! menu '.g:NetrwMenuPriority.'.14.11 '.g:NetrwTopLvlMenu.'Marked\ Files.Print<tab>mp mp' + exe 'silent! menu '.g:NetrwMenuPriority.'.14.12 '.g:NetrwTopLvlMenu.'Marked\ Files.Replace<tab>R R' + exe 'silent! menu '.g:NetrwMenuPriority.'.14.13 '.g:NetrwTopLvlMenu.'Marked\ Files.Set\ Target<tab>mt mt' + exe 'silent! menu '.g:NetrwMenuPriority.'.14.14 '.g:NetrwTopLvlMenu.'Marked\ Files.Tag<tab>mT mT' + exe 'silent! menu '.g:NetrwMenuPriority.'.14.15 '.g:NetrwTopLvlMenu.'Marked\ Files.Zip/Unzip/Compress/Uncompress<tab>mz mz' + exe 'silent! menu '.g:NetrwMenuPriority.'.15 '.g:NetrwTopLvlMenu.'Obtain\ File<tab>O O' + exe 'silent! menu '.g:NetrwMenuPriority.'.16.1 '.g:NetrwTopLvlMenu.'Style.Listing\ Style\ (thin-long-wide-tree)<tab>i i' + exe 'silent! menu '.g:NetrwMenuPriority.'.16.2 '.g:NetrwTopLvlMenu.'Style.Normal-Hide-Show<tab>a a' + exe 'silent! menu '.g:NetrwMenuPriority.'.16.3 '.g:NetrwTopLvlMenu.'Style.Reverse\ Sorting\ Order<tab>'."r r" + exe 'silent! menu '.g:NetrwMenuPriority.'.16.4 '.g:NetrwTopLvlMenu.'Style.Sorting\ Method\ (name-time-size)<tab>s s' + exe 'silent! menu '.g:NetrwMenuPriority.'.17 '.g:NetrwTopLvlMenu.'Rename\ File/Directory<tab>R R' + exe 'silent! menu '.g:NetrwMenuPriority.'.18 '.g:NetrwTopLvlMenu.'Set\ Current\ Directory<tab>c c' + let s:netrw_menucnt= 28 + + elseif !a:domenu + let s:netrwcnt = 0 + let curwin = winnr() + windo if getline(2) =~ "Netrw" | let s:netrwcnt= s:netrwcnt + 1 | endif + exe curwin."wincmd w" + + if s:netrwcnt <= 1 +" call Decho("clear menus") + exe 'silent! unmenu '.g:NetrwTopLvlMenu +" call Decho('exe silent! unmenu '.g:NetrwTopLvlMenu.'*') + silent! unlet s:netrw_menu_enabled + endif + endif +" call Dret("NetrwMenu") + endif + +endfun + +" --------------------------------------------------------------------- +" s:NetrwObtain: obtain file under cursor or from markfile list {{{2 +" Used by the O maps (as <SID>NetrwObtain()) +fun! s:NetrwObtain(islocal) +" call Dfunc("NetrwObtain(islocal=".a:islocal.")") + + if exists("s:netrwmarkfilelist_{bufnr('%')}") + let islocal= s:netrwmarkfilelist_{bufnr('%')}[1] !~ '^\a\+://' + call netrw#NetrwObtain(islocal,s:netrwmarkfilelist_{bufnr('%')}) + call s:NetrwUnmarkList(bufnr('%'),b:netrw_curdir) + else + call netrw#NetrwObtain(a:islocal,expand("<cWORD>")) + endif + +" call Dret("NetrwObtain") +endfun + +" --------------------------------------------------------------------- +" netrw#NetrwObtain: {{{2 +" netrw#NetrwObtain(islocal,fname[,tgtdirectory]) +" islocal=0 obtain from remote source +" =1 obtain from local source +" fname : a filename or a list of filenames +" tgtdir : optional place where files are to go (not present, uses getcwd()) +fun! netrw#NetrwObtain(islocal,fname,...) +" call Dfunc("netrw#NetrwObtain(islocal=".a:islocal." fname<".((type(a:fname) == 1)? a:fname : string(a:fname)).">) a:0=".a:0) + " NetrwStatusLine support - for obtaining support + + if type(a:fname) == 1 + let fnamelist= [ a:fname ] + elseif type(a:fname) == 3 + let fnamelist= a:fname + else + call netrw#ErrorMsg(s:ERROR,"attempting to use NetrwObtain on something not a filename or a list",62) +" call Dret("netrw#NetrwObtain") + return + endif +" call Decho("fnamelist<".string(fnamelist).">") + if a:0 > 0 + let tgtdir= a:1 + else + let tgtdir= getcwd() + endif +" call Decho("tgtdir<".tgtdir.">") + + if exists("b:netrw_islocal") && b:netrw_islocal + " obtain a file from local b:netrw_curdir to (local) tgtdir +" call Decho("obtain a file from local ".b:netrw_curdir." to ".tgtdir) + if exists("b:netrw_curdir") && getcwd() != b:netrw_curdir + let topath= s:ComposePath(tgtdir,"") + if (has("win32") || has("win95") || has("win64") || has("win16")) + " transfer files one at time +" call Decho("transfer files one at a time") + for fname in fnamelist +" call Decho("system(".g:netrw_localcopycmd." ".shellescape(fname)." ".shellescape(topath).")") + call system(g:netrw_localcopycmd." ".shellescape(fname)." ".shellescape(topath)) + endfor + else + " transfer files with one command +" call Decho("transfer files with one command") + let filelist= join(map(deepcopy(fnamelist),"shellescape(v:val)")) +" call Decho("system(".g:netrw_localcopycmd." ".filelist." ".shellescape(topath).")") + call system(g:netrw_localcopycmd." ".filelist." ".shellescape(topath)) + endif + elseif !exists("b:netrw_curdir") + call netrw#ErrorMsg(s:ERROR,"local browsing directory doesn't exist!",36) + else + call netrw#ErrorMsg(s:WARNING,"local browsing directory and current directory are identical",37) + endif + + else + " obtain files from remote b:netrw_curdir to local tgtdir +" call Decho("obtain a file from remote ".b:netrw_curdir." to ".tgtdir) + if type(a:fname) == 1 + call s:SetupNetrwStatusLine('%f %h%m%r%=%9*Obtaining '.a:fname) + endif + call s:NetrwMethod(b:netrw_curdir) + + if b:netrw_method == 4 + " obtain file using scp +" call Decho("obtain via scp (method#4)") + if exists("g:netrw_port") && g:netrw_port != "" + let useport= " ".g:netrw_scpport." ".g:netrw_port + else + let useport= "" + endif + if b:netrw_fname =~ '/' + let path= substitute(b:netrw_fname,'^\(.*/\).\{-}$','\1','') + else + let path= "" + endif + let filelist= join(map(deepcopy(fnamelist),'shellescape(g:netrw_machine.":".path.v:val,1)')) +" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_scp_cmd.shellescape(useport,1)." ".filelist." ".shellescape(tgtdir,1)) + exe s:netrw_silentxfer."!".g:netrw_scp_cmd.shellescape(useport,1)." ".filelist." ".shellescape(tgtdir,1) + + elseif b:netrw_method == 2 + " obtain file using ftp + .netrc +" call Decho("obtain via ftp+.netrc (method #2)") + call s:SaveBufVars()|silent keepjumps new|call s:RestoreBufVars() + let tmpbufnr= bufnr("%") + setlocal ff=unix + if exists("g:netrw_ftpmode") && g:netrw_ftpmode != "" + put =g:netrw_ftpmode +" call Decho("filter input: ".getline('$')) + endif + + if exists("b:netrw_fname") && b:netrw_fname != "" + call setline(line("$")+1,'cd "'.b:netrw_fname.'"') +" call Decho("filter input: ".getline('$')) + endif + + if exists("g:netrw_ftpextracmd") + put =g:netrw_ftpextracmd +" call Decho("filter input: ".getline('$')) + endif + for fname in fnamelist + call setline(line("$")+1,'get "'.fname.'"') +" call Decho("filter input: ".getline('$')) + endfor + if exists("g:netrw_port") && g:netrw_port != "" +" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1)) + exe s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1) + else +" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)) + exe s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1) + endif + " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar) + if getline(1) !~ "^$" && !exists("g:netrw_quiet") && getline(1) !~ '^Trying ' + let debugkeep= &debug + setlocal debug=msg + call netrw#ErrorMsg(s:ERROR,getline(1),4) + let &debug= debugkeep + endif + + elseif b:netrw_method == 3 + " obtain with ftp + machine, id, passwd, and fname (ie. no .netrc) +" call Decho("obtain via ftp+mipf (method #3)") + call s:SaveBufVars()|silent keepjumps new|call s:RestoreBufVars() + let tmpbufnr= bufnr("%") + setlocal ff=unix + + if exists("g:netrw_port") && g:netrw_port != "" + put ='open '.g:netrw_machine.' '.g:netrw_port +" call Decho("filter input: ".getline('$')) + else + put ='open '.g:netrw_machine +" call Decho("filter input: ".getline('$')) + endif + + if exists("g:netrw_ftp") && g:netrw_ftp == 1 + put =g:netrw_uid +" call Decho("filter input: ".getline('$')) + put ='\"'.s:netrw_passwd.'\"' +" call Decho("filter input: ".getline('$')) + else + put ='user \"'.g:netrw_uid.'\" \"'.s:netrw_passwd.'\"' +" call Decho("filter input: ".getline('$')) + endif + + if exists("g:netrw_ftpmode") && g:netrw_ftpmode != "" + put =g:netrw_ftpmode +" call Decho("filter input: ".getline('$')) + endif + + if exists("b:netrw_fname") && b:netrw_fname != "" + call setline(line("$")+1,'cd "'.b:netrw_fname.'"') +" call Decho("filter input: ".getline('$')) + endif + + if exists("g:netrw_ftpextracmd") + put =g:netrw_ftpextracmd +" call Decho("filter input: ".getline('$')) + endif + + if exists("g:netrw_ftpextracmd") + put =g:netrw_ftpextracmd +" call Decho("filter input: ".getline('$')) + endif + for fname in fnamelist + call setline(line("$")+1,'get "'.fname.'"') + endfor +" call Decho("filter input: ".getline('$')) + + " perform ftp: + " -i : turns off interactive prompting from ftp + " -n unix : DON'T use <.netrc>, even though it exists + " -n win32: quit being obnoxious about password + norm! 1Gdd +" call Decho("executing: %!".g:netrw_ftp_cmd." -i -n") + exe s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i -n" + " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar) + if getline(1) !~ "^$" +" call Decho("error<".getline(1).">") + if !exists("g:netrw_quiet") + call netrw#ErrorMsg(s:ERROR,getline(1),5) + endif + endif + elseif !exists("b:netrw_method") || b:netrw_method < 0 +" call Dfunc("netrw#NetrwObtain : unsupported method") + return + endif + + " restore status line + if type(a:fname) == 1 && exists("s:netrw_users_stl") + call s:SetupNetrwStatusLine(s:netrw_users_stl) + endif + + endif + + " cleanup + if exists("tmpbufnr") + if bufnr("%") != tmpbufnr + exe tmpbufnr."bw!" + else + q! + endif + endif + +" call Dret("netrw#NetrwObtain") +endfun + +" --------------------------------------------------------------------- +" s:NetrwPrevWinOpen: open file/directory in previous window. {{{2 +" If there's only one window, then the window will first be split. +" Returns: +" choice = 0 : didn't have to choose +" choice = 1 : saved modified file in window first +" choice = 2 : didn't save modified file, opened window +" choice = 3 : cancel open +fun! s:NetrwPrevWinOpen(islocal) +" call Dfunc("NetrwPrevWinOpen(islocal=".a:islocal.")") + + " grab a copy of the b:netrw_curdir to pass it along to newly split windows + let curdir = b:netrw_curdir + + " get last window number and the word currently under the cursor + let lastwinnr = winnr("$") + let curword = s:NetrwGetWord() + let choice = 0 +" call Decho("lastwinnr=".lastwinnr." curword<".curword.">") + + let didsplit = 0 + if lastwinnr == 1 + " if only one window, open a new one first +" call Decho("only one window, so open a new one (g:netrw_alto=".g:netrw_alto.")") + if g:netrw_preview +" call Decho("exe ".(g:netrw_alto? "top " : "bot ")."vert ".g:netrw_winsize."wincmd s") + exe (g:netrw_alto? "top " : "bot ")."vert ".g:netrw_winsize."wincmd s" + else +" call Decho("exe ".(g:netrw_alto? "bel " : "abo ").g:netrw_winsize."wincmd s") + exe (g:netrw_alto? "bel " : "abo ").g:netrw_winsize."wincmd s" + endif + let didsplit = 1 + + else + call s:SaveBufVars() +" call Decho("wincmd p") + wincmd p + call s:RestoreBufVars() + " if the previous window's buffer has been changed (is modified), + " and it doesn't appear in any other extant window, then ask the + " user if s/he wants to abandon modifications therein. + let bnr = winbufnr(0) + let bnrcnt = 0 + if &mod +" call Decho("detected: prev window's buffer has been modified: bnr=".bnr." winnr#".winnr()) + let eikeep= &ei + set ei=all + windo if winbufnr(0) == bnr | let bnrcnt=bnrcnt+1 | endif + exe bnr."wincmd p" + let &ei= eikeep +" call Decho("bnr=".bnr." bnrcnt=".bnrcnt." buftype=".&bt." winnr#".winnr()) + if bnrcnt == 1 + let bufname= bufname(winbufnr(winnr())) + let choice= confirm("Save modified file<".bufname.">?","&Yes\n&No\n&Cancel") +" call Decho("bufname<".bufname."> choice=".choice." winnr#".winnr()) + + if choice == 1 + " Yes -- write file & then browse + let v:errmsg= "" + silent w + if v:errmsg != "" + call netrw#ErrorMsg(s:ERROR,"unable to write <".bufname.">!",30) + if didsplit + q + else + wincmd p + endif +" call Dret("NetrwPrevWinOpen ".choice." : unable to write <".bufname.">") + return choice + endif + + elseif choice == 2 + " No -- don't worry about changed file, just browse anyway + setlocal nomod + call netrw#ErrorMsg(s:WARNING,bufname." changes to ".bufname." abandoned",31) + wincmd p + + else + " Cancel -- don't do this + if didsplit + q + else + wincmd p + endif +" call Dret("NetrwPrevWinOpen ".choice." : cancelled") + return choice + endif + endif + endif + endif + + " restore b:netrw_curdir (window split/enew may have lost it) + let b:netrw_curdir= curdir + if a:islocal < 2 + if a:islocal + call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(a:islocal,curword)) + else + call s:NetrwBrowse(a:islocal,s:NetrwBrowseChgDir(a:islocal,curword)) + endif + endif +" call Dret("NetrwPrevWinOpen ".choice) + return choice +endfun + +" --------------------------------------------------------------------- +" s:NetrwUpload: load fname to tgt (used by NetrwMarkFileCopy()) {{{2 +" Always assumed to be local -> remote +" call s:NetrwUpload(filename, target) +" call s:NetrwUpload(filename, target, fromdirectory) +fun! s:NetrwUpload(fname,tgt,...) +" call Dfunc("s:NetrwUpload(fname<".((type(a:fname) == 1)? a:fname : string(a:fname))."> tgt<".a:tgt.">) a:0=".a:0) + + if a:tgt =~ '^\a\+://' + let tgtdir= substitute(a:tgt,'^\a\+://[^/]\+/\(.\{-}\)$','\1','') + else + let tgtdir= substitute(a:tgt,'^\(.*\)/[^/]*$','\1','') + endif +" call Decho("tgtdir<".tgtdir.">") + + if a:0 > 0 + let fromdir= a:1 + else + let fromdir= getcwd() + endif +" call Decho("fromdir<".fromdir.">") + + if type(a:fname) == 1 + " handle uploading a single file using NetWrite +" call Decho("handle uploading a single file via NetWrite") + 1split +" call Decho("exe e ".fnameescape(a:fname)) + exe "e ".fnameescape(a:fname) +" call Decho("now locally editing<".expand("%").">, has ".line("$")." lines") + if a:tgt =~ '/$' + let wfname= substitute(a:fname,'^.*/','','') +" call Decho("exe w! ".fnameescape(wfname)) + exe "w! ".fnameescape(a:tgt.wfname) + else +" call Decho("writing local->remote: exe w ".fnameescape(a:tgt)) + exe "w ".fnameescape(a:tgt) +" call Decho("done writing local->remote") + endif + q! + + elseif type(a:fname) == 3 + " handle uploading a list of files via scp +" call Decho("handle uploading a list of files via scp") + let curdir= getcwd() + if a:tgt =~ '^scp:' + exe "keepjumps silent lcd ".fnameescape(fromdir) + let filelist= deepcopy(s:netrwmarkfilelist_{bufnr('%')}) + let args = join(map(filelist,"shellescape(v:val, 1)")) + if exists("g:netrw_port") && g:netrw_port != "" + let useport= " ".g:netrw_scpport." ".g:netrw_port + else + let useport= "" + endif + let machine = substitute(a:tgt,'^scp://\([^/:]\+\).*$','\1','') + let tgt = substitute(a:tgt,'^scp://[^/]\+/\(.*\)$','\1','') +" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_scp_cmd.shellescape(useport,1)." ".args." ".shellescape(machine.":".tgt,1)) + exe s:netrw_silentxfer."!".g:netrw_scp_cmd.shellescape(useport,1)." ".args." ".shellescape(machine.":".tgt,1) + exe "keepjumps silent lcd ".fnameescape(curdir) + + elseif a:tgt =~ '^ftp:' + call s:NetrwMethod(a:tgt) + + if b:netrw_method == 2 + " handle uploading a list of files via ftp+.netrc + let netrw_fname = b:netrw_fname + silent keepjumps new +" call Decho("filter input window#".winnr()) + + put =g:netrw_ftpmode +" call Decho("filter input: ".getline('$')) + + if exists("g:netrw_ftpextracmd") + put =g:netrw_ftpextracmd +" call Decho("filter input: ".getline('$')) + endif + + call setline(line("$")+1,'lcd "'.fromdir.'"') +" call Decho("filter input: ".getline('$')) + + call setline(line("$")+1,'cd "'.tgtdir.'"') +" call Decho("filter input: ".getline('$')) + + for fname in a:fname + call setline(line("$")+1,'put "'.fname.'"') +" call Decho("filter input: ".getline('$')) + endfor + + if exists("g:netrw_port") && g:netrw_port != "" +" call Decho("executing: ".s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1)) + exe s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1) + else +" call Decho("filter input window#".winnr()) +" call Decho("executing: ".s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)) + exe s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1) + endif + " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar) + silent g/Local directory now/d + if getline(1) !~ "^$" && !exists("g:netrw_quiet") && getline(1) !~ '^Trying ' + call netrw#ErrorMsg(s:ERROR,getline(1),14) + else + bw!|q + endif + + elseif b:netrw_method == 3 + " upload with ftp + machine, id, passwd, and fname (ie. no .netrc) + let netrw_fname= b:netrw_fname + call s:SaveBufVars()|silent keepjumps new|call s:RestoreBufVars() + let tmpbufnr= bufnr("%") + setlocal ff=unix + + if exists("g:netrw_port") && g:netrw_port != "" + put ='open '.g:netrw_machine.' '.g:netrw_port +" call Decho("filter input: ".getline('$')) + else + put ='open '.g:netrw_machine +" call Decho("filter input: ".getline('$')) + endif + + if exists("g:netrw_ftp") && g:netrw_ftp == 1 + put =g:netrw_uid +" call Decho("filter input: ".getline('$')) + call setline(line("$")+1,'"'.s:netrw_passwd.'"') +" call Decho("filter input: ".getline('$')) + else + put ='user \"'.g:netrw_uid.'\" \"'.s:netrw_passwd.'\"' +" call Decho("filter input: ".getline('$')) + endif + + call setline(line("$")+1,'lcd "'.fromdir.'"') +" call Decho("filter input: ".getline('$')) + + if exists("b:netrw_fname") && b:netrw_fname != "" + call setline(line("$")+1,'cd "'.b:netrw_fname.'"') +" call Decho("filter input: ".getline('$')) + endif + + if exists("g:netrw_ftpextracmd") + put =g:netrw_ftpextracmd +" call Decho("filter input: ".getline('$')) + endif + + for fname in a:fname + call setline(line("$")+1,'put "'.fname.'"') +" call Decho("filter input: ".getline('$')) + endfor + + " perform ftp: + " -i : turns off interactive prompting from ftp + " -n unix : DON'T use <.netrc>, even though it exists + " -n win32: quit being obnoxious about password + norm! 1Gdd +" call Decho("executing: ".s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i -n") + exe s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i -n" + " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar) + silent g/Local directory now/d + if getline(1) !~ "^$" && !exists("g:netrw_quiet") && getline(1) !~ '^Trying ' + let debugkeep= &debug + setlocal debug=msg + call netrw#ErrorMsg(s:ERROR,getline(1),15) + let &debug = debugkeep + let mod = 1 + else + bw!|q + endif + elseif !exists("b:netrw_method") || b:netrw_method < 0 +" call Dfunc("netrw#NetrwUpload : unsupported method") + return + endif + else + call netrw#ErrorMsg(s:ERROR,"can't obtain files with protocol from<".a:tgt.">",63) + endif + endif + +" call Dret("s:NetrwUpload") +endfun + +" --------------------------------------------------------------------- +" s:NetrwPreview: {{{2 +fun! s:NetrwPreview(path) range +" call Dfunc("NetrwPreview(path<".a:path.">)") + call s:NetrwOptionSave("s:") + call s:NetrwSafeOptions() + if has("quickfix") + if !isdirectory(a:path) + exe (g:netrw_preview? "vert " : "")."pedit ".fnameescape(a:path) + elseif !exists("g:netrw_quiet") + call netrw#ErrorMsg(s:WARNING,"sorry, cannot preview a directory such as <".a:path.">",38) + endif + elseif !exists("g:netrw_quiet") + call netrw#ErrorMsg(s:WARNING,"sorry, to preview your vim needs the quickfix feature compiled in",39) + endif + call s:NetrwOptionRestore("s:") +" call Dret("NetrwPreview") +endfun + +" --------------------------------------------------------------------- +" s:NetrwRefresh: {{{2 +fun! s:NetrwRefresh(islocal,dirname) +" call Dfunc("NetrwRefresh(islocal<".a:islocal.">,dirname=".a:dirname.") hide=".g:netrw_hide." sortdir=".g:netrw_sort_direction) + " at the current time (Mar 19, 2007) all calls to NetrwRefresh() call NetrwBrowseChgDir() first. + " NetrwBrowseChgDir() may clear the display; hence a NetrwSavePosn() may not work if its placed here. + " Also, NetrwBrowseChgDir() now does a NetrwSavePosn() itself. + setlocal ma noro +" call Decho("setlocal ma noro") +" call Decho("clear buffer<".expand("%")."> with :%d") + %d + if a:islocal + call netrw#LocalBrowseCheck(a:dirname) + else + call s:NetrwBrowse(a:islocal,a:dirname) + endif + call netrw#NetrwRestorePosn() + + " restore file marks + if exists("s:netrwmarkfilemtch_{bufnr('%')}") && s:netrwmarkfilemtch_{bufnr("%")} != "" +" call Decho("exe 2match netrwMarkFile /".s:netrwmarkfilemtch_{bufnr("%")}."/") + exe "2match netrwMarkFile /".s:netrwmarkfilemtch_{bufnr("%")}."/" + else +" call Decho("2match none") + 2match none + endif + +" redraw! +" call Dret("NetrwRefresh") +endfun + +" --------------------------------------------------------------------- +" s:NetrwRefreshDir: refreshes a directory by name {{{2 +" Called by NetrwMarkFileCopy() +" Interfaces to s:NetrwRefresh() and s:LocalBrowseShellCmdRefresh() +fun! s:NetrwRefreshDir(islocal,dirname) +" call Dfunc("s:NetrwRefreshDir(islocal=".a:islocal." dirname<".a:dirname.">) fastbrowse=".g:netrw_fastbrowse) + if g:netrw_fastbrowse == 0 + " slowest mode (keep buffers refreshed, local or remote) +" call Decho("slowest mode: keep buffers refreshed, local or remote") + let tgtwin= bufwinnr(a:dirname) +" call Decho("tgtwin= bufwinnr(".a:dirname.")=".tgtwin) + + if tgtwin > 0 + " tgtwin is being displayed, so refresh it + let curwin= winnr() +" call Decho("refresh tgtwin#".tgtwin." (curwin#".curwin.")") + exe tgtwin."wincmd w" + call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./')) + exe curwin."wincmd w" + + elseif bufnr(a:dirname) > 0 + let bn= bufnr(a:dirname) +" call Decho("bd bufnr(".a:dirname.")=".bn) + exe "silent bd ".bn + endif + + elseif g:netrw_fastbrowse <= 1 +" call Decho("medium-speed mode: refresh local buffers only") + call s:LocalBrowseShellCmdRefresh() + endif +" call Dret("s:NetrwRefreshDir") +endfun + +" --------------------------------------------------------------------- +" s:NetrwSetSort: sets up the sort based on the g:netrw_sort_sequence {{{2 +" What this function does is to compute a priority for the patterns +" in the g:netrw_sort_sequence. It applies a substitute to any +" "files" that satisfy each pattern, putting the priority / in +" front. An "*" pattern handles the default priority. +fun! s:NetrwSetSort() +" call Dfunc("SetSort() bannercnt=".w:netrw_bannercnt) + if w:netrw_liststyle == s:LONGLIST + let seqlist = substitute(g:netrw_sort_sequence,'\$','\\%(\t\\|\$\\)','ge') + else + let seqlist = g:netrw_sort_sequence + endif + " sanity check -- insure that * appears somewhere + if seqlist == "" + let seqlist= '*' + elseif seqlist !~ '\*' + let seqlist= seqlist.',*' + endif + let priority = 1 + while seqlist != "" + if seqlist =~ ',' + let seq = substitute(seqlist,',.*$','','e') + let seqlist = substitute(seqlist,'^.\{-},\(.*\)$','\1','e') + else + let seq = seqlist + let seqlist = "" + endif + let sepchr= "\<Char-0xff>" + if priority < 10 + let spriority= "00".priority.sepchr + elseif priority < 100 + let spriority= "0".priority.sepchr + else + let spriority= priority.sepchr + endif +" call Decho("priority=".priority." spriority<".spriority."> seq<".seq."> seqlist<".seqlist.">") + + " sanity check + if w:netrw_bannercnt > line("$") + " apparently no files were left after a Hiding pattern was used +" call Dret("SetSort : no files left after hiding") + return + endif + if seq == '*' + let starpriority= spriority + else + exe 'silent keepjumps '.w:netrw_bannercnt.',$g/'.seq.'/s/^/'.spriority.'/' + " sometimes multiple sorting patterns will match the same file or directory. + " The following substitute is intended to remove the excess matches. + exe 'silent keepjumps '.w:netrw_bannercnt.',$g/^\d\{3}'.sepchr.'\d\{3}\//s/^\d\{3}'.sepchr.'\(\d\{3}\/\).\@=/\1/e' + endif + let priority = priority + 1 + endwhile + if exists("starpriority") + exe 'silent keepjumps '.w:netrw_bannercnt.',$v/^\d\{3}'.sepchr.'/s/^/'.starpriority.'/' + endif + + " Following line associated with priority -- items that satisfy a priority + " pattern get prefixed by ###/ which permits easy sorting by priority. + " Sometimes files can satisfy multiple priority patterns -- only the latest + " priority pattern needs to be retained. So, at this point, these excess + " priority prefixes need to be removed, but not directories that happen to + " be just digits themselves. + exe 'silent keepjumps '.w:netrw_bannercnt.',$s/^\(\d\{3}'.sepchr.'\)\%(\d\{3}'.sepchr.'\)\+\ze./\1/e' + +" call Dret("SetSort") +endfun + +" ===================================================================== +" s:NetrwSortStyle: change sorting style (name - time - size) and refresh display {{{2 +fun! s:NetrwSortStyle(islocal) +" call Dfunc("s:NetrwSortStyle(islocal=".a:islocal.") netrw_sort_by<".g:netrw_sort_by.">") + call s:NetrwSaveWordPosn() + let svpos= netrw#NetrwSavePosn() + + let g:netrw_sort_by= (g:netrw_sort_by =~ 'n')? 'time' : (g:netrw_sort_by =~ 't')? 'size' : 'name' + norm! 0 + call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./')) + call netrw#NetrwRestorePosn(svpos) + +" call Dret("s:NetrwSortStyle : netrw_sort_by<".g:netrw_sort_by.">") +endfun + +" --------------------------------------------------------------------- +" s:NetrwSplit: mode {{{2 +" =0 : net and o +" =1 : net and t +" =2 : net and v +" =3 : local and o +" =4 : local and t +" =5 : local and v +fun! s:NetrwSplit(mode) +" call Dfunc("s:NetrwSplit(mode=".a:mode.") alto=".g:netrw_alto." altv=".g:netrw_altv) + + call s:SaveWinVars() + + if a:mode == 0 + " remote and o +" call Decho("exe ".(g:netrw_alto? "bel " : "abo ").g:netrw_winsize."wincmd s") + exe (g:netrw_alto? "bel " : "abo ").g:netrw_winsize."wincmd s" + let s:didsplit= 1 + call s:RestoreWinVars() + call s:NetrwBrowse(0,s:NetrwBrowseChgDir(0,s:NetrwGetWord())) + unlet s:didsplit + + elseif a:mode == 1 + " remote and t + let cursorword = s:NetrwGetWord() +" call Decho("tabnew") + tabnew + let s:didsplit= 1 + call s:RestoreWinVars() + call s:NetrwBrowse(0,s:NetrwBrowseChgDir(0,cursorword)) + unlet s:didsplit + + elseif a:mode == 2 + " remote and v +" call Decho("exe ".(g:netrw_altv? "rightb " : "lefta ").g:netrw_winsize."wincmd v") + exe (g:netrw_altv? "rightb " : "lefta ").g:netrw_winsize."wincmd v" + let s:didsplit= 1 + call s:RestoreWinVars() + call s:NetrwBrowse(0,s:NetrwBrowseChgDir(0,s:NetrwGetWord())) + unlet s:didsplit + + elseif a:mode == 3 + " local and o +" call Decho("exe ".(g:netrw_alto? "bel " : "abo ").g:netrw_winsize."wincmd s") + exe (g:netrw_alto? "bel " : "abo ").g:netrw_winsize."wincmd s" + let s:didsplit= 1 + call s:RestoreWinVars() + call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,s:NetrwGetWord())) + unlet s:didsplit + + elseif a:mode == 4 + " local and t + let netrw_curdir= b:netrw_curdir + let cursorword = s:NetrwGetWord() +" call Decho("tabnew") + tabnew + let b:netrw_curdir= netrw_curdir + let s:didsplit= 1 + call s:RestoreWinVars() + call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,cursorword)) + unlet s:didsplit + + elseif a:mode == 5 + " local and v +" call Decho("exe ".(g:netrw_altv? "rightb " : "lefta ").g:netrw_winsize."wincmd v") + exe (g:netrw_altv? "rightb " : "lefta ").g:netrw_winsize."wincmd v" + let s:didsplit= 1 + call s:RestoreWinVars() + call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,s:NetrwGetWord())) + unlet s:didsplit + + else + call netrw#ErrorMsg(s:ERROR,"(NetrwSplit) unsupported mode=".a:mode,45) + endif + +" call Dret("s:NetrwSplit") +endfun + +" --------------------------------------------------------------------- +" NetrwStatusLine: {{{2 +fun! NetrwStatusLine() + +" vvv NetrwStatusLine() debugging vvv +" let g:stlmsg="" +" if !exists("w:netrw_explore_bufnr") +" let g:stlmsg="!X<explore_bufnr>" +" elseif w:netrw_explore_bufnr != bufnr("%") +" let g:stlmsg="explore_bufnr!=".bufnr("%") +" endif +" if !exists("w:netrw_explore_line") +" let g:stlmsg=" !X<explore_line>" +" elseif w:netrw_explore_line != line(".") +" let g:stlmsg=" explore_line!={line(.)<".line(".").">" +" endif +" if !exists("w:netrw_explore_list") +" let g:stlmsg=" !X<explore_list>" +" endif +" ^^^ NetrwStatusLine() debugging ^^^ + + 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") + " restore user's status line + let &stl = s:netrw_users_stl + let &laststatus = s:netrw_users_ls + if exists("w:netrw_explore_bufnr")|unlet w:netrw_explore_bufnr|endif + if exists("w:netrw_explore_line") |unlet w:netrw_explore_line |endif + return "" + else + return "Match ".w:netrw_explore_mtchcnt." of ".w:netrw_explore_listlen + endif +endfun + +" --------------------------------------------------------------------- +" s:NetrwTreeDir: determine tree directory given current cursor position {{{2 +" (full path directory with trailing slash returned) +fun! s:NetrwTreeDir() +" call Dfunc("NetrwTreeDir() curline#".line(".")."<".getline('.')."> b:netrw_curdir<".b:netrw_curdir."> tab#".tabpagenr()." win#".winnr()." buf#".bufnr("%")."<".bufname("%").">") + + let treedir= b:netrw_curdir +" call Decho("set initial treedir<".treedir.">") + let s:treecurpos= netrw#NetrwSavePosn() + + if w:netrw_liststyle == s:TREELIST +" call Decho("w:netrrw_liststyle is TREELIST:") +" call Decho("line#".line(".")." getline(.)<".getline('.')."> treecurpos<".string(s:treecurpos).">") + if getline('.') =~ '/$' + let treedir= substitute(getline('.'),'^\%(| \)*\([^|].\{-}\)$','\1','e') + else + let treedir= "" + endif + +" call Decho("treedir<".treedir.">") + + " detect user attempting to close treeroot + if getline('.') !~ '|' && getline('.') != '..' +" call Decho("user attempted to close treeroot") + " now force a refresh +" call Decho("clear buffer<".expand("%")."> with :%d") + keepjumps %d +" call Dret("NetrwTreeDir <".treedir."> : (side effect) s:treecurpos<".string(s:treecurpos).">") + return b:netrw_curdir + endif + + " elide all non-depth information + let depth = substitute(getline('.'),'^\(\%(| \)*\)[^|].\{-}$','\1','e') +" call Decho("depth<".depth."> 1st subst") + + " elide first depth + let depth = substitute(depth,'^| ','','') +" call Decho("depth<".depth."> 2nd subst") + + " construct treedir by searching backwards at correct depth +" call Decho("constructing treedir<".treedir."> depth<".depth.">") + while depth != "" && search('^'.depth.'[^|].\{-}/$','bW') + let dirname= substitute(getline('.'),'^\(| \)*','','e') + let treedir= dirname.treedir + let depth = substitute(depth,'^| ','','') +" call Decho("constructing treedir<".treedir.">: dirname<".dirname."> while depth<".depth.">") + endwhile + if w:netrw_treetop =~ '/$' + let treedir= w:netrw_treetop.treedir + else + let treedir= w:netrw_treetop.'/'.treedir + endif +" call Decho("bufnr(.)=".bufnr("%")." line($)=".line("$")." line(.)=".line(".")) + endif + let treedir= substitute(treedir,'//$','/','') + +" " now force a refresh +"" call DECHO("clear buffer<".expand("%")."> with :%d") +" setlocal ma noro +" keepjumps %d + +" call Dret("NetrwTreeDir <".treedir."> : (side effect) s:treecurpos<".string(s:treecurpos).">") + return treedir +endfun + +" --------------------------------------------------------------------- +" s:NetrwTreeDisplay: recursive tree display {{{2 +fun! s:NetrwTreeDisplay(dir,depth) +" call Dfunc("NetrwTreeDisplay(dir<".a:dir."> depth<".a:depth.">)") + + " insure that there are no folds + setlocal nofen + + " install ../ and shortdir + if a:depth == "" + call setline(line("$")+1,'../') +" call Decho("setline#".line("$")." ../ (depth is zero)") + endif + if a:dir =~ '^\a\+://' + if a:dir == w:netrw_treetop + let shortdir= a:dir + else + let shortdir= substitute(a:dir,'^.*/\([^/]\+\)/$','\1/','e') + endif + call setline(line("$")+1,a:depth.shortdir) + else + let shortdir= substitute(a:dir,'^.*/','','e') + call setline(line("$")+1,a:depth.shortdir.'/') + endif +" call Decho("setline#".line("$")." shortdir<".a:depth.shortdir.">") + + " append a / to dir if its missing one + let dir= a:dir + if dir !~ '/$' + let dir= dir.'/' + endif + + " display subtrees (if any) + let depth= "| ".a:depth + +" call Decho("display subtrees with depth<".depth."> and current leaves") + for entry in w:netrw_treedict[a:dir] + let direntry= substitute(dir.entry,'/$','','e') +" call Decho("dir<".dir."> entry<".entry."> direntry<".direntry.">") + if entry =~ '/$' && has_key(w:netrw_treedict,direntry) +" call Decho("<".direntry."> is a key in treedict - display subtree for it") + call s:NetrwTreeDisplay(direntry,depth) + elseif entry =~ '/$' && has_key(w:netrw_treedict,direntry.'/') +" call Decho("<".direntry."/> is a key in treedict - display subtree for it") + call s:NetrwTreeDisplay(direntry.'/',depth) + else +" call Decho("<".entry."> is not a key in treedict (no subtree)") + call setline(line("$")+1,depth.entry) + endif + endfor +" call Dret("NetrwTreeDisplay") +endfun + +" --------------------------------------------------------------------- +" s:NetrwTreeListing: displays tree listing from treetop on down, using NetrwTreeDisplay() {{{2 +fun! s:NetrwTreeListing(dirname) + if w:netrw_liststyle == s:TREELIST +" call Dfunc("NetrwTreeListing() bufname<".expand("%").">") +" call Decho("curdir<".a:dirname.">") +" call Decho("win#".winnr().": w:netrw_treetop ".(exists("w:netrw_treetop")? "exists" : "doesn't exit")." w:netrw_treedict ".(exists("w:netrw_treedict")? "exists" : "doesn't exit")) + + " update the treetop +" call Decho("update the treetop") + if !exists("w:netrw_treetop") + let w:netrw_treetop= a:dirname +" call Decho("w:netrw_treetop<".w:netrw_treetop."> (reusing)") + elseif (w:netrw_treetop =~ ('^'.a:dirname) && s:Strlen(a:dirname) < s:Strlen(w:netrw_treetop)) || a:dirname !~ ('^'.w:netrw_treetop) + let w:netrw_treetop= a:dirname +" call Decho("w:netrw_treetop<".w:netrw_treetop."> (went up)") + endif + + " insure that we have at least an empty treedict + if !exists("w:netrw_treedict") + let w:netrw_treedict= {} + endif + + " update the directory listing for the current directory +" call Decho("updating dictionary with ".a:dirname.":[..directory listing..]") +" call Decho("bannercnt=".w:netrw_bannercnt." line($)=".line("$")) + exe "silent! keepjumps ".w:netrw_bannercnt.',$g@^\.\.\=/$@d' + let w:netrw_treedict[a:dirname]= getline(w:netrw_bannercnt,line("$")) +" call Decho("w:treedict[".a:dirname."]= ".w:netrw_treedict[a:dirname]) + exe "silent! keepjumps ".w:netrw_bannercnt.",$d" + + " if past banner, record word + if exists("w:netrw_bannercnt") && line(".") > w:netrw_bannercnt + let fname= expand("<cword>") + else + let fname= "" + endif +" call Decho("fname<".fname.">") + + " display from treetop on down + call s:NetrwTreeDisplay(w:netrw_treetop,"") + +" call Dret("NetrwTreeListing : bufname<".expand("%").">") + endif +endfun + +" --------------------------------------------------------------------- +" s:NetrwWideListing: {{{2 +fun! s:NetrwWideListing() + + if w:netrw_liststyle == s:WIDELIST +" call Dfunc("NetrwWideListing() w:netrw_liststyle=".w:netrw_liststyle.' fo='.&fo.' l:fo='.&l:fo) + " look for longest filename (cpf=characters per filename) + " cpf: characters per file + " fpl: files per line + " fpc: files per column + setlocal ma noro +" call Decho("setlocal ma noro") + let b:netrw_cpf= 0 + if line("$") >= w:netrw_bannercnt + exe 'silent keepjumps '.w:netrw_bannercnt.',$g/^./if virtcol("$") > b:netrw_cpf|let b:netrw_cpf= virtcol("$")|endif' + else +" call Dret("NetrwWideListing") + return + endif +" call Decho("max file strlen+1=".b:netrw_cpf) + let b:netrw_cpf= b:netrw_cpf + 1 + + " determine qty files per line (fpl) + let w:netrw_fpl= winwidth(0)/b:netrw_cpf + if w:netrw_fpl <= 0 + let w:netrw_fpl= 1 + endif +" call Decho("fpl= ".winwidth(0)."/[b:netrw_cpf=".b:netrw_cpf.']='.w:netrw_fpl) + + " make wide display + exe 'silent keepjumps '.w:netrw_bannercnt.',$s/^.*$/\=escape(printf("%-'.b:netrw_cpf.'s",submatch(0)),"\\")/' + let fpc = (line("$") - w:netrw_bannercnt + w:netrw_fpl)/w:netrw_fpl + let newcolstart = w:netrw_bannercnt + fpc + let newcolend = newcolstart + fpc - 1 +" call Decho("bannercnt=".w:netrw_bannercnt." fpl=".w:netrw_fpl." fpc=".fpc." newcol[".newcolstart.",".newcolend."]") + silent! let keepregstar = @* + while line("$") >= newcolstart + if newcolend > line("$") | let newcolend= line("$") | endif + let newcolqty= newcolend - newcolstart + exe newcolstart + if newcolqty == 0 + exe "silent keepjumps norm! 0\<c-v>$hx".w:netrw_bannercnt."G$p" + else + exe "silent keepjumps norm! 0\<c-v>".newcolqty.'j$hx'.w:netrw_bannercnt.'G$p' + endif + exe "silent keepjumps ".newcolstart.','.newcolend.'d' + exe 'silent keepjumps '.w:netrw_bannercnt + endwhile + silent! let @*= keepregstar + exe "silent keepjumps ".w:netrw_bannercnt.',$s/\s\+$//e' + setlocal noma nomod ro +" call Dret("NetrwWideListing") + endif + +endfun + +" --------------------------------------------------------------------- +" s:PerformListing: {{{2 +fun! s:PerformListing(islocal) +" call Dfunc("s:PerformListing(islocal=".a:islocal.") buf(%)=".bufnr("%")."<".bufname("%").">") + + call s:NetrwSafeOptions() + setlocal noro ma +" call Decho("setlocal noro ma") + +" if exists("g:netrw_silent") && g:netrw_silent == 0 && &ch >= 1 " Decho +" call Decho("(netrw) Processing your browsing request...") +" endif " Decho + +" call Decho('w:netrw_liststyle='.(exists("w:netrw_liststyle")? w:netrw_liststyle : 'n/a')) + if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("w:netrw_treedict") + " force a refresh for tree listings +" call Decho("force refresh for treelisting: clear buffer<".expand("%")."> with :%d") + keepjumps %d + endif + + " save current directory on directory history list + call s:NetrwBookmarkDir(3,b:netrw_curdir) + + " Set up the banner {{{3 +" call Decho("set up banner") + keepjumps put ='\" ============================================================================' + keepjumps put ='\" Netrw Directory Listing (netrw '.g:loaded_netrw.')' + keepjumps put ='\" '.b:netrw_curdir + keepjumps 1d + let w:netrw_bannercnt= 3 + exe "keepjumps ".w:netrw_bannercnt + + let sortby= g:netrw_sort_by + if g:netrw_sort_direction =~ "^r" + let sortby= sortby." reversed" + endif + + " Sorted by... {{{3 +" call Decho("handle specified sorting: g:netrw_sort_by<".g:netrw_sort_by.">") + if g:netrw_sort_by =~ "^n" +" call Decho("directories will be sorted by name") + " sorted by name + keepjumps put ='\" Sorted by '.sortby + keepjumps put ='\" Sort sequence: '.g:netrw_sort_sequence + let w:netrw_bannercnt= w:netrw_bannercnt + 2 + else +" call Decho("directories will be sorted by size or time") + " sorted by size or date + keepjumps put ='\" Sorted by '.sortby + let w:netrw_bannercnt= w:netrw_bannercnt + 1 + endif + exe "keepjumps ".w:netrw_bannercnt + + " show copy/move target, if any + if exists("s:netrwmftgt") && exists("s:netrwmftgt_islocal") +" call Decho("show copy/move target<".s:netrwmftgt.">") + keepjumps put ='' + if s:netrwmftgt_islocal + call setline(line("."),'" Copy/Move Tgt: '.s:netrwmftgt.' (local)') + else + call setline(line("."),'" Copy/Move Tgt: '.s:netrwmftgt.' (remote)') + endif + let w:netrw_bannercnt= w:netrw_bannercnt + 1 + else +" call Decho("s:netrwmftgt does not exist, don't make Copy/Move Tgt") + endif + exe "keepjumps ".w:netrw_bannercnt + + " Hiding... -or- Showing... {{{3 +" call Decho("handle hiding/showing (g:netrw_hide=".g:netrw_list_hide." g:netrw_list_hide<".g:netrw_list_hide.">)") + if g:netrw_list_hide != "" && g:netrw_hide + if g:netrw_hide == 1 + keepjumps put ='\" Hiding: '.g:netrw_list_hide + else + keepjumps put ='\" Showing: '.g:netrw_list_hide + endif + let w:netrw_bannercnt= w:netrw_bannercnt + 1 + endif + exe "keepjumps ".w:netrw_bannercnt + keepjumps put ='\" Quick Help: <F1>:help -:go up dir D:delete R:rename s:sort-by x:exec' + keepjumps put ='\" ============================================================================' + let w:netrw_bannercnt= w:netrw_bannercnt + 2 + + " bannercnt should index the line just after the banner + let w:netrw_bannercnt= w:netrw_bannercnt + 1 + exe "keepjumps ".w:netrw_bannercnt +" call Decho("bannercnt=".w:netrw_bannercnt." (should index line just after banner) line($)=".line("$")) + + " set up syntax highlighting {{{3 +" call Decho("set up syntax highlighting") + if has("syntax") + setlocal ft=netrw + if !exists("g:syntax_on") || !g:syntax_on + setlocal ft= + endif + endif + + " get list of files +" call Decho("Get list of files - islocal=".a:islocal) + if a:islocal + call s:LocalListing() + else " remote + call s:NetrwRemoteListing() + endif +" call Decho("w:netrw_bannercnt=".w:netrw_bannercnt." (banner complete)") + + " manipulate the directory listing (hide, sort) {{{3 + if line("$") >= w:netrw_bannercnt +" call Decho("manipulate directory listing (hide)") +" call Decho("g:netrw_hide=".g:netrw_hide." g:netrw_list_hide<".g:netrw_list_hide.">") + if g:netrw_hide && g:netrw_list_hide != "" + call s:NetrwListHide() + endif + if line("$") >= w:netrw_bannercnt +" call Decho("manipulate directory listing (sort) : g:netrw_sort_by<".g:netrw_sort_by.">") + + if g:netrw_sort_by =~ "^n" + " sort by name + call s:NetrwSetSort() + + if w:netrw_bannercnt < line("$") +" call Decho("g:netrw_sort_direction=".g:netrw_sort_direction." (bannercnt=".w:netrw_bannercnt.")") + if g:netrw_sort_direction =~ 'n' + " normal direction sorting + exe 'silent keepjumps '.w:netrw_bannercnt.',$sort'.' '.g:netrw_sort_options + else + " reverse direction sorting + exe 'silent keepjumps '.w:netrw_bannercnt.',$sort!'.' '.g:netrw_sort_options + endif + endif + " remove priority pattern prefix +" call Decho("remove priority pattern prefix") + let sepchr= "\<Char-0xff>" + exe 'silent keepjumps '.w:netrw_bannercnt.',$s/^\d\{3}'.sepchr.'//e' + + elseif a:islocal + if w:netrw_bannercnt < line("$") +" call Decho("g:netrw_sort_direction=".g:netrw_sort_direction) + if g:netrw_sort_direction =~ 'n' +" call Decho('exe silent keepjumps '.w:netrw_bannercnt.',$sort') + exe 'silent keepjumps '.w:netrw_bannercnt.',$sort'.' '.g:netrw_sort_options + else +" call Decho('exe silent keepjumps '.w:netrw_bannercnt.',$sort!') + exe 'silent keepjumps '.w:netrw_bannercnt.',$sort!'.' '.g:netrw_sort_options + endif + endif + exe 'silent keepjumps '.w:netrw_bannercnt.',$s/^\d\{-}\///e' + endif + + elseif g:netrw_sort_direction =~ 'r' +" call Decho('reverse the sorted listing') + exe 'silent keepjumps '.w:netrw_bannercnt.'g/^/m '.w:netrw_bannercnt + endif + endif + + " convert to wide/tree listing {{{3 +" call Decho("modify display if wide/tree listing style") + call s:NetrwWideListing() + call s:NetrwTreeListing(b:netrw_curdir) + + if exists("w:netrw_bannercnt") && line("$") > w:netrw_bannercnt + " place cursor on the top-left corner of the file listing +" call Decho("place cursor on top-left corner of file listing") + exe 'silent keepjumps '.w:netrw_bannercnt + norm! 0 + endif + + " record previous current directory + let w:netrw_prvdir= b:netrw_curdir +" call Decho("record netrw_prvdir<".w:netrw_prvdir.">") + + " save certain window-oriented variables into buffer-oriented variables {{{3 + call s:SetBufWinVars() + call s:NetrwOptionRestore("w:") + + " set display to netrw display settings +" call Decho("set display to netrw display settings (noma nomod etc)") + setlocal noma nomod nonu nobl nowrap ro + if exists("s:treecurpos") + + call netrw#NetrwRestorePosn(s:treecurpos) + unlet s:treecurpos + endif + +" call Dret("s:PerformListing : curpos<".string(getpos(".")).">") +endfun + +" --------------------------------------------------------------------- +" s:SetupNetrwStatusLine: {{{2 +fun! s:SetupNetrwStatusLine(statline) +" call Dfunc("SetupNetrwStatusLine(statline<".a:statline.">)") + + if !exists("s:netrw_setup_statline") + let s:netrw_setup_statline= 1 +" call Decho("do first-time status line setup") + + if !exists("s:netrw_users_stl") + let s:netrw_users_stl= &stl + endif + if !exists("s:netrw_users_ls") + let s:netrw_users_ls= &laststatus + endif + + " set up User9 highlighting as needed + let keepa= @a + redir @a + try + hi User9 + catch /^Vim\%((\a\+)\)\=:E411/ + if &bg == "dark" + hi User9 ctermfg=yellow ctermbg=blue guifg=yellow guibg=blue + else + hi User9 ctermbg=yellow ctermfg=blue guibg=yellow guifg=blue + endif + endtry + redir END + let @a= keepa + endif + + " set up status line (may use User9 highlighting) + " insure that windows have a statusline + " make sure statusline is displayed + let &stl=a:statline + setlocal laststatus=2 +" call Decho("stl=".&stl) + redraw + +" call Dret("SetupNetrwStatusLine : stl=".&stl) +endfun + +" --------------------------------------------------------------------- +" Remote Directory Browsing Support: {{{1 +" =========================================== + +" --------------------------------------------------------------------- +" s:NetrwRemoteListing: {{{2 +fun! s:NetrwRemoteListing() +" call Dfunc("s:NetrwRemoteListing() b:netrw_curdir<".b:netrw_curdir.">)") + + call s:RemotePathAnalysis(b:netrw_curdir) + + " sanity check: + if exists("b:netrw_method") && b:netrw_method =~ '[235]' +" call Decho("b:netrw_method=".b:netrw_method) + if !executable("ftp") + if !exists("g:netrw_quiet") + call netrw#ErrorMsg(s:ERROR,"this system doesn't support remote directory listing via ftp",18) + endif + call s:NetrwOptionRestore("w:") +" call Dret("s:NetrwRemoteListing") + return + endif + + elseif !exists("g:netrw_list_cmd") || g:netrw_list_cmd == '' + if !exists("g:netrw_quiet") + if g:netrw_list_cmd == "" + call netrw#ErrorMsg(s:ERROR,g:netrw_ssh_cmd." is not executable on your system",47) + else + call netrw#ErrorMsg(s:ERROR,"this system doesn't support remote directory listing via ".g:netrw_list_cmd,19) + endif + endif + + call s:NetrwOptionRestore("w:") +" call Dret("s:NetrwRemoteListing") + return + endif " (remote handling sanity check) + + if exists("b:netrw_method") +" call Decho("setting w:netrw_method<".b:netrw_method.">") + let w:netrw_method= b:netrw_method + endif + + if s:method == "ftp" + " use ftp to get remote file listing +" call Decho("use ftp to get remote file listing") + let s:method = "ftp" + let listcmd = g:netrw_ftp_list_cmd + if g:netrw_sort_by =~ '^t' + let listcmd= g:netrw_ftp_timelist_cmd + elseif g:netrw_sort_by =~ '^s' + let listcmd= g:netrw_ftp_sizelist_cmd + endif +" call Decho("listcmd<".listcmd."> (using g:netrw_ftp_list_cmd)") + call s:NetrwRemoteFtpCmd(s:path,listcmd) +" exe "keepjumps ".w:netrw_bannercnt.',$g/^./call Decho("raw listing: ".getline("."))' + + if w:netrw_liststyle == s:THINLIST || w:netrw_liststyle == s:WIDELIST || w:netrw_liststyle == s:TREELIST + " shorten the listing +" call Decho("generate short listing") + exe "keepjumps ".w:netrw_bannercnt + + " cleanup + if g:netrw_ftp_browse_reject != "" + exe "silent! g/".g:netrw_ftp_browse_reject."/keepjumps d" + endif + silent! keepjumps %s/\r$//e + + " if there's no ../ listed, then put ./ and ../ in + let line1= line(".") + exe "keepjumps ".w:netrw_bannercnt + let line2= search('^\.\.\/\%(\s\|$\)','cnW') + if line2 == 0 +" call Decho("netrw is putting ./ and ../ into listing") + keepjumps put='../' + keepjumps put='./' + endif + exe "keepjumps ".line1 + keepjumps norm! 0 + +" call Decho("line1=".line1." line2=".line2." line(.)=".line(".")) + if search('^\d\{2}-\d\{2}-\d\{2}\s','n') " M$ ftp site cleanup +" call Decho("M$ ftp cleanup") + exe 'silent! keepjumps '.w:netrw_bannercnt.',$s/^\d\{2}-\d\{2}-\d\{2}\s\+\d\+:\d\+[AaPp][Mm]\s\+\%(<DIR>\|\d\+\)\s\+//' + else " normal ftp cleanup +" call Decho("normal ftp cleanup") + exe 'silent! keepjumps '.w:netrw_bannercnt.',$s/^\(\%(\S\+\s\+\)\{7}\S\+\)\s\+\(\S.*\)$/\2/e' + exe "silent! keepjumps ".w:netrw_bannercnt.',$g/ -> /s# -> .*/$#/#e' + exe "silent! keepjumps ".w:netrw_bannercnt.',$g/ -> /s# -> .*$#/#e' + endif + endif + + else + " use ssh to get remote file listing {{{3 +" call Decho("use ssh to get remote file listing: s:path<".s:path.">") + let listcmd= s:MakeSshCmd(g:netrw_list_cmd) +" call Decho("listcmd<".listcmd."> (using g:netrw_list_cmd)") + if g:netrw_scp_cmd =~ '^pscp' +" call Decho("1: exe silent r! ".shellescape(listcmd.s:path, 1)) + exe "silent r! ".listcmd.shellescape(s:path, 1) + " remove rubbish and adjust listing format of 'pscp' to 'ssh ls -FLa' like + g/^Listing directory/d + g/^d[-rwx][-rwx][-rwx]/s+$+/+e + silent g/^l[-rwx][-rwx][-rwx]/s+$+@+e + if g:netrw_liststyle != s:LONGLIST + g/^[dlsp-][-rwx][-rwx][-rwx]/s/^.*\s\(\S\+\)$/\1/e + endif + else + if s:path == "" +" call Decho("2: exe silent r! ".listcmd) + exe "silent r! ".listcmd + else +" call Decho("3: exe silent r! ".listcmd.' '.shellescape(s:path,1)) + exe "silent r! ".listcmd.' '.shellescape(s:path,1) +" call Decho("listcmd<".listcmd."> path<".s:path.">") + endif + endif + + " cleanup + if g:netrw_ftp_browse_reject != "" +" call Decho("(cleanup) exe silent! g/".g:netrw_ssh_browse_reject."/keepjumps d") + exe "silent! g/".g:netrw_ssh_browse_reject."/keepjumps d" + endif + endif + + if w:netrw_liststyle == s:LONGLIST + " do a long listing; these substitutions need to be done prior to sorting {{{3 +" call Decho("fix long listing:") + + if s:method == "ftp" + " cleanup + exe "keepjumps ".w:netrw_bannercnt + while getline('.') =~ g:netrw_ftp_browse_reject + keepjumps d + endwhile + " if there's no ../ listed, then put ./ and ../ in + let line1= line(".") + keepjumps 1 + silent keepjumps call search('^\.\.\/\%(\s\|$\)','W') + let line2= line(".") + if line2 == 0 + exe 'keepjumps '.w:netrw_bannercnt."put='./'" + if b:netrw_curdir != '/' + exe 'keepjumps '.w:netrw_bannercnt."put='../'" + endif + endif + exe "keepjumps ".line1 + keepjumps norm! 0 + endif + + if search('^\d\{2}-\d\{2}-\d\{2}\s','n') " M$ ftp site cleanup +" call Decho("M$ ftp site listing cleanup") + exe 'silent! keepjumps '.w:netrw_bannercnt.',$s/^\(\d\{2}-\d\{2}-\d\{2}\s\+\d\+:\d\+[AaPp][Mm]\s\+\%(<DIR>\|\d\+\)\s\+\)\(\w.*\)$/\2\t\1/' + elseif exists("w:netrw_bannercnt") && w:netrw_bannercnt <= line("$") +" call Decho("normal ftp site listing cleanup: bannercnt=".w:netrw_bannercnt." line($)=".line("$")) + exe 'silent keepjumps '.w:netrw_bannercnt.',$s/ -> .*$//e' + exe 'silent keepjumps '.w:netrw_bannercnt.',$s/^\(\%(\S\+\s\+\)\{7}\S\+\)\s\+\(\S.*\)$/\2\t\1/e' + exe 'silent keepjumps '.w:netrw_bannercnt + endif + endif + +" if exists("w:netrw_bannercnt") && w:netrw_bannercnt <= line("$") " Decho +" exe "keepjumps ".w:netrw_bannercnt.',$g/^./call Decho("listing: ".getline("."))' +" endif " Decho +" call Dret("s:NetrwRemoteListing") +endfun + +" --------------------------------------------------------------------- +" s:NetrwRemoteRm: remove/delete a remote file or directory {{{2 +fun! s:NetrwRemoteRm(usrhost,path) range +" call Dfunc("s:NetrwRemoteRm(usrhost<".a:usrhost."> path<".a:path.">) virtcol=".virtcol(".")) +" call Decho("firstline=".a:firstline." lastline=".a:lastline) + let svpos= netrw#NetrwSavePosn() + + let all= 0 + if exists("s:netrwmarkfilelist_{bufnr('%')}") + " remove all marked files +" call Decho("remove all marked files with bufnr#".bufnr("%")) + for fname in s:netrwmarkfilelist_{bufnr("%")} + let ok= s:NetrwRemoteRmFile(a:path,fname,all) + if ok =~ 'q\%[uit]' + break + elseif ok =~ 'a\%[ll]' + let all= 1 + endif + endfor + call s:NetrwUnmarkList(bufnr("%"),b:netrw_curdir) + + else + " remove files specified by range +" call Decho("remove files specified by range") + + " preparation for removing multiple files/directories + let ctr= a:firstline + + " remove multiple files and directories + while ctr <= a:lastline + exe ctr + let ok= s:NetrwRemoteRmFile(a:path,s:NetrwGetWord(),all) + if ok =~ 'q\%[uit]' + break + elseif ok =~ 'a\%[ll]' + let all= 1 + endif + let ctr= ctr + 1 + endwhile + endif + + " refresh the (remote) directory listing +" call Decho("refresh remote directory listing") + call s:NetrwRefresh(0,s:NetrwBrowseChgDir(0,'./')) + call netrw#NetrwRestorePosn(svpos) + +" call Dret("s:NetrwRemoteRm") +endfun + +" --------------------------------------------------------------------- +" s:NetrwRemoteRmFile: {{{2 +fun! s:NetrwRemoteRmFile(path,rmfile,all) +" call Dfunc("s:NetrwRemoteRmFile(path<".a:path."> rmfile<".a:rmfile.">) all=".a:all) + + let all= a:all + let ok = "" + + if a:rmfile !~ '^"' && (a:rmfile =~ '@$' || a:rmfile !~ '[\/]$') + " attempt to remove file +" call Decho("attempt to remove file (all=".all.")") + if !all + echohl Statement +" call Decho("case all=0:") + call inputsave() + let ok= input("Confirm deletion of file<".a:rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ") + call inputrestore() + echohl NONE + if ok == "" + let ok="no" + endif + let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e') + if ok =~ 'a\%[ll]' + let all= 1 + endif + endif + + if all || ok =~ 'y\%[es]' || ok == "" +" call Decho("case all=".all." or ok<".ok.">".(exists("w:netrw_method")? ': netrw_method='.w:netrw_method : "")) + if exists("w:netrw_method") && (w:netrw_method == 2 || w:netrw_method == 3) +" call Decho("case ftp:") + let path= a:path + if path =~ '^\a\+://' + let path= substitute(path,'^\a\+://[^/]\+/','','') + endif + silent! keepjumps .,$d + call s:NetrwRemoteFtpCmd(path,"delete ".'"'.a:rmfile.'"') + else +" call Decho("case ssh: g:netrw_rm_cmd<".g:netrw_rm_cmd.">") + let netrw_rm_cmd= s:MakeSshCmd(g:netrw_rm_cmd) +" call Decho("netrw_rm_cmd<".netrw_rm_cmd.">") + if !exists("b:netrw_curdir") + call netrw#ErrorMsg(s:ERROR,"for some reason b:netrw_curdir doesn't exist!",53) + let ok="q" + else + let remotedir= substitute(b:netrw_curdir,'^.*//[^/]\+/\(.*\)$','\1','') +" call Decho("netrw_rm_cmd<".netrw_rm_cmd.">") +" call Decho("remotedir<".remotedir.">") +" call Decho("rmfile<".a:rmfile.">") + if remotedir != "" + let netrw_rm_cmd= netrw_rm_cmd." ".shellescape(fnameescape(remotedir.a:rmfile)) + else + let netrw_rm_cmd= netrw_rm_cmd." ".shellescape(fnameescape(a:rmfile)) + endif +" call Decho("call system(".netrw_rm_cmd.")") + let ret= system(netrw_rm_cmd) + if ret != 0 + call netrw#ErrorMsg(s:WARNING,"cmd<".netrw_rm_cmd."> failed",60) + endif +" call Decho("returned=".ret." errcode=".v:shell_error) + endif + endif + elseif ok =~ 'q\%[uit]' +" call Decho("ok==".ok) + break + endif + + else + " attempt to remove directory +" call Decho("attempt to remove directory") + if !all + call inputsave() + let ok= input("Confirm deletion of directory<".a:rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ") + call inputrestore() + if ok == "" + let ok="no" + endif + let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e') + if ok =~ 'a\%[ll]' + let all= 1 + endif + endif + + if all || ok =~ 'y\%[es]' || ok == "" + if exists("w:netrw_method") && (w:netrw_method == 2 || w:netrw_method == 3) + call s:NetrwRemoteFtpCmd(a:path,"rmdir ".a:rmfile) + else + let rmfile = substitute(a:path.a:rmfile,'/$','','') + let netrw_rmdir_cmd = s:MakeSshCmd(s:WinPath(g:netrw_rmdir_cmd)).' '.shellescape(s:WinPath(rmfile)) +" call Decho("attempt to remove dir: system(".netrw_rmdir_cmd.")") + let ret= system(netrw_rmdir_cmd) +" call Decho("returned=".ret." errcode=".v:shell_error) + + if v:shell_error != 0 +" call Decho("v:shell_error not 0") + let netrw_rmf_cmd= s:MakeSshCmd(s:WinPath(g:netrw_rmf_cmd)).' '.shellescape(s:WinPath(substitute(rmfile,'[\/]$','','e'))) +" call Decho("2nd attempt to remove dir: system(".netrw_rmf_cmd.")") + let ret= system(netrw_rmf_cmd) +" call Decho("returned=".ret." errcode=".v:shell_error) + + if v:shell_error != 0 && !exists("g:netrw_quiet") + call netrw#ErrorMsg(s:ERROR,"unable to remove directory<".rmfile."> -- is it empty?",22) + endif + endif + endif + + elseif ok =~ 'q\%[uit]' + break + endif + endif + +" call Dret("s:NetrwRemoteRmFile ".ok) + return ok +endfun + +" --------------------------------------------------------------------- +" s:NetrwRemoteFtpCmd: unfortunately, not all ftp servers honor options for ls {{{2 +" This function assumes that a long listing will be received. Size, time, +" and reverse sorts will be requested of the server but not otherwise +" enforced here. +fun! s:NetrwRemoteFtpCmd(path,listcmd) +" call Dfunc("NetrwRemoteFtpCmd(path<".a:path."> listcmd<".a:listcmd.">) netrw_method=".w:netrw_method) +" call Decho("line($)=".line("$")." bannercnt=".w:netrw_bannercnt) + + " because WinXX ftp uses unix style input + let ffkeep= &ff + setlocal ma ff=unix noro +" call Decho("setlocal ma ff=unix noro") + + " clear off any older non-banner lines + " note that w:netrw_bannercnt indexes the line after the banner +" call Decho('exe silent! keepjumps '.w:netrw_bannercnt.",$d (clear off old non-banner lines)") + exe "silent! keepjumps ".w:netrw_bannercnt.",$d" + + "......................................... + if w:netrw_method == 2 || w:netrw_method == 5 + " ftp + <.netrc>: Method #2 + if a:path != "" + put ='cd \"'.a:path.'\"' + endif + if exists("g:netrw_ftpextracmd") + put =g:netrw_ftpextracmd +" call Decho("filter input: ".getline('.')) + endif + call setline(line("$")+1,a:listcmd) +" exe "keepjumps ".w:netrw_bannercnt.',$g/^./call Decho("ftp#".line(".").": ".getline("."))' + if exists("g:netrw_port") && g:netrw_port != "" +" call Decho("exe ".s:netrw_silentxfer.w:netrw_bannercnt.",$!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1)) + exe s:netrw_silentxfer." keepjumps ".w:netrw_bannercnt.",$!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1) + else +" call Decho("exe ".s:netrw_silentxfer.w:netrw_bannercnt.",$!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)) + exe s:netrw_silentxfer." keepjumps ".w:netrw_bannercnt.",$!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1) + endif + + "......................................... + elseif w:netrw_method == 3 + " ftp + machine,id,passwd,filename: Method #3 + setlocal ff=unix + if exists("g:netrw_port") && g:netrw_port != "" + put ='open '.g:netrw_machine.' '.g:netrw_port + else + put ='open '.g:netrw_machine + endif + + if exists("g:netrw_ftp") && g:netrw_ftp == 1 + put =g:netrw_uid + put ='\"'.s:netrw_passwd.'\"' + else + put ='user \"'.g:netrw_uid.'\" \"'.s:netrw_passwd.'\"' + endif + + if a:path != "" + put ='cd \"'.a:path.'\"' + endif + if exists("g:netrw_ftpextracmd") + put =g:netrw_ftpextracmd +" call Decho("filter input: ".getline('.')) + endif + call setline(line("$")+1,a:listcmd) + + " perform ftp: + " -i : turns off interactive prompting from ftp + " -n unix : DON'T use <.netrc>, even though it exists + " -n win32: quit being obnoxious about password +" exe w:netrw_bannercnt.',$g/^./call Decho("ftp#".line(".").": ".getline("."))' +" call Decho("exe ".s:netrw_silentxfer.w:netrw_bannercnt.",$!".g:netrw_ftp_cmd." -i -n") + exe s:netrw_silentxfer.w:netrw_bannercnt.",$!".g:netrw_ftp_cmd." -i -n" + + "......................................... + else + call netrw#ErrorMsg(s:WARNING,"unable to comply with your request<" . choice . ">",23) + endif + + " cleanup for Windows + if has("win32") || has("win95") || has("win64") || has("win16") + silent! keepjumps %s/\r$//e + endif + if a:listcmd == "dir" + " infer directory/link based on the file permission string + silent! keepjumps g/d\%([-r][-w][-x]\)\{3}/s@$@/@ + silent! keepjumps g/l\%([-r][-w][-x]\)\{3}/s/$/@/ + if w:netrw_liststyle == s:THINLIST || w:netrw_liststyle == s:WIDELIST || w:netrw_liststyle == s:TREELIST + exe "silent! keepjumps ".w:netrw_bannercnt.',$s/^\%(\S\+\s\+\)\{8}//e' + endif + endif + + " ftp's listing doesn't seem to include ./ or ../ + if !search('^\.\/$\|\s\.\/$','wn') + exe 'keepjumps '.w:netrw_bannercnt + put ='./' + endif + if !search('^\.\.\/$\|\s\.\.\/$','wn') + exe 'keepjumps '.w:netrw_bannercnt + put ='../' + endif + + " restore settings + let &ff= ffkeep +" call Dret("NetrwRemoteFtpCmd") +endfun + +" --------------------------------------------------------------------- +" s:NetrwRemoteRename: rename a remote file or directory {{{2 +fun! s:NetrwRemoteRename(usrhost,path) range +" call Dfunc("NetrwRemoteRename(usrhost<".a:usrhost."> path<".a:path.">)") + + " preparation for removing multiple files/directories + let svpos = netrw#NetrwSavePosn() + let ctr = a:firstline + let rename_cmd = s:MakeSshCmd(g:netrw_rename_cmd) + + " rename files given by the markfilelist + if exists("s:netrwmarkfilelist_{bufnr('%')}") + for oldname in s:netrwmarkfilelist_{bufnr("%")} +" call Decho("oldname<".oldname.">") + if exists("subfrom") + let newname= substitute(oldname,subfrom,subto,'') +" call Decho("subfrom<".subfrom."> subto<".subto."> newname<".newname.">") + else + call inputsave() + let newname= input("Moving ".oldname." to : ",oldname) + call inputrestore() + if newname =~ '^s/' + let subfrom = substitute(newname,'^s/\([^/]*\)/.*/$','\1','') + let subto = substitute(newname,'^s/[^/]*/\(.*\)/$','\1','') + let newname = substitute(oldname,subfrom,subto,'') +" call Decho("subfrom<".subfrom."> subto<".subto."> newname<".newname.">") + endif + endif + + if exists("w:netrw_method") && (w:netrw_method == 2 || w:netrw_method == 3) + call s:NetrwRemoteFtpCmd(a:path,"rename ".oldname." ".newname) + else + let oldname= shellescape(a:path.oldname) + let newname= shellescape(a:path.newname) +" call Decho("system(s:WinPath(".rename_cmd.") ".oldname.' '.newname.")") + let ret = system(s:WinPath(rename_cmd).' '.oldname.' '.newname) + endif + + endfor + call s:NetrwUnMarkFile(1) + + else + + " attempt to rename files/directories + while ctr <= a:lastline + exe "keepjumps ".ctr + + let oldname= s:NetrwGetWord() +" call Decho("oldname<".oldname.">") + + call inputsave() + let newname= input("Moving ".oldname." to : ",oldname) + call inputrestore() + + if exists("w:netrw_method") && (w:netrw_method == 2 || w:netrw_method == 3) + call s:NetrwRemoteFtpCmd(a:path,"rename ".oldname." ".newname) + else + let oldname= shellescape(a:path.oldname) + let newname= shellescape(a:path.newname) +" call Decho("system(s:WinPath(".rename_cmd.") ".oldname.' '.newname.")") + let ret = system(s:WinPath(rename_cmd).' '.oldname.' '.newname) + endif + + let ctr= ctr + 1 + endwhile + endif + + " refresh the directory + call s:NetrwRefresh(0,s:NetrwBrowseChgDir(0,'./')) + call netrw#NetrwRestorePosn(svpos) + +" call Dret("NetrwRemoteRename") +endfun + +" --------------------------------------------------------------------- +" Local Directory Browsing Support: {{{1 +" ========================================== + +" --------------------------------------------------------------------- +" netrw#LocalBrowseCheck: {{{2 +fun! netrw#LocalBrowseCheck(dirname) + " unfortunate interaction -- split window debugging can't be + " used here, must use D-echoRemOn or D-echoTabOn -- the BufEnter + " event triggers another call to LocalBrowseCheck() when attempts + " to write to the DBG buffer are made. + " The &ft == "netrw" test was installed because the BufEnter event + " would hit when re-entering netrw windows, creating unexpected + " refreshes (and would do so in the middle of NetrwSaveOptions(), too) +" call Decho("netrw#LocalBrowseCheck: isdir<".a:dirname.">=".isdirectory(a:dirname)) + if isdirectory(a:dirname) +" call Decho(" ft<".&ft."> b:netrw_curdir<".(exists("b:netrw_curdir")? b:netrw_curdir : " doesn't exist")."> dirname<".a:dirname.">"." line($)=".line("$")) + if &ft != "netrw" || (exists("b:netrw_curdir") && b:netrw_curdir != a:dirname) + silent! call s:NetrwBrowse(1,a:dirname) + elseif &ft == "netrw" && line("$") == 1 + silent! call s:NetrwBrowse(1,a:dirname) + endif + endif + " not a directory, ignore it +endfun + +" --------------------------------------------------------------------- +" s:LocalListing: does the job of "ls" for local directories {{{2 +fun! s:LocalListing() +" call Dfunc("s:LocalListing()") +" call Decho("&ma=".&ma) +" call Decho("&mod=".&mod) +" call Decho("&ro=".&ro) +" call Decho("bufname(%)<".bufname("%").">") + +" if exists("b:netrw_curdir") |call Decho('b:netrw_curdir<'.b:netrw_curdir.">") |else|call Decho("b:netrw_curdir doesn't exist") |endif +" if exists("g:netrw_sort_by")|call Decho('g:netrw_sort_by<'.g:netrw_sort_by.">")|else|call Decho("g:netrw_sort_by doesn't exist")|endif + + " get the list of files contained in the current directory + let dirname = escape(b:netrw_curdir,g:netrw_glob_escape) + let dirnamelen = strlen(b:netrw_curdir) + let filelist = glob(s:ComposePath(dirname,"*")) +" call Decho("glob(dirname<".dirname."/*>)=".filelist) + if filelist != "" + let filelist= filelist."\n" + endif + let filelist= filelist.glob(s:ComposePath(dirname,".*")) +" call Decho("glob(dirname<".dirname."/.*>)=".filelist) + + " Coding choice: either elide ./ if present + " or include ./ if not present + if filelist =~ '[\\/]\.[\\/]\=\(\n\|$\)' + " elide /path/. from glob() entries if present +" call Decho("elide /path/. from glob entries if present") + let filelist = substitute(filelist,'\n','\t','g') + let filelist = substitute(filelist,'^[^\t]\+[/\\]\.\t','','') + let filelist = substitute(filelist,'[^\t]\+[/\\]\.$','','') + let filelist = substitute(filelist,'\t\zs[^\t]\+[/\\]\.\t','','') + let filelist = substitute(filelist,'\t','\n','g') + endif +" call Decho("filelist<".filelist.">") + if filelist !~ '[\\/]\.\.[\\/]\=\(\n\|$\)' + " include ../ in the glob() entry if its missing +" call Decho("forcibly tacking on ..") + let filelist= filelist."\n".s:ComposePath(b:netrw_curdir,"../") +" call Decho("filelist<".filelist.">") + endif + if b:netrw_curdir == '/' + " remove .. from filelist when current directory is root directory +" call Decho("remove .. from filelist") + let filelist= substitute(filelist,'/\.\.\n','','') + endif + " remove multiple contiguous newlines + let filelist= substitute(filelist,'\n\{2,}','\n','ge') + if !g:netrw_cygwin && (has("win32") || has("win95") || has("win64") || has("win16")) + " change all \s to /s +" call Decho('change all \s to /s') + let filelist= substitute(filelist,'\','/','g') + else + " escape all \s to \\ +" call Decho('escape all \s to \\') + let filelist= substitute(filelist,'\','\\','g') + endif + +" call Decho("(before while) dirname<".dirname.">") +" call Decho("(before while) dirnamelen<".dirnamelen.">") +" call Decho("(before while) filelist<".filelist.">") + + while filelist != "" + if filelist =~ '\n' + let filename = substitute(filelist,'\n.*$','','e') + let filelist = substitute(filelist,'^.\{-}\n\(.*\)$','\1','e') + else + let filename = filelist + let filelist = "" + endif +" call Decho(" ") +" call Decho("(while) filelist<".filelist.">") +" call Decho("(while) filename<".filename.">") + + if getftype(filename) == "link" + " indicate a symbolic link +" call Decho("indicate <".filename."> is a symbolic link with trailing @") + let pfile= filename."@" + + elseif getftype(filename) == "socket" + " indicate a socket +" call Decho("indicate <".filename."> is a socket with trailing =") + let pfile= filename."=" + + elseif getftype(filename) == "fifo" + " indicate a fifo +" call Decho("indicate <".filename."> is a fifo with trailing |") + let pfile= filename."|" + + elseif isdirectory(filename) + " indicate a directory +" call Decho("indicate <".filename."> is a directory with trailing /") + let pfile= filename."/" + + elseif exists("b:netrw_curdir") && b:netrw_curdir !~ '^.*://' && !isdirectory(filename) + if (has("win32") || has("win95") || has("win64") || has("win16")) + if filename =~ '\.[eE][xX][eE]$' || filename =~ '\.[cC][oO][mM]$' || filename =~ '\.[bB][aA][tT]$' + " indicate an executable +" call Decho("indicate <".filename."> is executable with trailing *") + let pfile= filename."*" + else + " normal file + let pfile= filename + endif + elseif executable(filename) + " indicate an executable +" call Decho("indicate <".filename."> is executable with trailing *") + let pfile= filename."*" + else + " normal file + let pfile= filename + endif + + else + " normal file + let pfile= filename + endif +" call Decho("pfile<".pfile."> (after *@/ appending)") + + if pfile =~ '//$' + let pfile= substitute(pfile,'//$','/','e') +" call Decho("change // to /: pfile<".pfile.">") + endif + let pfile= strpart(pfile,dirnamelen) + let pfile= substitute(pfile,'^[/\\]','','e') +" call Decho("filename<".filename.">") +" call Decho("pfile <".pfile.">") + + if w:netrw_liststyle == s:LONGLIST + let sz = getfsize(filename) + let fsz = strpart(" ",1,15-s:Strlen(sz)).sz + let pfile= pfile."\t".fsz." ".strftime(g:netrw_timefmt,getftime(filename)) +" call Decho("sz=".sz." fsz=".fsz) + endif + + if g:netrw_sort_by =~ "^t" + " sort by time (handles time up to 1 quintillion seconds, US) +" call Decho("getftime(".filename.")=".getftime(filename)) + let t = getftime(filename) + let ft = strpart("000000000000000000",1,18-s:Strlen(t)).t +" call Decho("exe keepjumps put ='".ft.'/'.filename."'") + let ftpfile= ft.'/'.pfile + keepjumps silent! put=ftpfile + + elseif g:netrw_sort_by =~ "^s" + " sort by size (handles file sizes up to 1 quintillion bytes, US) +" call Decho("getfsize(".filename.")=".getfsize(filename)) + let sz = getfsize(filename) + let fsz = strpart("000000000000000000",1,18-s:Strlen(sz)).sz +" call Decho("exe keepjumps put ='".fsz.'/'.filename."'") + let fszpfile= fsz.'/'.pfile + keepjumps silent! put =fszpfile + + else + " sort by name +" call Decho("exe keepjumps put ='".pfile."'") + keepjumps silent! put=pfile + endif + endwhile + + " cleanup any windows mess at end-of-line + silent! keepjumps %s/\r$//e + exe "setlocal ts=".g:netrw_maxfilenamelen +" call Decho("setlocal ts=".g:netrw_maxfilenamelen) + +" call Dret("s:LocalListing") +endfun + +" --------------------------------------------------------------------- +" s:LocalBrowseShellCmdRefresh: this function is called after a user has {{{2 +" performed any shell command. The idea is to cause all local-browsing +" buffers to be refreshed after a user has executed some shell command, +" on the chance that s/he removed/created a file/directory with it. +fun! s:LocalBrowseShellCmdRefresh() +" call Dfunc("LocalBrowseShellCmdRefresh() browselist=".(exists("s:netrw_browselist")? string(s:netrw_browselist) : "empty")." ".tabpagenr("$")." tabs") + " determine which buffers currently reside in a tab + if !exists("s:netrw_browselist") +" call Dret("LocalBrowseShellCmdRefresh : browselist is empty") + return + endif + if !exists("w:netrw_bannercnt") +" call Dret("LocalBrowseShellCmdRefresh : don't refresh when focus not on netrw windwo") + return + endif + let itab = 1 + let buftablist = [] + while itab <= tabpagenr("$") + let buftablist = buftablist + tabpagebuflist() + let itab = itab + 1 + tabn + endwhile +" call Decho("buftablist".string(buftablist)) +" call Decho("s:netrw_browselist<".(exists("s:netrw_browselist")? string(s:netrw_browselist) : "").">") + " GO through all buffers on netrw_browselist (ie. just local-netrw buffers): + " | refresh any netrw window + " | wipe out any non-displaying netrw buffer + let curwin = winnr() + let ibl = 0 + for ibuf in s:netrw_browselist +" call Decho("bufwinnr(".ibuf.") index(buftablist,".ibuf.")=".index(buftablist,ibuf)) + if bufwinnr(ibuf) == -1 && index(buftablist,ibuf) == -1 + " wipe out any non-displaying netrw buffer +" call Decho("wiping buf#".ibuf,"<".bufname(ibuf).">") + exe "silent! bd ".fnameescape(ibuf) + call remove(s:netrw_browselist,ibl) +" call Decho("browselist=".string(s:netrw_browselist)) + continue + elseif index(tabpagebuflist(),ibuf) != -1 + " refresh any netrw buffer +" call Decho("refresh buf#".ibuf.'-> win#'.bufwinnr(ibuf)) + exe bufwinnr(ibuf)."wincmd w" + call s:NetrwRefresh(1,s:NetrwBrowseChgDir(1,'./')) + endif + let ibl= ibl + 1 + endfor + exe curwin."wincmd w" + +" call Dret("LocalBrowseShellCmdRefresh") +endfun + +" --------------------------------------------------------------------- +" s:NetrwLocalRm: {{{2 +fun! s:NetrwLocalRm(path) range +" call Dfunc("s:NetrwLocalRm(path<".a:path.">)") +" call Decho("firstline=".a:firstline." lastline=".a:lastline) + + " preparation for removing multiple files/directories + let ret = 0 + let all = 0 + let svpos = netrw#NetrwSavePosn() + + if exists("s:netrwmarkfilelist_{bufnr('%')}") + " remove all marked files +" call Decho("remove all marked files") + for fname in s:netrwmarkfilelist_{bufnr("%")} + let ok= s:NetrwLocalRmFile(a:path,fname,all) + if ok =~ 'q\%[uit]' || ok == "no" + break + elseif ok =~ 'a\%[ll]' + let all= 1 + endif + endfor + call s:NetrwUnMarkFile(1) + + else + " remove (multiple) files and directories +" call Decho("remove files in range [".a:firstline.",".a:lastline."]") + + let ctr = a:firstline + while ctr <= a:lastline + exe "keepjumps ".ctr + + " sanity checks + if line(".") < w:netrw_bannercnt + let ctr= ctr + 1 + continue + endif + let curword= s:NetrwGetWord() + if curword == "./" || curword == "../" + let ctr= ctr + 1 + continue + endif + let ok= s:NetrwLocalRmFile(a:path,curword,all) + if ok =~ 'q\%[uit]' || ok == "no" + break + elseif ok =~ 'a\%[ll]' + let all= 1 + endif + let ctr= ctr + 1 + endwhile + endif + + " refresh the directory +" call Decho("bufname<".bufname("%").">") + if bufname("%") != "NetrwMessage" + call s:NetrwRefresh(1,s:NetrwBrowseChgDir(1,'./')) + call netrw#NetrwRestorePosn(svpos) + endif + +" call Dret("s:NetrwLocalRm") +endfun + +" --------------------------------------------------------------------- +" s:NetrwLocalRmFile: remove file fname given the path {{{2 +" Give confirmation prompt unless all==1 +fun! s:NetrwLocalRmFile(path,fname,all) +" call Dfunc("s:NetrwLocalRmFile(path<".a:path."> fname<".a:fname."> all=".a:all) + + let all= a:all + let ok = "" + norm! 0 + let rmfile= s:ComposePath(a:path,a:fname) +" call Decho("rmfile<".rmfile.">") + + if rmfile !~ '^"' && (rmfile =~ '@$' || rmfile !~ '[\/]$') + " attempt to remove file +" call Decho("attempt to remove file<".rmfile.">") + if !all + echohl Statement + call inputsave() + let ok= input("Confirm deletion of file<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ") + call inputrestore() + echohl NONE + if ok == "" + let ok="no" + endif +" call Decho("response: ok<".ok.">") + let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e') +" call Decho("response: ok<".ok."> (after sub)") + if ok =~ 'a\%[ll]' + let all= 1 + endif + endif + + if all || ok =~ 'y\%[es]' || ok == "" + let ret= s:NetrwDelete(rmfile) +" call Decho("errcode=".v:shell_error." ret=".ret) + endif + + else + " attempt to remove directory + if !all + echohl Statement + call inputsave() + let ok= input("Confirm deletion of directory<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ") + call inputrestore() + let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e') + if ok == "" + let ok="no" + endif + if ok =~ 'a\%[ll]' + let all= 1 + endif + endif + let rmfile= substitute(rmfile,'[\/]$','','e') + + if all || ok =~ 'y\%[es]' || ok == "" +" call Decho("1st attempt: system(s:WinPath(".g:netrw_local_rmdir.') '.shellescape(rmfile).')') + call system(s:WinPath(g:netrw_local_rmdir).' '.shellescape(rmfile)) +" call Decho("v:shell_error=".v:shell_error) + + if v:shell_error != 0 +" call Decho("2nd attempt to remove directory<".rmfile.">") + let errcode= s:NetrwDelete(rmfile) +" call Decho("errcode=".errcode) + + if errcode != 0 + if has("unix") +" call Decho("3rd attempt to remove directory<".rmfile.">") + call system("rm ".shellescape(rmfile)) + if v:shell_error != 0 && !exists("g:netrw_quiet") + call netrw#ErrorMsg(s:ERROR,"unable to remove directory<".rmfile."> -- is it empty?",34) + let ok="no" + endif + elseif !exists("g:netrw_quiet") + call netrw#ErrorMsg(s:ERROR,"unable to remove directory<".rmfile."> -- is it empty?",35) + let ok="no" + endif + endif + endif + endif + endif + +" call Dret("s:NetrwLocalRmFile ".ok) + return ok +endfun + +" --------------------------------------------------------------------- +" s:NetrwLocalRename: rename a remote file or directory {{{2 +fun! s:NetrwLocalRename(path) range +" call Dfunc("NetrwLocalRename(path<".a:path.">)") + + " preparation for removing multiple files/directories + let ctr = a:firstline + let svpos= netrw#NetrwSavePosn() + + " rename files given by the markfilelist + if exists("s:netrwmarkfilelist_{bufnr('%')}") + for oldname in s:netrwmarkfilelist_{bufnr("%")} +" call Decho("oldname<".oldname.">") + if exists("subfrom") + let newname= substitute(oldname,subfrom,subto,'') +" call Decho("subfrom<".subfrom."> subto<".subto."> newname<".newname.">") + else + call inputsave() + let newname= input("Moving ".oldname." to : ",oldname) + call inputrestore() + if newname =~ '^s/' + let subfrom = substitute(newname,'^s/\([^/]*\)/.*/$','\1','') + let subto = substitute(newname,'^s/[^/]*/\(.*\)/$','\1','') +" call Decho("subfrom<".subfrom."> subto<".subto."> newname<".newname.">") + let newname = substitute(oldname,subfrom,subto,'') + endif + endif + call rename(oldname,newname) + endfor + call s:NetrwUnmarkList(bufnr("%"),b:netrw_curdir) + + else + + " attempt to rename files/directories + while ctr <= a:lastline + exe "keepjumps ".ctr + + " sanity checks + if line(".") < w:netrw_bannercnt + let ctr= ctr + 1 + continue + endif + let curword= s:NetrwGetWord() + if curword == "./" || curword == "../" + let ctr= ctr + 1 + continue + endif + + norm! 0 + let oldname= s:ComposePath(a:path,curword) +" call Decho("oldname<".oldname.">") + + call inputsave() + let newname= input("Moving ".oldname." to : ",substitute(oldname,'/*$','','e')) + call inputrestore() + + call rename(oldname,newname) +" call Decho("renaming <".oldname."> to <".newname.">") + + let ctr= ctr + 1 + endwhile + endif + + " refresh the directory +" call Decho("refresh the directory listing") + call s:NetrwRefresh(1,s:NetrwBrowseChgDir(1,'./')) + call netrw#NetrwRestorePosn(svpos) + +" call Dret("NetrwLocalRename") +endfun + +" --------------------------------------------------------------------- +" s:LocalFastBrowser: handles setting up/taking down fast browsing for the local browser {{{2 +" +" g:netrw_ Directory Is +" fastbrowse Local Remote +" slow 0 D D D=Deleting a buffer implies it will not be re-used (slow) +" med 1 D H H=Hiding a buffer implies it may be re-used (fast) +" fast 2 H H +" +" Deleting a buffer means that it will be re-loaded when examined, hence "slow". +" Hiding a buffer means that it will be re-used when examined, hence "fast". +" (re-using a buffer may not be as accurate) +fun! s:LocalFastBrowser() +" call Dfunc("LocalFastBrowser() g:netrw_fastbrowse=".g:netrw_fastbrowse) + + " initialize browselist, a list of buffer numbers that the local browser has used + if !exists("s:netrw_browselist") +" call Decho("initialize s:netrw_browselist") + let s:netrw_browselist= [] + endif + + " append current buffer to fastbrowse list + if empty(s:netrw_browselist) || bufnr("%") > s:netrw_browselist[-1] +" call Decho("appendng current buffer to browselist") + call add(s:netrw_browselist,bufnr("%")) +" call Decho("browselist=".string(s:netrw_browselist)) + endif + + " enable autocmd events to handle refreshing/removing local browser buffers + " If local browse buffer is currently showing: refresh it + " If local browse buffer is currently hidden : wipe it + if !exists("s:netrw_browser_shellcmd") && g:netrw_fastbrowse <= 1 +" call Decho("setting up local-browser shell command refresh") + let s:netrw_browser_shellcmd= 1 + augroup AuNetrwShellCmd + au! + if (has("win32") || has("win95") || has("win64") || has("win16")) + au ShellCmdPost * call s:LocalBrowseShellCmdRefresh() + else + au ShellCmdPost,FocusGained * call s:LocalBrowseShellCmdRefresh() + endif + augroup END + endif + + " user must have changed fastbrowse to its fast setting, so remove + " the associated autocmd events + if g:netrw_fastbrowse > 1 && exists("s:netrw_browser_shellcmd") +" call Decho("remove AuNetrwShellCmd autcmd group") + unlet s:netrw_browser_shellcmd + augroup AuNetrwShellCmd + au! + augroup END + augroup! AuNetrwShellCmd + endif + +" call Dret("LocalFastBrowser : browselist<".string(s:netrw_browselist).">") +endfun + +" --------------------------------------------------------------------- +" Support Functions: {{{1 + +" --------------------------------------------------------------------- +" netrw#ErrorMsg: {{{2 +" 0=note = s:NOTE +" 1=warning = s:WARNING +" 2=error = s:ERROR +" Aug 22, 2008 : max errnum currently is 72 +fun! netrw#ErrorMsg(level,msg,errnum) +" call Dfunc("netrw#ErrorMsg(level=".a:level." msg<".a:msg."> errnum=".a:errnum.") g:netrw_use_errorwindow=".g:netrw_use_errorwindow) + + if a:level == 1 + let level= "**warning** (netrw) " + elseif a:level == 2 + let level= "**error** (netrw) " + else + let level= "**note** (netrw) " + endif +" call Decho("level=".level) + + if g:netrw_use_errorwindow + " (default) netrw creates a one-line window to show error/warning + " messages (reliably displayed) + + " record current window number for NetrwRestorePosn()'s benefit + let s:winBeforeErr= winnr() +" call Decho("s:winBeforeErr=".s:winBeforeErr) + + " getting messages out reliably is just plain difficult! + " This attempt splits the current window, creating a one line window. + if bufexists("NetrwMessage") && bufwinnr("NetrwMessage") > 0 +" call Decho("write to NetrwMessage buffer") + exe bufwinnr("NetrwMessage")."wincmd w" +" call Decho("setlocal ma noro") + setlocal ma noro + call setline(line("$")+1,level.a:msg) + $ + else +" call Decho("create a NetrwMessage buffer window") + bo 1split + enew + setlocal bt=nofile + file NetrwMessage +" call Decho("setlocal ma noro") + setlocal ma noro + call setline(line("$"),level.a:msg) + endif +" call Decho("wrote msg<".level.a:msg."> to NetrwMessage win#".winnr()) + if &fo !~ '[ta]' + syn clear + syn match netrwMesgNote "^\*\*note\*\*" + syn match netrwMesgWarning "^\*\*warning\*\*" + syn match netrwMesgError "^\*\*error\*\*" + hi link netrwMesgWarning WarningMsg + hi link netrwMesgError Error + endif + setlocal noma ro bh=wipe + + else + " (optional) netrw will show messages using echomsg. Even if the + " message doesn't appear, at least it'll be recallable via :messages +" redraw! + if a:level == s:WARNING + echohl WarningMsg + elseif a:level == s:ERROR + echohl Error + endif + echomsg level.a:msg +" call Decho("echomsg ***netrw*** ".a:msg) + echohl None + endif + +" call Dret("netrw#ErrorMsg") +endfun + +" --------------------------------------------------------------------- +" netrw#NetrwRestorePosn: restores the cursor and file position as saved by NetrwSavePosn() {{{2 +fun! netrw#NetrwRestorePosn(...) +" call Dfunc("netrw#NetrwRestorePosn() a:0=".a:0." winnr=".(exists("w:netrw_winnr")? w:netrw_winnr : -1)." line=".(exists("w:netrw_line")? w:netrw_line : -1)." col=".(exists("w:netrw_col")? w:netrw_col : -1)." hline=".(exists("w:netrw_hline")? w:netrw_hline : -1)) + let eikeep= &ei + set ei=all + if expand("%") == "NetrwMessage" + exe s:winBeforeErr."wincmd w" + endif + + if a:0 > 0 + exe a:1 + endif + + " restore window + if exists("w:netrw_winnr") +" call Decho("restore window: exe silent! ".w:netrw_winnr."wincmd w") + exe "silent! ".w:netrw_winnr."wincmd w" + endif + if v:shell_error == 0 + " as suggested by Bram M: redraw on no error + " allows protocol error messages to remain visible +" redraw! + endif + + " restore top-of-screen line + if exists("w:netrw_hline") +" call Decho("restore topofscreen: exe norm! ".w:netrw_hline."G0z") + exe "norm! ".w:netrw_hline."G0z\<CR>" + endif + + " restore position + if exists("w:netrw_line") && exists("w:netrw_col") +" call Decho("restore posn: exe norm! ".w:netrw_line."G0".w:netrw_col."|") + exe "norm! ".w:netrw_line."G0".w:netrw_col."\<bar>" + endif + + let &ei= eikeep +" call Dret("netrw#NetrwRestorePosn") +endfun + +" --------------------------------------------------------------------- +" netrw#NetrwSavePosn: saves position of cursor on screen {{{2 +fun! netrw#NetrwSavePosn() +" call Dfunc("netrw#NetrwSavePosn()") + " Save current line and column + let w:netrw_winnr= winnr() + let w:netrw_line = line(".") + let w:netrw_col = virtcol(".") + + " Save top-of-screen line + norm! H0 + let w:netrw_hline= line(".") + + " set up string holding position parameters + let ret = "let w:netrw_winnr=".w:netrw_winnr."|let w:netrw_line=".w:netrw_line."|let w:netrw_col=".w:netrw_col."|let w:netrw_hline=".w:netrw_hline + + call netrw#NetrwRestorePosn() +" call Dret("netrw#NetrwSavePosn : winnr=".w:netrw_winnr." line=".w:netrw_line." col=".w:netrw_col." hline=".w:netrw_hline) + return ret +endfun + +" ------------------------------------------------------------------------ +" netrw#RFC2396: converts %xx into characters {{{2 +fun! netrw#RFC2396(fname) +" call Dfunc("netrw#RFC2396(fname<".a:fname.">)") + let fname = escape(substitute(a:fname,'%\(\x\x\)','\=nr2char("0x".submatch(1))','ge')," \t") +" call Dret("netrw#RFC2396 ".fname) + return fname +endfun + +" --------------------------------------------------------------------- +" s:ComposePath: Appends a new part to a path taking different systems into consideration {{{2 +fun! s:ComposePath(base,subdir) +" call Dfunc("s:ComposePath(base<".a:base."> subdir<".a:subdir.">)") + + if(has("amiga")) +" call Decho("amiga") + let ec = a:base[strlen(a:base)-1] + if ec != '/' && ec != ':' + let ret = a:base . "/" . a:subdir + else + let ret = a:base . a:subdir + endif + + elseif a:subdir =~ '^\a:[/\\][^/\\]' && (has("win32") || has("win95") || has("win64") || has("win16")) +" call Decho("windows") + let ret= a:subdir + + elseif a:base =~ '^\a\+://' +" call Decho("remote linux/macos") + let urlbase = substitute(a:base,'^\(\a\+://.\{-}/\)\(.*\)$','\1','') + let curpath = substitute(a:base,'^\(\a\+://.\{-}/\)\(.*\)$','\2','') + if a:subdir == '../' + if curpath =~ '[^/]/[^/]\+/$' + let curpath= substitute(curpath,'[^/]\+/$','','') + else + let curpath="" + endif + let ret= urlbase.curpath + else + let ret= urlbase.curpath.a:subdir + endif +" call Decho("urlbase<".urlbase.">") +" call Decho("curpath<".curpath.">") +" call Decho("ret<".ret.">") + + else +" call Decho("local linux/macos") + let ret = substitute(a:base."/".a:subdir,"//","/","g") + if a:base =~ '^//' + " keeping initial '//' for the benefit of network share listing support + let ret= '/'.ret + endif + let ret= simplify(ret) + endif + +" call Dret("s:ComposePath ".ret) + return ret +endfun + +" --------------------------------------------------------------------- +" s:FileReadable: o/s independent filereadable {{{2 +fun! s:FileReadable(fname) +" call Dfunc("s:FileReadable(fname<".a:fname.">)") + + if g:netrw_cygwin + let ret= filereadable(substitute(a:fname,'/cygdrive/\(.\)','\1:/','')) + else + let ret= filereadable(a:fname) + endif + +" call Dret("s:FileReadable ".ret) + return ret +endfun + +" --------------------------------------------------------------------- +" s:GetTempfile: gets a tempname that'll work for various o/s's {{{2 +" Places correct suffix on end of temporary filename, +" using the suffix provided with fname +fun! s:GetTempfile(fname) +" call Dfunc("s:GetTempfile(fname<".a:fname.">)") + + if !exists("b:netrw_tmpfile") + " get a brand new temporary filename + let tmpfile= tempname() +" call Decho("tmpfile<".tmpfile."> : from tempname()") + + let tmpfile= substitute(tmpfile,'\','/','ge') +" call Decho("tmpfile<".tmpfile."> : chgd any \\ -> /") + + " sanity check -- does the temporary file's directory exist? + if !isdirectory(substitute(tmpfile,'[^/]\+$','','e')) +" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap) + call netrw#ErrorMsg(s:ERROR,"your <".substitute(tmpfile,'[^/]\+$','','e')."> directory is missing!",2) +" call Dret("s:GetTempfile getcwd<".getcwd().">") + return "" + endif + + " let netrw#NetSource() know about the tmpfile + let s:netrw_tmpfile= tmpfile " used by netrw#NetSource() +" call Decho("tmpfile<".tmpfile."> s:netrw_tmpfile<".s:netrw_tmpfile.">") + + " o/s dependencies + if g:netrw_cygwin != 0 + let tmpfile = substitute(tmpfile,'^\(\a\):','/cygdrive/\1','e') + elseif has("win32") || has("win95") || has("win64") || has("win16") + if !exists("+shellslash") || !&ssl + let tmpfile = substitute(tmpfile,'/','\','g') + endif + else + let tmpfile = tmpfile + endif + let b:netrw_tmpfile= tmpfile +" call Decho("o/s dependent fixed tempname<".tmpfile.">") + else + " re-use temporary filename + let tmpfile= b:netrw_tmpfile +" call Decho("tmpfile<".tmpfile."> re-using") + endif + + " use fname's suffix for the temporary file + if a:fname != "" + if a:fname =~ '\.[^./]\+$' +" call Decho("using fname<".a:fname.">'s suffix") + if a:fname =~ '.tar.gz' || a:fname =~ '.tar.bz2' + let suffix = ".tar".substitute(a:fname,'^.*\(\.[^./]\+\)$','\1','e') + else + let suffix = substitute(a:fname,'^.*\(\.[^./]\+\)$','\1','e') + endif +" call Decho("suffix<".suffix.">") + let tmpfile= substitute(tmpfile,'\.tmp$','','e') +" call Decho("chgd tmpfile<".tmpfile."> (removed any .tmp suffix)") + let tmpfile .= suffix +" call Decho("chgd tmpfile<".tmpfile."> (added ".suffix." suffix) netrw_fname<".b:netrw_fname.">") + let s:netrw_tmpfile= tmpfile " supports netrw#NetSource() + endif + endif + +" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap) +" call Dret("s:GetTempfile <".tmpfile.">") + return tmpfile +endfun + +" --------------------------------------------------------------------- +" s:MakeSshCmd: transforms input command using USEPORT HOSTNAME into {{{2 +" a correct command for use with a system() call +fun! s:MakeSshCmd(sshcmd) +" call Dfunc("s:MakeSshCmd(sshcmd<".a:sshcmd.">) user<".s:user."> machine<".s:machine.">") + let sshcmd = substitute(a:sshcmd,'\<HOSTNAME\>',s:user.s:machine,'') + if exists("g:netrw_port") && g:netrw_port != "" + let sshcmd= substitute(sshcmd,"USEPORT",g:netrw_sshport.' '.g:netrw_port,'') + elseif exists("s:port") && s:port != "" + let sshcmd= substitute(sshcmd,"USEPORT",g:netrw_sshport.' '.s:port,'') + else + let sshcmd= substitute(sshcmd,"USEPORT ",'','') + endif +" call Dret("s:MakeSshCmd <".sshcmd.">") + return sshcmd +endfun + +" --------------------------------------------------------------------- +" s:NetrwBMShow: {{{2 +fun! s:NetrwBMShow() +" call Dfunc("s:NetrwBMShow()") + redir => bmshowraw + menu + redir END + let bmshowlist = split(bmshowraw,'\n') + if bmshowlist != [] + let bmshowfuncs= filter(bmshowlist,'v:val =~ "<SNR>\\d\\+_BMShow()"') + if bmshowfuncs != [] + let bmshowfunc = substitute(bmshowfuncs[0],'^.*:\(call.*BMShow()\).*$','\1','') + if bmshowfunc =~ '^call.*BMShow()' + exe "silent! ".bmshowfunc + endif + endif + endif +" call Dret("s:NetrwBMShow : bmshowfunc<".(exists("bmshowfunc")? bmshowfunc : 'n/a').">") +endfun + +" --------------------------------------------------------------------- +" s:NetrwDelete: Deletes a file. {{{2 +" Uses Steve Hall's idea to insure that Windows paths stay +" acceptable. No effect on Unix paths. +" Examples of use: let result= s:NetrwDelete(path) +fun! s:NetrwDelete(path) +" call Dfunc("s:NetrwDelete(path<".a:path.">)") + + let path = s:WinPath(a:path) + if !g:netrw_cygwin && (has("win32") || has("win95") || has("win64") || has("win16")) + if exists("+shellslash") + let sskeep= &shellslash + setlocal noshellslash + let result = delete(path) + let &shellslash = sskeep + else +" call Decho("exe let result= ".a:cmd."('".path."')") + let result= delete(path) + endif + else +" call Decho("let result= delete(".path.")") + let result= delete(path) + endif + if result < 0 + call Netrw#ErrorMsg(s:WARNING,"delete(".path.") failed!",71) + endif + +" call Dret("s:NetrwDelete ".result) + return result +endfun + +" --------------------------------------------------------------------- +" s:NetrwEnew: opens a new buffer, passes netrw buffer variables through {{{2 +fun! s:NetrwEnew(curdir) +" call Dfunc("s:NetrwEnew(curdir<".a:curdir.">) buf#".bufnr("%")."<".bufname("%").">") + + " grab a function-local-variable copy of buffer variables + if exists("b:netrw_bannercnt") |let netrw_bannercnt = b:netrw_bannercnt |endif + if exists("b:netrw_browser_active") |let netrw_browser_active = b:netrw_browser_active |endif + if exists("b:netrw_cpf") |let netrw_cpf = b:netrw_cpf |endif + if exists("b:netrw_curdir") |let netrw_curdir = b:netrw_curdir |endif + if exists("b:netrw_explore_bufnr") |let netrw_explore_bufnr = b:netrw_explore_bufnr |endif + if exists("b:netrw_explore_indx") |let netrw_explore_indx = b:netrw_explore_indx |endif + if exists("b:netrw_explore_line") |let netrw_explore_line = b:netrw_explore_line |endif + if exists("b:netrw_explore_list") |let netrw_explore_list = b:netrw_explore_list |endif + if exists("b:netrw_explore_listlen")|let netrw_explore_listlen = b:netrw_explore_listlen|endif + if exists("b:netrw_explore_mtchcnt")|let netrw_explore_mtchcnt = b:netrw_explore_mtchcnt|endif + if exists("b:netrw_fname") |let netrw_fname = b:netrw_fname |endif + if exists("b:netrw_lastfile") |let netrw_lastfile = b:netrw_lastfile |endif + if exists("b:netrw_liststyle") |let netrw_liststyle = b:netrw_liststyle |endif + if exists("b:netrw_method") |let netrw_method = b:netrw_method |endif + if exists("b:netrw_option") |let netrw_option = b:netrw_option |endif + if exists("b:netrw_prvdir") |let netrw_prvdir = b:netrw_prvdir |endif + + call s:NetrwOptionRestore("w:") +" call Decho("generate a buffer with keepjumps keepalt enew!") + keepjumps keepalt enew! + call s:NetrwOptionSave("w:") + + " copy function-local-variables to buffer variable equivalents + if exists("netrw_bannercnt") |let b:netrw_bannercnt = netrw_bannercnt |endif + if exists("netrw_browser_active") |let b:netrw_browser_active = netrw_browser_active |endif + if exists("netrw_cpf") |let b:netrw_cpf = netrw_cpf |endif + if exists("netrw_curdir") |let b:netrw_curdir = netrw_curdir |endif + if exists("netrw_explore_bufnr") |let b:netrw_explore_bufnr = netrw_explore_bufnr |endif + if exists("netrw_explore_indx") |let b:netrw_explore_indx = netrw_explore_indx |endif + if exists("netrw_explore_line") |let b:netrw_explore_line = netrw_explore_line |endif + if exists("netrw_explore_list") |let b:netrw_explore_list = netrw_explore_list |endif + if exists("netrw_explore_listlen")|let b:netrw_explore_listlen = netrw_explore_listlen|endif + if exists("netrw_explore_mtchcnt")|let b:netrw_explore_mtchcnt = netrw_explore_mtchcnt|endif + if exists("netrw_fname") |let b:netrw_fname = netrw_fname |endif + if exists("netrw_lastfile") |let b:netrw_lastfile = netrw_lastfile |endif + if exists("netrw_liststyle") |let b:netrw_liststyle = netrw_liststyle |endif + if exists("netrw_method") |let b:netrw_method = netrw_method |endif + if exists("netrw_option") |let b:netrw_option = netrw_option |endif + if exists("netrw_prvdir") |let b:netrw_prvdir = netrw_prvdir |endif + + let b:netrw_curdir= a:curdir + if b:netrw_curdir =~ '/$' + if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST + file NetrwTreeListing + nno <silent> <buffer> [ :silent call <SID>TreeListMove('[')<cr> + nno <silent> <buffer> ] :silent call <SID>TreeListMove(']')<cr> + else + exe "silent! keepalt file ".fnameescape(b:netrw_curdir) + endif + endif + +" call Dret("s:NetrwEnew : buf#".bufnr("%")."<".bufname("%")."> expand(%)<".expand("%")."> expand(#)<".expand("#").">") +endfun + +" ------------------------------------------------------------------------ +" s:NetrwSaveWordPosn: used to keep cursor on same word after refresh, {{{2 +" changed sorting, etc. Also see s:NetrwRestoreWordPosn(). +fun! s:NetrwSaveWordPosn() +" call Dfunc("NetrwSaveWordPosn()") + let s:netrw_saveword= '^'.fnameescape(getline('.')).'$' +" call Dret("NetrwSaveWordPosn : saveword<".s:netrw_saveword.">") +endfun + +" --------------------------------------------------------------------- +" s:NetrwRestoreWordPosn: used to keep cursor on same word after refresh, {{{2 +" changed sorting, etc. Also see s:NetrwSaveWordPosn(). +fun! s:NetrwRestoreWordPosn() +" call Dfunc("NetrwRestoreWordPosn()") + silent! call search(s:netrw_saveword,'w') +" call Dret("NetrwRestoreWordPosn") +endfun + +" --------------------------------------------------------------------- +" s:RestoreBufVars: {{{2 +fun! s:RestoreBufVars() +" call Dfunc("s:RestoreBufVars()") + + if exists("s:netrw_curdir") |let b:netrw_curdir = s:netrw_curdir |endif + if exists("s:netrw_lastfile") |let b:netrw_lastfile = s:netrw_lastfile |endif + if exists("s:netrw_method") |let b:netrw_method = s:netrw_method |endif + if exists("s:netrw_fname") |let b:netrw_fname = s:netrw_fname |endif + if exists("s:netrw_machine") |let b:netrw_machine = s:netrw_machine |endif + if exists("s:netrw_browser_active")|let b:netrw_browser_active = s:netrw_browser_active|endif + +" call Dret("s:RestoreBufVars") +endfun + +" --------------------------------------------------------------------- +" s:RemotePathAnalysis: {{{2 +fun! s:RemotePathAnalysis(dirname) +" call Dfunc("s:RemotePathAnalysis()") + + let dirpat = '^\(\w\{-}\)://\(\w\+@\)\=\([^/:#]\+\)\%([:#]\(\d\+\)\)\=/\(.*\)$' + let s:method = substitute(a:dirname,dirpat,'\1','') + let s:user = substitute(a:dirname,dirpat,'\2','') + let s:machine = substitute(a:dirname,dirpat,'\3','') + let s:port = substitute(a:dirname,dirpat,'\4','') + let s:path = substitute(a:dirname,dirpat,'\5','') + let s:fname = substitute(a:dirname,'^.*/\ze.','','') + +" call Decho("set up s:method <".s:method .">") +" call Decho("set up s:user <".s:user .">") +" call Decho("set up s:machine<".s:machine.">") +" call Decho("set up s:port <".s:port.">") +" call Decho("set up s:path <".s:path .">") +" call Decho("set up s:fname <".s:fname .">") + +" call Dret("s:RemotePathAnalysis") +endfun + +" --------------------------------------------------------------------- +" s:RemoteSystem: runs a command on a remote host using ssh {{{2 +" Returns status +" Runs system() on +" [cd REMOTEDIRPATH;] a:cmd +" Note that it doesn't do shellescape(a:cmd)! +fun! s:RemoteSystem(cmd) +" call Dfunc("s:RemoteSystem(cmd<".a:cmd.">)") + if !executable(g:netrw_ssh_cmd) + call netrw#ErrorMsg(s:ERROR,"g:netrw_ssh_cmd<".g:netrw_ssh_cmd."> is not executable!",52) + elseif !exists("b:netrw_curdir") + call netrw#ErrorMsg(s:ERROR,"for some reason b:netrw_curdir doesn't exist!",53) + else + let cmd = s:MakeSshCmd(g:netrw_ssh_cmd." USEPORT HOSTNAME") + let remotedir= substitute(b:netrw_curdir,'^.*//[^/]\+/\(.*\)$','\1','') + if remotedir != "" + let cmd= cmd.' cd '.shellescape(remotedir).";" + else + let cmd= cmd.' ' + endif + let cmd= cmd.a:cmd +" call Decho("call system(".cmd.")") + let ret= system(cmd) + endif +" call Dret("s:RemoteSystem ".ret) + return ret +endfun + +" --------------------------------------------------------------------- +" s:RestoreWinVars: (used by Explore() and NetrwSplit()) {{{2 +fun! s:RestoreWinVars() +" call Dfunc("s:RestoreWinVars()") + if exists("s:bannercnt") |let w:netrw_bannercnt = s:bannercnt |unlet s:bannercnt |endif + if exists("s:col") |let w:netrw_col = s:col |unlet s:col |endif + if exists("s:curdir") |let w:netrw_curdir = s:curdir |unlet s:curdir |endif + if exists("s:explore_bufnr") |let w:netrw_explore_bufnr = s:explore_bufnr |unlet s:explore_bufnr |endif + if exists("s:explore_indx") |let w:netrw_explore_indx = s:explore_indx |unlet s:explore_indx |endif + if exists("s:explore_line") |let w:netrw_explore_line = s:explore_line |unlet s:explore_line |endif + if exists("s:explore_listlen")|let w:netrw_explore_listlen = s:explore_listlen|unlet s:explore_listlen|endif + if exists("s:explore_list") |let w:netrw_explore_list = s:explore_list |unlet s:explore_list |endif + if exists("s:explore_mtchcnt")|let w:netrw_explore_mtchcnt = s:explore_mtchcnt|unlet s:explore_mtchcnt|endif + if exists("s:fpl") |let w:netrw_fpl = s:fpl |unlet s:fpl |endif + if exists("s:hline") |let w:netrw_hline = s:hline |unlet s:hline |endif + if exists("s:line") |let w:netrw_line = s:line |unlet s:line |endif + if exists("s:liststyle") |let w:netrw_liststyle = s:liststyle |unlet s:liststyle |endif + if exists("s:method") |let w:netrw_method = s:method |unlet s:method |endif + if exists("s:prvdir") |let w:netrw_prvdir = s:prvdir |unlet s:prvdir |endif + if exists("s:treedict") |let w:netrw_treedict = s:treedict |unlet s:treedict |endif + if exists("s:treetop") |let w:netrw_treetop = s:treetop |unlet s:treetop |endif + if exists("s:winnr") |let w:netrw_winnr = s:winnr |unlet s:winnr |endif +" call Dret("s:RestoreWinVars") +endfun + +" --------------------------------------------------------------------- +" s:Rexplore: implements returning from a buffer to a netrw directory {{{2 +" +" s:SetRexDir() sets up <2-leftmouse> maps (if g:netrw_retmap +" is true) and a command, :Rexplore, which call this function. +" +" s:nbcd_curpos_{bufnr('%')} is set up by s:NetrwBrowseChgDir() +fun! s:NetrwRexplore(islocal,dirname) +" call Dfunc("s:NetrwRexplore(islocal=".a:islocal." dirname<".a:dirname.">)") + if a:islocal + call netrw#LocalBrowseCheck(a:dirname) + else + call s:NetrwBrowse(0,a:dirname) + endif + if exists("s:nbcd_curpos_{bufnr('%')}") + call netrw#NetrwRestorePosn(s:nbcd_curpos_{bufnr('%')}) + unlet s:nbcd_curpos_{bufnr('%')} + endif +" call Dret("s:NetrwRexplore") +endfun + +" --------------------------------------------------------------------- +" s:SaveBufVars: {{{2 +fun! s:SaveBufVars() +" call Dfunc("s:SaveBufVars()") + + if exists("b:netrw_curdir") |let s:netrw_curdir = b:netrw_curdir |endif + if exists("b:netrw_lastfile") |let s:netrw_lastfile = b:netrw_lastfile |endif + if exists("b:netrw_method") |let s:netrw_method = b:netrw_method |endif + if exists("b:netrw_fname") |let s:netrw_fname = b:netrw_fname |endif + if exists("b:netrw_machine") |let s:netrw_machine = b:netrw_machine |endif + if exists("b:netrw_browser_active")|let s:netrw_browser_active = b:netrw_browser_active|endif + +" call Dret("s:SaveBufVars") +endfun + +" --------------------------------------------------------------------- +" s:SaveWinVars: (used by Explore() and NetrwSplit()) {{{2 +fun! s:SaveWinVars() +" call Dfunc("s:SaveWinVars()") + if exists("w:netrw_bannercnt") |let s:bannercnt = w:netrw_bannercnt |endif + if exists("w:netrw_col") |let s:col = w:netrw_col |endif + if exists("w:netrw_curdir") |let s:curdir = w:netrw_curdir |endif + if exists("w:netrw_explore_bufnr") |let s:explore_bufnr = w:netrw_explore_bufnr |endif + if exists("w:netrw_explore_indx") |let s:explore_indx = w:netrw_explore_indx |endif + if exists("w:netrw_explore_line") |let s:explore_line = w:netrw_explore_line |endif + if exists("w:netrw_explore_listlen")|let s:explore_listlen = w:netrw_explore_listlen|endif + if exists("w:netrw_explore_list") |let s:explore_list = w:netrw_explore_list |endif + if exists("w:netrw_explore_mtchcnt")|let s:explore_mtchcnt = w:netrw_explore_mtchcnt|endif + if exists("w:netrw_fpl") |let s:fpl = w:netrw_fpl |endif + if exists("w:netrw_hline") |let s:hline = w:netrw_hline |endif + if exists("w:netrw_line") |let s:line = w:netrw_line |endif + if exists("w:netrw_liststyle") |let s:liststyle = w:netrw_liststyle |endif + if exists("w:netrw_method") |let s:method = w:netrw_method |endif + if exists("w:netrw_prvdir") |let s:prvdir = w:netrw_prvdir |endif + if exists("w:netrw_treedict") |let s:treedict = w:netrw_treedict |endif + if exists("w:netrw_treetop") |let s:treetop = w:netrw_treetop |endif + if exists("w:netrw_winnr") |let s:winnr = w:netrw_winnr |endif +" call Dret("s:SaveWinVars") +endfun + +" --------------------------------------------------------------------- +" s:SetBufWinVars: (used by NetrwBrowse() and LocalBrowseCheck()) {{{2 +" To allow separate windows to have their own activities, such as +" Explore **/pattern, several variables have been made window-oriented. +" However, when the user splits a browser window (ex: ctrl-w s), these +" variables are not inherited by the new window. SetBufWinVars() and +" UseBufWinVars() get around that. +fun! s:SetBufWinVars() +" call Dfunc("s:SetBufWinVars()") + if exists("w:netrw_liststyle") |let b:netrw_liststyle = w:netrw_liststyle |endif + if exists("w:netrw_bannercnt") |let b:netrw_bannercnt = w:netrw_bannercnt |endif + if exists("w:netrw_method") |let b:netrw_method = w:netrw_method |endif + if exists("w:netrw_prvdir") |let b:netrw_prvdir = w:netrw_prvdir |endif + if exists("w:netrw_explore_indx") |let b:netrw_explore_indx = w:netrw_explore_indx |endif + if exists("w:netrw_explore_listlen")|let b:netrw_explore_listlen= w:netrw_explore_listlen|endif + if exists("w:netrw_explore_mtchcnt")|let b:netrw_explore_mtchcnt= w:netrw_explore_mtchcnt|endif + if exists("w:netrw_explore_bufnr") |let b:netrw_explore_bufnr = w:netrw_explore_bufnr |endif + if exists("w:netrw_explore_line") |let b:netrw_explore_line = w:netrw_explore_line |endif + if exists("w:netrw_explore_list") |let b:netrw_explore_list = w:netrw_explore_list |endif +" call Dret("s:SetBufWinVars") +endfun + +" --------------------------------------------------------------------- +" s:SetRexDir: set directory for :Rexplore {{{2 +fun! s:SetRexDir(islocal,dirname) +" call Dfunc("s:SetRexDir(islocal=".a:islocal." dirname<".a:dirname.">)") + " set up Rex and leftmouse-double-click + if a:islocal + exe 'com! Rexplore call s:NetrwRexplore(1,"'.escape(a:dirname,'"\').'")' + if g:netrw_retmap + silent! unmap <2-leftmouse> + if !hasmapto("<Plug>NetrwReturn") + nmap <unique> <silent> <2-leftmouse> <Plug>NetrwReturn + endif + let dir = escape(a:dirname, s:netrw_map_escape) + exe 'nnoremap <silent> <Plug>NetrwReturn :call <SID>NetrwRexplore(1,"'.dir.'")<cr>' + endif + else + exe 'com! Rexplore call s:NetrwRexplore(0,"'.escape(a:dirname,'"\').'")' + if g:netrw_retmap + silent! unmap <2-leftmouse> + if !hasmapto("<Plug>NetrwReturn") + nmap <unique> <silent> <2-leftmouse> <Plug>NetrwReturn + endif + let dir = escape(a:dirname, s:netrw_map_escape) + exe 'nnoremap <silent> <Plug>NetrwReturn :call <SID>NetrwRexplore(0,"'.dir.'")<cr>' + endif + endif +" call Dret("s:SetRexDir") +endfun + +" --------------------------------------------------------------------- +" s:Strlen: this function returns the length of a string, even if its {{{2 +" using two-byte etc characters. +" Currently, its only used if g:Align_xstrlen is set to a +" nonzero value. Solution from Nicolai Weibull, vim docs +" (:help strlen()), Tony Mechelynck, and my own invention. +fun! s:Strlen(x) +" call Dfunc("s:Strlen(x<".a:x.">") + if g:netrw_xstrlen == 1 + " number of codepoints (Latin a + combining circumflex is two codepoints) + " (comment from TM, solution from NW) + let ret= strlen(substitute(a:x,'.','c','g')) + + elseif g:netrw_xstrlen == 2 + " number of spacing codepoints (Latin a + combining circumflex is one spacing + " codepoint; a hard tab is one; wide and narrow CJK are one each; etc.) + " (comment from TM, solution from TM) + let ret=strlen(substitute(a:x, '.\Z', 'x', 'g')) + + elseif g:netrw_xstrlen == 3 + " virtual length (counting, for instance, tabs as anything between 1 and + " 'tabstop', wide CJK as 2 rather than 1, Arabic alif as zero when immediately + " preceded by lam, one otherwise, etc.) + " (comment from TM, solution from me) + let modkeep= &mod + exe "norm! o\<esc>" + call setline(line("."),a:x) + let ret= virtcol("$") - 1 + d + let &mod= modkeep + + else + " at least give a decent default + ret= strlen(a:x) + endif +" call Dret("s:Strlen ".ret) + return ret +endfun + +" --------------------------------------------------------------------- +" s:TreeListMove: {{{2 +fun! s:TreeListMove(dir) +" call Dfunc("s:TreeListMove(dir<".a:dir.">)") + let curline = getline('.') + let prvline = (line(".") > 1)? getline(line(".")-1) : '' + let nxtline = (line(".") < line("$"))? getline(line(".")+1) : '' + let curindent= substitute(curline,'^\([| ]*\).\{-}$','\1','') + let indentm1 = substitute(curindent,'^| ','','') +" call Decho("prvline <".prvline."> #".line(".")-1) +" call Decho("curline <".curline."> #".line(".")) +" call Decho("nxtline <".nxtline."> #".line(".")+1) +" call Decho("curindent<".curindent.">") +" call Decho("indentm1 <".indentm1.">") + + if curline !~ '/$' +" call Decho('regfile') + if a:dir == '[' && prvline != '' + norm! 0 + let nl = search('^'.indentm1.'[^|]','bWe') " search backwards from regular file +" call Decho("regfile srch back: ".nl) + elseif a:dir == ']' && nxtline != '' + norm! $ + let nl = search('^'.indentm1.'[^|]','We') " search forwards from regular file +" call Decho("regfile srch fwd: ".nl) + endif + + elseif a:dir == '[' && prvline != '' + norm! 0 + let curline= line(".") + let nl = search('^'.curindent.'[^|]','bWe') " search backwards From directory, same indentation +" call Decho("dir srch back ind: ".nl) + if nl != 0 + if line(".") == curline-1 + let nl= search('^'.indentm1.'[^|]','bWe') " search backwards from directory, indentation - 1 +" call Decho("dir srch back ind-1: ".nl) + endif + endif + + elseif a:dir == ']' && nxtline != '' + norm! $ + let curline = line(".") + let nl = search('^'.curindent.'[^|]','We') " search forwards from directory, same indentation +" call Decho("dir srch fwd ind: ".nl) + if nl != 0 + if line(".") == curline+1 + let nl= search('^'.indentm1.'[^|]','We') " search forwards from directory, indentation - 1 +" call Decho("dir srch fwd ind-1: ".nl) + endif + endif + + endif + +" call Dret("s:TreeListMove") +endfun + +" --------------------------------------------------------------------- +" s:UpdateBuffersMenu: does emenu Buffers.Refresh (but due to locale, the menu item may not be called that) {{{2 +" The Buffers.Refresh menu calls s:BMShow(); unfortunately, that means that that function +" can't be called except via emenu. But due to locale, that menu line may not be called +" Buffers.Refresh; hence, s:NetrwBMShow() utilizes a "cheat" to call that function anyway. +fun! s:UpdateBuffersMenu() +" call Dfunc("s:UpdateBuffersMenu()") + if has("gui") && has("menu") && has("gui_running") && &go =~ 'm' + try + silent emenu Buffers.Refresh\ menu + catch /^Vim\%((\a\+)\)\=:E/ + let v:errmsg= "" + silent call s:NetrwBMShow() + endtry + endif +" call Dret("s:UpdateBuffersMenu") +endfun + +" --------------------------------------------------------------------- +" s:UseBufWinVars: (used by NetrwBrowse() and LocalBrowseCheck() {{{2 +" Matching function to BufferWinVars() +fun! s:UseBufWinVars() +" call Dfunc("s:UseBufWinVars()") + if exists("b:netrw_liststyle") && !exists("w:netrw_liststyle") |let w:netrw_liststyle = b:netrw_liststyle |endif + if exists("b:netrw_bannercnt") && !exists("w:netrw_bannercnt") |let w:netrw_bannercnt = b:netrw_bannercnt |endif + if exists("b:netrw_method") && !exists("w:netrw_method") |let w:netrw_method = b:netrw_method |endif + if exists("b:netrw_prvdir") && !exists("w:netrw_prvdir") |let w:netrw_prvdir = b:netrw_prvdir |endif + if exists("b:netrw_explore_indx") && !exists("w:netrw_explore_indx") |let w:netrw_explore_indx = b:netrw_explore_indx |endif + if exists("b:netrw_explore_listlen") && !exists("w:netrw_explore_listlen")|let w:netrw_explore_listlen = b:netrw_explore_listlen|endif + if exists("b:netrw_explore_mtchcnt") && !exists("w:netrw_explore_mtchcnt")|let w:netrw_explore_mtchcnt = b:netrw_explore_mtchcnt|endif + if exists("b:netrw_explore_bufnr") && !exists("w:netrw_explore_bufnr") |let w:netrw_explore_bufnr = b:netrw_explore_bufnr |endif + if exists("b:netrw_explore_line") && !exists("w:netrw_explore_line") |let w:netrw_explore_line = b:netrw_explore_line |endif + if exists("b:netrw_explore_list") && !exists("w:netrw_explore_list") |let w:netrw_explore_list = b:netrw_explore_list |endif +" call Dret("s:UseBufWinVars") +endfun + +" --------------------------------------------------------------------- +" s:WinPath: {{{2 +fun! s:WinPath(path) +" call Dfunc("s:WinPath(path<".a:path.">)") + if !g:netrw_cygwin && (has("win32") || has("win95") || has("win64") || has("win16")) + " remove trailing slash (Win95) + let path = substitute(a:path, '\(\\\|/\)$', '', 'g') + " remove escaped spaces + let path = substitute(path, '\ ', ' ', 'g') + " convert slashes to backslashes + let path = substitute(path, '/', '\', 'g') + else + let path= a:path + endif +" call Dret("s:WinPath <".path.">") + return path +endfun + +" --------------------------------------------------------------------- +" Settings Restoration: {{{2 +let &cpo= s:keepcpo +unlet s:keepcpo + +" ------------------------------------------------------------------------ +" Modelines: {{{1 +" vim:ts=8 fdm=marker diff --git a/vimfiles/autoload/netrwSettings.vim b/vimfiles/autoload/netrwSettings.vim index 40829a1..acbd145 100644 --- a/vimfiles/autoload/netrwSettings.vim +++ b/vimfiles/autoload/netrwSettings.vim @@ -1,210 +1,201 @@ -" netrwSettings.vim: makes netrw settings simpler -" Date: Mar 11, 2008 -" Maintainer: Charles E Campbell, Jr <drchipNOSPAM at campbellfamily dot biz> -" Version: 11 -" Copyright: Copyright (C) 1999-2007 Charles E. Campbell, Jr. {{{1 -" Permission is hereby granted to use and distribute this code, -" with or without modifications, provided that this copyright -" notice is copied with it. Like anything else that's free, -" netrwSettings.vim is provided *as is* and comes with no -" warranty of any kind, either expressed or implied. By using -" this plugin, you agree that in no event will the copyright -" holder be liable for any damages resulting from the use -" of this software. -" -" Mat 4:23 (WEB) Jesus went about in all Galilee, teaching in their {{{1 -" synagogues, preaching the gospel of the kingdom, and healing -" every disease and every sickness among the people. -" Load Once: {{{1 -if exists("g:loaded_netrwSettings") || &cp - finish -endif -let g:loaded_netrwSettings = "v11" - -" --------------------------------------------------------------------- -" NetrwSettings: {{{1 -fun! netrwSettings#NetrwSettings() - " this call is here largely just to insure that netrw has been loaded - call netrw#NetrwSavePosn() - if !exists("g:loaded_netrw") - echohl WarningMsg | echomsg "***sorry*** netrw needs to be loaded prior to using NetrwSettings" | echohl None - return - endif - - above wincmd s - enew - setlocal noswapfile bh=wipe - set ft=vim - file Netrw\ Settings - - " these variables have the following default effects when they don't - " exist (ie. have not been set by the user in his/her .vimrc) - if !exists("g:netrw_liststyle") - let g:netrw_liststyle= 0 - let g:netrw_list_cmd= "ssh HOSTNAME ls -FLa" - endif - if !exists("g:netrw_silent") - let g:netrw_silent= 0 - endif - if !exists("g:netrw_use_nt_rcp") - let g:netrw_use_nt_rcp= 0 - endif - if !exists("g:netrw_ftp") - let g:netrw_ftp= 0 - endif - if !exists("g:netrw_ignorenetrc") - let g:netrw_ignorenetrc= 0 - endif - - put ='+ ---------------------------------------------' - put ='+ NetrwSettings: by Charles E. Campbell, Jr.' - put ='+ Press <F1> with cursor atop any line for help' - put ='+ ---------------------------------------------' - let s:netrw_settings_stop= line(".") - - put ='' - put ='+ Netrw Protocol Commands' - put = 'let g:netrw_dav_cmd = '.g:netrw_dav_cmd - put = 'let g:netrw_fetch_cmd = '.g:netrw_fetch_cmd - put = 'let g:netrw_ftp_cmd = '.g:netrw_ftp_cmd - put = 'let g:netrw_http_cmd = '.g:netrw_http_cmd - put = 'let g:netrw_rcp_cmd = '.g:netrw_rcp_cmd - put = 'let g:netrw_rsync_cmd = '.g:netrw_rsync_cmd - put = 'let g:netrw_scp_cmd = '.g:netrw_scp_cmd - put = 'let g:netrw_sftp_cmd = '.g:netrw_sftp_cmd - put = 'let g:netrw_ssh_cmd = '.g:netrw_ssh_cmd - let s:netrw_protocol_stop= line(".") - put = '' - - put ='+Netrw Transfer Control' - put = 'let g:netrw_cygwin = '.g:netrw_cygwin - put = 'let g:netrw_ftp = '.g:netrw_ftp - put = 'let g:netrw_ftpmode = '.g:netrw_ftpmode - put = 'let g:netrw_ignorenetrc = '.g:netrw_ignorenetrc - put = 'let g:netrw_sshport = '.g:netrw_sshport - let shqline= line("$") - put = 'let g:netrw_shq...' - put = 'let g:netrw_use_nt_rcp = '.g:netrw_use_nt_rcp - put = 'let g:netrw_win95ftp = '.g:netrw_win95ftp - let s:netrw_xfer_stop= line(".") - put ='' - put ='+ Netrw Messages' - put ='let g:netrw_use_errorwindow = '.g:netrw_use_errorwindow - - put = '' - put ='+ Netrw Browser Control' - put = 'let g:netrw_alto = '.g:netrw_alto - put = 'let g:netrw_altv = '.g:netrw_altv - put = 'let g:netrw_browse_split = '.g:netrw_browse_split - if exists("g:netrw_browsex_viewer") - put = 'let g:netrw_browsex_viewer = '.g:netrw_browsex_viewer - else - put = 'let g:netrw_browsex_viewer = (not defined)' - endif - let cdescline= line("$") - put ='let g:netrw_cd_escape...' - put = 'let g:netrw_compress = '.g:netrw_compress - let decompressline= line("$") - put ='let g:netrw_decompress...' - put = 'let g:netrw_dirhistmax = '.g:netrw_dirhistmax - put = 'let g:netrw_fastbrowse = '.g:netrw_fastbrowse - let fnameescline= line("$") - put = 'let g:netrw_fname_escape...' - put = 'let g:netrw_ftp_browse_reject = '.g:netrw_ftp_browse_reject - put = 'let g:netrw_ftp_list_cmd = '.g:netrw_ftp_list_cmd - put = 'let g:netrw_ftp_sizelist_cmd = '.g:netrw_ftp_sizelist_cmd - put = 'let g:netrw_ftp_timelist_cmd = '.g:netrw_ftp_timelist_cmd - let globescline= line("$") - put ='let g:netrw_glob_escape...' - put = 'let g:netrw_hide = '.g:netrw_hide - put = 'let g:netrw_keepdir = '.g:netrw_keepdir - put = 'let g:netrw_list_cmd = '.g:netrw_list_cmd - put = 'let g:netrw_list_hide = '.g:netrw_list_hide - put = 'let g:netrw_liststyle = '.g:netrw_liststyle - put = 'let g:netrw_localcopycmd = '.g:netrw_localcopycmd - put = 'let g:netrw_local_mkdir = '.g:netrw_local_mkdir - put = 'let g:netrw_localmovecmd = '.g:netrw_localmovecmd - put = 'let g:netrw_local_rmdir = '.g:netrw_local_rmdir - put = 'let g:netrw_maxfilenamelen = '.g:netrw_maxfilenamelen - put = 'let g:netrw_menu = '.g:netrw_menu - put = 'let g:netrw_mkdir_cmd = '.g:netrw_mkdir_cmd - put = 'let g:netrw_preview = '.g:netrw_preview - put = 'let g:netrw_rename_cmd = '.g:netrw_rename_cmd - put = 'let g:netrw_retmap = '.g:netrw_retmap - put = 'let g:netrw_rm_cmd = '.g:netrw_rm_cmd - put = 'let g:netrw_rmdir_cmd = '.g:netrw_rmdir_cmd - put = 'let g:netrw_rmf_cmd = '.g:netrw_rmf_cmd - put = 'let g:netrw_silent = '.g:netrw_silent - put = 'let g:netrw_sort_by = '.g:netrw_sort_by - put = 'let g:netrw_sort_direction = '.g:netrw_sort_direction - put = 'let g:netrw_sort_sequence = '.g:netrw_sort_sequence - put = 'let g:netrw_special_syntax = '.g:netrw_special_syntax - put = 'let g:netrw_ssh_browse_reject = '.g:netrw_ssh_browse_reject - put = 'let g:netrw_scpport = '.g:netrw_scpport - put = 'let g:netrw_sshport = '.g:netrw_sshport - put = 'let g:netrw_timefmt = '.g:netrw_timefmt - let tmpfileescline= line("$") - put ='let g:netrw_tmpfile_escape...' - put = 'let g:netrw_use_noswf = '.g:netrw_use_noswf - put = 'let g:netrw_winsize = '.g:netrw_winsize - - put ='' - put ='+ For help, place cursor on line and press <F1>' - - 1d - silent %s/^+/"/e - res 99 - silent %s/= \([^0-9].*\)$/= '\1'/e - silent %s/= $/= ''/e - 1 - - " Put in g:netrw_shq setting and g:netrw_cd_escape - " (deferred so as to avoid the quote manipulation just preceding) - if g:netrw_shq == "'" - call setline(shqline, 'let g:netrw_shq = "'.g:netrw_shq.'"') - else - call setline(shqline, "let g:netrw_shq = '".g:netrw_shq."'") - endif - call setline(cdescline, "let g:netrw_cd_escape = ".'"'.escape(g:netrw_cd_escape,'\"').'"') - call setline(decompressline,"let g:netrw_decompress = ".substitute(string(g:netrw_decompress),"^'\\(.*\\)'$",'\1','')) - call setline(fnameescline, "let g:netrw_fname_escape = '".escape(g:netrw_fname_escape,"'")."'") - call setline(globescline, "let g:netrw_glob_escape = '".escape(g:netrw_glob_escape,"'")."'") - call setline(tmpfileescline,"let g:netrw_tmpfile_escape = '".escape(g:netrw_tmpfile_escape,"'")."'") - - set nomod - - nmap <buffer> <silent> <F1> :call NetrwSettingHelp()<cr> - nnoremap <buffer> <silent> <leftmouse> <leftmouse>:call NetrwSettingHelp()<cr> - let tmpfile= tempname() - exe 'au BufWriteCmd Netrw\ Settings silent w! '.tmpfile.'|so '.tmpfile.'|call delete("'.tmpfile.'")|set nomod' -endfun - -" --------------------------------------------------------------------- -" NetrwSettingHelp: {{{2 -fun! NetrwSettingHelp() -" call Dfunc("NetrwSettingHelp()") - let curline = getline(".") - if curline =~ '=' - let varhelp = substitute(curline,'^\s*let ','','e') - let varhelp = substitute(varhelp,'\s*=.*$','','e') -" call Decho("trying help ".varhelp) - try - exe "he ".varhelp - catch /^Vim\%((\a\+)\)\=:E149/ - echo "***sorry*** no help available for <".varhelp.">" - endtry - elseif line(".") < s:netrw_settings_stop - he netrw-settings - elseif line(".") < s:netrw_protocol_stop - he netrw-externapp - elseif line(".") < s:netrw_xfer_stop - he netrw-variables - else - he netrw-browse-var - endif -" call Dret("NetrwSettingHelp") -endfun - -" --------------------------------------------------------------------- -" Modelines: {{{1 -" vim:ts=8 fdm=marker +" netrwSettings.vim: makes netrw settings simpler +" Date: Sep 03, 2008 +" Maintainer: Charles E Campbell, Jr <drchipNOSPAM at campbellfamily dot biz> +" Version: 13 +" Copyright: Copyright (C) 1999-2007 Charles E. Campbell, Jr. {{{1 +" Permission is hereby granted to use and distribute this code, +" with or without modifications, provided that this copyright +" notice is copied with it. Like anything else that's free, +" netrwSettings.vim is provided *as is* and comes with no +" warranty of any kind, either expressed or implied. By using +" this plugin, you agree that in no event will the copyright +" holder be liable for any damages resulting from the use +" of this software. +" +" Mat 4:23 (WEB) Jesus went about in all Galilee, teaching in their {{{1 +" synagogues, preaching the gospel of the kingdom, and healing +" every disease and every sickness among the people. +" Load Once: {{{1 +if exists("g:loaded_netrwSettings") || &cp + finish +endif +let g:loaded_netrwSettings = "v13" + +" --------------------------------------------------------------------- +" NetrwSettings: {{{1 +fun! netrwSettings#NetrwSettings() + " this call is here largely just to insure that netrw has been loaded + call netrw#NetrwSavePosn() + if !exists("g:loaded_netrw") + echohl WarningMsg | echomsg "***sorry*** netrw needs to be loaded prior to using NetrwSettings" | echohl None + return + endif + + above wincmd s + enew + setlocal noswapfile bh=wipe + set ft=vim + file Netrw\ Settings + + " these variables have the following default effects when they don't + " exist (ie. have not been set by the user in his/her .vimrc) + if !exists("g:netrw_liststyle") + let g:netrw_liststyle= 0 + let g:netrw_list_cmd= "ssh HOSTNAME ls -FLa" + endif + if !exists("g:netrw_silent") + let g:netrw_silent= 0 + endif + if !exists("g:netrw_use_nt_rcp") + let g:netrw_use_nt_rcp= 0 + endif + if !exists("g:netrw_ftp") + let g:netrw_ftp= 0 + endif + if !exists("g:netrw_ignorenetrc") + let g:netrw_ignorenetrc= 0 + endif + + put ='+ ---------------------------------------------' + put ='+ NetrwSettings: by Charles E. Campbell, Jr.' + put ='+ Press <F1> with cursor atop any line for help' + put ='+ ---------------------------------------------' + let s:netrw_settings_stop= line(".") + + put ='' + put ='+ Netrw Protocol Commands' + put = 'let g:netrw_dav_cmd = '.g:netrw_dav_cmd + put = 'let g:netrw_fetch_cmd = '.g:netrw_fetch_cmd + put = 'let g:netrw_ftp_cmd = '.g:netrw_ftp_cmd + put = 'let g:netrw_http_cmd = '.g:netrw_http_cmd + put = 'let g:netrw_rcp_cmd = '.g:netrw_rcp_cmd + put = 'let g:netrw_rsync_cmd = '.g:netrw_rsync_cmd + put = 'let g:netrw_scp_cmd = '.g:netrw_scp_cmd + put = 'let g:netrw_sftp_cmd = '.g:netrw_sftp_cmd + put = 'let g:netrw_ssh_cmd = '.g:netrw_ssh_cmd + let s:netrw_protocol_stop= line(".") + put = '' + + put ='+Netrw Transfer Control' + put = 'let g:netrw_cygwin = '.g:netrw_cygwin + put = 'let g:netrw_ftp = '.g:netrw_ftp + put = 'let g:netrw_ftpmode = '.g:netrw_ftpmode + put = 'let g:netrw_ignorenetrc = '.g:netrw_ignorenetrc + put = 'let g:netrw_sshport = '.g:netrw_sshport + put = 'let g:netrw_use_nt_rcp = '.g:netrw_use_nt_rcp + put = 'let g:netrw_win95ftp = '.g:netrw_win95ftp + let s:netrw_xfer_stop= line(".") + put ='' + put ='+ Netrw Messages' + put ='let g:netrw_use_errorwindow = '.g:netrw_use_errorwindow + + put = '' + put ='+ Netrw Browser Control' + put = 'let g:netrw_alto = '.g:netrw_alto + put = 'let g:netrw_altv = '.g:netrw_altv + put = 'let g:netrw_browse_split = '.g:netrw_browse_split + if exists("g:netrw_browsex_viewer") + put = 'let g:netrw_browsex_viewer = '.g:netrw_browsex_viewer + else + put = 'let g:netrw_browsex_viewer = (not defined)' + endif + put = 'let g:netrw_compress = '.g:netrw_compress + put = 'let g:netrw_cursorline = '.g:netrw_cursorline + let decompressline= line("$") + put ='let g:netrw_decompress...' + put = 'let g:netrw_dirhistmax = '.g:netrw_dirhistmax + put = 'let g:netrw_fastbrowse = '.g:netrw_fastbrowse + let fnameescline= line("$") + put = 'let g:netrw_fname_escape...' + put = 'let g:netrw_ftp_browse_reject = '.g:netrw_ftp_browse_reject + put = 'let g:netrw_ftp_list_cmd = '.g:netrw_ftp_list_cmd + put = 'let g:netrw_ftp_sizelist_cmd = '.g:netrw_ftp_sizelist_cmd + put = 'let g:netrw_ftp_timelist_cmd = '.g:netrw_ftp_timelist_cmd + let globescline= line("$") + put ='let g:netrw_glob_escape...' + put = 'let g:netrw_hide = '.g:netrw_hide + put = 'let g:netrw_keepdir = '.g:netrw_keepdir + put = 'let g:netrw_list_cmd = '.g:netrw_list_cmd + put = 'let g:netrw_list_hide = '.g:netrw_list_hide + put = 'let g:netrw_liststyle = '.g:netrw_liststyle + put = 'let g:netrw_localcopycmd = '.g:netrw_localcopycmd + put = 'let g:netrw_local_mkdir = '.g:netrw_local_mkdir + put = 'let g:netrw_localmovecmd = '.g:netrw_localmovecmd + put = 'let g:netrw_local_rmdir = '.g:netrw_local_rmdir + put = 'let g:netrw_maxfilenamelen = '.g:netrw_maxfilenamelen + put = 'let g:netrw_menu = '.g:netrw_menu + put = 'let g:netrw_mkdir_cmd = '.g:netrw_mkdir_cmd + put = 'let g:netrw_preview = '.g:netrw_preview + put = 'let g:netrw_rename_cmd = '.g:netrw_rename_cmd + put = 'let g:netrw_retmap = '.g:netrw_retmap + put = 'let g:netrw_rm_cmd = '.g:netrw_rm_cmd + put = 'let g:netrw_rmdir_cmd = '.g:netrw_rmdir_cmd + put = 'let g:netrw_rmf_cmd = '.g:netrw_rmf_cmd + put = 'let g:netrw_silent = '.g:netrw_silent + put = 'let g:netrw_sort_by = '.g:netrw_sort_by + put = 'let g:netrw_sort_direction = '.g:netrw_sort_direction + put = 'let g:netrw_sort_options = '.g:netrw_sort_options + put = 'let g:netrw_sort_sequence = '.g:netrw_sort_sequence + put = 'let g:netrw_special_syntax = '.g:netrw_special_syntax + put = 'let g:netrw_ssh_browse_reject = '.g:netrw_ssh_browse_reject + put = 'let g:netrw_scpport = '.g:netrw_scpport + put = 'let g:netrw_sshport = '.g:netrw_sshport + put = 'let g:netrw_timefmt = '.g:netrw_timefmt + let tmpfileescline= line("$") + put ='let g:netrw_tmpfile_escape...' + put = 'let g:netrw_use_noswf = '.g:netrw_use_noswf + put = 'let g:netrw_xstrlen = '.g:netrw_xstrlen + put = 'let g:netrw_winsize = '.g:netrw_winsize + + put ='' + put ='+ For help, place cursor on line and press <F1>' + + 1d + silent %s/^+/"/e + res 99 + silent %s/= \([^0-9].*\)$/= '\1'/e + silent %s/= $/= ''/e + 1 + + call setline(decompressline,"let g:netrw_decompress = ".substitute(string(g:netrw_decompress),"^'\\(.*\\)'$",'\1','')) + call setline(fnameescline, "let g:netrw_fname_escape = '".escape(g:netrw_fname_escape,"'")."'") + call setline(globescline, "let g:netrw_glob_escape = '".escape(g:netrw_glob_escape,"'")."'") + call setline(tmpfileescline,"let g:netrw_tmpfile_escape = '".escape(g:netrw_tmpfile_escape,"'")."'") + + set nomod + + nmap <buffer> <silent> <F1> :call NetrwSettingHelp()<cr> + nnoremap <buffer> <silent> <leftmouse> <leftmouse>:call NetrwSettingHelp()<cr> + let tmpfile= tempname() + exe 'au BufWriteCmd Netrw\ Settings silent w! '.tmpfile.'|so '.tmpfile.'|call delete("'.tmpfile.'")|set nomod' +endfun + +" --------------------------------------------------------------------- +" NetrwSettingHelp: {{{2 +fun! NetrwSettingHelp() +" call Dfunc("NetrwSettingHelp()") + let curline = getline(".") + if curline =~ '=' + let varhelp = substitute(curline,'^\s*let ','','e') + let varhelp = substitute(varhelp,'\s*=.*$','','e') +" call Decho("trying help ".varhelp) + try + exe "he ".varhelp + catch /^Vim\%((\a\+)\)\=:E149/ + echo "***sorry*** no help available for <".varhelp.">" + endtry + elseif line(".") < s:netrw_settings_stop + he netrw-settings + elseif line(".") < s:netrw_protocol_stop + he netrw-externapp + elseif line(".") < s:netrw_xfer_stop + he netrw-variables + else + he netrw-browse-var + endif +" call Dret("NetrwSettingHelp") +endfun + +" --------------------------------------------------------------------- +" Modelines: {{{1 +" vim:ts=8 fdm=marker diff --git a/vimfiles/autoload/tcomment.vim b/vimfiles/autoload/tcomment.vim new file mode 100644 index 0000000..3fbe817 --- /dev/null +++ b/vimfiles/autoload/tcomment.vim @@ -0,0 +1,557 @@ +" tcomment.vim +" @Author: Thomas Link (mailto:micathom AT gmail com?subject=[vim]) +" @Website: http://www.vim.org/account/profile.php?user_id=4037 +" @License: GPL (see http://www.gnu.org/licenses/gpl.txt) +" @Created: 2007-09-17. +" @Last Change: 2008-05-07. +" @Revision: 0.0.46 + +if &cp || exists("loaded_tcomment_autoload") + finish +endif +let loaded_tcomment_autoload = 1 + + +function! s:DefaultValue(option) + exec 'let '. a:option .' = &'. a:option + exec 'set '. a:option .'&' + exec 'let default = &'. a:option + exec 'let &'. a:option .' = '. a:option + return default +endf + +let s:defaultComments = s:DefaultValue('comments') +let s:defaultCommentString = s:DefaultValue('commentstring') +let s:nullCommentString = '%s' + +" tcomment#Comment(line1, line2, ?commentMode, ?commentAnyway, ?commentBegin, ?commentEnd) +" commentMode: +" G ... guess +" B ... block +" i ... maybe inline, guess +" I ... inline +" R ... right +" v ... visual +" o ... operator +function! tcomment#Comment(beg, end, ...) + " save the cursor position + let co = col('.') + let li = line('.') + let s:pos_end = getpos("'>") + let commentMode = a:0 >= 1 ? a:1 : 'G' + let commentAnyway = a:0 >= 2 ? (a:2 == '!') : 0 + " TLogVAR a:beg, a:end, a:1, commentMode, commentAnyway + if commentMode =~# 'i' + let commentMode = substitute(commentMode, '\Ci', line("'<") == line("'>") ? 'I' : 'G', 'g') + endif + if commentMode =~# 'R' || commentMode =~# 'I' + let cstart = col("'<") + if cstart == 0 + let cstart = col('.') + endif + if commentMode =~# 'R' + let commentMode = substitute(commentMode, '\CR', 'G', 'g') + let cend = 0 + else + let cend = col("'>") + if commentMode =~# 'o' + let cend += 1 + endif + endif + else + let cstart = 0 + let cend = 0 + endif + " TLogVAR commentMode, cstart, cend + " get the correct commentstring + if a:0 >= 3 && a:3 != '' + let cms = s:EncodeCommentPart(a:3) .'%s' + if a:0 >= 4 && a:4 != '' + let cms = cms . s:EncodeCommentPart(a:4) + endif + else + let [cms, commentMode] = s:GetCommentString(a:beg, a:end, commentMode) + endif + let cms0 = s:BlockGetCommentString(cms) + let cms0 = escape(cms0, '\') + " make whitespace optional; this conflicts with comments that require some + " whitespace + let cmtCheck = substitute(cms0, '\([ ]\)', '\1\\?', 'g') + " turn commentstring into a search pattern + let cmtCheck = s:SPrintF(cmtCheck, '\(\_.\{-}\)') + " set commentMode and indentStr + let [indentStr, uncomment] = s:CommentDef(a:beg, a:end, cmtCheck, commentMode, cstart, cend) + " TLogVAR indentStr, uncomment + if commentAnyway + let uncomment = 0 + endif + " go + if commentMode =~# 'B' + " We want a comment block + call s:CommentBlock(a:beg, a:end, uncomment, cmtCheck, cms, indentStr) + else + " We want commented lines + " final search pattern for uncommenting + let cmtCheck = escape('\V\^\(\s\{-}\)'. cmtCheck .'\$', '"/\') + " final pattern for commenting + let cmtReplace = escape(cms0, '"/') + silent exec a:beg .','. a:end .'s/\V'. + \ s:StartRx(cstart) . indentStr .'\zs\(\.\{-}\)'. s:EndRx(cend) .'/'. + \ '\=s:ProcessedLine('. uncomment .', submatch(0), "'. cmtCheck .'", "'. cmtReplace .'")/ge' + endif + " reposition cursor + " TLogVAR commentMode + if commentMode =~ '>' + call setpos('.', s:pos_end) + else + " TLogVAR li, co + call cursor(li, co) + endif +endf + + +function! tcomment#Operator(type, ...) "{{{3 + let commentMode = a:0 >= 1 ? a:1 : '' + let bang = a:0 >= 2 ? a:2 : '' + let sel_save = &selection + let &selection = "inclusive" + let reg_save = @@ + " let pos = getpos('.') + " TLogVAR a:type + try + if a:type == 'line' + silent exe "normal! '[V']" + let commentMode1 = 'G' + elseif a:type == 'block' + silent exe "normal! `[\<C-V>`]" + let commentMode1 = 'I' + else + silent exe "normal! `[v`]" + let commentMode1 = 'i' + endif + if empty(commentMode) + let commentMode = commentMode1 + endif + let beg = line("'[") + let end = line("']") + norm! + let commentMode .= g:tcommentOpModeExtra + call tcomment#Comment(beg, end, commentMode.'o', bang) + finally + let &selection = sel_save + let @@ = reg_save + if g:tcommentOpModeExtra !~ '>' + " TLogVAR pos + " call setpos('.', pos) + call setpos('.', w:tcommentPos) + unlet! w:tcommentPos + endif + endtry +endf + + +function! tcomment#OperatorLine(type) "{{{3 + call tcomment#Operator(a:type, 'G') +endf + + +function! tcomment#OperatorAnyway(type) "{{{3 + call tcomment#Operator(a:type, '', '!') +endf + + +function! tcomment#OperatorLineAnyway(type) "{{{3 + call tcomment#Operator(a:type, 'G', '!') +endf + + +" comment text as if it were of a specific filetype +function! tcomment#CommentAs(beg, end, commentAnyway, filetype, ...) + let ccount = a:0 >= 1 ? a:1 : 1 + " TLogVAR ccount + if a:filetype =~ '_block$' + let commentMode = 'B' + let ft = substitute(a:filetype, '_block$', '', '') + elseif a:filetype =~ '_inline$' + let commentMode = 'I' + let ft = substitute(a:filetype, '_inline$', '', '') + else + let commentMode = 'G' + let ft = a:filetype + endif + let [cms, commentMode] = s:GetCommentString(a:beg, a:end, commentMode, ft) + let pre = substitute(cms, '%s.*$', '', '') + let pre = substitute(pre, '%%', '%', 'g') + let post = substitute(cms, '^.\{-}%s', '', '') + let post = substitute(post, '%%', '%', 'g') + if ccount > 1 + let pre_l = matchlist(pre, '^\(\S\+\)\(.*\)$') + " TLogVAR pre_l + if !empty(get(pre_l, 1)) + let pre = repeat(pre_l[1], ccount) . pre_l[2] + endif + let post_l = matchlist(post, '^\(\s*\)\(.\+\)$') + " TLogVAR post_l + if !empty(get(post_l, 2)) + let post = post_l[1] . repeat(post_l[2], ccount) + endif + endif + keepjumps call tcomment#Comment(a:beg, a:end, commentMode, a:commentAnyway, pre, post) +endf + + +" ---------------------------------------------------------------- +" collect all variables matching ^tcomment_ +function! tcomment#CollectFileTypes() + if g:tcommentFileTypesDirty + redir => vars + silent let + redir END + let g:tcommentFileTypes = split(vars, '\n') + call filter(g:tcommentFileTypes, 'v:val =~ "tcomment_"') + call map(g:tcommentFileTypes, 'matchstr(v:val, ''tcomment_\zs\S\+'')') + call sort(g:tcommentFileTypes) + let g:tcommentFileTypesRx = '\V\^\('. join(g:tcommentFileTypes, '\|') .'\)\(\u\.\*\)\?\$' + let g:tcommentFileTypesDirty = 0 + endif +endf + +call tcomment#CollectFileTypes() + +" return a list of filetypes for which a tcomment_{&ft} is defined +function! tcomment#FileTypes(ArgLead, CmdLine, CursorPos) + " TLogVAR a:ArgLead, a:CmdLine, a:CursorPos + call tcomment#CollectFileTypes() + let types = copy(g:tcommentFileTypes) + if index(g:tcommentFileTypes, &filetype) != -1 + " TLogVAR &filetype + call insert(types, &filetype) + endif + if empty(a:ArgLead) + return types + else + return filter(types, 'v:val =~ ''\V''.a:ArgLead') + endif +endf + +function! s:EncodeCommentPart(string) + return substitute(a:string, '%', '%%', 'g') +endf + +" s:GetCommentString(beg, end, commentMode, ?filetype="") +function! s:GetCommentString(beg, end, commentMode, ...) + let ft = a:0 >= 1 ? a:1 : '' + if ft != '' + let [cms, commentMode] = s:GetCustomCommentString(ft, a:commentMode) + else + let cms = '' + let commentMode = a:commentMode + endif + if empty(cms) + if exists('b:commentstring') + let cms = b:commentstring + return s:GetCustomCommentString(&filetype, a:commentMode, cms) + elseif exists('b:commentStart') && b:commentStart != '' + let cms = s:EncodeCommentPart(b:commentStart) .' %s' + if exists('b:commentEnd') && b:commentEnd != '' + let cms = cms .' '. s:EncodeCommentPart(b:commentEnd) + endif + return s:GetCustomCommentString(&filetype, a:commentMode, cms) + elseif g:tcommentGuessFileType || (exists('g:tcommentGuessFileType_'. &filetype) + \ && g:tcommentGuessFileType_{&filetype} =~ '[^0]') + if g:tcommentGuessFileType_{&filetype} == 1 + let altFiletype = '' + else + let altFiletype = g:tcommentGuessFileType_{&filetype} + endif + return s:GuessFileType(a:beg, a:end, a:commentMode, &filetype, altFiletype) + else + return s:GetCustomCommentString(&filetype, a:commentMode, s:GuessCurrentCommentString(a:commentMode)) + endif + endif + return [cms, commentMode] +endf + +" s:SPrintF(formatstring, ?values ...) +" => string +function! s:SPrintF(string, ...) + let n = 1 + let r = '' + let s = a:string + while 1 + let i = match(s, '%\(.\)') + if i >= 0 + let x = s[i + 1] + let r = r . strpart(s, 0, i) + let s = strpart(s, i + 2) + if x == '%' + let r = r.'%' + else + if a:0 >= n + let v = a:{n} + let n = n + 1 + else + echoerr 'Malformed format string (too many arguments required): '. a:string + endif + if x ==# 's' + let r = r.v + elseif x ==# 'S' + let r = r.'"'.v.'"' + else + echoerr 'Malformed format string: '. a:string + endif + endif + else + return r.s + endif + endwh +endf + +function! s:StartRx(pos) + if a:pos == 0 + return '\^' + else + return '\%'. a:pos .'c' + endif +endf + +function! s:EndRx(pos) + if a:pos == 0 + return '\$' + else + return '\%'. a:pos .'c' + endif +endf + +function! s:GetIndentString(line, start) + let start = a:start > 0 ? a:start - 1 : 0 + return substitute(strpart(getline(a:line), start), '\V\^\s\*\zs\.\*\$', '', '') +endf + +function! s:CommentDef(beg, end, checkRx, commentMode, cstart, cend) + let mdrx = '\V'. s:StartRx(a:cstart) .'\s\*'. a:checkRx .'\s\*'. s:EndRx(0) + let line = getline(a:beg) + if a:cstart != 0 && a:cend != 0 + let line = strpart(line, 0, a:cend - 1) + endif + let uncomment = (line =~ mdrx) + let it = s:GetIndentString(a:beg, a:cstart) + let il = indent(a:beg) + let n = a:beg + 1 + while n <= a:end + if getline(n) =~ '\S' + let jl = indent(n) + if jl < il + let it = s:GetIndentString(n, a:cstart) + let il = jl + endif + if a:commentMode =~# 'G' + if !(getline(n) =~ mdrx) + let uncomment = 0 + endif + endif + endif + let n = n + 1 + endwh + if a:commentMode =~# 'B' + let t = @t + try + silent exec 'norm! '. a:beg.'G1|v'.a:end.'G$"ty' + let uncomment = (@t =~ mdrx) + finally + let @t = t + endtry + endif + return [it, uncomment] +endf + +function! s:ProcessedLine(uncomment, match, checkRx, replace) + if !(a:match =~ '\S' || g:tcommentBlankLines) + return a:match + endif + let ml = len(a:match) + if a:uncomment + let rv = substitute(a:match, a:checkRx, '\1\2', '') + else + let rv = s:SPrintF(a:replace, a:match) + endif + " let md = len(rv) - ml + let s:pos_end = getpos('.') + let s:pos_end[2] += len(rv) + " TLogVAR pe, md, a:match + let rv = escape(rv, '\ ') + let rv = substitute(rv, '\n', '\\\n', 'g') + return rv +endf + +function! s:CommentBlock(beg, end, uncomment, checkRx, replace, indentStr) + let t = @t + try + silent exec 'norm! '. a:beg.'G1|v'.a:end.'G$"td' + let ms = s:BlockGetMiddleString(a:replace) + let mx = escape(ms, '\') + if a:uncomment + let @t = substitute(@t, '\V\^\s\*'. a:checkRx .'\$', '\1', '') + if ms != '' + let @t = substitute(@t, '\V\n'. a:indentStr . mx, '\n'. a:indentStr, 'g') + endif + let @t = substitute(@t, '^\n', '', '') + let @t = substitute(@t, '\n\s*$', '', '') + else + let cs = s:BlockGetCommentString(a:replace) + let cs = a:indentStr . substitute(cs, '%s', '%s'. a:indentStr, '') + if ms != '' + let ms = a:indentStr . ms + let mx = a:indentStr . mx + let @t = substitute(@t, '^'. a:indentStr, '', 'g') + let @t = ms . substitute(@t, '\n'. a:indentStr, '\n'. mx, 'g') + endif + let @t = s:SPrintF(cs, "\n". @t ."\n") + endif + silent norm! "tP + finally + let @t = t + endtry +endf + +" inspired by Meikel Brandmeyer's EnhancedCommentify.vim +" this requires that a syntax names are prefixed by the filetype name +" s:GuessFileType(beg, end, commentMode, filetype, ?fallbackFiletype) +function! s:GuessFileType(beg, end, commentMode, filetype, ...) + if a:0 >= 1 && a:1 != '' + let [cms, commentMode] = s:GetCustomCommentString(a:1, a:commentMode) + if cms == '' + let cms = s:GuessCurrentCommentString(a:commentMode) + endif + else + let commentMode = s:CommentMode(a:commentMode, 'G') + let cms = s:GuessCurrentCommentString(0) + endif + let n = a:beg + while n <= a:end + let m = indent(n) + 1 + let le = col('$') + while m < le + let syntaxName = synIDattr(synID(n, m, 1), 'name') + let ftypeMap = get(g:tcommentSyntaxMap, syntaxName) + if !empty(ftypeMap) + return s:GetCustomCommentString(ftypeMap, a:commentMode, cms) + elseif syntaxName =~ g:tcommentFileTypesRx + let ft = substitute(syntaxName, g:tcommentFileTypesRx, '\1', '') + if exists('g:tcommentIgnoreTypes_'. a:filetype) && g:tcommentIgnoreTypes_{a:filetype} =~ '\<'.ft.'\>' + let m = m + 1 + else + return s:GetCustomCommentString(ft, a:commentMode, cms) + endif + elseif syntaxName == '' || syntaxName == 'None' || syntaxName =~ '^\u\+$' || syntaxName =~ '^\u\U*$' + let m = m + 1 + else + break + endif + endwh + let n = n + 1 + endwh + return [cms, commentMode] +endf + +function! s:CommentMode(commentMode, newmode) "{{{3 + return substitute(a:commentMode, '\w\+', a:newmode, 'g') +endf + +function! s:GuessCurrentCommentString(commentMode) + let valid_cms = (stridx(&commentstring, '%s') != -1) + if &commentstring != s:defaultCommentString && valid_cms + " The &commentstring appears to have been set and to be valid + return &commentstring + endif + if &comments != s:defaultComments + " the commentstring is the default one, so we assume that it wasn't + " explicitly set; we then try to reconstruct &cms from &comments + let cms = s:ConstructFromComments(a:commentMode) + if cms != s:nullCommentString + return cms + endif + endif + if valid_cms + " Before &commentstring appeared not to be set. As we don't know + " better we return it anyway if it is valid + return &commentstring + else + " &commentstring is invalid. So we return the identity string. + return s:nullCommentString + endif +endf + +function! s:ConstructFromComments(commentMode) + exec s:ExtractCommentsPart('') + if a:commentMode =~# 'G' && line != '' + return line .' %s' + endif + exec s:ExtractCommentsPart('s') + if s != '' + exec s:ExtractCommentsPart('e') + " if a:commentMode + " exec s:ExtractCommentsPart("m") + " if m != "" + " let m = "\n". m + " endif + " return s.'%s'.e.m + " else + return s.' %s '.e + " endif + endif + if line != '' + return line .' %s' + else + return s:nullCommentString + endif +endf + +function! s:ExtractCommentsPart(key) + " let key = a:key != "" ? a:key .'[^:]*' : "" + let key = a:key . '[bnflrxO0-9-]*' + let val = substitute(&comments, '^\(.\{-},\)\{-}'. key .':\([^,]\+\).*$', '\2', '') + if val == &comments + let val = '' + else + let val = substitute(val, '%', '%%', 'g') + endif + let var = a:key == '' ? 'line' : a:key + return 'let '. var .'="'. escape(val, '"') .'"' +endf + +" s:GetCustomCommentString(ft, commentMode, ?default="") +function! s:GetCustomCommentString(ft, commentMode, ...) + let commentMode = a:commentMode + let customComment = exists('g:tcomment_'. a:ft) + if commentMode =~# 'B' && exists('g:tcomment_'. a:ft .'_block') + let cms = g:tcomment_{a:ft}_block + elseif commentMode =~? 'I' && exists('g:tcomment_'. a:ft .'_inline') + let cms = g:tcomment_{a:ft}_inline + elseif customComment + let cms = g:tcomment_{a:ft} + let commentMode = s:CommentMode(commentMode, 'G') + elseif a:0 >= 1 + let cms = a:1 + let commentMode = s:CommentMode(commentMode, 'G') + else + let cms = '' + let commentMode = s:CommentMode(commentMode, 'G') + endif + return [cms, commentMode] +endf + +function! s:BlockGetCommentString(cms) + " return substitute(a:cms, '\n.*$', '', '') + return matchstr(a:cms, '^.\{-}\ze\(\n\|$\)') +endf + +function! s:BlockGetMiddleString(cms) + " let rv = substitute(a:cms, '^.\{-}\n\([^\n]*\)', '\1', '') + let rv = matchstr(a:cms, '\n\zs.*') + return rv == a:cms ? '' : rv +endf + + +redraw + diff --git a/vimfiles/autoload/vimball.vim b/vimfiles/autoload/vimball.vim index d896163..df932db 100644 --- a/vimfiles/autoload/vimball.vim +++ b/vimfiles/autoload/vimball.vim @@ -1,7 +1,7 @@ " vimball.vim : construct a file containing both paths and files " Author: Charles E. Campbell, Jr. -" Date: Apr 01, 2008 -" Version: 25 +" Date: May 30, 2008 +" Version: 26 " GetLatestVimScripts: 1502 1 :AutoInstall: vimball.vim " Copyright: (c) 2004-2007 by Charles E. Campbell, Jr. " The VIM LICENSE applies to Vimball.vim, and Vimball.txt @@ -15,7 +15,7 @@ if &cp || exists("g:loaded_vimball") || v:version < 700 finish endif let s:keepcpo = &cpo -let g:loaded_vimball = "v25" +let g:loaded_vimball = "v26" set cpo&vim "DechoTabOn @@ -25,9 +25,8 @@ if !exists("s:USAGE") let s:USAGE = 0 let s:WARNING = 1 let s:ERROR = 2 - if exists("g:vimball_shq") && !exists("g:netrw_shq") - let g:netrw_shq= g:vimball_shq - endif + + " determine if cygwin is in use or not if !exists("g:netrw_cygwin") if has("win32") || has("win95") || has("win64") || has("win16") if &shell =~ '\%(\<bash\>\|\<zsh\>\)\%(\.exe\)\=$' @@ -39,6 +38,25 @@ if !exists("s:USAGE") let g:netrw_cygwin= 0 endif endif + + " set up g:vimball_mkdir if the mkdir() call isn't defined + if !exists("*mkdir") + if exists("g:netrw_local_mkdir") + let g:vimball_mkdir= g:netrw_local_mkdir + elseif executable("mkdir") + let g:vimball_mkdir= "mkdir" + elseif executable("makedir") + let g:vimball_mkdir= "makedir" + endif + if !exists(g:vimball_mkdir) + call vimball#ShowMesg(s:WARNING,"(vimball) g:vimball_mkdir undefined") + endif + endif + + " set up shell quoting character + if exists("g:vimball_shq") && !exists("g:netrw_shq") + let g:netrw_shq= g:vimball_shq + endif if !exists("g:netrw_shq") if exists("&shq") && &shq != "" let g:netrw_shq= &shq @@ -53,6 +71,8 @@ if !exists("s:USAGE") endif " call Decho("g:netrw_shq<".g:netrw_shq.">") endif + + " set up escape string (used to protect paths) if !exists("g:vimball_path_escape") let g:vimball_path_escape= ' ;#%' endif @@ -77,7 +97,7 @@ endif " [file] fun! vimball#MkVimball(line1,line2,writelevel,...) range " call Dfunc("MkVimball(line1=".a:line1." line2=".a:line2." writelevel=".a:writelevel." vimballname<".a:1.">) a:0=".a:0) - if a:1 =~ '.vim' || a:1 =~ '.txt' + if a:1 =~ '\.vim$' || a:1 =~ '\.txt$' let vbname= substitute(a:1,'\.\a\{3}$','.vba','') else let vbname= a:1 @@ -98,7 +118,7 @@ fun! vimball#MkVimball(line1,line2,writelevel,...) range endif " user option bypass - call s:SaveSettings() + call vimball#SaveSettings() if a:0 >= 2 " allow user to specify where to get the files @@ -124,7 +144,7 @@ fun! vimball#MkVimball(line1,line2,writelevel,...) range if !filereadable(svfile) call vimball#ShowMesg(s:ERROR,"unable to read file<".svfile.">") call s:ChgDir(curdir) - call s:RestoreSettings() + call vimball#RestoreSettings() " call Dret("MkVimball") return endif @@ -150,8 +170,8 @@ fun! vimball#MkVimball(line1,line2,writelevel,...) range " write the file from the tab let svfilepath= s:Path(svfile,'') -" call Decho("exe $r ".svfilepath) - exe "$r ".svfilepath +" call Decho("exe $r ".fnameescape(svfilepath)) + exe "$r ".fnameescape(svfilepath) call setline(lastline+1,line("$") - lastline - 1) " call Decho("lastline=".lastline." line$=".line("$")) @@ -167,12 +187,12 @@ fun! vimball#MkVimball(line1,line2,writelevel,...) range setlocal ff=unix if a:writelevel let vbnamepath= s:Path(vbname,'') -" call Decho("exe w! ".vbnamepath) - exe "w! ".vbnamepath +" call Decho("exe w! ".fnameescape(vbnamepath)) + exe "w! ".fnameescape(vbnamepath) else let vbnamepath= s:Path(vbname,'') -" call Decho("exe w ".vbnamepath) - exe "w ".vbnamepath +" call Decho("exe w ".fnameescape(vbnamepath)) + exe "w ".fnameescape(vbnamepath) endif " call Decho("Vimball<".vbname."> created") echo "Vimball<".vbname."> created" @@ -183,7 +203,7 @@ fun! vimball#MkVimball(line1,line2,writelevel,...) range exe "tabc ".vbtabnr " restore options - call s:RestoreSettings() + call vimball#RestoreSettings() " call Dret("MkVimball") endfun @@ -202,7 +222,7 @@ fun! vimball#Vimball(really,...) endif " set up standard settings - call s:SaveSettings() + call vimball#SaveSettings() let curtabnr = tabpagenr() let vimballfile = expand("%:tr") @@ -262,10 +282,10 @@ fun! vimball#Vimball(really,...) " call Decho("using L#".(linenr+1).": fsize=".fsize) " Allow AsNeeded/ directory to take place of plugin/ directory - " when AsNeeded/filename is filereadable + " when AsNeeded/filename is filereadable or was present in VimballRecord if fname =~ '\<plugin/' let anfname= substitute(fname,'\<plugin/','AsNeeded/','') - if filereadable(anfname) + if filereadable(anfname) || (exists("s:VBRstring") && s:VBRstring =~ anfname) " call Decho("using anfname<".anfname."> instead of <".fname.">") let fname= anfname endif @@ -283,7 +303,11 @@ fun! vimball#Vimball(really,...) " call Decho("dirname<".dirname.">") if !isdirectory(dirname) " call Decho("making <".dirname.">") - call mkdir(dirname) + if exists("g:vimball_mkdir") + call system(g:vimball_mkdir." ".s:Escape(dirname)) + else + call mkdir(dirname) + endif call s:RecordInVar(home,"rmdir('".dirname."')") endif endwhile @@ -309,10 +333,10 @@ fun! vimball#Vimball(really,...) " write tab to file if a:really let fnamepath= s:Path(home."/".fname,'') -" call Decho("exe w! ".fnamepath) - exe "silent w! ".fnamepath +" call Decho("exe w! ".fnameescape(fnamepath)) + exe "silent w! ".fnameescape(fnamepath) echo "wrote ".fnamepath - call s:RecordInVar(home,"call delete('".fnamepath."')") + call s:RecordInVar(home,"call delete('".fnameescape(fnamepath)."')") endif " return to tab with vimball @@ -354,7 +378,7 @@ fun! vimball#Vimball(really,...) setlocal nomod bh=wipe exe "tabn ".curtabnr exe "tabc ".vbtabnr - call s:RestoreSettings() + call vimball#RestoreSettings() call s:ChgDir(curdir) " call Dret("vimball#Vimball") @@ -372,9 +396,6 @@ fun! vimball#RmVimball(...) " call Dret("vimball#RmVimball : (g:vimball_norecord)") return endif - let eikeep= &ei - set ei=all -" call Decho("turned off all events") if a:0 == 0 let curfile= expand("%:tr") @@ -420,7 +441,9 @@ fun! vimball#RmVimball(...) let foundit = 0 endif if foundit - let exestring= substitute(getline("."),'^'.curfile.'\S\{-}\.vba: ','','') + let exestring = substitute(getline("."),'^'.curfile.'\S\{-}\.vba: ','','') + let s:VBRstring= substitute(exestring,'call delete(','','g') + let s:VBRstring= substitute(s:VBRstring,"[')]",'','g') " call Decho("exe ".exestring) silent! keepalt keepjumps exe exestring silent! keepalt keepjumps d @@ -428,7 +451,8 @@ fun! vimball#RmVimball(...) " call Decho("exestring<".exestring.">") echomsg "removed ".exestring." files" else - let curfile= substitute(curfile,'\.vba','','') + let s:VBRstring= '' + let curfile = substitute(curfile,'\.vba','','') " call Decho("unable to find <".curfile."> in .VimballRecord") if !exists("s:ok_unablefind") call vimball#ShowMesg(s:WARNING,"(RmVimball) unable to find <".curfile."> in .VimballRecord") @@ -440,10 +464,6 @@ fun! vimball#RmVimball(...) endif call s:ChgDir(curdir) - " restoring events -" call Decho("restoring events") - let &ei= eikeep - " call Dret("vimball#RmVimball") endfun @@ -454,6 +474,7 @@ fun! vimball#Decompress(fname) " decompression: if expand("%") =~ '.*\.gz' && executable("gunzip") + " handle *.gz with gunzip silent exe "!gunzip ".s:Escape(a:fname) if v:shell_error != 0 call vimball#ShowMesg(s:WARNING,"(vimball#Decompress) gunzip may have failed with <".a:fname.">") @@ -461,7 +482,19 @@ fun! vimball#Decompress(fname) let fname= substitute(a:fname,'\.gz$','','') exe "e ".escape(fname,' \') call vimball#ShowMesg(s:USAGE,"Source this file to extract it! (:so %)") + + elseif expand("%") =~ '.*\.gz' && executable("gzip") + " handle *.gz with gzip -d + silent exe "!gzip -d ".s:Escape(a:fname) + if v:shell_error != 0 + call vimball#ShowMesg(s:WARNING,'(vimball#Decompress) "gzip -d" may have failed with <'.a:fname.">") + endif + let fname= substitute(a:fname,'\.gz$','','') + exe "e ".escape(fname,' \') + call vimball#ShowMesg(s:USAGE,"Source this file to extract it! (:so %)") + elseif expand("%") =~ '.*\.bz2' && executable("bunzip2") + " handle *.bz2 with bunzip2 silent exe "!bunzip2 ".s:Escape(a:fname) if v:shell_error != 0 call vimball#ShowMesg(s:WARNING,"(vimball#Decompress) bunzip2 may have failed with <".a:fname.">") @@ -469,7 +502,19 @@ fun! vimball#Decompress(fname) let fname= substitute(a:fname,'\.bz2$','','') exe "e ".escape(fname,' \') call vimball#ShowMesg(s:USAGE,"Source this file to extract it! (:so %)") + + elseif expand("%") =~ '.*\.bz2' && executable("bzip2") + " handle *.bz2 with bzip2 -d + silent exe "!bzip2 -d ".s:Escape(a:fname) + if v:shell_error != 0 + call vimball#ShowMesg(s:WARNING,'(vimball#Decompress) "bzip2 -d" may have failed with <'.a:fname.">") + endif + let fname= substitute(a:fname,'\.bz2$','','') + exe "e ".escape(fname,' \') + call vimball#ShowMesg(s:USAGE,"Source this file to extract it! (:so %)") + elseif expand("%") =~ '.*\.zip' && executable("unzip") + " handle *.zip with unzip silent exe "!unzip ".s:Escape(a:fname) if v:shell_error != 0 call vimball#ShowMesg(s:WARNING,"(vimball#Decompress) unzip may have failed with <".a:fname.">") @@ -478,6 +523,7 @@ fun! vimball#Decompress(fname) exe "e ".escape(fname,' \') call vimball#ShowMesg(s:USAGE,"Source this file to extract it! (:so %)") endif + set noma bt=nofile fmr=[[[,]]] fdm=marker " call Dret("Decompress") @@ -518,9 +564,9 @@ endfun fun! s:ChgDir(newdir) " call Dfunc("ChgDir(newdir<".a:newdir.">)") if (has("win32") || has("win95") || has("win64") || has("win16")) - exe 'silent cd '.escape(substitute(a:newdir,'/','\\','g'),' ') + exe 'silent cd '.fnameescape(substitute(a:newdir,'/','\\','g')) else - exe 'silent cd '.escape(a:newdir,' ') + exe 'silent cd '.fnameescape(a:newdir) endif " call Dret("ChgDir : curdir<".getcwd().">") endfun @@ -627,6 +673,11 @@ fun! s:VimballHome() " go to vim plugin home for home in split(&rtp,',') + [''] if isdirectory(home) && filewritable(home) | break | endif + let basehome= substitute(home,'[/\\]\.vim$','','') + if isdirectory(basehome) && filewritable(basehome) + let home= basehome."/.vim" + break + endif endfor if home == "" " just pick the first directory @@ -636,13 +687,25 @@ fun! s:VimballHome() let home= substitute(home,'/','\\','g') endif endif + " insure that the home directory exists +" call Decho("picked home<".home.">") + if !isdirectory(home) + if exists("g:vimball_mkdir") +" call Decho("home<".home."> isn't a directory -- making it now with g:vimball_mkdir<".g:vimball_mkdir.">") +" call Decho("system(".g:vimball_mkdir." ".s:Escape(home).")") + call system(g:vimball_mkdir." ".s:Escape(home)) + else +" call Decho("home<".home."> isn't a directory -- making it now with mkdir()") + call mkdir(home) + endif + endif " call Dret("VimballHome <".home.">") return home endfun " --------------------------------------------------------------------- -" s:SaveSettings: {{{2 -fun! s:SaveSettings() +" vimball#SaveSettings: {{{2 +fun! vimball#SaveSettings() " call Dfunc("SaveSettings()") let s:makeep = getpos("'a") let s:regakeep= @a @@ -669,8 +732,8 @@ fun! s:SaveSettings() endfun " --------------------------------------------------------------------- -" s:RestoreSettings: {{{2 -fun! s:RestoreSettings() +" vimball#RestoreSettings: {{{2 +fun! vimball#RestoreSettings() " call Dfunc("RestoreSettings()") let @a = s:regakeep if exists("&acd") diff --git a/vimfiles/doc/MultipleSearch.txt b/vimfiles/doc/MultipleSearch.txt new file mode 100644 index 0000000..30381d5 --- /dev/null +++ b/vimfiles/doc/MultipleSearch.txt @@ -0,0 +1,106 @@ +*MultipleSearch.txt* Simultaneously show multiple search results Ver. 1.3 + +Maintainer: Dan Sharp <dwsharp at hotmail dot com> +Last Changed: 13 Aug 2008 +License: Vim License + +============================================================================== +1. MultipleSearch Plugin *MultipleSearch* + +MultipleSearch allows you to have the results of multiple searches displayed +on the screen at the same time. Each search highlights its results in a +different color, and all searches are displayed at once. After the maximum +number of colors is used, the script starts over with the first color. + +Special thanks to: +Peter Valach for suggestions and testing! +Jeff Mei for the suggesting and testing the :SearchBuffers command. +Amber Hassan for fixing problems with a search pattern containing quote +characters! +Manuel Picaza for the mapping to :Search the word under the cursor. + +------------------------------------------------------------------------------ +2. Commands *MultipleSearch-commands* + +:Search <pattern> *:Search* +will highlight all occurrences of <pattern> in the current buffer. A +subsequent :Search <pattern2> will highlight all occurrences of <pattern2> +in the current buffer, retaining the highlighting of <pattern1> as well. +<pattern1> and <pattern2> are any search pattern like you would use in a +normal /<pattern> search. + +The :Search command honors Vim's 'ignorecase' and 'smartcase' settings for +its own search. You can use the |\c| and |\C| flags in the search pattern to +force case matching no matter the setting of 'ignorecase' and 'smartcase'. + +:SearchBuffers <pattern> *:SearchBuffers* +The :SearchBuffers command works just like :Search, but the search occurs in +all currently listed buffers (i.e., those that appear in the output of :ls). +The match in all buffers will have the same color. This is different than +:bufdo Search <pattern> because in that case, each buffer will highlight the +match in a different color. + +" Clear the current search selections and start over with the first color in +" the sequence. +:SearchReset +To clear the highlighting, issue the command :SearchReset (for the current +buffer) or :SearchBuffersReset (for all buffers). + +" Clear the current search selections and start over with the first color in +" the sequence. +:SearchBuffersReset +To clear the highlighting, issue the command :SearchReset (for the current +buffer) or :SearchBuffersReset (for all buffers). + +" Reinitialize the script after changing one of the global preferences. +:SearchReinit +If you change one of the preference variables, you can issue the command +:SearchReinit +to update the script with your new selections. + +------------------------------------------------------------------------------ +3. Mappings *MultipleSearch-mappings* + +" Thanks to Manuel Picaza for the following mapping to :Search the word under +" the cursor. +nnoremap <silent> <Leader>* + +" Following Manuel's idea, adapt the former 'Super Star' tip from vim.org to work with +" :Search on a visual selection. +vnoremap <silent> <Leader>* + +" Set the current search pattern to the next one in the list +nnoremap <silent> <Leader>n + +" Set the current search pattern to the previous one in the list +nnoremap <silent> <Leader>N + +------------------------------------------------------------------------------ +4. Settings *MultipleSearch-settings* + +You can specify the maximum number of different colors to use by setting the +g:MultipleSearchMaxColors variable in your .vimrc. The default setting is +four, but the script should handle as much as your terminal / GUI can +display. The g:MultipleSearchColorSequence variable lets you list the +colors you want displayed, and in what order. To make the text more +readable, you can set the g:MultipleSearchTextColorSequence variable to a +list of colors for the text, each position corresponding to the color in the +same position in g:MultipleSearchColorSequence. + + *g:MultipleSearchMaxColors* +g:MultipleSearchMaxColors (Default: 8) + Specifes a maximum number of colors to use. + + *g:MultipleSearchColorSequence* +g:MultipleSearchColorSequence (Default: "red,yellow,blue,green,magenta, + cyan,gray,brown") + Defines the sequence of colors to use for searches. + + *g:MultipleSearchTextColorSequence* +g:MultipleSearchTextColorSequence (Default: "white,black,white,black,white, + black,black,white") + Defines the text color for searches, so that it can still be read against + the colored background. + +============================================================================== +vim: ft=help:norl:ts=8:tw=78 diff --git a/vimfiles/doc/pi_netrw.txt b/vimfiles/doc/pi_netrw.txt index 77a9b43..bd83bcf 100644 --- a/vimfiles/doc/pi_netrw.txt +++ b/vimfiles/doc/pi_netrw.txt @@ -1,2931 +1,3165 @@ -*pi_netrw.txt* For Vim version 7.1. Last change: 2008 Mar 28 - - ----------------------------------------------------- - NETRW REFERENCE MANUAL by Charles E. Campbell, Jr. - ----------------------------------------------------- - - -*dav* *http* *network* *Nwrite* *netrw-file* -*fetch* *netrw* *Nread* *rcp* *scp* -*ftp* *netrw.vim* *Nsource* *rsync* *sftp* - -============================================================================== -1. Contents *netrw-contents* {{{1 - -1. Contents.............................................|netrw-contents| -2. Starting With Netrw..................................|netrw-start| -3. Netrw Reference......................................|netrw-ref| - EXTERNAL APPLICATIONS AND PROTOCOLS................|netrw-externapp| - READING............................................|netrw-read| - WRITING............................................|netrw-write| - DIRECTORY LISTING..................................|netrw-dirlist| - CHANGING THE USERID AND PASSWORD...................|netrw-chgup| - VARIABLES AND SETTINGS.............................|netrw-variables| - PATHS..............................................|netrw-path| -4. Network-Oriented File Transfer.......................|netrw-xfer| - NETRC..............................................|netrw-netrc| - PASSWORD...........................................|netrw-passwd| -5. Activation...........................................|netrw-activate| -6. Transparent File Editing.............................|netrw-transparent| -7. Ex Commands..........................................|netrw-ex| -8. Variables and Options................................|netrw-var| -9. Browsing.............................................|netrw-browse| - Introduction To Browsing...........................|netrw-browse-intro| - Quick Reference: Maps..............................|netrw-browse-maps| - Quick Reference: Commands..........................|netrw-browse-cmds| - Bookmarking A Directory............................|netrw-mb| - Browsing...........................................|netrw-cr| - Browsing With A Horizontally Split Window..........|netrw-o| - Browsing With A New Tab............................|netrw-t| - Browsing With A Vertically Split Window............|netrw-v| - Change Listing Style...............................|netrw-i| - Changing To A Bookmarked Directory.................|netrw-gb| - Changing To A Predecessor Directory................|netrw-u| - Changing To A Successor Directory..................|netrw-U| - Customizing Browsing With A User Function..........|netrw-x| - Deleting Files Or Directories......................|netrw-D| - Directory Exploring Commands.......................|netrw-explore| - Exploring With Stars and Patterns..................|netrw-star| - Displaying Information About File..................|netrw-qf| - Edit File Or Directory Hiding List.................|netrw-ctrl-h| - Editing The Sorting Sequence.......................|netrw-S| - Going Up...........................................|netrw--| - Hiding Files Or Directories........................|netrw-a| - Improving Browsing.................................|netrw-ssh-hack| - Listing Bookmarks And History......................|netrw-qb| - Making A New Directory.............................|netrw-d| - Making The Browsing Directory The Current Directory|netrw-c| - Marked Files: Compression And Decompression........|netrw-mz| - Marked Files: Printing.............................|netrw-mp| - Marked Files: Tagging..............................|netrw-mT| - Marked Files: Unmarking............................|netrw-mu| - Marking Files......................................|netrw-mf| - Marking Files By Regular Expression................|netrw-mr| - Netrw Browser Variables............................|netrw-browser-var| - Netrw Browsing And Option Incompatibilities........|netrw-incompatible| - Netrw Settings.....................................|netrw-settings| - Obtaining A File...................................|netrw-O| - Preview Window.....................................|netrw-p| - Previous Window....................................|netrw-P| - Refreshing The Listing.............................|netrw-ctrl-l| - Renaming Files Or Directories......................|netrw-move| - Reversing Sorting Order............................|netrw-r| - Selecting Sorting Style............................|netrw-s| -10. Problems and Fixes...................................|netrw-problems| -11. Debugging Netrw Itself...............................|netrw-debug| -12. History..............................................|netrw-history| -13. Credits..............................................|netrw-credits| - -{Vi does not have any of this} - -============================================================================== -2. Starting With Netrw *netrw-start* {{{1 - -Netrw makes reading files, writing files, browsing over a network, and -browsing locally easy! First, make sure that you have plugins enabled, so -you'll need to have at least the following in your <.vimrc>: -(or see |netrw-activate|) > - - set nocp " 'compatible' is not set - filetype plugin on " plugins are enabled -< -(see |'cp'| and |:filetype-plugin-on|) - -Netrw supports "transparent" editing of files on other machines using urls -(see |netrw-transparent|). As an example of this, let's assume you have an -account on some other machine; if you can use scp, try: > - - vim scp://hostname/path/to/file -< -Want to make ssh/scp easier to use? Check out |netrw-ssh-hack|! - -So, what if you have ftp, not ssh/scp? That's easy, too; try > - - vim ftp://hostname/path/to/file -< -Want to make ftp simpler to use? See if your ftp supports a file called -<.netrc> -- typically it goes in your home directory, has read/write -permissions for only the user to read (ie. not group, world, other, etc), -and has lines resembling > - - machine HOSTNAME login USERID password "PASSWORD" - machine HOSTNAME login USERID password "PASSWORD" - ... - default login USERID password "PASSWORD" -< -Now about browsing -- when you just want to look around before editing a -file. For browsing on your current host, just "edit" a directory: > - - vim . - vim /home/userid/path -< -For browsing on a remote host, "edit" a directory (but make sure that -the directory name is followed by a "/"): > - - vim scp://hostname/ - vim ftp://hostname/path/to/dir/ -< -See |netrw-browse| for more! - -There are more protocols supported by netrw just than scp and ftp, too: see the -next section, |netrw-externapp|, for how to use these external applications. - -If you want to use plugins, but for some reason don't wish to use netrw, then -you need to avoid loading both the plugin and the autoload portions of netrw. -You may do so by placing the following two lines in your <.vimrc>: > - - :let g:loaded_netrw = 1 - :let g:loaded_netrwPlugin = 1 -< - -============================================================================== -3. Netrw Reference *netrw-ref* {{{1 - - Netrw supports several protocols in addition to scp and ftp mentioned - in |netrw-start|. These include dav, fetch, http,... well, just look - at the list in |netrw-externapp|. Each protocol is associated with a - variable which holds the default command supporting that protocol. - -EXTERNAL APPLICATIONS AND PROTOCOLS *netrw-externapp* {{{2 - - Protocol Variable Default Value - -------- ---------------- ------------- - dav: *g:netrw_dav_cmd* = "cadaver" - fetch: *g:netrw_fetch_cmd* = "fetch -o" if fetch is available - ftp: *g:netrw_ftp_cmd* = "ftp" - http: *g:netrw_http_cmd* = "curl -o" if curl is available - http: g:netrw_http_cmd = "wget -q -O" elseif wget is available - http: g:netrw_http_cmd = "fetch -o" elseif fetch is available - rcp: *g:netrw_rcp_cmd* = "rcp" - rsync: *g:netrw_rsync_cmd* = "rsync -a" - scp: *g:netrw_scp_cmd* = "scp -q" - sftp: *g:netrw_sftp_cmd* = "sftp" - -READING *netrw-read* *netrw-nread* {{{2 - - Generally, one may just use the url notation with a normal editing - command, such as > - - :e ftp://[user@]machine/path -< - Netrw also provides the Nread command: - - :Nread ? give help - :Nread "machine:path" uses rcp - :Nread "machine path" uses ftp w/ <.netrc> - :Nread "machine id password path" uses ftp - :Nread "dav://machine[:port]/path" uses cadaver - :Nread "fetch://[user@]machine/path" uses fetch - :Nread "ftp://[user@]machine[[:#]port]/path" uses ftp w/ <.netrc> - :Nread "http://[user@]machine/path" uses http uses wget - :Nread "rcp://[user@]machine/path" uses rcp - :Nread "rsync://[user@]machine[:port]/path" uses rsync - :Nread "scp://[user@]machine[[:#]port]/path" uses scp - :Nread "sftp://[user@]machine/path" uses sftp - -WRITING *netrw-write* *netrw-nwrite* {{{2 - - One may just use the url notation with a normal file writing - command, such as > - - :w ftp://[user@]machine/path -< - Netrw also provides the Nwrite command: - - :Nwrite ? give help - :Nwrite "machine:path" uses rcp - :Nwrite "machine path" uses ftp w/ <.netrc> - :Nwrite "machine id password path" uses ftp - :Nwrite "dav://machine[:port]/path" uses cadaver - :Nwrite "ftp://[user@]machine[[:#]port]/path" uses ftp w/ <.netrc> - :Nwrite "rcp://[user@]machine/path" uses rcp - :Nwrite "rsync://[user@]machine[:port]/path" uses rsync - :Nwrite "scp://[user@]machine[[:#]port]/path" uses scp - :Nwrite "sftp://[user@]machine/path" uses sftp - http: not supported! - -SOURCING *netrw-source* {{{2 - - One may just use the url notation with the normal file sourcing - command, such as > - - :so ftp://[user@]machine/path -< - Netrw also provides the Nsource command: - - :Nsource ? give help - :Nsource "dav://machine[:port]/path" uses cadaver - :Nsource "fetch://[user@]machine/path" uses fetch - :Nsource "ftp://[user@]machine[[:#]port]/path" uses ftp w/ <.netrc> - :Nsource "http://[user@]machine/path" uses http uses wget - :Nsource "rcp://[user@]machine/path" uses rcp - :Nsource "rsync://[user@]machine[:port]/path" uses rsync - :Nsource "scp://[user@]machine[[:#]port]/path" uses scp - :Nsource "sftp://[user@]machine/path" uses sftp - -DIRECTORY LISTING *netrw-dirlist* {{{2 - - One may browse a directory to get a listing by simply attempting to - edit the directory: > - - :e scp://[user]@hostname/path/ - :e ftp://[user]@hostname/path/ -< - For remote directories (ie. those using scp or ftp), that trailing - "/" is necessary (it tells netrw that its to treat it as a directory - to browse instead of a file to download). - - However, the Nread command can also be used to accomplish this: - - :Nread [protocol]://[user]@hostname/path/ - - *netrw-login* *netrw-password* -CHANGING USERID AND PASSWORD *netrw-chgup* *netrw-userpass* {{{2 - - Attempts to use ftp will prompt you for a user-id and a password. - These will be saved in global variables g:netrw_uid and - s:netrw_passwd; subsequent uses of ftp will re-use those two items to - simplify the further use of ftp. However, if you need to use a - different user id and/or password, you'll want to call NetUserPass() - first. To work around the need to enter passwords, check if your ftp - supports a <.netrc> file in your home directory. Also see - |netrw-passwd| (and if you're using ssh/scp hoping to figure out how - to not need to use passwords, look at |netrw-ssh-hack|). - - :NetUserPass [uid [password]] -- prompts as needed - :call NetUserPass() -- prompts for uid and password - :call NetUserPass("uid") -- prompts for password - :call NetUserPass("uid","password") -- sets global uid and password - -NETRW VARIABLES AND SETTINGS *netrw-variables* {{{2 -(also see: |netrw-browser-var| |netrw-protocol| |netrw-settings| |netrw-var|) - -Netrw provides a lot of variables which allow you to customize netrw to your -preferences. One way to look at them is via the command :NetrwSettings (see -|netrw-settings|) which will display your current netrw settings. Most such -settings are described below, in |netrw-browser-options|, and in -|netrw-externapp|: - - *b:netrw_lastfile* last file Network-read/written retained on a per-buffer - basis (supports plain :Nw ) - - *g:netrw_ftp* if it doesn't exist, use default ftp - =0 use default ftp (uid password) - =1 use alternate ftp method (user uid password) - If you're having trouble with ftp, try changing the - value of this variable to see if the alternate ftp - method works for your setup. - - *g:netrw_extracmd* default: doesn't exist - If this variable exists, then any string it contains - will be placed into the commands set to your ftp - client. As an example: - ="passive" - - *g:netrw_ftpmode* ="binary" (default) - ="ascii" - - *g:netrw_ignorenetrc* =0 (default for linux, cygwin) - =1 If you have a <.netrc> file but it doesn't work and - you want it ignored, then set this variable as - shown. (default for Windows + cmd.exe) - - *g:netrw_menu* =0 disable netrw's menu - =1 (default) netrw's menu enabled - - *g:netrw_nogx* if this variable exists, then the "gx" map will not - be available (see |netrw-gx|) - - *g:netrw_uid* (ftp) user-id, retained on a per-session basis - *s:netrw_passwd* (ftp) password, retained on a per-session basis - - *g:netrw_preview* =0 (default) preview window shown in a horizontally - split window - =1 preview window shown in a vertically split window. - Also affects the "previous window" (see |netrw-P|) in - the same way. - - *g:netrw_shq* = "'" for Unix/Linux systems (ie. a single quote) - = "'" for Windows + cygwin systems (ie. a single quote) - = '"' for Windows systems, not using cygwin - (ie. a double quote) - Controls the quoting character used during scp and ftp - commands. - - *g:netrw_scpport* = "-P" : option to use to set port for scp - *g:netrw_sshport* = "-p" : option to use to set port for ssh - - *g:netrw_silent* =0 : transfers done normally - =1 : transfers done silently - - *g:netrw_use_errorwindow* =1 : messages from netrw will use a separate one - line window. This window provides reliable - delivery of messages. (default) - =0 : messages from netrw will use echoerr ; - messages don't always seem to show up this - way, but one doesn't have to quit the window. - - *g:netrw_win95ftp* =1 if using Win95, will remove four trailing blank - lines that o/s's ftp "provides" on transfers - =0 force normal ftp behavior (no trailing line removal) - - *g:netrw_cygwin* =1 assume scp under windows is from cygwin. Also - permits network browsing to use ls with time and - size sorting (default if windows) - =0 assume Windows' scp accepts windows-style paths - Network browsing uses dir instead of ls - This option is ignored if you're using unix - - *g:netrw_use_nt_rcp* =0 don't use the rcp of WinNT, Win2000 and WinXP - =1 use WinNT's rcp in binary mode (default) - -PATHS *netrw-path* {{{2 - -Paths to files are generally user-directory relative for most protocols. -It is possible that some protocol will make paths relative to some -associated directory, however. -> - example: vim scp://user@host/somefile - example: vim scp://user@host/subdir1/subdir2/somefile -< -where "somefile" is in the "user"'s home directory. If you wish to get a -file using root-relative paths, use the full path: -> - example: vim scp://user@host//somefile - example: vim scp://user@host//subdir1/subdir2/somefile -< - -============================================================================== -4. Network-Oriented File Transfer *netrw-xfer* {{{1 - -Network-oriented file transfer under Vim is implemented by a VimL-based script -(<netrw.vim>) using plugin techniques. It currently supports both reading and -writing across networks using rcp, scp, ftp or ftp+<.netrc>, scp, fetch, -dav/cadaver, rsync, or sftp. - -http is currently supported read-only via use of wget or fetch. - -<netrw.vim> is a standard plugin which acts as glue between Vim and the -various file transfer programs. It uses autocommand events (BufReadCmd, -FileReadCmd, BufWriteCmd) to intercept reads/writes with url-like filenames. > - - ex. vim ftp://hostname/path/to/file -< -The characters preceding the colon specify the protocol to use; in the -example, it's ftp. The <netrw.vim> script then formulates a command or a -series of commands (typically ftp) which it issues to an external program -(ftp, scp, etc) which does the actual file transfer/protocol. Files are read -from/written to a temporary file (under Unix/Linux, /tmp/...) which the -<netrw.vim> script will clean up. - - *netrw-putty* *netrw-pscp* *netrw-psftp* -One may modify any protocol's implementing external application by setting a -variable (ex. scp uses the variable g:netrw_scp_cmd, which is defaulted to -"scp -q"). As an example, consider using PuTTY: > - - let g:netrw_scp_cmd = '"c:\Program Files\PuTTY\pscp.exe" -q -batch' - let g:netrw_sftp_cmd= '"c:\Program Files\PuTTY\psftp.exe"' -< -See |netrw-p8| for more about putty, pscp, psftp, etc. - -Ftp, an old protocol, seems to be blessed by numerous implementations. -Unfortunately, some implementations are noisy (ie., add junk to the end of the -file). Thus, concerned users may decide to write a NetReadFixup() function -that will clean up after reading with their ftp. Some Unix systems (ie., -FreeBSD) provide a utility called "fetch" which uses the ftp protocol but is -not noisy and more convenient, actually, for <netrw.vim> to use. -Consequently, if "fetch" is executable, it will be used to do reads for -ftp://... (and http://...) . See |netrw-var| for more about this. - -For rcp, scp, sftp, and http, one may use network-oriented file transfers -transparently; ie. -> - vim rcp://[user@]machine/path - vim scp://[user@]machine/path -< -If your ftp supports <.netrc>, then it too can be just as transparently used -if the needed triad of machine name, user id, and password are present in -that file. Your ftp must be able to use the <.netrc> file on its own, however. -> - vim ftp://[user@]machine[[:#]portnumber]/path -< -However, ftp will often need to query the user for the userid and password. -The latter will be done "silently"; ie. asterisks will show up instead of -the actually-typed-in password. Netrw will retain the userid and password -for subsequent read/writes from the most recent transfer so subsequent -transfers (read/write) to or from that machine will take place without -additional prompting. - - *netrw-urls* - +=================================+============================+============+ - | Reading | Writing | Uses | - +=================================+============================+============+ - | DAV: | | | - | dav://host/path | | cadaver | - | :Nread dav://host/path | :Nwrite dav://host/path | cadaver | - +---------------------------------+----------------------------+------------+ - | FETCH: | | | - | fetch://[user@]host/path | | | - | fetch://[user@]host:http/path | Not Available | fetch | - | :Nread fetch://[user@]host/path| | | - +---------------------------------+----------------------------+------------+ - | FILE: | | | - | file:///* | file:///* | | - | file://localhost/* | file://localhost/* | | - +---------------------------------+----------------------------+------------+ - | FTP: (*3) | (*3) | | - | ftp://[user@]host/path | ftp://[user@]host/path | ftp (*2) | - | :Nread ftp://host/path | :Nwrite ftp://host/path | ftp+.netrc | - | :Nread host path | :Nwrite host path | ftp+.netrc | - | :Nread host uid pass path | :Nwrite host uid pass path | ftp | - +---------------------------------+----------------------------+------------+ - | HTTP: wget is executable: (*4) | | | - | http://[user@]host/path | Not Available | wget | - +---------------------------------+----------------------------+------------+ - | HTTP: fetch is executable (*4) | | | - | http://[user@]host/path | Not Available | fetch | - +---------------------------------+----------------------------+------------+ - | RCP: | | | - | rcp://[user@]host/path | rcp://[user@]host/path | rcp | - +---------------------------------+----------------------------+------------+ - | RSYNC: | | | - | rsync://[user@]host/path | rsync://[user@]host/path | rsync | - | :Nread rsync://host/path | :Nwrite rsync://host/path | rsync | - | :Nread rcp://host/path | :Nwrite rcp://host/path | rcp | - +---------------------------------+----------------------------+------------+ - | SCP: | | | - | scp://[user@]host/path | scp://[user@]host/path | scp | - | :Nread scp://host/path | :Nwrite scp://host/path | scp (*1) | - +---------------------------------+----------------------------+------------+ - | SFTP: | | | - | sftp://[user@]host/path | sftp://[user@]host/path | sftp | - | :Nread sftp://host/path | :Nwrite sftp://host/path | sftp (*1) | - +=================================+============================+============+ - - (*1) For an absolute path use scp://machine//path. - - (*2) if <.netrc> is present, it is assumed that it will - work with your ftp client. Otherwise the script will - prompt for user-id and password. - - (*3) for ftp, "machine" may be machine#port or machine:port - if a different port is needed than the standard ftp port - - (*4) for http:..., if wget is available it will be used. Otherwise, - if fetch is available it will be used. - -Both the :Nread and the :Nwrite ex-commands can accept multiple filenames. - - -NETRC *netrw-netrc* - -The <.netrc> file, typically located in your home directory, contains lines -therein which map a hostname (machine name) to the user id and password you -prefer to use with it. - -The typical syntax for lines in a <.netrc> file is given as shown below. -Ftp under Unix usually supports <.netrc>; ftp under Windows usually doesn't. -> - machine {full machine name} login {user-id} password "{password}" - default login {user-id} password "{password}" - -Your ftp client must handle the use of <.netrc> on its own, but if the -<.netrc> file exists, an ftp transfer will not ask for the user-id or -password. - - Note: - Since this file contains passwords, make very sure nobody else can - read this file! Most programs will refuse to use a .netrc that is - readable for others. Don't forget that the system administrator can - still read the file! Ie. for Linux/Unix: chmod 600 .netrc - - -PASSWORD *netrw-passwd* - -The script attempts to get passwords for ftp invisibly using |inputsecret()|, -a built-in Vim function. See |netrw-uidpass| for how to change the password -after one has set it. - -Unfortunately there doesn't appear to be a way for netrw to feed a password to -scp. Thus every transfer via scp will require re-entry of the password. -However, |netrw-ssh-hack| can help with this problem. - - -============================================================================== -5. Activation *netrw-activate* {{{1 - -Network-oriented file transfers are available by default whenever Vim's -|'nocompatible'| mode is enabled. Netrw's script files reside in your -system's plugin, autoload, and syntax directories; just the -plugin/netrwPlugin.vim script is sourced automatically whenever you bring up -vim. The main script in autoload/netrw.vim is only loaded when you actually -use netrw. I suggest that, at a minimum, you have at least the following in -your <.vimrc> customization file: > - - set nocp - if version >= 600 - filetype plugin indent on - endif -< - -============================================================================== -6. Transparent File Editing *netrw-transparent* {{{1 - -Transparent file transfers occur whenever a regular file read or write -(invoked via an |:autocmd| for |BufReadCmd|, |BufWriteCmd|, or |SourceCmd| -events) is made. Thus one may read, write, or source files across networks -just as easily as if they were local files! > - - vim ftp://[user@]machine/path - ... - :wq - -See |netrw-activate| for more on how to encourage your vim to use plugins -such as netrw. - - -============================================================================== -7. Ex Commands *netrw-ex* {{{1 - -The usual read/write commands are supported. There are also a few -additional commands available. Often you won't need to use Nwrite or -Nread as shown in |netrw-transparent| (ie. simply use > - :e url - :r url - :w url -instead, as appropriate) -- see |netrw-urls|. In the explanations -below, a {netfile} is an url to a remote file. - -:[range]Nw[rite] Write the specified lines to the current - file as specified in b:netrw_lastfile. - -:[range]Nw[rite] {netfile} [{netfile}]... - Write the specified lines to the {netfile}. - -:Nr[ead] Read the specified lines into the current - buffer from the file specified in - b:netrw_lastfile. - -:Nr[ead] {netfile} {netfile}... - Read the {netfile} after the current line. - -:Ns[ource] {netfile} - Source the {netfile}. - To start up vim using a remote .vimrc, one may use - the following (all on one line) (tnx to Antoine Mechelynck) > - vim -u NORC -N - --cmd "runtime plugin/netrwPlugin.vim" - --cmd "source scp://HOSTNAME/.vimrc" -< *netrw-uidpass* -:call NetUserPass() - If g:netrw_uid and s:netrw_passwd don't exist, - this function will query the user for them. - -:call NetUserPass("userid") - This call will set the g:netrw_uid and, if - the password doesn't exist, will query the user for it. - -:call NetUserPass("userid","passwd") - This call will set both the g:netrw_uid and s:netrw_passwd. - The user-id and password are used by ftp transfers. One may - effectively remove the user-id and password by using empty - strings (ie. ""). - -:NetrwSettings This command is described in |netrw-settings| -- used to - display netrw settings and change netrw behavior. - - -============================================================================== -8. Variables and Options *netrw-options* *netrw-var* {{{1 - -(if you're interested in the netrw browser settings, see: |netrw-browser-var|) - -The <netrw.vim> script provides several variables which act as options to -affect <netrw.vim>'s file transfer behavior. These variables typically may be -set in the user's <.vimrc> file: (see also |netrw-settings| |netrw-protocol|) - -> - - ------------- - Netrw Options - ------------- - Option Meaning - -------------- ----------------------------------------------- -< - b:netrw_col Holds current cursor position (during NetWrite) - g:netrw_cygwin =1 assume scp under windows is from cygwin - (default/windows) - =0 assume scp under windows accepts windows - style paths (default/else) - g:netrw_ftp =0 use default ftp (uid password) - g:netrw_ftpmode ="binary" (default) - ="ascii" (your choice) - g:netrw_ignorenetrc =1 (default) - if you have a <.netrc> file but you don't - want it used, then set this variable. Its - mere existence is enough to cause <.netrc> - to be ignored. - b:netrw_lastfile Holds latest method/machine/path. - b:netrw_line Holds current line number (during NetWrite) - g:netrw_passwd Holds current password for ftp. - g:netrw_silent =0 transfers done normally - =1 transfers done silently - g:netrw_uid Holds current user-id for ftp. - =1 use alternate ftp (user uid password) - (see |netrw-options|) - g:netrw_use_nt_rcp =0 don't use WinNT/2K/XP's rcp (default) - =1 use WinNT/2K/XP's rcp, binary mode - g:netrw_win95ftp =0 use unix-style ftp even if win95/98/ME/etc - =1 use default method to do ftp > - ----------------------------------------------------------------------- -< -The script will also make use of the following variables internally, albeit -temporarily. -> - ------------------- - Temporary Variables - ------------------- - Variable Meaning - -------- ------------------------------------ -< - g:netrw_method Index indicating rcp/ftp+.netrc/ftp - g:netrw_machine Holds machine name parsed from input - g:netrw_fname Holds filename being accessed > - ------------------------------------------------------------ -< - *netrw-protocol* - -Netrw supports a number of protocols. These protocols are invoked using the -variables listed below, and may be modified by the user. -> - ------------------------ - Protocol Control Options - ------------------------ - Option Type Setting Meaning - --------- -------- -------------- --------------------------- -< - netrw_ftp variable =doesn't exist userid set by "user userid" - =0 userid set by "user userid" - =1 userid set by "userid" - NetReadFixup function =doesn't exist no change - =exists Allows user to have files - read via ftp automatically - transformed however they wish - by NetReadFixup() - g:netrw_dav_cmd variable ="cadaver" - g:netrw_fetch_cmd variable ="fetch -o" if fetch is available - g:netrw_ftp_cmd variable ="ftp" - g:netrw_http_cmd variable ="fetch -o" if fetch is available - g:netrw_http_cmd variable ="wget -O" else if wget is available - g:netrw_list_cmd variable ="ssh USEPORT HOSTNAME ls -Fa" - g:netrw_rcp_cmd variable ="rcp" - g:netrw_rsync_cmd variable ="rsync -a" - g:netrw_scp_cmd variable ="scp -q" - g:netrw_sftp_cmd variable ="sftp" > - ------------------------------------------------------------------------- -< - *netrw-ftp* - -The g:netrw_..._cmd options (|g:netrw_ftp_cmd| and |g:netrw_sftp_cmd|) -specify the external program to use handle the ftp protocol. They may -include command line options (such as -p for passive mode). - -Browsing is supported by using the |g:netrw_list_cmd|; the substring -"HOSTNAME" will be changed via substitution with whatever the current request -is for a hostname. - -Two options (|g:netrw_ftp| and |netrw-fixup|) both help with certain ftp's -that give trouble . In order to best understand how to use these options if -ftp is giving you troubles, a bit of discussion is provided on how netrw does -ftp reads. - -For ftp, netrw typically builds up lines of one of the following formats in a -temporary file: -> - IF g:netrw_ftp !exists or is not 1 IF g:netrw_ftp exists and is 1 - ---------------------------------- ------------------------------ -< - open machine [port] open machine [port] - user userid password userid password - [g:netrw_ftpmode] password - [g:netrw_extracmd] [g:netrw_ftpmode] - get filename tempfile [g:netrw_extracmd] - get filename tempfile > - --------------------------------------------------------------------- -< -The |g:netrw_ftpmode| and |g:netrw_extracmd| are optional. - -Netrw then executes the lines above by use of a filter: -> - :%! {g:netrw_ftp_cmd} -i [-n] -< -where - g:netrw_ftp_cmd is usually "ftp", - -i tells ftp not to be interactive - -n means don't use netrc and is used for Method #3 (ftp w/o <.netrc>) - -If <.netrc> exists it will be used to avoid having to query the user for -userid and password. The transferred file is put into a temporary file. -The temporary file is then read into the main editing session window that -requested it and the temporary file deleted. - -If your ftp doesn't accept the "user" command and immediately just demands a -userid, then try putting "let netrw_ftp=1" in your <.vimrc>. - - *netrw-cadaver* -To handle the SSL certificate dialog for untrusted servers, one may pull -down the certificate and place it into /usr/ssl/cert.pem. This operation -renders the server treatment as "trusted". - - *netrw-fixup* *netreadfixup* -If your ftp for whatever reason generates unwanted lines (such as AUTH -messages) you may write a NetReadFixup(tmpfile) function: -> - function! NetReadFixup(method,line1,line2) - " a:line1: first new line in current file - " a:line2: last new line in current file - if a:method == 1 "rcp - elseif a:method == 2 "ftp + <.netrc> - elseif a:method == 3 "ftp + machine,uid,password,filename - elseif a:method == 4 "scp - elseif a:method == 5 "http/wget - elseif a:method == 6 "dav/cadaver - elseif a:method == 7 "rsync - elseif a:method == 8 "fetch - elseif a:method == 9 "sftp - else " complain - endif - endfunction -> -The NetReadFixup() function will be called if it exists and thus allows you to -customize your reading process. As a further example, <netrw.vim> contains -just such a function to handle Windows 95 ftp. For whatever reason, Windows -95's ftp dumps four blank lines at the end of a transfer, and so it is -desirable to automate their removal. Here's some code taken from <netrw.vim> -itself: -> - if has("win95") && g:netrw_win95ftp - fun! NetReadFixup(method, line1, line2) - if method == 3 " ftp (no <.netrc>) - let fourblanklines= line2 - 3 - silent fourblanklines.",".line2."g/^\s*/d" - endif - endfunction - endif -> - -============================================================================== -9. Browsing *netrw-browsing* *netrw-browse* *netrw-help* {{{1 - *netrw-browser* *netrw-dir* *netrw-list* - -INTRODUCTION TO BROWSING *netrw-browse-intro* {{{2 - -Netrw supports the browsing of directories on your local system and on remote -hosts; browsing includes listing files and directories, entering directories, -editing files therein, deleting files/directories, making new directories, -moving (renaming) files and directories, copying files and directories, etc. -One may mark files and execute any system command on them! The Netrw browser -generally implements the previous explorer's maps and commands for remote -directories, although details (such as pertinent global variable names) -necessarily differ. To browse a directory, simply "edit" it! > - - vim /your/directory/ - vim . - vim c:\your\directory\ -< -(Related topics: |netrw-cr| |netrw-o| |netrw-p| |netrw-P| |netrw-t| - |netrw-mf| |netrw-mx| |netrw-D| |netrw-R| |netrw-v| ) - -The Netrw remote file and directory browser handles two protocols: ssh and -ftp. The protocol in the url, if it is ftp, will cause netrw also to use ftp -in its remote browsing. Specifying any other protocol will cause it to be -used for file transfers; but the ssh protocol will be used to do remote -browsing. - -To use Netrw's remote directory browser, simply attempt to read a "file" with -a trailing slash and it will be interpreted as a request to list a directory: -> - vim [protocol]://[user@]hostname/path/ -< -where [protocol] is typically scp or ftp. As an example, try: > - - vim ftp://ftp.home.vim.org/pub/vim/ -< -For local directories, the trailing slash is not required. Again, because its -easy to miss: to browse remote directories, the url must terminate with a -slash! - -If you'd like to avoid entering the password repeatedly for remote directory -listings with ssh or scp, see |netrw-ssh-hack|. To avoid password entry with -ftp, see |netrw-netrc| (if your ftp supports it). - -There are several things you can do to affect the browser's display of files: - - * To change the listing style, press the "i" key (|netrw-i|). - Currently there are four styles: thin, long, wide, and tree. - - * To hide files (don't want to see those xyz~ files anymore?) see - |netrw-ctrl-h|. - - * Press s to sort files by name, time, or size. - -See |netrw-browse-cmds| for all the things you can do with netrw! - - -QUICK REFERENCE: MAPS *netrw-browse-maps* {{{2 -> - --- ----------------- ---- - Map Quick Explanation Link - --- ----------------- ---- -< <F1> Causes Netrw to issue help - <cr> Netrw will enter the directory or read the file |netrw-cr| - <del> Netrw will attempt to remove the file/directory |netrw-del| - - Makes Netrw go up one directory |netrw--| - a Toggles between normal display, |netrw-a| - hiding (suppress display of files matching g:netrw_list_hide) - showing (display only files which match g:netrw_list_hide) - c Make browsing directory the current directory |netrw-c| - d Make a directory |netrw-d| - D Attempt to remove the file(s)/directory(ies) |netrw-D| - gb Go to previous bookmarked directory |netrw-gb| - gi Display information on file |netrw-qf| - <c-h> Edit file hiding list |netrw-ctrl-h| - i Cycle between thin, long, wide, and tree listings |netrw-i| - <c-l> Causes Netrw to refresh the directory listing |netrw-ctrl-l| - mb Bookmark current directory |netrw-mb| - mc Copy marked files to marked-file target directory |netrw-mc| - md Apply diff to marked files (up to 3) |netrw-md| - me Place marked files on arg list and edit them |netrw-me| - mf Mark a file |netrw-mf| - mh Toggle marked file suffices' presence on hiding list |netrw-mh| - mm Move marked files to marked-file target directory |netrw-mm| - mp Print marked files |netrw-mp| - mr Mark files satisfying a |regexp| |netrw-mr| - mt Current browsing directory becomes markfile target |netrw-mt| - mT Apply ctags to marked files |netrw-mT| - mu Unmark all marked files |netrw-mu| - mx Apply arbitrary shell command to marked files |netrw-mx| - mz Compress/decompress marked files |netrw-mz| - o Enter the file/directory under the cursor in a new |netrw-o| - browser window. A horizontal split is used. - O Obtain a file specified by cursor |netrw-O| - p Preview the file |netrw-p| - P Browse in the previously used window |netrw-P| - q List bookmarked directories and history |netrw-qb| - r Reverse sorting order |netrw-r| - R Rename the designed file(s)/directory(ies) |netrw-R| - s Select sorting style: by name, time, or file size |netrw-s| - S Specify suffix priority for name-sorting |netrw-S| - t Enter the file/directory under the cursor in a new tab|netrw-t| - u Change to recently-visited directory |netrw-u| - U Change to subsequently-visited directory |netrw-U| - v Enter the file/directory under the cursor in a new |netrw-v| - browser window. A vertical split is used. - x View file with an associated program |netrw-x| - - <leftmouse> (gvim only) selects word under mouse as if a <cr> - had been pressed (ie. edit file, change directory) - <middlemouse> (gvim only) same as P selecting word under mouse; - see |netrw-P| - <rightmouse> (gvim only) delete file/directory using word under - mouse - <2-leftmouse> (gvim only) when: - * in a netrw-selected file, AND - * |g:netrw_retmap| == 1 AND - * the user doesn't already have a <2-leftmouse> mapping - defined before netrw is autoloaded, - then a double clicked leftmouse button will return - to the netrw browser window. - <s-leftmouse> (gvim only) like mf, will mark files - -QUICK REFERENCE: COMMANDS *netrw-explore-cmds* *netrw-browse-cmds* {{{2 - :NetrwClean[!] ...........................................|netrw-clean| - :NetrwSettings ...........................................|netrw-settings| - :Explore[!] [dir] Explore directory of current file......|netrw-explore| - :Hexplore[!] [dir] Horizontal Split & Explore.............|netrw-explore| - :Nexplore[!] [dir] Vertical Split & Explore...............|netrw-explore| - :Pexplore[!] [dir] Vertical Split & Explore...............|netrw-explore| - :Rexplore Return to Explorer.....................|netrw-explore| - :Sexplore[!] [dir] Split & Explore directory .............|netrw-explore| - :Texplore[!] [dir] Tab & Explore..........................|netrw-explore| - :Vexplore[!] [dir] Vertical Split & Explore...............|netrw-explore| - -BOOKMARKING A DIRECTORY *netrw-mb* *netrw-bookmark* *netrw-bookmarks* {{{2 -One may easily "bookmark" a directory by using > - - {cnt}mb -< -Any count may be used. One may use viminfo's "!" option to retain bookmarks -between vim sessions. See |netrw-gb| for how to return to a bookmark and -|netrw-qb| for how to list them. - - -BROWSING *netrw-cr* {{{2 - -Browsing is simple: move the cursor onto a file or directory of interest. -Hitting the <cr> (the return key) will select the file or directory. -Directories will themselves be listed, and files will be opened using the -protocol given in the original read request. - - CAVEAT: There are four forms of listing (see |netrw-i|). Netrw assumes that - two or more spaces delimit filenames and directory names for the long and - wide listing formats. Thus, if your filename or directory name has two or - more sequential spaces embedded in it, or any trailing spaces, then you'll - need to use the "thin" format to select it. - -The |g:netrw_browse_split| option, which is zero by default, may be used to -cause the opening of files to be done in a new window or tab instead of the -default. When the option is one or two, the splitting will be taken -horizontally or vertically, respectively. When the option is set to three, a -<cr> will cause the file to appear in a new tab. - - -When using the gui (gvim) one may select a file by pressing the <leftmouse> -button. In addtion, if - - *|g:netrw_retmap| == 1 AND (its default value is 0) - * in a netrw-selected file, AND - * the user doesn't already have a <2-leftmouse> mapping defined before - netrw is loaded - -then a doubly-clicked leftmouse button will return to the netrw browser -window. - -Netrw attempts to speed up browsing, especially for remote browsing where one -may have to enter passwords, by keeping and re-using previously obtained -directory listing buffers. The |g:netrw_fastbrowse| variable is used to -control this behavior; one may have slow browsing (no buffer re-use), medium -speed browsing (re-use directory buffer listings only for remote directories), -and fast browsing (re-use directory buffer listings as often as possible). -The price for such re-use is that when changes are made (such as new files -are introduced into a directory), the listing may become out-of-date. One may -always refresh directory listing buffers by pressing ctrl-L (see -|netrw-ctrl-l|). - - -Related topics: |netrw-o| |netrw-p| |netrw-P| |netrw-t| |netrw-v| -Associated setting variables: |g:netrw_browse_split| |g:netrw_fastbrowse| - |g:netrw_ftp_list_cmd| |g:netrw_ftp_sizelist_cmd| - |g:netrw_ftp_timelist_cmd| |g:netrw_ssh_cmd| - |g:netrw_ssh_browse_reject| |g:netrw_use_noswf| - - -BROWSING WITH A HORIZONTALLY SPLIT WINDOW *netrw-o* *netrw-horiz* {{{2 - -Normally one enters a file or directory using the <cr>. However, the "o" map -allows one to open a new window to hold the new directory listing or file. A -horizontal split is used. (for vertical splitting, see |netrw-v|) - -Normally, the o key splits the window horizontally with the new window and -cursor at the top. To change to splitting the window horizontally with the -new window and cursor at the bottom, have - - let g:netrw_alto = 1 - -in your <.vimrc>. (also see |netrw-t| |netrw-v|) - -There is only one tree listing buffer; using "o" on a displayed subdirectory -will split the screen, but the same buffer will be shown twice. - -Associated setting variables: |g:netrw_alto| |g:netrw_winsize| - - -BROWSING WITH A NEW TAB *netrw-t* {{{2 - -Normally one enters a file or directory using the <cr>. The "t" map -allows one to open a new window hold the new directory listing or file in a -new tab. (also see: |netrw-o| |netrw-v|) - - -BROWSING WITH A VERTICALLY SPLIT WINDOW *netrw-v* {{{2 - -Normally one enters a file or directory using the <cr>. However, the "v" map -allows one to open a new window to hold the new directory listing or file. A -vertical split is used. (for horizontal splitting, see |netrw-o|) - -Normally, the v key splits the window vertically with the new window and -cursor at the left. To change to splitting the window vertically with the new -window and cursor at the right, have - - let g:netrw_altv = 1 - -in your <.vimrc>. (also see: |netrw-o| |netrw-t|) - -There is only one tree listing buffer; using "v" on a displayed subdirectory -will split the screen, but the same buffer will be shown twice. - -Associated setting variable: |g:netrw_altv| |g:netrw_winsize| - -CHANGE LISTING STYLE *netrw-i* {{{2 - -The "i" map cycles between the thin, long, wide, and tree listing formats. - -The short listing format gives just the files' and directories' names. - -The long listing is either based on the "ls" command via ssh for remote -directories or displays the filename, file size (in bytes), and the time and -date of last modification for local directories. With the long listing -format, netrw is not able to recognize filenames which have trailing spaces. -Use the thin listing format for such files. - -The wide listing format uses two or more contiguous spaces to delineate -filenames; when using that format, netrw won't be able to recognize or use -filenames which have two or more contiguous spaces embedded in the name or any -trailing spaces. The thin listing format will, however, work with such files. -This listing format is the most compact. - -The tree listing format has a top directory followed by files and directories -preceded by a "|". One may open and close directories by pressing the <cr> -key while atop the directory name. There is only one tree listing buffer; -hence, using "v" or "o" on a subdirectory will only show the same buffer, -twice. - -Associated setting variables: |g:netrw_liststyle| |g:netrw_maxfilenamelen| - |g:netrw_timefmt| |g:netrw_list_cmd| - - -CHANGING TO A BOOKMARKED DIRECTORY *netrw-gb* {{{2 - -To change directory back to a bookmarked directory, use - - {cnt}gb - -Any count may be used to reference any of the bookmarks. See |netrw-mb| on -how to bookmark a directory and |netrw-qb| on how to list bookmarks. - - -CHANGING TO A PREDECESSOR DIRECTORY *netrw-u* *netrw-updir* {{{2 - -Every time you change to a new directory (new for the current session), -netrw will save the directory in a recently-visited directory history -list (unless g:netrw_dirhistmax is zero; by default, it's ten). With the -"u" map, one can change to an earlier directory (predecessor). To do -the opposite, see |netrw-U|. - - -CHANGING TO A SUCCESSOR DIRECTORY *netrw-U* *netrw-downdir* {{{2 - -With the "U" map, one can change to a later directory (successor). -This map is the opposite of the "u" map. (see |netrw-u|) Use the -q map to list both the bookmarks and history. (see |netrw-qb|) - - -NETRW CLEAN *netrw-clean* *:NetrwClean* - -With :NetrwClean one may easily remove netrw from one's home directory; -more precisely, from the first directory on your |'runtimepath'|. - -With :NetrwClean!, netrw will remove netrw from all directories on your -|'runtimepath'|. - -With either form of the command, netrw will first ask for confirmation -that the removal is in fact what you want to do. If netrw doesn't have -permission to remove a file, it will issue an error message. - - *netrw-gx* -CUSTOMIZING BROWSING WITH A USER FUNCTION *netrw-x* *netrw-handler* {{{2 - (also see |netrw_filehandler|) - -Certain files, such as html, gif, jpeg, (word/office) doc, etc, files, are -best seen with a special handler (ie. a tool provided with your computer). -Netrw allows one to invoke such special handlers by: > - - * when Exploring, hit the "x" key - * when editing, hit gx with the cursor atop the special filename -< (not available if the |g:netrw_nogx| variable exists) - -Netrw determines which special handler by the following method: - - * if |g:netrw_browsex_viewer| exists, then it will be used to attempt to - view files. Examples of useful settings (place into your <.vimrc>): > - - :let g:netrw_browsex_viewer= "kfmclient exec" -< or > - :let g:netrw_browsex_viewer= "gnome-open" -< - If g:netrw_browsex_viewer == '-', then netrwFileHandler() will be - invoked first (see |netrw_filehandler|). - - * for Windows 32 or 64, the url and FileProtocolHandler dlls are used. - * for Gnome (with gnome-open): gnome-open is used. - * for KDE (with kfmclient) : kfmclient is used. - * for Mac OS X : open is used. - * otherwise the netrwFileHandler plugin is used. - -The file's suffix is used by these various approaches to determine an -appropriate application to use to "handle" these files. Such things as -OpenOffice (*.sfx), visualization (*.jpg, *.gif, etc), and PostScript (*.ps, -*.eps) can be handled. - - *netrw_filehandler* - -The "x" map applies a function to a file, based on its extension. Of course, -the handler function must exist for it to be called! -> - Ex. mypgm.html x -> - NFH_html("scp://user@host/some/path/mypgm.html") -< -Users may write their own netrw File Handler functions to support more -suffixes with special handling. See <plugin/netrwFileHandlers.vim> for -examples on how to make file handler functions. As an example: > - - " NFH_suffix(filename) - fun! NFH_suffix(filename) - ..do something special with filename.. - endfun -< -These functions need to be defined in some file in your .vim/plugin -(vimfiles\plugin) directory. Vim's function names may not have punctuation -characters (except for the underscore) in them. To support suffices that -contain such characters, netrw will first convert the suffix using the -following table: > - - @ -> AT ! -> EXCLAMATION % -> PERCENT - : -> COLON = -> EQUAL ? -> QUESTION - , -> COMMA - -> MINUS ; -> SEMICOLON - $ -> DOLLAR + -> PLUS ~ -> TILDE -< -So, for example: > - - file.rcs,v -> NFH_rcsCOMMAv() -< -If more such translations are necessary, please send me email: > - NdrOchip at ScampbellPfamily.AbizM - NOSPAM -with a request. - -Associated setting variable: |g:netrw_browsex_viewer| - - *netrw-curdir* -DELETING FILES OR DIRECTORIES *netrw-delete* *netrw-D* *netrw-del* {{{2 - -If files have not been marked with |netrw-mf|: (local marked file list) - - Deleting/removing files and directories involves moving the cursor to the - file/directory to be deleted and pressing "D". Directories must be empty - first before they can be successfully removed. If the directory is a - softlink to a directory, then netrw will make two requests to remove the - directory before succeeding. Netrw will ask for confirmation before doing - the removal(s). You may select a range of lines with the "V" command - (visual selection), and then pressing "D". - -If files have been marked with |netrw-mf|: (local marked file list) - - Marked files (and empty directories) will be deleted; again, you'll be - asked to confirm the deletion before it actually takes place. - -The |g:netrw_rm_cmd|, |g:netrw_rmf_cmd|, and |g:netrw_rmdir_cmd| variables are -used to control the attempts to remove files and directories. The -g:netrw_rm_cmd is used with files, and its default value is: - - g:netrw_rm_cmd: ssh HOSTNAME rm - -The g:netrw_rmdir_cmd variable is used to support the removal of directories. -Its default value is: - - g:netrw_rmdir_cmd: ssh HOSTNAME rmdir - -If removing a directory fails with g:netrw_rmdir_cmd, netrw then will attempt -to remove it again using the g:netrw_rmf_cmd variable. Its default value is: - - g:netrw_rmf_cmd: ssh HOSTNAME rm -f - -Associated setting variable: |g:netrw_local_rmdir| |g:netrw_rm_cmd| - |g:netrw_rmdir_cmd| |g:netrw_ssh_cmd| - - -*netrw-explore* *netrw-hexplore* *netrw-nexplore* *netrw-pexplore* -*netrw-rexplore* *netrw-sexplore* *netrw-texplore* *netrw-vexplore* -DIRECTORY EXPLORATION COMMANDS {{{2 - - :Explore[!] [dir]... Explore directory of current file *:Explore* - :Hexplore[!] [dir]... Horizontal Split & Explore *:Hexplore* - :Rexplore ... Return to Explorer *:Rexplore* - :Sexplore[!] [dir]... Split&Explore directory of current file *:Sexplore* - :Texplore [dir]... Tab & Explore *:Texplore* - :Vexplore[!] [dir]... Vertical Split & Explore *:Vexplore* - - Used with :Explore **/pattern : (also see |netrw-starstar|) - :Nexplore............. go to next matching file *:Nexplore* - :Pexplore............. go to previous matching file *:Pexplore* - -:Explore will open the local-directory browser on the current file's - directory (or on directory [dir] if specified). The window will be - split only if the file has been modified, otherwise the browsing - window will take over that window. Normally the splitting is taken - horizontally. -:Explore! is like :Explore, but will use vertical splitting. -:Sexplore will always split the window before invoking the local-directory - browser. As with Explore, the splitting is normally done - horizontally. -:Sexplore! [dir] is like :Sexplore, but the splitting will be done vertically. -:Hexplore [dir] does an :Explore with |:belowright| horizontal splitting. -:Hexplore! [dir] does an :Explore with |:aboveleft| horizontal splitting. -:Vexplore [dir] does an :Explore with |:leftabove| vertical splitting. -:Vexplore! [dir] does an :Explore with |:rightbelow| vertical splitting. -:Texplore [dir] does a tabnew before generating the browser window - -By default, these commands use the current file's directory. However, one -may explicitly provide a directory (path) to use. - -The |g:netrw_winsize| variable also is used, if specified by the user, to -size Hexplore and Vexplore windows. - -:Rexplore This command is a little different from the others. When one - edits a file, for example by pressing <cr> when atop a file in - a netrw browser window, :Rexplore will return the display to - that of the last netrw browser window. Its a command version - of <2-leftmouse> (which is only available under gvim and - cooperative terms). - - -*netrw-star* *netrw-starpat* *netrw-starstar* *netrw-starstarpat* -EXPLORING WITH STARS AND PATTERNS - -When Explore, Sexplore, Hexplore, or Vexplore are used with one of the -following four styles, Explore generates a list of files which satisfy -the request. > - - */filepat files in current directory which satisfy filepat - **/filepat files in current directory or below which satisfy the - file pattern - *//pattern files in the current directory which contain the - pattern (vimgrep is used) - **//pattern files in the current directory or below which contain - the pattern (vimgrep is used) -< -The cursor will be placed on the first file in the list. One may then -continue to go to subsequent files on that list via |:Nexplore| or to -preceding files on that list with |:Pexplore|. Explore will update the -directory and place the cursor appropriately. - -A plain > - :Explore -will clear the explore list. - -If your console or gui produces recognizable shift-up or shift-down sequences, -then you'll likely find using shift-downarrow and shift-uparrow convenient. -They're mapped by netrw: - - <s-down> == Nexplore, and - <s-up> == Pexplore. - -As an example, consider -> - :Explore */*.c - :Nexplore - :Nexplore - :Pexplore -< -The status line will show, on the right hand side of the status line, a -message like "Match 3 of 20". - -Associated setting variables: |g:netrw_keepdir| |g:netrw_browse_split| - |g:netrw_fastbrowse| |g:netrw_ftp_browse_reject| - |g:netrw_ftp_list_cmd| |g:netrw_ftp_sizelist_cmd| - |g:netrw_ftp_timelist_cmd| |g:netrw_list_cmd| - |g:netrw_liststyle| - - -DISPLAYING INFORMATION ABOUT FILE *netrw-qf* {{{2 - -With the cursor atop a filename, pressing "qf" will reveal the file's size -and last modification timestamp. Currently this capability is only available -for local files. - - -EDIT FILE OR DIRECTORY HIDING LIST *netrw-ctrl-h* *netrw-edithide* {{{2 - -The "<ctrl-h>" map brings up a requestor allowing the user to change the -file/directory hiding list. The hiding list consists of one or more patterns -delimited by commas. Files and/or directories satisfying these patterns will -either be hidden (ie. not shown) or be the only ones displayed (see -|netrw-a|). - -Associated setting variable: |g:netrw_hide| - - -EDITING THE SORTING SEQUENCE *netrw-S* *netrw-sortsequence* {{{2 - -When "Sorted by" is name, one may specify priority via the sorting sequence -(g:netrw_sort_sequence). The sorting sequence typically prioritizes the -name-listing by suffix, although any pattern will do. Patterns are delimited -by commas. The default sorting sequence is (all one line): -> - '[\/]$,\.[a-np-z]$,\.h$,\.c$,\.cpp$,*,\.o$,\.obj$,\.info$, - \.swp$,\.bak$,\~$' -< -The lone * is where all filenames not covered by one of the other patterns -will end up. One may change the sorting sequence by modifying the -g:netrw_sort_sequence variable (either manually or in your <.vimrc>) or by -using the "S" map. - -Related topics: |g:netrw-s| |g:netrw-S| -Associated setting variable: |g:netrw_sort_sequence| - - -GOING UP *netrw--* {{{2 - -To go up a directory, press "-" or press the <cr> when atop the ../ directory -entry in the listing. - -Netrw will use the command in |g:netrw_list_cmd| to perform the directory -listing operation after changing HOSTNAME to the host specified by the -user-provided url. By default netrw provides the command as: - - ssh HOSTNAME ls -FLa - -where the HOSTNAME becomes the [user@]hostname as requested by the attempt to -read. Naturally, the user may override this command with whatever is -preferred. The NetList function which implements remote browsing -expects that directories will be flagged by a trailing slash. - - -HIDING FILES OR DIRECTORIES *netrw-a* *netrw-hiding* {{{2 - -Netrw's browsing facility allows one to use the hiding list in one of three -ways: ignore it, hide files which match, and show only those files which -match. - -If no files have been marked via |netrw-mf|: - -The "a" map allows the user to cycle through the three hiding modes. - -The |g:netrw_list_hide| variable holds a comma delimited list of patterns -based on regular expressions (ex. ^.*\.obj$,^\.) which specify the hiding list. -(also see |netrw-ctrl-h|) To set the hiding list, use the <c-h> map. As an -example, to hide files which begin with a ".", one may use the <c-h> map to -set the hiding list to '^\..*' (or one may put let g:netrw_list_hide= '^\..*' -in one's <.vimrc>). One may then use the "a" key to show all files, hide -matching files, or to show only the matching files. - - Example: \.[ch]$ - This hiding list command will hide/show all *.c and *.h files. - - Example: \.c$,\.h$ - This hiding list command will also hide/show all *.c and *.h - files. - -Don't forget to use the "a" map to select the mode (normal/hiding/show) you -want! - -If files have been marked using |netrw-mf|, then this command will: - - if showing all files or non-hidden files: - modify the g:netrw_list_hide list by appending the marked files to it - and showing only non-hidden files. - - else if showing hidden files only: - modify the g:netrw_list_hide list by removing the marked files from it - and showing only non-hidden files. - endif - - *netrw-gh* -As a quick shortcut, one may press > - gh -to toggle between hiding files which begin with a period (dot) or not. - -Associated setting variable: |g:netrw_list_hide| - - *netrw-ctrl_h* -IMPROVING BROWSING *netrw-listhack* *netrw-ssh-hack* {{{2 - -Especially with the remote directory browser, constantly entering the password -is tedious. - -For Linux/Unix systems, the book "Linux Server Hacks - 100 industrial strength -tips & tools" by Rob Flickenger (O'Reilly, ISBN 0-596-00461-3) gives a tip -for setting up no-password ssh and scp and discusses associated security -issues. It used to be available at http://hacks.oreilly.com/pub/h/66 , -but apparently that address is now being redirected to some "hackzine". -I'll attempt a summary: - - 1. Generate a public/private key pair on the ssh server: - ssh-keygen -t rsa - (saving the file in ~/.ssh/id_rsa is ok) - 2. Just hit the <CR> when asked for passphrase (twice). - 3. This creates two files: - ~/.ssh/id_rsa - ~/.ssh/id_rsa.pub - 4. On the client: - cd - mkdir .ssh - chmod 0700 .ssh - scp {serverhostname}:.ssh/id_rsa.pub . - cat id_rsa.pub >> .ssh/authorized_keys2 - -For Windows, folks on the vim mailing list have mentioned that Pageant helps -with avoiding the constant need to enter the password. - -Kingston Fung wrote about another way to avoid constantly needing to enter -passwords: - - In order to avoid the need to type in the password for scp each time, you - provide a hack in the docs to set up a non password ssh account. I found a - better way to do that: I can use a regular ssh account which uses a - password to access the material without the need to key-in the password - each time. It's good for security and convenience. I tried ssh public key - authorization + ssh-agent, implementing this, and it works! Here are two - links with instructions: - - http://www.ibm.com/developerworks/library/l-keyc2/ - http://sial.org/howto/openssh/publickey-auth/ - - -LISTING BOOKMARKS AND HISTORY *netrw-qb* *netrw-listbookmark* {{{2 - -Pressing "qb" (query bookmarks) will list the bookmarked directories and -directory traversal history (query). - -(see |netrw-mb|, |netrw-gb|, |netrw-u|, and |netrw-U|) - - -MAKING A NEW DIRECTORY *netrw-d* {{{2 - -With the "d" map one may make a new directory either remotely (which depends -on the global variable g:netrw_mkdir_cmd) or locally (which depends on the -global variable g:netrw_local_mkdir). Netrw will issue a request for the new -directory's name. A bare <CR> at that point will abort the making of the -directory. Attempts to make a local directory that already exists (as either -a file or a directory) will be detected, reported on, and ignored. - -Associated setting variable: |g:netrw_local_mkdir| |g:netrw_mkdir_cmd| - - -MAKING THE BROWSING DIRECTORY THE CURRENT DIRECTORY *netrw-c* {{{2 - -By default, |g:netrw_keepdir| is 1. This setting means that the current -directory will not track the browsing directory. - -Setting g:netrw_keepdir to 0 tells netrw to make vim's current directory to -track netrw's browsing directory. - -However, given the default setting for g:netrw_keepdir of 1 where netrw -maintains its own separate notion of the current directory, in order to make -the two directories the same, use the "c" map (just type c). That map will -set Vim's notion of the current directory to netrw's current browsing -directory. - -Associated setting variable: |g:netrw_keepdir| - - -MARKED FILES: ARBITRARY COMMAND *netrw-mx* {{{2 - (See |netrw-mf| and |netrw-mr| for how to mark files) - (uses the local marked-file list) - -Upon activation of the "mx" map, netrw will query the user for some command to -be applied to all marked files. All %s in the command will be substituted -with the name of a marked file. If no %s are in the command, then the command -will be followed by a space and a marked filename. - - -MARKED FILES: COMPRESSION AND DECOMPRESSION *netrw-mz* {{{2 - (See |netrw-mf| and |netrw-mr| for how to mark files) - (uses the local marked file list) - -If any marked files are compressed, then "mz" will decompress them. -If any marked files are decompressed, then "mz" will compress them -using the command specified by |g:netrw_compress|; by default, -that's "gzip". - -For decompression, netrw provides a |Dictionary| of suffices and their -associated decompressing utilities; see |g:netrw_decompress|. - -Associated setting variables: |g:netrw_compress| |g:netrw_decompress| - -MARKED FILES: COPYING *netrw-mc* {{{2 - (See |netrw-mf| and |netrw-mr| for how to mark files) - (Uses the global marked file list) - -Select a target directory with mt (|netrw-mt|). Then change directory, -select file(s) (see |netrw-mf|), and press "mc". - -Associated setting variable: |g:netrw_localcopycmd| |g:netrw_ssh_cmd| - -MARKED FILES: DIFF *netrw-md* {{{2 - (See |netrw-mf| and |netrw-mr| for how to mark files) - (uses the global marked file list) - -Use |vimdiff| to visualize difference between selected files (two or -three may be selected for this). Uses the global marked file list. - -MARKED FILES: EDITING *netrw-me* {{{2 - (See |netrw-mf| and |netrw-mr| for how to mark files) - (uses the global marked file list) - -This command will place the marked files on the |arglist| and commence -editing them. One may return the to explorer window with |:Rexplore|. - -MARKED FILES: HIDING AND UNHIDING BY SUFFIX *netrw-mh* {{{2 - (See |netrw-mf| and |netrw-mr| for how to mark files) - (uses the local marked file list) - -This command extracts the suffices of the marked files and toggles their -presence on the hiding list. Please note that marking the same suffix -this way multiple times will result in the suffix's presence being toggled -for each file (so an even quantity of marked files having the same suffix -is the same as not having bothered to select them at all). - -Related topics: |netrw-a| |g:netrw_list_hide| - -MARKED FILES: MOVING *netrw-mm* {{{2 - (See |netrw-mf| and |netrw-mr| for how to mark files) - (uses the global marked file list) - -Select a target directory with mT (|netrw-mt|). Then change directory, -select file(s) (see |netrw-mf|), and press "mm". - -Associated setting variable: |g:netrw_localmovecmd| |g:netrw_ssh_cmd| - -MARKED FILES: PRINTING *netrw-mp* {{{2 - (See |netrw-mf| and |netrw-mr| for how to mark files) - (uses the local marked file list) - -Netrw will apply the |:hardcopy| command to marked files. What it does -is open each file in a one-line window, execute hardcopy, then close the -one-line window. - - -MARKED FILES: SOURCING *netrw-ms* {{{2 - (See |netrw-mf| and |netrw-mr| for how to mark files) - (uses the local marked file list) - -Netrw will source the marked files (using vim's |:source| command) - - -MARKED FILES: TAGGING *netrw-mT* {{{2 - (See |netrw-mf| and |netrw-mr| for how to mark files) - (uses the global marked file list) - -The "mt" mapping will apply the command in |g:netrw_ctags| (by default, its -"ctags") to marked files. For remote browsing, in order to create a tags file -netrw will use ssh (see |g:netrw_ssh_cmd|), and so ssh must be available for -this to work on remote systems. For your local system, see |ctags| on how to -get a version. I myself use hdrtags, currently available at -http://mysite.verizon.net/astronaut/src/index.html , and have > - - let g:netrw_ctags= "hdrtag" -< -in my <.vimrc>. - -When a remote set of files are tagged, the resulting tags file is "obtained"; -ie. a copy is transferred to the local system's directory. The local tags -file is then modified so that one may use it through the network. The -modification is concerns the names of the files in the tags; each filename is -preceded by the netrw-compatible url used to obtain it. When one subsequently -uses one of the go to tag actions (|tags|), the url will be used by netrw to -edit the desired file and go to the tag. - -Associated setting variables: |g:netrw_ctags| |g:netrw_ssh_cmd| - - -MARKED FILES: SETTING THE TARGET DIRECTORY *netrw-mt* {{{2 - (See |netrw-mf| and |netrw-mr| for how to mark files) - -Set the marked file copy/move-to target (see |netrw-mc| and |netrw-mm|): - - * if the cursor is atop a file name, then the netrw window's currently - displayed directory is used for the copy/move-to target. - - * also, if the cursor is in the banner, then the netrw window's currently - displayed directory is used for the copy/move-to target. - - * however, if the cursor is atop a directory name, then that directory is - used for the copy/move-to target - -There is only one copy/move-to target per vim session; ie. the target is a -script variable (see |s:var|) and is shared between all netrw windows (in an -instance of vim). - -MARKED FILES: UNMARKING *netrw-mu* {{{2 - (See |netrw-mf| and |netrw-mr| for how to mark files) - -The "mu" mapping will unmark all currently marked files. - - -MARKING FILES *netrw-mf* {{{2 - (also see |netrw-mr|) - -One may mark files with the cursor atop a filename and then pressing "mf". -With gvim, one may also mark files with <s-leftmouse>. The following netrw -maps make use of marked files: - - |netrw-a| Hide marked files/directories - |netrw-D| Delete marked files/directories - |netrw-mc| Copy marked files to target - |netrw-md| Apply vimdiff to marked files - |netrw-me| Edit marked files - |netrw-mm| Move marked files - |netrw-mp| Print marked files - |netrw-mt| Set target for |netrw-mm| and |netrw-mc| - |netrw-mT| Generate tags using marked files - |netrw-mx| Apply shell command to marked files - |netrw-mz| Compress/Decompress marked files - |netrw-O| Obtain marked files - |netrw-R| Rename marked files - -One may unmark files one at a time the same way one marks them; ie. place -the cursor atop a marked file and press "mf". This process also works -with <s-leftmouse> using gvim. One may unmark all files by pressing -"mu" (see |netrw-mu|). - -*markfilelist* *global_markfilelist* *local_markfilelist* -All marked files are entered onto the global marked file list; there is only -one such list. In addition, every netrw buffer also has its own local marked -file list; since netrw buffers are associated with specific directories, this -means that each directory has its own local marked file list. The various -commands which operate on marked files use one or the other of the marked file -lists. - - -MARKING FILES BY REGULAR EXPRESSION *netrw-mr* {{{2 - (also see |netrw-mf|) - -One may also mark files by pressing "mr"; netrw will then issue a prompt, -"Enter regexp: ". You may then enter a regular expression such as \.c$ . -All files in the current directory will then be marked. Note that the -regular expressions are vim-style |regexp| ones, not shell ones. So -entering *.c probably isn't what you want! - - -NETRW BROWSER VARIABLES *netrw-browser-options* *netrw-browser-var* {{{2 - -(if you're interestd in the netrw file transfer settings, see |netrw-options|) - -The <netrw.vim> browser provides settings in the form of variables which -you may modify; by placing these settings in your <.vimrc>, you may customize -your browsing preferences. (see also: |netrw-settings|) -> - --- ----------- - Var Explanation - --- ----------- -< *g:netrw_alto* change from above splitting to below splitting - by setting this variable (see |netrw-o|) - default: =&sb (see |'sb'|) - - *g:netrw_altv* change from left splitting to right splitting - by setting this variable (see |netrw-v|) - default: =&spr (see |'spr'|) - - *g:netrw_browse_split* when browsing, <cr> will open the file by: - =0: re-using the same window - =1: horizontally splitting the window first - =2: vertically splitting the window first - =3: open file in new tab - =4: act like "P" (ie. open previous window) - - *g:netrw_browsex_viewer* specify user's preference for a viewer: > - "kfmclient exec" - "gnome-open" -< If > - "-" -< is used, then netrwFileHandler() will look for - a script/function to handle the given - extension. (see |netrw_filehandler|). - - *g:netrw_cd_escape* ="[]#*$%'\" ?`!&();<>\\" - This option is used to escape directory names - before changing directory to them. - - *g:netrw_compress* ="gzip" - Will compress marked files with this - command - - *g:netrw_decompress* = { ".gz" : "gunzip" , - ".bz2" : "bunzip2" , - ".zip" : "unzip" , - ".tar" : "tar -xf"} - A dictionary mapping suffices to - decompression programs. - - *g:netrw_fastbrowse* =0: slow speed browsing, never re-use - directory listings; always obtain - directory listings. - =1: medium speed browsing, re-use directory - listings only when remote browsing. - (default value) - =2: fast browsing, only obtains directory - listings when the directory hasn't been - seen before (or |netrw-ctrl-l| is used). - Fast browsing retains old directory listing - buffers so that they don't need to be - re-acquired. This feature is especially - important for remote browsing. However, if - a file is introduced or deleted into or from - such directories, the old directory buffer - becomes out-of-date. One may always refresh - such a directory listing with |netrw-ctrl-l|. - This option gives the choice of the trade-off - between accuracy and speed to the user. - - *g:netrw_fname_escape* =' ?&;%' - Used on filenames before remote reading/writing - - *g:netrw_ftp_browse_reject* ftp can produce a number of errors and warnings - that can show up as "directories" and "files" - in the listing. This pattern is used to - remove such embedded messages. By default its - value is: - '^total\s\+\d\+$\| - ^Trying\s\+\d\+.*$\| - ^KERBEROS_V\d rejected\| - ^Security extensions not\| - No such file\| - : connect to address [0-9a-fA-F:]* - : No route to host$' - - *g:netrw_ftp_list_cmd* options for passing along to ftp for directory - listing. Defaults: - unix or g:netrw_cygwin set: : "ls -lF" - otherwise "dir" - - - *g:netrw_ftp_sizelist_cmd* options for passing along to ftp for directory - listing, sorted by size of file. - Defaults: - unix or g:netrw_cygwin set: : "ls -slF" - otherwise "dir" - - *g:netrw_ftp_timelist_cmd* options for passing along to ftp for directory - listing, sorted by time of last modification. - Defaults: - unix or g:netrw_cygwin set: : "ls -tlF" - otherwise "dir" - - *g:netrw_glob_escape* ='[]*?`{~$' - These characters in directory names are - escaped before applying glob() - - *g:netrw_hide* if true, the hiding list is used - default: =0 - - *g:netrw_keepdir* =1 (default) keep current directory immune from - the browsing directory. - =0 keep the current directory the same as the - browsing directory. - The current browsing directory is contained in - b:netrw_curdir (also see |netrw-c|) - - *g:netrw_list_cmd* command for listing remote directories - default: (if ssh is executable) - "ssh HOSTNAME ls -FLa" - - *g:netrw_liststyle* Set the default listing style: - = 0: thin listing (one file per line) - = 1: long listing (one file per line with time - stamp information and file size) - = 2: wide listing (multiple files in columns) - = 3: tree style listing - *g:netrw_list_hide* comma separated pattern list for hiding files - Patterns are regular expressions (see |regexp|) - Example: let g:netrw_list_hide= '.*\.swp$' - default: "" - - *g:netrw_localcopycmd* ="cp" Linux/Unix/MacOS/Cygwin - ="copy" Windows - Copies marked files (|netrw-mf|) to target - directory (|netrw-mt|, |netrw-mc|) - - *g:netrw_localmovecmd* ="mv" Linux/Unix/MacOS/Cygwin - ="move" Windows - Moves marked files (|netrw-mf|) to target - directory (|netrw-mt|, |netrw-mm|) - - *g:netrw_local_mkdir* command for making a local directory - default: "mkdir" - - *g:netrw_local_rmdir* remove directory command (rmdir) - default: "rmdir" - - *g:netrw_maxfilenamelen* =32 by default, selected so as to make long - listings fit on 80 column displays. - If your screen is wider, and you have file - or directory names longer than 32 bytes, - you may set this option to keep listings - columnar. - - *g:netrw_mkdir_cmd* command for making a remote directory - default: "ssh USEPORT HOSTNAME mkdir" - - *g:netrw_retmap* if it exists and is set to one, then - <2-leftmouse> will be mapped for easy - return to the netrw browser window. - (example: click once to select and open - a file, double-click to return) - default: =0 - - *g:netrw_rm_cmd* command for removing files - default: "ssh USEPORT HOSTNAME rm" - - *g:netrw_rmdir_cmd* command for removing directories - default: "ssh USEPORT HOSTNAME rmdir" - - *g:netrw_rmf_cmd* command for removing softlinks - default: "ssh USEPORT HOSTNAME rm -f" - - *g:netrw_sort_by* sort by "name", "time", or "size" - default: "name" - - *g:netrw_sort_direction* sorting direction: "normal" or "reverse" - default: "normal" - - *g:netrw_sort_sequence* when sorting by name, first sort by the - comma-separated pattern sequence - default: '[\/]$,*,\.bak$,\.o$,\.h$, - \.info$,\.swp$,\.obj$' - - *g:netrw_special_syntax* If true, then certain files will be shown - in special syntax in the browser: - - netrwBak : *.bak - netrwCompress: *.gz *.bz2 *.Z *.zip - netrwData : *.dat - netrwHdr : *.h - netrwLib : *.a *.so *.lib *.dll - netrwMakefile: [mM]akefile *.mak - netrwObj : *.o *.obj - netrwTags : tags ANmenu ANtags - netrwTilde : *~ - netrwTmp : tmp* *tmp - - These syntax highlighting groups are linked - to Folded or DiffChange by default - (see |hl-Folded| and |hl-DiffChange|), but - one may put lines like > - hi link netrwCompress Visual -< into one's <.vimrc> to use one's own - preferences. - - *g:netrw_ssh_cmd* One may specify an executable command - to use instead of ssh for remote actions - such as listing, file removal, etc. - default: ssh - - *g:netrw_ssh_browse_reject* ssh can sometimes produce unwanted lines, - messages, banners, and whatnot that one doesn't - want masquerading as "directories" and "files". - Use this pattern to remove such embedded - messages. By default its value is: - '^total\s\+\d\+$' - - - *g:netrw_tmpfile_escape* =' &;' - escape() is applied to all temporary files - to escape these characters. - - *g:netrw_timefmt* specify format string to vim's strftime(). - The default, "%c", is "the preferred date - and time representation for the current - locale" according to my manpage entry for - strftime(); however, not all are satisfied - with it. Some alternatives: - "%a %d %b %Y %T", - " %a %Y-%m-%d %I-%M-%S %p" - default: "%c" - - *g:netrw_use_noswf* netrw normally avoids writing swapfiles - for browser buffers. However, under some - systems this apparently is causing nasty - ml_get errors to appear; if you're getting - ml_get errors, try putting - let g:netrw_use_noswf= 0 - in your .vimrc. - - *g:netrw_winsize* specify initial size of new windows made with - "o" (see |netrw-o|), "v" (see |netrw-v|), - |:Hexplore| or |:Vexplore|. - default: "" - - *g:NetrwTopLvlMenu* This variable specifies the top level - menu name; by default, it's "Netrw.". If - you wish to change this, do so in your - .vimrc. - -NETRW BROWSING AND OPTION INCOMPATIBILITIES *netrw-incompatible* {{{2 - -Netrw has been designed to handle user options by saving them, setting the -options to something that's compatible with netrw's needs, and then restoring -them. However, the autochdir option: > - :set acd -is problematical. Autochdir sets the current directory to that containing the -file you edit; this apparently also applies to directories. In other words, -autochdir sets the current directory to that containing the "file" (even if -that "file" is itself a directory). - -NETRW SETTINGS *netrw-settings* {{{2 - -With the NetrwSettings.vim plugin, > - :NetrwSettings -will bring up a window with the many variables that netrw uses for its -settings. You may change any of their values; when you save the file, the -settings therein will be used. One may also press "?" on any of the lines for -help on what each of the variables do. - -(also see: |netrw-browser-var| |netrw-protocol| |netrw-var| |netrw-variables|) - - -============================================================================== -OBTAINING A FILE *netrw-O* {{{2 - -If there are no marked files: - - When browsing a remote directory, one may obtain a file under the cursor - (ie. get a copy on your local machine, but not edit it) by pressing the O - key. - -If there are marked files: - - The marked files will be obtained (ie. a copy will be transferred to your - local machine, but not set up for editing). - -Only ftp and scp are supported for this operation (but since these two are -available for browsing, that shouldn't be a problem). The status bar will -then show, on its right hand side, a message like "Obtaining filename". The -statusline will be restored after the transfer is complete. - -Netrw can also "obtain" a file using the local browser. Netrw's display -of a directory is not necessarily the same as Vim's "current directory", -unless |g:netrw_keepdir| is set to 0 in the user's <.vimrc>. One may select -a file using the local browser (by putting the cursor on it) and pressing -"O" will then "obtain" the file; ie. copy it to Vim's current directory. - -Related topics: - * To see what the current directory is, use |:pwd| - * To make the currently browsed directory the current directory, see |netrw-c| - * To automatically make the currently browsed directory the current - directory, see |g:netrw_keepdir|. - - -PREVIEW WINDOW *netrw-p* *netrw-preview* {{{2 - -One may use a preview window by using the "p" key when the cursor is atop the -desired filename to be previewed. The display will then split to show both -the browser (where the cursor will remain) and the file (see |:pedit|). -By default, the split will be taken horizontally; one may use vertical -splitting if one has set |g:netrw_preview| first. - - -PREVIOUS WINDOW *netrw-P* *netrw-prvwin* {{{2 - -To edit a file or directory in the previously used window (see :he |CTRL-W_P|), -press a "P". If there's only one window, then the one window will be -horizontally split (above/below splitting is controlled by |g:netrw_alto|, -and its initial size is controlled by |g:netrw_winsize|). - -If there's more than one window, the previous window will be re-used on -the selected file/directory. If the previous window's associated buffer -has been modified, and there's only one window with that buffer, then -the user will be asked if s/he wishes to save the buffer first (yes, -no, or cancel). - - -REFRESHING THE LISTING *netrw-ctrl-l* *netrw-ctrl_l* {{{2 - -To refresh either a local or remote directory listing, press ctrl-l (<c-l>) or -hit the <cr> when atop the ./ directory entry in the listing. One may also -refresh a local directory by using ":e .". - - -RENAMING FILES OR DIRECTORIES *netrw-move* *netrw-rename* *netrw-R* {{{2 - -If there are no marked files: (see |netrw-mf|) - - Renaming/moving files and directories involves moving the cursor to the - file/directory to be moved (renamed) and pressing "R". You will then be - queried for where you want the file/directory to be moved. You may select - a range of lines with the "V" command (visual selection), and then - pressing "R". - -If there are marked files: (see |netrw-mf|) - - Marked files will be renamed (moved). You will be queried as above in - order to specify where you want the file/directory to be moved. - -The g:netrw_rename_cmd variable is used to implement renaming. By default its -value is: - - ssh HOSTNAME mv - -One may rename a block of files and directories by selecting them with -the V (|linewise-visual|). - - -REVERSING SORTING ORDER *netrw-r* *netrw-reverse* {{{2 - -One may toggle between normal and reverse sorting order by pressing the -"r" key. - -Related topics: |g:netrw-s| -Associated setting variable: |g:netrw_sort_direction| - - -SELECTING SORTING STYLE *netrw-s* *netrw-sort* {{{2 - -One may select the sorting style by name, time, or (file) size. The "s" map -allows one to circulate amongst the three choices; the directory listing will -automatically be refreshed to reflect the selected style. - -Related topics: |g:netrw-r| |g:netrw-S| -Associated setting variables: |g:netrw_sort_by| |g:netrw_sort_sequence| - - -10. Problems and Fixes *netrw-problems* {{{1 - - (This section is likely to grow as I get feedback) - (also see |netrw-debug|) - *netrw-p1* - P1. I use windows 95, and my ftp dumps four blank lines at the - end of every read. - - See |netrw-fixup|, and put the following into your - <.vimrc> file: - - let g:netrw_win95ftp= 1 - - *netrw-p2* - P2. I use Windows, and my network browsing with ftp doesn't sort by - time or size! -or- The remote system is a Windows server; why - don't I get sorts by time or size? - - Windows' ftp has a minimal support for ls (ie. it doesn't - accept sorting options). It doesn't support the -F which - gives an explanatory character (ABC/ for "ABC is a directory"). - Netrw then uses "dir" to get both its short and long listings. - If you think your ftp does support a full-up ls, put the - following into your <.vimrc>: > - - let g:netrw_ftp_list_cmd = "ls -lF" - let g:netrw_ftp_timelist_cmd= "ls -tlF" - let g:netrw_ftp_sizelist_cmd= "ls -slF" -< - Alternatively, if you have cygwin on your Windows box, put - into your <.vimrc>: > - - let g:netrw_cygwin= 1 -< - This problem also occurs when the remote system is Windows. - In this situation, the various g:netrw_ftp_[time|size]list_cmds - are as shown above, but the remote system will not correctly - modify its listing behavior. - - - *netrw-p3* - P3. I tried rcp://user@host/ (or protocol other than ftp) and netrw - used ssh! That wasn't what I asked for... - - Netrw has two methods for browsing remote directories: ssh - and ftp. Unless you specify ftp specifically, ssh is used. - When it comes time to do download a file (not just a directory - listing), netrw will use the given protocol to do so. - - *netrw-p4* - P4. I would like long listings to be the default. - - Put the following statement into your |.vimrc|: > - - let g:netrw_liststyle= 1 -< - Check out |netrw-browser-var| for more customizations that - you can set. - - *netrw-p5* - P5. My times come up oddly in local browsing - - Does your system's strftime() accept the "%c" to yield dates - such as "Sun Apr 27 11:49:23 1997"? If not, do a "man strftime" - and find out what option should be used. Then put it into - your |.vimrc|: > - - let g:netrw_timefmt= "%X" (where X is the option) -< - *netrw-p6* - P6. I want my current directory to track my browsing. - How do I do that? - - Put the following line in your |.vimrc|: -> - let g:netrw_keepdir= 0 -< - *netrw-p7* - P7. I use Chinese (or other non-ascii) characters in my filenames, and - netrw (Explore, Sexplore, Hexplore, etc) doesn't display them! - - (taken from an answer provided by Wu Yongwei on the vim - mailing list) - I now see the problem. You code page is not 936, right? Vim - seems only able to open files with names that are valid in the - current code page, as are many other applications that do not - use the Unicode version of Windows APIs. This is an OS-related - issue. You should not have such problems when the system - locale uses UTF-8, such as modern Linux distros. - - (...it is one more reason to recommend that people use utf-8!) - - *netrw-p8* - P8. I'm getting "ssh is not executable on your system" -- what do I - do? - - (Dudley Fox) Most people I know use putty for windows ssh. It - is a free ssh/telnet application. You can read more about it - here: - - http://www.chiark.greenend.org.uk/~sgtatham/putty/ Also: - - (Marlin Unruh) This program also works for me. It's a single - executable, so he/she can copy it into the Windows\System32 - folder and create a shortcut to it. - - (Dudley Fox) You might also wish to consider plink, as it - sounds most similar to what you are looking for. plink is an - application in the putty suite. - - http://the.earth.li/~sgtatham/putty/0.58/htmldoc/Chapter7.html#plink - - (Vissale Neang) Maybe you can try OpenSSH for windows, which - can be obtained from: - - http://sshwindows.sourceforge.net/ - - It doesn't need the full Cygwin package. - - (Antoine Mechelynck) For individual Unix-like programs needed - for work in a native-Windows environment, I recommend getting - them from the GnuWin32 project on sourceforge if it has them: - - http://gnuwin32.sourceforge.net/ - - Unlike Cygwin, which sets up a Unix-like virtual machine on - top of Windows, GnuWin32 is a rewrite of Unix utilities with - Windows system calls, and its programs works quite well in the - cmd.exe "Dos box". - - (dave) Download WinSCP and use that to connect to the server. - In Preferences > Editors, set gvim as your editor: - - - Click "Add..." - - Set External Editor (adjust path as needed, include - the quotes and !.! at the end): - "c:\Program Files\Vim\vim70\gvim.exe" !.! - - Check that the filetype in the box below is - {asterisk}.{asterisk} (all files), or whatever types - you want (cec: change {asterisk} to * ; I had to - write it that way because otherwise the helptags - system thinks it's a tag) - - Make sure it's at the top of the listbox (click it, - then click "Up" if it's not) - If using the Norton Commander style, you just have to hit <F4> - to edit a file in a local copy of gvim. - - (Vit Gottwald) How to generate public/private key and save - public key it on server: > - http://www.tartarus.org/~simon/puttydoc/Chapter8.html#pubkey-gettingready - 8.3 Getting ready for public key authentication -< - How to use a private key with 'pscp': > - - http://www.tartarus.org/~simon/puttydoc/Chapter5.html - 5.2.4 Using public key authentication with PSCP -< - (Ben Schmidt) I find the ssh included with cwRsync is - brilliant, and install cwRsync or cwRsyncServer on most - Windows systems I come across these days. I guess COPSSH, - packed by the same person, is probably even better for use as - just ssh on Windows, and probably includes sftp, etc. which I - suspect the cwRsync doesn't, though it might - - (cec) To make proper use of these suggestions above, you will - need to modify the following user-settable variables in your - .vimrc: - - |g:netrw_ssh_cmd| |g:netrw_list_cmd| |g:netrw_mkdir_cmd| - |g:netrw_rm_cmd| |g:netrw_rmdir_cmd| |g:netrw_rmf_cmd| - - The first one (|g:netrw_ssh_cmd|) is the most important; most - of the others will use the string in g:netrw_ssh_cmd by - default. - *netrw-p9* *netrw-ml_get* - P9. I'm browsing, changing directory, and bang! ml_get errors - appear and I have to kill vim. Any way around this? - - Normally netrw attempts to avoid writing swapfiles for - its temporary directory buffers. However, on some systems - this attempt appears to be causing ml_get errors to - appear. Please try setting |g:netrw_use_noswf| to 0 - in your <.vimrc>: > - let g:netrw_use_noswf= 0 -< - *netrw-p10* - P10. I'm being pestered with "[something] is a directory" and - "Press ENTER or type command to continue" prompts... - - The "[something] is a directory" prompt is issued by Vim, - not by netrw, and there appears to be no way to work around - it. Coupled with the default cmdheight of 1, this message - causes the "Press ENTER..." prompt. So: read |hit-enter|; - I also suggest that you set your |'cmdheight'| to 2 (or more) in - your <.vimrc> file. - - *netrw-p11* - P11. I want to have two windows; a thin one on the left and my editing - window on the right. How can I do this? - - * Put the following line in your <.vimrc>: - let g:netrw_altv = 1 - * Edit the current directory: :e . - * Select some file, press v - * Resize the windows as you wish (see |ctrl-w_<| and - |ctrl-w_>|). If you're using gvim, you can drag - the separating bar with your mouse. - * When you want a new file, use ctrl-w h to go back to the - netrw browser, select a file, then press P (see |ctrl-w_h| - and |netrw-P|). If you're using gvim, you can press - <leftmouse> in the browser window and then press the - <middlemouse> to select the file. - -============================================================================== -11. Debugging Netrw Itself *netrw-debug* {{{1 - -The <netrw.vim> script is typically available as: -> - /usr/local/share/vim/vim6x/plugin/netrwPlugin.vim - /usr/local/share/vim/vim6x/autoload/netrw.vim -< -or- > - /usr/local/share/vim/vim7x/plugin/netrwPlugin.vim - /usr/local/share/vim/vim7x/autoload/netrw.vim -< -which is loaded automatically at startup (assuming :set nocp). - - 1. Get the <Decho.vim> script, available as: - - http://mysite.verizon.net/astronaut/vim/index.html#DECHO - or - http://vim.sourceforge.net/scripts/script.php?script_id=120 - - It now comes as a "vimball"; if you're using vim 7.0 or earlier, - you'll need to update vimball, too. See - http://mysite.verizon.net/astronaut/vim/index.html#VIMBALL - - 2. Edit the <netrw.vim> file by typing: > - - vim netrw.vim - :DechoOn - :wq -< - To restore to normal non-debugging behavior, re-edit <netrw.vim> - and type > - - vim netrw.vim - :DechoOff - :wq -< - This command, provided by <Decho.vim>, will comment out all - Decho-debugging statements (Dfunc(), Dret(), Decho(), Dredir()). - - 3. Then bring up vim and attempt to evoke the problem by doing a - transfer or doing some browsing. A set of messages should appear - concerning the steps that <netrw.vim> took in attempting to - read/write your file over the network in a separate tab. - - To save the file, use > - :wincmd j - :set bt= - :w! DBG -< Please send that information to <netrw.vim>'s maintainer, > - NdrOchip at ScampbellPfamily.AbizM - NOSPAM -< -============================================================================== -12. History *netrw-history* {{{1 - - v123: Feb 27, 2008 * Marked files now keeps a "global" marked file - list. The global marked file list is used to - support tag processing and vimdiff'ing - (|netrw-md| |netrw-mt|) - * Been insuring that mm and mc works with various - combinations of local and remote directories - * (Stefan Bittner) http://.../ should always have - filetype "html" -- fixed. - * (Stefan Bittner) a "?" in a http://.../ request - wasn't being handled correctly. Fixed by - removing ? from default |g:netrw_tmpfile_escape|. - * (Nico Weber) % codes in http://.../ requests - weren't being handled correctly. Fixed by - including % in default |g:netrw_fname_escape|. - * (Stefan Bittner) attempts to update Buffers.Refresh - were failing because locale use changed the menu - names. I implemented a workaround. - v122: Feb 12, 2008 * bugfix - first sorting sequence match now has - priority - Feb 14, 2008 * bugfix - sorting sequence was effectively ignoring - sequencing priority of anything following '*' - * toggling a marked file was showing incorrect list - (list was correct, but displayed matches weren't) - * |g:netrw_special_syntax| implemented - v121: Feb 11, 2008 * Bram M reported that :e file ... :e . would not - retain the alternate file. Fixed -- I hope! - * bugfix -- apparently v120 broke an explicit - :Explore dirname - v120: Jan 21, 2008 * |netrw-mt| changed to allow for target selection - based on whether or not word under cursor is a - directory or file, or if cursor is in banner - area. - * |netrw-mh| included (hiding by marked-file suffix) - * functions moved about a bit (improved - categorization) - * executable files now displayed with trailing (*) - * symbolically linked files now displayed with - trailing (@) - * Somewhen, s:NetrwMarkFileMove() got damaged. Its - now restored (missing an endif, for example). - * |netrw-mu| implemented (unmarking marked files) - * many bugs have been removed from the marked file - system (tnx to Mark S. for feedback) - * |netrw-ms| implemented (sourcing marked files) - * fixed use of P with tree listing style - * multiple tree listing now supported - * ./ suppressed - * changed q -> qb (query bookmarks) - * implemented |netrw-qf| - * Explore now has four special list-generation - modes: */filepat **/filepat - *//pattern **//pattern - * gh (|netrw-gh|) is a shortcut for toggling the - hiding of files and directories beginning with a - dot - v119: Jan 10, 2008 * When g:netrw_keepdir is false, - NetrwOptionsRestore() had a problem - (Bill McCarthy) - Jan 11, 2008 * Netrw now shows symbolic links with a trailing - "@" and special highlighting. - Jan 15, 2008 * Changed g:netrw_noretmap -> |g:netrw_retmap|. - Changed: disabled by default at Bram's - preference. - v118: Jan 02, 2008 * Fixed a problem with Windows; - :Explore c:/path/ would not work, - but :Explore c:/path would. - * Fixed a bug in s:NetrwOptionRestore() - lcd's - argument wasn't being properly escaped so it - wouldn't handle spaces in directory names. - (Gary Johnson) - v117: Jan 02, 2008 * Fixed a problem with P; had to include - a b:netrw_curdir bypass (Bram Moolenaar) - v116: Nov 27, 2007 * netrw#LocalBrowseCheck() has &ft=="netrw" - check to prevent doing a directory listing - (was getting unexpected directory refreshes - in the middle of some function calls) - * NetrwOptionRestore moved after e! filename - in order to retain user options for editing - in s:NetrwBrowseChgDir() - Dec 12, 2007 * Bug fix -- netrw does a better job of retaining - user options when editing files under the aegis - of the browser - v115: Oct 04, 2007 * Erik Remmelzwaal pointed out that the use of - shellslash in s:GetTempfile() was incorrect - Oct 11, 2007 * Tracked down and eliminated a bug with editing - remote *.tar.gz and *.tar.bz2 files - Oct 11, 2007 * g:netrw_localmovecmd wasn't being initialized - properly, and g:netrw_localcopycmd was being - overwritten. - Oct 12, 2007 * Placed all :Rexplore and <2-leftmouse> setup - in a new support function (s:SetRexDir()). - Oct 15, 2007 * new: g:netrw_browse_split == 4; means <cr> - based selection will use previous window - Oct 20, 2007 * also checks on |'shellxquote'| to set g:netrw_shq - Oct 24, 2007 * Explore handles path/**/filename - Oct 27, 2007 * sourcing remote files often didn't work with ftp, - turns out that b:netrw_method was undefined, so - s:SaveBufVars and s:RestoreBufVars() fixed it. - v114: Sep 28, 2007 * mT, the map that invokes tags, has been improved - to support use of remote tags files. - Oct 02, 2007 * changed Netrw menu to use more submenus - v113: Sep 07, 2007 * worked out why the cursor position wasn't being - saved and restored as intended after doing such - things as deleting and renaming files. - Sep 11, 2007 * Fixed bug which effectively disabled <c-l> and - <c-h> maps - Sep 18, 2007 * there used to be one NetrwOptionRestore() call at - the end of the s:NetrwBrowseChgDir() function; - they're now at the end of every if..elseif..else - block. The edit-a-file one is not quite at the end - of its block; instead, its just before the edit. - Restores user options, then this new placement - allows ftplugins, autocmds, etc to change settings - (ex. ftplugin/cpp.vim sets cindent). - Sep 19, 2007 * changed all strlen() calls to use s:Strlen(), a - function which handles utf-8 wide characters - correctly. - Sep 20, 2007 * (Nico Weber) the "x" command has been extended - to Mac's OS/X (macunix); it now uses open to - handle |netrw-x| browsing with special files. - Sep 22, 2007 * Added |g:netrw_noretmap| to netrw at Tony M's - request. - * Included path to NetrwRemoteRmFile() - v112: Aug 18, 2007 * added mx (|netrw-mx|) for executing arbitrary - commands on marked files - Aug 22, 2007 * more option save/restore work for - s:NetrwBrowseChgDir(); s:NetrwOptionSave() - and s:NetrwOptionRestore() now take a parameter - specifying the type of variables to be used for - saving and restoring (either "w:" or "s:") - Sep 04, 2007 * added the :NetrwClean[!] command - v111: Jul 25, 2007 * using Windows but not using Cygwin, netrw does a - "file bufname" where the bufname uses /s - instead of \s; Vim "fixes" it by changing the - bufname to use \s anyway. This meant that - NetrwGetBuffer() didn't find the appropriately - named buffer, and so would generate a new - buffer listing; hence the cursor would appear - to have been moved when doing a preview. - * added <2-leftmouse> map to return to netrw's - browser display - Aug 16, 2007 * added the mark-file system, including - maps for mf mp mt mz and mu. Modifications - made to maps for a D O and R to support - marked files. - v110: May 10, 2007 * added [ and ] maps to NetrwTreeListing - May 25, 2007 * |g:netrw_preview| included - May 29, 2007 * modifed netrw#NetBrowseX to consistently use - |g:netrw_shq| instead of hardcoded quotes, - and modified the snippet that sets up redir - so Windows machines use "nul" instead of - "/dev/null". - Jun 01, 2007 * fixed bug -- NetGetBuffer() wasn't always - recognizing a buffer name match when it should, - thus resulting in [Scratch] buffers. - Jun 04, 2007 * Gary Johnson found a bugfix for the "c" mapping - when the directory is to be made current but - the name contains spaces. - v109: Mar 26, 2007 * if a directory name includes a "$" character, - Explore() will use expand() in an attempt to - decipher the name. - May 07, 2007 * g:netrw_use_errorwindow now allows one to - have error messages go to a reliable window - or to use a less reliable but recallable - echoerr method - May 07, 2007 * g:netrw_scpport and g:netrw_sshport support - use of -P and -p, respectively, to set port - for scp/ssh. - v108: Jan 03, 2007 * included preview map (|netrw-p|), supporting - remote browsing - * netrw can now source remote files - Jan 26, 2007 * Colton Jamieson noted that remote directory - browsing did not support alternate port - selection. This feature has now been extended - to apply to all remote browsing commands via ssh. - (list, remove/delete, rename) - Jan 31, 2007 * Luis Florit reported that @* was an invalid - register. The @* register is now only saved and - restored if |'guioptions'| contains "a". - Feb 02, 2007 * Fixed a bug that cropped up when writing files - via scp using cygwin - Feb 08, 2007 * tree listing mode managed to stop working again; - fixed again! - Feb 15, 2007 * Guido Van Hoecke reported that netrw didn't - handle browsing well with M$ ftp servers. He even - set up a temporary account for me to test with - (thanks!). Netrw now can browse M$ ftp servers. - v107: Oct 12, 2006 * bypassed the autowrite option - Oct 24, 2006 * handles automatic decompression of *.gz and *.bz2 - files - Nov 03, 2006 * Explore will highlight matching files when - **/pattern is used (and if the |'hls'| option - is set) - Nov 09, 2006 * a debugging line, when enabled, was inadvertently - bringing up help instead of simply reporting on - list contents - Nov 21, 2006 * tree listing improved (cursor remains put) - Nov 27, 2006 * fixed b:netrw_curdir bug when repeated "i"s were - pressed. - Dec 15, 2006 * considerable qty of changes, mostly to share more - code between local and remote browsing. Includes - support for tree-style listing for both remote - and local browsing. - Dec 15, 2006 * Included Peter Bengtsson's modifications to - support the Amiga. - v106: Sep 21, 2006 * removed old v:version<700 code as netrw now - requires vim 7.0 - * worked around a bug where register * was - overwritten during local browsing - v104: Sep 05, 2006 * as suggested by Rodolfo Borges, :Explore and - variants will position the cursor on the file - just having been edited - * changed default |g:netrw_sort_sequence| order - * changed b, Nb to simply mb (see |netrw-mb|) - * changed B, NB to simply gb (see |netrw-gb|) - * tree listing style (see |g:netrw_liststyle|) - * attempts to retain the alternate file - v103: Jul 26, 2006 * used Yakov Lerner's tip#1289 to improve netrw - error message display - * wide listings didn't handle files with backslashes - in their names properly. A symptom was an - inability to open files. - Aug 09, 2006 * included "t" mapping for opening tabbed windows, - both for remote and local browsing - * changed netrw_longlist to netrw_liststyle - Aug 15, 2006 * fixed one of the NB maps - Aug 22, 2006 * changed *Explore commands to use -nargs=* instead - of -nargs=?. Allows both -complete=dir _and_ the - starstar arguments to work (-nargs=? seems to - require one or the other). - Aug 23, 2006 * copied all w:.. variables across splits to - new windows - Aug 25, 2006 * when g:netrw_browsex_viewer was '-' - (see |g:netrw_browsex_viewer|) it wasn't causing - netrwFileHandlers#Invoke() to be called as it - was expected to. (tnx Steve Dugaro) - Aug 29, 2006 * changed NetBrowseX() to use "setlocal ... noswf" - instead of "set ... noswf" (tnx Benji Fisher) - Aug 31, 2006 * tabs and fastbrowse<=1 didn't work together. - v102: Jun 15, 2006 * chgd netrwPlugin to call netrw#LocalBrowseCheck() - * bugfix: g:netrw_keepdir==0 had stopped working - Jul 06, 2006 * bugfix: NetOptionSave/Restore now saves/restores - the unnamed register (|registers|) - Jul 07, 2006 * |g:netrw_menu| support included - Jul 13, 2006 * :Texplore command implemented - Jul 17, 2006 * NetSplit and (Local|Net)BrowseChgDir() were both - splitting windows. This affected o, v, and - g:netrw_browse_split. - Jul 20, 2006 * works around wildignore setting (was causing - netrw's local browser not to list wildignore'd - files) - Jul 24, 2006 * <leftmouse> acts as a <cr> for selecting a file - <rightmouse> acts as a <del> for deleting a file - v100: May 14, 2006 * when using Windows and shell==cmd.exe, the - default for g:netrw_ignorenetrc is now 1 - * bugfix: unwanted ^Ms now removed - (affected shell==cmd.exe - Windows) - * added Bookmarks and History to the menu - * an error message about non-existing - w:netrw_longlist was appearing during attempts to - Explore (fixed) - * g:netrw_shq now available to make netrw use - specified style of quotes for commands - May 29, 2006 * user NFH_*() functions were inadvertently being - ignored - * fixed a Windows non-cygwin ftp handling problem. - * hiding pattern candidate separators included some - characters it shouldn't have (tnx to Osei Poku) - Jun 01, 2006 * for browsing, netrw was supposed to use "dir" - instead of "ls -lF" when using - ftp+non-cygwin+windows. Fixed. - * an inadvertently left-in-place debugging statement - was preventing use of the "x" key with browsing. - Jun 05, 2006 * g:netrw_nogx available to prevent making the gx - map (see |g:netrw_nogx|) - * bugfix, Explore wouldn't change directory - properly (vim ., :Explore subdirname) - Jun 06, 2006 * moved history to 2nd line in Netrw menu - * fixed delete for unix-based systems - Jun 07, 2006 * x key now works for windows-noncygwin-ftp - Jun 08, 2006 * Explore */pat and **//pat now wraps - v99: May 09, 2006 * g:netrw_browse_split=3 for opening files in new - tabs implemented. - May 12, 2006 * deletes temporary file at end of NetRead() - * visual mode based Obtain implemented - * added -complete=dir to the various Explore - commands - v98: May 02, 2006 * the "p" key didn't work properly when the browsing - directory name had spaces in it. - v97: May 01, 2006 * exists("&acd") now used to determine if - the 'acd' option exists - * "obtain" now works again under Windows - v96: * bugfix - the |'acd'| option is not always defined - but is now bypassed only when it is - v95: * bugfix - Hiding mode worked correctly (don't show - any file matching any of the g:netrw_hide - patterns), but showing mode was showing only those - files that didn't match any of the g:netrw_hide - patterns. Instead, it now shows all files that - match any of the g:netrw_hide patterns (the - difference between a logical and and logical or). - v94: * bugfix - a Decho() had a missing quote; only - affects things when debugging was enabled. - v93: * bugfix - removed FocusGained event from causing a - slow-browser refresh for Windows - v92: * :Explore **//pattern implemented - (**/filepattern was already taken) - v91: * :Explore */pattern implemented - * |'acd'| option bypassed - v90: * mark ', as suggested by Yegappan Lakshmanan, used - to help guarantee entry into the jump list when - appropriate. - * <s-down> and <s-up> are no longer defined until a - :Explore **/pattern is used (if the user already - has a map for them). They will be defined for new - browser windows from that point forward. - v89: * A <s-down>, <s-up>, :Nexplore, or a :Pexplore - without having first done an :Explore **/pattern - (see |netrw-starstar|) caused - a lot of unhelpful error messages to appear - v88: * moved DrChip.Netrw menu to Netrw. Now has - priority 80 by default. - g:NetrwTopLvlMenu == "Netrw" and can be changed - by the user to suit. The priority is given by - g:NetrwMenuPriority. - * Changed filetype for browser displays from - netrwlist to netrw. - v87: * bug fix -- menus were partially disappearing - v85: * bug fix -- missing an endif - * bug fix -- handles spaces in names and directories - when using ftp-based browsing - v83: * disabled stop-acd handling; the change in directory - handling may allow acd to be used again. - * D was refusing to delete remote files/directories - in wide listing mode. - v81: * FocusGained also used to refresh/wipe local browser - directory buffers - * (bugfix) netrw was leaving [Scratch] buffers behind - when the user had the "hidden" option set. The - 'hidden' option is now bypassed. - v80: * ShellCmdPost event used in conjunction with - g:netrw_fastbrowse to refresh/wipe local browser - directory buffers. - v79: * directories are now displayed with nowrap - * (bugfix) if the column width was smaller than the - largest file's name, then netrw would hang when - using wide-listing mode - fixed - * g:netrw_fastbrowse introduced - v78: * progress has been made on allowing spaces inside - directory names for remote work (reading, writing, - browsing). (scp) - v77: * Mikolaj Machowski fixed a bug in a substitute cmd - * g:netrw_browsex_viewer implemented - * Mikolaj Machowski pointed out that gnome-open is - often executable under KDE systems, although it is - effectively not functional. NetBrowseX now looks - for "kicker" as a running process to determine if - KDE is actually running. - * Explorer's O functionality was inadvertently left - out. Netrw now does the same thing, but with the - "P" key. - * added g:netrw_browse_split option - * fixed a bug where the directory contained a "." but - the file didn't (was treating the dirname from "." - onwards as a suffix) - v76: * "directory is missing" error message now restores - echo highlighting - v75: * file://... now conforms to RFC2396 (thanks to - S. Zacchiroli) - * if the binary option is set, then NetWrite() will - only write the whole file (line numbers don't make - sense with this). Supports writing of tar and zip - files. - v74: * bugfix (vim, then :Explore) now works - * ctrl-L keeps cursor at same screen location (both - local and remote browsing) - * netrw now can read remote zip and tar files - * Obtain now uses WinXP ftp+.netrc successfully - v73: * bugfix -- scp://host/path/file was getting named - incorrectly - * netrw detects use of earlier-than-7.0 version of - vim and issues a pertinent error message. - * netrwSettings.vim is now uses autoloading. Only - <netrwPlugin.vim> is needed as a pure plugin - (ie. always loaded). - v72: * bugfix -- formerly, one could prevent the loading - of netrw by "let g:loaded_netrw=1"; when - autoloading became supported, this feature was - lost. It is now restored. - v71: * bugfix -- made some "set nomodifiable"s into - setlocal variants (allows :e somenewfile to be - modifiable as usual) - * NetrwSettings calls a netrw function, thereby - assuring that netrw has loaded. However, if netrw - does not load for whatever reason, then - NetrwSettings will now issue a warning message. - * For what reason I don't recall, when wget and fetch - are both not present, and an attempt to read a - http://... url is made, netrw exited. It now only - returns. - * When ch=1, on the second and subsequent uses of - browsing Netrw would issue a blank line to clear - the echo'd messages. This caused an annoying - "Hit-Enter" prompt; now a blank line message - is echo'd only if &ch>1. - v70: * when using |netrw-O|, the "Obtaining filename" - message is now shown using |hl-User9|. If User9 - has not been defined, netrw itself will define it. - v69: * Bugfix: win95/98 machines were experiencing a - "E121: Undefined variable: g:netrw_win95ftp" - message - v68: * double-click-leftmouse selects word under mouse - v67: * Passwords which contain blanks will now be - surrounded by double-quotes automatically (Yongwei) - v66: * Netrw now seems to work with a few more Windows - situations - * O now obtains a file: remote browsing - file -> local copy, locally browsing - file -> current directory (see :pwd) - * i now cycles between thin, long, and wide listing - styles - * NB and Nb are maps that are always available; - corresponding B and b maps are only available when - not using wide listing in order to allow them to - be used for motions - v65: * Browser functions now use NetOptionSave/Restore; in - particular, netrw now works around the report - setting - v64: * Bugfix - browsing a "/" directory (Unix) yielded - buffers named "[Scratch]" instead of "/" - * Bugfix - remote browsing with ftp was omitting - the ./ and ../ - v63: * netrw now takes advantage of autoload (needs 7.0) - * Bugfix - using r (to reverse sort) working again - v62: * Bugfix - spaces allowed again in directory names - with g:netrw_keepdir=0. In fact, I've tested netrw - with most ANSI punctuation marks for directory - names. - * Bugfix - NetrwSettings gave errors when - g:netrw_silent had not be set. - v61: * Document upgrade -- netrw variable-based settings - all should have tags. Supports NetrwSettings cmd. - * Several important variables are window-oriented. - Netrw has to transfer these across a window split. - See s:BufWinVars() and s:UseBufWinVars(). - v60: * When using the i map to switch between long and - short listings, netrw will now keep cursor on same - line - * "Match # of #" now uses status line - * :Explore **/*.c will now work from a - non-netrw-browser window - * :Explore **/patterns can now be run in separate - browser windows - * active banner (hit <cr> will cause various things - to happen) - v59: * bugfix -- another keepalt work-around installed - (for vim6.3) - * "Match # of #" for Explore **/pattern matches - v58: * Explore and relatives can now handle - **/somefilepattern (v7) - * Nexplore and Pexplore introduced (v7). shift-down - and shift-up cursor keys will invoke Nexplore and - Pexplore, respectively. - * bug fixed with o and v - * autochdir only worked around for vim when it has - been compiled with either - |+netbeans_intg| or |+sun_workshop| - * Under Windows, all directories and files were - being preceded with a "/" when local browsing. - Fixed. - * When: syntax highlighting is off, laststatus=2, and - remote browsing is used, sometimes the laststatus - highlighting bleeds into the entire display. Work - around - do an extra redraw in that case. - * Bugfix: when g:netrw_keepdir=0, due to re-use of - buffers, netrw didn't change the directory when it - should've - * Bugfix: D and R commands work again - v57: * Explore and relatives can now handle RO files - * reverse sort restored with vim7's sort command - * g:netrw_keepdir now being used to keep the current - directory unchanged as intended (sense change) - * vim 6.3 still supported - v56: * LocalBrowse now saves autochdir setting, unsets it, - and restores it before returning. - * using vim's rename() instead of system + - local_rename variable - * avoids changing directory when g:netrw_keepdir is - false - v55: * -bar used with :Explore :Sexplore etc to allow - multiple commands to be separated by |s - * browser listings now use the "nowrap" option - * browser: some unuseful error messages now - suppressed - v54: * For backwards compatibility, Explore and Sexplore - have been implemented. In addition, Hexplore and - Vexplore commands are available, too. - * <amatch> used instead of <afile> in the - transparency support (BufReadCmd, FileReadCmd, - FileWriteCmd) - * ***netrw*** prepended to various error messages - netrw may emit - * g:netrw_port used instead of b:netrw_port for scp - * any leading [:#] is removed from port numbers - v53: * backslashes as well as slashes placed in various - patterns (ex. g:netrw_sort_sequence) to better - support Windows - v52: * nonumber'ing now set for browsing buffers - * when the hiding list hid all files, error messages - ensued. Fixed - * when browsing, swf is set, but directory is not - set, when netrw was attempting to restore options, - vim wanted to save a swapfile to a local directory - using an url-style path. Fixed - v51: * cygwin detection now automated - (using windows and &shell is bash) - * customizable browser "file" rejection patterns - * directory history - * :[range]w url now supported (ie. netrw uses a - FileWriteCmd event) - * error messages have a "Press <cr> to continue" to - allow them to be seen - * directory browser displays no longer bother the - swapfile - * u/U commands to go up and down the history stack - * history stack may be saved with viminfo with it's - "!" option - * bugfixes associated with unwanted [No Files] - entries - v50: * directories now displayed using buftype=nofile; - should keep the directory names as-is - * attempts to remove empty "[No File]" buffers - leftover from :file ..name.. commands - * bugfix: a "caps-lock" editing difficulty left in - v49 was fixed - * syntax highlighting for "Showing:" the hiding list - included - * bookmarks can now be retained if "!" is in the - viminfo option - v49: * will use ftp for http://.../ browsing - v48: * One may use ftp to do remote host file browsing - * (windows and !cygwin) remote browsing with ftp can - now use the "dir" command internally to provide - listings - * g:netrw_keepdir now allows one to keep the initial - current directory as the current directory - (normally the local file browser makes the - currently viewed directory the current directory) - * g:netrw_alto and g:netrw_altv now support - alternate placement of windows started with o or v - * Nread ? and Nwrite ? now uses echomsg (instead of - echo) so :messages can repeat showing the help - * bugfix: avoids problems with partial matches of - directory names to prior buffers with longer names - * one can suppress error messages with g:netrw_quiet - ctrl-h used - * instead of <Leader>h for editing hiding list one - may edit the sorting sequence with the S map, which - now allows confirmation of deletion with - [y(es) n(o) a(ll) q(uit)] - * the "x" map now handles special file viewing with: - (windows) rundll32 url.dll (gnome) gnome-open (kde) - kfmclient If none of these are on the executable - path, then netrwFileHandlers.vim is used. - * directory bookmarking during both local and remote - browsing implemented - * one may view all, use the hiding list to suppress, - or use the hiding list to show-only remote and - local file/directory listings - * improved unusual file and directory name handling - preview window support - v47: * now handles local browsing. - v46: * now handles remote browsing - * g:netrw_silent (if 1) will cause all transfers to - be silent - v45: * made the [user@]hostname:path form a bit more - restrictive to better handle errors in using - protocols (e.g. scp:usr@host:file was being - recognized as an rcp request) - v44: * changed from "rsync -a" to just "rsync" - * somehow an editing error messed up the test to - recognize use of the fetch method for NetRead. - * more debugging statements included - v43: * moved "Explanation" comments to <pi_netrw.txt> help - file as "Network Reference" (|netrw-ref|) - * <netrw.vim> now uses Dfunc() Decho() and Dret() for - debugging - * removed superfluous NetRestorePosn() calls - v42: * now does BufReadPre and BufReadPost events on - file:///* and file://localhost/* - v41: * installed file:///* and file://localhost/* handling - v40: * prevents redraw when a protocol error occurs so - that the user may see it - v39: * sftp support - v38: * Now uses NetRestorePosn() calls with Nread/Nwrite - commands - * Temporary files now removed via bwipe! instead of - bwipe (thanks to Dave Roberts) - v37: * Claar's modifications which test if ftp is - successful, otherwise give an error message - * After a read, the alternate file was pointing to - the temp file. The temp file buffer is now wiped - out. - * removed silent from transfer methods so user can - see what's happening - - -============================================================================== -12. Credits *netrw-credits* {{{1 - - Vim editor by Bram Moolenaar (Thanks, Bram!) - dav support by C Campbell - fetch support by Bram Moolenaar and C Campbell - ftp support by C Campbell <NdrOchip@ScampbellPfamily.AbizM> - http support by Bram Moolenaar <bram@moolenaar.net> - rcp - rsync support by C Campbell (suggested by Erik Warendorph) - scp support by raf <raf@comdyn.com.au> - sftp support by C Campbell - - inputsecret(), BufReadCmd, BufWriteCmd contributed by C Campbell - - Jérôme Augé -- also using new buffer method with ftp+.netrc - Bram Moolenaar -- obviously vim itself, :e and v:cmdarg use, - fetch,... - Yasuhiro Matsumoto -- pointing out undo+0r problem and a solution - Erik Warendorph -- for several suggestions (g:netrw_..._cmd - variables, rsync etc) - Doug Claar -- modifications to test for success with ftp - operation - -============================================================================== -Modelines: {{{1 - vim:tw=78:ts=8:ft=help:norl:fdm=marker +*pi_netrw.txt* For Vim version 7.2. Last change: 2008 Sep 02 + + ----------------------------------------------------- + NETRW REFERENCE MANUAL by Charles E. Campbell, Jr. + ----------------------------------------------------- + + +*dav* *ftp* *netrw-file* *Nread* *rcp* *scp* +*davs* *http* *netrw.vim* *Nsource* *rsync* *sftp* +*fetch* *netrw* *network* *Nwrite* + +============================================================================== +1. Contents *netrw-contents* {{{1 + +1. Contents.............................................|netrw-contents| +2. Starting With Netrw..................................|netrw-start| +3. Netrw Reference......................................|netrw-ref| + EXTERNAL APPLICATIONS AND PROTOCOLS................|netrw-externapp| + READING............................................|netrw-read| + WRITING............................................|netrw-write| + DIRECTORY LISTING..................................|netrw-dirlist| + CHANGING THE USERID AND PASSWORD...................|netrw-chgup| + VARIABLES AND SETTINGS.............................|netrw-variables| + PATHS..............................................|netrw-path| +4. Network-Oriented File Transfer.......................|netrw-xfer| + NETRC..............................................|netrw-netrc| + PASSWORD...........................................|netrw-passwd| +5. Activation...........................................|netrw-activate| +6. Transparent File Editing.............................|netrw-transparent| +7. Ex Commands..........................................|netrw-ex| +8. Variables and Options................................|netrw-var| +9. Browsing.............................................|netrw-browse| + Introduction To Browsing...........................|netrw-intro-browse| + Quick Reference: Maps..............................|netrw-browse-maps| + Quick Reference: Commands..........................|netrw-browse-cmds| + Bookmarking A Directory............................|netrw-mb| + Browsing...........................................|netrw-cr| + Browsing With A Horizontally Split Window..........|netrw-o| + Browsing With A New Tab............................|netrw-t| + Browsing With A Vertically Split Window............|netrw-v| + Change Listing Style...............................|netrw-i| + Changing To A Bookmarked Directory.................|netrw-gb| + Changing To A Predecessor Directory................|netrw-u| + Changing To A Successor Directory..................|netrw-U| + Customizing Browsing With A User Function..........|netrw-x| + Deleting Files Or Directories......................|netrw-D| + Directory Exploring Commands.......................|netrw-explore| + Exploring With Stars and Patterns..................|netrw-star| + Displaying Information About File..................|netrw-qf| + Edit File Or Directory Hiding List.................|netrw-ctrl-h| + Editing The Sorting Sequence.......................|netrw-S| + Going Up...........................................|netrw--| + Hiding Files Or Directories........................|netrw-a| + Improving Browsing.................................|netrw-ssh-hack| + Listing Bookmarks And History......................|netrw-qb| + Making A New Directory.............................|netrw-d| + Making The Browsing Directory The Current Directory|netrw-c| + Marking Files......................................|netrw-mf| + Marking Files By Regular Expression................|netrw-mr| + Marked Files: Arbitrary Command....................|netrw-mx| + Marked Files: Compression And Decompression........|netrw-mz| + Marked Files: Copying..............................|netrw-mc| + Marked Files: Diff.................................|netrw-md| + Marked Files: Editing..............................|netrw-me| + Marked Files: Grep.................................|netrw-mg| + Marked Files: Hiding and Unhiding by Suffix........|netrw-mh| + Marked Files: Moving...............................|netrw-mm| + Marked Files: Printing.............................|netrw-mp| + Marked Files: Sourcing.............................|netrw-ms| + Marked Files: Tagging..............................|netrw-mT| + Marked Files: Setting the Target Directory.........|netrw-mt| + Marked Files: Unmarking............................|netrw-mu| + Netrw Browser Variables............................|netrw-browser-var| + Netrw Browsing And Option Incompatibilities........|netrw-incompatible| + Netrw Settings.....................................|netrw-settings| + Obtaining A File...................................|netrw-O| + Preview Window.....................................|netrw-p| + Previous Window....................................|netrw-P| + Refreshing The Listing.............................|netrw-ctrl-l| + Renaming Files Or Directories......................|netrw-move| + Reversing Sorting Order............................|netrw-r| + Selecting Sorting Style............................|netrw-s| +10. Problems and Fixes...................................|netrw-problems| +11. Debugging Netrw Itself...............................|netrw-debug| +12. History..............................................|netrw-history| +13. Credits..............................................|netrw-credits| + +{Vi does not have any of this} + +============================================================================== +2. Starting With Netrw *netrw-start* {{{1 + +Netrw makes reading files, writing files, browsing over a network, and +browsing locally easy! First, make sure that you have plugins enabled, so +you'll need to have at least the following in your <.vimrc>: +(or see |netrw-activate|) > + + set nocp " 'compatible' is not set + filetype plugin on " plugins are enabled +< +(see |'cp'| and |:filetype-plugin-on|) + +Netrw supports "transparent" editing of files on other machines using urls +(see |netrw-transparent|). As an example of this, let's assume you have an +account on some other machine; if you can use scp, try: > + + vim scp://hostname/path/to/file +< +Want to make ssh/scp easier to use? Check out |netrw-ssh-hack|! + +So, what if you have ftp, not ssh/scp? That's easy, too; try > + + vim ftp://hostname/path/to/file +< +Want to make ftp simpler to use? See if your ftp supports a file called +<.netrc> -- typically it goes in your home directory, has read/write +permissions for only the user to read (ie. not group, world, other, etc), +and has lines resembling > + + machine HOSTNAME login USERID password "PASSWORD" + machine HOSTNAME login USERID password "PASSWORD" + ... + default login USERID password "PASSWORD" +< +Now about browsing -- when you just want to look around before editing a +file. For browsing on your current host, just "edit" a directory: > + + vim . + vim /home/userid/path +< +For browsing on a remote host, "edit" a directory (but make sure that +the directory name is followed by a "/"): > + + vim scp://hostname/ + vim ftp://hostname/path/to/dir/ +< +See |netrw-browse| for more! + +There are more protocols supported by netrw just than scp and ftp, too: see the +next section, |netrw-externapp|, for how to use these external applications. + +If you want to use plugins, but for some reason don't wish to use netrw, then +you need to avoid loading both the plugin and the autoload portions of netrw. +You may do so by placing the following two lines in your <.vimrc>: > + + :let g:loaded_netrw = 1 + :let g:loaded_netrwPlugin = 1 +< + +============================================================================== +3. Netrw Reference *netrw-ref* {{{1 + + Netrw supports several protocols in addition to scp and ftp mentioned + in |netrw-start|. These include dav, fetch, http,... well, just look + at the list in |netrw-externapp|. Each protocol is associated with a + variable which holds the default command supporting that protocol. + +EXTERNAL APPLICATIONS AND PROTOCOLS *netrw-externapp* {{{2 + + Protocol Variable Default Value + -------- ---------------- ------------- + dav: *g:netrw_dav_cmd* = "cadaver" + fetch: *g:netrw_fetch_cmd* = "fetch -o" if fetch is available + ftp: *g:netrw_ftp_cmd* = "ftp" + http: *g:netrw_http_cmd* = "curl -o" if curl is available + http: g:netrw_http_cmd = "wget -q -O" elseif wget is available + http: g:netrw_http_cmd = "fetch -o" elseif fetch is available + rcp: *g:netrw_rcp_cmd* = "rcp" + rsync: *g:netrw_rsync_cmd* = "rsync -a" + scp: *g:netrw_scp_cmd* = "scp -q" + sftp: *g:netrw_sftp_cmd* = "sftp" + +READING *netrw-read* *netrw-nread* {{{2 + + Generally, one may just use the url notation with a normal editing + command, such as > + + :e ftp://[user@]machine/path +< + Netrw also provides the Nread command: + + :Nread ? give help + :Nread "machine:path" uses rcp + :Nread "machine path" uses ftp w/ <.netrc> + :Nread "machine id password path" uses ftp + :Nread "dav://machine[:port]/path" uses cadaver + :Nread "fetch://[user@]machine/path" uses fetch + :Nread "ftp://[user@]machine[[:#]port]/path" uses ftp w/ <.netrc> + :Nread "http://[user@]machine/path" uses http uses wget + :Nread "rcp://[user@]machine/path" uses rcp + :Nread "rsync://[user@]machine[:port]/path" uses rsync + :Nread "scp://[user@]machine[[:#]port]/path" uses scp + :Nread "sftp://[user@]machine/path" uses sftp + +WRITING *netrw-write* *netrw-nwrite* {{{2 + + One may just use the url notation with a normal file writing + command, such as > + + :w ftp://[user@]machine/path +< + Netrw also provides the Nwrite command: + + :Nwrite ? give help + :Nwrite "machine:path" uses rcp + :Nwrite "machine path" uses ftp w/ <.netrc> + :Nwrite "machine id password path" uses ftp + :Nwrite "dav://machine[:port]/path" uses cadaver + :Nwrite "ftp://[user@]machine[[:#]port]/path" uses ftp w/ <.netrc> + :Nwrite "rcp://[user@]machine/path" uses rcp + :Nwrite "rsync://[user@]machine[:port]/path" uses rsync + :Nwrite "scp://[user@]machine[[:#]port]/path" uses scp + :Nwrite "sftp://[user@]machine/path" uses sftp + http: not supported! + +SOURCING *netrw-source* {{{2 + + One may just use the url notation with the normal file sourcing + command, such as > + + :so ftp://[user@]machine/path +< + Netrw also provides the Nsource command: + + :Nsource ? give help + :Nsource "dav://machine[:port]/path" uses cadaver + :Nsource "fetch://[user@]machine/path" uses fetch + :Nsource "ftp://[user@]machine[[:#]port]/path" uses ftp w/ <.netrc> + :Nsource "http://[user@]machine/path" uses http uses wget + :Nsource "rcp://[user@]machine/path" uses rcp + :Nsource "rsync://[user@]machine[:port]/path" uses rsync + :Nsource "scp://[user@]machine[[:#]port]/path" uses scp + :Nsource "sftp://[user@]machine/path" uses sftp + +DIRECTORY LISTING *netrw-dirlist* {{{2 + + One may browse a directory to get a listing by simply attempting to + edit the directory: > + + :e scp://[user]@hostname/path/ + :e ftp://[user]@hostname/path/ +< + For remote directories (ie. those using scp or ftp), that trailing + "/" is necessary (it tells netrw that its to treat it as a directory + to browse instead of a file to download). + + However, the Nread command can also be used to accomplish this: + + :Nread [protocol]://[user]@hostname/path/ + + *netrw-login* *netrw-password* +CHANGING USERID AND PASSWORD *netrw-chgup* *netrw-userpass* {{{2 + + Attempts to use ftp will prompt you for a user-id and a password. + These will be saved in global variables g:netrw_uid and + s:netrw_passwd; subsequent uses of ftp will re-use those two items to + simplify the further use of ftp. However, if you need to use a + different user id and/or password, you'll want to call NetUserPass() + first. To work around the need to enter passwords, check if your ftp + supports a <.netrc> file in your home directory. Also see + |netrw-passwd| (and if you're using ssh/scp hoping to figure out how + to not need to use passwords, look at |netrw-ssh-hack|). + + :NetUserPass [uid [password]] -- prompts as needed + :call NetUserPass() -- prompts for uid and password + :call NetUserPass("uid") -- prompts for password + :call NetUserPass("uid","password") -- sets global uid and password + +NETRW VARIABLES AND SETTINGS *netrw-variables* {{{2 +(also see: |netrw-browser-var| |netrw-protocol| |netrw-settings| |netrw-var|) + +Netrw provides a lot of variables which allow you to customize netrw to your +preferences. One way to look at them is via the command :NetrwSettings (see +|netrw-settings|) which will display your current netrw settings. Most such +settings are described below, in |netrw-browser-options|, and in +|netrw-externapp|: + + *b:netrw_lastfile* last file Network-read/written retained on a per-buffer + basis (supports plain :Nw ) + + *g:netrw_ftp* if it doesn't exist, use default ftp + =0 use default ftp (uid password) + =1 use alternate ftp method (user uid password) + If you're having trouble with ftp, try changing the + value of this variable to see if the alternate ftp + method works for your setup. + + *g:netrw_extracmd* default: doesn't exist + If this variable exists, then any string it contains + will be placed into the commands set to your ftp + client. As an example: + ="passive" + + *g:netrw_ftpmode* ="binary" (default) + ="ascii" + + *g:netrw_ignorenetrc* =0 (default for linux, cygwin) + =1 If you have a <.netrc> file but it doesn't work and + you want it ignored, then set this variable as + shown. (default for Windows + cmd.exe) + + *g:netrw_menu* =0 disable netrw's menu + =1 (default) netrw's menu enabled + + *g:netrw_nogx* if this variable exists, then the "gx" map will not + be available (see |netrw-gx|) + + *g:netrw_uid* (ftp) user-id, retained on a per-session basis + *s:netrw_passwd* (ftp) password, retained on a per-session basis + + *g:netrw_preview* =0 (default) preview window shown in a horizontally + split window + =1 preview window shown in a vertically split window. + Also affects the "previous window" (see |netrw-P|) in + the same way. + + *g:netrw_scpport* = "-P" : option to use to set port for scp + *g:netrw_sshport* = "-p" : option to use to set port for ssh + + *g:netrw_silent* =0 : transfers done normally + =1 : transfers done silently + + *g:netrw_use_errorwindow* =1 : messages from netrw will use a separate one + line window. This window provides reliable + delivery of messages. (default) + =0 : messages from netrw will use echoerr ; + messages don't always seem to show up this + way, but one doesn't have to quit the window. + + *g:netrw_win95ftp* =1 if using Win95, will remove four trailing blank + lines that o/s's ftp "provides" on transfers + =0 force normal ftp behavior (no trailing line removal) + + *g:netrw_cygwin* =1 assume scp under windows is from cygwin. Also + permits network browsing to use ls with time and + size sorting (default if windows) + =0 assume Windows' scp accepts windows-style paths + Network browsing uses dir instead of ls + This option is ignored if you're using unix + + *g:netrw_use_nt_rcp* =0 don't use the rcp of WinNT, Win2000 and WinXP + =1 use WinNT's rcp in binary mode (default) + +PATHS *netrw-path* {{{2 + +Paths to files are generally user-directory relative for most protocols. +It is possible that some protocol will make paths relative to some +associated directory, however. +> + example: vim scp://user@host/somefile + example: vim scp://user@host/subdir1/subdir2/somefile +< +where "somefile" is in the "user"'s home directory. If you wish to get a +file using root-relative paths, use the full path: +> + example: vim scp://user@host//somefile + example: vim scp://user@host//subdir1/subdir2/somefile +< + +============================================================================== +4. Network-Oriented File Transfer *netrw-xfer* {{{1 + +Network-oriented file transfer under Vim is implemented by a VimL-based script +(<netrw.vim>) using plugin techniques. It currently supports both reading and +writing across networks using rcp, scp, ftp or ftp+<.netrc>, scp, fetch, +dav/cadaver, rsync, or sftp. + +http is currently supported read-only via use of wget or fetch. + +<netrw.vim> is a standard plugin which acts as glue between Vim and the +various file transfer programs. It uses autocommand events (BufReadCmd, +FileReadCmd, BufWriteCmd) to intercept reads/writes with url-like filenames. > + + ex. vim ftp://hostname/path/to/file +< +The characters preceding the colon specify the protocol to use; in the +example, it's ftp. The <netrw.vim> script then formulates a command or a +series of commands (typically ftp) which it issues to an external program +(ftp, scp, etc) which does the actual file transfer/protocol. Files are read +from/written to a temporary file (under Unix/Linux, /tmp/...) which the +<netrw.vim> script will clean up. + + *netrw-putty* *netrw-pscp* *netrw-psftp* +One may modify any protocol's implementing external application by setting a +variable (ex. scp uses the variable g:netrw_scp_cmd, which is defaulted to +"scp -q"). As an example, consider using PuTTY: > + + let g:netrw_scp_cmd = '"c:\Program Files\PuTTY\pscp.exe" -q -batch' + let g:netrw_sftp_cmd= '"c:\Program Files\PuTTY\psftp.exe"' +< +See |netrw-p8| for more about putty, pscp, psftp, etc. + +Ftp, an old protocol, seems to be blessed by numerous implementations. +Unfortunately, some implementations are noisy (ie., add junk to the end of the +file). Thus, concerned users may decide to write a NetReadFixup() function +that will clean up after reading with their ftp. Some Unix systems (ie., +FreeBSD) provide a utility called "fetch" which uses the ftp protocol but is +not noisy and more convenient, actually, for <netrw.vim> to use. +Consequently, if "fetch" is executable, it will be used to do reads for +ftp://... (and http://...) . See |netrw-var| for more about this. + +For rcp, scp, sftp, and http, one may use network-oriented file transfers +transparently; ie. +> + vim rcp://[user@]machine/path + vim scp://[user@]machine/path +< +If your ftp supports <.netrc>, then it too can be just as transparently used +if the needed triad of machine name, user id, and password are present in +that file. Your ftp must be able to use the <.netrc> file on its own, however. +> + vim ftp://[user@]machine[[:#]portnumber]/path +< +However, ftp will often need to query the user for the userid and password. +The latter will be done "silently"; ie. asterisks will show up instead of +the actually-typed-in password. Netrw will retain the userid and password +for subsequent read/writes from the most recent transfer so subsequent +transfers (read/write) to or from that machine will take place without +additional prompting. + + *netrw-urls* + +=================================+============================+============+ + | Reading | Writing | Uses | + +=================================+============================+============+ + | DAV: | | | + | dav://host/path | | cadaver | + | :Nread dav://host/path | :Nwrite dav://host/path | cadaver | + +---------------------------------+----------------------------+------------+ + | DAV + SSL: | | | + | davs://host/path | | cadaver | + | :Nread davs://host/path | :Nwrite davs://host/path | cadaver | + +---------------------------------+----------------------------+------------+ + | FETCH: | | | + | fetch://[user@]host/path | | | + | fetch://[user@]host:http/path | Not Available | fetch | + | :Nread fetch://[user@]host/path| | | + +---------------------------------+----------------------------+------------+ + | FILE: | | | + | file:///* | file:///* | | + | file://localhost/* | file://localhost/* | | + +---------------------------------+----------------------------+------------+ + | FTP: (*3) | (*3) | | + | ftp://[user@]host/path | ftp://[user@]host/path | ftp (*2) | + | :Nread ftp://host/path | :Nwrite ftp://host/path | ftp+.netrc | + | :Nread host path | :Nwrite host path | ftp+.netrc | + | :Nread host uid pass path | :Nwrite host uid pass path | ftp | + +---------------------------------+----------------------------+------------+ + | HTTP: wget is executable: (*4) | | | + | http://[user@]host/path | Not Available | wget | + +---------------------------------+----------------------------+------------+ + | HTTP: fetch is executable (*4) | | | + | http://[user@]host/path | Not Available | fetch | + +---------------------------------+----------------------------+------------+ + | RCP: | | | + | rcp://[user@]host/path | rcp://[user@]host/path | rcp | + +---------------------------------+----------------------------+------------+ + | RSYNC: | | | + | rsync://[user@]host/path | rsync://[user@]host/path | rsync | + | :Nread rsync://host/path | :Nwrite rsync://host/path | rsync | + | :Nread rcp://host/path | :Nwrite rcp://host/path | rcp | + +---------------------------------+----------------------------+------------+ + | SCP: | | | + | scp://[user@]host/path | scp://[user@]host/path | scp | + | :Nread scp://host/path | :Nwrite scp://host/path | scp (*1) | + +---------------------------------+----------------------------+------------+ + | SFTP: | | | + | sftp://[user@]host/path | sftp://[user@]host/path | sftp | + | :Nread sftp://host/path | :Nwrite sftp://host/path | sftp (*1) | + +=================================+============================+============+ + + (*1) For an absolute path use scp://machine//path. + + (*2) if <.netrc> is present, it is assumed that it will + work with your ftp client. Otherwise the script will + prompt for user-id and password. + + (*3) for ftp, "machine" may be machine#port or machine:port + if a different port is needed than the standard ftp port + + (*4) for http:..., if wget is available it will be used. Otherwise, + if fetch is available it will be used. + +Both the :Nread and the :Nwrite ex-commands can accept multiple filenames. + + +NETRC *netrw-netrc* + +The <.netrc> file, typically located in your home directory, contains lines +therein which map a hostname (machine name) to the user id and password you +prefer to use with it. + +The typical syntax for lines in a <.netrc> file is given as shown below. +Ftp under Unix usually supports <.netrc>; ftp under Windows usually doesn't. +> + machine {full machine name} login {user-id} password "{password}" + default login {user-id} password "{password}" + +Your ftp client must handle the use of <.netrc> on its own, but if the +<.netrc> file exists, an ftp transfer will not ask for the user-id or +password. + + Note: + Since this file contains passwords, make very sure nobody else can + read this file! Most programs will refuse to use a .netrc that is + readable for others. Don't forget that the system administrator can + still read the file! Ie. for Linux/Unix: chmod 600 .netrc + + +PASSWORD *netrw-passwd* + +The script attempts to get passwords for ftp invisibly using |inputsecret()|, +a built-in Vim function. See |netrw-uidpass| for how to change the password +after one has set it. + +Unfortunately there doesn't appear to be a way for netrw to feed a password to +scp. Thus every transfer via scp will require re-entry of the password. +However, |netrw-ssh-hack| can help with this problem. + + +============================================================================== +5. Activation *netrw-activate* {{{1 + +Network-oriented file transfers are available by default whenever Vim's +|'nocompatible'| mode is enabled. Netrw's script files reside in your +system's plugin, autoload, and syntax directories; just the +plugin/netrwPlugin.vim script is sourced automatically whenever you bring up +vim. The main script in autoload/netrw.vim is only loaded when you actually +use netrw. I suggest that, at a minimum, you have at least the following in +your <.vimrc> customization file: > + + set nocp + if version >= 600 + filetype plugin indent on + endif +< + +============================================================================== +6. Transparent File Editing *netrw-transparent* {{{1 + +Transparent file transfers occur whenever a regular file read or write +(invoked via an |:autocmd| for |BufReadCmd|, |BufWriteCmd|, or |SourceCmd| +events) is made. Thus one may read, write, or source files across networks +just as easily as if they were local files! > + + vim ftp://[user@]machine/path + ... + :wq + +See |netrw-activate| for more on how to encourage your vim to use plugins +such as netrw. + + +============================================================================== +7. Ex Commands *netrw-ex* {{{1 + +The usual read/write commands are supported. There are also a few +additional commands available. Often you won't need to use Nwrite or +Nread as shown in |netrw-transparent| (ie. simply use > + :e url + :r url + :w url +instead, as appropriate) -- see |netrw-urls|. In the explanations +below, a {netfile} is an url to a remote file. + +:[range]Nw[rite] Write the specified lines to the current + file as specified in b:netrw_lastfile. + +:[range]Nw[rite] {netfile} [{netfile}]... + Write the specified lines to the {netfile}. + +:Nr[ead] Read the specified lines into the current + buffer from the file specified in + b:netrw_lastfile. + +:Nr[ead] {netfile} {netfile}... + Read the {netfile} after the current line. + +:Ns[ource] {netfile} + Source the {netfile}. + To start up vim using a remote .vimrc, one may use + the following (all on one line) (tnx to Antoine Mechelynck) > + vim -u NORC -N + --cmd "runtime plugin/netrwPlugin.vim" + --cmd "source scp://HOSTNAME/.vimrc" +< *netrw-uidpass* +:call NetUserPass() + If g:netrw_uid and s:netrw_passwd don't exist, + this function will query the user for them. + +:call NetUserPass("userid") + This call will set the g:netrw_uid and, if + the password doesn't exist, will query the user for it. + +:call NetUserPass("userid","passwd") + This call will set both the g:netrw_uid and s:netrw_passwd. + The user-id and password are used by ftp transfers. One may + effectively remove the user-id and password by using empty + strings (ie. ""). + +:NetrwSettings This command is described in |netrw-settings| -- used to + display netrw settings and change netrw behavior. + + +============================================================================== +8. Variables and Options *netrw-options* *netrw-var* {{{1 + +(if you're interested in the netrw browser settings, see: |netrw-browser-var|) + +The <netrw.vim> script provides several variables which act as options to +affect <netrw.vim>'s file transfer behavior. These variables typically may be +set in the user's <.vimrc> file: (see also |netrw-settings| |netrw-protocol|) + +> + + ------------- + Netrw Options + ------------- + Option Meaning + -------------- ----------------------------------------------- +< + b:netrw_col Holds current cursor position (during NetWrite) + g:netrw_cygwin =1 assume scp under windows is from cygwin + (default/windows) + =0 assume scp under windows accepts windows + style paths (default/else) + g:netrw_ftp =0 use default ftp (uid password) + g:netrw_ftpmode ="binary" (default) + ="ascii" (your choice) + g:netrw_ignorenetrc =1 (default) + if you have a <.netrc> file but you don't + want it used, then set this variable. Its + mere existence is enough to cause <.netrc> + to be ignored. + b:netrw_lastfile Holds latest method/machine/path. + b:netrw_line Holds current line number (during NetWrite) + g:netrw_passwd Holds current password for ftp. + g:netrw_silent =0 transfers done normally + =1 transfers done silently + g:netrw_uid Holds current user-id for ftp. + =1 use alternate ftp (user uid password) + (see |netrw-options|) + g:netrw_use_nt_rcp =0 don't use WinNT/2K/XP's rcp (default) + =1 use WinNT/2K/XP's rcp, binary mode + g:netrw_win95ftp =0 use unix-style ftp even if win95/98/ME/etc + =1 use default method to do ftp > + ----------------------------------------------------------------------- +< +The script will also make use of the following variables internally, albeit +temporarily. +> + ------------------- + Temporary Variables + ------------------- + Variable Meaning + -------- ------------------------------------ +< + g:netrw_method Index indicating rcp/ftp+.netrc/ftp + g:netrw_machine Holds machine name parsed from input + g:netrw_fname Holds filename being accessed > + ------------------------------------------------------------ +< + *netrw-protocol* + +Netrw supports a number of protocols. These protocols are invoked using the +variables listed below, and may be modified by the user. +> + ------------------------ + Protocol Control Options + ------------------------ + Option Type Setting Meaning + --------- -------- -------------- --------------------------- +< + netrw_ftp variable =doesn't exist userid set by "user userid" + =0 userid set by "user userid" + =1 userid set by "userid" + NetReadFixup function =doesn't exist no change + =exists Allows user to have files + read via ftp automatically + transformed however they wish + by NetReadFixup() + g:netrw_dav_cmd variable ="cadaver" + g:netrw_fetch_cmd variable ="fetch -o" if fetch is available + g:netrw_ftp_cmd variable ="ftp" + g:netrw_http_cmd variable ="fetch -o" if fetch is available + g:netrw_http_cmd variable ="wget -O" else if wget is available + g:netrw_list_cmd variable ="ssh USEPORT HOSTNAME ls -Fa" + g:netrw_rcp_cmd variable ="rcp" + g:netrw_rsync_cmd variable ="rsync -a" + g:netrw_scp_cmd variable ="scp -q" + g:netrw_sftp_cmd variable ="sftp" > + ------------------------------------------------------------------------- +< + *netrw-ftp* + +The g:netrw_..._cmd options (|g:netrw_ftp_cmd| and |g:netrw_sftp_cmd|) +specify the external program to use handle the ftp protocol. They may +include command line options (such as -p for passive mode). + +Browsing is supported by using the |g:netrw_list_cmd|; the substring +"HOSTNAME" will be changed via substitution with whatever the current request +is for a hostname. + +Two options (|g:netrw_ftp| and |netrw-fixup|) both help with certain ftp's +that give trouble . In order to best understand how to use these options if +ftp is giving you troubles, a bit of discussion is provided on how netrw does +ftp reads. + +For ftp, netrw typically builds up lines of one of the following formats in a +temporary file: +> + IF g:netrw_ftp !exists or is not 1 IF g:netrw_ftp exists and is 1 + ---------------------------------- ------------------------------ +< + open machine [port] open machine [port] + user userid password userid password + [g:netrw_ftpmode] password + [g:netrw_extracmd] [g:netrw_ftpmode] + get filename tempfile [g:netrw_extracmd] + get filename tempfile > + --------------------------------------------------------------------- +< +The |g:netrw_ftpmode| and |g:netrw_extracmd| are optional. + +Netrw then executes the lines above by use of a filter: +> + :%! {g:netrw_ftp_cmd} -i [-n] +< +where + g:netrw_ftp_cmd is usually "ftp", + -i tells ftp not to be interactive + -n means don't use netrc and is used for Method #3 (ftp w/o <.netrc>) + +If <.netrc> exists it will be used to avoid having to query the user for +userid and password. The transferred file is put into a temporary file. +The temporary file is then read into the main editing session window that +requested it and the temporary file deleted. + +If your ftp doesn't accept the "user" command and immediately just demands a +userid, then try putting "let netrw_ftp=1" in your <.vimrc>. + + *netrw-cadaver* +To handle the SSL certificate dialog for untrusted servers, one may pull +down the certificate and place it into /usr/ssl/cert.pem. This operation +renders the server treatment as "trusted". + + *netrw-fixup* *netreadfixup* +If your ftp for whatever reason generates unwanted lines (such as AUTH +messages) you may write a NetReadFixup(tmpfile) function: +> + function! NetReadFixup(method,line1,line2) + " a:line1: first new line in current file + " a:line2: last new line in current file + if a:method == 1 "rcp + elseif a:method == 2 "ftp + <.netrc> + elseif a:method == 3 "ftp + machine,uid,password,filename + elseif a:method == 4 "scp + elseif a:method == 5 "http/wget + elseif a:method == 6 "dav/cadaver + elseif a:method == 7 "rsync + elseif a:method == 8 "fetch + elseif a:method == 9 "sftp + else " complain + endif + endfunction +> +The NetReadFixup() function will be called if it exists and thus allows you to +customize your reading process. As a further example, <netrw.vim> contains +just such a function to handle Windows 95 ftp. For whatever reason, Windows +95's ftp dumps four blank lines at the end of a transfer, and so it is +desirable to automate their removal. Here's some code taken from <netrw.vim> +itself: +> + if has("win95") && g:netrw_win95ftp + fun! NetReadFixup(method, line1, line2) + if method == 3 " ftp (no <.netrc>) + let fourblanklines= line2 - 3 + silent fourblanklines.",".line2."g/^\s*/d" + endif + endfunction + endif +> + +============================================================================== +9. Browsing *netrw-browsing* *netrw-browse* *netrw-help* {{{1 + *netrw-browser* *netrw-dir* *netrw-list* + +INTRODUCTION TO BROWSING *netrw-intro-browse* {{{2 + (Quick References: |netrw-quickmaps| |netrw-quickcoms|) + +Netrw supports the browsing of directories on your local system and on remote +hosts; browsing includes listing files and directories, entering directories, +editing files therein, deleting files/directories, making new directories, +moving (renaming) files and directories, copying files and directories, etc. +One may mark files and execute any system command on them! The Netrw browser +generally implements the previous explorer's maps and commands for remote +directories, although details (such as pertinent global variable names) +necessarily differ. To browse a directory, simply "edit" it! > + + vim /your/directory/ + vim . + vim c:\your\directory\ +< +(Related topics: |netrw-cr| |netrw-o| |netrw-p| |netrw-P| |netrw-t| + |netrw-mf| |netrw-mx| |netrw-D| |netrw-R| |netrw-v| ) + +The Netrw remote file and directory browser handles two protocols: ssh and +ftp. The protocol in the url, if it is ftp, will cause netrw also to use ftp +in its remote browsing. Specifying any other protocol will cause it to be +used for file transfers; but the ssh protocol will be used to do remote +browsing. + +To use Netrw's remote directory browser, simply attempt to read a "file" with +a trailing slash and it will be interpreted as a request to list a directory: +> + vim [protocol]://[user@]hostname/path/ +< +where [protocol] is typically scp or ftp. As an example, try: > + + vim ftp://ftp.home.vim.org/pub/vim/ +< +For local directories, the trailing slash is not required. Again, because its +easy to miss: to browse remote directories, the url must terminate with a +slash! + +If you'd like to avoid entering the password repeatedly for remote directory +listings with ssh or scp, see |netrw-ssh-hack|. To avoid password entry with +ftp, see |netrw-netrc| (if your ftp supports it). + +There are several things you can do to affect the browser's display of files: + + * To change the listing style, press the "i" key (|netrw-i|). + Currently there are four styles: thin, long, wide, and tree. + + * To hide files (don't want to see those xyz~ files anymore?) see + |netrw-ctrl-h|. + + * Press s to sort files by name, time, or size. + +See |netrw-browse-cmds| for all the things you can do with netrw! + + +QUICK HELP *netrw-quickhelp* {{{2 + (Use ctrl-] to select a topic)~ + Intro to Browsing...............................|netrw-intro-browse| + Quick Reference: Maps.........................|netrw-quickmap| + Quick Reference: Commands.....................|netrw-browse-cmds| + Hiding + Edit hiding list..............................|netrw-ctrl-h| + Hiding Files or Directories...................|netrw-a| + Hiding/Unhiding by suffix.....................|netrw-mh| + Hiding dot-files.............................|netrw-gh| + Listing Style + Select listing style (thin/long/wide/tree)....|netrw-i| + Associated setting variable...................|g:netrw_liststyle| + Shell command used to perform listing.........|g:netrw_list_cmd| + Quick file info...............................|netrw-qf| + Sorted by + Select sorting style (name/time/size).........|netrw-s| + Editing the sorting sequence..................|netrw-S| + Sorting options...............................|g:netrw_sort_options| + Associated setting variable...................|g:netrw_sort_sequence| + Reverse sorting order.........................|netrw-r| + + + *netrw-quickmap* *netrw-quickmaps* +QUICK REFERENCE: MAPS *netrw-browse-maps* {{{2 +> + --- ----------------- ---- + Map Quick Explanation Link + --- ----------------- ---- +< <F1> Causes Netrw to issue help + <cr> Netrw will enter the directory or read the file |netrw-cr| + <del> Netrw will attempt to remove the file/directory |netrw-del| + - Makes Netrw go up one directory |netrw--| + a Toggles between normal display, |netrw-a| + hiding (suppress display of files matching g:netrw_list_hide) + showing (display only files which match g:netrw_list_hide) + c Make browsing directory the current directory |netrw-c| + d Make a directory |netrw-d| + D Attempt to remove the file(s)/directory(ies) |netrw-D| + gb Go to previous bookmarked directory |netrw-gb| + gh Quick hide/unhide of dot-files |netrw-gh| + gi Display information on file |netrw-qf| + <c-h> Edit file hiding list |netrw-ctrl-h| + i Cycle between thin, long, wide, and tree listings |netrw-i| + <c-l> Causes Netrw to refresh the directory listing |netrw-ctrl-l| + mb Bookmark current directory |netrw-mb| + mc Copy marked files to marked-file target directory |netrw-mc| + md Apply diff to marked files (up to 3) |netrw-md| + me Place marked files on arg list and edit them |netrw-me| + mf Mark a file |netrw-mf| + mh Toggle marked file suffices' presence on hiding list |netrw-mh| + mm Move marked files to marked-file target directory |netrw-mm| + mp Print marked files |netrw-mp| + mr Mark files satisfying a |regexp| |netrw-mr| + mt Current browsing directory becomes markfile target |netrw-mt| + mT Apply ctags to marked files |netrw-mT| + mu Unmark all marked files |netrw-mu| + mx Apply arbitrary shell command to marked files |netrw-mx| + mz Compress/decompress marked files |netrw-mz| + o Enter the file/directory under the cursor in a new |netrw-o| + browser window. A horizontal split is used. + O Obtain a file specified by cursor |netrw-O| + p Preview the file |netrw-p| + P Browse in the previously used window |netrw-P| + q List bookmarked directories and history |netrw-qb| + r Reverse sorting order |netrw-r| + R Rename the designed file(s)/directory(ies) |netrw-R| + s Select sorting style: by name, time, or file size |netrw-s| + S Specify suffix priority for name-sorting |netrw-S| + t Enter the file/directory under the cursor in a new tab|netrw-t| + u Change to recently-visited directory |netrw-u| + U Change to subsequently-visited directory |netrw-U| + v Enter the file/directory under the cursor in a new |netrw-v| + browser window. A vertical split is used. + x View file with an associated program |netrw-x| + + % Open a new file in netrw's current directory |netrw-%| + + <leftmouse> (gvim only) selects word under mouse as if a <cr> + had been pressed (ie. edit file, change directory) + <middlemouse> (gvim only) same as P selecting word under mouse; + see |netrw-P| + <rightmouse> (gvim only) delete file/directory using word under + mouse + <2-leftmouse> (gvim only) when: + * in a netrw-selected file, AND + * |g:netrw_retmap| == 1 AND + * the user doesn't already have a <2-leftmouse> mapping + defined before netrw is autoloaded, + then a double clicked leftmouse button will return + to the netrw browser window. + <s-leftmouse> (gvim only) like mf, will mark files + + *netrw-quickcom* *netrw-quickcoms* +QUICK REFERENCE: COMMANDS *netrw-explore-cmds* *netrw-browse-cmds* {{{2 + :NetrwClean[!] ...........................................|netrw-clean| + :NetrwSettings ...........................................|netrw-settings| + :Explore[!] [dir] Explore directory of current file......|netrw-explore| + :Hexplore[!] [dir] Horizontal Split & Explore.............|netrw-explore| + :Nexplore[!] [dir] Vertical Split & Explore...............|netrw-explore| + :Pexplore[!] [dir] Vertical Split & Explore...............|netrw-explore| + :Rexplore Return to Explorer.....................|netrw-explore| + :Sexplore[!] [dir] Split & Explore directory .............|netrw-explore| + :Texplore[!] [dir] Tab & Explore..........................|netrw-explore| + :Vexplore[!] [dir] Vertical Split & Explore...............|netrw-explore| + +BOOKMARKING A DIRECTORY *netrw-mb* *netrw-bookmark* *netrw-bookmarks* {{{2 +One may easily "bookmark" a directory by using > + + {cnt}mb +< +Any count may be used. One may use viminfo's "!" option (|'viminfo'|) to +retain bookmarks between vim sessions. See |netrw-gb| for how to return +to a bookmark and |netrw-qb| for how to list them. + + +BROWSING *netrw-cr* {{{2 + +Browsing is simple: move the cursor onto a file or directory of interest. +Hitting the <cr> (the return key) will select the file or directory. +Directories will themselves be listed, and files will be opened using the +protocol given in the original read request. + + CAVEAT: There are four forms of listing (see |netrw-i|). Netrw assumes that + two or more spaces delimit filenames and directory names for the long and + wide listing formats. Thus, if your filename or directory name has two or + more sequential spaces embedded in it, or any trailing spaces, then you'll + need to use the "thin" format to select it. + +The |g:netrw_browse_split| option, which is zero by default, may be used to +cause the opening of files to be done in a new window or tab instead of the +default. When the option is one or two, the splitting will be taken +horizontally or vertically, respectively. When the option is set to three, a +<cr> will cause the file to appear in a new tab. + + +When using the gui (gvim) one may select a file by pressing the <leftmouse> +button. In addtion, if + + *|g:netrw_retmap| == 1 AND (its default value is 0) + * in a netrw-selected file, AND + * the user doesn't already have a <2-leftmouse> mapping defined before + netrw is loaded + +then a doubly-clicked leftmouse button will return to the netrw browser +window. + +Netrw attempts to speed up browsing, especially for remote browsing where one +may have to enter passwords, by keeping and re-using previously obtained +directory listing buffers. The |g:netrw_fastbrowse| variable is used to +control this behavior; one may have slow browsing (no buffer re-use), medium +speed browsing (re-use directory buffer listings only for remote directories), +and fast browsing (re-use directory buffer listings as often as possible). +The price for such re-use is that when changes are made (such as new files +are introduced into a directory), the listing may become out-of-date. One may +always refresh directory listing buffers by pressing ctrl-L (see +|netrw-ctrl-l|). + + +Related topics: |netrw-o| |netrw-p| |netrw-P| |netrw-t| |netrw-v| +Associated setting variables: |g:netrw_browse_split| |g:netrw_fastbrowse| + |g:netrw_ftp_list_cmd| |g:netrw_ftp_sizelist_cmd| + |g:netrw_ftp_timelist_cmd| |g:netrw_ssh_cmd| + |g:netrw_ssh_browse_reject| |g:netrw_use_noswf| + + +BROWSING WITH A HORIZONTALLY SPLIT WINDOW *netrw-o* *netrw-horiz* {{{2 + +Normally one enters a file or directory using the <cr>. However, the "o" map +allows one to open a new window to hold the new directory listing or file. A +horizontal split is used. (for vertical splitting, see |netrw-v|) + +Normally, the o key splits the window horizontally with the new window and +cursor at the top. To change to splitting the window horizontally with the +new window and cursor at the bottom, have + + let g:netrw_alto = 1 + +in your <.vimrc>. (also see |netrw-t| |netrw-v|) + +There is only one tree listing buffer; using "o" on a displayed subdirectory +will split the screen, but the same buffer will be shown twice. + +Associated setting variables: |g:netrw_alto| |g:netrw_winsize| + + +BROWSING WITH A NEW TAB *netrw-t* {{{2 + +Normally one enters a file or directory using the <cr>. The "t" map +allows one to open a new window hold the new directory listing or file in a +new tab. (also see: |netrw-o| |netrw-v|) + + +BROWSING WITH A VERTICALLY SPLIT WINDOW *netrw-v* {{{2 + +Normally one enters a file or directory using the <cr>. However, the "v" map +allows one to open a new window to hold the new directory listing or file. A +vertical split is used. (for horizontal splitting, see |netrw-o|) + +Normally, the v key splits the window vertically with the new window and +cursor at the left. To change to splitting the window vertically with the new +window and cursor at the right, have + + let g:netrw_altv = 1 + +in your <.vimrc>. (also see: |netrw-o| |netrw-t|) + +There is only one tree listing buffer; using "v" on a displayed subdirectory +will split the screen, but the same buffer will be shown twice. + +Associated setting variable: |g:netrw_altv| |g:netrw_winsize| + +CHANGE LISTING STYLE *netrw-i* {{{2 + +The "i" map cycles between the thin, long, wide, and tree listing formats. + +The short listing format gives just the files' and directories' names. + +The long listing is either based on the "ls" command via ssh for remote +directories or displays the filename, file size (in bytes), and the time and +date of last modification for local directories. With the long listing +format, netrw is not able to recognize filenames which have trailing spaces. +Use the thin listing format for such files. + +The wide listing format uses two or more contiguous spaces to delineate +filenames; when using that format, netrw won't be able to recognize or use +filenames which have two or more contiguous spaces embedded in the name or any +trailing spaces. The thin listing format will, however, work with such files. +This listing format is the most compact. + +The tree listing format has a top directory followed by files and directories +preceded by a "|". One may open and close directories by pressing the <cr> +key while atop the directory name. There is only one tree listing buffer; +hence, using "v" or "o" on a subdirectory will only show the same buffer, +twice. + +Associated setting variables: |g:netrw_liststyle| |g:netrw_maxfilenamelen| + |g:netrw_timefmt| |g:netrw_list_cmd| + + +CHANGING TO A BOOKMARKED DIRECTORY *netrw-gb* {{{2 + +To change directory back to a bookmarked directory, use + + {cnt}gb + +Any count may be used to reference any of the bookmarks. See |netrw-mb| on +how to bookmark a directory and |netrw-qb| on how to list bookmarks. + + +CHANGING TO A PREDECESSOR DIRECTORY *netrw-u* *netrw-updir* {{{2 + +Every time you change to a new directory (new for the current session), +netrw will save the directory in a recently-visited directory history +list (unless g:netrw_dirhistmax is zero; by default, it's ten). With the +"u" map, one can change to an earlier directory (predecessor). To do +the opposite, see |netrw-U|. + + +CHANGING TO A SUCCESSOR DIRECTORY *netrw-U* *netrw-downdir* {{{2 + +With the "U" map, one can change to a later directory (successor). +This map is the opposite of the "u" map. (see |netrw-u|) Use the +q map to list both the bookmarks and history. (see |netrw-qb|) + + +NETRW CLEAN *netrw-clean* *:NetrwClean* + +With :NetrwClean one may easily remove netrw from one's home directory; +more precisely, from the first directory on your |'runtimepath'|. + +With :NetrwClean!, netrw will remove netrw from all directories on your +|'runtimepath'|. + +With either form of the command, netrw will first ask for confirmation +that the removal is in fact what you want to do. If netrw doesn't have +permission to remove a file, it will issue an error message. + + *netrw-gx* +CUSTOMIZING BROWSING WITH A USER FUNCTION *netrw-x* *netrw-handler* {{{2 + (also see |netrw_filehandler|) + +Certain files, such as html, gif, jpeg, (word/office) doc, etc, files, are +best seen with a special handler (ie. a tool provided with your computer). +Netrw allows one to invoke such special handlers by: > + + * when Exploring, hit the "x" key + * when editing, hit gx with the cursor atop the special filename +< (not available if the |g:netrw_nogx| variable exists) + +Netrw determines which special handler by the following method: + + * if |g:netrw_browsex_viewer| exists, then it will be used to attempt to + view files. Examples of useful settings (place into your <.vimrc>): > + + :let g:netrw_browsex_viewer= "kfmclient exec" +< or > + :let g:netrw_browsex_viewer= "gnome-open" +< + If g:netrw_browsex_viewer == '-', then netrwFileHandler() will be + invoked first (see |netrw_filehandler|). + + * for Windows 32 or 64, the url and FileProtocolHandler dlls are used. + * for Gnome (with gnome-open): gnome-open is used. + * for KDE (with kfmclient) : kfmclient is used. + * for Mac OS X : open is used. + * otherwise the netrwFileHandler plugin is used. + +The file's suffix is used by these various approaches to determine an +appropriate application to use to "handle" these files. Such things as +OpenOffice (*.sfx), visualization (*.jpg, *.gif, etc), and PostScript (*.ps, +*.eps) can be handled. + + *netrw_filehandler* + +The "x" map applies a function to a file, based on its extension. Of course, +the handler function must exist for it to be called! +> + Ex. mypgm.html x -> + NFH_html("scp://user@host/some/path/mypgm.html") +< +Users may write their own netrw File Handler functions to support more +suffixes with special handling. See <plugin/netrwFileHandlers.vim> for +examples on how to make file handler functions. As an example: > + + " NFH_suffix(filename) + fun! NFH_suffix(filename) + ..do something special with filename.. + endfun +< +These functions need to be defined in some file in your .vim/plugin +(vimfiles\plugin) directory. Vim's function names may not have punctuation +characters (except for the underscore) in them. To support suffices that +contain such characters, netrw will first convert the suffix using the +following table: > + + @ -> AT ! -> EXCLAMATION % -> PERCENT + : -> COLON = -> EQUAL ? -> QUESTION + , -> COMMA - -> MINUS ; -> SEMICOLON + $ -> DOLLAR + -> PLUS ~ -> TILDE +< +So, for example: > + + file.rcs,v -> NFH_rcsCOMMAv() +< +If more such translations are necessary, please send me email: > + NdrOchip at ScampbellPfamily.AbizM - NOSPAM +with a request. + +Associated setting variable: |g:netrw_browsex_viewer| + + *netrw-curdir* +DELETING FILES OR DIRECTORIES *netrw-delete* *netrw-D* *netrw-del* {{{2 + +If files have not been marked with |netrw-mf|: (local marked file list) + + Deleting/removing files and directories involves moving the cursor to the + file/directory to be deleted and pressing "D". Directories must be empty + first before they can be successfully removed. If the directory is a + softlink to a directory, then netrw will make two requests to remove the + directory before succeeding. Netrw will ask for confirmation before doing + the removal(s). You may select a range of lines with the "V" command + (visual selection), and then pressing "D". + +If files have been marked with |netrw-mf|: (local marked file list) + + Marked files (and empty directories) will be deleted; again, you'll be + asked to confirm the deletion before it actually takes place. + +The |g:netrw_rm_cmd|, |g:netrw_rmf_cmd|, and |g:netrw_rmdir_cmd| variables are +used to control the attempts to remove files and directories. The +g:netrw_rm_cmd is used with files, and its default value is: + + g:netrw_rm_cmd: ssh HOSTNAME rm + +The g:netrw_rmdir_cmd variable is used to support the removal of directories. +Its default value is: + + g:netrw_rmdir_cmd: ssh HOSTNAME rmdir + +If removing a directory fails with g:netrw_rmdir_cmd, netrw then will attempt +to remove it again using the g:netrw_rmf_cmd variable. Its default value is: + + g:netrw_rmf_cmd: ssh HOSTNAME rm -f + +Associated setting variable: |g:netrw_local_rmdir| |g:netrw_rm_cmd| + |g:netrw_rmdir_cmd| |g:netrw_ssh_cmd| + + +*netrw-explore* *netrw-hexplore* *netrw-nexplore* *netrw-pexplore* +*netrw-rexplore* *netrw-sexplore* *netrw-texplore* *netrw-vexplore* +DIRECTORY EXPLORATION COMMANDS {{{2 + + :Explore[!] [dir]... Explore directory of current file *:Explore* + :Hexplore[!] [dir]... Horizontal Split & Explore *:Hexplore* + :Rexplore ... Return to Explorer *:Rexplore* + :Sexplore[!] [dir]... Split&Explore directory of current file *:Sexplore* + :Texplore [dir]... Tab & Explore *:Texplore* + :Vexplore[!] [dir]... Vertical Split & Explore *:Vexplore* + + Used with :Explore **/pattern : (also see |netrw-starstar|) + :Nexplore............. go to next matching file *:Nexplore* + :Pexplore............. go to previous matching file *:Pexplore* + +:Explore will open the local-directory browser on the current file's + directory (or on directory [dir] if specified). The window will be + split only if the file has been modified, otherwise the browsing + window will take over that window. Normally the splitting is taken + horizontally. +:Explore! is like :Explore, but will use vertical splitting. +:Sexplore will always split the window before invoking the local-directory + browser. As with Explore, the splitting is normally done + horizontally. +:Sexplore! [dir] is like :Sexplore, but the splitting will be done vertically. +:Hexplore [dir] does an :Explore with |:belowright| horizontal splitting. +:Hexplore! [dir] does an :Explore with |:aboveleft| horizontal splitting. +:Vexplore [dir] does an :Explore with |:leftabove| vertical splitting. +:Vexplore! [dir] does an :Explore with |:rightbelow| vertical splitting. +:Texplore [dir] does a tabnew before generating the browser window + +By default, these commands use the current file's directory. However, one +may explicitly provide a directory (path) to use. + +The |g:netrw_winsize| variable also is used, if specified by the user, to +size Hexplore and Vexplore windows. + +:Rexplore This command is a little different from the others. When one + edits a file, for example by pressing <cr> when atop a file in + a netrw browser window, :Rexplore will return the display to + that of the last netrw browser window. Its a command version + of <2-leftmouse> (which is only available under gvim and + cooperative terms). + + +*netrw-star* *netrw-starpat* *netrw-starstar* *netrw-starstarpat* +EXPLORING WITH STARS AND PATTERNS + +When Explore, Sexplore, Hexplore, or Vexplore are used with one of the +following four styles, Explore generates a list of files which satisfy +the request. > + + */filepat files in current directory which satisfy filepat + **/filepat files in current directory or below which satisfy the + file pattern + *//pattern files in the current directory which contain the + pattern (vimgrep is used) + **//pattern files in the current directory or below which contain + the pattern (vimgrep is used) +< +The cursor will be placed on the first file in the list. One may then +continue to go to subsequent files on that list via |:Nexplore| or to +preceding files on that list with |:Pexplore|. Explore will update the +directory and place the cursor appropriately. + +A plain > + :Explore +will clear the explore list. + +If your console or gui produces recognizable shift-up or shift-down sequences, +then you'll likely find using shift-downarrow and shift-uparrow convenient. +They're mapped by netrw: + + <s-down> == Nexplore, and + <s-up> == Pexplore. + +As an example, consider +> + :Explore */*.c + :Nexplore + :Nexplore + :Pexplore +< +The status line will show, on the right hand side of the status line, a +message like "Match 3 of 20". + +Associated setting variables: |g:netrw_keepdir| |g:netrw_browse_split| + |g:netrw_fastbrowse| |g:netrw_ftp_browse_reject| + |g:netrw_ftp_list_cmd| |g:netrw_ftp_sizelist_cmd| + |g:netrw_ftp_timelist_cmd| |g:netrw_list_cmd| + |g:netrw_liststyle| + + +DISPLAYING INFORMATION ABOUT FILE *netrw-qf* {{{2 + +With the cursor atop a filename, pressing "qf" will reveal the file's size +and last modification timestamp. Currently this capability is only available +for local files. + + +EDIT FILE OR DIRECTORY HIDING LIST *netrw-ctrl-h* *netrw-edithide* {{{2 + +The "<ctrl-h>" map brings up a requestor allowing the user to change the +file/directory hiding list contained in |g:netrw_list_hide|. The hiding list +consists of one or more patterns delimited by commas. Files and/or +directories satisfying these patterns will either be hidden (ie. not shown) or +be the only ones displayed (see |netrw-a|). + +The "gh" mapping (see |netrw-gh|) quickly alternates between the usual +hiding list and the hiding of files or directories that begin with ".". + +Associated setting variables: |g:netrw_hide| |g:netrw_list_hide| +Associated topics: |netrw-a| |netrw-gh| |netrw-mh| + + +EDITING THE SORTING SEQUENCE *netrw-S* *netrw-sortsequence* {{{2 + +When "Sorted by" is name, one may specify priority via the sorting sequence +(g:netrw_sort_sequence). The sorting sequence typically prioritizes the +name-listing by suffix, although any pattern will do. Patterns are delimited +by commas. The default sorting sequence is (all one line): +> + '[\/]$,\.[a-np-z]$,\.h$,\.c$,\.cpp$,*,\.o$,\.obj$,\.info$, + \.swp$,\.bak$,\~$' +< +The lone * is where all filenames not covered by one of the other patterns +will end up. One may change the sorting sequence by modifying the +g:netrw_sort_sequence variable (either manually or in your <.vimrc>) or by +using the "S" map. + +Related topics: |netrw-s| |netrw-S| +Associated setting variables: |g:netrw_sort_sequence| |g:netrw_sort_options| + + +GOING UP *netrw--* {{{2 + +To go up a directory, press "-" or press the <cr> when atop the ../ directory +entry in the listing. + +Netrw will use the command in |g:netrw_list_cmd| to perform the directory +listing operation after changing HOSTNAME to the host specified by the +user-provided url. By default netrw provides the command as: + + ssh HOSTNAME ls -FLa + +where the HOSTNAME becomes the [user@]hostname as requested by the attempt to +read. Naturally, the user may override this command with whatever is +preferred. The NetList function which implements remote browsing +expects that directories will be flagged by a trailing slash. + + +HIDING FILES OR DIRECTORIES *netrw-a* *netrw-hiding* {{{2 + +Netrw's browsing facility allows one to use the hiding list in one of three +ways: ignore it, hide files which match, and show only those files which +match. + +If no files have been marked via |netrw-mf|: + +The "a" map allows the user to cycle through the three hiding modes. + +The |g:netrw_list_hide| variable holds a comma delimited list of patterns +based on regular expressions (ex. ^.*\.obj$,^\.) which specify the hiding list. +(also see |netrw-ctrl-h|) To set the hiding list, use the <c-h> map. As an +example, to hide files which begin with a ".", one may use the <c-h> map to +set the hiding list to '^\..*' (or one may put let g:netrw_list_hide= '^\..*' +in one's <.vimrc>). One may then use the "a" key to show all files, hide +matching files, or to show only the matching files. + + Example: \.[ch]$ + This hiding list command will hide/show all *.c and *.h files. + + Example: \.c$,\.h$ + This hiding list command will also hide/show all *.c and *.h + files. + +Don't forget to use the "a" map to select the mode (normal/hiding/show) you +want! + +If files have been marked using |netrw-mf|, then this command will: + + if showing all files or non-hidden files: + modify the g:netrw_list_hide list by appending the marked files to it + and showing only non-hidden files. + + else if showing hidden files only: + modify the g:netrw_list_hide list by removing the marked files from it + and showing only non-hidden files. + endif + + *netrw-gh* *netrw-hide* +As a quick shortcut, one may press > + gh +to toggle between hiding files which begin with a period (dot) and not hiding +them. + +Associated setting variable: |g:netrw_list_hide| +Associated topics: |netrw-a| |netrw-ctrl-h| |netrw-mh| + +IMPROVING BROWSING *netrw-listhack* *netrw-ssh-hack* {{{2 + +Especially with the remote directory browser, constantly entering the password +is tedious. + +For Linux/Unix systems, the book "Linux Server Hacks - 100 industrial strength +tips & tools" by Rob Flickenger (O'Reilly, ISBN 0-596-00461-3) gives a tip +for setting up no-password ssh and scp and discusses associated security +issues. It used to be available at http://hacks.oreilly.com/pub/h/66 , +but apparently that address is now being redirected to some "hackzine". +I'll attempt a summary based on that article and on a communication from +Ben Schmidt: + + 1. Generate a public/private key pair on the local machine + (ssh client): > + ssh-keygen -t rsa + (saving the file in ~/.ssh/id_rsa as prompted) +< + 2. Just hit the <CR> when asked for passphrase (twice) for no + passphrase. If you do use a passphrase, you will also need to use + ssh-agent so you only have to type the passphrase once per session. + If you don't use a passphrase, simply logging onto your local + computer or getting access to the keyfile in any way will suffice + to access any ssh servers which have that key authorized for login. + + 3. This creates two files: > + ~/.ssh/id_rsa + ~/.ssh/id_rsa.pub +< + 4. On the target machine (ssh server): > + cd + mkdir -p .ssh + chmod 0700 .ssh +< + 5. On your local machine (ssh client): (one line) > + ssh {serverhostname} + cat '>>' '~/.ssh/authorized_keys2' < ~/.ssh/id_rsa.pub +< + or, for OpenSSH, (one line) > + ssh {serverhostname} + cat '>>' '~/.ssh/authorized_keys' < ~/.ssh/id_rsa.pub +< +You can test it out with > + ssh {serverhostname} +and you should be log onto the server machine without further need to type +anything. + +If you decided to use a passphrase, do: > + ssh-agent $SHELL + ssh-add + ssh {serverhostname} +You will be prompted for your key passphrase when you use ssh-add, but not +subsequently when you use ssh. For use with vim, you can use > + ssh-agent vim +and, when next within vim, use > + :!ssh-add +Alternatively, you can apply ssh-agent to the terminal you're planning on +running vim in: > + ssh-agent xterm & +and do ssh-add whenever you need. + +For Windows, folks on the vim mailing list have mentioned that Pageant helps +with avoiding the constant need to enter the password. + +Kingston Fung wrote about another way to avoid constantly needing to enter +passwords: + + In order to avoid the need to type in the password for scp each time, you + provide a hack in the docs to set up a non password ssh account. I found a + better way to do that: I can use a regular ssh account which uses a + password to access the material without the need to key-in the password + each time. It's good for security and convenience. I tried ssh public key + authorization + ssh-agent, implementing this, and it works! Here are two + links with instructions: + + http://www.ibm.com/developerworks/library/l-keyc2/ + http://sial.org/howto/openssh/publickey-auth/ + + +LISTING BOOKMARKS AND HISTORY *netrw-qb* *netrw-listbookmark* {{{2 + +Pressing "qb" (query bookmarks) will list the bookmarked directories and +directory traversal history (query). + +(see |netrw-mb|, |netrw-gb|, |netrw-u|, and |netrw-U|) + + +MAKING A NEW DIRECTORY *netrw-d* {{{2 + +With the "d" map one may make a new directory either remotely (which depends +on the global variable g:netrw_mkdir_cmd) or locally (which depends on the +global variable g:netrw_local_mkdir). Netrw will issue a request for the new +directory's name. A bare <CR> at that point will abort the making of the +directory. Attempts to make a local directory that already exists (as either +a file or a directory) will be detected, reported on, and ignored. + +Currently, making a directory via ftp is not supported. + +Associated setting variable: |g:netrw_local_mkdir| |g:netrw_mkdir_cmd| + + +MAKING THE BROWSING DIRECTORY THE CURRENT DIRECTORY *netrw-c* {{{2 + +By default, |g:netrw_keepdir| is 1. This setting means that the current +directory will not track the browsing directory. + +Setting g:netrw_keepdir to 0 tells netrw to make vim's current directory to +track netrw's browsing directory. + +However, given the default setting for g:netrw_keepdir of 1 where netrw +maintains its own separate notion of the current directory, in order to make +the two directories the same, use the "c" map (just type c). That map will +set Vim's notion of the current directory to netrw's current browsing +directory. + +Associated setting variable: |g:netrw_keepdir| + +MARKING FILES *netrw-mf* {{{2 + (also see |netrw-mr|) + +One may mark files with the cursor atop a filename and then pressing "mf". +With gvim, one may also mark files with <s-leftmouse>. The following netrw +maps make use of marked files: + + |netrw-a| Hide marked files/directories + |netrw-D| Delete marked files/directories + |netrw-mc| Copy marked files to target + |netrw-md| Apply vimdiff to marked files + |netrw-me| Edit marked files + |netrw-mg| Apply vimgrep to marked files + |netrw-mm| Move marked files + |netrw-mp| Print marked files + |netrw-mt| Set target for |netrw-mm| and |netrw-mc| + |netrw-mT| Generate tags using marked files + |netrw-mx| Apply shell command to marked files + |netrw-mz| Compress/Decompress marked files + |netrw-O| Obtain marked files + |netrw-R| Rename marked files + +One may unmark files one at a time the same way one marks them; ie. place +the cursor atop a marked file and press "mf". This process also works +with <s-leftmouse> using gvim. One may unmark all files by pressing +"mu" (see |netrw-mu|). + +*markfilelist* *global_markfilelist* *local_markfilelist* +All marked files are entered onto the global marked file list; there is only +one such list. In addition, every netrw buffer also has its own local marked +file list; since netrw buffers are associated with specific directories, this +means that each directory has its own local marked file list. The various +commands which operate on marked files use one or the other of the marked file +lists. + + +MARKING FILES BY REGULAR EXPRESSION *netrw-mr* {{{2 + (also see |netrw-mf|) + +One may also mark files by pressing "mr"; netrw will then issue a prompt, +"Enter regexp: ". You may then enter a regular expression such as \.c$ . +All files in the current directory will then be marked. Note that the +regular expressions are vim-style |regexp| ones, not shell ones. So +entering *.c probably isn't what you want! + + +MARKED FILES: ARBITRARY COMMAND *netrw-mx* {{{2 + (See |netrw-mf| and |netrw-mr| for how to mark files) + (uses the local marked-file list) + +Upon activation of the "mx" map, netrw will query the user for some (external) +command to be applied to all marked files. All "%"s in the command will be +substituted with the name of each marked file in turn. If no "%"s are in the +command, then the command will be followed by a space and a marked filename. + + +MARKED FILES: COMPRESSION AND DECOMPRESSION *netrw-mz* {{{2 + (See |netrw-mf| and |netrw-mr| for how to mark files) + (uses the local marked file list) + +If any marked files are compressed, then "mz" will decompress them. +If any marked files are decompressed, then "mz" will compress them +using the command specified by |g:netrw_compress|; by default, +that's "gzip". + +For decompression, netrw provides a |Dictionary| of suffices and their +associated decompressing utilities; see |g:netrw_decompress|. + +Associated setting variables: |g:netrw_compress| |g:netrw_decompress| + +MARKED FILES: COPYING *netrw-mc* {{{2 + (See |netrw-mf| and |netrw-mr| for how to mark files) + (Uses the global marked file list) + +Select a target directory with mt (|netrw-mt|). Then change directory, +select file(s) (see |netrw-mf|), and press "mc". + +Associated setting variable: |g:netrw_localcopycmd| |g:netrw_ssh_cmd| + +MARKED FILES: DIFF *netrw-md* {{{2 + (See |netrw-mf| and |netrw-mr| for how to mark files) + (uses the global marked file list) + +Use |vimdiff| to visualize difference between selected files (two or +three may be selected for this). Uses the global marked file list. + +MARKED FILES: EDITING *netrw-me* {{{2 + (See |netrw-mf| and |netrw-mr| for how to mark files) + (uses the global marked file list) + +This command will place the marked files on the |arglist| and commence +editing them. One may return the to explorer window with |:Rexplore|. + +MARKED FILES: GREP *netrw-mg* {{{2 + (See |netrw-mf| and |netrw-mr| for how to mark files) + (uses the global marked file list) + +This command will apply |:vimgrep| to the marked files. The command will ask +for the requested pattern; one may enter: > + /pattern/[g][j] + ! /pattern/[g][j] + pattern +< +MARKED FILES: HIDING AND UNHIDING BY SUFFIX *netrw-mh* {{{2 + (See |netrw-mf| and |netrw-mr| for how to mark files) + (uses the local marked file list) + +This command extracts the suffices of the marked files and toggles their +presence on the hiding list. Please note that marking the same suffix +this way multiple times will result in the suffix's presence being toggled +for each file (so an even quantity of marked files having the same suffix +is the same as not having bothered to select them at all). + +Related topics: |netrw-a| |g:netrw_list_hide| + +MARKED FILES: MOVING *netrw-mm* {{{2 + (See |netrw-mf| and |netrw-mr| for how to mark files) + (uses the global marked file list) + + WARNING: moving files is more dangerous than copying them. + A file being moved is first copied and then deleted; if the + copy operation fails and the delete succeeds, you will lose + the file. Either try things out with unimportant files + first or do the copy and then delete yourself using mc and D. + Use at your own risk! + +Select a target directory with mT (|netrw-mt|). Then change directory, +select file(s) (see |netrw-mf|), and press "mm". + +Associated setting variable: |g:netrw_localmovecmd| |g:netrw_ssh_cmd| + +MARKED FILES: PRINTING *netrw-mp* {{{2 + (See |netrw-mf| and |netrw-mr| for how to mark files) + (uses the local marked file list) + +Netrw will apply the |:hardcopy| command to marked files. What it does +is open each file in a one-line window, execute hardcopy, then close the +one-line window. + + +MARKED FILES: SOURCING *netrw-ms* {{{2 + (See |netrw-mf| and |netrw-mr| for how to mark files) + (uses the local marked file list) + +Netrw will source the marked files (using vim's |:source| command) + + +MARKED FILES: TAGGING *netrw-mT* {{{2 + (See |netrw-mf| and |netrw-mr| for how to mark files) + (uses the global marked file list) + +The "mt" mapping will apply the command in |g:netrw_ctags| (by default, its +"ctags") to marked files. For remote browsing, in order to create a tags file +netrw will use ssh (see |g:netrw_ssh_cmd|), and so ssh must be available for +this to work on remote systems. For your local system, see |ctags| on how to +get a version. I myself use hdrtags, currently available at +http://mysite.verizon.net/astronaut/src/index.html , and have > + + let g:netrw_ctags= "hdrtag" +< +in my <.vimrc>. + +When a remote set of files are tagged, the resulting tags file is "obtained"; +ie. a copy is transferred to the local system's directory. The local tags +file is then modified so that one may use it through the network. The +modification is concerns the names of the files in the tags; each filename is +preceded by the netrw-compatible url used to obtain it. When one subsequently +uses one of the go to tag actions (|tags|), the url will be used by netrw to +edit the desired file and go to the tag. + +Associated setting variables: |g:netrw_ctags| |g:netrw_ssh_cmd| + + +MARKED FILES: SETTING THE TARGET DIRECTORY *netrw-mt* {{{2 + (See |netrw-mf| and |netrw-mr| for how to mark files) + +Set the marked file copy/move-to target (see |netrw-mc| and |netrw-mm|): + + * if the cursor is atop a file name, then the netrw window's currently + displayed directory is used for the copy/move-to target. + + * also, if the cursor is in the banner, then the netrw window's currently + displayed directory is used for the copy/move-to target. + + * however, if the cursor is atop a directory name, then that directory is + used for the copy/move-to target + +There is only one copy/move-to target per vim session; ie. the target is a +script variable (see |s:var|) and is shared between all netrw windows (in an +instance of vim). + +MARKED FILES: UNMARKING *netrw-mu* {{{2 + (See |netrw-mf| and |netrw-mr| for how to mark files) + +The "mu" mapping will unmark all currently marked files. + + +NETRW BROWSER VARIABLES *netrw-browser-options* *netrw-browser-var* {{{2 + +(if you're interestd in the netrw file transfer settings, see |netrw-options|) + +The <netrw.vim> browser provides settings in the form of variables which +you may modify; by placing these settings in your <.vimrc>, you may customize +your browsing preferences. (see also: |netrw-settings|) +> + --- ----------- + Var Explanation + --- ----------- +< *g:netrw_alto* change from above splitting to below splitting + by setting this variable (see |netrw-o|) + default: =&sb (see |'sb'|) + + *g:netrw_altv* change from left splitting to right splitting + by setting this variable (see |netrw-v|) + default: =&spr (see |'spr'|) + + *g:netrw_browse_split* when browsing, <cr> will open the file by: + =0: re-using the same window + =1: horizontally splitting the window first + =2: vertically splitting the window first + =3: open file in new tab + =4: act like "P" (ie. open previous window) + + *g:netrw_browsex_viewer* specify user's preference for a viewer: > + "kfmclient exec" + "gnome-open" +< If > + "-" +< is used, then netrwFileHandler() will look for + a script/function to handle the given + extension. (see |netrw_filehandler|). + + *g:netrw_compress* ="gzip" + Will compress marked files with this + command + + *g:netrw_ctags* ="ctags" + The default external program used to create tags + + *g:netrw_cursorline* = 1 (default) + will use the |'cursorline'| local setting when + |g:netrw_liststyle| ==0 (thin listing) or + |g:netrw_liststyle| ==1 (long listing) or + |g:netrw_liststyle| ==3 (tree listing) + =0: off + =2: like ==1, but the wide listing gets both + cursorline and |'cursorcolumn'|locally set + (ie. doesn't affect the wide listing) + + *g:netrw_decompress* = { ".gz" : "gunzip" , + ".bz2" : "bunzip2" , + ".zip" : "unzip" , + ".tar" : "tar -xf"} + A dictionary mapping suffices to + decompression programs. + + *g:netrw_fastbrowse* =0: slow speed directory browsing; + never re-uses directory listings, + always obtains directory listings. + =1: medium speed directory browsing; + re-use directory listings only + when remote directory browsing. + (default value) + =2: fast directory browsing; + only obtains directory listings when the + directory hasn't been seen before + (or |netrw-ctrl-l| is used). + + Fast browsing retains old directory listing + buffers so that they don't need to be + re-acquired. This feature is especially + important for remote browsing. However, if + a file is introduced or deleted into or from + such directories, the old directory buffer + becomes out-of-date. One may always refresh + such a directory listing with |netrw-ctrl-l|. + This option gives the user the choice of + trading off accuracy (ie. up-to-date listing) + versus speed. + + *g:netrw_fname_escape* =' ?&;%' + Used on filenames before remote reading/writing + + *g:netrw_ftp_browse_reject* ftp can produce a number of errors and warnings + that can show up as "directories" and "files" + in the listing. This pattern is used to + remove such embedded messages. By default its + value is: + '^total\s\+\d\+$\| + ^Trying\s\+\d\+.*$\| + ^KERBEROS_V\d rejected\| + ^Security extensions not\| + No such file\| + : connect to address [0-9a-fA-F:]* + : No route to host$' + + *g:netrw_ftp_list_cmd* options for passing along to ftp for directory + listing. Defaults: + unix or g:netrw_cygwin set: : "ls -lF" + otherwise "dir" + + + *g:netrw_ftp_sizelist_cmd* options for passing along to ftp for directory + listing, sorted by size of file. + Defaults: + unix or g:netrw_cygwin set: : "ls -slF" + otherwise "dir" + + *g:netrw_ftp_timelist_cmd* options for passing along to ftp for directory + listing, sorted by time of last modification. + Defaults: + unix or g:netrw_cygwin set: : "ls -tlF" + otherwise "dir" + + *g:netrw_glob_escape* ='[]*?`{~$' + These characters in directory names are + escaped before applying glob() + + *g:netrw_hide* if true, the hiding list is used + default: =0 + + *g:netrw_keepdir* =1 (default) keep current directory immune from + the browsing directory. + =0 keep the current directory the same as the + browsing directory. + The current browsing directory is contained in + b:netrw_curdir (also see |netrw-c|) + + *g:netrw_list_cmd* command for listing remote directories + default: (if ssh is executable) + "ssh HOSTNAME ls -FLa" + + *g:netrw_liststyle* Set the default listing style: + = 0: thin listing (one file per line) + = 1: long listing (one file per line with time + stamp information and file size) + = 2: wide listing (multiple files in columns) + = 3: tree style listing + *g:netrw_list_hide* comma separated pattern list for hiding files + Patterns are regular expressions (see |regexp|) + Example: let g:netrw_list_hide= '.*\.swp$' + default: "" + + *g:netrw_localcopycmd* ="cp" Linux/Unix/MacOS/Cygwin + ="copy" Windows + Copies marked files (|netrw-mf|) to target + directory (|netrw-mt|, |netrw-mc|) + + *g:netrw_localmovecmd* ="mv" Linux/Unix/MacOS/Cygwin + ="move" Windows + Moves marked files (|netrw-mf|) to target + directory (|netrw-mt|, |netrw-mm|) + + *g:netrw_local_mkdir* command for making a local directory + default: "mkdir" + + *g:netrw_local_rmdir* remove directory command (rmdir) + default: "rmdir" + + *g:netrw_maxfilenamelen* =32 by default, selected so as to make long + listings fit on 80 column displays. + If your screen is wider, and you have file + or directory names longer than 32 bytes, + you may set this option to keep listings + columnar. + + *g:netrw_mkdir_cmd* command for making a remote directory + default: "ssh USEPORT HOSTNAME mkdir" + + *g:netrw_retmap* if it exists and is set to one, then + <2-leftmouse> will be mapped for easy + return to the netrw browser window. + (example: click once to select and open + a file, double-click to return) + default: =0 + + *g:netrw_rm_cmd* command for removing files + default: "ssh USEPORT HOSTNAME rm" + + *g:netrw_rmdir_cmd* command for removing directories + default: "ssh USEPORT HOSTNAME rmdir" + + *g:netrw_rmf_cmd* command for removing softlinks + default: "ssh USEPORT HOSTNAME rm -f" + + *g:netrw_sort_by* sort by "name", "time", or "size" + default: "name" + + *g:netrw_sort_direction* sorting direction: "normal" or "reverse" + default: "normal" + + *g:netrw_sort_options* sorting is done using |:sort|; this + variable's value is appended to the + sort command. Thus one may ignore case, + for example, with the following in your + .vimrc: > + let g:netrw_sort_options="i" +< default: "" + + *g:netrw_sort_sequence* when sorting by name, first sort by the + comma-separated pattern sequence + default: '[\/]$,*,\.bak$,\.o$,\.h$, + \.info$,\.swp$,\.obj$' + + *g:netrw_special_syntax* If true, then certain files will be shown + in special syntax in the browser: + + netrwBak : *.bak + netrwCompress: *.gz *.bz2 *.Z *.zip + netrwData : *.dat + netrwHdr : *.h + netrwLib : *.a *.so *.lib *.dll + netrwMakefile: [mM]akefile *.mak + netrwObj : *.o *.obj + netrwTags : tags ANmenu ANtags + netrwTilde : *~ + netrwTmp : tmp* *tmp + + These syntax highlighting groups are linked + to Folded or DiffChange by default + (see |hl-Folded| and |hl-DiffChange|), but + one may put lines like > + hi link netrwCompress Visual +< into one's <.vimrc> to use one's own + preferences. + + *g:netrw_ssh_cmd* One may specify an executable command + to use instead of ssh for remote actions + such as listing, file removal, etc. + default: ssh + + *g:netrw_ssh_browse_reject* ssh can sometimes produce unwanted lines, + messages, banners, and whatnot that one doesn't + want masquerading as "directories" and "files". + Use this pattern to remove such embedded + messages. By default its value is: + '^total\s\+\d\+$' + + + *g:netrw_tmpfile_escape* =' &;' + escape() is applied to all temporary files + to escape these characters. + + *g:netrw_timefmt* specify format string to vim's strftime(). + The default, "%c", is "the preferred date + and time representation for the current + locale" according to my manpage entry for + strftime(); however, not all are satisfied + with it. Some alternatives: + "%a %d %b %Y %T", + " %a %Y-%m-%d %I-%M-%S %p" + default: "%c" + + *g:netrw_use_noswf* netrw normally avoids writing swapfiles + for browser buffers. However, under some + systems this apparently is causing nasty + ml_get errors to appear; if you're getting + ml_get errors, try putting + let g:netrw_use_noswf= 0 + in your .vimrc. + + *g:netrw_winsize* specify initial size of new windows made with + "o" (see |netrw-o|), "v" (see |netrw-v|), + |:Hexplore| or |:Vexplore|. + default: "" + + *g:netrw_xstrlen* Controls how netrw computes a string + including multi-byte characters' string + length. (thanks to N Weibull, T Mechelynck) + =0: uses Vim's built-in strlen() + =1: number of codepoints (Latin + a combining + circumflex is two codepoints) (DEFAULT) + =2: number of spacing codepoints (Latin a + + combining circumflex is one spacing + codepoint; a hard tab is one; wide and + narrow CJK are one each; etc.) + =3: virtual length (counting tabs as anything + between 1 and |'tabstop'|, wide CJJK as 2 + rather than 1, Arabic alif as zero when + immediately preceded by lam, one + otherwise, etc) + + *g:NetrwTopLvlMenu* This variable specifies the top level + menu name; by default, it's "Netrw.". If + you wish to change this, do so in your + .vimrc. + +NETRW BROWSING AND OPTION INCOMPATIBILITIES *netrw-incompatible* {{{2 + +Netrw has been designed to handle user options by saving them, setting the +options to something that's compatible with netrw's needs, and then restoring +them. However, the autochdir option: > + :set acd +is problematical. Autochdir sets the current directory to that containing the +file you edit; this apparently also applies to directories. In other words, +autochdir sets the current directory to that containing the "file" (even if +that "file" is itself a directory). + +NETRW SETTINGS *netrw-settings* {{{2 + +With the NetrwSettings.vim plugin, > + :NetrwSettings +will bring up a window with the many variables that netrw uses for its +settings. You may change any of their values; when you save the file, the +settings therein will be used. One may also press "?" on any of the lines for +help on what each of the variables do. + +(also see: |netrw-browser-var| |netrw-protocol| |netrw-var| |netrw-variables|) + + +============================================================================== +OBTAINING A FILE *netrw-O* {{{2 + +If there are no marked files: + + When browsing a remote directory, one may obtain a file under the cursor + (ie. get a copy on your local machine, but not edit it) by pressing the O + key. + +If there are marked files: + + The marked files will be obtained (ie. a copy will be transferred to your + local machine, but not set up for editing). + +Only ftp and scp are supported for this operation (but since these two are +available for browsing, that shouldn't be a problem). The status bar will +then show, on its right hand side, a message like "Obtaining filename". The +statusline will be restored after the transfer is complete. + +Netrw can also "obtain" a file using the local browser. Netrw's display +of a directory is not necessarily the same as Vim's "current directory", +unless |g:netrw_keepdir| is set to 0 in the user's <.vimrc>. One may select +a file using the local browser (by putting the cursor on it) and pressing +"O" will then "obtain" the file; ie. copy it to Vim's current directory. + +Related topics: + * To see what the current directory is, use |:pwd| + * To make the currently browsed directory the current directory, see |netrw-c| + * To automatically make the currently browsed directory the current + directory, see |g:netrw_keepdir|. + + +OPEN A NEW FILE IN NETRW'S CURRENT DIRECTORY *netrw-%* + +To open a file in netrw's current directory, press "%". This map will +query the user for a new filename; an empty file by that name will be +placed in the netrw's current directory (ie. b:netrw_curdir). + + +PREVIEW WINDOW *netrw-p* *netrw-preview* {{{2 + +One may use a preview window by using the "p" key when the cursor is atop the +desired filename to be previewed. The display will then split to show both +the browser (where the cursor will remain) and the file (see |:pedit|). +By default, the split will be taken horizontally; one may use vertical +splitting if one has set |g:netrw_preview| first. + + +PREVIOUS WINDOW *netrw-P* *netrw-prvwin* {{{2 + +To edit a file or directory in the previously used (last accessed) window (see +:he |CTRL-W_p|), press a "P". If there's only one window, then the one window +will be horizontally split (above/below splitting is controlled by +|g:netrw_alto|, and its initial size is controlled by |g:netrw_winsize|). + +If there's more than one window, the previous window will be re-used on +the selected file/directory. If the previous window's associated buffer +has been modified, and there's only one window with that buffer, then +the user will be asked if s/he wishes to save the buffer first (yes, +no, or cancel). + + +REFRESHING THE LISTING *netrw-ctrl-l* *netrw-ctrl_l* {{{2 + +To refresh either a local or remote directory listing, press ctrl-l (<c-l>) or +hit the <cr> when atop the ./ directory entry in the listing. One may also +refresh a local directory by using ":e .". + + +RENAMING FILES OR DIRECTORIES *netrw-move* *netrw-rename* *netrw-R* {{{2 + +If there are no marked files: (see |netrw-mf|) + + Renaming/moving files and directories involves moving the cursor to the + file/directory to be moved (renamed) and pressing "R". You will then be + queried for where you want the file/directory to be moved. You may select + a range of lines with the "V" command (visual selection), and then + pressing "R". + +If there are marked files: (see |netrw-mf|) + + Marked files will be renamed (moved). You will be queried as above in + order to specify where you want the file/directory to be moved. + + WARNING:~ + + Note that moving files is a dangerous operation; copies are safer. That's + because a "move" for remote files is actually a copy + delete -- and if + the copy fails and the delete does not, you may lose the file. + +The g:netrw_rename_cmd variable is used to implement renaming. By default its +value is: + + ssh HOSTNAME mv + +One may rename a block of files and directories by selecting them with +the V (|linewise-visual|). + + +REVERSING SORTING ORDER *netrw-r* *netrw-reverse* {{{2 + +One may toggle between normal and reverse sorting order by pressing the +"r" key. + +Related topics: |netrw-s| +Associated setting variable: |g:netrw_sort_direction| + + +SELECTING SORTING STYLE *netrw-s* *netrw-sort* {{{2 + +One may select the sorting style by name, time, or (file) size. The "s" map +allows one to circulate amongst the three choices; the directory listing will +automatically be refreshed to reflect the selected style. + +Related topics: |netrw-r| |netrw-S| +Associated setting variables: |g:netrw_sort_by| |g:netrw_sort_sequence| + + +10. Problems and Fixes *netrw-problems* {{{1 + + (This section is likely to grow as I get feedback) + (also see |netrw-debug|) + *netrw-p1* + P1. I use windows 95, and my ftp dumps four blank lines at the + end of every read. + + See |netrw-fixup|, and put the following into your + <.vimrc> file: + + let g:netrw_win95ftp= 1 + + *netrw-p2* + P2. I use Windows, and my network browsing with ftp doesn't sort by + time or size! -or- The remote system is a Windows server; why + don't I get sorts by time or size? + + Windows' ftp has a minimal support for ls (ie. it doesn't + accept sorting options). It doesn't support the -F which + gives an explanatory character (ABC/ for "ABC is a directory"). + Netrw then uses "dir" to get both its short and long listings. + If you think your ftp does support a full-up ls, put the + following into your <.vimrc>: > + + let g:netrw_ftp_list_cmd = "ls -lF" + let g:netrw_ftp_timelist_cmd= "ls -tlF" + let g:netrw_ftp_sizelist_cmd= "ls -slF" +< + Alternatively, if you have cygwin on your Windows box, put + into your <.vimrc>: > + + let g:netrw_cygwin= 1 +< + This problem also occurs when the remote system is Windows. + In this situation, the various g:netrw_ftp_[time|size]list_cmds + are as shown above, but the remote system will not correctly + modify its listing behavior. + + + *netrw-p3* + P3. I tried rcp://user@host/ (or protocol other than ftp) and netrw + used ssh! That wasn't what I asked for... + + Netrw has two methods for browsing remote directories: ssh + and ftp. Unless you specify ftp specifically, ssh is used. + When it comes time to do download a file (not just a directory + listing), netrw will use the given protocol to do so. + + *netrw-p4* + P4. I would like long listings to be the default. + + Put the following statement into your |.vimrc|: > + + let g:netrw_liststyle= 1 +< + Check out |netrw-browser-var| for more customizations that + you can set. + + *netrw-p5* + P5. My times come up oddly in local browsing + + Does your system's strftime() accept the "%c" to yield dates + such as "Sun Apr 27 11:49:23 1997"? If not, do a "man strftime" + and find out what option should be used. Then put it into + your |.vimrc|: > + + let g:netrw_timefmt= "%X" (where X is the option) +< + *netrw-p6* + P6. I want my current directory to track my browsing. + How do I do that? + + Put the following line in your |.vimrc|: +> + let g:netrw_keepdir= 0 +< + *netrw-p7* + P7. I use Chinese (or other non-ascii) characters in my filenames, and + netrw (Explore, Sexplore, Hexplore, etc) doesn't display them! + + (taken from an answer provided by Wu Yongwei on the vim + mailing list) + I now see the problem. You code page is not 936, right? Vim + seems only able to open files with names that are valid in the + current code page, as are many other applications that do not + use the Unicode version of Windows APIs. This is an OS-related + issue. You should not have such problems when the system + locale uses UTF-8, such as modern Linux distros. + + (...it is one more reason to recommend that people use utf-8!) + + *netrw-p8* + P8. I'm getting "ssh is not executable on your system" -- what do I + do? + + (Dudley Fox) Most people I know use putty for windows ssh. It + is a free ssh/telnet application. You can read more about it + here: + + http://www.chiark.greenend.org.uk/~sgtatham/putty/ Also: + + (Marlin Unruh) This program also works for me. It's a single + executable, so he/she can copy it into the Windows\System32 + folder and create a shortcut to it. + + (Dudley Fox) You might also wish to consider plink, as it + sounds most similar to what you are looking for. plink is an + application in the putty suite. + + http://the.earth.li/~sgtatham/putty/0.58/htmldoc/Chapter7.html#plink + + (Vissale Neang) Maybe you can try OpenSSH for windows, which + can be obtained from: + + http://sshwindows.sourceforge.net/ + + It doesn't need the full Cygwin package. + + (Antoine Mechelynck) For individual Unix-like programs needed + for work in a native-Windows environment, I recommend getting + them from the GnuWin32 project on sourceforge if it has them: + + http://gnuwin32.sourceforge.net/ + + Unlike Cygwin, which sets up a Unix-like virtual machine on + top of Windows, GnuWin32 is a rewrite of Unix utilities with + Windows system calls, and its programs works quite well in the + cmd.exe "Dos box". + + (dave) Download WinSCP and use that to connect to the server. + In Preferences > Editors, set gvim as your editor: + + - Click "Add..." + - Set External Editor (adjust path as needed, include + the quotes and !.! at the end): + "c:\Program Files\Vim\vim70\gvim.exe" !.! + - Check that the filetype in the box below is + {asterisk}.{asterisk} (all files), or whatever types + you want (cec: change {asterisk} to * ; I had to + write it that way because otherwise the helptags + system thinks it's a tag) + - Make sure it's at the top of the listbox (click it, + then click "Up" if it's not) + If using the Norton Commander style, you just have to hit <F4> + to edit a file in a local copy of gvim. + + (Vit Gottwald) How to generate public/private key and save + public key it on server: > + http://www.tartarus.org/~simon/puttydoc/Chapter8.html#pubkey-gettingready + 8.3 Getting ready for public key authentication +< + How to use a private key with 'pscp': > + + http://www.tartarus.org/~simon/puttydoc/Chapter5.html + 5.2.4 Using public key authentication with PSCP +< + (Ben Schmidt) I find the ssh included with cwRsync is + brilliant, and install cwRsync or cwRsyncServer on most + Windows systems I come across these days. I guess COPSSH, + packed by the same person, is probably even better for use as + just ssh on Windows, and probably includes sftp, etc. which I + suspect the cwRsync doesn't, though it might + + (cec) To make proper use of these suggestions above, you will + need to modify the following user-settable variables in your + .vimrc: + + |g:netrw_ssh_cmd| |g:netrw_list_cmd| |g:netrw_mkdir_cmd| + |g:netrw_rm_cmd| |g:netrw_rmdir_cmd| |g:netrw_rmf_cmd| + + The first one (|g:netrw_ssh_cmd|) is the most important; most + of the others will use the string in g:netrw_ssh_cmd by + default. + *netrw-p9* *netrw-ml_get* + P9. I'm browsing, changing directory, and bang! ml_get errors + appear and I have to kill vim. Any way around this? + + Normally netrw attempts to avoid writing swapfiles for + its temporary directory buffers. However, on some systems + this attempt appears to be causing ml_get errors to + appear. Please try setting |g:netrw_use_noswf| to 0 + in your <.vimrc>: > + let g:netrw_use_noswf= 0 +< + *netrw-p10* + P10. I'm being pestered with "[something] is a directory" and + "Press ENTER or type command to continue" prompts... + + The "[something] is a directory" prompt is issued by Vim, + not by netrw, and there appears to be no way to work around + it. Coupled with the default cmdheight of 1, this message + causes the "Press ENTER..." prompt. So: read |hit-enter|; + I also suggest that you set your |'cmdheight'| to 2 (or more) in + your <.vimrc> file. + + *netrw-p11* + P11. I want to have two windows; a thin one on the left and my editing + window on the right. How can I do this? + + * Put the following line in your <.vimrc>: + let g:netrw_altv = 1 + * Edit the current directory: :e . + * Select some file, press v + * Resize the windows as you wish (see |CTRL-W_<| and + |CTRL-W_>|). If you're using gvim, you can drag + the separating bar with your mouse. + * When you want a new file, use ctrl-w h to go back to the + netrw browser, select a file, then press P (see |CTRL-W_h| + and |netrw-P|). If you're using gvim, you can press + <leftmouse> in the browser window and then press the + <middlemouse> to select the file. + +============================================================================== +11. Debugging Netrw Itself *netrw-debug* {{{1 + +The <netrw.vim> script is typically available as: +> + /usr/local/share/vim/vim6x/plugin/netrwPlugin.vim + /usr/local/share/vim/vim6x/autoload/netrw.vim +< -or- > + /usr/local/share/vim/vim7x/plugin/netrwPlugin.vim + /usr/local/share/vim/vim7x/autoload/netrw.vim +< +which is loaded automatically at startup (assuming :set nocp). + + 1. Get the <Decho.vim> script, available as: + + http://mysite.verizon.net/astronaut/vim/index.html#DECHO + or + http://vim.sourceforge.net/scripts/script.php?script_id=120 + + It now comes as a "vimball"; if you're using vim 7.0 or earlier, + you'll need to update vimball, too. See + http://mysite.verizon.net/astronaut/vim/index.html#VIMBALL + + 2. Edit the <netrw.vim> file by typing: > + + vim netrw.vim + :DechoOn + :wq +< + To restore to normal non-debugging behavior, re-edit <netrw.vim> + and type > + + vim netrw.vim + :DechoOff + :wq +< + This command, provided by <Decho.vim>, will comment out all + Decho-debugging statements (Dfunc(), Dret(), Decho(), Dredir()). + + 3. Then bring up vim and attempt to evoke the problem by doing a + transfer or doing some browsing. A set of messages should appear + concerning the steps that <netrw.vim> took in attempting to + read/write your file over the network in a separate tab. + + To save the file, use > + :wincmd j + :set bt= + :w! DBG +< Please send that information to <netrw.vim>'s maintainer, > + NdrOchip at ScampbellPfamily.AbizM - NOSPAM +< +============================================================================== +12. History *netrw-history* {{{1 + + v133: Aug 10, 2008 * NetReadFixup() for win95 was missing some "a:"s + Aug 12, 2008 * (Jan Minář) an error condition in NetrwMethod() + wasn't being used, resulting in b:netrw_fname + undefined errors + Aug 12, 2008 * (François Ingeirest) asked that "hi link" be + changed to hi default link in the netrw syntax + files. + Aug 12, 2008 * using s:NetrwUnmarkList() more often. Filenames + were being left on the global list when removed + from the buffer-local lists. + Aug 14, 2008 * (Joshua Clayton) an errant extra ")" was left in + the rcp-handling portion of NetRead(). + Sep 03, 2008 * added |'cursorline'| highlighting to thin, long, + and tree displays. + v132: Aug 06, 2008 * Fixed marked file-based obtain + Aug 08, 2008 * sourcing a file via ftp from a netrw-generated + buffer (or any buffer with |'nobl'|) left an + empty no-name buffer in its wake. Fixed. + v130: Jul 31, 2008 * trying out elinks/links for http://host/ + requests. One problem: in-page links + (such as with ...#LABEL) are not supported + * verified that Bram's modified netrwPlugin works + Aug 01, 2008 * fixed a bug: when sourcing a file via ftp, the + "filter window" was left behind. + v129: Jul 31, 2008 * bug found in non-mouse enabled vim and some + local maps + v128: Jul 30, 2008 * much work done in using shellescape() and + fnameescape() + v126: Jun 30, 2008 * after having gone to a remote directory, + <f1> was no longer taking one to the correct + entry in the help (|netrw-quickhelp|). Fixed. + Jul 01, 2008 * extracting the last filename from a wide listing + missed the last letter when |'virtualedit'| not + enabled. + Jul 01, 2008 * vim foo/bar was creating [Scratch] buffers, + where bar was also a directory + Jul 01, 2008 * numerous additional changes were made to netrw + to use fnameescape() and shellescape() instead + of escape(). Not all changes have been tested + as yet... + Jul 01, 2008 * (James Vega reported) some problems with + :NetrwSettings (due to no longer used setting + variables). + Jul 07, 2008 * Additional numerous changes to support security; + shellescape(arg,1), etc. + v125: Apr 07, 2008 * (Cristian Rigamonti) CR provides a patch; he + noted that gx was failing since its call to + netrw#NetBrowseX() wasn't updated to + netrw#NetrwBrowseX(). + * (Stanis Trendelenburg) ST provides a patch to + supports davs: (dav + ssl) + * (Rick Choi) noted that directory names comprised + of three digits were not being displayed by + the internal browser. Fixed. + * (Erik Falor) provided a patch to handle problems + with changing directory and |'acd'| option. + * (James Vega, Teemu Likonen) noted that netrw + wasn't handling multi-byte filenames/directories + correctly. Fixed. + * (Rick) found problem with g:netrw_maxfilenamelen + being overridden. + * (James Vega) pointed out that netrw was + misidentifying all files in a symbolically linked + directory as being symbolically linked + themselves. This particular problem was fixed; + however, there are now situations where + symbolically linked files will not be detected. + Really need an internal vim function to do this + identification. + Apr 17, 2008 * When g:netrw_keepdir==0, current directory + doesn't necessarily equal b:netrw_curdir + initially. Problem is due to the patch directly + above. + * Fixed qf to handle case where b:netrw_curdir + isn't the same as the current directory under + linux/macosx. + * New: |netrw-mg| (apply vimgrep to marked files) + May 05, 2008 * (Rick) pointed out that a "setlocal ts=32" was + interfering with g:netrw_maxfilenamelen + May 05, 2008 * (James Vega) a file inside a linked directory + was showing up as a symbolic link itself. + May 22, 2008 * symbolic links, fifos, and sockets are now + indicated by a trailing @, |, or =, respectively. + Jun 06, 2008 * Removed numerous bugs from the marked file + move and copy. Tested these changes under + Unix only thus far. + * :Rexplore returns to the screen position in the + netrw listing from whence the file was edited + v124: Apr 02, 2008 * (Adrian Rollett) change the line supporting the + "x" action for mac to use g:netrw_shq + v123: Feb 27, 2008 * Marked files now keeps a "global" marked file + list. The global marked file list is used to + support tag processing and vimdiff'ing + (|netrw-md| |netrw-mt|) + * Been insuring that mm and mc works with various + combinations of local and remote directories + * (Stefan Bittner) http://.../ should always have + filetype "html" -- fixed. + * (Stefan Bittner) a "?" in a http://.../ request + wasn't being handled correctly. Fixed by + removing ? from default |g:netrw_tmpfile_escape|. + * (Nico Weber) % codes in http://.../ requests + weren't being handled correctly. Fixed by + including % in default |g:netrw_fname_escape|. + * (Stefan Bittner) attempts to update Buffers.Refresh + were failing because locale use changed the menu + names. I implemented a workaround. + v122: Feb 12, 2008 * bugfix - first sorting sequence match now has + priority + Feb 14, 2008 * bugfix - sorting sequence was effectively ignoring + sequencing priority of anything following '*' + * toggling a marked file was showing incorrect list + (list was correct, but displayed matches weren't) + * |g:netrw_special_syntax| implemented + v121: Feb 11, 2008 * Bram M reported that :e file ... :e . would not + retain the alternate file. Fixed -- I hope! + * bugfix -- apparently v120 broke an explicit + :Explore dirname + v120: Jan 21, 2008 * |netrw-mt| changed to allow for target selection + based on whether or not word under cursor is a + directory or file, or if cursor is in banner + area. + * |netrw-mh| included (hiding by marked-file suffix) + * functions moved about a bit (improved + categorization) + * executable files now displayed with trailing (*) + * symbolically linked files now displayed with + trailing (@) + * Somewhen, s:NetrwMarkFileMove() got damaged. Its + now restored (missing an endif, for example). + * |netrw-mu| implemented (unmarking marked files) + * many bugs have been removed from the marked file + system (tnx to Mark S. for feedback) + * |netrw-ms| implemented (sourcing marked files) + * fixed use of P with tree listing style + * multiple tree listing now supported + * ./ suppressed + * changed q -> qb (query bookmarks) + * implemented |netrw-qf| + * Explore now has four special list-generation + modes: */filepat **/filepat + *//pattern **//pattern + * gh (|netrw-gh|) is a shortcut for toggling the + hiding of files and directories beginning with a + dot + v119: Jan 10, 2008 * When g:netrw_keepdir is false, + NetrwOptionsRestore() had a problem + (Bill McCarthy) + Jan 11, 2008 * Netrw now shows symbolic links with a trailing + "@" and special highlighting. + Jan 15, 2008 * Changed g:netrw_noretmap -> |g:netrw_retmap|. + Changed: disabled by default at Bram's + preference. + v118: Jan 02, 2008 * Fixed a problem with Windows; + :Explore c:/path/ would not work, + but :Explore c:/path would. + * Fixed a bug in s:NetrwOptionRestore() - lcd's + argument wasn't being properly escaped so it + wouldn't handle spaces in directory names. + (Gary Johnson) + v117: Jan 02, 2008 * Fixed a problem with P; had to include + a b:netrw_curdir bypass (Bram Moolenaar) + v116: Nov 27, 2007 * netrw#LocalBrowseCheck() has &ft=="netrw" + check to prevent doing a directory listing + (was getting unexpected directory refreshes + in the middle of some function calls) + * NetrwOptionRestore moved after e! filename + in order to retain user options for editing + in s:NetrwBrowseChgDir() + Dec 12, 2007 * Bug fix -- netrw does a better job of retaining + user options when editing files under the aegis + of the browser + v115: Oct 04, 2007 * Erik Remmelzwaal pointed out that the use of + shellslash in s:GetTempfile() was incorrect + Oct 11, 2007 * Tracked down and eliminated a bug with editing + remote *.tar.gz and *.tar.bz2 files + Oct 11, 2007 * g:netrw_localmovecmd wasn't being initialized + properly, and g:netrw_localcopycmd was being + overwritten. + Oct 12, 2007 * Placed all :Rexplore and <2-leftmouse> setup + in a new support function (s:SetRexDir()). + Oct 15, 2007 * new: g:netrw_browse_split == 4; means <cr> + based selection will use previous window + Oct 20, 2007 * also checks on |'shellxquote'| to set g:netrw_shq + Oct 24, 2007 * Explore handles path/**/filename + Oct 27, 2007 * sourcing remote files often didn't work with ftp, + turns out that b:netrw_method was undefined, so + s:SaveBufVars and s:RestoreBufVars() fixed it. + v114: Sep 28, 2007 * mT, the map that invokes tags, has been improved + to support use of remote tags files. + Oct 02, 2007 * changed Netrw menu to use more submenus + v113: Sep 07, 2007 * worked out why the cursor position wasn't being + saved and restored as intended after doing such + things as deleting and renaming files. + Sep 11, 2007 * Fixed bug which effectively disabled <c-l> and + <c-h> maps + Sep 18, 2007 * there used to be one NetrwOptionRestore() call at + the end of the s:NetrwBrowseChgDir() function; + they're now at the end of every if..elseif..else + block. The edit-a-file one is not quite at the end + of its block; instead, its just before the edit. + Restores user options, then this new placement + allows ftplugins, autocmds, etc to change settings + (ex. ftplugin/cpp.vim sets cindent). + Sep 19, 2007 * changed all strlen() calls to use s:Strlen(), a + function which handles utf-8 wide characters + correctly. + Sep 20, 2007 * (Nico Weber) the "x" command has been extended + to Mac's OS/X (macunix); it now uses open to + handle |netrw-x| browsing with special files. + Sep 22, 2007 * Added g:netrw_noretmap to netrw at Tony M's + request. + * Included path to NetrwRemoteRmFile() + v112: Aug 18, 2007 * added mx (|netrw-mx|) for executing arbitrary + commands on marked files + Aug 22, 2007 * more option save/restore work for + s:NetrwBrowseChgDir(); s:NetrwOptionSave() + and s:NetrwOptionRestore() now take a parameter + specifying the type of variables to be used for + saving and restoring (either "w:" or "s:") + Sep 04, 2007 * added the :NetrwClean[!] command + v111: Jul 25, 2007 * using Windows but not using Cygwin, netrw does a + "file bufname" where the bufname uses /s + instead of \s; Vim "fixes" it by changing the + bufname to use \s anyway. This meant that + NetrwGetBuffer() didn't find the appropriately + named buffer, and so would generate a new + buffer listing; hence the cursor would appear + to have been moved when doing a preview. + * added <2-leftmouse> map to return to netrw's + browser display + Aug 16, 2007 * added the mark-file system, including + maps for mf mp mt mz and mu. Modifications + made to maps for a D O and R to support + marked files. + v110: May 10, 2007 * added [ and ] maps to NetrwTreeListing + May 25, 2007 * |g:netrw_preview| included + May 29, 2007 * modifed netrw#NetBrowseX to consistently use + g:netrw_shq instead of hardcoded quotes, + and modified the snippet that sets up redir + so Windows machines use "nul" instead of + "/dev/null". + Jun 01, 2007 * fixed bug -- NetGetBuffer() wasn't always + recognizing a buffer name match when it should, + thus resulting in [Scratch] buffers. + Jun 04, 2007 * Gary Johnson found a bugfix for the "c" mapping + when the directory is to be made current but + the name contains spaces. + v109: Mar 26, 2007 * if a directory name includes a "$" character, + Explore() will use expand() in an attempt to + decipher the name. + May 07, 2007 * g:netrw_use_errorwindow now allows one to + have error messages go to a reliable window + or to use a less reliable but recallable + echoerr method + May 07, 2007 * g:netrw_scpport and g:netrw_sshport support + use of -P and -p, respectively, to set port + for scp/ssh. + v108: Jan 03, 2007 * included preview map (|netrw-p|), supporting + remote browsing + * netrw can now source remote files + Jan 26, 2007 * Colton Jamieson noted that remote directory + browsing did not support alternate port + selection. This feature has now been extended + to apply to all remote browsing commands via ssh. + (list, remove/delete, rename) + Jan 31, 2007 * Luis Florit reported that @* was an invalid + register. The @* register is now only saved and + restored if |'guioptions'| contains "a". + Feb 02, 2007 * Fixed a bug that cropped up when writing files + via scp using cygwin + Feb 08, 2007 * tree listing mode managed to stop working again; + fixed again! + Feb 15, 2007 * Guido Van Hoecke reported that netrw didn't + handle browsing well with M$ ftp servers. He even + set up a temporary account for me to test with + (thanks!). Netrw now can browse M$ ftp servers. + v107: Oct 12, 2006 * bypassed the autowrite option + Oct 24, 2006 * handles automatic decompression of *.gz and *.bz2 + files + Nov 03, 2006 * Explore will highlight matching files when + **/pattern is used (and if the |'hls'| option + is set) + Nov 09, 2006 * a debugging line, when enabled, was inadvertently + bringing up help instead of simply reporting on + list contents + Nov 21, 2006 * tree listing improved (cursor remains put) + Nov 27, 2006 * fixed b:netrw_curdir bug when repeated "i"s were + pressed. + Dec 15, 2006 * considerable qty of changes, mostly to share more + code between local and remote browsing. Includes + support for tree-style listing for both remote + and local browsing. + Dec 15, 2006 * Included Peter Bengtsson's modifications to + support the Amiga. + v106: Sep 21, 2006 * removed old v:version<700 code as netrw now + requires vim 7.0 + * worked around a bug where register * was + overwritten during local browsing + v104: Sep 05, 2006 * as suggested by Rodolfo Borges, :Explore and + variants will position the cursor on the file + just having been edited + * changed default |g:netrw_sort_sequence| order + * changed b, Nb to simply mb (see |netrw-mb|) + * changed B, NB to simply gb (see |netrw-gb|) + * tree listing style (see |g:netrw_liststyle|) + * attempts to retain the alternate file + v103: Jul 26, 2006 * used Yakov Lerner's tip#1289 to improve netrw + error message display + * wide listings didn't handle files with backslashes + in their names properly. A symptom was an + inability to open files. + Aug 09, 2006 * included "t" mapping for opening tabbed windows, + both for remote and local browsing + * changed netrw_longlist to netrw_liststyle + Aug 15, 2006 * fixed one of the NB maps + Aug 22, 2006 * changed *Explore commands to use -nargs=* instead + of -nargs=?. Allows both -complete=dir _and_ the + starstar arguments to work (-nargs=? seems to + require one or the other). + Aug 23, 2006 * copied all w:.. variables across splits to + new windows + Aug 25, 2006 * when g:netrw_browsex_viewer was '-' + (see |g:netrw_browsex_viewer|) it wasn't causing + netrwFileHandlers#Invoke() to be called as it + was expected to. (tnx Steve Dugaro) + Aug 29, 2006 * changed NetBrowseX() to use "setlocal ... noswf" + instead of "set ... noswf" (tnx Benji Fisher) + Aug 31, 2006 * tabs and fastbrowse<=1 didn't work together. + v102: Jun 15, 2006 * chgd netrwPlugin to call netrw#LocalBrowseCheck() + * bugfix: g:netrw_keepdir==0 had stopped working + Jul 06, 2006 * bugfix: NetOptionSave/Restore now saves/restores + the unnamed register (|registers|) + Jul 07, 2006 * |g:netrw_menu| support included + Jul 13, 2006 * :Texplore command implemented + Jul 17, 2006 * NetSplit and (Local|Net)BrowseChgDir() were both + splitting windows. This affected o, v, and + g:netrw_browse_split. + Jul 20, 2006 * works around wildignore setting (was causing + netrw's local browser not to list wildignore'd + files) + Jul 24, 2006 * <leftmouse> acts as a <cr> for selecting a file + <rightmouse> acts as a <del> for deleting a file + v100: May 14, 2006 * when using Windows and shell==cmd.exe, the + default for g:netrw_ignorenetrc is now 1 + * bugfix: unwanted ^Ms now removed + (affected shell==cmd.exe - Windows) + * added Bookmarks and History to the menu + * an error message about non-existing + w:netrw_longlist was appearing during attempts to + Explore (fixed) + * g:netrw_shq now available to make netrw use + specified style of quotes for commands + May 29, 2006 * user NFH_*() functions were inadvertently being + ignored + * fixed a Windows non-cygwin ftp handling problem. + * hiding pattern candidate separators included some + characters it shouldn't have (tnx to Osei Poku) + Jun 01, 2006 * for browsing, netrw was supposed to use "dir" + instead of "ls -lF" when using + ftp+non-cygwin+windows. Fixed. + * an inadvertently left-in-place debugging statement + was preventing use of the "x" key with browsing. + Jun 05, 2006 * g:netrw_nogx available to prevent making the gx + map (see |g:netrw_nogx|) + * bugfix, Explore wouldn't change directory + properly (vim ., :Explore subdirname) + Jun 06, 2006 * moved history to 2nd line in Netrw menu + * fixed delete for unix-based systems + Jun 07, 2006 * x key now works for windows-noncygwin-ftp + Jun 08, 2006 * Explore */pat and **//pat now wraps + v99: May 09, 2006 * g:netrw_browse_split=3 for opening files in new + tabs implemented. + May 12, 2006 * deletes temporary file at end of NetRead() + * visual mode based Obtain implemented + * added -complete=dir to the various Explore + commands + v98: May 02, 2006 * the "p" key didn't work properly when the browsing + directory name had spaces in it. + v97: May 01, 2006 * exists("&acd") now used to determine if + the 'acd' option exists + * "obtain" now works again under Windows + v96: * bugfix - the |'acd'| option is not always defined + but is now bypassed only when it is + v95: * bugfix - Hiding mode worked correctly (don't show + any file matching any of the g:netrw_hide + patterns), but showing mode was showing only those + files that didn't match any of the g:netrw_hide + patterns. Instead, it now shows all files that + match any of the g:netrw_hide patterns (the + difference between a logical and and logical or). + v94: * bugfix - a Decho() had a missing quote; only + affects things when debugging was enabled. + v93: * bugfix - removed FocusGained event from causing a + slow-browser refresh for Windows + v92: * :Explore **//pattern implemented + (**/filepattern was already taken) + v91: * :Explore */pattern implemented + * |'acd'| option bypassed + v90: * mark ', as suggested by Yegappan Lakshmanan, used + to help guarantee entry into the jump list when + appropriate. + * <s-down> and <s-up> are no longer defined until a + :Explore **/pattern is used (if the user already + has a map for them). They will be defined for new + browser windows from that point forward. + v89: * A <s-down>, <s-up>, :Nexplore, or a :Pexplore + without having first done an :Explore **/pattern + (see |netrw-starstar|) caused + a lot of unhelpful error messages to appear + v88: * moved DrChip.Netrw menu to Netrw. Now has + priority 80 by default. + g:NetrwTopLvlMenu == "Netrw" and can be changed + by the user to suit. The priority is given by + g:NetrwMenuPriority. + * Changed filetype for browser displays from + netrwlist to netrw. + v87: * bug fix -- menus were partially disappearing + v85: * bug fix -- missing an endif + * bug fix -- handles spaces in names and directories + when using ftp-based browsing + v83: * disabled stop-acd handling; the change in directory + handling may allow acd to be used again. + * D was refusing to delete remote files/directories + in wide listing mode. + v81: * FocusGained also used to refresh/wipe local browser + directory buffers + * (bugfix) netrw was leaving [Scratch] buffers behind + when the user had the "hidden" option set. The + 'hidden' option is now bypassed. + v80: * ShellCmdPost event used in conjunction with + g:netrw_fastbrowse to refresh/wipe local browser + directory buffers. + v79: * directories are now displayed with nowrap + * (bugfix) if the column width was smaller than the + largest file's name, then netrw would hang when + using wide-listing mode - fixed + * g:netrw_fastbrowse introduced + v78: * progress has been made on allowing spaces inside + directory names for remote work (reading, writing, + browsing). (scp) + v77: * Mikolaj Machowski fixed a bug in a substitute cmd + * g:netrw_browsex_viewer implemented + * Mikolaj Machowski pointed out that gnome-open is + often executable under KDE systems, although it is + effectively not functional. NetBrowseX now looks + for "kicker" as a running process to determine if + KDE is actually running. + * Explorer's O functionality was inadvertently left + out. Netrw now does the same thing, but with the + "P" key. + * added g:netrw_browse_split option + * fixed a bug where the directory contained a "." but + the file didn't (was treating the dirname from "." + onwards as a suffix) + v76: * "directory is missing" error message now restores + echo highlighting + v75: * file://... now conforms to RFC2396 (thanks to + S. Zacchiroli) + * if the binary option is set, then NetWrite() will + only write the whole file (line numbers don't make + sense with this). Supports writing of tar and zip + files. + v74: * bugfix (vim, then :Explore) now works + * ctrl-L keeps cursor at same screen location (both + local and remote browsing) + * netrw now can read remote zip and tar files + * Obtain now uses WinXP ftp+.netrc successfully + v73: * bugfix -- scp://host/path/file was getting named + incorrectly + * netrw detects use of earlier-than-7.0 version of + vim and issues a pertinent error message. + * netrwSettings.vim is now uses autoloading. Only + <netrwPlugin.vim> is needed as a pure plugin + (ie. always loaded). + v72: * bugfix -- formerly, one could prevent the loading + of netrw by "let g:loaded_netrw=1"; when + autoloading became supported, this feature was + lost. It is now restored. + v71: * bugfix -- made some "set nomodifiable"s into + setlocal variants (allows :e somenewfile to be + modifiable as usual) + * NetrwSettings calls a netrw function, thereby + assuring that netrw has loaded. However, if netrw + does not load for whatever reason, then + NetrwSettings will now issue a warning message. + * For what reason I don't recall, when wget and fetch + are both not present, and an attempt to read a + http://... url is made, netrw exited. It now only + returns. + * When ch=1, on the second and subsequent uses of + browsing Netrw would issue a blank line to clear + the echo'd messages. This caused an annoying + "Hit-Enter" prompt; now a blank line message + is echo'd only if &ch>1. + v70: * when using |netrw-O|, the "Obtaining filename" + message is now shown using |hl-User9|. If User9 + has not been defined, netrw itself will define it. + v69: * Bugfix: win95/98 machines were experiencing a + "E121: Undefined variable: g:netrw_win95ftp" + message + v68: * double-click-leftmouse selects word under mouse + v67: * Passwords which contain blanks will now be + surrounded by double-quotes automatically (Yongwei) + v66: * Netrw now seems to work with a few more Windows + situations + * O now obtains a file: remote browsing + file -> local copy, locally browsing + file -> current directory (see :pwd) + * i now cycles between thin, long, and wide listing + styles + * NB and Nb are maps that are always available; + corresponding B and b maps are only available when + not using wide listing in order to allow them to + be used for motions + v65: * Browser functions now use NetOptionSave/Restore; in + particular, netrw now works around the report + setting + v64: * Bugfix - browsing a "/" directory (Unix) yielded + buffers named "[Scratch]" instead of "/" + * Bugfix - remote browsing with ftp was omitting + the ./ and ../ + v63: * netrw now takes advantage of autoload (needs 7.0) + * Bugfix - using r (to reverse sort) working again + v62: * Bugfix - spaces allowed again in directory names + with g:netrw_keepdir=0. In fact, I've tested netrw + with most ANSI punctuation marks for directory + names. + * Bugfix - NetrwSettings gave errors when + g:netrw_silent had not be set. + v61: * Document upgrade -- netrw variable-based settings + all should have tags. Supports NetrwSettings cmd. + * Several important variables are window-oriented. + Netrw has to transfer these across a window split. + See s:BufWinVars() and s:UseBufWinVars(). + v60: * When using the i map to switch between long and + short listings, netrw will now keep cursor on same + line + * "Match # of #" now uses status line + * :Explore **/*.c will now work from a + non-netrw-browser window + * :Explore **/patterns can now be run in separate + browser windows + * active banner (hit <cr> will cause various things + to happen) + v59: * bugfix -- another keepalt work-around installed + (for vim6.3) + * "Match # of #" for Explore **/pattern matches + v58: * Explore and relatives can now handle + **/somefilepattern (v7) + * Nexplore and Pexplore introduced (v7). shift-down + and shift-up cursor keys will invoke Nexplore and + Pexplore, respectively. + * bug fixed with o and v + * autochdir only worked around for vim when it has + been compiled with either + |+netbeans_intg| or |+sun_workshop| + * Under Windows, all directories and files were + being preceded with a "/" when local browsing. + Fixed. + * When: syntax highlighting is off, laststatus=2, and + remote browsing is used, sometimes the laststatus + highlighting bleeds into the entire display. Work + around - do an extra redraw in that case. + * Bugfix: when g:netrw_keepdir=0, due to re-use of + buffers, netrw didn't change the directory when it + should've + * Bugfix: D and R commands work again + v57: * Explore and relatives can now handle RO files + * reverse sort restored with vim7's sort command + * g:netrw_keepdir now being used to keep the current + directory unchanged as intended (sense change) + * vim 6.3 still supported + v56: * LocalBrowse now saves autochdir setting, unsets it, + and restores it before returning. + * using vim's rename() instead of system + + local_rename variable + * avoids changing directory when g:netrw_keepdir is + false + v55: * -bar used with :Explore :Sexplore etc to allow + multiple commands to be separated by |s + * browser listings now use the "nowrap" option + * browser: some unuseful error messages now + suppressed + v54: * For backwards compatibility, Explore and Sexplore + have been implemented. In addition, Hexplore and + Vexplore commands are available, too. + * <amatch> used instead of <afile> in the + transparency support (BufReadCmd, FileReadCmd, + FileWriteCmd) + * ***netrw*** prepended to various error messages + netrw may emit + * g:netrw_port used instead of b:netrw_port for scp + * any leading [:#] is removed from port numbers + v53: * backslashes as well as slashes placed in various + patterns (ex. g:netrw_sort_sequence) to better + support Windows + v52: * nonumber'ing now set for browsing buffers + * when the hiding list hid all files, error messages + ensued. Fixed + * when browsing, swf is set, but directory is not + set, when netrw was attempting to restore options, + vim wanted to save a swapfile to a local directory + using an url-style path. Fixed + v51: * cygwin detection now automated + (using windows and &shell is bash) + * customizable browser "file" rejection patterns + * directory history + * :[range]w url now supported (ie. netrw uses a + FileWriteCmd event) + * error messages have a "Press <cr> to continue" to + allow them to be seen + * directory browser displays no longer bother the + swapfile + * u/U commands to go up and down the history stack + * history stack may be saved with viminfo with it's + "!" option + * bugfixes associated with unwanted [No Files] + entries + v50: * directories now displayed using buftype=nofile; + should keep the directory names as-is + * attempts to remove empty "[No File]" buffers + leftover from :file ..name.. commands + * bugfix: a "caps-lock" editing difficulty left in + v49 was fixed + * syntax highlighting for "Showing:" the hiding list + included + * bookmarks can now be retained if "!" is in the + viminfo option + v49: * will use ftp for http://.../ browsing + v48: * One may use ftp to do remote host file browsing + * (windows and !cygwin) remote browsing with ftp can + now use the "dir" command internally to provide + listings + * g:netrw_keepdir now allows one to keep the initial + current directory as the current directory + (normally the local file browser makes the + currently viewed directory the current directory) + * g:netrw_alto and g:netrw_altv now support + alternate placement of windows started with o or v + * Nread ? and Nwrite ? now uses echomsg (instead of + echo) so :messages can repeat showing the help + * bugfix: avoids problems with partial matches of + directory names to prior buffers with longer names + * one can suppress error messages with g:netrw_quiet + ctrl-h used + * instead of <Leader>h for editing hiding list one + may edit the sorting sequence with the S map, which + now allows confirmation of deletion with + [y(es) n(o) a(ll) q(uit)] + * the "x" map now handles special file viewing with: + (windows) rundll32 url.dll (gnome) gnome-open (kde) + kfmclient If none of these are on the executable + path, then netrwFileHandlers.vim is used. + * directory bookmarking during both local and remote + browsing implemented + * one may view all, use the hiding list to suppress, + or use the hiding list to show-only remote and + local file/directory listings + * improved unusual file and directory name handling + preview window support + v47: * now handles local browsing. + v46: * now handles remote browsing + * g:netrw_silent (if 1) will cause all transfers to + be silent + v45: * made the [user@]hostname:path form a bit more + restrictive to better handle errors in using + protocols (e.g. scp:usr@host:file was being + recognized as an rcp request) + v44: * changed from "rsync -a" to just "rsync" + * somehow an editing error messed up the test to + recognize use of the fetch method for NetRead. + * more debugging statements included + v43: * moved "Explanation" comments to <pi_netrw.txt> help + file as "Network Reference" (|netrw-ref|) + * <netrw.vim> now uses Dfunc() Decho() and Dret() for + debugging + * removed superfluous NetRestorePosn() calls + v42: * now does BufReadPre and BufReadPost events on + file:///* and file://localhost/* + v41: * installed file:///* and file://localhost/* handling + v40: * prevents redraw when a protocol error occurs so + that the user may see it + v39: * sftp support + v38: * Now uses NetRestorePosn() calls with Nread/Nwrite + commands + * Temporary files now removed via bwipe! instead of + bwipe (thanks to Dave Roberts) + v37: * Claar's modifications which test if ftp is + successful, otherwise give an error message + * After a read, the alternate file was pointing to + the temp file. The temp file buffer is now wiped + out. + * removed silent from transfer methods so user can + see what's happening + + +============================================================================== +12. Credits *netrw-credits* {{{1 + + Vim editor by Bram Moolenaar (Thanks, Bram!) + dav support by C Campbell + fetch support by Bram Moolenaar and C Campbell + ftp support by C Campbell <NdrOchip@ScampbellPfamily.AbizM> + http support by Bram Moolenaar <bram@moolenaar.net> + rcp + rsync support by C Campbell (suggested by Erik Warendorph) + scp support by raf <raf@comdyn.com.au> + sftp support by C Campbell + + inputsecret(), BufReadCmd, BufWriteCmd contributed by C Campbell + + Jérôme Augé -- also using new buffer method with ftp+.netrc + Bram Moolenaar -- obviously vim itself, :e and v:cmdarg use, + fetch,... + Yasuhiro Matsumoto -- pointing out undo+0r problem and a solution + Erik Warendorph -- for several suggestions (g:netrw_..._cmd + variables, rsync etc) + Doug Claar -- modifications to test for success with ftp + operation + +============================================================================== +Modelines: {{{1 + vim:tw=78:ts=8:ft=help:norl:fdm=marker diff --git a/vimfiles/doc/pi_vimball.txt b/vimfiles/doc/pi_vimball.txt index 7a2df7e..c6623ea 100644 --- a/vimfiles/doc/pi_vimball.txt +++ b/vimfiles/doc/pi_vimball.txt @@ -1,4 +1,4 @@ -*pi_vimball.txt* For Vim version 7.1. Last change: 2008 Apr 01 +*pi_vimball.txt* For Vim version 7.1. Last change: 2008 May 30 ---------------- Vimball Archiver @@ -6,7 +6,7 @@ Author: Charles E. Campbell, Jr. <NdrOchip@ScampbellPfamily.AbizM> (remove NOSPAM from Campbell's email first) -Copyright: (c) 2004-2007 by Charles E. Campbell, Jr. *Vimball-copyright* +Copyright: (c) 2004-2008 by Charles E. Campbell, Jr. *Vimball-copyright* The VIM LICENSE applies to Vimball.vim, and Vimball.txt (see |copyright|) except use "Vimball" instead of "Vim". No warranty, express or implied. @@ -16,15 +16,44 @@ Copyright: (c) 2004-2007 by Charles E. Campbell, Jr. *Vimball-copyright* 1. Contents *vba* *vimball* *vimball-contents* 1. Contents......................................: |vimball-contents| - 2. Vimball Manual................................: |vimball-manual| + 3. Vimball Manual................................: |vimball-manual| MkVimball.....................................: |:MkVimball| UseVimball....................................: |:UseVimball| RmVimball.....................................: |:RmVimball| - 3. Vimball History...............................: |vimball-history| + 4. Vimball History...............................: |vimball-history| ============================================================================== -2. Vimball Manual *vimball-manual* +2. Vimball Introduction *vimball-intro* + + Vimball is intended to make life simpler for users of plugins. All + a user needs to do with a vimball is: > + vim someplugin.vba + :so % + :q +< and the plugin and all its components will be installed into their + appropriate directories. Note that one doesn't need to be in any + particular directory when one does this. Plus, any help for the + plugin will also be automatically installed. + + If a user has decided to use the AsNeeded plugin, vimball is smart + enough to put scripts nominally intended for .vim/plugin/ into + .vim/AsNeeded/ instead. + + Removing a plugin that was installed with vimball is really easy: > + vim + :RmVimball someplugin +< This operation is not at all easy for zips and tarballs, for example. + + Vimball examines the user's |'runtimepath'| to determine where to put + the scripts. The first directory mentioned on the runtimepath is + usually used if possible. Use > + :echo &rtp +< to see that directory. + + +============================================================================== +3. Vimball Manual *vimball-manual* *:MkVimball* :[range]MkVimball[!] filename [path] @@ -49,6 +78,19 @@ Copyright: (c) 2004-2007 by Charles E. Campbell, Jr. *Vimball-copyright* If you use the exclamation point (!), then MkVimball will create the "filename.vba" file, overwriting it if it already exists. This behavior resembles that for |:w|. + + *g:vimball_mkdir* + First, the |mkdir()| command is tried (not all systems support it). + + If it doesn't exist, then g:vimball_mkdir doesn't exist, it is set to: + |g:netrw_local_mkdir|, if it exists + "mkdir", if it is executable + "makedir", if it is executable + Otherwise, it is undefined. + One may explicitly specify the directory making command using + g:vimball_mkdir. This command is used to make directories that + are needed as indicated by the vimball. + *g:vimball_home* You may override the use of the |'runtimepath'| by specifying a variable, g:vimball_home. @@ -96,10 +138,19 @@ Copyright: (c) 2004-2007 by Charles E. Campbell, Jr. *Vimball-copyright* ============================================================================== -3. Vimball History *vimball-history* {{{1 +4. Vimball History *vimball-history* {{{1 + 26 : May 27, 2008 * g:vimball_mkdir usage installed. Makes the + $HOME/.vim (or $HOME\vimfiles) directory if + necessary. + May 30, 2008 * (tnx to Bill McCarthy) found and fixed a bug: + vimball wasn't updating plugins to AsNeeded/ + when it should 25 : Mar 24, 2008 * changed vimball#Vimball() to recognize doc/*.??x files as help files, too. + Apr 18, 2008 * RmVimball command is now protected by saving and + restoring settings -- in particular, acd was + causing problems as reported by Zhang Shuhan 24 : Nov 15, 2007 * |g:vimball_path_escape| used by s:Path() to prevent certain characters from causing trouble 22 : Mar 21, 2007 * uses setlocal instead of set during BufEnter diff --git a/vimfiles/doc/tComment.txt b/vimfiles/doc/tComment.txt index 89542d7..35b66e2 100644 --- a/vimfiles/doc/tComment.txt +++ b/vimfiles/doc/tComment.txt @@ -34,7 +34,7 @@ regions in vim scripts, HTML or JavaScript in php code etc. Key bindings~ Most of the time the default toggle keys will do what you want (or to be -more precise: what I think it should to ;-). +more precise: what I think you want it to do ;-). *g:tcommentMapLeaderOp1* *g:tcommentMapLeaderOp2* diff --git a/vimfiles/doc/tags b/vimfiles/doc/tags index 9fec6f4..51b7257 100644 --- a/vimfiles/doc/tags +++ b/vimfiles/doc/tags @@ -30,6 +30,8 @@ :RM visincr.txt /*:RM* :Rexplore pi_netrw.txt /*:Rexplore* :RmVimball pi_vimball.txt /*:RmVimball* +:Search MultipleSearch.txt /*:Search* +:SearchBuffers MultipleSearch.txt /*:SearchBuffers* :Sexplore pi_netrw.txt /*:Sexplore* :TComment tComment.txt /*:TComment* :TCommentAs tComment.txt /*:TCommentAs* @@ -51,6 +53,11 @@ IYMD visincr.txt /*IYMD* LogiPat() LogiPat.txt /*LogiPat()* LogiPat-flags LogiPat.txt /*LogiPat-flags* MatchError matchit.txt /*MatchError* +MultipleSearch MultipleSearch.txt /*MultipleSearch* +MultipleSearch-commands MultipleSearch.txt /*MultipleSearch-commands* +MultipleSearch-mappings MultipleSearch.txt /*MultipleSearch-mappings* +MultipleSearch-settings MultipleSearch.txt /*MultipleSearch-settings* +MultipleSearch.txt MultipleSearch.txt /*MultipleSearch.txt* Nread pi_netrw.txt /*Nread* Nsource pi_netrw.txt /*Nsource* Nwrite pi_netrw.txt /*Nwrite* @@ -1396,6 +1403,7 @@ crvdoc-licLGPL crefvimdoc.txt /*crvdoc-licLGPL* crvdoc-limbugs crefvimdoc.txt /*crvdoc-limbugs* crvdoc-usage crefvimdoc.txt /*crvdoc-usage* dav pi_netrw.txt /*dav* +davs pi_netrw.txt /*davs* drv-dtArrayInit crefvim.txt /*drv-dtArrayInit* drv-dtIncompleteArrayDecl crefvim.txt /*drv-dtIncompleteArrayDecl* ex-visincr-I visincr.txt /*ex-visincr-I* @@ -1409,13 +1417,17 @@ ex-visincr-IYMD visincr.txt /*ex-visincr-IYMD* fetch pi_netrw.txt /*fetch* ftp pi_netrw.txt /*ftp* g% matchit.txt /*g%* +g:MultipleSearchColorSequence MultipleSearch.txt /*g:MultipleSearchColorSequence* +g:MultipleSearchMaxColors MultipleSearch.txt /*g:MultipleSearchMaxColors* +g:MultipleSearchTextColorSequence MultipleSearch.txt /*g:MultipleSearchTextColorSequence* g:NetrwTopLvlMenu pi_netrw.txt /*g:NetrwTopLvlMenu* g:netrw_alto pi_netrw.txt /*g:netrw_alto* g:netrw_altv pi_netrw.txt /*g:netrw_altv* g:netrw_browse_split pi_netrw.txt /*g:netrw_browse_split* g:netrw_browsex_viewer pi_netrw.txt /*g:netrw_browsex_viewer* -g:netrw_cd_escape pi_netrw.txt /*g:netrw_cd_escape* g:netrw_compress pi_netrw.txt /*g:netrw_compress* +g:netrw_ctags pi_netrw.txt /*g:netrw_ctags* +g:netrw_cursorline pi_netrw.txt /*g:netrw_cursorline* g:netrw_cygwin pi_netrw.txt /*g:netrw_cygwin* g:netrw_dav_cmd pi_netrw.txt /*g:netrw_dav_cmd* g:netrw_decompress pi_netrw.txt /*g:netrw_decompress* @@ -1456,10 +1468,10 @@ g:netrw_rsync_cmd pi_netrw.txt /*g:netrw_rsync_cmd* g:netrw_scp_cmd pi_netrw.txt /*g:netrw_scp_cmd* g:netrw_scpport pi_netrw.txt /*g:netrw_scpport* g:netrw_sftp_cmd pi_netrw.txt /*g:netrw_sftp_cmd* -g:netrw_shq pi_netrw.txt /*g:netrw_shq* g:netrw_silent pi_netrw.txt /*g:netrw_silent* g:netrw_sort_by pi_netrw.txt /*g:netrw_sort_by* g:netrw_sort_direction pi_netrw.txt /*g:netrw_sort_direction* +g:netrw_sort_options pi_netrw.txt /*g:netrw_sort_options* g:netrw_sort_sequence pi_netrw.txt /*g:netrw_sort_sequence* g:netrw_special_syntax pi_netrw.txt /*g:netrw_special_syntax* g:netrw_ssh_browse_reject pi_netrw.txt /*g:netrw_ssh_browse_reject* @@ -1473,12 +1485,14 @@ g:netrw_use_noswf pi_netrw.txt /*g:netrw_use_noswf* g:netrw_use_nt_rcp pi_netrw.txt /*g:netrw_use_nt_rcp* g:netrw_win95ftp pi_netrw.txt /*g:netrw_win95ftp* g:netrw_winsize pi_netrw.txt /*g:netrw_winsize* +g:netrw_xstrlen pi_netrw.txt /*g:netrw_xstrlen* g:tcommentMapLeader1 tComment.txt /*g:tcommentMapLeader1* g:tcommentMapLeader2 tComment.txt /*g:tcommentMapLeader2* g:tcommentMapLeaderOp1 tComment.txt /*g:tcommentMapLeaderOp1* g:tcommentMapLeaderOp2 tComment.txt /*g:tcommentMapLeaderOp2* g:tcommentOpModeExtra tComment.txt /*g:tcommentOpModeExtra* g:vimball_home pi_vimball.txt /*g:vimball_home* +g:vimball_path_escape pi_vimball.txt /*g:vimball_path_escape* g:visincr_datedivset visincr.txt /*g:visincr_datedivset* getlatestvimscripts-install pi_getscript.txt /*getlatestvimscripts-install* getscript pi_getscript.txt /*getscript* @@ -1543,6 +1557,7 @@ matchit.txt matchit.txt /*matchit.txt* matchit.vim matchit.txt /*matchit.vim* netreadfixup pi_netrw.txt /*netreadfixup* netrw pi_netrw.txt /*netrw* +netrw-% pi_netrw.txt /*netrw-%* netrw-- pi_netrw.txt /*netrw--* netrw-D pi_netrw.txt /*netrw-D* netrw-O pi_netrw.txt /*netrw-O* @@ -1556,7 +1571,6 @@ netrw-bookmark pi_netrw.txt /*netrw-bookmark* netrw-bookmarks pi_netrw.txt /*netrw-bookmarks* netrw-browse pi_netrw.txt /*netrw-browse* netrw-browse-cmds pi_netrw.txt /*netrw-browse-cmds* -netrw-browse-intro pi_netrw.txt /*netrw-browse-intro* netrw-browse-maps pi_netrw.txt /*netrw-browse-maps* netrw-browser pi_netrw.txt /*netrw-browser* netrw-browser-options pi_netrw.txt /*netrw-browser-options* @@ -1571,7 +1585,6 @@ netrw-cr pi_netrw.txt /*netrw-cr* netrw-credits pi_netrw.txt /*netrw-credits* netrw-ctrl-h pi_netrw.txt /*netrw-ctrl-h* netrw-ctrl-l pi_netrw.txt /*netrw-ctrl-l* -netrw-ctrl_h pi_netrw.txt /*netrw-ctrl_h* netrw-ctrl_l pi_netrw.txt /*netrw-ctrl_l* netrw-curdir pi_netrw.txt /*netrw-curdir* netrw-d pi_netrw.txt /*netrw-d* @@ -1595,11 +1608,13 @@ netrw-gx pi_netrw.txt /*netrw-gx* netrw-handler pi_netrw.txt /*netrw-handler* netrw-help pi_netrw.txt /*netrw-help* netrw-hexplore pi_netrw.txt /*netrw-hexplore* +netrw-hide pi_netrw.txt /*netrw-hide* netrw-hiding pi_netrw.txt /*netrw-hiding* netrw-history pi_netrw.txt /*netrw-history* netrw-horiz pi_netrw.txt /*netrw-horiz* netrw-i pi_netrw.txt /*netrw-i* netrw-incompatible pi_netrw.txt /*netrw-incompatible* +netrw-intro-browse pi_netrw.txt /*netrw-intro-browse* netrw-list pi_netrw.txt /*netrw-list* netrw-listbookmark pi_netrw.txt /*netrw-listbookmark* netrw-listhack pi_netrw.txt /*netrw-listhack* @@ -1610,6 +1625,7 @@ netrw-mc pi_netrw.txt /*netrw-mc* netrw-md pi_netrw.txt /*netrw-md* netrw-me pi_netrw.txt /*netrw-me* netrw-mf pi_netrw.txt /*netrw-mf* +netrw-mg pi_netrw.txt /*netrw-mg* netrw-mh pi_netrw.txt /*netrw-mh* netrw-ml_get pi_netrw.txt /*netrw-ml_get* netrw-mm pi_netrw.txt /*netrw-mm* @@ -1652,6 +1668,11 @@ netrw-psftp pi_netrw.txt /*netrw-psftp* netrw-putty pi_netrw.txt /*netrw-putty* netrw-qb pi_netrw.txt /*netrw-qb* netrw-qf pi_netrw.txt /*netrw-qf* +netrw-quickcom pi_netrw.txt /*netrw-quickcom* +netrw-quickcoms pi_netrw.txt /*netrw-quickcoms* +netrw-quickhelp pi_netrw.txt /*netrw-quickhelp* +netrw-quickmap pi_netrw.txt /*netrw-quickmap* +netrw-quickmaps pi_netrw.txt /*netrw-quickmaps* netrw-r pi_netrw.txt /*netrw-r* netrw-read pi_netrw.txt /*netrw-read* netrw-ref pi_netrw.txt /*netrw-ref* diff --git a/vimfiles/plugin/MultipleSearch.vim b/vimfiles/plugin/MultipleSearch.vim new file mode 100644 index 0000000..e0b470b --- /dev/null +++ b/vimfiles/plugin/MultipleSearch.vim @@ -0,0 +1,51 @@ +" File: MultipleSearch.vim (global plugin) +" Last Changed: 14 Aug 2008 +" Maintainer: Dan Sharp <dwsharp at hotmail dot com> +" Version: 1.3 +" License: Vim License +" GetLatestVimScripts: 479 1 :AutoInstall: MultipleSearch.vba + +if exists('loaded_multiplesearch') + finish +endif +let loaded_multiplesearch = 1 + + +" Vim versions prior to 7.0 don't support the autoload mechanism, so go ahead +" and load the 'autoload' segment of the code and map the commands using the +" non-autoload format. +if v:version < 700 + runtime autoload/MultipleSearch.vim + + if !(exists(":SearchBuffers") == 2) + command -nargs=* SearchBuffers :silent call MultipleSearch(1, <q-args>) + endif + + if !(exists(":Search") == 2) + command -nargs=* Search :silent call MultipleSearch(0, <q-args>) + endif + + " Following Manuel's idea, adapt the former 'Super Star' tip from vim.org to work with + " :Search on a visual selection. + "vnoremap <silent> <Leader>* y:execute ':Search \V<C-R>=substitute(escape(@@,"/\\"),"\n","\\\\n","ge")<CR>'<CR> + vnoremap <silent> <Leader>* y:call MultipleSearch(0,'\V'.substitute(escape(@@,"\\/\"'"),"\n",'\\n','ge'))<CR> +else + " Only autoload the Search commands, since we shouldn't need to use + " :SearchReset and :SearchReinit until after the first :Search. + if !(exists(":SearchBuffers") == 2) + command -nargs=* SearchBuffers :silent call MultipleSearch#MultipleSearch(1, <q-args>) + endif + + if !(exists(":Search") == 2) + command -nargs=* Search :silent call MultipleSearch#MultipleSearch(0, <q-args>) + endif + + " Following Manuel's idea, adapt the former 'Super Star' tip from vim.org to work with + " :Search on a visual selection. + vnoremap <silent> <Leader>* y:call MultipleSearch#MultipleSearch(0,'\V'.substitute(escape(@@,"\\/\"'"),"\n",'\\n','ge'))<CR> +endif + +" Thanks to Manuel Picaza for the following mapping to :Search the word under +" the cursor. +nnoremap <silent> <Leader>* :execute ':Search \<' . expand('<cword>') . '\>'<cr> + diff --git a/vimfiles/plugin/matrix.vim b/vimfiles/plugin/matrix.vim index 3128644..9ed838d 100644 --- a/vimfiles/plugin/matrix.vim +++ b/vimfiles/plugin/matrix.vim @@ -22,10 +22,16 @@ " Doesn't work if multiple windows exist before script started. In " that case the script will abort with error message. " +" If the current buffer is modified, some error messages will appear +" before the script starts, and an extra window is left behind after +" the script exits. Workaround: save your buffers first. +" "Other Info: " Inspired by cmatrix... " Didn't feel inspired enough to start using pico/nano, of course ^_^; " +" 05/13/08 - disable cursorline, cursorcolumn and spell +" (thanks to Diederick Niehorster for the suggestion). " 12/21/06 - multiwindow support by S. Lockwood-Childs. " 10/03/05 - added silent! to cursor positioning code to stop drawing " numbers during animation (thanks to David Eggum for the @@ -199,6 +205,12 @@ function! s:Init() let s:o_ts = &titlestring exec 'set titlestring=\ ' endif + if v:version >= 700 + let s:o_spell = &spell + let s:o_cul = &cul + let s:o_cuc = &cuc + set nospell nocul nocuc + endif let s:o_ch = &ch let s:o_ls = &ls let s:o_lz = &lz @@ -259,6 +271,12 @@ function! s:Cleanup() let &titlestring = s:o_ts unlet s:o_ts endif + if v:version >= 700 + let &spell = s:o_spell + let &cul = s:o_cul + let &cuc = s:o_cuc + unlet s:o_cul s:o_cuc + endif let &ch = s:o_ch let &ls = s:o_ls let &lz = s:o_lz @@ -298,9 +316,9 @@ function! Matrix() endfunction -if !has('virtualedit') || !has('windows') +if !has('virtualedit') || !has('windows') || !has('syntax') echohl ErrorMsg - echon 'Not enough features, need at least +virtualedit and +windows' + echon 'Not enough features, need at least +virtualedit, +windows and +syntax' echohl None else command! Matrix call Matrix() diff --git a/vimfiles/plugin/netrwPlugin.vim b/vimfiles/plugin/netrwPlugin.vim index 03b9591..e30ad82 100644 --- a/vimfiles/plugin/netrwPlugin.vim +++ b/vimfiles/plugin/netrwPlugin.vim @@ -1,9 +1,9 @@ " netrwPlugin.vim: Handles file transfer and remote directory listing across a network " PLUGIN SECTION -" Date: Aug 09, 2007 +" Date: Aug 10, 2008 " Maintainer: Charles E Campbell, Jr <NdrOchip@ScampbellPfamily.AbizM-NOSPAM> " GetLatestVimScripts: 1075 1 :AutoInstall: netrw.vim -" Copyright: Copyright (C) 1999-2005 Charles E. Campbell, Jr. {{{1 +" Copyright: Copyright (C) 1999-2008 Charles E. Campbell, Jr. {{{1 " Permission is hereby granted to use and distribute this code, " with or without modifications, provided that this copyright " notice is copied with it. Like anything else that's free, @@ -22,7 +22,7 @@ if &cp || exists("g:loaded_netrwPlugin") finish endif -let g:loaded_netrwPlugin = "v123" +let g:loaded_netrwPlugin = "v133" let s:keepcpo = &cpo if v:version < 700 echohl WarningMsg | echo "***netrw*** you need vim version 7.0 for this version of netrw" | echohl None @@ -47,19 +47,19 @@ augroup END augroup Network au! if has("win32") || has("win95") || has("win64") || has("win16") - au BufReadCmd file://* exe "silent doau BufReadPre ".netrw#RFC2396(expand("<amatch>"))|exe 'e '.substitute(netrw#RFC2396(expand("<amatch>")),'file://\(.*\)','\1',"")|exe "bwipe ".expand("<amatch>")|exe "silent doau BufReadPost ".netrw#RFC2396(expand("<amatch>")) + au BufReadCmd file://* exe "silent doau BufReadPre ".fnameescape(netrw#RFC2396(expand("<amatch>")))|exe 'e '.fnameescape(substitute(netrw#RFC2396(expand("<amatch>")),'file://\(.*\)','\1',""))|exe "bwipe ".fnameescape(expand("<amatch>"))|exe "silent doau BufReadPost ".fnameescape(netrw#RFC2396(expand("<amatch>"))) else - au BufReadCmd file://* exe "silent doau BufReadPre ".netrw#RFC2396(expand("<amatch>"))|exe 'e '.substitute(netrw#RFC2396(expand("<amatch>")),'file://\(.*\)','\1',"")|exe "bwipe ".expand("<amatch>")|exe "silent doau BufReadPost ".netrw#RFC2396(expand("<amatch>")) - au BufReadCmd file://localhost/* exe "silent doau BufReadPre ".netrw#RFC2396(expand("<amatch>"))|exe 'e '.substitute(netrw#RFC2396(expand("<amatch>")),'file://localhost/\(.*\)','\1',"")|exe "bwipe ".substitute(expand("<amatch>"),'file://\(\k\+@\)\=','','')|exe "silent doau BufReadPost ".netrw#RFC2396(expand("<amatch>")) + au BufReadCmd file://* exe "silent doau BufReadPre ".fnameescape(netrw#RFC2396(expand("<amatch>")))|exe 'e '.fnameescape(substitute(netrw#RFC2396(expand("<amatch>")),'file://\(.*\)','\1',""))|exe "bwipe ".fnameescape(expand("<amatch>"))|exe "silent doau BufReadPost ".fnameescape(netrw#RFC2396(expand("<amatch>"))) + au BufReadCmd file://localhost/* exe "silent doau BufReadPre ".fnameescape(netrw#RFC2396(expand("<amatch>")))|exe 'e '.fnameescape(substitute(netrw#RFC2396(expand("<amatch>")),'file://localhost/\(.*\)','\1',""))|exe "bwipe ".fnameescape(substitute(expand("<amatch>"),'file://\(\k\+@\)\=','',''))|exe "silent doau BufReadPost ".fnameescape(netrw#RFC2396(expand("<amatch>"))) endif - au BufReadCmd ftp://*,rcp://*,scp://*,http://*,dav://*,rsync://*,sftp://* exe "silent doau BufReadPre ".expand("<amatch>")|exe '2Nread "'.expand("<amatch>").'"'|exe "silent doau BufReadPost ".expand("<amatch>") - au FileReadCmd ftp://*,rcp://*,scp://*,http://*,dav://*,rsync://*,sftp://* exe "silent doau FileReadPre ".expand("<amatch>")|exe 'Nread "' .expand("<amatch>").'"'|exe "silent doau FileReadPost ".expand("<amatch>") - au BufWriteCmd ftp://*,rcp://*,scp://*,dav://*,rsync://*,sftp://* exe "silent doau BufWritePre ".expand("<amatch>")|exe 'Nwrite "' .expand("<amatch>").'"'|exe "silent doau BufWritePost ".expand("<amatch>") - au FileWriteCmd ftp://*,rcp://*,scp://*,dav://*,rsync://*,sftp://* exe "silent doau FileWritePre ".expand("<amatch>")|exe "'[,']".'Nwrite "' .expand("<amatch>").'"'|exe "silent doau FileWritePost ".expand("<amatch>") + au BufReadCmd ftp://*,rcp://*,scp://*,http://*,dav://*,davs://*,rsync://*,sftp://* exe "silent doau BufReadPre ".fnameescape(expand("<amatch>"))|exe '2Nread '.fnameescape(expand("<amatch>"))|exe "silent doau BufReadPost ".fnameescape(expand("<amatch>")) + au FileReadCmd ftp://*,rcp://*,scp://*,http://*,dav://*,davs://*,rsync://*,sftp://* exe "silent doau FileReadPre ".fnameescape(expand("<amatch>"))|exe 'Nread '.fnameescape(expand("<amatch>"))|exe "silent doau FileReadPost ".fnameescape(expand("<amatch>")) + au BufWriteCmd ftp://*,rcp://*,scp://*,dav://*,davs://*,rsync://*,sftp://* exe "silent doau BufWritePre ".fnameescape(expand("<amatch>"))|exe 'Nwrite '.fnameescape(expand("<amatch>"))|exe "silent doau BufWritePost ".fnameescape(expand("<amatch>")) + au FileWriteCmd ftp://*,rcp://*,scp://*,dav://*,davs://*,rsync://*,sftp://* exe "silent doau FileWritePre ".fnameescape(expand("<amatch>"))|exe "'[,']".'Nwrite '.fnameescape(expand("<amatch>"))|exe "silent doau FileWritePost ".fnameescape(expand("<amatch>")) try - au SourceCmd ftp://*,rcp://*,scp://*,http://*,dav://*,rsync://*,sftp://* exe 'Nsource "'.expand("<amatch>").'"' + au SourceCmd ftp://*,rcp://*,scp://*,http://*,dav://*,davs://*,rsync://*,sftp://* exe 'Nsource '.fnameescape(expand("<amatch>")) catch /^Vim\%((\a\+)\)\=:E216/ - au SourcePre ftp://*,rcp://*,scp://*,http://*,dav://*,rsync://*,sftp://* exe 'Nsource "'.expand("<amatch>").'"' + au SourcePre ftp://*,rcp://*,scp://*,http://*,dav://*,davs://*,rsync://*,sftp://* exe 'Nsource '.fnameescape(expand("<amatch>")) endtry augroup END @@ -87,7 +87,7 @@ if !exists("g:netrw_nogx") && maparg('g','n') == "" if !hasmapto('<Plug>NetrwBrowseX') nmap <unique> gx <Plug>NetrwBrowseX endif - nno <silent> <Plug>NetrwBrowseX :call netrw#NetBrowseX(expand("<cWORD>"),0)<cr> + nno <silent> <Plug>NetrwBrowseX :call netrw#NetrwBrowseX(expand("<cWORD>"),0)<cr> endif " --------------------------------------------------------------------- @@ -155,24 +155,6 @@ fun! NetUserPass(...) " call Dret("NetUserPass") endfun -" ------------------------------------------------------------------------ -" NetReadFixup: this sort of function is typically written by the user {{{1 -" to handle extra junk that their system's ftp dumps -" into the transfer. This function is provided as an -" example and as a fix for a Windows 95 problem: in my -" experience, win95's ftp always dumped four blank lines -" at the end of the transfer. -if has("win95") && exists("g:netrw_win95ftp") && g:netrw_win95ftp - fun! NetReadFixup(method, line1, line2) -" call Dfunc("NetReadFixup(method<".a:method."> line1=".a:line1." line2=".a:line2.")") - if method == 3 " ftp (no <.netrc>) - let fourblanklines= line2 - 3 - silent fourblanklines.",".line2."g/^\s*/d" - endif -" call Dret("NetReadFixup") - endfun -endif - " ------------------------------------------------------------------------ " Modelines And Restoration: {{{1 let &cpo= s:keepcpo diff --git a/vimfiles/plugin/tComment.vim b/vimfiles/plugin/tComment.vim index 3810663..2eba17a 100644 --- a/vimfiles/plugin/tComment.vim +++ b/vimfiles/plugin/tComment.vim @@ -2,44 +2,62 @@ " @Author: Thomas Link (micathom AT gmail com) " @License: GPL (see http://www.gnu.org/licenses/gpl.txt) " @Created: 27-Dez-2004. -" @Last Change: 2007-08-30. -" @Revision: 1.7.608 +" @Last Change: 2008-05-15. +" @Revision: 1.9.664 " -" vimscript #1173 +" GetLatestVimScripts: 1173 1 tComment.vim if &cp || exists('loaded_tcomment') finish endif -let loaded_tcomment = 107 - -function! s:DefVar(name, val) - if !exists(a:name) - " exec "let ". a:name ."='". a:val ."'" - exec 'let '. a:name .'="'. escape(a:val, '"\') .'"' - endif -endf +let loaded_tcomment = 109 " If true, comment blank lines too -call s:DefVar('g:tcommentBlankLines', 1) +if !exists("g:tcommentBlankLines") + let g:tcommentBlankLines = 1 +endif -call s:DefVar('g:tcommentMapLeader1', '<c-_>') -call s:DefVar('g:tcommentMapLeader2', '<Leader>_') -" call s:DefVar('g:tcommentMapLeaderOp1', '<Leader>-') -call s:DefVar('g:tcommentMapLeaderOp1', 'gc') -call s:DefVar('g:tcommentMapLeaderOp2', 'gC') -call s:DefVar('g:tcommentOpModeExtra', '') +if !exists("g:tcommentMapLeader1") + let g:tcommentMapLeader1 = '<c-_>' +endif +if !exists("g:tcommentMapLeader2") + let g:tcommentMapLeader2 = '<Leader>_' +endif +if !exists("g:tcommentMapLeaderOp1") + let g:tcommentMapLeaderOp1 = 'gc' +endif +if !exists("g:tcommentMapLeaderOp2") + let g:tcommentMapLeaderOp2 = 'gC' +endif +if !exists("g:tcommentOpModeExtra") + let g:tcommentOpModeExtra = '' +endif " Guess the file type based on syntax names always or for some fileformat only -call s:DefVar('g:tcommentGuessFileType', 0) +if !exists("g:tcommentGuessFileType") + let g:tcommentGuessFileType = 0 +endif " In php documents, the php part is usually marked as phpRegion. We thus " assume that the buffers default comment style isn't php but html -call s:DefVar('g:tcommentGuessFileType_dsl', 'xml') -call s:DefVar('g:tcommentGuessFileType_php', 'html') -call s:DefVar('g:tcommentGuessFileType_html', 1) -call s:DefVar('g:tcommentGuessFileType_tskeleton', 1) -call s:DefVar('g:tcommentGuessFileType_vim', 1) +if !exists("g:tcommentGuessFileType_dsl") + let g:tcommentGuessFileType_dsl = 'xml' +endif +if !exists("g:tcommentGuessFileType_php") + let g:tcommentGuessFileType_php = 'html' +endif +if !exists("g:tcommentGuessFileType_html") + let g:tcommentGuessFileType_html = 1 +endif +if !exists("g:tcommentGuessFileType_tskeleton") + let g:tcommentGuessFileType_tskeleton = 1 +endif +if !exists("g:tcommentGuessFileType_vim") + let g:tcommentGuessFileType_vim = 1 +endif -call s:DefVar('g:tcommentIgnoreTypes_php', 'sql') +if !exists("g:tcommentIgnoreTypes_php") + let g:tcommentIgnoreTypes_php = 'sql' +endif if !exists('g:tcommentSyntaxMap') "{{{2 let g:tcommentSyntaxMap = { @@ -61,30 +79,45 @@ endif " I personally find this style rather irritating but here is an alternative " definition that does this left-handed bar thing -call s:DefVar('g:tcommentBlockC', "/*%s */\n * ") -call s:DefVar('g:tcommentBlockC2', "/**%s */\n * ") -" call s:DefVar('g:tcommentBlockC', "/*%s */\n ") -call s:DefVar('g:tcommentInlineC', "/* %s */") +if !exists("g:tcommentBlockC") + let g:tcommentBlockC = "/*%s */\n * " +endif +if !exists("g:tcommentBlockC2") + let g:tcommentBlockC2 = "/**%s */\n * " +endif +if !exists("g:tcommentInlineC") + let g:tcommentInlineC = "/* %s */" +endif -call s:DefVar('g:tcommentBlockXML', "<!--%s-->\n ") -call s:DefVar('g:tcommentInlineXML', "<!-- %s -->") +if !exists("g:tcommentBlockXML") + let g:tcommentBlockXML = "<!--%s-->\n " +endif +if !exists("g:tcommentInlineXML") + let g:tcommentInlineXML = "<!-- %s -->" +endif + +let g:tcommentFileTypesDirty = 1 " Currently this function just sets a variable function! TCommentDefineType(name, commentstring) - call s:DefVar('g:tcomment_'. a:name, a:commentstring) - let s:tcommentFileTypesDirty = 1 + if !exists('g:tcomment_'. a:name) + let g:tcomment_{a:name} = a:commentstring + endif + let g:tcommentFileTypesDirty = 1 endf function! TCommentTypeExists(name) return exists('g:tcomment_'. a:name) endf +call TCommentDefineType('aap', '# %s' ) call TCommentDefineType('ada', '-- %s' ) call TCommentDefineType('apache', '# %s' ) call TCommentDefineType('autoit', '; %s' ) +call TCommentDefineType('asm', '; %s' ) call TCommentDefineType('awk', '# %s' ) call TCommentDefineType('catalog', '-- %s --' ) -call TCommentDefineType('catalog_block', '--%s--\n ' ) +call TCommentDefineType('catalog_block', "--%s--\n " ) call TCommentDefineType('cpp', '// %s' ) call TCommentDefineType('cpp_inline', g:tcommentInlineC ) call TCommentDefineType('cpp_block', g:tcommentBlockC ) @@ -105,9 +138,11 @@ call TCommentDefineType('dosini', '; %s' ) call TCommentDefineType('dsl', '; %s' ) call TCommentDefineType('dylan', '// %s' ) call TCommentDefineType('eiffel', '-- %s' ) +call TCommentDefineType('eruby', '<%%# %s%%>' ) call TCommentDefineType('gtkrc', '# %s' ) +call TCommentDefineType('gitcommit', '# %s' ) call TCommentDefineType('haskell', '-- %s' ) -call TCommentDefineType('haskell_block', '{-%s-}\n ' ) +call TCommentDefineType('haskell_block', "{-%s-}\n " ) call TCommentDefineType('haskell_inline', '{- %s -}' ) call TCommentDefineType('html', '<!-- %s -->' ) call TCommentDefineType('html_inline', g:tcommentInlineXML) @@ -122,32 +157,37 @@ call TCommentDefineType('javascript_block', g:tcommentBlockC ) call TCommentDefineType('java', '/* %s */' ) call TCommentDefineType('java_inline', g:tcommentInlineC ) call TCommentDefineType('java_block', g:tcommentBlockC ) +call TCommentDefineType('java_doc_block', g:tcommentBlockC2 ) call TCommentDefineType('lisp', '; %s' ) call TCommentDefineType('m4', 'dnl %s' ) call TCommentDefineType('mail', '> %s' ) +call TCommentDefineType('msidl', '// %s' ) +call TCommentDefineType('msidl_block', g:tcommentBlockC ) call TCommentDefineType('nroff', '.\\" %s' ) +call TCommentDefineType('nsis', '# %s' ) call TCommentDefineType('objc', '/* %s */' ) call TCommentDefineType('objc_inline', g:tcommentInlineC ) call TCommentDefineType('objc_block', g:tcommentBlockC ) call TCommentDefineType('ocaml', '(* %s *)' ) call TCommentDefineType('ocaml_inline', '(* %s *)' ) -call TCommentDefineType('ocaml_block', '(*%s*)\n ' ) +call TCommentDefineType('ocaml_block', "(*%s*)\n " ) call TCommentDefineType('pascal', '(* %s *)' ) call TCommentDefineType('pascal_inline', '(* %s *)' ) -call TCommentDefineType('pascal_block', '(*%s*)\n ' ) +call TCommentDefineType('pascal_block', "(*%s*)\n " ) call TCommentDefineType('perl', '# %s' ) -call TCommentDefineType('perl_block', '=cut%s=cut' ) +call TCommentDefineType('perl_block', "=cut%s=cut" ) call TCommentDefineType('php', '// %s' ) call TCommentDefineType('php_inline', g:tcommentInlineC ) call TCommentDefineType('php_block', g:tcommentBlockC ) call TCommentDefineType('php_2_block', g:tcommentBlockC2 ) call TCommentDefineType('po', '# %s' ) call TCommentDefineType('prolog', '%% %s' ) +call TCommentDefineType('rc', '// %s' ) call TCommentDefineType('readline', '# %s' ) call TCommentDefineType('ruby', '# %s' ) call TCommentDefineType('ruby_3', '### %s' ) -call TCommentDefineType('ruby_block', '=begin rdoc%s=end') -call TCommentDefineType('ruby_nodoc_block', '=begin%s=end' ) +call TCommentDefineType('ruby_block', "=begin rdoc%s=end") +call TCommentDefineType('ruby_nodoc_block', "=begin%s=end" ) call TCommentDefineType('r', '# %s' ) call TCommentDefineType('sbs', "' %s" ) call TCommentDefineType('scheme', '; %s' ) @@ -159,7 +199,9 @@ call TCommentDefineType('sh', '# %s' ) call TCommentDefineType('sql', '-- %s' ) call TCommentDefineType('spec', '# %s' ) call TCommentDefineType('sps', '* %s.' ) -call TCommentDefineType('sps_block', '* %s.' ) +call TCommentDefineType('sps_block', "* %s." ) +call TCommentDefineType('spss', '* %s.' ) +call TCommentDefineType('spss_block', "* %s." ) call TCommentDefineType('tcl', '# %s' ) call TCommentDefineType('tex', '%% %s' ) call TCommentDefineType('tpl', '<!-- %s -->' ) @@ -172,211 +214,34 @@ call TCommentDefineType('websec', '# %s' ) call TCommentDefineType('xml', '<!-- %s -->' ) call TCommentDefineType('xml_inline', g:tcommentInlineXML) call TCommentDefineType('xml_block', g:tcommentBlockXML ) +call TCommentDefineType('xs', '// %s' ) +call TCommentDefineType('xs_block', g:tcommentBlockC ) call TCommentDefineType('xslt', '<!-- %s -->' ) call TCommentDefineType('xslt_inline', g:tcommentInlineXML) call TCommentDefineType('xslt_block', g:tcommentBlockXML ) call TCommentDefineType('yaml', '# %s' ) -let s:tcommentFileTypesDirty = 1 - -function! s:DefaultValue(option) - exec 'let '. a:option .' = &'. a:option - exec 'set '. a:option .'&' - exec 'let default = &'. a:option - exec 'let &'. a:option .' = '. a:option - return default -endf - -let s:defaultComments = s:DefaultValue('comments') -let s:defaultCommentString = s:DefaultValue('commentstring') -let s:nullCommentString = '%s' - -" TComment(line1, line2, ?commentMode, ?commentAnyway, ?commentBegin, ?commentEnd) -" commentMode: -" G ... guess -" B ... block -" I ... inline -" R ... right -function! TComment(beg, end, ...) - " save the cursor position - let co = col('.') - let li = line('.') - let s:pos_end = getpos("'>") - let commentMode = a:0 >= 1 ? a:1 : 'G' - let commentAnyway = a:0 >= 2 ? (a:2 == '!') : 0 - if commentMode =~# 'i' - let commentMode = substitute(commentMode, '\Ci', line("'<") == line("'>") ? 'I' : 'G', 'g') - endif - if commentMode =~# 'R' || commentMode =~# 'I' - let cstart = col("'<") - if cstart == 0 - let cstart = col('.') - endif - if commentMode =~# 'R' - let commentMode = substitute(commentMode, '\CR', 'G', 'g') - let cend = 0 - else - let cend = col("'>") - endif - else - let cstart = 0 - let cend = 0 - endif - " TLogVAR commentMode, cstart, cend - " get the correct commentstring - if a:0 >= 3 && a:3 != '' - let cms = s:EncodeCommentPart(a:3) .'%s' - if a:0 >= 4 && a:4 != '' - let cms = cms . s:EncodeCommentPart(a:4) - endif - else - let [cms, commentMode] = s:GetCommentString(a:beg, a:end, commentMode) - endif - let cms0 = s:BlockGetCommentString(cms) - let cms0 = escape(cms0, '\') - " make whitespace optional; this conflicts with comments that require some - " whitespace - let cmtCheck = substitute(cms0, '\([ ]\)', '\1\\?', 'g') - " turn commentstring into a search pattern - let cmtCheck = s:SPrintF(cmtCheck, '\(\_.\{-}\)') - " set commentMode and indentStr - let [indentStr, uncomment] = s:CommentDef(a:beg, a:end, cmtCheck, commentMode, cstart, cend) - " TLogVAR indentStr, uncomment - if commentAnyway - let uncomment = 0 - endif - " go - if commentMode =~# 'B' - " We want a comment block - call s:CommentBlock(a:beg, a:end, uncomment, cmtCheck, cms, indentStr) - else - " We want commented lines - " final search pattern for uncommenting - let cmtCheck = escape('\V\^\(\s\{-}\)'. cmtCheck .'\$', '"/\') - " final pattern for commenting - let cmtReplace = escape(cms0, '"/') - silent exec a:beg .','. a:end .'s/\V'. - \ s:StartRx(cstart) . indentStr .'\zs\(\.\*\)'. s:EndRx(cend) .'/'. - \ '\=s:ProcessedLine('. uncomment .', submatch(0), "'. cmtCheck .'", "'. cmtReplace .'")/ge' - endif - " reposition cursor - " TLogVAR commentMode - if commentMode =~ '>' - call setpos('.', s:pos_end) - else - " TLogVAR li, co - call cursor(li, co) - endif -endf - -" :line1,line2 TComment ?commentBegin ?commentEnd -command! -bang -range -nargs=* TComment keepjumps call TComment(<line1>, <line2>, 'G', "<bang>", <f-args>) - -" :line1,line2 TCommentRight ?commentBegin ?commentEnd -command! -bang -range -nargs=* TCommentRight keepjumps call TComment(<line1>, <line2>, 'R', "<bang>", <f-args>) - -" :line1,line2 TCommentBlock ?commentBegin ?commentEnd -command! -bang -range -nargs=* TCommentBlock keepjumps call TComment(<line1>, <line2>, 'B', "<bang>", <f-args>) - -" :line1,line2 TCommentInline ?commentBegin ?commentEnd -command! -bang -range -nargs=* TCommentInline keepjumps call TComment(<line1>, <line2>, 'I', "<bang>", <f-args>) - -" :line1,line2 TCommentMaybeInline ?commentBegin ?commentEnd -command! -bang -range -nargs=* TCommentMaybeInline keepjumps call TComment(<line1>, <line2>, 'i', "<bang>", <f-args>) - - -function! TCommentOperator(type, ...) "{{{3 - let commentMode = a:0 >= 1 ? a:1 : '' - let bang = a:0 >= 2 ? a:2 : '' - let sel_save = &selection - let &selection = "inclusive" - let reg_save = @@ - " let pos = getpos('.') - " TLogVAR a:type - try - if a:type == 'line' - silent exe "normal! '[V']" - let commentMode1 = 'G' - elseif a:type == 'block' - silent exe "normal! `[\<C-V>`]" - let commentMode1 = 'I' - else - silent exe "normal! `[v`]" - let commentMode1 = 'i' - endif - if empty(commentMode) - let commentMode = commentMode1 - endif - let beg = line("'[") - let end = line("']") - norm! - let commentMode .= g:tcommentOpModeExtra - call TComment(beg, end, commentMode, bang) - finally - let &selection = sel_save - let @@ = reg_save - if g:tcommentOpModeExtra !~ '>' - " TLogVAR pos - " call setpos('.', pos) - call setpos('.', w:tcommentPos) - unlet! w:tcommentPos - endif - endtry -endf - - -function! TCommentOperatorLine(type) "{{{3 - call TCommentOperator(a:type, 'G') -endf - - -function! TCommentOperatorAnyway(type) "{{{3 - call TCommentOperator(a:type, '', '!') -endf - - -function! TCommentOperatorLineAnyway(type) "{{{3 - call TCommentOperator(a:type, 'G', '!') -endf - - -" comment text as if it were of a specific filetype -function! TCommentAs(beg, end, commentAnyway, filetype, ...) - let ccount = a:0 >= 1 ? a:1 : 1 - " TLogVAR ccount - if a:filetype =~ '_block$' - let commentMode = 'B' - let ft = substitute(a:filetype, '_block$', '', '') - elseif a:filetype =~ '_inline$' - let commentMode = 'I' - let ft = substitute(a:filetype, '_inline$', '', '') - else - let commentMode = 'G' - let ft = a:filetype - endif - let [cms, commentMode] = s:GetCommentString(a:beg, a:end, commentMode, ft) - let pre = substitute(cms, '%s.*$', '', '') - let pre = substitute(pre, '%%', '%', 'g') - let post = substitute(cms, '^.\{-}%s', '', '') - let post = substitute(post, '%%', '%', 'g') - if ccount > 1 - let pre_l = matchlist(pre, '^\(\S\+\)\(.*\)$') - " TLogVAR pre_l - if !empty(get(pre_l, 1)) - let pre = repeat(pre_l[1], ccount) . pre_l[2] - endif - let post_l = matchlist(post, '^\(\s*\)\(.\+\)$') - " TLogVAR post_l - if !empty(get(post_l, 2)) - let post = post_l[1] . repeat(post_l[2], ccount) - endif - endif - keepjumps call TComment(a:beg, a:end, commentMode, a:commentAnyway, pre, post) -endf " :line1,line2 TCommentAs commenttype -command! -bang -complete=custom,TCommentFileTypes -range -nargs=+ TCommentAs - \ call TCommentAs(<line1>, <line2>, "<bang>", <f-args>) +command! -bang -complete=customlist,tcomment#FileTypes -range -nargs=+ TCommentAs + \ call tcomment#CommentAs(<line1>, <line2>, "<bang>", <f-args>) + +" :line1,line2 TComment ?commentBegin ?commentEnd +command! -bang -range -nargs=* TComment keepjumps call tcomment#Comment(<line1>, <line2>, 'G', "<bang>", <f-args>) + +" :line1,line2 TCommentRight ?commentBegin ?commentEnd +command! -bang -range -nargs=* TCommentRight keepjumps call tcomment#Comment(<line1>, <line2>, 'R', "<bang>", <f-args>) + +" :line1,line2 TCommentBlock ?commentBegin ?commentEnd +command! -bang -range -nargs=* TCommentBlock keepjumps call tcomment#Comment(<line1>, <line2>, 'B', "<bang>", <f-args>) + +" :line1,line2 TCommentInline ?commentBegin ?commentEnd +command! -bang -range -nargs=* TCommentInline keepjumps call tcomment#Comment(<line1>, <line2>, 'I', "<bang>", <f-args>) + +" :line1,line2 TCommentMaybeInline ?commentBegin ?commentEnd +command! -bang -range -nargs=* TCommentMaybeInline keepjumps call tcomment#Comment(<line1>, <line2>, 'i', "<bang>", <f-args>) + + if (g:tcommentMapLeader1 != '') exec 'noremap <silent> '. g:tcommentMapLeader1 .'<c-_> :TComment<cr>' @@ -413,363 +278,16 @@ if (g:tcommentMapLeader2 != '') exec 'noremap '. g:tcommentMapLeader2 .'s :TCommentAs <c-r>=&ft<cr>_' endif if (g:tcommentMapLeaderOp1 != '') - exec 'noremap <silent> '. g:tcommentMapLeaderOp1 .' :let w:tcommentPos = getpos(".") \| set opfunc=TCommentOperator<cr>g@' - exec 'noremap <silent> '. g:tcommentMapLeaderOp1 .'c :let w:tcommentPos = getpos(".") \| set opfunc=TCommentOperatorLine<cr>g@$' + exec 'nnoremap <silent> '. g:tcommentMapLeaderOp1 .' :let w:tcommentPos = getpos(".") \| set opfunc=tcomment#Operator<cr>g@' + exec 'nnoremap <silent> '. g:tcommentMapLeaderOp1 .'c :let w:tcommentPos = getpos(".") \| set opfunc=tcomment#OperatorLine<cr>g@$' + exec 'vnoremap <silent> '. g:tcommentMapLeaderOp1 .' :TCommentMaybeInline<cr>' endif if (g:tcommentMapLeaderOp2 != '') - exec 'noremap <silent> '. g:tcommentMapLeaderOp2 .' :let w:tcommentPos = getpos(".") \| set opfunc=TCommentOperatorAnyway<cr>g@' - exec 'noremap <silent> '. g:tcommentMapLeaderOp2 .'c :let w:tcommentPos = getpos(".") \| set opfunc=TCommentOperatorLineAnyway<cr>g@$' + exec 'nnoremap <silent> '. g:tcommentMapLeaderOp2 .' :let w:tcommentPos = getpos(".") \| set opfunc=tcomment#OperatorAnyway<cr>g@' + exec 'nnoremap <silent> '. g:tcommentMapLeaderOp2 .'c :let w:tcommentPos = getpos(".") \| set opfunc=tcomment#OperatorLineAnyway<cr>g@$' + exec 'vnoremap <silent> '. g:tcommentMapLeaderOp2 .' :TCommentMaybeInline<cr>' endif - -" ---------------------------------------------------------------- -" collect all variables matching ^tcomment_ -function! TCommentCollectFileTypes() - if s:tcommentFileTypesDirty - let t = @t - try - redir @t - silent let - redir END - let g:tcommentFileTypes = substitute("\n". @t ."\n", '\n\(tcomment_\(\w\+\)\|\w\+\).\{-}\ze\n', '\n\2', 'g') - let g:tcommentFileTypes = substitute(g:tcommentFileTypes, '\(\n\)\n\+', '\1', 'g') - let g:tcommentFileTypes = strpart(g:tcommentFileTypes, 1, strlen(g:tcommentFileTypes) - 2) - finally - let @t = t - endtry - let g:tcommentFileTypesRx = '\V\^\('. substitute(g:tcommentFileTypes, '\n', '\\|', 'g') .'\)\(\u\.\*\)\?\$' - let s:tcommentFileTypesDirty = 0 - endif -endf - -call TCommentCollectFileTypes() - -" return a list of filetypes for which a tcomment_{&ft} is defined -function! TCommentFileTypes(ArgLead, CmdLine, CursorPos) - call TCommentCollectFileTypes() - if a:ArgLead == '' - return &filetype ."\n". g:tcommentFileTypes - else - return g:tcommentFileTypes - endif -endf - -function! s:EncodeCommentPart(string) - return substitute(a:string, '%', '%%', 'g') -endf - -" s:GetCommentString(beg, end, commentMode, ?filetype="") -function! s:GetCommentString(beg, end, commentMode, ...) - let ft = a:0 >= 1 ? a:1 : '' - if ft != '' - let [cms, commentMode] = s:GetCustomCommentString(ft, a:commentMode) - else - let cms = '' - let commentMode = a:commentMode - endif - if cms == '' - if exists('b:commentstring') - let cms = b:commentstring - return s:GetCustomCommentString(&filetype, a:commentMode, cms) - elseif exists('b:commentStart') && b:commentStart != '' - let cms = s:EncodeCommentPart(b:commentStart) .' %s' - if exists('b:commentEnd') && b:commentEnd != '' - let cms = cms .' '. s:EncodeCommentPart(b:commentEnd) - endif - return s:GetCustomCommentString(&filetype, a:commentMode, cms) - elseif g:tcommentGuessFileType || (exists('g:tcommentGuessFileType_'. &filetype) - \ && g:tcommentGuessFileType_{&filetype} =~ '[^0]') - if g:tcommentGuessFileType_{&filetype} == 1 - let altFiletype = '' - else - let altFiletype = g:tcommentGuessFileType_{&filetype} - endif - return s:GuessFileType(a:beg, a:end, a:commentMode, &filetype, altFiletype) - else - return s:GetCustomCommentString(&filetype, a:commentMode, s:GuessCurrentCommentString(a:commentMode)) - endif - endif - return [cms, commentMode] -endf - -" s:SPrintF(formatstring, ?values ...) -" => string -function! s:SPrintF(string, ...) - let n = 1 - let r = '' - let s = a:string - while 1 - let i = match(s, '%\(.\)') - if i >= 0 - let x = s[i + 1] - let r = r . strpart(s, 0, i) - let s = strpart(s, i + 2) - if x == '%' - let r = r.'%' - else - if a:0 >= n - exec 'let v = a:'. n - let n = n + 1 - else - echoerr 'Malformed format string (too many arguments required): '. a:string - endif - if x ==# 's' - let r = r.v - elseif x ==# 'S' - let r = r.'"'.v.'"' - else - echoerr 'Malformed format string: '. a:string - endif - endif - else - return r.s - endif - endwh -endf - -function! s:StartRx(pos) - if a:pos == 0 - return '\^' - else - return '\%'. a:pos .'c' - endif -endf - -function! s:EndRx(pos) - if a:pos == 0 - return '\$' - else - return '\%'. a:pos .'c' - endif -endf - -function! s:GetIndentString(line, start) - let start = a:start > 0 ? a:start - 1 : 0 - return substitute(strpart(getline(a:line), start), '\V\^\s\*\zs\.\*\$', '', '') -endf - -function! s:CommentDef(beg, end, checkRx, commentMode, cstart, cend) - let mdrx = '\V'. s:StartRx(a:cstart) .'\s\*'. a:checkRx .'\s\*'. s:EndRx(0) - let line = getline(a:beg) - if a:cstart != 0 && a:cend != 0 - let line = strpart(line, 0, a:cend - 1) - endif - let uncomment = (line =~ mdrx) - let it = s:GetIndentString(a:beg, a:cstart) - let il = indent(a:beg) - let n = a:beg + 1 - while n <= a:end - if getline(n) =~ '\S' - let jl = indent(n) - if jl < il - let it = s:GetIndentString(n, a:cstart) - let il = jl - endif - if a:commentMode =~# 'G' - if !(getline(n) =~ mdrx) - let uncomment = 0 - endif - endif - endif - let n = n + 1 - endwh - if a:commentMode =~# 'B' - let t = @t - try - silent exec 'norm! '. a:beg.'G1|v'.a:end.'G$"ty' - let uncomment = (@t =~ mdrx) - finally - let @t = t - endtry - endif - return [it, uncomment] -endf - -function! s:ProcessedLine(uncomment, match, checkRx, replace) - if !(a:match =~ '\S' || g:tcommentBlankLines) - return a:match - endif - let ml = len(a:match) - if a:uncomment - let rv = substitute(a:match, a:checkRx, '\1\2', '') - else - let rv = s:SPrintF(a:replace, a:match) - endif - " let md = len(rv) - ml - let s:pos_end = getpos('.') - let s:pos_end[2] += len(rv) - " TLogVAR pe, md, a:match - let rv = escape(rv, '\ ') - let rv = substitute(rv, '\n', '\\\n', 'g') - return rv -endf - -function! s:CommentBlock(beg, end, uncomment, checkRx, replace, indentStr) - let t = @t - try - silent exec 'norm! '. a:beg.'G1|v'.a:end.'G$"td' - let ms = s:BlockGetMiddleString(a:replace) - let mx = escape(ms, '\') - if a:uncomment - let @t = substitute(@t, '\V\^\s\*'. a:checkRx .'\$', '\1', '') - if ms != '' - let @t = substitute(@t, '\V\n'. a:indentStr . mx, '\n'. a:indentStr, 'g') - endif - let @t = substitute(@t, '^\n', '', '') - let @t = substitute(@t, '\n\s*$', '', '') - else - let cs = s:BlockGetCommentString(a:replace) - let cs = a:indentStr . substitute(cs, '%s', '%s'. a:indentStr, '') - if ms != '' - let ms = a:indentStr . ms - let mx = a:indentStr . mx - let @t = substitute(@t, '^'. a:indentStr, '', 'g') - let @t = ms . substitute(@t, '\n'. a:indentStr, '\n'. mx, 'g') - endif - let @t = s:SPrintF(cs, "\n". @t ."\n") - endif - silent norm! "tP - finally - let @t = t - endtry -endf - -" inspired by Meikel Brandmeyer's EnhancedCommentify.vim -" this requires that a syntax names are prefixed by the filetype name -" s:GuessFileType(beg, end, commentMode, filetype, ?fallbackFiletype) -function! s:GuessFileType(beg, end, commentMode, filetype, ...) - if a:0 >= 1 && a:1 != '' - let [cms, commentMode] = s:GetCustomCommentString(a:1, a:commentMode) - if cms == '' - let cms = s:GuessCurrentCommentString(a:commentMode) - endif - else - let commentMode = s:CommentMode(a:commentMode, 'G') - let cms = s:GuessCurrentCommentString(0) - endif - let n = a:beg - while n <= a:end - let m = indent(n) + 1 - let le = col('$') - while m < le - let syntaxName = synIDattr(synID(n, m, 1), 'name') - let ftypeMap = get(g:tcommentSyntaxMap, syntaxName) - if !empty(ftypeMap) - return s:GetCustomCommentString(ftypeMap, a:commentMode, cms) - elseif syntaxName =~ g:tcommentFileTypesRx - let ft = substitute(syntaxName, g:tcommentFileTypesRx, '\1', '') - if exists('g:tcommentIgnoreTypes_'. a:filetype) && g:tcommentIgnoreTypes_{a:filetype} =~ '\<'.ft.'\>' - let m = m + 1 - else - return s:GetCustomCommentString(ft, a:commentMode, cms) - endif - elseif syntaxName == '' || syntaxName == 'None' || syntaxName =~ '^\u\+$' || syntaxName =~ '^\u\U*$' - let m = m + 1 - else - break - endif - endwh - let n = n + 1 - endwh - return [cms, commentMode] -endf - -function! s:CommentMode(commentMode, newmode) "{{{3 - return substitute(a:commentMode, '\w\+', a:newmode, 'g') -endf - -function! s:GuessCurrentCommentString(commentMode) - let valid_cms = (stridx(&commentstring, '%s') != -1) - if &commentstring != s:defaultCommentString && valid_cms - " The &commentstring appears to have been set and to be valid - return &commentstring - endif - if &comments != s:defaultComments - " the commentstring is the default one, so we assume that it wasn't - " explicitly set; we then try to reconstruct &cms from &comments - let cms = s:ConstructFromComments(a:commentMode) - if cms != s:nullCommentString - return cms - endif - endif - if valid_cms - " Before &commentstring appeared not to be set. As we don't know - " better we return it anyway if it is valid - return &commentstring - else - " &commentstring is invalid. So we return the identity string. - return s:nullCommentString - endif -endf - -function! s:ConstructFromComments(commentMode) - exec s:ExtractCommentsPart('') - if a:commentMode =~# 'G' && line != '' - return line .' %s' - endif - exec s:ExtractCommentsPart('s') - if s != '' - exec s:ExtractCommentsPart('e') - " if a:commentMode - " exec s:ExtractCommentsPart("m") - " if m != "" - " let m = "\n". m - " endif - " return s.'%s'.e.m - " else - return s.' %s '.e - " endif - endif - if line != '' - return line .' %s' - else - return s:nullCommentString - endif -endf - -function! s:ExtractCommentsPart(key) - " let key = a:key != "" ? a:key .'[^:]*' : "" - let key = a:key . '[bnflrxO0-9-]*' - let val = substitute(&comments, '^\(.\{-},\)\{-}'. key .':\([^,]\+\).*$', '\2', '') - if val == &comments - let val = '' - else - let val = substitute(val, '%', '%%', 'g') - endif - let var = a:key == '' ? 'line' : a:key - return 'let '. var .'="'. escape(val, '"') .'"' -endf - -" s:GetCustomCommentString(ft, commentMode, ?default="") -function! s:GetCustomCommentString(ft, commentMode, ...) - let commentMode = a:commentMode - let customComment = exists('g:tcomment_'. a:ft) - if commentMode =~# 'B' && exists('g:tcomment_'. a:ft .'_block') - let cms = g:tcomment_{a:ft}_block - elseif commentMode =~? 'I' && exists('g:tcomment_'. a:ft .'_inline') - let cms = g:tcomment_{a:ft}_inline - elseif customComment - let cms = g:tcomment_{a:ft} - let commentMode = s:CommentMode(commentMode, 'G') - elseif a:0 >= 1 - let cms = a:1 - let commentMode = s:CommentMode(commentMode, 'G') - else - let cms = '' - let commentMode = s:CommentMode(commentMode, 'G') - endif - return [cms, commentMode] -endf - -function! s:BlockGetCommentString(cms) - return substitute(a:cms, '\n.*$', '', '') -endf - -function! s:BlockGetMiddleString(cms) - let rv = substitute(a:cms, '^.\{-}\n\([^\n]*\)', '\1', '') - return rv == a:cms ? '' : rv -endf - finish @@ -847,3 +365,14 @@ syntax) - TComment: The use of the type argument has slightly changed (IG -> i, new: >) +1.8 +- Definitly require vim7 +- Split the plugin into autoload & plugin. +- g:TCommentFileTypes is a list +- Fixed some block comment strings +- Removed extraneous newline in some block comments. +- Maps for visal mode (thanks Krzysztof Goj) + +1.9 +- Fix left offset for inline comments (via operator binding) + diff --git a/vimfiles/plugin/vimballPlugin.vim b/vimfiles/plugin/vimballPlugin.vim index 128f0d2..04d13ac 100644 --- a/vimfiles/plugin/vimballPlugin.vim +++ b/vimfiles/plugin/vimballPlugin.vim @@ -16,7 +16,7 @@ if &cp || exists("g:loaded_vimballPlugin") finish endif -let g:loaded_vimballPlugin = "v25" +let g:loaded_vimballPlugin = "v26" let s:keepcpo = &cpo set cpo&vim @@ -25,7 +25,7 @@ set cpo&vim com! -ra -complete=file -na=+ -bang MkVimball call vimball#MkVimball(<line1>,<line2>,<bang>0,<f-args>) com! -na=? -complete=dir UseVimball call vimball#Vimball(1,<f-args>) com! -na=0 VimballList call vimball#Vimball(0) -com! -na=* -complete=dir RmVimball call vimball#RmVimball(<f-args>) +com! -na=* -complete=dir RmVimball call vimball#SaveSettings()|call vimball#RmVimball(<f-args>)|call vimball#RestoreSettings() au BufEnter *.vba.gz,*.vba.bz2,*.vba.zip call vimball#Decompress(expand("<amatch>")) au BufEnter *.vba setlocal ff=unix noma bt=nofile fmr=[[[,]]] fdm=marker|call vimball#ShowMesg(0,"Source this file to extract it! (:so %)") diff --git a/vimfiles/syntax/netrw.vim b/vimfiles/syntax/netrw.vim index 5e43293..1d9d328 100644 --- a/vimfiles/syntax/netrw.vim +++ b/vimfiles/syntax/netrw.vim @@ -1,103 +1,104 @@ -" Language : Netrw Remote-Directory Listing Syntax -" Maintainer : Charles E. Campbell, Jr. -" Last change: Feb 06, 2008 -" Version : 12 -" --------------------------------------------------------------------- - -" Syntax Clearing: {{{1 -if version < 600 - syntax clear -elseif exists("b:current_syntax") - finish -endif - -" --------------------------------------------------------------------- -" Directory List Syntax Highlighting: {{{1 -syn cluster NetrwGroup contains=netrwHide,netrwSortBy,netrwSortSeq,netrwQuickHelp,netrwVersion,netrwCopyTgt -syn cluster NetrwTreeGroup contains=netrwDir,netrwSymLink,netrwExe - -syn match netrwSpecial "\%(\S\+ \)*\S\+[*|=]\ze\%(\s\{2,}\|$\)" contains=netrwClassify -syn match netrwDir "\.\{1,2}/" contains=netrwClassify -syn match netrwDir "\%(\S\+ \)*\S\+/" contains=netrwClassify -syn match netrwSizeDate "\<\d\+\s\d\{1,2}/\d\{1,2}/\d\{4}\s" contains=netrwDateSep skipwhite nextgroup=netrwTime -syn match netrwSymLink "\%(\S\+ \)*\S\+@\ze\%(\s\{2,}\|$\)" contains=netrwClassify -syn match netrwExe "\%(\S\+ \)*\S\+\*\ze\%(\s\{2,}\|$\)" contains=netrwClassify -syn match netrwTreeBar "^\%(| \)*" contains=netrwTreeBarSpace nextgroup=@netrwTreeGroup -syn match netrwTreeBarSpace " " contained - -syn match netrwClassify "[*=|@/]\ze\%(\s\{2,}\|$\)" contained -syn match netrwDateSep "/" contained -syn match netrwTime "\d\{1,2}:\d\{2}:\d\{2}" contained contains=netrwTimeSep -syn match netrwTimeSep ":" - -syn match netrwComment '".*\%(\t\|$\)' contains=@NetrwGroup -syn match netrwHide '^"\s*\(Hid\|Show\)ing:' skipwhite nextgroup=netrwHidePat -syn match netrwSlash "/" contained -syn match netrwHidePat "[^,]\+" contained skipwhite nextgroup=netrwHideSep -syn match netrwHideSep "," contained transparent skipwhite nextgroup=netrwHidePat -syn match netrwSortBy "Sorted by" contained transparent skipwhite nextgroup=netrwList -syn match netrwSortSeq "Sort sequence:" contained transparent skipwhite nextgroup=netrwList -syn match netrwCopyTgt "Copy/Move Tgt:" contained transparent skipwhite nextgroup=netrwList -syn match netrwList ".*$" contained contains=netrwComma -syn match netrwComma "," contained -syn region netrwQuickHelp matchgroup=Comment start="Quick Help:\s\+" end="$" contains=netrwHelpCmd keepend contained -syn match netrwHelpCmd "\S\ze:" contained skipwhite nextgroup=netrwCmdSep -syn match netrwCmdSep ":" contained nextgroup=netrwCmdNote -syn match netrwCmdNote ".\{-}\ze " contained -syn match netrwVersion "(netrw.*)" contained - -" ----------------------------- -" Special filetype highlighting {{{1 -" ----------------------------- -if exists("g:netrw_special_syntax") && netrw_special_syntax - syn match netrwBak "\(\S\+ \)*\S\+\.bak\>" contains=netrwTreeBar - syn match netrwCompress "\(\S\+ \)*\S\+\.\%(gz\|bz2\|Z\|zip\)\>" contains=netrwTreeBar - syn match netrwData "\(\S\+ \)*\S\+\.dat\>" contains=netrwTreeBar - syn match netrwHdr "\(\S\+ \)*\S\+\.h\>" contains=netrwTreeBar - syn match netrwLib "\(\S\+ \)*\S*\.\%(a\|so\|lib\|dll\)\>" contains=netrwTreeBar - syn match netrwMakeFile "\<[mM]akefile\>\|\(\S\+ \)*\S\+\.mak\>" contains=netrwTreeBar - syn match netrwObj "\(\S\+ \)*\S*\.\%(o\|obj\)\>" contains=netrwTreeBar - syn match netrwTags "\<tags\>" contains=netrwTreeBar - syn match netrwTags "\<\(ANmenu\|ANtags\)\>" contains=netrwTreeBar - syn match netrwTilde "\(\S\+ \)*\S\+\~\>" contains=netrwTreeBar - syn match netrwTmp "\<tmp\(\S\+ \)*\S\+\>\|\(\S\+ \)*\S*tmp\>" contains=netrwTreeBar -endif - -" --------------------------------------------------------------------- -" Highlighting Links: {{{1 -if !exists("did_drchip_netrwlist_syntax") - let did_drchip_netrwlist_syntax= 1 - hi link netrwClassify Function - hi link netrwCmdSep Delimiter - hi link netrwComment Comment - hi link netrwDir Directory - hi link netrwHelpCmd Function - hi link netrwHidePat Statement - hi link netrwList Statement - hi link netrwVersion Identifier - hi link netrwSymLink Question - hi link netrwExe PreProc - hi link netrwDateSep Delimiter - - hi link netrwTreeBar Special - hi link netrwTimeSep netrwDateSep - hi link netrwComma netrwComment - hi link netrwHide netrwComment - hi link netrwMarkFile Identifier - - " special syntax highlighting (see :he g:netrw_special_syntax) - hi link netrwBak NonText - hi link netrwCompress Folded - hi link netrwData DiffChange - hi link netrwLib DiffChange - hi link netrwMakefile DiffChange - hi link netrwObj Folded - hi link netrwTilde Folded - hi link netrwTmp Folded - hi link netrwTags Folded -endif - -" Current Syntax: {{{1 -let b:current_syntax = "netrwlist" -" --------------------------------------------------------------------- -" vim: ts=8 fdm=marker +" Language : Netrw Remote-Directory Listing Syntax +" Maintainer : Charles E. Campbell, Jr. +" Last change: Aug 12, 2008 +" Version : 14 +" --------------------------------------------------------------------- + +" Syntax Clearing: {{{1 +if version < 600 + syntax clear +elseif exists("b:current_syntax") + finish +endif + +" --------------------------------------------------------------------- +" Directory List Syntax Highlighting: {{{1 +syn cluster NetrwGroup contains=netrwHide,netrwSortBy,netrwSortSeq,netrwQuickHelp,netrwVersion,netrwCopyTgt +syn cluster NetrwTreeGroup contains=netrwDir,netrwSymLink,netrwExe + +syn match netrwSpecial "\%(\S\+ \)*\S\+[*|=]\ze\%(\s\{2,}\|$\)" contains=netrwClassify +syn match netrwDir "\.\{1,2}/" contains=netrwClassify +syn match netrwDir "\%(\S\+ \)*\S\+/" contains=netrwClassify +syn match netrwSizeDate "\<\d\+\s\d\{1,2}/\d\{1,2}/\d\{4}\s" contains=netrwDateSep skipwhite nextgroup=netrwTime +syn match netrwSymLink "\%(\S\+ \)*\S\+@\ze\%(\s\{2,}\|$\)" contains=netrwClassify +syn match netrwExe "\%(\S\+ \)*\S\+\*\ze\%(\s\{2,}\|$\)" contains=netrwClassify +syn match netrwTreeBar "^\%(| \)*" contains=netrwTreeBarSpace nextgroup=@netrwTreeGroup +syn match netrwTreeBarSpace " " contained + +syn match netrwClassify "[*=|@/]\ze\%(\s\{2,}\|$\)" contained +syn match netrwDateSep "/" contained +syn match netrwTime "\d\{1,2}:\d\{2}:\d\{2}" contained contains=netrwTimeSep +syn match netrwTimeSep ":" + +syn match netrwComment '".*\%(\t\|$\)' contains=@NetrwGroup +syn match netrwHide '^"\s*\(Hid\|Show\)ing:' skipwhite nextgroup=netrwHidePat +syn match netrwSlash "/" contained +syn match netrwHidePat "[^,]\+" contained skipwhite nextgroup=netrwHideSep +syn match netrwHideSep "," contained skipwhite nextgroup=netrwHidePat +syn match netrwSortBy "Sorted by" contained transparent skipwhite nextgroup=netrwList +syn match netrwSortSeq "Sort sequence:" contained transparent skipwhite nextgroup=netrwList +syn match netrwCopyTgt "Copy/Move Tgt:" contained transparent skipwhite nextgroup=netrwList +syn match netrwList ".*$" contained contains=netrwComma +syn match netrwComma "," contained +syn region netrwQuickHelp matchgroup=Comment start="Quick Help:\s\+" end="$" contains=netrwHelpCmd keepend contained +syn match netrwHelpCmd "\S\ze:" contained skipwhite nextgroup=netrwCmdSep +syn match netrwCmdSep ":" contained nextgroup=netrwCmdNote +syn match netrwCmdNote ".\{-}\ze " contained +syn match netrwVersion "(netrw.*)" contained + +" ----------------------------- +" Special filetype highlighting {{{1 +" ----------------------------- +if exists("g:netrw_special_syntax") && netrw_special_syntax + syn match netrwBak "\(\S\+ \)*\S\+\.bak\>" contains=netrwTreeBar + syn match netrwCompress "\(\S\+ \)*\S\+\.\%(gz\|bz2\|Z\|zip\)\>" contains=netrwTreeBar + syn match netrwData "\(\S\+ \)*\S\+\.dat\>" contains=netrwTreeBar + syn match netrwHdr "\(\S\+ \)*\S\+\.h\>" contains=netrwTreeBar + syn match netrwLib "\(\S\+ \)*\S*\.\%(a\|so\|lib\|dll\)\>" contains=netrwTreeBar + syn match netrwMakeFile "\<[mM]akefile\>\|\(\S\+ \)*\S\+\.mak\>" contains=netrwTreeBar + syn match netrwObj "\(\S\+ \)*\S*\.\%(o\|obj\)\>" contains=netrwTreeBar + syn match netrwTags "\<tags\>" contains=netrwTreeBar + syn match netrwTags "\<\(ANmenu\|ANtags\)\>" contains=netrwTreeBar + syn match netrwTilde "\(\S\+ \)*\S\+\~\>" contains=netrwTreeBar + syn match netrwTmp "\<tmp\(\S\+ \)*\S\+\>\|\(\S\+ \)*\S*tmp\>" contains=netrwTreeBar +endif + +" --------------------------------------------------------------------- +" Highlighting Links: {{{1 +if !exists("did_drchip_netrwlist_syntax") + let did_drchip_netrwlist_syntax= 1 + hi default link netrwClassify Function + hi default link netrwCmdSep Delimiter + hi default link netrwComment Comment + hi default link netrwDir Directory + hi default link netrwHelpCmd Function + hi default link netrwHidePat Statement + hi default link netrwHideSep netrwComment + hi default link netrwList Statement + hi default link netrwVersion Identifier + hi default link netrwSymLink Question + hi default link netrwExe PreProc + hi default link netrwDateSep Delimiter + + hi default link netrwTreeBar Special + hi default link netrwTimeSep netrwDateSep + hi default link netrwComma netrwComment + hi default link netrwHide netrwComment + hi default link netrwMarkFile Identifier + + " special syntax highlighting (see :he g:netrw_special_syntax) + hi default link netrwBak NonText + hi default link netrwCompress Folded + hi default link netrwData DiffChange + hi default link netrwLib DiffChange + hi default link netrwMakefile DiffChange + hi default link netrwObj Folded + hi default link netrwTilde Folded + hi default link netrwTmp Folded + hi default link netrwTags Folded +endif + +" Current Syntax: {{{1 +let b:current_syntax = "netrwlist" +" --------------------------------------------------------------------- +" vim: ts=8 fdm=marker