1833
1806
" ---------------------------------------------------------------------
1807
" s:ExplorePatHls: converts an Explore pattern into a regular expression search pattern {{{2
1808
fun! s:ExplorePatHls(pattern)
1809
" call Dfunc("s:ExplorePatHls(pattern<".a:pattern.">)")
1810
let repat= substitute(a:pattern,'^**/\{1,2}','','')
1811
" call Decho("repat<".repat.">")
1812
let repat= escape(repat,'][.\')
1813
" call Decho("repat<".repat.">")
1814
let repat= '\<'.substitute(repat,'\*','\\(\\S\\+ \\)*\\S\\+','g').'\>'
1815
" call Dret("s:ExplorePatHls repat<".repat.">")
1819
" ---------------------------------------------------------------------
1820
" s:NetrwBookmarkDir: {{{2
1821
" 0: (user: <mb>) bookmark current directory
1822
" 1: (user: <gb>) change to the bookmarked directory
1823
" 2: (user: <qb>) list bookmarks
1824
" 3: (browsing) record current directory history
1825
" 4: (user: <u>) go up (previous) bookmark
1826
" 5: (user: <U>) go down (next) bookmark
1827
" 6: (user: <mB>) delete bookmark
1828
fun! s:NetrwBookmarkDir(chg,curdir)
1829
" 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)
1832
" bookmark the current directory
1833
" call Decho("(user: <b>) bookmark the current directory")
1835
" handle bookmark# specified via the count
1836
let g:NETRW_BOOKMARKDIR_{v:count}= a:curdir
1837
if !exists("g:NETRW_BOOKMARKMAX")
1838
let g:NETRW_BOOKMARKMAX= v:count
1839
elseif v:count > g:NETRW_BOOKMARKMAX
1840
let g:NETRW_BOOKMARKMAX= v:count
1843
" handle no count specified
1844
let g:NETRW_BOOKMARKMAX = g:NETRW_BOOKMARKMAX + 1
1845
let g:NETRW_BOOKMARKDIR_{g:NETRW_BOOKMARKMAX} = a:curdir
1847
echo "bookmarked the current directory"
1850
" change to the bookmarked directory
1851
" call Decho("(user: <B>) change to the bookmarked directory")
1852
if exists("g:NETRW_BOOKMARKDIR_{v:count}")
1853
exe "e ".g:NETRW_BOOKMARKDIR_{v:count}
1855
echomsg "Sorry, bookmark#".v:count." doesn't exist!"
1861
" list user's bookmarks
1862
" call Decho("(user: <q>) list user's bookmarks")
1863
if exists("g:NETRW_BOOKMARKMAX")
1864
" call Decho("list bookmarks [0,".g:NETRW_BOOKMARKMAX."]")
1866
while cnt <= g:NETRW_BOOKMARKMAX
1867
if exists("g:NETRW_BOOKMARKDIR_{cnt}")
1868
" call Decho("Netrw Bookmark#".cnt.": ".g:NETRW_BOOKMARKDIR_{cnt})
1869
echo "Netrw Bookmark#".cnt.": ".g:NETRW_BOOKMARKDIR_{cnt}
1876
" list directory history
1877
let cnt = g:NETRW_DIRHIST_CNT
1880
while ( first || cnt != g:NETRW_DIRHIST_CNT )
1881
" call Decho("first=".first." cnt=".cnt." dirhist_cnt=".g:NETRW_DIRHIST_CNT)
1882
let histcnt= histcnt + 1
1883
if exists("g:NETRW_DIRHIST_{cnt}")
1884
" call Decho("Netrw History#".histcnt.": ".g:NETRW_DIRHIST_{cnt})
1885
echo "Netrw History#".histcnt.": ".g:NETRW_DIRHIST_{cnt}
1889
let cnt = ( cnt - 1 ) % g:netrw_dirhistmax
1891
let cnt= cnt + g:netrw_dirhistmax
1895
call inputsave()|call input("Press <cr> to continue")|call inputrestore()
1899
" saves most recently visited directories (when they differ)
1900
" call Decho("(browsing) record curdir history")
1901
if !exists("g:NETRW_DIRHIST_0") || g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT} != a:curdir
1902
let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT + 1 ) % g:netrw_dirhistmax
1903
" let g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}= substitute(a:curdir,'[/\\]$','','e')
1904
let g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}= a:curdir
1905
" call Decho("save dirhist#".g:NETRW_DIRHIST_CNT."<".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}.">")
1909
" u: change to the previous directory stored on the history list
1910
" call Decho("(user: <u>) chg to prev dir from history")
1911
let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT - 1 ) % g:netrw_dirhistmax
1912
if g:NETRW_DIRHIST_CNT < 0
1913
let g:NETRW_DIRHIST_CNT= g:NETRW_DIRHIST_CNT + g:netrw_dirhistmax
1915
if exists("g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}")
1916
" call Decho("changedir u#".g:NETRW_DIRHIST_CNT."<".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}.">")
1917
if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("b:netrw_curdir")
1919
" call Decho("setlocal ma noro")
1922
" call Decho("setlocal nomod")
1924
" call Decho("exe e! ".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT})
1925
exe "e! ".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}
1927
let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT + 1 ) % g:netrw_dirhistmax
1928
echo "Sorry, no predecessor directory exists yet"
1932
" U: change to the subsequent directory stored on the history list
1933
" call Decho("(user: <U>) chg to next dir from history")
1934
let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT + 1 ) % g:netrw_dirhistmax
1935
if exists("g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}")
1936
" call Decho("changedir U#".g:NETRW_DIRHIST_CNT."<".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}.">")
1937
if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("b:netrw_curdir")
1939
" call Decho("setlocal ma noro")
1941
" call Decho("removed all lines from buffer (%d)")
1943
" call Decho("setlocal nomod")
1945
" call Decho("exe e! ".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT})
1946
exe "e! ".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}
1948
let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT - 1 ) % g:netrw_dirhistmax
1949
if g:NETRW_DIRHIST_CNT < 0
1950
let g:NETRW_DIRHIST_CNT= g:NETRW_DIRHIST_CNT + g:netrw_dirhistmax
1952
echo "Sorry, no successor directory exists yet"
1956
if v:count > 0 && v:count == g:NETRW_BOOKMARKMAX
1957
" delete the v:count'th bookmark
1958
" call Decho("delete bookmark#".v:count."<".g:NETRW_BOOKMARKDIR_{g:NETRW_BOOKMARKMAX}.">")
1959
unlet g:NETRW_BOOKMARKDIR_{g:NETRW_BOOKMARKMAX}
1960
let g:NETRW_BOOKMARKMAX= g:NETRW_BOOKMARKMAX - 1
1963
" call Decho("delete by shifting bookmark#".v:count."<".g:NETRW_BOOKMARKDIR_{v:count}.">")
1965
while cnt < g:NETRW_BOOKMARKMAX
1966
let g:NETRW_BOOKMARKDIR_{cnt} = g:NETRW_BOOKMARKDIR_{(cnt+1)}
1969
unlet g:NETRW_BOOKMARKDIR_{g:NETRW_BOOKMARKMAX}
1970
let g:NETRW_BOOKMARKMAX= g:NETRW_BOOKMARKMAX - 1
1972
elseif exists("b:netrw_curdir")
1973
" look for current directory amongst the bookmarks and remove that bookmark
1974
" call Decho("search for bookmark<".b:netrw_curdir.">")
1976
while cnt <= g:NETRW_BOOKMARKMAX
1977
" call Decho("checking: g:NETRW_BOOKMARKDIR_".cnt."<".g:NETRW_BOOKMARKDIR_{cnt}.">")
1978
if g:NETRW_BOOKMARKDIR_{cnt} == b:netrw_curdir
1979
if cnt < g:NETRW_BOOKMARKMAX
1980
" call Decho("delete bookmark#".cnt."<".b:netrw_curdir.">")
1981
while cnt < g:NETRW_BOOKMARMAX
1982
let g:NETRW_BOOKMARKDIR_{cnt} = g:NETRW_BOOKMARKDIR_{(cnt+1)}
1986
unlet g:NETRW_BOOKMARKDIR_{g:NETRW_BOOKMARKMAX}
1987
let g:NETRW_BOOKMARKMAX= g:NETRW_BOOKMARKMAX - 1
1994
call s:NetrwBookmarkMenu()
1995
" call Dret("NetrwBookmarkDir")
1998
" ---------------------------------------------------------------------
1834
1999
" s:NetrwBrowse: This function uses the command in g:netrw_list_cmd to provide a {{{2
1835
2000
" list of the contents of a local or remote directory. It is assumed that the
1836
2001
" g:netrw_list_cmd has a string, USEPORT HOSTNAME, that needs to be substituted
1837
2002
" with the requested remote hostname first.
1838
2003
fun! s:NetrwBrowse(islocal,dirname)
1839
2004
if !exists("w:netrw_liststyle")|let w:netrw_liststyle= g:netrw_liststyle|endif
1840
" call Dfunc("NetrwBrowse(islocal=".a:islocal." dirname<".a:dirname.">) liststyle=".w:netrw_liststyle." ".g:loaded_netrw." buf#".bufnr("%")."<".bufname("%").">")
2005
" call Dfunc("s:NetrwBrowse(islocal=".a:islocal." dirname<".a:dirname.">) liststyle=".w:netrw_liststyle." ".g:loaded_netrw." buf#".bufnr("%")."<".bufname("%").">")
2006
" call Decho("tab#".tabpagenr()." win#".winnr())
1841
2007
" call Dredir("ls!")
1843
2009
if exists("s:netrw_skipbrowse")
1844
2010
unlet s:netrw_skipbrowse
1845
" call Dret("NetrwBrowse : s:netrw_skipbrowse=".s:netrw_skipbrowse)
2011
" call Decho("ro=".&ro." ma=".&ma." mod=".&mod." wrap=".&wrap)
2012
" call Dret("s:NetrwBrowse : s:netrw_skipbrowse=".s:netrw_skipbrowse)
2015
if !exists("*shellescape")
2016
call netrw#ErrorMsg(s:ERROR,"netrw can't run -- your vim is missing shellescape()",69)
2017
" call Dret("s:NetrwBrowse : missing shellescape()")
2020
if !exists("*fnameescape")
2021
call netrw#ErrorMsg(s:ERROR,"netrw can't run -- your vim is missing fnameescape()",70)
2022
" call Dret("s:NetrwBrowse : missing fnameescape()")
1849
2026
call s:NetrwOptionSave("w:")
1850
2027
call s:NetrwSafeOptions()
1852
" clear any marked files
1853
if exists("s:netrwmarkfilelist")
2029
" re-instate any marked files
2030
if exists("s:netrwmarkfilelist_{bufnr('%')}")
1854
2031
" call Decho("clearing marked files")
1855
unlet s:netrwmarkfilelist
1856
unlet s:netrwmarkfilemtch
2032
exe "2match netrwMarkFile /".s:netrwmarkfilemtch_{bufnr("%")}."/"
1860
2035
if a:islocal && exists("w:netrw_acdkeep") && w:netrw_acdkeep
1861
2036
" call Decho("handle w:netrw_acdkeep:")
1862
" call Decho("cd ".escape(a:dirname,g:netrw_cd_escape)." (due to w:netrw_acdkeep=".w:netrw_acdkeep." - acd=".&acd.")")
1863
exe 'cd '.escape(a:dirname,g:netrw_cd_escape)
2037
" call Decho("keepjumps lcd ".fnameescape(a:dirname)." (due to w:netrw_acdkeep=".w:netrw_acdkeep." - acd=".&acd.")")
2038
exe 'keepjumps lcd '.fnameescape(a:dirname)
1864
2039
" call Decho("getcwd<".getcwd().">")
1866
2041
elseif !a:islocal && a:dirname !~ '[\/]$' && a:dirname !~ '^"'
2261
2547
" ---------------------------------------------------------------------
2262
" s:PerformListing: {{{2
2263
fun! s:PerformListing(islocal)
2264
" call Dfunc("s:PerformListing(islocal=".a:islocal.") buf(%)=".bufnr("%")."<".bufname("%").">")
2266
call s:NetrwSafeOptions()
2269
" if exists("g:netrw_silent") && g:netrw_silent == 0 && &ch >= 1 " Decho
2270
" call Decho("(netrw) Processing your browsing request...")
2273
" call Decho('w:netrw_liststyle='.(exists("w:netrw_liststyle")? w:netrw_liststyle : 'n/a'))
2274
if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("w:netrw_treedict")
2275
" force a refresh for tree listings
2276
" call Decho("force refresh for treelisting: clear buffer<".expand("%")."> with :%d")
2280
" save current directory on directory history list
2281
call s:NetrwBookmarkDir(3,b:netrw_curdir)
2283
" Set up the banner {{{3
2284
" call Decho("set up banner")
2285
keepjumps put ='\" ============================================================================'
2286
keepjumps put ='\" Netrw Directory Listing (netrw '.g:loaded_netrw.')'
2287
keepjumps put ='\" '.b:netrw_curdir
2289
let w:netrw_bannercnt= 3
2290
exe "keepjumps ".w:netrw_bannercnt
2292
let sortby= g:netrw_sort_by
2293
if g:netrw_sort_direction =~ "^r"
2294
let sortby= sortby." reversed"
2298
" call Decho("handle specified sorting: g:netrw_sort_by<".g:netrw_sort_by.">")
2299
if g:netrw_sort_by =~ "^n"
2300
" call Decho("directories will be sorted by name")
2302
keepjumps put ='\" Sorted by '.sortby
2303
keepjumps put ='\" Sort sequence: '.g:netrw_sort_sequence
2304
let w:netrw_bannercnt= w:netrw_bannercnt + 2
2548
" s:NetrwListStyle: {{{2
2549
" islocal=0: remote browsing
2550
" =1: local browsing
2551
fun! s:NetrwListStyle(islocal)
2552
" call Dfunc("NetrwListStyle(islocal=".a:islocal.") w:netrw_liststyle=".w:netrw_liststyle)
2553
let fname = s:NetrwGetWord()
2554
if !exists("w:netrw_liststyle")|let w:netrw_liststyle= g:netrw_liststyle|endif
2555
let w:netrw_liststyle = (w:netrw_liststyle + 1) % s:MAXLIST
2556
" call Decho("fname<".fname.">")
2557
" call Decho("chgd w:netrw_liststyle to ".w:netrw_liststyle)
2558
" call Decho("b:netrw_curdir<".(exists("b:netrw_curdir")? b:netrw_curdir : "doesn't exist").">")
2560
if w:netrw_liststyle == s:THINLIST
2561
" use one column listing
2562
" call Decho("use one column list")
2563
let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge')
2565
elseif w:netrw_liststyle == s:LONGLIST
2567
" call Decho("use long list")
2568
let g:netrw_list_cmd = g:netrw_list_cmd." -l"
2570
elseif w:netrw_liststyle == s:WIDELIST
2572
" call Decho("use wide list")
2573
let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge')
2575
elseif w:netrw_liststyle == s:TREELIST
2576
" call Decho("use tree list")
2577
let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge')
2306
" call Decho("directories will be sorted by size or time")
2307
" sorted by size or date
2308
keepjumps put ='\" Sorted by '.sortby
2309
let w:netrw_bannercnt= w:netrw_bannercnt + 1
2311
exe "keepjumps ".w:netrw_bannercnt
2313
" show copy/move target, if any
2314
if exists("s:netrwmftgt") && exists("s:netrwmfloc")
2315
" call Decho("show copy/move target<".s:netrwmftgt."> netrwmfloc=".s:netrwmfloc)
2317
keepjumps put ='\" Copy/Move Tgt: '.s:netrwmftgt.' (local)'
2319
keepjumps put ='\" Copy/Move Tgt: '.s:netrwmftgt.' (remote)'
2321
let w:netrw_bannercnt= w:netrw_bannercnt + 1
2323
exe "keepjumps ".w:netrw_bannercnt
2325
" Hiding... -or- Showing... {{{3
2326
" call Decho("handle hiding/showing (g:netrw_hide=".g:netrw_list_hide." g:netrw_list_hide<".g:netrw_list_hide.">)")
2327
if g:netrw_list_hide != "" && g:netrw_hide
2328
if g:netrw_hide == 1
2329
keepjumps put ='\" Hiding: '.g:netrw_list_hide
2331
keepjumps put ='\" Showing: '.g:netrw_list_hide
2333
let w:netrw_bannercnt= w:netrw_bannercnt + 1
2335
exe "keepjumps ".w:netrw_bannercnt
2336
keepjumps put ='\" Quick Help: <F1>:help -:go up dir D:delete R:rename s:sort-by x:exec'
2337
keepjumps put ='\" ============================================================================'
2338
let w:netrw_bannercnt= w:netrw_bannercnt + 2
2340
" bannercnt should index the line just after the banner
2341
let w:netrw_bannercnt= w:netrw_bannercnt + 1
2342
exe "keepjumps ".w:netrw_bannercnt
2343
" call Decho("bannercnt=".w:netrw_bannercnt." (should index line just after banner) line($)=".line("$"))
2345
" set up syntax highlighting {{{3
2346
" call Decho("set up syntax highlighting")
2349
if !exists("g:syntax_on") || !g:syntax_on
2355
" call Decho("Get list of files - islocal=".a:islocal)
2357
call s:LocalListing()
2359
call s:NetrwRemoteListing()
2361
" call Decho("w:netrw_bannercnt=".w:netrw_bannercnt." (banner complete)")
2363
" manipulate the directory listing (hide, sort) {{{3
2364
if line("$") >= w:netrw_bannercnt
2365
" call Decho("manipulate directory listing (hide)")
2366
" call Decho("g:netrw_hide=".g:netrw_hide." g:netrw_list_hide<".g:netrw_list_hide.">")
2367
if g:netrw_hide && g:netrw_list_hide != ""
2368
call s:NetrwListHide()
2370
if line("$") >= w:netrw_bannercnt
2371
" call Decho("manipulate directory listing (sort) : g:netrw_sort_by<".g:netrw_sort_by.">")
2373
if g:netrw_sort_by =~ "^n"
2377
if w:netrw_bannercnt < line("$")
2378
" call Decho("g:netrw_sort_direction=".g:netrw_sort_direction." (bannercnt=".w:netrw_bannercnt.")")
2379
if g:netrw_sort_direction =~ 'n'
2380
" normal direction sorting
2381
exe 'silent keepjumps '.w:netrw_bannercnt.',$sort'
2383
" reverse direction sorting
2384
exe 'silent keepjumps '.w:netrw_bannercnt.',$sort!'
2387
" remove priority pattern prefix
2388
" call Decho("remove priority pattern prefix")
2389
exe 'silent keepjumps '.w:netrw_bannercnt.',$s/^\d\{3}\///e'
2392
if w:netrw_bannercnt < line("$")
2393
" call Decho("g:netrw_sort_direction=".g:netrw_sort_direction)
2394
if g:netrw_sort_direction =~ 'n'
2395
" call Decho('exe silent keepjumps '.w:netrw_bannercnt.',$sort')
2396
exe 'silent keepjumps '.w:netrw_bannercnt.',$sort'
2398
" call Decho('exe silent keepjumps '.w:netrw_bannercnt.',$sort!')
2399
exe 'silent keepjumps '.w:netrw_bannercnt.',$sort!'
2402
exe 'silent keepjumps '.w:netrw_bannercnt.',$s/^\d\{-}\///e'
2405
elseif g:netrw_sort_direction =~ 'r'
2406
" call Decho('reverse the sorted listing')
2407
exe 'silent keepjumps '.w:netrw_bannercnt.'g/^/m '.w:netrw_bannercnt
2411
" convert to wide/tree listing {{{3
2412
" call Decho("modify display if wide/tree listing style")
2413
call s:NetrwWideListing()
2414
call s:NetrwTreeListing(b:netrw_curdir)
2416
if exists("w:netrw_bannercnt") && line("$") > w:netrw_bannercnt
2417
" place cursor on the top-left corner of the file listing
2418
" call Decho("place cursor on top-left corner of file listing")
2419
exe 'silent keepjumps '.w:netrw_bannercnt
2423
" record previous current directory
2424
let w:netrw_prvdir= b:netrw_curdir
2425
" call Decho("record netrw_prvdir<".w:netrw_prvdir.">")
2427
" save certain window-oriented variables into buffer-oriented variables {{{3
2428
call s:SetBufWinVars()
2429
call s:NetrwOptionRestore("w:")
2431
" set display to netrw display settings
2432
" call Decho("set display to netrw display settings (noma nomod etc)")
2433
setlocal noma nomod nonu nobl nowrap ro
2434
if exists("s:treecurpos")
2435
call setpos('.',s:treecurpos)
2439
" call Dret("s:PerformListing : curpos<".string(getpos(".")).">")
2580
call netrw#ErrorMsg(s:WARNING,"bad value for g:netrw_liststyle (=".w:netrw_liststyle.")",46)
2581
let g:netrw_liststyle = s:THINLIST
2582
let w:netrw_liststyle = g:netrw_liststyle
2583
let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge')
2586
" call Decho("setlocal ma noro")
2588
" clear buffer - this will cause NetrwBrowse/LocalBrowseCheck to do a refresh
2589
" call Decho("clear buffer<".expand("%")."> with :%d")
2592
" refresh the listing
2593
let svpos= netrw#NetrwSavePosn()
2594
call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
2595
call netrw#NetrwRestorePosn(svpos)
2597
" keep cursor on the filename
2599
let result= search('\%(^\%(|\+\s\)\=\|\s\{2,}\)\zs'.escape(fname,'.\[]*$^').'\%(\s\{2,}\|$\)','bc')
2600
" call Decho("search result=".result." w:netrw_bannercnt=".(exists("w:netrw_bannercnt")? w:netrw_bannercnt : 'N/A'))
2601
if result <= 0 && exists("w:netrw_bannercnt")
2602
exe "keepjumps ".w:netrw_bannercnt
2605
" call Dret("NetrwListStyle".(exists("w:netrw_liststyle")? ' : w:netrw_liststyle='.w:netrw_liststyle : ""))
2608
" ---------------------------------------------------------------------
2609
" s:NetrwBookmarkMenu: Uses menu priorities {{{2
2610
" .2.[cnt] for bookmarks, and
2611
" .3.[cnt] for history
2612
" (see s:NetrwMenu())
2613
fun! s:NetrwBookmarkMenu()
2614
if !exists("s:netrw_menucnt")
2617
" call Dfunc("NetrwBookmarkMenu() bookmarkcnt=".g:NETRW_BOOKMARKMAX." histcnt=".g:NETRW_DIRHIST_CNT." menucnt=".s:netrw_menucnt)
2619
" the following test assures that gvim is running, has menus available, and has menus enabled.
2620
if has("gui") && has("menu") && has("gui_running") && &go =~ 'm' && g:netrw_menu
2621
if exists("g:NetrwTopLvlMenu")
2622
" call Decho("removing ".g:NetrwTopLvlMenu."Bookmarks menu item(s)")
2623
exe 'silent! unmenu '.g:NetrwTopLvlMenu.'Bookmarks'
2626
" show bookmarked places
2628
while cnt <= g:NETRW_BOOKMARKMAX
2629
if exists("g:NETRW_BOOKMARKDIR_{cnt}")
2630
let bmdir= escape(g:NETRW_BOOKMARKDIR_{cnt},'. ')
2631
" call Decho('silent! menu '.g:NetrwMenuPriority.".2.".cnt." ".g:NetrwTopLvlMenu.'Bookmark.'.bmdir.' :e '.bmdir)
2632
exe 'silent! menu '.g:NetrwMenuPriority.".2.".cnt." ".g:NetrwTopLvlMenu.'Bookmarks.'.bmdir.' :e '.bmdir."\<cr>"
2637
" show directory browsing history
2638
let cnt = g:NETRW_DIRHIST_CNT
2641
while ( first || cnt != g:NETRW_DIRHIST_CNT )
2642
let histcnt = histcnt + 1
2643
let priority = g:NETRW_DIRHIST_CNT + histcnt
2644
if exists("g:NETRW_DIRHIST_{cnt}")
2645
let bmdir= escape(g:NETRW_DIRHIST_{cnt},'. ')
2646
" call Decho('silent! menu '.g:NetrwMenuPriority.".3.".priority." ".g:NetrwTopLvlMenu.'History.'.bmdir.' :e '.bmdir)
2647
exe 'silent! menu '.g:NetrwMenuPriority.".3.".priority." ".g:NetrwTopLvlMenu.'History.'.bmdir.' :e '.bmdir."\<cr>"
2650
let cnt = ( cnt - 1 ) % g:netrw_dirhistmax
2652
let cnt= cnt + g:netrw_dirhistmax
2656
" call Dret("NetrwBookmarkMenu")
2442
2659
" ---------------------------------------------------------------------
2664
2891
" ---------------------------------------------------------------------
2892
" s:NetrwBrowseX: allows users to write custom functions to operate on {{{2
2893
" files given their extension. Passes 0=local, 1=remote
2894
fun! netrw#NetrwBrowseX(fname,remote)
2895
" call Dfunc("NetrwBrowseX(fname<".a:fname."> remote=".a:remote.")")
2897
" set up the filename
2898
" (lower case the extension, make a local copy of a remote file)
2899
let exten= substitute(a:fname,'.*\.\(.\{-}\)','\1','e')
2900
if has("win32") || has("win95") || has("win64") || has("win16")
2901
let exten= substitute(exten,'^.*$','\L&\E','')
2903
let fname= escape(a:fname,"%#")
2904
" call Decho("fname<".fname."> after escape()")
2906
" seems kde systems often have gnome-open due to dependencies, even though
2907
" gnome-open's subsidiary display tools are largely absent. Kde systems
2908
" usually have "kdeinit" running, though... (tnx Mikolaj Machowski)
2909
if !exists("s:haskdeinit")
2911
let s:haskdeinit= s:System("system",'ps -e') =~ 'kdeinit'
2913
let s:haskdeinit = 0
2918
" call Decho("setting s:haskdeinit=".s:haskdeinit)
2922
" create a local copy
2923
let fname= fnamemodify(tempname(),":r").".".exten
2924
" call Decho("a:remote=".a:remote.": create a local copy of <".a:fname."> as <".fname.">")
2925
exe "silent keepjumps bot 1new ".a:fname
2927
" call Decho("read <".fname.">, now writing: exe w! ".fname)
2928
exe "silent! w! ".fname
2931
" call Decho("exten<".exten."> "."netrwFileHandlers#NFH_".exten."():exists=".exists("*netrwFileHandlers#NFH_".exten))
2933
" set up redirection
2935
if (has("win32") || has("win95") || has("win64") || has("win16"))
2936
let redir= substitute(&srr,"%s","nul","")
2938
let redir= substitute(&srr,"%s","/dev/null","")
2940
elseif (has("win32") || has("win95") || has("win64") || has("win16"))
2941
let redir= &srr . "nul"
2943
let redir= &srr . "/dev/null"
2945
" call Decho("redir{".redir."} srr{".&srr."}")
2947
" extract any viewing options. Assumes that they're set apart by quotes.
2948
if exists("g:netrw_browsex_viewer")
2949
if g:netrw_browsex_viewer =~ '\s'
2950
let viewer = substitute(g:netrw_browsex_viewer,'\s.*$','','')
2951
let viewopt = substitute(g:netrw_browsex_viewer,'^\S\+\s*','','')." "
2954
while !executable(viewer) && viewer != oviewer
2955
let viewer = substitute(g:netrw_browsex_viewer,'^\(\(^\S\+\s\+\)\{'.cnt.'}\S\+\)\(.*\)$','\1','')
2956
let viewopt = substitute(g:netrw_browsex_viewer,'^\(\(^\S\+\s\+\)\{'.cnt.'}\S\+\)\(.*\)$','\3','')." "
2958
let oviewer = viewer
2959
" call Decho("!exe: viewer<".viewer."> viewopt<".viewopt.">")
2962
let viewer = g:netrw_browsex_viewer
2965
" call Decho("viewer<".viewer."> viewopt<".viewopt.">")
2968
" execute the file handler
2969
if exists("g:netrw_browsex_viewer") && g:netrw_browsex_viewer == '-'
2970
" call Decho("g:netrw_browsex_viewer<".g:netrw_browsex_viewer.">")
2971
let ret= netrwFileHandlers#Invoke(exten,fname)
2973
elseif exists("g:netrw_browsex_viewer") && executable(viewer)
2974
" call Decho("g:netrw_browsex_viewer<".g:netrw_browsex_viewer.">")
2975
" call Decho("exe silent !".viewer." ".viewopt.shellescape(fname).redir)
2976
exe "silent !".viewer." ".viewopt.shellescape(fname).redir
2977
let ret= v:shell_error
2979
elseif has("win32") || has("win64")
2980
" call Decho('exe silent !start rundll32 url.dll,FileProtocolHandler '.shellescape(fname))
2981
exe 'silent !start rundll32 url.dll,FileProtocolHandler '.shellescape(fname)
2982
call inputsave()|call input("Press <cr> to continue")|call inputrestore()
2983
let ret= v:shell_error
2985
elseif has("unix") && executable("gnome-open") && !s:haskdeinit
2986
" call Decho("exe silent !gnome-open ".shellescape(fname)." ".redir)
2987
exe "silent !gnome-open ".shellescape(fname).redir
2988
let ret= v:shell_error
2990
elseif has("unix") && executable("kfmclient") && s:haskdeinit
2991
" call Decho("exe silent !kfmclient exec ".shellescape(fname)." ".redir)
2992
exe "silent !kfmclient exec ".shellescape(fname)." ".redir
2993
let ret= v:shell_error
2995
elseif has("macunix") && executable("open")
2996
" call Decho("exe silent !open ".shellescape(fname)." ".redir)
2997
exe "silent !open ".shellescape(fname)." ".redir
2998
let ret= v:shell_error
3001
" netrwFileHandlers#Invoke() always returns 0
3002
let ret= netrwFileHandlers#Invoke(exten,fname)
3005
" if unsuccessful, attempt netrwFileHandlers#Invoke()
3007
let ret= netrwFileHandlers#Invoke(exten,fname)
3012
" cleanup: remove temporary file,
3013
" delete current buffer if success with handler,
3014
" return to prior buffer (directory listing)
3015
" Feb 12, 2008: had to de-activiate removal of
3016
" temporary file because it wasn't getting seen.
3017
" if a:remote == 1 && fname != a:fname
3018
" call Decho("deleting temporary file<".fname.">")
3019
" call s:System("delete",fname)
3023
setlocal bh=delete bt=nofile
3024
if g:netrw_use_noswf
3031
" call Dret("NetrwBrowseX")
3034
" ---------------------------------------------------------------------
3035
" netrw#Explore: launch the local browser in the directory of the current file {{{2
3036
" dosplit==0: the window will be split iff the current file has
3038
" dosplit==1: the window will be split before running the local
3040
fun! netrw#Explore(indx,dosplit,style,...)
3041
" call Dfunc("netrw#Explore(indx=".a:indx." dosplit=".a:dosplit." style=".a:style.",a:1<".a:1.">) &modified=".&modified." a:0=".a:0)
3042
if !exists("b:netrw_curdir")
3043
let b:netrw_curdir= getcwd()
3044
" call Decho("set b:netrw_curdir<".b:netrw_curdir."> (used getcwd)")
3046
let curfile= b:netrw_curdir
3047
" call Decho("curfile<".curfile.">")
3050
silent! let keepregstar = @*
3051
silent! let keepregplus = @+
3052
silent! let keepregslash= @/
3054
" if dosplit or file has been modified
3055
if a:dosplit || &modified || a:style == 6
3056
" call Decho("case: dosplit=".a:dosplit." modified=".&modified." a:style=".a:style)
3057
call s:SaveWinVars()
3059
if a:style == 0 " Explore, Sexplore
3060
" call Decho("style=0: Explore or Sexplore")
3061
exe g:netrw_winsize."wincmd s"
3063
elseif a:style == 1 "Explore!, Sexplore!
3064
" call Decho("style=1: Explore! or Sexplore!")
3065
exe g:netrw_winsize."wincmd v"
3067
elseif a:style == 2 " Hexplore
3068
" call Decho("style=2: Hexplore")
3069
exe "bel ".g:netrw_winsize."wincmd s"
3071
elseif a:style == 3 " Hexplore!
3072
" call Decho("style=3: Hexplore!")
3073
exe "abo ".g:netrw_winsize."wincmd s"
3075
elseif a:style == 4 " Vexplore
3076
" call Decho("style=4: Vexplore")
3077
exe "lefta ".g:netrw_winsize."wincmd v"
3079
elseif a:style == 5 " Vexplore!
3080
" call Decho("style=5: Vexplore!")
3081
exe "rightb ".g:netrw_winsize."wincmd v"
3083
elseif a:style == 6 " Texplore
3084
call s:SaveBufVars()
3085
" call Decho("style = 6: Texplore")
3087
call s:RestoreBufVars()
3089
call s:RestoreWinVars()
3094
" call Decho("case [a:0=".a:0."]>0: a:1<".a:1.">")
3095
if a:1 =~ '^\~' && (has("unix") || (exists("g:netrw_cygwin") && g:netrw_cygwin))
3096
let dirname= substitute(a:1,'\~',expand("$HOME"),'')
3097
" call Decho("using dirname<".dirname."> (case: ~ && unix||cygwin)")
3099
let dirname= exists("b:netrw_curdir")? b:netrw_curdir : getcwd()
3101
let dirname= dirname."/"
3103
" call Decho("using dirname<".dirname."> (case: ".(exists("b:netrw_curdir")? "b:netrw_curdir" : "getcwd()").")")
3105
let dirname= expand(a:1)
3108
" call Decho("using dirname<".dirname.">")
3112
" call Decho("clearing explore variables")
3114
if exists("s:explore_match") |unlet s:explore_match |endif
3115
if exists("s:explore_indx") |unlet s:explore_indx |endif
3116
if exists("s:dirstarstar") |unlet s:dirstarstar |endif
3117
if exists("s:dirstarstar") |unlet s:dirstarstar |endif
3118
if exists("w:netrw_explore_indx") |unlet w:netrw_explore_indx |endif
3119
if exists("w:netrw_explore_listlen")|unlet w:netrw_explore_listlen|endif
3120
if exists("w:netrw_explore_list") |unlet w:netrw_explore_list |endif
3121
if exists("w:netrw_explore_bufnr") |unlet w:netrw_explore_bufnr |endif
3125
" call Dret("netrw#Explore : cleared list")
3129
if dirname =~ '/\*\*/'
3130
" handle .../**/.../filepat
3131
" call Decho("case Explore .../**/.../filepat")
3132
let prefixdir= substitute(dirname,'^\(.\{-}\)\*\*.*$','\1','')
3133
if prefixdir =~ '^/' || (prefixdir =~ '^\a:/' && (has("win32") || has("win95") || has("win64") || has("win16")))
3134
let b:netrw_curdir = prefixdir
3136
let b:netrw_curdir= getcwd().'/'.prefixdir
3138
let dirname= substitute(dirname,'^.\{-}\(\*\*/.*\)$','\1','')
3140
" call Decho("pwd<".getcwd()."> dirname<".dirname.">")
3141
" call Decho("case Explore ../**/../filepat (starpat=".starpat.")")
3143
elseif dirname =~ '^\*//'
3144
" starpat=1: Explore *//pattern (current directory only search for files containing pattern)
3145
" call Decho("case Explore *//pattern")
3146
let pattern= substitute(dirname,'^\*//\(.*\)$','\1','')
3148
" call Decho("Explore *//pat: (starpat=".starpat.") dirname<".dirname."> -> pattern<".pattern.">")
3149
if &hls | let keepregslash= s:ExplorePatHls(pattern) | endif
3151
elseif dirname =~ '^\*\*//'
3152
" starpat=2: Explore **//pattern (recursive descent search for files containing pattern)
3153
" call Decho("case Explore **//pattern")
3154
let pattern= substitute(dirname,'^\*\*//','','')
3156
" call Decho("Explore **//pat: (starpat=".starpat.") dirname<".dirname."> -> pattern<".pattern.">")
3158
elseif dirname =~ '^\*/'
3159
" starpat=3: Explore */filepat (search in current directory for filenames matching filepat)
3161
" call Decho("case Explore */filepat (starpat=".starpat.")")
3163
elseif dirname=~ '^\*\*/'
3164
" starpat=4: Explore **/filepat (recursive descent search for filenames matching filepat)
3166
" call Decho("case Explore **/filepat (starpat=".starpat.")")
3171
if starpat == 0 && a:indx >= 0
3172
" [Explore Hexplore Vexplore Sexplore] [dirname]
3173
" call Decho("case dirname<".dirname."> a:indx=".a:indx.": Explore Hexplore Vexplore Sexplore")
3175
let dirname= substitute(expand("%:p"),'^\(.*[/\\]\)[^/\\]*$','\1','e')
3177
if dirname =~ '^scp:' || dirname =~ '^ftp:'
3178
" call Decho("calling NetrwBrowse(0,dirname<".dirname.">)")
3179
call s:NetrwBrowse(0,dirname)
3181
if dirname == ""|let dirname= getcwd()|endif
3182
" call Decho("calling LocalBrowseCheck(dirname<".dirname.">)")
3183
call netrw#LocalBrowseCheck(dirname)
3186
" call Decho("curfile<".curfile.">")
3187
if has("win32") || has("win95") || has("win64") || has("win16")
3188
call search('\<'.substitute(curfile,'^.*[/\\]','','e').'\>','cW')
3190
call search('\<'.substitute(curfile,'^.*/','','e').'\>','cW')
3193
" starpat=1: Explore *//pattern (current directory only search for files containing pattern)
3194
" starpat=2: Explore **//pattern (recursive descent search for files containing pattern)
3195
" starpat=3: Explore */filepat (search in current directory for filenames matching filepat)
3196
" starpat=4: Explore **/filepat (recursive descent search for filenames matching filepat)
3198
" Nexplore, Pexplore, Explore: handle starpat
3199
" call Decho("case Nexplore, Pexplore, <s-down>, <s-up>: starpat=".starpat." a:indx=".a:indx)
3200
if !mapcheck("<s-up>","n") && !mapcheck("<s-down>","n") && exists("b:netrw_curdir")
3201
" call Decho("set up <s-up> and <s-down> maps")
3202
let s:didstarstar= 1
3203
nnoremap <buffer> <silent> <s-up> :Pexplore<cr>
3204
nnoremap <buffer> <silent> <s-down> :Nexplore<cr>
3207
if has("path_extra")
3208
" call Decho("starpat=".starpat.": has +path_extra")
3209
if !exists("w:netrw_explore_indx")
3210
let w:netrw_explore_indx= 0
3213
" call Decho("starpat=".starpat.": set indx= [a:indx=".indx."]")
3217
" call Decho("case Nexplore with starpat=".starpat.": (indx=".indx.")")
3218
if !exists("w:netrw_explore_list") " sanity check
3219
call netrw#ErrorMsg(s:WARNING,"using Nexplore or <s-down> improperly; see help for netrw-starstar",40)
3220
silent! let @* = keepregstar
3221
silent! let @+ = keepregstar
3222
silent! let @/ = keepregslash
3223
" call Dret("netrw#Explore")
3226
let indx= w:netrw_explore_indx
3227
if indx < 0 | let indx= 0 | endif
3228
if indx >= w:netrw_explore_listlen | let indx= w:netrw_explore_listlen - 1 | endif
3229
let curfile= w:netrw_explore_list[indx]
3230
" call Decho("indx=".indx." curfile<".curfile.">")
3231
while indx < w:netrw_explore_listlen && curfile == w:netrw_explore_list[indx]
3233
" call Decho("indx=".indx." (Nexplore while loop)")
3235
if indx >= w:netrw_explore_listlen | let indx= w:netrw_explore_listlen - 1 | endif
3236
" call Decho("Nexplore: indx= [w:netrw_explore_indx=".w:netrw_explore_indx."]=".indx)
3240
" call Decho("case Pexplore with starpat=".starpat.": (indx=".indx.")")
3241
if !exists("w:netrw_explore_list") " sanity check
3242
call netrw#ErrorMsg(s:WARNING,"using Pexplore or <s-up> improperly; see help for netrw-starstar",41)
3243
silent! let @* = keepregstar
3244
silent! let @+ = keepregstar
3245
silent! let @/ = keepregslash
3246
" call Dret("netrw#Explore")
3249
let indx= w:netrw_explore_indx
3250
if indx < 0 | let indx= 0 | endif
3251
if indx >= w:netrw_explore_listlen | let indx= w:netrw_explore_listlen - 1 | endif
3252
let curfile= w:netrw_explore_list[indx]
3253
" call Decho("indx=".indx." curfile<".curfile.">")
3254
while indx >= 0 && curfile == w:netrw_explore_list[indx]
3256
" call Decho("indx=".indx." (Pexplore while loop)")
3258
if indx < 0 | let indx= 0 | endif
3259
" call Decho("Pexplore: indx= [w:netrw_explore_indx=".w:netrw_explore_indx."]=".indx)
3262
" Explore -- initialize
3263
" build list of files to Explore with Nexplore/Pexplore
3264
" call Decho("starpat=".starpat.": case Explore: initialize (indx=".indx.")")
3265
let w:netrw_explore_indx= 0
3266
if !exists("b:netrw_curdir")
3267
let b:netrw_curdir= getcwd()
3269
" call Decho("starpat=".starpat.": b:netrw_curdir<".b:netrw_curdir.">")
3271
" switch on starpat to build the w:netrw_explore_list of files
3273
" starpat=1: Explore *//pattern (current directory only search for files containing pattern)
3274
" call Decho("starpat=".starpat.": build *//pattern list")
3275
exe "vimgrep /".pattern."/gj ".b:netrw_curdir."/*"
3276
let w:netrw_explore_list = map(getqflist(),'bufname(v:val.bufnr)')
3277
if &hls | let keepregslash= s:ExplorePatHls(pattern) | endif
3280
" starpat=2: Explore **//pattern (recursive descent search for files containing pattern)
3281
" call Decho("starpat=".starpat.": build **//pattern list")
3283
exe "silent vimgrep /".pattern."/gj "."**/*"
3284
catch /^Vim\%((\a\+)\)\=:E480/
3285
call netrw#ErrorMsg(s:WARNING,'no files matched pattern<'.pattern.'>',45)
3286
if &hls | let keepregslash= s:ExplorePatHls(pattern) | endif
3287
silent! let @* = keepregstar
3288
silent! let @+ = keepregstar
3289
silent! let @/ = keepregslash
3290
" call Dret("netrw#Explore : no files matched pattern")
3293
let s:netrw_curdir = b:netrw_curdir
3294
let w:netrw_explore_list = getqflist()
3295
let w:netrw_explore_list = map(w:netrw_explore_list,'s:netrw_curdir."/".bufname(v:val.bufnr)')
3298
" starpat=3: Explore */filepat (search in current directory for filenames matching filepat)
3299
" call Decho("starpat=".starpat.": build */filepat list")
3300
let dirname = substitute(dirname,'^\*/','','')
3301
let w:netrw_explore_list= split(expand(b:netrw_curdir."/".dirname),'\n')
3302
if &hls | let keepregslash= s:ExplorePatHls(dirname) | endif
3305
" starpat=4: Explore **/filepat (recursive descent search for filenames matching filepat)
3306
" call Decho("starpat=".starpat.": build **/filepat list")
3307
let w:netrw_explore_list= split(expand(b:netrw_curdir."/".dirname),'\n')
3308
if &hls | let keepregslash= s:ExplorePatHls(dirname) | endif
3309
endif " switch on starpat to build w:netrw_explore_list
3311
let w:netrw_explore_listlen = len(w:netrw_explore_list)
3312
" call Decho("w:netrw_explore_list<".string(w:netrw_explore_list).">")
3313
" call Decho("w:netrw_explore_listlen=".w:netrw_explore_listlen)
3315
if w:netrw_explore_listlen == 0 || (w:netrw_explore_listlen == 1 && w:netrw_explore_list[0] =~ '\*\*\/')
3316
call netrw#ErrorMsg(s:WARNING,"no files matched",42)
3317
silent! let @* = keepregstar
3318
silent! let @+ = keepregstar
3319
silent! let @/ = keepregslash
3320
" call Dret("netrw#Explore : no files matched")
3323
endif " if indx ... endif
3325
" NetrwStatusLine support - for exploring support
3326
let w:netrw_explore_indx= indx
3327
" call Decho("explorelist<".join(w:netrw_explore_list,',')."> len=".w:netrw_explore_listlen)
3329
" wrap the indx around, but issue a note
3330
if indx >= w:netrw_explore_listlen || indx < 0
3331
" call Decho("wrap indx (indx=".indx." listlen=".w:netrw_explore_listlen.")")
3332
let indx = (indx < 0)? ( w:netrw_explore_listlen - 1 ) : 0
3333
let w:netrw_explore_indx= indx
3334
call netrw#ErrorMsg(s:NOTE,"no more files match Explore pattern",43)
3338
exe "let dirfile= w:netrw_explore_list[".indx."]"
3339
" call Decho("dirfile=w:netrw_explore_list[indx=".indx."]= <".dirfile.">")
3340
let newdir= substitute(dirfile,'/[^/]*$','','e')
3341
" call Decho("newdir<".newdir.">")
3343
" call Decho("calling LocalBrowseCheck(newdir<".newdir.">)")
3344
call netrw#LocalBrowseCheck(newdir)
3345
if !exists("w:netrw_liststyle")
3346
let w:netrw_liststyle= g:netrw_liststyle
3348
if w:netrw_liststyle == s:THINLIST || w:netrw_liststyle == s:LONGLIST
3349
call search('^'.substitute(dirfile,"^.*/","","").'\>',"W")
3351
call search('\<'.substitute(dirfile,"^.*/","","").'\>',"w")
3353
let w:netrw_explore_mtchcnt = indx + 1
3354
let w:netrw_explore_bufnr = bufnr("%")
3355
let w:netrw_explore_line = line(".")
3356
call s:SetupNetrwStatusLine('%f %h%m%r%=%9*%{NetrwStatusLine()}')
3357
" call Decho("explore: mtchcnt=".w:netrw_explore_mtchcnt." bufnr=".w:netrw_explore_bufnr." line#".w:netrw_explore_line)
3360
" call Decho("your vim does not have +path_extra")
3361
if !exists("g:netrw_quiet")
3362
call netrw#ErrorMsg(s:WARNING,"your vim needs the +path_extra feature for Exploring with **!",44)
3364
silent! let @* = keepregstar
3365
silent! let @+ = keepregstar
3366
silent! let @/ = keepregslash
3367
" call Dret("netrw#Explore : missing +path_extra")
3372
" call Decho("case Explore newdir<".dirname.">")
3373
if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && dirname =~ '/'
3374
silent! unlet w:netrw_treedict
3375
silent! unlet w:netrw_treetop
3378
if !exists("b:netrw_curdir")
3379
call netrw#LocalBrowseCheck(getcwd())
3381
call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,newdir))
3385
" visual display of **/ **// */ Exploration files
3386
if exists("w:netrw_explore_indx") && exists("b:netrw_curdir")
3387
if !exists("s:explore_prvdir") || s:explore_prvdir != b:netrw_curdir
3388
" only update match list if current directory isn't the same as before
3389
let s:explore_prvdir = b:netrw_curdir
3390
let s:explore_match = ""
3391
let dirlen = strlen(b:netrw_curdir)
3392
if b:netrw_curdir !~ '/$'
3393
let dirlen= dirlen + 1
3396
for fname in w:netrw_explore_list
3397
" call Decho("fname<".fname.">")
3398
if fname =~ '^'.b:netrw_curdir
3399
if s:explore_match == ""
3400
let s:explore_match= '\<'.escape(strpart(fname,dirlen),g:netrw_markfileesc."'".g:netrw_markfileesc."'").'\>'
3402
let s:explore_match= s:explore_match.'\|\<'.escape(strpart(fname,dirlen),g:netrw_markfileesc."'".g:netrw_markfileesc."'").'\>'
3404
elseif fname !~ '^/' && fname != prvfname
3405
if s:explore_match == ""
3406
let s:explore_match= '\<'.escape(fname,g:netrw_markfileesc."'".g:netrw_markfileesc."'").'\>'
3408
let s:explore_match= s:explore_match.'\|\<'.escape(fname,g:netrw_markfileesc."'".g:netrw_markfileesc."'").'\>'
3413
" call Decho("explore_match<".s:explore_match.">")
3414
exe "2match netrwMarkFile /".s:explore_match."/"
3416
echo "<s-up>==Pexplore <s-down>==Nexplore"
3419
if exists("s:explore_match") | unlet s:explore_match | endif
3420
if exists("s:explore_prvdir") | unlet s:explore_prvdir | endif
3422
" call Decho("cleared explore match list")
3425
silent! let @* = keepregstar
3426
silent! let @+ = keepregstar
3427
silent! let @/ = keepregslash
3428
" call Dret("netrw#Explore : @/<".@/.">")
3431
" ---------------------------------------------------------------------
2665
3432
" s:NetrwHide: this function is invoked by the "a" map for browsing {{{2
2666
3433
" and switches the hiding mode. The actual hiding is done by
2667
3434
" s:NetrwListHide().
2824
3708
" shift-leftmouse may also be used to mark files.
2825
3709
fun! s:NetrwMarkFile(islocal,fname)
2826
3710
" call Dfunc("s:NetrwMarkFile(islocal=".a:islocal." fname<".a:fname.">)")
2827
" call Decho("b:netrw_curdir<".b:netrw_curdir.">")
2828
if a:islocal && exists("b:netrw_curdir")
2829
exe "cd ".b:netrw_curdir
3711
let curbufnr= bufnr("%")
3712
let curdir = b:netrw_curdir
3713
if exists("s:netrwmarkfilelist_{curbufnr}")
3714
" markfile list exists
3715
" call Decho("starting s:netrwmarkfilelist_{curbufnr}<".string(s:netrwmarkfilelist_{curbufnr}).">")
3716
" call Decho("starting s:netrwmarkfilemtch_{curbufnr}<".s:netrwmarkfilemtch_{curbufnr}.">")
3718
if index(s:netrwmarkfilelist_{curbufnr},a:fname) == -1
3719
" append filename to local-directory markfilelist
3720
" call Decho("append filename<".a:fname."> to local markfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}).">")
3721
call add(s:netrwmarkfilelist_{curbufnr},a:fname)
3722
let s:netrwmarkfilemtch_{curbufnr}= s:netrwmarkfilemtch_{curbufnr}.'\|\<'.escape(a:fname,g:netrw_markfileesc."'".g:netrw_markfileesc."'").'\>'
3725
" remove filename from local markfilelist
3726
" call Decho("remove filename<".a:fname."> from local markfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}).">")
3727
call filter(s:netrwmarkfilelist_{curbufnr},'v:val != a:fname')
3728
if s:netrwmarkfilelist_{curbufnr} == []
3729
" local markfilelist is empty; remove it entirely
3730
" call Decho("markfile list now empty, unlet s:netrwmarkfilelist_".curbufnr." and ...mtch_".curbufnr)
3731
call s:NetrwUnmarkList(curbufnr,curdir)
3733
" rebuild match list to display markings correctly
3734
" call Decho("rebuild s:netrwmarkfilemtch_".curbufnr)
3735
let s:netrwmarkfilemtch_{curbufnr}= ""
3737
for fname in s:netrwmarkfilelist_{curbufnr}
3739
let s:netrwmarkfilemtch_{curbufnr}= s:netrwmarkfilemtch_{curbufnr}.'\<'.escape(fname,g:netrw_markfileesc."'".g:netrw_markfileesc."'").'\>'
3741
let s:netrwmarkfilemtch_{curbufnr}= s:netrwmarkfilemtch_{curbufnr}.'\|\<'.escape(fname,g:netrw_markfileesc."'".g:netrw_markfileesc."'").'\>'
3745
" call Decho("ending s:netrwmarkfilelist_"curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}).">")
3746
" call Decho("ending s:netrwmarkfilemtch_"curbufnr."<".s:netrwmarkfilemtch_{curbufnr}.">")
3751
" initialize new markfilelist
3753
" call Decho("add fname<".a:fname."> to new markfilelist_".curbufnr)
3754
let s:netrwmarkfilelist_{curbufnr}= []
3755
call add(s:netrwmarkfilelist_{curbufnr},a:fname)
3756
" call Decho("ending s:netrwmarkfilelist_{curbufnr}<".string(s:netrwmarkfilelist_{curbufnr}).">")
3758
" build initial markfile matching pattern
3760
let s:netrwmarkfilemtch_{curbufnr}= '\<'.escape(a:fname,g:netrw_markfileesc)
3762
let s:netrwmarkfilemtch_{curbufnr}= '\<'.escape(a:fname,g:netrw_markfileesc).'\>'
3764
" call Decho("ending s:netrwmarkfilemtch_".curbufnr."<".s:netrwmarkfilemtch_{curbufnr}.">")
3767
" handle global markfilelist
2832
3768
if exists("s:netrwmarkfilelist")
2833
" call Decho("starting s:netrwmarkfilelist<".string(s:netrwmarkfilelist).">")
2834
" call Decho("starting s:netrwmarkfilemtch<".s:netrwmarkfilemtch.">")
2836
if index(s:netrwmarkfilelist,a:fname) == -1
2837
" append filename to list
2838
" call Decho("append filename<".a:fname."> to markfilelist<".string(s:netrwmarkfilelist).">")
2839
call add(s:netrwmarkfilelist,a:fname)
2840
let s:netrwmarkfilemtch= s:netrwmarkfilemtch.'\|\<'.escape(a:fname,'*./[\').'\>'
3769
let dname= s:ComposePath(b:netrw_curdir,a:fname)
3770
if index(s:netrwmarkfilelist,dname) == -1
3771
" append new filename to global markfilelist
3772
call add(s:netrwmarkfilelist,s:ComposePath(b:netrw_curdir,a:fname))
3773
" call Decho("append filename<".a:fname."> to global markfilelist<".string(s:netrwmarkfilelist).">")
2842
" remove filename from list
2843
" call Decho("remove filename<".a:fname."> from markfilelist<".string(s:netrwmarkfilelist).">")
2844
call filter(s:netrwmarkfilelist,'v:val != a:fname')
3775
" remove new filename from global markfilelist
3776
" call Decho("filter(".string(s:netrwmarkfilelist).",'v:val != '.".dname.")")
3777
call filter(s:netrwmarkfilelist,'v:val != "'.dname.'"')
3778
" call Decho("ending s:netrwmarkfilelist <".string(s:netrwmarkfilelist).">")
2845
3779
if s:netrwmarkfilelist == []
2846
3780
unlet s:netrwmarkfilelist
2847
unlet s:netrwmarkfilemtch
2849
let s:netrwmarkfilemtch= substitute(s:netrwmarkfilemtch,'\\<'.a:fname.'\\>','','')
2850
let s:netrwmarkfilemtch= substitute(s:netrwmarkfilemtch,'\\|\\|','\\|','g')
2851
let s:netrwmarkfilemtch= substitute(s:netrwmarkfilemtch,'^\\|\|\\|$','','')
2852
" call Decho("ending s:netrwmarkfilelist<".string(s:netrwmarkfilelist).">")
2853
" call Decho("ending s:netrwmarkfilemtch<".s:netrwmarkfilemtch.">")
2859
" call Decho("add fname<".a:fname."> to new markfilelist")
3784
" initialize new global-directory markfilelist
2860
3785
let s:netrwmarkfilelist= []
2861
call add(s:netrwmarkfilelist,a:fname)
2862
" call Decho("ending s:netrwmarkfilelist<".string(s:netrwmarkfilelist).">")
2865
let s:netrwmarkfilemtch= '\<'.escape(a:fname,'*./[\')
2867
let s:netrwmarkfilemtch= '\<'.escape(a:fname,'*./[\').'\>'
2869
" call Decho("ending s:netrwmarkfilemtch<".s:netrwmarkfilemtch.">")
3786
call add(s:netrwmarkfilelist,s:ComposePath(b:netrw_curdir,a:fname))
3787
" call Decho("init s:netrwmarkfilelist<".string(s:netrwmarkfilelist).">")
2872
if exists("s:netrwmarkfilemtch") && s:netrwmarkfilemtch != ""
2873
" call Decho("exe 2match netrwMarkFile /".s:netrwmarkfilemtch."/")
2874
exe "2match netrwMarkFile /".s:netrwmarkfilemtch."/"
3790
" set up 2match'ing to netrwmarkfilemtch list
3791
if exists("s:netrwmarkfilemtch_{curbufnr}") && s:netrwmarkfilemtch_{curbufnr} != ""
3792
" call Decho("exe 2match netrwMarkFile /".s:netrwmarkfilemtch_{curbufnr}."/")
3793
exe "2match netrwMarkFile /".s:netrwmarkfilemtch_{curbufnr}."/"
2876
3795
" call Decho("2match none")
2879
" call Dret("s:NetrwMarkFile : netrwmarkfilelist".(exists("s:netrwmarkfilelist")? string(s:netrwmarkfilelist) : " doesn't exist"))
3798
" call Dret("s:NetrwMarkFile : netrwmarkfilelist_".curbufnr."<".(exists("s:netrwmarkfilelist_{curbufnr}")? string(s:netrwmarkfilelist_{curbufnr}) : " doesn't exist").">")
2882
3801
" ---------------------------------------------------------------------
2937
3860
" s:NetrwMarkFileCopy: (invoked by mc) copy marked files to target {{{2
2938
3861
" If no marked files, then set up directory as the
2939
3862
" target. Currently does not support copying entire
3863
" directories. Uses the local-buffer marked file list.
2941
3864
" Returns 1=success (used by NetrwMarkFileMove())
2943
3866
fun! s:NetrwMarkFileCopy(islocal)
2944
3867
" call Dfunc("s:NetrwMarkFileCopy(islocal=".a:islocal.") target<".(exists("s:netrwmftgt")? s:netrwmftgt : '---').">")
2945
if a:islocal && exists("b:netrw_curdir")
2946
exe "cd ".b:netrw_curdir
2949
" s:netrwmarkfilelist: the List of marked files
2950
if exists("s:netrwmarkfilelist")
2951
" call Decho("s:netrwmarkfilelist<".string(s:netrwmarkfilelist).">")
2952
" call Decho("s:netrwmarkfilemtch<".string(s:netrwmarkfilemtch).">")
2953
let svpos= netrw#NetrwSavePosn()
2955
" s:netrwmftgt : name of directory to copy files to
2956
" s:netrwmfloc : =0 target directory is remote
2957
" =1 target directory is local
2958
if exists("s:netrwmftgt") && exists("s:netrwmfloc")
2959
" call Decho("s:netrwmftgt<".s:netrwmftgt.">")
2960
" call Decho("s:netrwmfloc=".s:netrwmfloc)
2962
for fname in s:netrwmarkfilelist
2963
" call Decho("s:NetrwMarkFileCopy: fname<".fname.">")
2966
if (a:islocal && isdirectory(fname)) || (!a:islocal && fname =~ '/$')
2967
call netrw#ErrorMsg(s:ERROR,"currently netrw can't copy entire directories such as <".fname.">",58)
2968
" call Dret("s:NetrwMarkFileCopy 0 : currently netrw can't copy entire directories")
2972
if a:islocal && s:netrwmfloc
2973
" local to local copy
2974
" call Decho("local to local copy: getcwd<".getcwd()."> b:netrw_curdir<".b:netrw_curdir.">")
2975
if executable(g:netrw_localcopycmd)
2976
" call Decho("let ret= system(".g:netrw_localcopycmd." ".fname." ".s:netrwmftgt.")")
2977
let ret= system(g:netrw_localcopycmd." ".fname." ".s:netrwmftgt)
2978
if v:shell_error < 0
2979
call netrw#ErrorMsg(s:ERROR,"command<".g:netrw_localcopycmd."> failed, aborting",54)
2983
call netrw#ErrorMsg(s:ERROR,"command<".g:netrw_localcopycmd."> is not executable!",57)
2987
elseif !a:islocal && s:netrwmfloc
2988
" remote to local copy
2989
" call Decho("remote to local copy: getcwd<".getcwd()."> b:netrw_curdir<".b:netrw_curdir.">")
2990
call netrw#NetrwObtain(a:islocal,fname,s:netrwmftgt)
2992
elseif a:islocal && !s:netrwmfloc
2993
" local to remote copy
2994
" call Decho("local to remote copy: getcwd<".getcwd()."> b:netrw_curdir<".b:netrw_curdir.">")
2995
call s:NetrwUpload(fname,s:netrwmftgt)
2998
" remote to remote copy
2999
" call Decho("remote to remote copy")
3000
call s:NetrwUpload(fname,s:netrwmftgt)
3004
" unmark marked file list (although I expect s:NetrwUpload()
3005
" to do it, I'm just making sure)
3006
if exists("s:netrwmarkfilelist")
3007
unlet s:netrwmarkfilelist
3008
unlet s:netrwmarkfilemtch
3870
if !exists("s:netrwmarkfilelist_{bufnr('%')}") || empty(s:netrwmarkfilelist_{bufnr('%')})
3871
call netrw#ErrorMsg(2,"there are no marked files in this window (:help netrw-mf)",66)
3872
" call Dret("s:NetrwMarkFileCopy 0")
3875
" call Decho("sanity chk passed: s:netrwmarkfilelist_".bufnr('%')."<".string(s:netrwmarkfilelist_{bufnr('%')}))
3876
if !exists("s:netrwmftgt")
3877
call netrw#ErrorMsg(2,"your marked file target is empty! (:help netrw-mt)",67)
3878
" call Dret("s:NetrwMarkFileCopy 0")
3881
" call Decho("sanity chk passed: s:netrwmftgt<".s:netrwmftgt.">")
3882
let curdir = b:netrw_curdir
3883
let curbufnr = bufnr("%")
3885
if a:islocal && s:netrwmftgt_islocal
3886
" Copy marked files, local directory to local directory
3887
" call Decho("copy from local to local")
3888
let args= join(map(copy(s:netrwmarkfilelist_{bufnr('%')}),"b:netrw_curdir.\"/\".shellescape(v:val)"))
3889
" call Decho("system(".g:netrw_localcopycmd." ".args." ".shellescape(s:netrwmftgt).")")
3890
call system(g:netrw_localcopycmd." ".args." ".shellescape(s:netrwmftgt))
3892
elseif a:islocal && !s:netrwmftgt_islocal
3893
" Copy marked files, local directory to remote directory
3894
" call Decho("copy from local to remote")
3895
call s:NetrwUpload(s:netrwmarkfilelist_{bufnr('%')},s:netrwmftgt)
3897
elseif !a:islocal && s:netrwmftgt_islocal
3898
" call Decho("copy from remote to local")
3899
call netrw#NetrwObtain(a:islocal,s:netrwmarkfilelist_{bufnr('%')},s:netrwmftgt)
3901
elseif !a:islocal && !s:netrwmftgt_islocal
3902
" call Decho("copy from remote to remote")
3903
let curdir = getcwd()
3904
let tmpdir = s:GetTempfile("")
3906
let tmpdir= curdir."/".tmpdir
3911
exe "silent! !".g:netrw_local_mkdir.' '.shellescape(tmpdir)
3913
if isdirectory(tmpdir)
3914
exe "keepjumps lcd ".fnameescape(tmpdir)
3915
call netrw#NetrwObtain(a:islocal,s:netrwmarkfilelist_{bufnr('%')},tmpdir)
3916
let localfiles= map(copy(s:netrwmarkfilelist_{bufnr('%')}),'substitute(v:val,"^.*/","","")')
3917
call s:NetrwUpload(localfiles,s:netrwmftgt)
3918
if getcwd() == tmpdir
3919
for fname in s:netrwmarkfilelist_{bufnr('%')}
3920
call s:System("delete",fname)
3922
exe "keepjumps lcd ".fnameescape(curdir)
3923
exe "silent !".g:netrw_local_rmdir." ".fnameescape(tmpdir)
3925
exe "keepjumps lcd ".fnameescape(curdir)
3012
call netrw#ErrorMsg(s:ERROR,"missing a markfile copy target! (see help for netrw-mt)",56)
3015
" refresh the listing
3016
call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
3017
call netrw#NetrwRestorePosn(svpos)
3019
call netrw#ErrorMsg(s:ERROR,"no files marked!",59)
3933
" call Decho("cleanup")
3935
" remove markings from local buffer
3936
call s:NetrwUnmarkList(curbufnr,curdir)
3939
if !s:netrwmftgt_islocal
3940
call s:NetrwRefreshDir(s:netrwmftgt_islocal,s:netrwmftgt)
3943
call s:NetrwRefreshDir(a:islocal,b:netrw_curdir)
3945
call s:LocalBrowseShellCmdRefresh()
3022
3947
" call Dret("s:NetrwMarkFileCopy 1")
3126
4064
" unmark marked file list
3127
unlet s:netrwmarkfilelist
3128
unlet s:netrwmarkfilemtch
4065
call s:NetrwUnmarkList(curbufnr,curdir)
3131
4067
" refresh the listing
3132
4068
call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
3133
4069
call netrw#NetrwRestorePosn(svpos)
4071
call netrw#ErrorMsg(s:ERROR,"no files marked!",59)
3136
4074
" call Dret("s:NetrwMarkFileExe")
3139
4077
" ---------------------------------------------------------------------
4078
" s:NetrwMarkHideSfx: (invoked by mh) (un)hide files having same suffix
4079
" as the marked file(s) (toggles suffix presence)
4080
" Uses the local marked file list.
4081
fun! s:NetrwMarkHideSfx(islocal)
4082
" call Dfunc("s:NetrwMarkHideSfx(islocal=".a:islocal.")")
4083
let svpos = netrw#NetrwSavePosn()
4084
let curbufnr = bufnr("%")
4086
" s:netrwmarkfilelist_{curbufnr}: the List of marked files
4087
if exists("s:netrwmarkfilelist_{curbufnr}")
4089
for fname in s:netrwmarkfilelist_{curbufnr}
4090
" call Decho("s:NetrwMarkFileCopy: fname<".fname.">")
4091
" construct suffix pattern
4093
let sfxpat= "^.*".substitute(fname,'^.*\(\.[^. ]\+\)$','\1','')
4095
let sfxpat= '^\%(\%(\.\)\@!.\)*$'
4097
" determine if its in the hiding list or not
4099
if g:netrw_list_hide != ""
4101
let hidelist= split(g:netrw_list_hide,',')
4102
for hidepat in hidelist
4103
if sfxpat == hidepat
4107
let itemnum= itemnum + 1
4110
" call Decho("fname<".fname."> inhidelist=".inhidelist." sfxpat<".sfxpat.">")
4112
" remove sfxpat from list
4113
call remove(hidelist,itemnum)
4114
let g:netrw_list_hide= join(hidelist,",")
4115
elseif g:netrw_list_hide != ""
4116
" append sfxpat to non-empty list
4117
let g:netrw_list_hide= g:netrw_list_hide.",".sfxpat
4119
" set hiding list to sfxpat
4120
let g:netrw_list_hide= sfxpat
4124
" refresh the listing
4125
call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
4126
call netrw#NetrwRestorePosn(svpos)
4128
call netrw#ErrorMsg(s:ERROR,"no files marked!",59)
4131
" call Dret("s:NetrwMarkHideSfx")
4134
" ---------------------------------------------------------------------
4135
" s:NetrwMarkFileGrep: (invoked by mg) This function applies vimgrep to marked files {{{2
4136
" Uses the global markfilelist
4137
fun! s:NetrwMarkFileGrep(islocal)
4138
" call Dfunc("s:NetrwMarkFileGrep(islocal=".a:islocal.")")
4139
let svpos = netrw#NetrwSavePosn()
4140
let curdir = b:netrw_curdir
4141
let curbufnr = bufnr("%")
4143
if exists("s:netrwmarkfilelist")
4144
" call Decho("s:netrwmarkfilelist".string(s:netrwmarkfilelist).">")
4145
let netrwmarkfilelist= ""
4146
for fname in s:netrwmarkfilelist
4147
" call Decho("fname<".fname.">")
4148
let fname = escape(substitute(fname,"[\"']","","g")," ")
4149
let netrwmarkfilelist = netrwmarkfilelist." ".fname
4151
call s:NetrwUnmarkAll()
4153
" ask user for pattern
4155
let pat= input("Enter pattern: ","")
4159
let pat= '/'.pat.'/'
4164
" use vimgrep for both local and remote
4165
" call Decho("exe vimgrep".pat." ".netrwmarkfilelist)
4166
exe "vimgrep".pat." ".netrwmarkfilelist
4169
call netrw#NetrwRestorePosn(svpos)
4172
" call Dret("s:NetrwMarkFileGrep")
4175
" ---------------------------------------------------------------------
3140
4176
" s:NetrwMarkFileMove: (invoked by mm) execute arbitrary command on marked files, one at a time {{{2
4177
" uses the global marked file list
4178
" s:netrwmfloc= 0: target directory is remote
4179
" = 1: target directory is local
3141
4180
fun! s:NetrwMarkFileMove(islocal)
3142
4181
" call Dfunc("s:NetrwMarkFileMove(islocal=".a:islocal.")")
3143
if a:islocal && exists("b:netrw_curdir")
3144
exe "cd ".b:netrw_curdir
3147
if exists("s:netrwmarkfilelist")
3148
let svpos= netrw#NetrwSavePosn()
3149
if exists("s:netrwmftgt") && exists("s:netrwmfloc")
3151
if a:islocal && s:netrwmfloc
3152
" local to local move
3153
if executable(g:netrw_localmovecmd)
3154
" call Decho("let ret= system(".g:netrw_localmovecmd." ".fname." ".s:netrwmftgt.")")
3155
let ret= system(g:netrw_localmovecmd." ".fname." ".s:netrwmftgt)
3156
if v:shell_error < 0
3157
call netrw#ErrorMsg(s:ERROR,"command<".g:netrw_localmovecmd."> failed, aborting",54)
3161
call netrw#ErrorMsg(s:ERROR,"command<".g:netrw_localmovecmd."> is not executable!",57)
3165
" remote to local move
3166
" local to remote move
3167
" remote to remote move
3168
let netrwmflist = s:netrwmflist
3169
let netrwmfmtch = s:netrwmfmtch
3170
if s:NetrwMarkFileCopy(islocal)
3171
let s:netrwmflist= netrwmflist
3172
let s:netrwmfmtch= netrwmfmtch
3174
call s:NetrwLocalRm("---")
3176
call s:NetrwRemoteRm("---","---")
3181
" First, do a copy, then (attempt to) do a delete
3183
call netrw#NetrwRestorePosn(svpos)
4182
let curdir = b:netrw_curdir
4183
let curbufnr = bufnr("%")
4186
if !exists("s:netrwmarkfilelist_{bufnr('%')}") || empty(s:netrwmarkfilelist_{bufnr('%')})
4187
call netrw#ErrorMsg(2,"there are no marked files in this window (:help netrw-mf)",66)
4188
" call Dret("s:NetrwMarkFileMove")
4191
" call Decho("sanity chk passed: s:netrwmarkfilelist_".bufnr('%')."<".string(s:netrwmarkfilelist_{bufnr('%')}))
4192
if !exists("s:netrwmftgt")
4193
call netrw#ErrorMsg(2,"your marked file target is empty! (:help netrw-mt)",67)
4194
" call Dret("s:NetrwMarkFileCopy 0")
4197
" call Decho("sanity chk passed: s:netrwmftgt<".s:netrwmftgt.">")
4199
if a:islocal && s:netrwmftgt_islocal
4200
" move: local -> local
4201
" call Decho("move from local to local")
4202
" call Decho("(s:NetrwMarkFileMove) local to local move")
4203
if executable(g:netrw_localmovecmd)
4204
for fname in s:netrwmarkfilelist_{bufnr("%")}
4205
" call Decho("system(".g:netrw_localmovecmd." ".shellescape(fname)." ".shellescape(s:netrwmftgt).")")
4206
let ret= system(g:netrw_localmovecmd." ".shellescape(fname)." ".shellescape(s:netrwmftgt))
4207
if v:shell_error < 0
4208
call netrw#ErrorMsg(s:ERROR,"command<".g:netrw_localmovecmd."> failed, aborting",54)
4213
call netrw#ErrorMsg(s:ERROR,"command<".g:netrw_localmovecmd."> is not executable!",57)
4216
elseif a:islocal && !s:netrwmftgt_islocal
4217
" move: local -> remote
4218
" call Decho("move from local to remote")
4219
" call Decho("copy")
4220
let mflist= s:netrwmarkfilelist_{bufnr("%")}
4221
call s:NetrwMarkFileCopy(a:islocal)
4222
" call Decho("remove")
4224
let barefname = substitute(fname,'^\(.*/\)\(.\{-}\)$','\2','')
4225
let ok = s:NetrwLocalRmFile(b:netrw_curdir,barefname,1)
4229
elseif !a:islocal && s:netrwmftgt_islocal
4230
" move: remote -> local
4231
" call Decho("move from remote to local")
4232
" call Decho("copy")
4233
let mflist= s:netrwmarkfilelist_{bufnr("%")}
4234
call s:NetrwMarkFileCopy(a:islocal)
4235
" call Decho("remove")
4237
let barefname = substitute(fname,'^\(.*/\)\(.\{-}\)$','\2','')
4238
let ok = s:NetrwRemoteRmFile(b:netrw_curdir,barefname,1)
4242
elseif !a:islocal && !s:netrwmftgt_islocal
4243
" move: remote -> remote
4244
" call Decho("move from remote to remote")
4245
" call Decho("copy")
4246
let mflist= s:netrwmarkfilelist_{bufnr("%")}
4247
call s:NetrwMarkFileCopy(a:islocal)
4248
" call Decho("remove")
4250
let barefname = substitute(fname,'^\(.*/\)\(.\{-}\)$','\2','')
4251
let ok = s:NetrwRemoteRmFile(b:netrw_curdir,barefname,1)
4259
" call Decho("cleanup")
4261
" remove markings from local buffer
4262
call s:NetrwUnmarkList(curbufnr,curdir) " remove markings from local buffer
4265
if !s:netrwmftgt_islocal
4266
call s:NetrwRefreshDir(s:netrwmftgt_islocal,s:netrwmftgt)
4269
call s:NetrwRefreshDir(a:islocal,b:netrw_curdir)
4271
call s:LocalBrowseShellCmdRefresh()
3186
4273
" call Dret("s:NetrwMarkFileMove")
3189
4276
" ---------------------------------------------------------------------
3190
4277
" s:NetrwMarkFilePrint: (invoked by mp) This function prints marked files {{{2
3191
" using the hardcopy command
4278
" using the hardcopy command. Local marked-file list only.
3192
4279
fun! s:NetrwMarkFilePrint(islocal)
3193
4280
" call Dfunc("s:NetrwMarkFilePrint(islocal=".a:islocal.")")
3194
if a:islocal && exists("b:netrw_curdir")
3195
exe "cd ".b:netrw_curdir
3197
if exists("s:netrwmarkfilelist")
3198
let netrwmarkfilelist= s:netrwmarkfilelist
3199
unlet s:netrwmarkfilelist
3200
unlet s:netrwmarkfilemtch
4281
let curbufnr= bufnr("%")
4282
if exists("s:netrwmarkfilelist_{curbufnr}")
4283
let netrwmarkfilelist = s:netrwmarkfilelist_{curbufnr}
4284
let curdir = b:netrw_curdir
4285
call s:NetrwUnmarkList(curbufnr,curdir)
3201
4286
for fname in netrwmarkfilelist
4289
let fname= s:ComposePath(curdir,fname)
4292
let fname= curdir.fname
3203
exe "silent e ".fname
3204
" call Decho("hardcopy ".fname)
4295
" the autocmds will handle both local and remote files
4296
" call Decho("exe silent e ".escape(fname,' '))
4297
exe "silent e ".escape(fname,' ')
4298
" call Decho("hardcopy")
3336
4461
" s:NetrwMarkFileTgt: (invoked by mt) This function sets up a marked file target {{{2
3337
4462
" Sets up two variables,
3338
4463
" s:netrwmftgt : holds the target directory
3339
" s:netrwmfloc : 0=target directory is remote
4464
" s:netrwmftgt_islocal : 0=target directory is remote
3340
4465
" 1=target directory is local
3341
4466
fun! s:NetrwMarkFileTgt(islocal)
3342
4467
" call Dfunc("s:NetrwMarkFileTgt(islocal=".a:islocal.")")
3343
let svpos= netrw#NetrwSavePosn()
3344
if a:islocal && exists("b:netrw_curdir")
3345
exe "cd ".b:netrw_curdir
4468
let svpos = netrw#NetrwSavePosn()
4469
let curdir = b:netrw_curdir
4470
let hadtgt = exists("s:netrwmftgt")
4471
if !exists("w:netrw_bannercnt")
4472
let w:netrw_bannercnt= b:netrw_bannercnt
3348
if exists("s:netrwmftgt") || exists("s:netrwmfloc")
3349
" call Decho("s:netrwmftgt<".s:netrwmftgt."> exists; removing it")
3350
silent! unlet s:netrwmftgt s:netrwmfloc
4476
if line(".") < w:netrw_bannercnt
4477
" if cursor in banner region, use b:netrw_curdir for the target
4478
let s:netrwmftgt= b:netrw_curdir
4479
" call Decho("inbanner: s:netrwmftgt<".s:netrwmftgt.">")
3352
" call Decho("s:netrwmftgt doesn't exist; setting it to <".b:netrw_curdir.">")
3353
let s:netrwmftgt = b:netrw_curdir
3354
let s:netrwmfloc = a:islocal
3356
let s:netrwmftgt= substitute(system("cygpath ".b:netrw_curdir),'\n$','','')
4482
" get word under cursor.
4483
" * If directory, use it for the target.
4484
" * If file, use b:netrw_curdir for the target
4485
let curword= s:NetrwGetWord()
4486
let tgtdir = s:ComposePath(curdir,curword)
4487
if a:islocal && isdirectory(tgtdir)
4488
let s:netrwmftgt = tgtdir
4489
" call Decho("local isdir: s:netrwmftgt<".s:netrwmftgt.">")
4490
elseif !a:islocal && tgtdir =~ '/$'
4491
let s:netrwmftgt = tgtdir
4492
" call Decho("remote isdir: s:netrwmftgt<".s:netrwmftgt.">")
4494
let s:netrwmftgt = curdir
4495
" call Decho("isfile: s:netrwmftgt<".s:netrwmftgt.">")
4499
" simplify the target (eg. /abc/def/../ghi -> /abc/ghi)
4500
let s:netrwmftgt= simplify(s:netrwmftgt)
4501
" call Decho("simplify: s:netrwmftgt<".s:netrwmftgt.">")
4504
let s:netrwmftgt= substitute(system("cygpath ".shellescape(s:netrwmftgt)),'\n$','','')
4505
let s:netrwmftgt= substitute(s:netrwmftgt,'\n$','','')
4507
let s:netrwmftgt_islocal= a:islocal
4509
if g:netrw_fastbrowse > 0
4510
call s:LocalBrowseShellCmdRefresh()
3360
4512
call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
3361
4513
call netrw#NetrwRestorePosn(svpos)
3362
" call Dret("s:NetrwMarkFileTgt")
3365
" ===========================================
4518
" call Dret("s:NetrwMarkFileTgt : netrwmftgt<".(exists("s:netrwmftgt")? s:netrwmftgt : "").">")
4521
" ---------------------------------------------------------------------
4522
" s:NetrwUnmarkList: delete local marked file lists and remove their contents from the global marked-file list {{{2
4523
fun! s:NetrwUnmarkList(curbufnr,curdir)
4524
" call Dfunc("s:NetrwUnmarkList(curbufnr=".a:curbufnr." curdir<".a:curdir.">)")
4526
" remove all files in local marked-file list from global list
4527
if exists("s:netrwmarkfilelist_{a:curbufnr}")
4528
for mfile in s:netrwmarkfilelist_{a:curbufnr}
4529
let dfile = s:ComposePath(a:curdir,mfile) " prepend directory to mfile
4530
let idx = index(s:netrwmarkfilelist,dfile) " get index in list of dfile
4531
call remove(s:netrwmarkfilelist,idx) " remove from global list
4533
if s:netrwmarkfilelist == []
4534
unlet s:netrwmarkfilelist
4537
" getting rid of the local marked-file lists is easy
4538
unlet s:netrwmarkfilelist_{a:curbufnr}
4540
if exists("s:netrwmarkfilemtch_{a:curbufnr}")
4541
unlet s:netrwmarkfilemtch_{a:curbufnr}
4544
" call Dret("s:NetrwUnmarkList")
4547
" ---------------------------------------------------------------------
4548
" s:NetrwUnmarkAll: remove the global marked file list and all local ones {{{2
4549
fun! s:NetrwUnmarkAll()
4550
" call Dfunc("s:NetrwUnmarkAll()")
4551
if exists("s:netrwmarkfilelist")
4552
unlet s:netrwmarkfilelist
4554
silent call s:NetrwUnmarkAll2()
4556
" call Dret("s:NetrwUnmarkAll")
4559
" ---------------------------------------------------------------------
4560
" s:NetrwUnmarkAll2: {{{2
4561
fun! s:NetrwUnmarkAll2()
4562
" call Dfunc("s:NetrwUnmarkAll2()")
4563
redir => netrwmarkfilelist_let
4566
let netrwmarkfilelist_list= split(netrwmarkfilelist_let,'\n') " convert let string into a let list
4567
call filter(netrwmarkfilelist_list,"v:val =~ '^s:netrwmarkfilelist_'") " retain only those vars that start as s:netrwmarkfilelist_
4568
call map(netrwmarkfilelist_list,"substitute(v:val,'\\s.*$','','')") " remove what the entries are equal to
4569
for flist in netrwmarkfilelist_list
4570
let curbufnr= substitute(flist,'s:netrwmarkfilelist_','','')
4571
unlet s:netrwmarkfilelist_{curbufnr}
4572
unlet s:netrwmarkfilemtch_{curbufnr}
4574
" call Dret("s:NetrwUnmarkAll2")
4577
" ---------------------------------------------------------------------
4578
" s:NetrwUnMarkFile: {{{2
4579
fun! s:NetrwUnMarkFile(islocal)
4580
" call Dfunc("s:NetrwUnMarkFile(islocal=".a:islocal.")")
4581
let svpos = netrw#NetrwSavePosn()
4582
let curbufnr = bufnr("%")
4584
" unmark marked file list (although I expect s:NetrwUpload()
4585
" to do it, I'm just making sure)
4586
if exists("s:netrwmarkfilelist_{bufnr('%')}")
4587
" call Decho("unlet'ing: s:netrwmarkfile[list|mtch]_".bufnr("%"))
4588
unlet s:netrwmarkfilelist
4589
unlet s:netrwmarkfilelist_{curbufnr}
4590
unlet s:netrwmarkfilemtch_{curbufnr}
4594
" call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
4595
call netrw#NetrwRestorePosn(svpos)
4596
" call Dret("s:NetrwUnMarkFile")
4599
" ---------------------------------------------------------------------
4600
" s:NetrwMenu: generates the menu for gvim and netrw {{{2
4601
fun! s:NetrwMenu(domenu)
4603
if !exists("g:NetrwMenuPriority")
4604
let g:NetrwMenuPriority= 80
4607
if has("menu") && has("gui_running") && &go =~ 'm' && g:netrw_menu
4608
" call Dfunc("NetrwMenu(domenu=".a:domenu.")")
4610
if !exists("s:netrw_menu_enabled") && a:domenu
4611
" call Decho("initialize menu")
4612
let s:netrw_menu_enabled= 1
4613
exe 'silent! menu '.g:NetrwMenuPriority.'.1 '.g:NetrwTopLvlMenu.'Help<tab><F1> <F1>'
4614
call s:NetrwBookmarkMenu() " provide some history! uses priorities 2,3, reserves 4
4615
exe 'silent! menu '.g:NetrwMenuPriority.'.5 '.g:NetrwTopLvlMenu.'-Sep1- :'
4616
exe 'silent! menu '.g:NetrwMenuPriority.'.6 '.g:NetrwTopLvlMenu.'Go\ Up\ Directory<tab>- -'
4617
exe 'silent! menu '.g:NetrwMenuPriority.'.7 '.g:NetrwTopLvlMenu.'Apply\ Special\ Viewer<tab>x x'
4618
exe 'silent! menu '.g:NetrwMenuPriority.'.8.1 '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Bookmark\ Current\ Directory<tab>mb mb'
4619
exe 'silent! menu '.g:NetrwMenuPriority.'.8.2 '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Bookmark\ Delete<tab>mB mB'
4620
exe 'silent! menu '.g:NetrwMenuPriority.'.8.3 '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Goto\ Bookmark<tab>gb gb'
4621
exe 'silent! menu '.g:NetrwMenuPriority.'.8.4 '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Goto\ Prev\ Dir\ (History)<tab>u u'
4622
exe 'silent! menu '.g:NetrwMenuPriority.'.8.5 '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Goto\ Next\ Dir\ (History)<tab>U U'
4623
exe 'silent! menu '.g:NetrwMenuPriority.'.8.6 '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.List<tab>qb qb'
4624
exe 'silent! menu '.g:NetrwMenuPriority.'.9.1 '.g:NetrwTopLvlMenu.'Browsing\ Control.Edit\ File\ Hiding\ List<tab>'."<ctrl-h> \<Plug>NetrwHideEdit"
4625
exe 'silent! menu '.g:NetrwMenuPriority.'.9.2 '.g:NetrwTopLvlMenu.'Browsing\ Control.Edit\ Sorting\ Sequence<tab>S S'
4626
exe 'silent! menu '.g:NetrwMenuPriority.'.9.3 '.g:NetrwTopLvlMenu.'Browsing\ Control.Quick\ Hide/Unhide\ Dot\ Files<tab>'."gh gh"
4627
exe 'silent! menu '.g:NetrwMenuPriority.'.9.4 '.g:NetrwTopLvlMenu.'Browsing\ Control.Refresh\ Listing<tab>'."<ctrl-l> \<Plug>NetrwRefresh"
4628
exe 'silent! menu '.g:NetrwMenuPriority.'.9.5 '.g:NetrwTopLvlMenu.'Browsing\ Control.Settings/Options<tab>:NetrwSettings '.":NetrwSettings\<cr>"
4629
exe 'silent! menu '.g:NetrwMenuPriority.'.10 '.g:NetrwTopLvlMenu.'Delete\ File/Directory<tab>D D'
4630
exe 'silent! menu '.g:NetrwMenuPriority.'.11.1 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.In\ Current\ Window<tab><cr> '."\<cr>"
4631
exe 'silent! menu '.g:NetrwMenuPriority.'.11.2 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.Preview\ File/Directory<tab>p p'
4632
exe 'silent! menu '.g:NetrwMenuPriority.'.11.3 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.In\ Previous\ Window<tab>P P'
4633
exe 'silent! menu '.g:NetrwMenuPriority.'.11.4 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.In\ New\ Window<tab>o o'
4634
exe 'silent! menu '.g:NetrwMenuPriority.'.11.5 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.In\ New\ Vertical\ Window<tab>v v'
4635
exe 'silent! menu '.g:NetrwMenuPriority.'.12.1 '.g:NetrwTopLvlMenu.'Explore.Directory\ Name :Explore '
4636
exe 'silent! menu '.g:NetrwMenuPriority.'.12.2 '.g:NetrwTopLvlMenu.'Explore.Filenames\ Matching\ Pattern\ (curdir\ only)<tab>:Explore\ */ :Explore */'
4637
exe 'silent! menu '.g:NetrwMenuPriority.'.12.2 '.g:NetrwTopLvlMenu.'Explore.Filenames\ Matching\ Pattern\ (+subdirs)<tab>:Explore\ **/ :Explore **/'
4638
exe 'silent! menu '.g:NetrwMenuPriority.'.12.3 '.g:NetrwTopLvlMenu.'Explore.Files\ Containing\ Pattern\ (curdir\ only)<tab>:Explore\ *// :Explore *//'
4639
exe 'silent! menu '.g:NetrwMenuPriority.'.12.4 '.g:NetrwTopLvlMenu.'Explore.Files\ Containing\ Pattern\ (+subdirs)<tab>:Explore\ **// :Explore **//'
4640
exe 'silent! menu '.g:NetrwMenuPriority.'.12.4 '.g:NetrwTopLvlMenu.'Explore.Next\ Match<tab>:Nexplore :Nexplore<cr>'
4641
exe 'silent! menu '.g:NetrwMenuPriority.'.12.4 '.g:NetrwTopLvlMenu.'Explore.Prev\ Match<tab>:Pexplore :Pexplore<cr>'
4642
exe 'silent! menu '.g:NetrwMenuPriority.'.13 '.g:NetrwTopLvlMenu.'Make\ Subdirectory<tab>d d'
4643
exe 'silent! menu '.g:NetrwMenuPriority.'.14.1 '.g:NetrwTopLvlMenu.'Marked\ Files.Mark\ File<tab>mf mf'
4644
exe 'silent! menu '.g:NetrwMenuPriority.'.14.2 '.g:NetrwTopLvlMenu.'Marked\ Files.Mark\ Files\ by\ Regexp<tab>mr mr'
4645
exe 'silent! menu '.g:NetrwMenuPriority.'.14.3 '.g:NetrwTopLvlMenu.'Marked\ Files.Hide-Show-List\ Control<tab>a a'
4646
exe 'silent! menu '.g:NetrwMenuPriority.'.14.4 '.g:NetrwTopLvlMenu.'Marked\ Files.Copy\ To\ Target<tab>mc mc'
4647
exe 'silent! menu '.g:NetrwMenuPriority.'.14.5 '.g:NetrwTopLvlMenu.'Marked\ Files.Delete<tab>D D'
4648
exe 'silent! menu '.g:NetrwMenuPriority.'.14.6 '.g:NetrwTopLvlMenu.'Marked\ Files.Diff<tab>md md'
4649
exe 'silent! menu '.g:NetrwMenuPriority.'.14.7 '.g:NetrwTopLvlMenu.'Marked\ Files.Edit<tab>me me'
4650
exe 'silent! menu '.g:NetrwMenuPriority.'.14.8 '.g:NetrwTopLvlMenu.'Marked\ Files.Exe\ Cmd<tab>mx mx'
4651
exe 'silent! menu '.g:NetrwMenuPriority.'.14.9 '.g:NetrwTopLvlMenu.'Marked\ Files.Move\ To\ Target<tab>mm mm'
4652
exe 'silent! menu '.g:NetrwMenuPriority.'.14.10 '.g:NetrwTopLvlMenu.'Marked\ Files.Obtain<tab>O O'
4653
exe 'silent! menu '.g:NetrwMenuPriority.'.14.11 '.g:NetrwTopLvlMenu.'Marked\ Files.Print<tab>mp mp'
4654
exe 'silent! menu '.g:NetrwMenuPriority.'.14.12 '.g:NetrwTopLvlMenu.'Marked\ Files.Replace<tab>R R'
4655
exe 'silent! menu '.g:NetrwMenuPriority.'.14.13 '.g:NetrwTopLvlMenu.'Marked\ Files.Set\ Target<tab>mt mt'
4656
exe 'silent! menu '.g:NetrwMenuPriority.'.14.14 '.g:NetrwTopLvlMenu.'Marked\ Files.Tag<tab>mT mT'
4657
exe 'silent! menu '.g:NetrwMenuPriority.'.14.15 '.g:NetrwTopLvlMenu.'Marked\ Files.Zip/Unzip/Compress/Uncompress<tab>mz mz'
4658
exe 'silent! menu '.g:NetrwMenuPriority.'.15 '.g:NetrwTopLvlMenu.'Obtain\ File<tab>O O'
4659
exe 'silent! menu '.g:NetrwMenuPriority.'.16.1 '.g:NetrwTopLvlMenu.'Style.Listing\ Style\ (thin-long-wide-tree)<tab>i i'
4660
exe 'silent! menu '.g:NetrwMenuPriority.'.16.2 '.g:NetrwTopLvlMenu.'Style.Normal-Hide-Show<tab>a a'
4661
exe 'silent! menu '.g:NetrwMenuPriority.'.16.3 '.g:NetrwTopLvlMenu.'Style.Reverse\ Sorting\ Order<tab>'."r r"
4662
exe 'silent! menu '.g:NetrwMenuPriority.'.16.4 '.g:NetrwTopLvlMenu.'Style.Sorting\ Method\ (name-time-size)<tab>s s'
4663
exe 'silent! menu '.g:NetrwMenuPriority.'.17 '.g:NetrwTopLvlMenu.'Rename\ File/Directory<tab>R R'
4664
exe 'silent! menu '.g:NetrwMenuPriority.'.18 '.g:NetrwTopLvlMenu.'Set\ Current\ Directory<tab>c c'
4665
let s:netrw_menucnt= 28
4669
let curwin = winnr()
4670
windo if getline(2) =~ "Netrw" | let s:netrwcnt= s:netrwcnt + 1 | endif
4671
exe curwin."wincmd w"
4674
" call Decho("clear menus")
4675
exe 'silent! unmenu '.g:NetrwTopLvlMenu
4676
" call Decho('exe silent! unmenu '.g:NetrwTopLvlMenu.'*')
4677
silent! unlet s:netrw_menu_enabled
4680
" call Dret("NetrwMenu")
4685
" ---------------------------------------------------------------------
3366
4686
" s:NetrwObtain: obtain file under cursor or from markfile list {{{2
4687
" Used by the O maps (as <SID>NetrwObtain())
3367
4688
fun! s:NetrwObtain(islocal)
3368
4689
" call Dfunc("NetrwObtain(islocal=".a:islocal.")")
3370
if exists("s:netrwmarkfilelist")
3371
for fname in s:netrwmarkfilelist
3372
call netrw#NetrwObtain(a:islocal,fname)
3374
unlet s:netrwmarkfilelist
3375
unlet s:netrwmarkfilemtch
4691
if exists("s:netrwmarkfilelist_{bufnr('%')}")
4692
let islocal= s:netrwmarkfilelist_{bufnr("%")}[1] !~ '^\a\+://'
4693
call netrw#NetrwObtain(islocal,s:netrwmarkfilelist_{bufnr("%")})
4694
call s:NetrwUnmarkList(bufnr('%'),b:netrw_curdir)
3378
4696
call netrw#NetrwObtain(a:islocal,expand("<cWORD>"))
3405
" obtain a remote file to local directory (see tgtdir below)
3406
call s:SetupNetrwStatusLine('%f %h%m%r%=%9*Obtaining '.a:fname)
3408
" set up target directory (default is vim's idea of the current directory)
3414
" call Decho("tgtdir<".tgtdir.">")
3415
if exists("w:netrw_method") && w:netrw_method =~ '[235]'
3416
" call Decho("method=".w:netrw_method)
3417
if executable("ftp")
3418
" call Decho("ftp is executable, method=".w:netrw_method)
3419
let curdir = b:netrw_curdir
3420
let path = substitute(curdir,'ftp://[^/]\+/','','e')
3421
let curline= line(".")
3422
let endline= line("$")+1
3425
" call Decho("getcwd<".getcwd().">")
3426
" call Decho("curdir<".curdir.">")
3427
" call Decho("path<".path.">")
3428
" call Decho("curline=".curline)
3429
" call Decho("endline=".endline)
3431
".........................................
3432
if w:netrw_method == 2
3433
" ftp + <.netrc>: Method #2
3437
" call Decho("ftp: cd ".path)
3443
" call Decho("ftp: get ".a:fname)
3445
" call Decho("ftp: quit")
3446
if exists("g:netrw_port") && g:netrw_port != ""
3447
" call Decho("exe ".g:netrw_silentxfer.endline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port)
3448
exe g:netrw_silentxfer.endline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port
4754
" call Decho("obtain a remote file from ".b:netrw_curdir." to ".tgtdir)
4755
if type(a:fname) == 1
4756
call s:SetupNetrwStatusLine('%f %h%m%r%=%9*Obtaining '.a:fname)
4758
call s:NetrwMethod(b:netrw_curdir)
4760
if b:netrw_method == 4
4761
" obtain file using scp
4762
" call Decho("obtain via scp (method#4)")
4763
if exists("g:netrw_port") && g:netrw_port != ""
4764
let useport= " ".g:netrw_scpport." ".g:netrw_port
4768
if b:netrw_fname =~ '/'
4769
let path= substitute(b:netrw_fname,'^\(.*/\).\{-}$','\1','')
4773
let filelist= join(map(copy(fnamelist),'shellescape(g:netrw_machine.":".escape(path.v:val,g:netrw_fname_escape))'))
4774
" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".filelist." ".shellescape(tgtdir))
4775
exe s:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".filelist." ".shellescape(tgtdir)
4777
elseif b:netrw_method == 2
4778
" obtain file using ftp + .netrc
4779
" call Decho("obtain via ftp+.netrc (method #2)")
4780
call s:SaveBufVars()|silent keepjumps new|call s:RestoreBufVars()
4781
let tmpbufnr= bufnr("%")
4783
if exists("g:netrw_ftpmode") && g:netrw_ftpmode != ""
4784
exe "put ='".g:netrw_ftpmode."'"
4785
" call Decho("filter input: ".getline('$'))
4788
if exists("b:netrw_fname") && b:netrw_fname != ""
4789
call setline(line("$")+1,'cd "'.b:netrw_fname.'"')
4790
" call Decho("filter input: ".getline('$'))
4793
if exists("g:netrw_ftpextracmd")
4794
exe "put ='".g:netrw_ftpextracmd."'"
4795
" call Decho("filter input: ".getline('$'))
4797
for fname in fnamelist
4798
call setline(line("$")+1,'get "'.fname.'"')
4799
" call Decho("filter input: ".getline('$'))
4801
if exists("g:netrw_port") && g:netrw_port != ""
4802
" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port)
4803
exe s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port
4805
" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine)
4806
exe s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".g:netrw_machine
4808
" If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
4809
if getline(1) !~ "^$" && !exists("g:netrw_quiet") && getline(1) !~ '^Trying '
4810
let debugkeep= &debug
4812
call netrw#ErrorMsg(s:ERROR,getline(1),4)
4813
let &debug= debugkeep
4816
elseif b:netrw_method == 3
4817
" obtain with ftp + machine, id, passwd, and fname (ie. no .netrc)
4818
" call Decho("obtain via ftp+mipf (method #3)")
4819
call s:SaveBufVars()|silent keepjumps new|call s:RestoreBufVars()
4820
let tmpbufnr= bufnr("%")
4823
if exists("g:netrw_port") && g:netrw_port != ""
4824
put ='open '.g:netrw_machine.' '.g:netrw_port
4825
" call Decho("filter input: ".getline('$'))
4827
put ='open '.g:netrw_machine
4828
" call Decho("filter input: ".getline('$'))
4831
if exists("g:netrw_ftp") && g:netrw_ftp == 1
4833
" call Decho("filter input: ".getline('$'))
4834
put ='\"'.s:netrw_passwd.'\"'
4835
" call Decho("filter input: ".getline('$'))
4837
put ='user \"'.g:netrw_uid.'\" \"'.s:netrw_passwd.'\"'
4838
" call Decho("filter input: ".getline('$'))
4841
if exists("g:netrw_ftpmode") && g:netrw_ftpmode != ""
4842
put =g:netrw_ftpmode
4843
" call Decho("filter input: ".getline('$'))
4846
if exists("b:netrw_fname") && b:netrw_fname != ""
4847
call setline(line("$")+1,'cd "'.b:netrw_fname.'"')
4848
" call Decho("filter input: ".getline('$'))
4851
if exists("g:netrw_ftpextracmd")
4852
exe "put ='".g:netrw_ftpextracmd."'"
4853
" call Decho("filter input: ".getline('$'))
4856
if exists("g:netrw_ftpextracmd")
4857
exe "put ='".g:netrw_ftpextracmd."'"
4858
" call Decho("filter input: ".getline('$'))
4860
for fname in fnamelist
4861
call setline(line("$")+1,'get "'.fname.'"')
4863
" call Decho("filter input: ".getline('$'))
4866
" -i : turns off interactive prompting from ftp
4867
" -n unix : DON'T use <.netrc>, even though it exists
4868
" -n win32: quit being obnoxious about password
4870
" call Decho("executing: %!".g:netrw_ftp_cmd." -i -n")
4871
exe s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i -n"
4872
" If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
4873
if getline(1) !~ "^$"
4874
" call Decho("error<".getline(1).">")
4875
if !exists("g:netrw_quiet")
4876
call netrw#ErrorMsg(s:ERROR,getline(1),5)
4884
if exists("tmpbufnr")
4885
if bufnr("%") != tmpbufnr
4892
" call Dret("netrw#NetrwObtain")
4895
" ---------------------------------------------------------------------
4896
" s:NetrwPrevWinOpen: open file/directory in previous window. {{{2
4897
" If there's only one window, then the window will first be split.
4899
" choice = 0 : didn't have to choose
4900
" choice = 1 : saved modified file in window first
4901
" choice = 2 : didn't save modified file, opened window
4902
" choice = 3 : cancel open
4903
fun! s:NetrwPrevWinOpen(islocal)
4904
" call Dfunc("NetrwPrevWinOpen(islocal=".a:islocal.")")
4906
" grab a copy of the b:netrw_curdir to pass it along to newly split windows
4907
let curdir = b:netrw_curdir
4909
" get last window number and the word currently under the cursor
4910
let lastwinnr = winnr("$")
4911
let curword = s:NetrwGetWord()
4913
" call Decho("lastwinnr=".lastwinnr." curword<".curword.">")
4917
" if only one window, open a new one first
4918
" call Decho("only one window, so open a new one (g:netrw_alto=".g:netrw_alto.")")
4920
" call Decho("exe ".(g:netrw_alto? "top " : "bot ")."vert ".g:netrw_winsize."wincmd s")
4921
exe (g:netrw_alto? "top " : "bot ")."vert ".g:netrw_winsize."wincmd s"
4923
" call Decho("exe ".(g:netrw_alto? "bel " : "abo ").g:netrw_winsize."wincmd s")
4924
exe (g:netrw_alto? "bel " : "abo ").g:netrw_winsize."wincmd s"
4929
call s:SaveBufVars()
4930
" call Decho("wincmd p")
4932
call s:RestoreBufVars()
4933
" if the previous window's buffer has been changed (is modified),
4934
" and it doesn't appear in any other extant window, then ask the
4935
" user if s/he wants to abandon modifications therein.
4936
let bnr = winbufnr(0)
4939
" call Decho("detected: prev window's buffer has been modified: bnr=".bnr." winnr#".winnr())
4942
windo if winbufnr(0) == bnr | let bnrcnt=bnrcnt+1 | endif
4945
" call Decho("bnr=".bnr." bnrcnt=".bnrcnt." buftype=".&bt." winnr#".winnr())
4947
let bufname= bufname(winbufnr(winnr()))
4948
let choice= confirm("Save modified file<".bufname.">?","&Yes\n&No\n&Cancel")
4949
" call Decho("bufname<".bufname."> choice=".choice." winnr#".winnr())
4952
" Yes -- write file & then browse
4956
call netrw#ErrorMsg(s:ERROR,"unable to write <".bufname.">!",30)
4962
" call Dret("NetrwPrevWinOpen ".choice." : unable to write <".bufname.">")
4967
" No -- don't worry about changed file, just browse anyway
4969
call netrw#ErrorMsg(s:WARNING,bufname." changes to ".bufname." abandoned",31)
4973
" Cancel -- don't do this
3450
" call Decho("exe ".g:netrw_silentxfer.endline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine)
3451
exe g:netrw_silentxfer.endline.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine
3454
".........................................
3455
elseif w:netrw_method == 3
3456
" ftp + machine,id,passwd,filename: Method #3
4979
" call Dret("NetrwPrevWinOpen ".choice." : cancelled")
4986
" restore b:netrw_curdir (window split/enew may have lost it)
4987
let b:netrw_curdir= curdir
4990
call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(a:islocal,curword))
4992
call s:NetrwBrowse(a:islocal,s:NetrwBrowseChgDir(a:islocal,curword))
4995
" call Dret("NetrwPrevWinOpen ".choice)
4999
" ---------------------------------------------------------------------
5000
" s:NetrwUpload: load fname to tgt (used by NetrwMarkFileCopy()) {{{2
5001
" Always assumed to be local -> remote
5002
" call s:NetrwUpload(filename, target)
5003
" call s:NetrwUpload(filename, target, fromdirectory)
5004
fun! s:NetrwUpload(fname,tgt,...)
5005
" call Dfunc("s:NetrwUpload(fname<".((type(a:fname) == 1)? a:fname : string(a:fname))."> tgt<".a:tgt.">) a:0=".a:0)
5007
if a:tgt =~ '^\a\+://'
5008
let tgtdir= substitute(a:tgt,'^\a\+://[^/]\+/\(.\{-}\)$','\1','')
5010
let tgtdir= substitute(a:tgt,'^\(.*\)/[^/]*$','\1','')
5012
" call Decho("tgtdir<".tgtdir.">")
5017
let fromdir= getcwd()
5019
" call Decho("fromdir<".fromdir.">")
5021
if type(a:fname) == 1
5022
" handle uploading a single file using NetWrite
5023
" call Decho("handle uploading a single file via NetWrite")
5025
let efname= escape(a:fname,g:netrw_fname_escape)
5026
" call Decho("exe e ".efname)
5028
" call Decho("now locally editing<".expand("%").">, has ".line("$")." lines")
5030
let wfname= substitute(a:fname,'^.*/','','')
5031
let wfname= escape(a:tgt.wfname,g:netrw_fname_escape)
5032
" call Decho("exe w! ".wfname)
5035
let wfname= escape(a:tgt,g:netrw_fname_escape)
5036
" call Decho("writing local->remote: exe w ".wfname)
5038
" call Decho("done writing local->remote")
5042
elseif type(a:fname) == 3
5043
" handle uploading a list of files via scp
5044
" call Decho("handle uploading a list of files via scp")
5045
let curdir= getcwd()
5047
exe "keepjumps silent lcd ".fnameescape(fromdir)
5048
let filelist= copy(s:netrwmarkfilelist_{bufnr('%')})
5049
let args = join(map(filelist,"shellescape(v:val)"))
5050
if exists("g:netrw_port") && g:netrw_port != ""
5051
let useport= " ".g:netrw_scpport." ".g:netrw_port
5055
let machine = substitute(a:tgt,'^scp://\([^/:]\+\).*$','\1','')
5056
let tgt = substitute(a:tgt,'^scp://[^/]\+/\(.*\)$','\1','')
5057
" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".args." ".shellescape(machine.":".escape(tgt,g:netrw_fname_escape)))
5058
exe s:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".args." ".shellescape(machine.":".escape(tgt,g:netrw_fname_escape))
5059
exe "keepjumps silent lcd ".fnameescape(curdir)
5061
elseif a:tgt =~ '^ftp:'
5062
call s:NetrwMethod(a:tgt)
5064
if b:netrw_method == 2
5065
" handle uploading a list of files via ftp+.netrc
5066
let netrw_fname = b:netrw_fname
5067
silent keepjumps new
5068
" call Decho("filter input window#".winnr())
5070
exe "put ='".g:netrw_ftpmode."'"
5071
" call Decho("filter input: ".getline('$'))
5073
if exists("g:netrw_ftpextracmd")
5074
exe "put ='".g:netrw_ftpextracmd."'"
5075
" call Decho("filter input: ".getline('$'))
5078
call setline(line("$")+1,'lcd "'.fromdir.'"')
5079
" call Decho("filter input: ".getline('$'))
5081
call setline(line("$")+1,'cd "'.tgtdir.'"')
5082
" call Decho("filter input: ".getline('$'))
5084
for fname in a:fname
5085
call setline(line("$")+1,'put "'.fname.'"')
5086
" call Decho("filter input: ".getline('$'))
5089
if exists("g:netrw_port") && g:netrw_port != ""
5090
" call Decho("executing: ".s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port)
5091
exe s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port
5093
" call Decho("filter input window#".winnr())
5094
" call Decho("executing: ".s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".g:netrw_machine)
5095
exe s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".g:netrw_machine
5097
" If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
5098
silent g/Local directory now/d
5099
if getline(1) !~ "^$" && !exists("g:netrw_quiet") && getline(1) !~ '^Trying '
5100
call netrw#ErrorMsg(s:ERROR,getline(1),14)
5105
elseif b:netrw_method == 3
5106
" upload with ftp + machine, id, passwd, and fname (ie. no .netrc)
5107
let netrw_fname= b:netrw_fname
5108
call s:SaveBufVars()|silent keepjumps new|call s:RestoreBufVars()
5109
let tmpbufnr= bufnr("%")
3457
5110
setlocal ff=unix
3458
5112
if exists("g:netrw_port") && g:netrw_port != ""
3459
5113
put ='open '.g:netrw_machine.' '.g:netrw_port
3460
" call Decho('ftp: open '.g:netrw_machine.' '.g:netrw_port)
5114
" call Decho("filter input: ".getline('$'))
3462
5116
put ='open '.g:netrw_machine
3463
" call Decho('ftp: open '.g:netrw_machine)
5117
" call Decho("filter input: ".getline('$'))
3466
5120
if exists("g:netrw_ftp") && g:netrw_ftp == 1
3467
5121
put =g:netrw_uid
3468
put ='\"'.s:netrw_passwd.'\"'
3469
" call Decho('ftp: g:netrw_uid')
3470
" call Decho('ftp: s:netrw_passwd')
5122
" call Decho("filter input: ".getline('$'))
5123
call setline(line("$")+1,'"'.s:netrw_passwd.'"')
5124
" call Decho("filter input: ".getline('$'))
3472
5126
put ='user \"'.g:netrw_uid.'\" \"'.s:netrw_passwd.'\"'
3473
" call Decho('user '.g:netrw_uid.' '.s:netrw_passwd)
3478
" call Decho('cd '.a:path)
3484
" call Decho("ftp: get ".a:fname)
3486
" call Decho("ftp: quit")
5127
" call Decho("filter input: ".getline('$'))
5130
call setline(line("$")+1,'lcd "'.fromdir.'"')
5131
" call Decho("filter input: ".getline('$'))
5133
if exists("b:netrw_fname") && b:netrw_fname != ""
5134
call setline(line("$")+1,'cd "'.b:netrw_fname.'"')
5135
" call Decho("filter input: ".getline('$'))
5138
if exists("g:netrw_ftpextracmd")
5139
exe "put ='".g:netrw_ftpextracmd."'"
5140
" call Decho("filter input: ".getline('$'))
5143
for fname in a:fname
5144
call setline(line("$")+1,'put "'.fname.'"')
5145
" call Decho("filter input: ".getline('$'))
3489
5149
" -i : turns off interactive prompting from ftp
3490
5150
" -n unix : DON'T use <.netrc>, even though it exists
3491
5151
" -n win32: quit being obnoxious about password
3492
" call Decho("exe ".g:netrw_silentxfer.curline.",$!".g:netrw_ftp_cmd." -i -n")
3493
exe g:netrw_silentxfer.endline.",$!".g:netrw_ftp_cmd." -i -n"
3495
".........................................
5153
" call Decho("executing: ".s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i -n")
5154
exe s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i -n"
5155
" If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
5156
silent g/Local directory now/d
5157
if getline(1) !~ "^$" && !exists("g:netrw_quiet") && getline(1) !~ '^Trying '
5158
let debugkeep= &debug
5160
call netrw#ErrorMsg(s:ERROR,getline(1),15)
5161
let &debug = debugkeep
3497
call netrw#ErrorMsg(s:WARNING,"unable to comply with your request<" . choice . ">",28)
3500
exe "silent! ".endline.",$d"
3501
exe "keepjumps ".curline
3502
setlocal noma nomod ro
3504
" call Decho("ftp not executable")
3505
if !exists("g:netrw_quiet")
3506
call netrw#ErrorMsg(s:ERROR,"this system doesn't support ftp",29)
3508
" restore status line
3509
let &stl = s:netrw_users_stl
3510
let &laststatus = s:netrw_users_ls
3511
" restore NetrwMethod
3512
if exists("keep_netrw_method")
3513
call s:NetrwMethod(keep_netrw_choice)
3514
let w:netrw_method = keep_netrw_wmethod
3516
" call Dret("NetrwObtain")
3520
".........................................
3523
" call Decho("using scp")
3524
let curdir = b:netrw_curdir
3525
let path = substitute(curdir,'scp://[^/]\+/','','e')
3526
" call Decho("path<".path.">")
3527
if exists("g:netrw_port") && g:netrw_port != ""
3528
let useport= " ".g:netrw_scpport." ".g:netrw_port
3532
" call Decho("pwd<".getcwd().">")
3533
" call Decho("executing: !".g:netrw_scp_cmd.useport." ".g:netrw_machine.":".path.escape(a:fname,' ?&')." ".tgtdir)
3534
exe g:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".g:netrw_machine.":".path.escape(a:fname,' ?&')." ".tgtdir
3537
" restore status line
3538
let &stl = s:netrw_users_stl
3539
let &laststatus = s:netrw_users_ls
3542
" restore NetrwMethod
3543
if exists("keep_netrw_method")
3544
call s:NetrwMethod(keep_netrw_choice)
3545
let w:netrw_method = keep_netrw_wmethod
5168
call netrw#ErrorMsg(s:ERROR,"can't obtain files with protocol from<".a:tgt.">",63)
3549
" call Dret("netrw#NetrwObtain")
3552
" ---------------------------------------------------------------------
3553
" s:NetrwUpload: load fname to tgt (used by NetrwMarkFileCopy()) {{{2
3554
" fname may itself be a remote or local file
3555
" tgt is assumed to be remote, so NetWrite will be used
3556
" (indirectly an autocmd)
3557
fun! s:NetrwUpload(fname,tgt)
3558
" call Dfunc("s:NetrwUpload(fname<".a:fname."> tgt<".a:tgt.">)")
3561
" call Decho("exe e ".a:fname)
3562
exe "e ".escape(a:fname,g:netrw_fname_escape)
3564
" call Decho("exe w ".a:tgt.a:fname)
3565
exe "w ".escape(a:tgt.a:fname,g:netrw_fname_escape)
3567
" call Decho("exe w ".a:tgt)
3568
exe "w ".escape(a:tgt,g:netrw_fname_escape)
3572
5172
" call Dret("s:NetrwUpload")
3695
5414
call netrw#ErrorMsg(s:ERROR,"(NetrwSplit) unsupported mode=".a:mode,45)
3698
" call Dret("NetrwSplit")
3701
" ---------------------------------------------------------------------
3702
" s:NetrwBrowseX: allows users to write custom functions to operate on {{{2
3703
" files given their extension. Passes 0=local, 1=remote
3704
fun! netrw#NetrwBrowseX(fname,remote)
3705
" call Dfunc("NetrwBrowseX(fname<".a:fname."> remote=".a:remote.")")
3707
" set up the filename
3708
" (lower case the extension, make a local copy of a remote file)
3709
let exten= substitute(a:fname,'.*\.\(.\{-}\)','\1','e')
3710
if has("win32") || has("win95") || has("win64") || has("win16")
3711
let exten= substitute(exten,'^.*$','\L&\E','')
3713
let fname= escape(a:fname,"%#")
3714
" call Decho("fname<".fname."> after escape()")
3716
" seems kde systems often have gnome-open due to dependencies, even though
3717
" gnome-open's subsidiary display tools are largely absent. Kde systems
3718
" usually have "kdeinit" running, though... (tnx Mikolaj Machowski)
3719
if !exists("s:haskdeinit")
3721
let s:haskdeinit= s:System("system",'ps -e') =~ 'kdeinit'
3723
let s:haskdeinit = 0
3728
" call Decho("setting s:haskdeinit=".s:haskdeinit)
3732
" create a local copy
3733
let fname= fnamemodify(tempname(),":t:r").".".exten
3734
" call Decho("a:remote=".a:remote.": create a local copy of <".a:fname."> as <".fname.">")
3735
exe "silent keepjumps bot 1new ".a:fname
3737
" call Decho("exe w! ".fname)
3741
" call Decho("exten<".exten."> "."netrwFileHandlers#NFH_".exten."():exists=".exists("*netrwFileHandlers#NFH_".exten))
3743
" set up redirection
3745
if (has("win32") || has("win95") || has("win64") || has("win16"))
3746
let redir= substitute(&srr,"%s","nul","")
3748
let redir= substitute(&srr,"%s","/dev/null","")
3750
elseif (has("win32") || has("win95") || has("win64") || has("win16"))
3751
let redir= &srr . "nul"
3753
let redir= &srr . "/dev/null"
3755
" call Decho("redir{".redir."} srr{".&srr."}")
3757
" extract any viewing options. Assumes that they're set apart by quotes.
3758
if exists("g:netrw_browsex_viewer")
3759
if g:netrw_browsex_viewer =~ '\s'
3760
let viewer = substitute(g:netrw_browsex_viewer,'\s.*$','','')
3761
let viewopt = substitute(g:netrw_browsex_viewer,'^\S\+\s*','','')." "
3764
while !executable(viewer) && viewer != oviewer
3765
let viewer = substitute(g:netrw_browsex_viewer,'^\(\(^\S\+\s\+\)\{'.cnt.'}\S\+\)\(.*\)$','\1','')
3766
let viewopt = substitute(g:netrw_browsex_viewer,'^\(\(^\S\+\s\+\)\{'.cnt.'}\S\+\)\(.*\)$','\3','')." "
3768
let oviewer = viewer
3769
" call Decho("!exe: viewer<".viewer."> viewopt<".viewopt.">")
3772
let viewer = g:netrw_browsex_viewer
3775
" call Decho("viewer<".viewer."> viewopt<".viewopt.">")
3778
" execute the file handler
3779
if exists("g:netrw_browsex_viewer") && g:netrw_browsex_viewer == '-'
3780
" call Decho("g:netrw_browsex_viewer<".g:netrw_browsex_viewer.">")
3781
let ret= netrwFileHandlers#Invoke(exten,fname)
3783
elseif exists("g:netrw_browsex_viewer") && executable(viewer)
3784
" call Decho("g:netrw_browsex_viewer<".g:netrw_browsex_viewer.">")
3785
" call Decho("exe silent !".viewer." ".viewopt.g:netrw_shq.escape(fname,'%#').g:netrw_shq.redir)
3786
exe "silent !".viewer." ".viewopt.g:netrw_shq.escape(fname,'%#').g:netrw_shq.redir
3787
let ret= v:shell_error
3789
elseif has("win32") || has("win64")
3790
" call Decho('exe silent !start rundll32 url.dll,FileProtocolHandler '.g:netrw_shq.escape(fname, '%#').g:netrw_shq)
3791
exe 'silent !start rundll32 url.dll,FileProtocolHandler '.g:netrw_shq.escape(fname, '%#').g:netrw_shq
3792
call inputsave()|call input("Press <cr> to continue")|call inputrestore()
3793
let ret= v:shell_error
3795
elseif has("unix") && executable("gnome-open") && !s:haskdeinit
3796
" call Decho("exe silent !gnome-open ".g:netrw_shq.escape(fname,'%#').g:netrw_shq." ".redir)
3797
exe "silent !gnome-open ".g:netrw_shq.escape(fname,'%#').g:netrw_shq.redir
3798
let ret= v:shell_error
3800
elseif has("unix") && executable("kfmclient") && s:haskdeinit
3801
" call Decho("exe silent !kfmclient exec ".g:netrw_shq.escape(fname,'%#').g:netrw_shq." ".redir)
3802
exe "silent !kfmclient exec ".g:netrw_shq.escape(fname,'%#').g:netrw_shq." ".redir
3803
let ret= v:shell_error
3805
elseif has("macunix") && executable("open")
3806
" call Decho("exe silent !open '".escape(fname,'%#')."' ".redir)
3807
exe silent !open '".escape(fname,'%#')."' ".redir
3808
let ret= v:shell_error
3811
" netrwFileHandlers#Invoke() always returns 0
3812
let ret= netrwFileHandlers#Invoke(exten,fname)
3815
" if unsuccessful, attempt netrwFileHandlers#Invoke()
3817
let ret= netrwFileHandlers#Invoke(exten,fname)
3822
" cleanup: remove temporary file,
3823
" delete current buffer if success with handler,
3824
" return to prior buffer (directory listing)
3825
if a:remote == 1 && fname != a:fname
3826
" call Decho("deleting temporary file<".fname.">")
3827
call s:System("delete",fname)
3831
setlocal bh=delete bt=nofile
3832
if g:netrw_use_noswf
3839
" call Dret("NetrwBrowseX")
5417
" call Dret("s:NetrwSplit")
5420
" ---------------------------------------------------------------------
5421
" NetrwStatusLine: {{{2
5422
fun! NetrwStatusLine()
5424
" vvv NetrwStatusLine() debugging vvv
5426
" if !exists("w:netrw_explore_bufnr")
5427
" let g:stlmsg="!X<explore_bufnr>"
5428
" elseif w:netrw_explore_bufnr != bufnr("%")
5429
" let g:stlmsg="explore_bufnr!=".bufnr("%")
5431
" if !exists("w:netrw_explore_line")
5432
" let g:stlmsg=" !X<explore_line>"
5433
" elseif w:netrw_explore_line != line(".")
5434
" let g:stlmsg=" explore_line!={line(.)<".line(".").">"
5436
" if !exists("w:netrw_explore_list")
5437
" let g:stlmsg=" !X<explore_list>"
5439
" ^^^ NetrwStatusLine() debugging ^^^
5441
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")
5442
" restore user's status line
5443
let &stl = s:netrw_users_stl
5444
let &laststatus = s:netrw_users_ls
5445
if exists("w:netrw_explore_bufnr")|unlet w:netrw_explore_bufnr|endif
5446
if exists("w:netrw_explore_line") |unlet w:netrw_explore_line |endif
5449
return "Match ".w:netrw_explore_mtchcnt." of ".w:netrw_explore_listlen
5453
" ---------------------------------------------------------------------
5454
" s:NetrwTreeDir: determine tree directory given current cursor position {{{2
5455
" (full path directory with trailing slash returned)
5456
fun! s:NetrwTreeDir()
5457
" call Dfunc("NetrwTreeDir() curline#".line(".")."<".getline('.')."> b:netrw_curdir<".b:netrw_curdir."> tab#".tabpagenr()." win#".winnr()." buf#".bufnr("%")."<".bufname("%").">")
5459
let treedir= b:netrw_curdir
5460
" call Decho("set initial treedir<".treedir.">")
5461
let s:treecurpos= netrw#NetrwSavePosn()
5463
if w:netrw_liststyle == s:TREELIST
5464
" call Decho("w:netrrw_liststyle is TREELIST:")
5465
" call Decho("line#".line(".")." getline(.)<".getline('.')."> treecurpos<".string(s:treecurpos).">")
5466
if getline('.') =~ '/$'
5467
let treedir= substitute(getline('.'),'^\%(| \)*\([^|].\{-}\)$','\1','e')
5472
" call Decho("treedir<".treedir.">")
5474
" detect user attempting to close treeroot
5475
if getline('.') !~ '|' && getline('.') != '..'
5476
" call Decho("user attempted to close treeroot")
5477
" now force a refresh
5478
" call Decho("clear buffer<".expand("%")."> with :%d")
5480
" call Dret("NetrwTreeDir <".treedir."> : (side effect) s:treecurpos<".string(s:treecurpos).">")
5481
return b:netrw_curdir
5484
" elide all non-depth information
5485
let depth = substitute(getline('.'),'^\(\%(| \)*\)[^|].\{-}$','\1','e')
5486
" call Decho("depth<".depth."> 1st subst")
5489
let depth = substitute(depth,'^| ','','')
5490
" call Decho("depth<".depth."> 2nd subst")
5492
" construct treedir by searching backwards at correct depth
5493
" call Decho("constructing treedir<".treedir."> depth<".depth.">")
5494
while depth != "" && search('^'.depth.'[^|].\{-}/$','bW')
5495
let dirname= substitute(getline('.'),'^\(| \)*','','e')
5496
let treedir= dirname.treedir
5497
let depth = substitute(depth,'^| ','','')
5498
" call Decho("constructing treedir<".treedir.">: dirname<".dirname."> while depth<".depth.">")
5500
if w:netrw_treetop =~ '/$'
5501
let treedir= w:netrw_treetop.treedir
5503
let treedir= w:netrw_treetop.'/'.treedir
5505
" call Decho("bufnr(.)=".bufnr("%")." line($)=".line("$")." line(.)=".line("."))
5507
let treedir= substitute(treedir,'//$','/','')
5509
" " now force a refresh
5510
"" call DECHO("clear buffer<".expand("%")."> with :%d")
5514
" call Dret("NetrwTreeDir <".treedir."> : (side effect) s:treecurpos<".string(s:treecurpos).">")
5518
" ---------------------------------------------------------------------
5519
" s:NetrwTreeDisplay: recursive tree display {{{2
5520
fun! s:NetrwTreeDisplay(dir,depth)
5521
" call Dfunc("NetrwTreeDisplay(dir<".a:dir."> depth<".a:depth.">)")
5523
" insure that there are no folds
5526
" install ../ and shortdir
5528
call setline(line("$")+1,'../')
5529
" call Decho("setline#".line("$")." ../ (depth is zero)")
5531
if a:dir =~ '^\a\+://'
5532
if a:dir == w:netrw_treetop
5535
let shortdir= substitute(a:dir,'^.*/\([^/]\+\)/$','\1/','e')
5537
call setline(line("$")+1,a:depth.shortdir)
5539
let shortdir= substitute(a:dir,'^.*/','','e')
5540
call setline(line("$")+1,a:depth.shortdir.'/')
5542
" call Decho("setline#".line("$")." shortdir<".a:depth.shortdir.">")
5544
" append a / to dir if its missing one
5550
" display subtrees (if any)
5551
let depth= "| ".a:depth
5553
" call Decho("display subtrees with depth<".depth."> and current leaves")
5554
for entry in w:netrw_treedict[a:dir]
5555
let direntry= substitute(dir.entry,'/$','','e')
5556
" call Decho("dir<".dir."> entry<".entry."> direntry<".direntry.">")
5557
if entry =~ '/$' && has_key(w:netrw_treedict,direntry)
5558
" call Decho("<".direntry."> is a key in treedict - display subtree for it")
5559
call s:NetrwTreeDisplay(direntry,depth)
5560
elseif entry =~ '/$' && has_key(w:netrw_treedict,direntry.'/')
5561
" call Decho("<".direntry."/> is a key in treedict - display subtree for it")
5562
call s:NetrwTreeDisplay(direntry.'/',depth)
5564
" call Decho("<".entry."> is not a key in treedict (no subtree)")
5565
call setline(line("$")+1,depth.entry)
5568
" call Dret("NetrwTreeDisplay")
5571
" ---------------------------------------------------------------------
5572
" s:NetrwTreeListing: displays tree listing from treetop on down, using NetrwTreeDisplay() {{{2
5573
fun! s:NetrwTreeListing(dirname)
5574
if w:netrw_liststyle == s:TREELIST
5575
" call Dfunc("NetrwTreeListing() bufname<".expand("%").">")
5576
" call Decho("curdir<".a:dirname.">")
5577
" 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"))
5579
" update the treetop
5580
" call Decho("update the treetop")
5581
if !exists("w:netrw_treetop")
5582
let w:netrw_treetop= a:dirname
5583
" call Decho("w:netrw_treetop<".w:netrw_treetop."> (reusing)")
5584
elseif (w:netrw_treetop =~ ('^'.a:dirname) && s:Strlen(a:dirname) < s:Strlen(w:netrw_treetop)) || a:dirname !~ ('^'.w:netrw_treetop)
5585
let w:netrw_treetop= a:dirname
5586
" call Decho("w:netrw_treetop<".w:netrw_treetop."> (went up)")
5589
" insure that we have at least an empty treedict
5590
if !exists("w:netrw_treedict")
5591
let w:netrw_treedict= {}
5594
" update the directory listing for the current directory
5595
" call Decho("updating dictionary with ".a:dirname.":[..directory listing..]")
5596
" call Decho("bannercnt=".w:netrw_bannercnt." line($)=".line("$"))
5597
exe "silent! keepjumps ".w:netrw_bannercnt.',$g@^\.\.\=/$@d'
5598
let w:netrw_treedict[a:dirname]= getline(w:netrw_bannercnt,line("$"))
5599
" call Decho("w:treedict[".a:dirname."]= ".w:netrw_treedict[a:dirname])
5600
exe "silent! keepjumps ".w:netrw_bannercnt.",$d"
5602
" if past banner, record word
5603
if exists("w:netrw_bannercnt") && line(".") > w:netrw_bannercnt
5604
let fname= expand("<cword>")
5608
" call Decho("fname<".fname.">")
5610
" display from treetop on down
5611
call s:NetrwTreeDisplay(w:netrw_treetop,"")
5613
" call Dret("NetrwTreeListing : bufname<".expand("%").">")
5617
" ---------------------------------------------------------------------
5618
" s:NetrwWideListing: {{{2
5619
fun! s:NetrwWideListing()
5621
if w:netrw_liststyle == s:WIDELIST
5622
" call Dfunc("NetrwWideListing() w:netrw_liststyle=".w:netrw_liststyle.' fo='.&fo.' l:fo='.&l:fo)
5623
" look for longest filename (cpf=characters per filename)
5624
" cpf: characters per file
5625
" fpl: files per line
5626
" fpc: files per column
5628
" call Decho("setlocal ma noro")
5630
if line("$") >= w:netrw_bannercnt
5631
exe 'silent keepjumps '.w:netrw_bannercnt.',$g/^./if virtcol("$") > b:netrw_cpf|let b:netrw_cpf= virtcol("$")|endif'
5633
" call Dret("NetrwWideListing")
5636
" call Decho("max file strlen+1=".b:netrw_cpf)
5637
let b:netrw_cpf= b:netrw_cpf + 1
5639
" determine qty files per line (fpl)
5640
let w:netrw_fpl= winwidth(0)/b:netrw_cpf
5644
" call Decho("fpl= ".winwidth(0)."/[b:netrw_cpf=".b:netrw_cpf.']='.w:netrw_fpl)
5647
exe 'silent keepjumps '.w:netrw_bannercnt.',$s/^.*$/\=escape(printf("%-'.b:netrw_cpf.'s",submatch(0)),"\\")/'
5648
let fpc = (line("$") - w:netrw_bannercnt + w:netrw_fpl)/w:netrw_fpl
5649
let newcolstart = w:netrw_bannercnt + fpc
5650
let newcolend = newcolstart + fpc - 1
5651
" call Decho("bannercnt=".w:netrw_bannercnt." fpl=".w:netrw_fpl." fpc=".fpc." newcol[".newcolstart.",".newcolend."]")
5652
silent! let keepregstar = @*
5653
while line("$") >= newcolstart
5654
if newcolend > line("$") | let newcolend= line("$") | endif
5655
let newcolqty= newcolend - newcolstart
5658
exe "silent keepjumps norm! 0\<c-v>$hx".w:netrw_bannercnt."G$p"
5660
exe "silent keepjumps norm! 0\<c-v>".newcolqty.'j$hx'.w:netrw_bannercnt.'G$p'
5662
exe "silent keepjumps ".newcolstart.','.newcolend.'d'
5663
exe 'silent keepjumps '.w:netrw_bannercnt
5665
silent! let @*= keepregstar
5666
exe "silent keepjumps ".w:netrw_bannercnt.',$s/\s\+$//e'
5667
setlocal noma nomod ro
5668
" call Dret("NetrwWideListing")
5673
" ---------------------------------------------------------------------
5674
" s:PerformListing: {{{2
5675
fun! s:PerformListing(islocal)
5676
" call Dfunc("s:PerformListing(islocal=".a:islocal.") buf(%)=".bufnr("%")."<".bufname("%").">")
5678
call s:NetrwSafeOptions()
5680
" call Decho("setlocal noro ma")
5682
" if exists("g:netrw_silent") && g:netrw_silent == 0 && &ch >= 1 " Decho
5683
" call Decho("(netrw) Processing your browsing request...")
5686
" call Decho('w:netrw_liststyle='.(exists("w:netrw_liststyle")? w:netrw_liststyle : 'n/a'))
5687
if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("w:netrw_treedict")
5688
" force a refresh for tree listings
5689
" call Decho("force refresh for treelisting: clear buffer<".expand("%")."> with :%d")
5693
" save current directory on directory history list
5694
call s:NetrwBookmarkDir(3,b:netrw_curdir)
5696
" Set up the banner {{{3
5697
" call Decho("set up banner")
5698
keepjumps put ='\" ============================================================================'
5699
keepjumps put ='\" Netrw Directory Listing (netrw '.g:loaded_netrw.')'
5700
keepjumps put ='\" '.b:netrw_curdir
5702
let w:netrw_bannercnt= 3
5703
exe "keepjumps ".w:netrw_bannercnt
5705
let sortby= g:netrw_sort_by
5706
if g:netrw_sort_direction =~ "^r"
5707
let sortby= sortby." reversed"
5711
" call Decho("handle specified sorting: g:netrw_sort_by<".g:netrw_sort_by.">")
5712
if g:netrw_sort_by =~ "^n"
5713
" call Decho("directories will be sorted by name")
5715
keepjumps put ='\" Sorted by '.sortby
5716
keepjumps put ='\" Sort sequence: '.g:netrw_sort_sequence
5717
let w:netrw_bannercnt= w:netrw_bannercnt + 2
5719
" call Decho("directories will be sorted by size or time")
5720
" sorted by size or date
5721
keepjumps put ='\" Sorted by '.sortby
5722
let w:netrw_bannercnt= w:netrw_bannercnt + 1
5724
exe "keepjumps ".w:netrw_bannercnt
5726
" show copy/move target, if any
5727
if exists("s:netrwmftgt") && exists("s:netrwmftgt_islocal")
5728
" call Decho("show copy/move target<".s:netrwmftgt.">")
5730
if s:netrwmftgt_islocal
5731
call setline(line("."),'" Copy/Move Tgt: '.s:netrwmftgt.' (local)')
5733
call setline(line("."),'" Copy/Move Tgt: '.s:netrwmftgt.' (remote)')
5735
let w:netrw_bannercnt= w:netrw_bannercnt + 1
5737
" call Decho("s:netrwmftgt does not exist, don't make Copy/Move Tgt")
5739
exe "keepjumps ".w:netrw_bannercnt
5741
" Hiding... -or- Showing... {{{3
5742
" call Decho("handle hiding/showing (g:netrw_hide=".g:netrw_list_hide." g:netrw_list_hide<".g:netrw_list_hide.">)")
5743
if g:netrw_list_hide != "" && g:netrw_hide
5744
if g:netrw_hide == 1
5745
keepjumps put ='\" Hiding: '.g:netrw_list_hide
5747
keepjumps put ='\" Showing: '.g:netrw_list_hide
5749
let w:netrw_bannercnt= w:netrw_bannercnt + 1
5751
exe "keepjumps ".w:netrw_bannercnt
5752
keepjumps put ='\" Quick Help: <F1>:help -:go up dir D:delete R:rename s:sort-by x:exec'
5753
keepjumps put ='\" ============================================================================'
5754
let w:netrw_bannercnt= w:netrw_bannercnt + 2
5756
" bannercnt should index the line just after the banner
5757
let w:netrw_bannercnt= w:netrw_bannercnt + 1
5758
exe "keepjumps ".w:netrw_bannercnt
5759
" call Decho("bannercnt=".w:netrw_bannercnt." (should index line just after banner) line($)=".line("$"))
5761
" set up syntax highlighting {{{3
5762
" call Decho("set up syntax highlighting")
5765
if !exists("g:syntax_on") || !g:syntax_on
5771
" call Decho("Get list of files - islocal=".a:islocal)
5773
call s:LocalListing()
5775
call s:NetrwRemoteListing()
5777
" call Decho("w:netrw_bannercnt=".w:netrw_bannercnt." (banner complete)")
5779
" manipulate the directory listing (hide, sort) {{{3
5780
if line("$") >= w:netrw_bannercnt
5781
" call Decho("manipulate directory listing (hide)")
5782
" call Decho("g:netrw_hide=".g:netrw_hide." g:netrw_list_hide<".g:netrw_list_hide.">")
5783
if g:netrw_hide && g:netrw_list_hide != ""
5784
call s:NetrwListHide()
5786
if line("$") >= w:netrw_bannercnt
5787
" call Decho("manipulate directory listing (sort) : g:netrw_sort_by<".g:netrw_sort_by.">")
5789
if g:netrw_sort_by =~ "^n"
5791
call s:NetrwSetSort()
5793
if w:netrw_bannercnt < line("$")
5794
" call Decho("g:netrw_sort_direction=".g:netrw_sort_direction." (bannercnt=".w:netrw_bannercnt.")")
5795
if g:netrw_sort_direction =~ 'n'
5796
" normal direction sorting
5797
exe 'silent keepjumps '.w:netrw_bannercnt.',$sort'
5799
" reverse direction sorting
5800
exe 'silent keepjumps '.w:netrw_bannercnt.',$sort!'
5803
" remove priority pattern prefix
5804
" call Decho("remove priority pattern prefix")
5805
let sepchr= "\<Char-0xff>"
5806
exe 'silent keepjumps '.w:netrw_bannercnt.',$s/^\d\{3}'.sepchr.'//e'
5809
if w:netrw_bannercnt < line("$")
5810
" call Decho("g:netrw_sort_direction=".g:netrw_sort_direction)
5811
if g:netrw_sort_direction =~ 'n'
5812
" call Decho('exe silent keepjumps '.w:netrw_bannercnt.',$sort')
5813
exe 'silent keepjumps '.w:netrw_bannercnt.',$sort'
5815
" call Decho('exe silent keepjumps '.w:netrw_bannercnt.',$sort!')
5816
exe 'silent keepjumps '.w:netrw_bannercnt.',$sort!'
5819
exe 'silent keepjumps '.w:netrw_bannercnt.',$s/^\d\{-}\///e'
5822
elseif g:netrw_sort_direction =~ 'r'
5823
" call Decho('reverse the sorted listing')
5824
exe 'silent keepjumps '.w:netrw_bannercnt.'g/^/m '.w:netrw_bannercnt
5828
" convert to wide/tree listing {{{3
5829
" call Decho("modify display if wide/tree listing style")
5830
call s:NetrwWideListing()
5831
call s:NetrwTreeListing(b:netrw_curdir)
5833
if exists("w:netrw_bannercnt") && line("$") > w:netrw_bannercnt
5834
" place cursor on the top-left corner of the file listing
5835
" call Decho("place cursor on top-left corner of file listing")
5836
exe 'silent keepjumps '.w:netrw_bannercnt
5840
" record previous current directory
5841
let w:netrw_prvdir= b:netrw_curdir
5842
" call Decho("record netrw_prvdir<".w:netrw_prvdir.">")
5844
" save certain window-oriented variables into buffer-oriented variables {{{3
5845
call s:SetBufWinVars()
5846
call s:NetrwOptionRestore("w:")
5848
" set display to netrw display settings
5849
" call Decho("set display to netrw display settings (noma nomod etc)")
5850
setlocal noma nomod nonu nobl nowrap ro
5851
if exists("s:treecurpos")
5853
call netrw#NetrwRestorePosn(s:treecurpos)
5857
" call Dret("s:PerformListing : curpos<".string(getpos(".")).">")
5860
" ---------------------------------------------------------------------
5861
" s:SetupNetrwStatusLine: {{{2
5862
fun! s:SetupNetrwStatusLine(statline)
5863
" call Dfunc("SetupNetrwStatusLine(statline<".a:statline.">)")
5865
if !exists("s:netrw_setup_statline")
5866
let s:netrw_setup_statline= 1
5867
" call Decho("do first-time status line setup")
5869
if !exists("s:netrw_users_stl")
5870
let s:netrw_users_stl= &stl
5872
if !exists("s:netrw_users_ls")
5873
let s:netrw_users_ls= &laststatus
5876
" set up User9 highlighting as needed
5881
catch /^Vim\%((\a\+)\)\=:E411/
5883
hi User9 ctermfg=yellow ctermbg=blue guifg=yellow guibg=blue
5885
hi User9 ctermbg=yellow ctermfg=blue guibg=yellow guifg=blue
5892
" set up status line (may use User9 highlighting)
5893
" insure that windows have a statusline
5894
" make sure statusline is displayed
5896
setlocal laststatus=2
5897
" call Decho("stl=".&stl)
5900
" call Dret("SetupNetrwStatusLine : stl=".&stl)
3842
5903
" ---------------------------------------------------------------------
4343
6413
" ---------------------------------------------------------------------
4344
" s:NetrwListStyle: {{{2
4345
" islocal=0: remote browsing
4346
" =1: local browsing
4347
fun! s:NetrwListStyle(islocal)
4348
" call Dfunc("NetrwListStyle(islocal=".a:islocal.") w:netrw_liststyle=".w:netrw_liststyle)
4349
let fname = s:NetrwGetWord()
4350
if !exists("w:netrw_liststyle")|let w:netrw_liststyle= g:netrw_liststyle|endif
4351
let w:netrw_liststyle = (w:netrw_liststyle + 1) % s:MAXLIST
4352
" call Decho("fname<".fname.">")
4353
" call Decho("chgd w:netrw_liststyle to ".w:netrw_liststyle)
4354
" call Decho("b:netrw_curdir<".(exists("b:netrw_curdir")? b:netrw_curdir : "doesn't exist").">")
4356
if w:netrw_liststyle == s:THINLIST
4357
" use one column listing
4358
" call Decho("use one column list")
4359
let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge')
4361
elseif w:netrw_liststyle == s:LONGLIST
4363
" call Decho("use long list")
4364
let g:netrw_list_cmd = g:netrw_list_cmd." -l"
4366
elseif w:netrw_liststyle == s:WIDELIST
4368
" call Decho("use wide list")
4369
let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge')
4371
elseif w:netrw_liststyle == s:TREELIST
4372
" call Decho("use tree list")
4373
let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge')
4376
call netrw#ErrorMsg(s:WARNING,"bad value for g:netrw_liststyle (=".w:netrw_liststyle.")",46)
4377
let g:netrw_liststyle = s:THINLIST
4378
let w:netrw_liststyle = g:netrw_liststyle
4379
let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge')
4383
" clear buffer - this will cause NetrwBrowse/LocalBrowseCheck to do a refresh
4384
" call Decho("clear buffer<".expand("%")."> with :%d")
4387
" refresh the listing
4388
let svpos= netrw#NetrwSavePosn()
4389
call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
4390
call netrw#NetrwRestorePosn(svpos)
4392
" keep cursor on the filename
4394
let result= search('\%(^\%(|\+\s\)\=\|\s\{2,}\)\zs'.escape(fname,'.\[]*$^').'\%(\s\{2,}\|$\)','bc')
4395
" call Decho("search result=".result." w:netrw_bannercnt=".(exists("w:netrw_bannercnt")? w:netrw_bannercnt : 'N/A'))
4396
if result <= 0 && exists("w:netrw_bannercnt")
4397
exe "keepjumps ".w:netrw_bannercnt
4400
" call Dret("NetrwListStyle".(exists("w:netrw_liststyle")? ' : w:netrw_liststyle='.w:netrw_liststyle : ""))
4403
" ---------------------------------------------------------------------
4404
" s:NetrwWideListing: {{{2
4405
fun! s:NetrwWideListing()
4407
if w:netrw_liststyle == s:WIDELIST
4408
" call Dfunc("NetrwWideListing() w:netrw_liststyle=".w:netrw_liststyle.' fo='.&fo.' l:fo='.&l:fo)
4409
" look for longest filename (cpf=characters per filename)
4410
" cpf: characters per file
4411
" fpl: files per line
4412
" fpc: files per column
4415
if line("$") >= w:netrw_bannercnt
4416
exe 'silent keepjumps '.w:netrw_bannercnt.',$g/^./if virtcol("$") > b:netrw_cpf|let b:netrw_cpf= virtcol("$")|endif'
4418
" call Dret("NetrwWideListing")
4421
" call Decho("max file strlen+1=".b:netrw_cpf)
4422
let b:netrw_cpf= b:netrw_cpf + 1
4424
" determine qty files per line (fpl)
4425
let w:netrw_fpl= winwidth(0)/b:netrw_cpf
4429
" call Decho("fpl= ".winwidth(0)."/[b:netrw_cpf=".b:netrw_cpf.']='.w:netrw_fpl)
4432
exe 'silent keepjumps '.w:netrw_bannercnt.',$s/^.*$/\=escape(printf("%-'.b:netrw_cpf.'s",submatch(0)),"\\")/'
4433
let fpc = (line("$") - w:netrw_bannercnt + w:netrw_fpl)/w:netrw_fpl
4434
let newcolstart = w:netrw_bannercnt + fpc
4435
let newcolend = newcolstart + fpc - 1
4436
" call Decho("bannercnt=".w:netrw_bannercnt." fpl=".w:netrw_fpl." fpc=".fpc." newcol[".newcolstart.",".newcolend."]")
4437
silent! let keepregstar = @*
4438
while line("$") >= newcolstart
4439
if newcolend > line("$") | let newcolend= line("$") | endif
4440
let newcolqty= newcolend - newcolstart
4443
exe "silent keepjumps norm! 0\<c-v>$hx".w:netrw_bannercnt."G$p"
4445
exe "silent keepjumps norm! 0\<c-v>".newcolqty.'j$hx'.w:netrw_bannercnt.'G$p'
4447
exe "silent keepjumps ".newcolstart.','.newcolend.'d'
4448
exe 'silent keepjumps '.w:netrw_bannercnt
4450
silent! let @*= keepregstar
4451
exe "silent keepjumps ".w:netrw_bannercnt.',$s/\s\+$//e'
4452
setlocal noma nomod ro
4453
" call Dret("NetrwWideListing")
4458
" ---------------------------------------------------------------------
4459
" s:NetrwTreeDir: determine tree directory given current cursor position {{{2
4460
" (full path directory with trailing slash returned)
4461
fun! s:NetrwTreeDir()
4462
" call Dfunc("NetrwTreeDir() curline#".line(".")."<".getline(".")."> b:netrw_curdir<".b:netrw_curdir."> tab#".tabpagenr()." win#".winnr()." buf#".bufnr("%")."<".bufname("%").">")
4464
let treedir= b:netrw_curdir
4465
" call Decho("set initial treedir<".treedir.">")
4466
let s:treecurpos= getpos(".")
4468
if w:netrw_liststyle == s:TREELIST
4469
" call Decho("w:netrrw_liststyle is TREELIST:")
4470
" call Decho("line#".line(".")." getline(.)<".getline('.')."> treecurpos<".string(s:treecurpos).">")
4471
if getline('.') =~ '/$'
4472
let treedir= substitute(getline('.'),'^\%(| \)*\([^|].\{-}\)$','\1','e')
4477
" call Decho("treedir<".treedir.">")
4479
" detect user attempting to close treeroot
4480
if getline('.') !~ '|' && getline('.') != '..'
4481
" call Decho("user attempted to close treeroot")
4482
" now force a refresh
4483
" call Decho("clear buffer<".expand("%")."> with :%d")
4485
" call Dret("NetrwTreeDir <".treedir."> : (side effect) s:treecurpos<".string(s:treecurpos).">")
4486
return b:netrw_curdir
4489
" elide all non-depth information
4490
let depth = substitute(getline('.'),'^\(\%(| \)*\)[^|].\{-}$','\1','e')
4491
" call Decho("depth<".depth."> 1st subst")
4494
let depth = substitute(depth,'^| ','','')
4495
" call Decho("depth<".depth."> 2nd subst")
4497
" construct treedir by searching backwards at correct depth
4498
" call Decho("constructing treedir<".treedir."> depth<".depth.">")
4499
while depth != "" && search('^'.depth.'[^|].\{-}/$','bW')
4500
let dirname= substitute(getline("."),'^\(| \)*','','e')
4501
let treedir= dirname.treedir
4502
let depth = substitute(depth,'^| ','','')
4503
" call Decho("constructing treedir<".treedir.">: dirname<".dirname."> while depth<".depth.">")
4505
if w:netrw_treetop =~ '/$'
4506
let treedir= w:netrw_treetop.treedir
4508
let treedir= w:netrw_treetop.'/'.treedir
4510
" call Decho("bufnr(.)=".bufnr(".")." line($)=".line("$")." line(.)=".line("."))
4512
let treedir= substitute(treedir,'//$','/','')
4514
" " now force a refresh
4515
" call Decho("clear buffer<".expand("%")."> with :%d")
4519
" call Dret("NetrwTreeDir <".treedir."> : (side effect) s:treecurpos<".string(s:treecurpos).">")
4523
" ---------------------------------------------------------------------
4524
" s:NetrwTreeDisplay: recursive tree display {{{2
4525
fun! s:NetrwTreeDisplay(dir,depth)
4526
" call Dfunc("NetrwTreeDisplay(dir<".a:dir."> depth<".a:depth.">)")
4528
" insure that there are no folds
4531
" install ../ and shortdir
4533
call setline(line("$")+1,'../')
4534
" call Decho("setline#".line("$")." ../ (depth is zero)")
4536
if a:dir =~ '^\a\+://'
4537
if a:dir == w:netrw_treetop
4540
let shortdir= substitute(a:dir,'^.*/\([^/]\+\)/$','\1/','e')
4542
call setline(line("$")+1,a:depth.shortdir)
4544
let shortdir= substitute(a:dir,'^.*/','','e')
4545
call setline(line("$")+1,a:depth.shortdir.'/')
4547
" call Decho("setline#".line("$")." shortdir<".a:depth.shortdir.">")
4549
" append a / to dir if its missing one
4555
" display subtrees (if any)
4556
let depth= "| ".a:depth
4557
" call Decho("display subtrees with depth<".depth."> and current leaves")
4558
for entry in w:netrw_treedict[a:dir]
4559
let direntry= substitute(dir.entry,'/$','','e')
4560
" call Decho("dir<".dir."> entry<".entry."> direntry<".direntry.">")
4561
if entry =~ '/$' && has_key(w:netrw_treedict,direntry)
4562
" call Decho("<".direntry."> is a key in treedict - display subtree for it")
4563
call s:NetrwTreeDisplay(direntry,depth)
4564
elseif entry =~ '/$' && has_key(w:netrw_treedict,direntry.'/')
4565
" call Decho("<".direntry."/> is a key in treedict - display subtree for it")
4566
call s:NetrwTreeDisplay(direntry.'/',depth)
4568
" call Decho("<".entry."> is not a key in treedict (no subtree)")
4569
call setline(line("$")+1,depth.entry)
4572
" call Dret("NetrwTreeDisplay")
4575
" ---------------------------------------------------------------------
4576
" s:NetrwTreeListing: displays tree listing from treetop on down, using NetrwTreeDisplay() {{{2
4577
fun! s:NetrwTreeListing(dirname)
4578
if w:netrw_liststyle == s:TREELIST
4579
" call Dfunc("NetrwTreeListing() bufname<".expand("%").">")
4580
" call Decho("curdir<".a:dirname.">")
4582
" update the treetop
4583
" call Decho("update the treetop")
4584
if !exists("w:netrw_treetop")
4585
let w:netrw_treetop= a:dirname
4586
" call Decho("w:netrw_treetop<".w:netrw_treetop."> (reusing)")
4587
elseif (w:netrw_treetop =~ ('^'.a:dirname) && s:Strlen(a:dirname) < s:Strlen(w:netrw_treetop)) || a:dirname !~ ('^'.w:netrw_treetop)
4588
let w:netrw_treetop= a:dirname
4589
" call Decho("w:netrw_treetop<".w:netrw_treetop."> (went up)")
4592
" insure that we have at least an empty treedict
4593
if !exists("w:netrw_treedict")
4594
let w:netrw_treedict= {}
4597
" update the directory listing for the current directory
4598
" call Decho("updating dictionary with ".a:dirname.":[..directory listing..]")
4599
" call Decho("bannercnt=".w:netrw_bannercnt." line($)=".line("$"))
4600
exe "silent! keepjumps ".w:netrw_bannercnt.',$g@^\.\.\=/$@d'
4601
let w:netrw_treedict[a:dirname]= getline(w:netrw_bannercnt,line("$"))
4602
" call Decho("treedict=".string(w:netrw_treedict))
4603
exe "silent! keepjumps ".w:netrw_bannercnt.",$d"
4605
" if past banner, record word
4606
if exists("w:netrw_bannercnt") && line(".") > w:netrw_bannercnt
4607
let fname= expand("<cword>")
4612
" display from treetop on down
4613
call s:NetrwTreeDisplay(w:netrw_treetop,"")
4616
if !exists("s:nbcd_curpos")
4618
" call Decho("(NetrwTreeListing) place cursor <".fname.">")
4619
call search('\<'.fname.'\>','cw')
4620
elseif exists("w:netrw_bannercnt")
4621
exe "keepjumps ".(w:netrw_bannercnt+1)
4622
" call Decho("(NetrwTreeListing) place cursor line#".(w:netrw_bannercnt+1))
4626
" call Dret("NetrwTreeListing : bufname<".expand("%").">")
4630
" ---------------------------------------------------------------------
4631
" s:NetrwSaveWordPosn: used by the "s" command in both remote and local {{{2
4632
" browsing. Along with NetrwRestoreWordPosn(), it keeps the cursor on
4633
" the same word even though the sorting has changed its order of appearance.
4634
fun! s:NetrwSaveWordPosn()
4635
" call Dfunc("NetrwSaveWordPosn()")
4636
let s:netrw_saveword= '^'.escape(getline("."),g:netrw_cd_escape).'$'
4637
" call Dret("NetrwSaveWordPosn : saveword<".s:netrw_saveword.">")
4640
" ---------------------------------------------------------------------
4641
" s:NetrwRestoreWordPosn: used by the "s" command; see NetrwSaveWordPosn() above {{{2
4642
fun! s:NetrwRestoreWordPosn()
4643
" call Dfunc("NetrwRestoreWordPosn()")
4644
silent! call search(s:netrw_saveword,'w')
4645
" call Dret("NetrwRestoreWordPosn")
4648
" ---------------------------------------------------------------------
4649
" s:NetrwMakeDir: this function makes a directory (both local and remote) {{{2
4650
fun! s:NetrwMakeDir(usrhost)
4651
" call Dfunc("NetrwMakeDir(usrhost<".a:usrhost.">)")
4653
" get name of new directory from user. A bare <CR> will skip.
4654
" if its currently a directory, also request will be skipped, but with
4657
let newdirname= input("Please give directory name: ")
4659
" call Decho("newdirname<".newdirname.">")
4662
" call Dret("NetrwMakeDir : user aborted with bare <cr>")
4670
let fullnewdir= b:netrw_curdir.'/'.newdirname
4671
" call Decho("fullnewdir<".fullnewdir.">")
4672
if isdirectory(fullnewdir)
4673
if !exists("g:netrw_quiet")
4674
call netrw#ErrorMsg(s:WARNING,"<".newdirname."> is already a directory!",24)
4676
" call Dret("NetrwMakeDir : directory<".newdirname."> exists previously")
4679
if s:FileReadable(fullnewdir)
4680
if !exists("g:netrw_quiet")
4681
call netrw#ErrorMsg(s:WARNING,"<".newdirname."> is already a file!",25)
4683
" call Dret("NetrwMakeDir : file<".newdirname."> exists previously")
4687
" requested new local directory is neither a pre-existing file or
4688
" directory, so make it!
4690
call mkdir(fullnewdir,"p")
4692
let netrw_origdir= s:NetrwGetcwd(1)
4693
exe 'keepjumps cd '.b:netrw_curdir
4694
" call Decho("netrw_origdir<".netrw_origdir.">: cd b:netrw_curdir<".b:netrw_curdir.">")
4695
" call Decho("exe silent! !".g:netrw_local_mkdir.' '.g:netrw_shq.newdirname.g:netrw_shq)
4696
exe "silent! !".g:netrw_local_mkdir.' '.g:netrw_shq.newdirname.g:netrw_shq
4698
exe 'keepjumps cd '.netrw_origdir
4699
" call Decho("netrw_keepdir=".g:netrw_keepdir.": cd ".netrw_origdir." getcwd<".getcwd().">")
4703
if v:shell_error == 0
4705
" call Decho("refresh listing")
4706
let svpos= netrw#NetrwSavePosn()
4707
call s:NetrwRefresh(1,s:NetrwBrowseChgDir(1,'./'))
4708
call netrw#NetrwRestorePosn(svpos)
4709
elseif !exists("g:netrw_quiet")
4710
call netrw#ErrorMsg(s:ERROR,"unable to make directory<".newdirname.">",26)
4716
let mkdircmd = s:MakeSshCmd(g:netrw_mkdir_cmd)
4717
let newdirname= substitute(b:netrw_curdir,'^\%(.\{-}/\)\{3}\(.*\)$','\1','').newdirname
4718
" call Decho("exe silent! !".mkdircmd." ".g:netrw_shq.newdirname.g:netrw_shq)
4719
exe "silent! !".mkdircmd." ".g:netrw_shq.newdirname.g:netrw_shq
4720
if v:shell_error == 0
4722
let svpos= netrw#NetrwSavePosn()
4723
call s:NetrwRefresh(0,s:NetrwBrowseChgDir(0,'./'))
4724
call netrw#NetrwRestorePosn(svpos)
4725
elseif !exists("g:netrw_quiet")
4726
call netrw#ErrorMsg(s:ERROR,"unable to make directory<".newdirname.">",27)
4731
" call Dret("NetrwMakeDir")
4734
" ---------------------------------------------------------------------
4735
" s:NetrwBookmarkDir: {{{2
4736
" 0: (user: <b>) bookmark current directory
4737
" 1: (user: <B>) change to the bookmarked directory
4738
" 2: (user: <q>) list bookmarks
4739
" 3: (browsing) record current directory history
4740
" 4: (user: <u>) go up (previous) bookmark
4741
" 5: (user: <U>) go down (next) bookmark
4742
fun! s:NetrwBookmarkDir(chg,curdir)
4743
" 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)
4746
" bookmark the current directory
4747
" call Decho("(user: <b>) bookmark the current directory")
4749
" handle bookmark# specified via the count
4750
let g:NETRW_BOOKMARKDIR_{v:count}= a:curdir
4751
if !exists("g:NETRW_BOOKMARKMAX")
4752
let g:NETRW_BOOKMARKMAX= v:count
4753
elseif v:count > g:NETRW_BOOKMARKMAX
4754
let g:NETRW_BOOKMARKMAX= v:count
4757
" handle no count specified
4758
let g:NETRW_BOOKMARKMAX = g:NETRW_BOOKMARKMAX + 1
4759
let g:NETRW_BOOKMARKDIR_{g:NETRW_BOOKMARKMAX} = a:curdir
4761
echo "bookmarked the current directory"
4764
" change to the bookmarked directory
4765
" call Decho("(user: <B>) change to the bookmarked directory")
4766
if exists("g:NETRW_BOOKMARKDIR_{v:count}")
4767
exe "e ".g:NETRW_BOOKMARKDIR_{v:count}
4769
echomsg "Sorry, bookmark#".v:count." doesn't exist!"
4775
" list user's bookmarks
4776
" call Decho("(user: <q>) list user's bookmarks")
4777
if exists("g:NETRW_BOOKMARKMAX")
4778
" call Decho("list bookmarks [0,".g:NETRW_BOOKMARKMAX."]")
4780
while cnt <= g:NETRW_BOOKMARKMAX
4781
if exists("g:NETRW_BOOKMARKDIR_{cnt}")
4782
" call Decho("Netrw Bookmark#".cnt.": ".g:NETRW_BOOKMARKDIR_{cnt})
4783
echo "Netrw Bookmark#".cnt.": ".g:NETRW_BOOKMARKDIR_{cnt}
4790
" list directory history
4791
let cnt = g:NETRW_DIRHIST_CNT
4794
while ( first || cnt != g:NETRW_DIRHIST_CNT )
4795
" call Decho("first=".first." cnt=".cnt." dirhist_cnt=".g:NETRW_DIRHIST_CNT)
4796
let histcnt= histcnt + 1
4797
if exists("g:NETRW_DIRHIST_{cnt}")
4798
" call Decho("Netrw History#".histcnt.": ".g:NETRW_DIRHIST_{cnt})
4799
echo "Netrw History#".histcnt.": ".g:NETRW_DIRHIST_{cnt}
4803
let cnt = ( cnt - 1 ) % g:netrw_dirhistmax
4805
let cnt= cnt + g:netrw_dirhistmax
4809
call inputsave()|call input("Press <cr> to continue")|call inputrestore()
4813
" saves most recently visited directories (when they differ)
4814
" call Decho("(browsing) record curdir history")
4815
if !exists("g:NETRW_DIRHIST_0") || g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT} != a:curdir
4816
let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT + 1 ) % g:netrw_dirhistmax
4817
" let g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}= substitute(a:curdir,'[/\\]$','','e')
4818
let g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}= a:curdir
4819
" call Decho("save dirhist#".g:NETRW_DIRHIST_CNT."<".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}.">")
4823
" u: change to the previous directory stored on the history list
4824
" call Decho("(user: <u>) chg to prev dir from history")
4825
let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT - 1 ) % g:netrw_dirhistmax
4826
if g:NETRW_DIRHIST_CNT < 0
4827
let g:NETRW_DIRHIST_CNT= g:NETRW_DIRHIST_CNT + g:netrw_dirhistmax
4829
if exists("g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}")
4830
" call Decho("changedir u#".g:NETRW_DIRHIST_CNT."<".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}.">")
4831
if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("b:netrw_curdir")
4836
" call Decho("exe e! ".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT})
4837
exe "e! ".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}
4839
let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT + 1 ) % g:netrw_dirhistmax
4840
echo "Sorry, no predecessor directory exists yet"
4844
" U: change to the subsequent directory stored on the history list
4845
" call Decho("(user: <U>) chg to next dir from history")
4846
let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT + 1 ) % g:netrw_dirhistmax
4847
if exists("g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}")
4848
" call Decho("changedir U#".g:NETRW_DIRHIST_CNT."<".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}.">")
4849
if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("b:netrw_curdir")
4854
" call Decho("exe e! ".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT})
4855
exe "e! ".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}
4857
let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT - 1 ) % g:netrw_dirhistmax
4858
if g:NETRW_DIRHIST_CNT < 0
4859
let g:NETRW_DIRHIST_CNT= g:NETRW_DIRHIST_CNT + g:netrw_dirhistmax
4861
echo "Sorry, no successor directory exists yet"
4864
call s:NetrwBookmarkMenu()
4865
" call Dret("NetrwBookmarkDir")
4868
" ---------------------------------------------------------------------
4869
" s:NetrwBookmarkMenu: Uses menu priorities {{{2
4870
" .2.[cnt] for bookmarks, and
4871
" .3.[cnt] for history
4872
" (see s:NetrwMenu())
4873
fun! s:NetrwBookmarkMenu()
4874
if !exists("s:netrw_menucnt")
4877
" call Dfunc("NetrwBookmarkMenu() bookmarkcnt=".g:NETRW_BOOKMARKMAX." histcnt=".g:NETRW_DIRHIST_CNT." menucnt=".s:netrw_menucnt)
4878
if has("menu") && has("gui_running") && &go =~ 'm'
4879
if exists("g:NetrwTopLvlMenu")
4880
exe 'silent! unmenu '.g:NetrwTopLvlMenu.'Bookmark'
4883
" show bookmarked places
4885
while cnt <= g:NETRW_BOOKMARKMAX
4886
if exists("g:NETRW_BOOKMARKDIR_{cnt}")
4887
let bmdir= escape(g:NETRW_BOOKMARKDIR_{cnt},'.')
4888
" call Decho('silent! menu '.g:NetrwMenuPriority.".2.".cnt." ".g:NetrwTopLvlMenu.'Bookmark.'.bmdir.' :e '.g:NETRW_BOOKMARKDIR_{cnt})
4889
exe 'silent! menu '.g:NetrwMenuPriority.".2.".cnt." ".g:NetrwTopLvlMenu.'Bookmarks.'.bmdir.' :e '.g:NETRW_BOOKMARKDIR_{cnt}."\<cr>"
4894
" show directory browsing history
4895
let cnt = g:NETRW_DIRHIST_CNT
4898
while ( first || cnt != g:NETRW_DIRHIST_CNT )
4899
let histcnt = histcnt + 1
4900
let priority = g:NETRW_DIRHIST_CNT + histcnt
4901
if exists("g:NETRW_DIRHIST_{cnt}")
4902
let bmdir= escape(g:NETRW_DIRHIST_{cnt},'.')
4903
" call Decho('silent! menu '.g:NetrwMenuPriority.".3.".priority." ".g:NetrwTopLvlMenu.'History.'.bmdir.' :e '.g:NETRW_DIRHIST_{cnt})
4904
exe 'silent! menu '.g:NetrwMenuPriority.".3.".priority." ".g:NetrwTopLvlMenu.'History.'.bmdir.' :e '.g:NETRW_DIRHIST_{cnt}."\<cr>"
4907
let cnt = ( cnt - 1 ) % g:netrw_dirhistmax
4909
let cnt= cnt + g:netrw_dirhistmax
4913
" call Dret("NetrwBookmarkMenu")
4916
" ---------------------------------------------------------------------
4917
" s:NetrwPrevWinOpen: open file/directory in previous window. {{{2
4918
" If there's only one window, then the window will first be split.
4920
" choice = 0 : didn't have to choose
4921
" choice = 1 : saved modified file in window first
4922
" choice = 2 : didn't save modified file, opened window
4923
" choice = 3 : cancel open
4924
fun! s:NetrwPrevWinOpen(islocal)
4925
" call Dfunc("NetrwPrevWinOpen(islocal=".a:islocal.")")
4927
" grab a copy of the b:netrw_curdir to pass it along to newly split windows
4928
let curdir = b:netrw_curdir
4930
" get last window number and the word currently under the cursor
4931
let lastwinnr = winnr("$")
4932
let curword = s:NetrwGetWord()
4934
" call Decho("lastwinnr=".lastwinnr." curword<".curword.">")
4938
" if only one window, open a new one first
4939
" call Decho("only one window, so open a new one (g:netrw_alto=".g:netrw_alto.")")
4941
" call Decho("exe ".(g:netrw_alto? "top " : "bot ")."vert ".g:netrw_winsize."wincmd s")
4942
exe (g:netrw_alto? "top " : "bot ")."vert ".g:netrw_winsize."wincmd s"
4944
" call Decho("exe ".(g:netrw_alto? "bel " : "abo ").g:netrw_winsize."wincmd s")
4945
exe (g:netrw_alto? "bel " : "abo ").g:netrw_winsize."wincmd s"
4950
call s:SaveBufVars()
4951
" call Decho("wincmd p")
4953
call s:RestoreBufVars()
4954
" if the previous window's buffer has been changed (is modified),
4955
" and it doesn't appear in any other extant window, then ask the
4956
" user if s/he wants to abandon modifications therein.
4957
let bnr = winbufnr(0)
4960
" call Decho("detected: prev window's buffer has been modified: bnr=".bnr." winnr#".winnr())
4963
windo if winbufnr(0) == bnr | let bnrcnt=bnrcnt+1 | endif
4966
" call Decho("bnr=".bnr." bnrcnt=".bnrcnt." buftype=".&bt." winnr#".winnr())
4968
let bufname= bufname(winbufnr(winnr()))
4969
let choice= confirm("Save modified file<".bufname.">?","&Yes\n&No\n&Cancel")
4970
" call Decho("bufname<".bufname."> choice=".choice." winnr#".winnr())
4973
" Yes -- write file & then browse
4977
call netrw#ErrorMsg(s:ERROR,"unable to write <".bufname.">!",30)
4983
" call Dret("NetrwPrevWinOpen ".choice." : unable to write <".bufname.">")
4988
" No -- don't worry about changed file, just browse anyway
4990
call netrw#ErrorMsg(s:WARNING,bufname." changes to ".bufname." abandoned",31)
4994
" Cancel -- don't do this
5000
" call Dret("NetrwPrevWinOpen ".choice." : cancelled")
5007
" restore b:netrw_curdir (window split/enew may have lost it)
5008
let b:netrw_curdir= curdir
5011
call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(a:islocal,curword))
5013
call s:NetrwBrowse(a:islocal,s:NetrwBrowseChgDir(a:islocal,curword))
5016
" call Dret("NetrwPrevWinOpen ".choice)
5020
" ---------------------------------------------------------------------
5021
" s:NetrwMenu: generates the menu for gvim and netrw {{{2
5022
fun! s:NetrwMenu(domenu)
5024
if !exists("g:NetrwMenuPriority")
5025
let g:NetrwMenuPriority= 80
5028
if has("menu") && has("gui_running") && &go =~ 'm' && g:netrw_menu
5029
" call Dfunc("NetrwMenu(domenu=".a:domenu.")")
5031
if !exists("s:netrw_menu_enabled") && a:domenu
5032
" call Decho("initialize menu")
5033
let s:netrw_menu_enabled= 1
5034
exe 'silent! menu '.g:NetrwMenuPriority.'.1 '.g:NetrwTopLvlMenu.'Help<tab><F1> <F1>'
5035
call s:NetrwBookmarkMenu() " provide some history! uses priorities 2,3, reserves 4
5036
exe 'silent! menu '.g:NetrwMenuPriority.'.5 '.g:NetrwTopLvlMenu.'-Sep1- :'
5037
exe 'silent! menu '.g:NetrwMenuPriority.'.6 '.g:NetrwTopLvlMenu.'Go\ Up\ Directory<tab>- -'
5038
exe 'silent! menu '.g:NetrwMenuPriority.'.7 '.g:NetrwTopLvlMenu.'Apply\ Special\ Viewer<tab>x x'
5039
exe 'silent! menu '.g:NetrwMenuPriority.'.8.1 '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Bookmark\ Current\ Directory<tab>mb mb'
5040
exe 'silent! menu '.g:NetrwMenuPriority.'.8.2 '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Goto\ Bookmark<tab>gb gb'
5041
exe 'silent! menu '.g:NetrwMenuPriority.'.8.3 '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.List<tab>q q'
5042
exe 'silent! menu '.g:NetrwMenuPriority.'.8.4 '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Goto\ Prev\ Dir<tab>u u'
5043
exe 'silent! menu '.g:NetrwMenuPriority.'.8.5 '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Goto\ Next\ Dir<tab>U U'
5044
exe 'silent! menu '.g:NetrwMenuPriority.'.9.1 '.g:NetrwTopLvlMenu.'Browsing\ Control.Edit\ File\ Hiding\ List<tab>'."<ctrl-h> \<Plug>NetrwHideEdit"
5045
exe 'silent! menu '.g:NetrwMenuPriority.'.9.2 '.g:NetrwTopLvlMenu.'Browsing\ Control.Edit\ Sorting\ Sequence<tab>S S'
5046
exe 'silent! menu '.g:NetrwMenuPriority.'.9.3 '.g:NetrwTopLvlMenu.'Browsing\ Control.Refresh\ Listing<tab>'."<ctrl-l> \<Plug>NetrwRefresh"
5047
exe 'silent! menu '.g:NetrwMenuPriority.'.9.4 '.g:NetrwTopLvlMenu.'Browsing\ Control.Settings/Options<tab>:NetrwSettings '.":NetrwSettings\<cr>"
5048
exe 'silent! menu '.g:NetrwMenuPriority.'.10 '.g:NetrwTopLvlMenu.'Delete\ File/Directory<tab>D D'
5049
exe 'silent! menu '.g:NetrwMenuPriority.'.11.1 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.In\ Current\ Window<tab><cr> '."\<cr>"
5050
exe 'silent! menu '.g:NetrwMenuPriority.'.11.2 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.Preview\ File/Directory<tab>p p'
5051
exe 'silent! menu '.g:NetrwMenuPriority.'.11.3 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.In\ Previous\ Window<tab>P P'
5052
exe 'silent! menu '.g:NetrwMenuPriority.'.11.4 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.In\ New\ Window<tab>o o'
5053
exe 'silent! menu '.g:NetrwMenuPriority.'.11.5 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.In\ New\ Vertical\ Window<tab>v v'
5054
exe 'silent! menu '.g:NetrwMenuPriority.'.12 '.g:NetrwTopLvlMenu.'Make\ Subdirectory<tab>d d'
5055
exe 'silent! menu '.g:NetrwMenuPriority.'.13.1 '.g:NetrwTopLvlMenu.'Marked\ Files.Mark\ File<tab>mf mf'
5056
exe 'silent! menu '.g:NetrwMenuPriority.'.13.2 '.g:NetrwTopLvlMenu.'Marked\ Files.Mark\ Files\ by\ Regexp<tab>mr mr'
5057
exe 'silent! menu '.g:NetrwMenuPriority.'.13.3 '.g:NetrwTopLvlMenu.'Marked\ Files.Hide-Show-List\ Control<tab>a a'
5058
exe 'silent! menu '.g:NetrwMenuPriority.'.13.4 '.g:NetrwTopLvlMenu.'Marked\ Files.Copy\ To\ Target<tab>mc mc'
5059
exe 'silent! menu '.g:NetrwMenuPriority.'.13.5 '.g:NetrwTopLvlMenu.'Marked\ Files.Delete<tab>D D'
5060
exe 'silent! menu '.g:NetrwMenuPriority.'.13.6 '.g:NetrwTopLvlMenu.'Marked\ Files.Diff<tab>md md'
5061
exe 'silent! menu '.g:NetrwMenuPriority.'.13.7 '.g:NetrwTopLvlMenu.'Marked\ Files.Edit<tab>me me'
5062
exe 'silent! menu '.g:NetrwMenuPriority.'.13.8 '.g:NetrwTopLvlMenu.'Marked\ Files.Exe\ Cmd<tab>mx mx'
5063
exe 'silent! menu '.g:NetrwMenuPriority.'.13.9 '.g:NetrwTopLvlMenu.'Marked\ Files.Move\ To\ Target<tab>mm mm'
5064
exe 'silent! menu '.g:NetrwMenuPriority.'.13.10 '.g:NetrwTopLvlMenu.'Marked\ Files.Obtain<tab>O O'
5065
exe 'silent! menu '.g:NetrwMenuPriority.'.13.11 '.g:NetrwTopLvlMenu.'Marked\ Files.Print<tab>mp mp'
5066
exe 'silent! menu '.g:NetrwMenuPriority.'.13.12 '.g:NetrwTopLvlMenu.'Marked\ Files.Replace<tab>R R'
5067
exe 'silent! menu '.g:NetrwMenuPriority.'.13.13 '.g:NetrwTopLvlMenu.'Marked\ Files.Set\ Target<tab>mt mt'
5068
exe 'silent! menu '.g:NetrwMenuPriority.'.13.14 '.g:NetrwTopLvlMenu.'Marked\ Files.Tag<tab>mT mT'
5069
exe 'silent! menu '.g:NetrwMenuPriority.'.13.15 '.g:NetrwTopLvlMenu.'Marked\ Files.Zip/Unzip/Compress/Uncompress<tab>mz mz'
5070
exe 'silent! menu '.g:NetrwMenuPriority.'.14 '.g:NetrwTopLvlMenu.'Obtain\ File<tab>O O'
5071
exe 'silent! menu '.g:NetrwMenuPriority.'.16.1 '.g:NetrwTopLvlMenu.'Style.Listing\ Style\ (thin-long-wide-tree)<tab>i i'
5072
exe 'silent! menu '.g:NetrwMenuPriority.'.16.2 '.g:NetrwTopLvlMenu.'Style.Normal-Hide-Show<tab>a a'
5073
exe 'silent! menu '.g:NetrwMenuPriority.'.16.3 '.g:NetrwTopLvlMenu.'Style.Reverse\ Sorting\ Order<tab>'."r r"
5074
exe 'silent! menu '.g:NetrwMenuPriority.'.16.4 '.g:NetrwTopLvlMenu.'Style.Sorting\ Method\ (name-time-size)<tab>s s'
5075
exe 'silent! menu '.g:NetrwMenuPriority.'.17 '.g:NetrwTopLvlMenu.'Rename\ File/Directory<tab>R R'
5076
exe 'silent! menu '.g:NetrwMenuPriority.'.18 '.g:NetrwTopLvlMenu.'Set\ Current\ Directory<tab>c c'
5077
let s:netrw_menucnt= 28
5081
let curwin = winnr()
5082
windo if getline(2) =~ "Netrw" | let s:netrwcnt= s:netrwcnt + 1 | endif
5083
exe curwin."wincmd w"
5086
" call Decho("clear menus")
5087
exe 'silent! unmenu '.g:NetrwTopLvlMenu
5088
" call Decho('exe silent! unmenu '.g:NetrwTopLvlMenu.'*')
5089
silent! unlet s:netrw_menu_enabled
5092
" call Dret("NetrwMenu")
5097
" ==========================================
5098
6414
" Local Directory Browsing Support: {{{1
5099
6415
" ==========================================
5550
6931
augroup! AuNetrwShellCmd
5553
" call Dret("LocalFastBrowser")
5556
" ---------------------------------------------------------------------
5557
" netrw#Explore: launch the local browser in the directory of the current file {{{2
5558
" dosplit==0: the window will be split iff the current file has
5560
" dosplit==1: the window will be split before running the local
5562
fun! netrw#Explore(indx,dosplit,style,...)
5563
" call Dfunc("netrw#Explore(indx=".a:indx." dosplit=".a:dosplit." style=".a:style.",a:1<".a:1.">) &modified=".&modified." a:0=".a:0)
5564
if !exists("b:netrw_curdir")
5565
let b:netrw_curdir= getcwd()
5566
" call Decho("set b:netrw_curdir<".b:netrw_curdir."> (used getcwd)")
5568
let curfile= b:netrw_curdir
5569
" call Decho("curfile<".curfile.">")
5572
silent! let keepregstar = @*
5573
silent! let keepregplus = @+
5574
silent! let keepregslash= @/
5576
" if dosplit or file has been modified
5577
if a:dosplit || &modified || a:style == 6
5578
" call Decho("case: dosplit=".a:dosplit." modified=".&modified." a:style=".a:style)
5579
call s:SaveWinVars()
5581
if a:style == 0 " Explore, Sexplore
5582
" call Decho("style=0: Explore or Sexplore")
5583
exe g:netrw_winsize."wincmd s"
5585
elseif a:style == 1 "Explore!, Sexplore!
5586
" call Decho("style=1: Explore! or Sexplore!")
5587
exe g:netrw_winsize."wincmd v"
5589
elseif a:style == 2 " Hexplore
5590
" call Decho("style=2: Hexplore")
5591
exe "bel ".g:netrw_winsize."wincmd s"
5593
elseif a:style == 3 " Hexplore!
5594
" call Decho("style=3: Hexplore!")
5595
exe "abo ".g:netrw_winsize."wincmd s"
5597
elseif a:style == 4 " Vexplore
5598
" call Decho("style=4: Vexplore")
5599
exe "lefta ".g:netrw_winsize."wincmd v"
5601
elseif a:style == 5 " Vexplore!
5602
" call Decho("style=5: Vexplore!")
5603
exe "rightb ".g:netrw_winsize."wincmd v"
5605
elseif a:style == 6 " Texplore
5606
call s:SaveBufVars()
5607
" call Decho("style = 6: Texplore")
5609
call s:RestoreBufVars()
5611
call s:RestoreWinVars()
5616
" call Decho("a:1<".a:1.">")
5617
if a:1 =~ '^\~' && (has("unix") || (exists("g:netrw_cygwin") && g:netrw_cygwin))
5618
let dirname= substitute(a:1,'\~',expand("$HOME"),'')
5619
" call Decho("using dirname<".dirname."> (case: ~ && unix||cygwin)")
5621
let dirname= exists("b:netrw_curdir")? b:netrw_curdir : getcwd()
5623
let dirname= dirname."/"
5625
" call Decho("using dirname<".dirname."> (case: ".(exists("b:netrw_curdir")? "b:netrw_curdir" : "getcwd()").")")
5627
let dirname= expand(a:1)
5630
" call Decho("using dirname<".dirname.">")
5634
if dirname =~ '/\*\*/'
5636
" call Decho("case Explore .../**/...")
5637
let prefixdir = substitute(dirname,'^\(.\{-}\)\*\*.*$','\1','')
5638
if prefixdir =~ '^/' || (prefixdir =~ '^\a:/' && (has("win32") || has("win95") || has("win64") || has("win16")))
5639
let b:netrw_curdir = prefixdir
5641
let b:netrw_curdir= getcwd().'/'.prefixdir
5643
let dirname = substitute(dirname,'^.\{-}\(\*\*/.*\)$','\1','')
5644
" call Decho("pwd<".getcwd()."> dirname<".dirname.">")
5647
if dirname =~ '^\*/'
5649
" call Decho("case Explore */pattern")
5650
let pattern= substitute(dirname,'^\*/\(.*\)$','\1','')
5651
" call Decho("Explore */pat: dirname<".dirname."> -> pattern<".pattern.">")
5652
if &hls | let keepregslash= s:ExplorePatHls(pattern) | endif
5653
elseif dirname =~ '^\*\*//'
5654
" Explore **//pattern
5655
" call Decho("case Explore **//pattern")
5656
let pattern = substitute(dirname,'^\*\*//','','')
5658
" call Decho("Explore **//pat: dirname<".dirname."> -> pattern<".pattern.">")
5661
if dirname == "" && a:indx >= 0
5662
" Explore Hexplore Vexplore Sexplore
5663
" call Decho("case Explore Hexplore Vexplore Sexplore")
5664
let newdir= substitute(expand("%:p"),'^\(.*[/\\]\)[^/\\]*$','\1','e')
5665
if newdir =~ '^scp:' || newdir =~ '^ftp:'
5666
" call Decho("calling NetrwBrowse(0,newdir<".newdir.">)")
5667
call s:NetrwBrowse(0,newdir)
5669
if newdir == ""|let newdir= getcwd()|endif
5670
" call Decho("calling LocalBrowseCheck(newdir<".newdir.">)")
5671
call netrw#LocalBrowseCheck(newdir)
5673
" call Decho("curfile<".curfile.">")
5674
if has("win32") || has("win95") || has("win64") || has("win16")
5675
call search('\<'.substitute(curfile,'^.*[/\\]','','e').'\>','cW')
5677
call search('\<'.substitute(curfile,'^.*/','','e').'\>','cW')
5680
elseif dirname =~ '^\*\*/' || a:indx < 0 || dirname =~ '^\*/'
5681
" Nexplore, Pexplore, Explore **/... , or Explore */pattern
5682
" call Decho("case Nexplore, Pexplore, <s-down>, <s-up>, Explore dirname<".dirname.">")
5683
if !mapcheck("<s-up>","n") && !mapcheck("<s-down>","n") && exists("b:netrw_curdir")
5684
" call Decho("set up <s-up> and <s-down> maps")
5685
let s:didstarstar= 1
5686
nnoremap <buffer> <silent> <s-up> :Pexplore<cr>
5687
nnoremap <buffer> <silent> <s-down> :Nexplore<cr>
5690
if has("path_extra")
5691
" call Decho("has path_extra")
5692
if !exists("w:netrw_explore_indx")
5693
let w:netrw_explore_indx= 0
5696
" call Decho("set indx= [a:indx=".indx."]")
5700
" call Decho("case Nexplore: (indx=".indx.")")
5701
if !exists("w:netrw_explore_list") " sanity check
5702
call netrw#ErrorMsg(s:WARNING,"using Nexplore or <s-down> improperly; see help for netrw-starstar",40)
5703
silent! let @* = keepregstar
5704
silent! let @+ = keepregstar
5705
silent! let @/ = keepregslash
5706
" call Dret("netrw#Explore")
5709
let indx= w:netrw_explore_indx
5710
if indx < 0 | let indx= 0 | endif
5711
if indx >= w:netrw_explore_listlen | let indx= w:netrw_explore_listlen - 1 | endif
5712
let curfile= w:netrw_explore_list[indx]
5713
" call Decho("indx=".indx." curfile<".curfile.">")
5714
while indx < w:netrw_explore_listlen && curfile == w:netrw_explore_list[indx]
5716
" call Decho("indx=".indx." (Nexplore while loop)")
5718
if indx >= w:netrw_explore_listlen | let indx= w:netrw_explore_listlen - 1 | endif
5719
" call Decho("Nexplore: indx= [w:netrw_explore_indx=".w:netrw_explore_indx."]=".indx)
5723
" call Decho("case Pexplore: (indx=".indx.")")
5724
if !exists("w:netrw_explore_list") " sanity check
5725
call netrw#ErrorMsg(s:WARNING,"using Pexplore or <s-up> improperly; see help for netrw-starstar",41)
5726
silent! let @* = keepregstar
5727
silent! let @+ = keepregstar
5728
silent! let @/ = keepregslash
5729
" call Dret("netrw#Explore")
5732
let indx= w:netrw_explore_indx
5733
if indx < 0 | let indx= 0 | endif
5734
if indx >= w:netrw_explore_listlen | let indx= w:netrw_explore_listlen - 1 | endif
5735
let curfile= w:netrw_explore_list[indx]
5736
" call Decho("indx=".indx." curfile<".curfile.">")
5737
while indx >= 0 && curfile == w:netrw_explore_list[indx]
5739
" call Decho("indx=".indx." (Pexplore while loop)")
5741
if indx < 0 | let indx= 0 | endif
5742
" call Decho("Pexplore: indx= [w:netrw_explore_indx=".w:netrw_explore_indx."]=".indx)
5745
" Explore -- initialize
5746
" build list of files to Explore with Nexplore/Pexplore
5747
" call Decho("case Explore: initialize (indx=".indx.")")
5748
let w:netrw_explore_indx= 0
5749
if !exists("b:netrw_curdir")
5750
let b:netrw_curdir= getcwd()
5752
" call Decho("b:netrw_curdir<".b:netrw_curdir.">")
5754
if exists("pattern")
5755
" call Decho("pattern exists: building list pattern<".pattern."> cwd<".getcwd().">")
5756
if exists("starstarpat")
5757
" call Decho("starstarpat<".starstarpat.">")
5759
exe "silent vimgrep /".pattern."/gj "."**/*"
5760
catch /^Vim\%((\a\+)\)\=:E480/
5761
call netrw#ErrorMsg(s:WARNING,'no files matched pattern<'.pattern.'>',45)
5762
if &hls | let keepregslash= s:ExplorePatHls(pattern) | endif
5763
silent! let @* = keepregstar
5764
silent! let @+ = keepregstar
5765
silent! let @/ = keepregslash
5766
" call Dret("netrw#Explore : no files matched pattern")
5769
let s:netrw_curdir = b:netrw_curdir
5770
let w:netrw_explore_list = getqflist()
5771
let w:netrw_explore_list = map(w:netrw_explore_list,'s:netrw_curdir."/".bufname(v:val.bufnr)')
5773
" call Decho("no starstarpat")
5774
exe "vimgrep /".pattern."/gj ".b:netrw_curdir."/*"
5775
let w:netrw_explore_list = map(getqflist(),'bufname(v:val.bufnr)')
5776
if &hls | let keepregslash= s:ExplorePatHls(pattern) | endif
5779
" call Decho("no pattern: building list based on ".b:netrw_curdir."/".dirname)
5780
let w:netrw_explore_list= split(expand(b:netrw_curdir."/".dirname),'\n')
5781
if &hls | let keepregslash= s:ExplorePatHls(dirname) | endif
5784
let w:netrw_explore_listlen = len(w:netrw_explore_list)
5785
" call Decho("w:netrw_explore_list<".string(w:netrw_explore_list)."> listlen=".w:netrw_explore_listlen)
5787
if w:netrw_explore_listlen == 0 || (w:netrw_explore_listlen == 1 && w:netrw_explore_list[0] =~ '\*\*\/')
5788
call netrw#ErrorMsg(s:WARNING,"no files matched",42)
5789
silent! let @* = keepregstar
5790
silent! let @+ = keepregstar
5791
silent! let @/ = keepregslash
5792
" call Dret("netrw#Explore : no files matched")
5797
" NetrwStatusLine support - for exploring support
5798
let w:netrw_explore_indx= indx
5799
" call Decho("explorelist<".join(w:netrw_explore_list,',')."> len=".w:netrw_explore_listlen)
5801
" wrap the indx around, but issue a note
5802
if indx >= w:netrw_explore_listlen || indx < 0
5803
" call Decho("wrap indx (indx=".indx." listlen=".w:netrw_explore_listlen.")")
5804
let indx = (indx < 0)? ( w:netrw_explore_listlen - 1 ) : 0
5805
let w:netrw_explore_indx= indx
5806
call netrw#ErrorMsg(s:NOTE,"no more files match Explore pattern",43)
5810
exe "let dirfile= w:netrw_explore_list[".indx."]"
5811
" call Decho("dirfile=w:netrw_explore_list[indx=".indx."]= <".dirfile.">")
5812
let newdir= substitute(dirfile,'/[^/]*$','','e')
5813
" call Decho("newdir<".newdir.">")
5815
" call Decho("calling LocalBrowseCheck(newdir<".newdir.">)")
5816
call netrw#LocalBrowseCheck(newdir)
5817
if !exists("w:netrw_liststyle")
5818
let w:netrw_liststyle= g:netrw_liststyle
5820
if w:netrw_liststyle == s:THINLIST || w:netrw_liststyle == s:LONGLIST
5821
call search('^'.substitute(dirfile,"^.*/","","").'\>',"W")
5823
call search('\<'.substitute(dirfile,"^.*/","","").'\>',"w")
5825
let w:netrw_explore_mtchcnt = indx + 1
5826
let w:netrw_explore_bufnr = bufnr("%")
5827
let w:netrw_explore_line = line(".")
5828
call s:SetupNetrwStatusLine('%f %h%m%r%=%9*%{NetrwStatusLine()}')
5829
" call Decho("explore: mtchcnt=".w:netrw_explore_mtchcnt." bufnr=".w:netrw_explore_bufnr." line#".w:netrw_explore_line)
5832
" call Decho("vim does not have path_extra")
5833
if !exists("g:netrw_quiet")
5834
call netrw#ErrorMsg(s:WARNING,"your vim needs the +path_extra feature for Exploring with **!",44)
5836
silent! let @* = keepregstar
5837
silent! let @+ = keepregstar
5838
silent! let @/ = keepregslash
5839
" call Dret("netrw#Explore : missing +path_extra")
5844
" call Decho("case Explore newdir<".dirname.">")
5845
if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && dirname =~ '/'
5846
silent! unlet w:netrw_treedict
5847
silent! unlet w:netrw_treetop
5850
if !exists("b:netrw_curdir")
5851
call netrw#LocalBrowseCheck(getcwd())
5853
call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,newdir))
5857
silent! let @* = keepregstar
5858
silent! let @+ = keepregstar
5859
silent! let @/ = keepregslash
5860
" call Dret("netrw#Explore : @/<".@/.">")
5863
" ---------------------------------------------------------------------
5864
" s:ExplorePatHls: converts an Explore pattern into a regular expression search pattern {{{2
5865
fun! s:ExplorePatHls(pattern)
5866
" call Dfunc("s:ExplorePatHls(pattern<".a:pattern.">)")
5867
let repat= substitute(a:pattern,'^**/\{1,2}','','')
5868
" call Decho("repat<".repat.">")
5869
let repat= escape(repat,'][.\')
5870
" call Decho("repat<".repat.">")
5871
let repat= '\<'.substitute(repat,'\*','\\(\\S\\+ \\)*\\S\\+','g').'\>'
5872
" call Dret("s:ExplorePatHls repat<".repat.">")
5876
" ---------------------------------------------------------------------
5877
" s:SetupNetrwStatusLine: {{{2
5878
fun! s:SetupNetrwStatusLine(statline)
5879
" call Dfunc("SetupNetrwStatusLine(statline<".a:statline.">)")
5881
if !exists("s:netrw_setup_statline")
5882
let s:netrw_setup_statline= 1
5883
" call Decho("do first-time status line setup")
5885
if !exists("s:netrw_users_stl")
5886
let s:netrw_users_stl= &stl
5888
if !exists("s:netrw_users_ls")
5889
let s:netrw_users_ls= &laststatus
5892
" set up User9 highlighting as needed
5897
catch /^Vim\%((\a\+)\)\=:E411/
5899
hi User9 ctermfg=yellow ctermbg=blue guifg=yellow guibg=blue
5901
hi User9 ctermbg=yellow ctermfg=blue guibg=yellow guifg=blue
5908
" set up status line (may use User9 highlighting)
5909
" insure that windows have a statusline
5910
" make sure statusline is displayed
5912
setlocal laststatus=2
5913
" call Decho("stl=".&stl)
5916
" call Dret("SetupNetrwStatusLine : stl=".&stl)
5919
" ---------------------------------------------------------------------
5920
" NetrwStatusLine: {{{2
5921
fun! NetrwStatusLine()
5923
" vvv NetrwStatusLine() debugging vvv
5925
" if !exists("w:netrw_explore_bufnr")
5926
" let g:stlmsg="!X<explore_bufnr>"
5927
" elseif w:netrw_explore_bufnr != bufnr("%")
5928
" let g:stlmsg="explore_bufnr!=".bufnr("%")
5930
" if !exists("w:netrw_explore_line")
5931
" let g:stlmsg=" !X<explore_line>"
5932
" elseif w:netrw_explore_line != line(".")
5933
" let g:stlmsg=" explore_line!={line(.)<".line(".").">"
5935
" if !exists("w:netrw_explore_list")
5936
" let g:stlmsg=" !X<explore_list>"
5938
" ^^^ NetrwStatusLine() debugging ^^^
5940
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")
5941
" restore user's status line
5942
let &stl = s:netrw_users_stl
5943
let &laststatus = s:netrw_users_ls
5944
if exists("w:netrw_explore_bufnr")|unlet w:netrw_explore_bufnr|endif
5945
if exists("w:netrw_explore_line")|unlet w:netrw_explore_line|endif
5948
return "Match ".w:netrw_explore_mtchcnt." of ".w:netrw_explore_listlen
5952
" ---------------------------------------------------------------------
5953
" s:NetrwGetcwd: get the current directory. {{{2
5954
" Change backslashes to forward slashes, if any.
5955
" If doesc is true, escape certain troublesome characters
5956
fun! s:NetrwGetcwd(doesc)
5957
" call Dfunc("NetrwGetcwd(doesc=".a:doesc.")")
5958
let curdir= substitute(getcwd(),'\\','/','ge')
5959
if curdir !~ '[\/]$'
5960
let curdir= curdir.'/'
5963
let curdir= escape(curdir,g:netrw_cd_escape)
5965
" call Dret("NetrwGetcwd <".curdir.">")
5969
" ---------------------------------------------------------------------
5970
" s:SetSort: sets up the sort based on the g:netrw_sort_sequence {{{2
5971
" What this function does is to compute a priority for the patterns
5972
" in the g:netrw_sort_sequence. It applies a substitute to any
5973
" "files" that satisfy each pattern, putting the priority / in
5974
" front. An "*" pattern handles the default priority.
5976
" call Dfunc("SetSort() bannercnt=".w:netrw_bannercnt)
5977
if w:netrw_liststyle == s:LONGLIST
5978
let seqlist = substitute(g:netrw_sort_sequence,'\$','\\%(\t\\|\$\\)','ge')
5980
let seqlist = g:netrw_sort_sequence
5982
" sanity check -- insure that * appears somewhere
5985
elseif seqlist !~ '\*'
5986
let seqlist= seqlist.',*'
5991
let seq = substitute(seqlist,',.*$','','e')
5992
let seqlist = substitute(seqlist,'^.\{-},\(.*\)$','\1','e')
5997
let eseq= escape(seq,'/')
5999
let spriority= "00".priority.'\/'
6000
elseif priority < 100
6001
let spriority= "0".priority.'\/'
6003
let spriority= priority.'\/'
6005
" call Decho("priority=".priority." spriority<".spriority."> seq<".seq."> seqlist<".seqlist.">")
6008
if w:netrw_bannercnt > line("$")
6009
" apparently no files were left after a Hiding pattern was used
6010
" call Dret("SetSort : no files left after hiding")
6014
exe 'silent keepjumps '.w:netrw_bannercnt.',$v/^\d\{3}\//s/^/'.spriority.'/'
6016
exe 'silent keepjumps '.w:netrw_bannercnt.',$g/'.eseq.'/s/^/'.spriority.'/'
6018
let priority = priority + 1
6021
" Following line associated with priority -- items that satisfy a priority
6022
" pattern get prefixed by ###/ which permits easy sorting by priority.
6023
" Sometimes files can satisfy multiple priority patterns -- only the latest
6024
" priority pattern needs to be retained. So, at this point, these excess
6025
" priority prefixes need to be removed, but not directories that happen to
6026
" be just digits themselves.
6027
exe 'silent keepjumps '.w:netrw_bannercnt.',$s/^\(\d\{3}\/\)\%(\d\{3}\/\)\+\ze./\1/e'
6029
" call Dret("SetSort")
6032
" =====================================================================
6934
" call Dret("LocalFastBrowser : browselist<".string(s:netrw_browselist).">")
6937
" ---------------------------------------------------------------------
6033
6938
" Support Functions: {{{1
6035
6940
" ---------------------------------------------------------------------
6941
" s:UpdateBuffersMenu: does emenu Buffers.Refresh (but due to locale, the menu item may not be called that) {{{2
6942
" The Buffers.Refresh menu calls s:BMShow(); unfortunately, that means that that function
6943
" can't be called except via emenu. But due to locale, that menu line may not be called
6944
" Buffers.Refresh; hence, s:NetrwBMShow() utilizes a "cheat" to call that function anyway.
6945
fun! s:UpdateBuffersMenu()
6946
" call Dfunc("s:UpdateBuffersMenu()")
6947
if has("gui") && has("menu") && has("gui_running") && &go =~ 'm'
6949
silent emenu Buffers.Refresh\ menu
6950
catch /^Vim\%((\a\+)\)\=:E/
6952
silent call s:NetrwBMShow()
6955
" call Dret("s:UpdateBuffersMenu")
6958
" ---------------------------------------------------------------------
6959
" s:NetrwBMShow: {{{2
6960
fun! s:NetrwBMShow()
6961
" call Dfunc("s:NetrwBMShow()")
6965
let bmshowlist = split(bmshowraw,'\n')
6967
let bmshowfuncs= filter(bmshowlist,'v:val =~ "<SNR>\\d\\+_BMShow()"')
6968
if bmshowfuncs != []
6969
let bmshowfunc = substitute(bmshowfuncs[0],'^.*:\(call.*BMShow()\).*$','\1','')
6970
if bmshowfunc =~ '^call.*BMShow()'
6971
exe "silent! ".bmshowfunc
6975
" call Dret("s:NetrwBMShow : bmshowfunc<".(exists("bmshowfunc")? bmshowfunc : 'n/a').">")
6978
" ---------------------------------------------------------------------
6036
6979
" s:ComposePath: Appends a new part to a path taking different systems into consideration {{{2
6037
6980
fun! s:ComposePath(base,subdir)
6038
6981
" call Dfunc("s:ComposePath(base<".a:base."> subdir<".a:subdir.">)")
6039
6983
if(has("amiga"))
6040
let ec = a:base[s:Strlen(a:base)-1]
6984
" call Decho("amiga")
6985
let ec = a:base[strlen(a:base)-1]
6041
6986
if ec != '/' && ec != ':'
6042
6987
let ret = a:base . "/" . a:subdir
6044
6989
let ret = a:base . a:subdir
6046
6992
elseif a:subdir =~ '^\a:[/\\][^/\\]' && (has("win32") || has("win95") || has("win64") || has("win16"))
6993
" call Decho("windows")
6047
6994
let ret= a:subdir
6048
6996
elseif a:base =~ '^\a\+://'
6997
" call Decho("remote linux/macos")
6049
6998
let urlbase = substitute(a:base,'^\(\a\+://.\{-}/\)\(.*\)$','\1','')
6050
6999
let curpath = substitute(a:base,'^\(\a\+://.\{-}/\)\(.*\)$','\2','')
6051
let ret = urlbase.curpath.a:subdir
7000
if a:subdir == '../'
7001
if curpath =~ '[^/]/[^/]\+/$'
7002
let curpath= substitute(curpath,'[^/]\+/$','','')
7006
let ret= urlbase.curpath
7008
let ret= urlbase.curpath.a:subdir
6052
7010
" call Decho("urlbase<".urlbase.">")
6053
7011
" call Decho("curpath<".curpath.">")
6054
7012
" call Decho("ret<".ret.">")
7015
" call Decho("local linux/macos")
6056
7016
let ret = substitute(a:base."/".a:subdir,"//","/","g")
6057
7017
if a:base =~ '^//'
6058
7018
" keeping initial '//' for the benefit of network share listing support
6059
7019
let ret= '/'.ret
7021
let ret= simplify(ret)
6062
7024
" call Dret("s:ComposePath ".ret)