~ubuntu-branches/ubuntu/maverick/vim/maverick

« back to all changes in this revision

Viewing changes to runtime/autoload/netrw.vim

  • Committer: Bazaar Package Importer
  • Author(s): Colin Watson
  • Date: 2008-06-26 13:42:18 UTC
  • mfrom: (1.1.5 upstream)
  • Revision ID: james.westby@ubuntu.com-20080626134218-703edeyb8k70qpbz
Tags: 1:7.1.314-3ubuntu1
* Resynchronise with Debian. Remaining changes:
  - Enable detection of GNU screen as a mouse-capable terminal.
  - Add NoDisplay=true to gvim.desktop.
  - Drop vim-lesstif package and lesstif2-dev build-dependency.
  - Build-depend on libxt-dev.
  - Enable Python interpreter on basic builds.
  - Create a .pot file for translations.
  - Disable autoindent, line-wrapping, and backup files by default.
* Fixes various vulnerabilities due to improper quoting of 'execute'
  arguments (LP: #240216).
* Drop fixes for upgrade problems from Ubuntu 6.06 LTS; direct upgrades
  from 6.06 to 8.10 will not be supported.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
" netrw.vim: Handles file transfer and remote directory listing across
2
2
"            AUTOLOAD SECTION
3
 
" Date:         Jan 15, 2008
4
 
" Version:      119
 
3
" Date:         Jun 12, 2008
 
4
" Version:      125
5
5
" Maintainer:   Charles E Campbell, Jr <NdrOchip@ScampbellPfamily.AbizM-NOSPAM>
6
6
" GetLatestVimScripts: 1075 1 :AutoInstall: netrw.vim
7
 
" Copyright:    Copyright (C) 1999-2007 Charles E. Campbell, Jr. {{{1
 
7
" Copyright:    Copyright (C) 1999-2008 Charles E. Campbell, Jr. {{{1
8
8
"               Permission is hereby granted to use and distribute this code,
9
9
"               with or without modifications, provided that this copyright
10
10
"               notice is copied with it. Like anything else that's free,
11
11
"               netrw.vim, netrwPlugin.vim, and netrwSettings.vim are provided
12
 
"               *as is* and comes with no warranty of any kind, either
 
12
"               *as is* and come with no warranty of any kind, either
13
13
"               expressed or implied. By using this plugin, you agree that
14
14
"               in no event will the copyright holder be liable for any damages
15
15
"               resulting from the use of this software.
16
 
"               of this software.
17
 
" note: worked with tmpfile s:GetTempname() in NetRead() NetWrite()
18
 
"redraw!|call inputsave()|call input("Press <cr> to continue")|call inputrestore()
 
16
"redraw!|call DechoSep()|call inputsave()|call input("Press <cr> to continue")|call inputrestore()
19
17
"
20
18
"  But be doers of the Word, and not only hearers, deluding your own selves {{{1
21
19
"  (James 1:22 RSV)
29
27
 let s:WARNING = 1
30
28
 let s:ERROR   = 2
31
29
endif
32
 
let g:loaded_netrw = "v119"
 
30
let g:loaded_netrw = "v125"
 
31
 
 
32
" sanity checks
33
33
if v:version < 700
34
34
 call netrw#ErrorMsg(s:WARNING,"you need vim version 7.0 or later for version ".g:loaded_netrw." of netrw",1)
35
35
 finish
36
36
endif
 
37
if !exists("*shellescape")
 
38
 call netrw#ErrorMsg(s:ERROR,"you need to upgade your vim so that it has shellescape()",64)
 
39
endif
 
40
if !exists("*fnameescape")
 
41
 call netrw#ErrorMsg(s:ERROR,"you need to upgade your vim so that it has fnameescape()",65)
 
42
endif
 
43
 
37
44
let s:keepcpo= &cpo
38
45
setlocal cpo&vim
39
46
"DechoTabOn
142
149
if !exists("g:netrw_compress")
143
150
 let g:netrw_compress= "gzip"
144
151
endif
145
 
" Default values - d-f ---------- {{{3
 
152
if !exists("g:netrw_ctags")
 
153
 let g:netrw_ctags= "ctags"
 
154
endif
 
155
" Default values - d-g ---------- {{{3
146
156
if !exists("g:NETRW_DIRHIST_CNT")
147
157
 let g:NETRW_DIRHIST_CNT= 0
148
158
endif
152
162
if !exists("g:netrw_dirhistmax")
153
163
 let g:netrw_dirhistmax= 10
154
164
endif
 
165
if !exists("g:netrw_fastbrowse")
 
166
 let g:netrw_fastbrowse= 1
 
167
endif
155
168
if !exists("g:netrw_ftp_browse_reject")
156
169
 let g:netrw_ftp_browse_reject='^total\s\+\d\+$\|^Trying\s\+\d\+.*$\|^KERBEROS_V\d rejected\|^Security extensions not\|No such file\|: connect to address [0-9a-fA-F:]*: No route to host$'
157
170
endif
245
258
 let g:netrw_list_cmd= g:netrw_list_cmd." -l"
246
259
endif
247
260
" Default values - m-r ---------- {{{3
 
261
if !exists("g:netrw_markfileesc")
 
262
 let g:netrw_markfileesc= '*./[\~'
 
263
endif
248
264
if !exists("g:netrw_maxfilenamelen")
249
265
 let g:netrw_maxfilenamelen= 32
250
266
endif
286
302
 let g:netrw_rmf_cmd    = g:netrw_ssh_cmd." USEPORT HOSTNAME rm -f"
287
303
endif
288
304
" Default values - s ---------- {{{3
 
305
 " set up shell quoting character
289
306
if exists("g:netrw_silent") && g:netrw_silent != 0
290
 
 let g:netrw_silentxfer= "silent "
 
307
 let s:netrw_silentxfer= "silent "
291
308
else
292
 
 let g:netrw_silentxfer= ""
293
 
endif
294
 
if !exists("g:netrw_fastbrowse")
295
 
 let g:netrw_fastbrowse= 1
296
 
endif
297
 
if !exists("g:netrw_shq")
298
 
 if exists("&shq") && &shq != ""
299
 
  let g:netrw_shq= &shq
300
 
 elseif exists("&sxq") && &sxq != ""
301
 
  let g:netrw_shq= &sxq
302
 
 elseif has("win32") || has("win95") || has("win64") || has("win16")
303
 
  if g:netrw_cygwin
304
 
   let g:netrw_shq= "'"
305
 
  else
306
 
   let g:netrw_shq= '"'
307
 
  endif
308
 
 else
309
 
  let g:netrw_shq= "'"
310
 
 endif
311
 
" call Decho("g:netrw_shq<".g:netrw_shq.">")
 
309
 let s:netrw_silentxfer= ""
312
310
endif
313
311
if !exists("g:netrw_sort_by")
314
312
 " alternatives: date size
319
317
 let g:netrw_sort_direction= "normal"
320
318
endif
321
319
if !exists("g:netrw_sort_sequence")
322
 
 let g:netrw_sort_sequence= '[\/]$,\.h$,\.c$,\.cpp$,\.[a-np-z]$,*,\.info$,\.swp$,\.o$\.obj$,\.bak$'
 
320
 let g:netrw_sort_sequence= '[\/]$,\.h$,\.c$,\.cpp$,*,\.o$,\.obj$,\.info$,\.swp$,\.bak$,\~$'
 
321
endif
 
322
if !exists("g:netrw_special_syntax")
 
323
 let g:netrw_special_syntax= 0
323
324
endif
324
325
if !exists("g:netrw_ssh_browse_reject")
325
326
  let g:netrw_ssh_browse_reject='^total\s\+\d\+$'
332
333
  let g:netrw_use_noswf= 0
333
334
endif
334
335
" Default values - t-w ---------- {{{3
335
 
if !exists("g:netrw_ctags")
336
 
 let g:netrw_ctags= "ctags"
337
 
endif
338
336
if !exists("g:netrw_timefmt")
339
337
 let g:netrw_timefmt= "%c"
340
338
endif
 
339
if !exists("g:netrw_xstrlen")
 
340
 let g:netrw_xstrlen= 1
 
341
endif
341
342
if !exists("g:NetrwTopLvlMenu")
342
343
 let g:NetrwTopLvlMenu= "Netrw."
343
344
endif
352
353
endif
353
354
" ---------------------------------------------------------------------
354
355
" Default values for netrw's script variables: {{{2
355
 
if !exists("g:netrw_cd_escape")
356
 
  let g:netrw_cd_escape="[]#*$%'\" ?`!&();<>\\"
357
 
endif
358
356
if !exists("g:netrw_fname_escape")
359
 
 let g:netrw_fname_escape= ' ?&;'
 
357
 let g:netrw_fname_escape= ' ?&;%'
 
358
endif
 
359
if !exists("g:netrw_glob_escape")
 
360
  let g:netrw_glob_escape= '[]*?`{~$'
360
361
endif
361
362
if !exists("g:netrw_tmpfile_escape")
362
 
 let g:netrw_tmpfile_escape= ' ?&;'
363
 
endif
364
 
if !exists("s:netrw_glob_escape")
365
 
  let s:netrw_glob_escape= '[]*?`{~$'
 
363
 let g:netrw_tmpfile_escape= ' &;'
366
364
endif
367
365
 
368
366
" BufEnter event ignored by decho when following variable is true
375
373
" ==============================
376
374
 
377
375
" ------------------------------------------------------------------------
378
 
" netrw#NetrwSavePosn: saves position of cursor on screen {{{2
379
 
fun! netrw#NetrwSavePosn()
380
 
"  call Dfunc("netrw#NetrwSavePosn()")
381
 
  " Save current line and column
382
 
  let w:netrw_winnr= winnr()
383
 
  let w:netrw_line = line(".")
384
 
  let w:netrw_col  = virtcol(".")
385
 
 
386
 
  " Save top-of-screen line
387
 
  norm! H0
388
 
  let w:netrw_hline= line(".")
389
 
 
390
 
  " set up string holding position parameters
391
 
  let ret          = "let w:netrw_winnr=".w:netrw_winnr."|let w:netrw_line=".w:netrw_line."|let w:netrw_col=".w:netrw_col."|let w:netrw_hline=".w:netrw_hline
392
 
 
393
 
  call netrw#NetrwRestorePosn()
394
 
"  call Dret("netrw#NetrwSavePosn : winnr=".w:netrw_winnr." line=".w:netrw_line." col=".w:netrw_col." hline=".w:netrw_hline)
395
 
  return ret
396
 
endfun
397
 
 
398
 
" ------------------------------------------------------------------------
399
 
" netrw#NetrwRestorePosn: restores the cursor and file position as saved by NetrwSavePosn() {{{2
400
 
fun! netrw#NetrwRestorePosn(...)
401
 
"  call Dfunc("netrw#NetrwRestorePosn() a:0=".a:0." winnr=".(exists("w:netrw_winnr")? w:netrw_winnr : -1)." line=".(exists("w:netrw_line")? w:netrw_line : -1)." col=".(exists("w:netrw_col")? w:netrw_col : -1)." hline=".(exists("w:netrw_hline")? w:netrw_hline : -1))
402
 
  let eikeep= &ei
403
 
  set ei=all
404
 
  if expand("%") == "NetrwMessage"
405
 
   exe s:winBeforeErr."wincmd w"
406
 
  endif
407
 
 
408
 
  if a:0 > 0
409
 
   exe a:1
410
 
  endif
411
 
 
412
 
  " restore window
413
 
  if exists("w:netrw_winnr")
414
 
"   call Decho("restore window: exe silent! ".w:netrw_winnr."wincmd w")
415
 
   exe "silent! ".w:netrw_winnr."wincmd w"
416
 
  endif
417
 
  if v:shell_error == 0
418
 
   " as suggested by Bram M: redraw on no error
419
 
   " allows protocol error messages to remain visible
420
 
   redraw!
421
 
  endif
422
 
 
423
 
  " restore top-of-screen line
424
 
  if exists("w:netrw_hline")
425
 
"   call Decho("restore topofscreen: exe norm! ".w:netrw_hline."G0z")
426
 
   exe "norm! ".w:netrw_hline."G0z\<CR>"
427
 
  endif
428
 
 
429
 
  " restore position
430
 
  if exists("w:netrw_line") && exists("w:netrw_col")
431
 
"   call Decho("restore posn: exe norm! ".w:netrw_line."G0".w:netrw_col."|")
432
 
   exe "norm! ".w:netrw_line."G0".w:netrw_col."\<bar>"
433
 
  endif
434
 
 
435
 
  let &ei= eikeep
436
 
"  call Dret("netrw#NetrwRestorePosn")
437
 
endfun
438
 
 
439
 
" ---------------------------------------------------------------------
440
376
" s:NetrwOptionSave: save options and set to "standard" form {{{2
441
377
"  06/08/07 : removed call to NetrwSafeOptions(), either placed
442
378
"             immediately after NetrwOptionSave() calls in NetRead
444
380
"             NetrwBrowse.
445
381
"             vt: normally its "w:" or "s:" (a variable type)
446
382
fun! s:NetrwOptionSave(vt)
447
 
"  call Dfunc("s:NetrwOptionSave(vt<".a:vt.">) win#".winnr()." buf#".bufnr(".")."<".bufname(bufnr(".")).">")
 
383
"  call Dfunc("s:NetrwOptionSave(vt<".a:vt.">) win#".winnr()." buf#".bufnr("%")."<".bufname(bufnr("%")).">")
448
384
 
449
385
"  call Decho(a:vt."netrw_optionsave".(exists("{a:vt}netrw_optionsave")? ("=".{a:vt}netrw_optionsave) : " doesn't exist"))
450
386
  if !exists("{a:vt}netrw_optionsave")
484
420
  if &go =~ 'a' | silent! let {a:vt}netrw_regstar = @* | endif
485
421
  silent! let {a:vt}netrw_regslash= @/
486
422
 
487
 
"  call Dret("s:NetrwOptionSave : win#".winnr()." buf#".bufnr("."))
 
423
"  call Dret("s:NetrwOptionSave : win#".winnr()." buf#".bufnr("%"))
488
424
endfun
489
425
 
490
426
" ------------------------------------------------------------------------
491
427
" s:NetrwOptionRestore: restore options {{{2
492
428
fun! s:NetrwOptionRestore(vt)
493
 
"  call Dfunc("s:NetrwOptionRestore(vt<".a:vt.">) win#".winnr()." buf#".bufnr("."))
 
429
"  call Dfunc("s:NetrwOptionRestore(vt<".a:vt.">) win#".winnr()." buf#".bufnr("%"))
494
430
  if !exists("{a:vt}netrw_optionsave")
 
431
"   call Decho("ro=".&ro." ma=".&ma." mod=".&mod." wrap=".&wrap)
495
432
"   call Dret("s:NetrwOptionRestore : ".a:vt."netrw_optionsave doesn't exist")
496
433
   return
497
434
  endif
504
441
    let &l:acd = {a:vt}netrw_acdkeep
505
442
    unlet {a:vt}netrw_acdkeep
506
443
    if &l:acd
507
 
"     call Decho("exe cd ".escape(curdir,g:netrw_fname_escape))
508
 
     exe "cd ".escape(curdir,g:netrw_fname_escape)
 
444
"     call Decho("exe keepjumps lcd ".fnameescape(curdir))  " NOTE: was g:netrw_fname_escape for some reason
 
445
     try
 
446
      if !exists("&l:acd") && !&l:acd
 
447
       exe 'keepjumps lcd '.fnameescape(curdir)
 
448
      endif
 
449
     catch /^Vim\%((\a\+)\)\=:E472/
 
450
      call netrw#ErrorMsg(s:ERROR,"unable to change directory to <".curdir."> (permissions?)",61)
 
451
     endtry
509
452
    endif
510
453
   endif
511
454
  endif
518
461
  if exists("{a:vt}netrw_cpokeep")  |let &l:cpo    = {a:vt}netrw_cpokeep     |unlet {a:vt}netrw_cpokeep  |endif
519
462
  if exists("{a:vt}netrw_dirkeep") && isdirectory({a:vt}netrw_dirkeep) && g:netrw_keepdir
520
463
   let dirkeep = substitute({a:vt}netrw_dirkeep,'\\','/','g')
521
 
   let dirkeep = escape(dirkeep,g:netrw_cd_escape)
522
 
   if exists("{a:vt}netrw_dirkeep")  |exe "lcd ".dirkeep|unlet {a:vt}netrw_dirkeep  |endif
 
464
   if exists("{a:vt}netrw_dirkeep")  |exe "keepjumps lcd ".fnameescape(dirkeep)|unlet {a:vt}netrw_dirkeep  |endif
523
465
  endif
524
466
  if exists("{a:vt}netrw_fokeep")   |let &l:fo     = {a:vt}netrw_fokeep      |unlet {a:vt}netrw_fokeep   |endif
525
467
  if exists("{a:vt}netrw_gdkeep")   |let &l:gd     = {a:vt}netrw_gdkeep      |unlet {a:vt}netrw_gdkeep   |endif
547
489
  endif
548
490
  if exists("{a:vt}netrw_regstar") |silent! let @*= {a:vt}netrw_regstar |unlet {a:vt}netrw_regstar |endif
549
491
  if exists("{a:vt}netrw_regslash")|silent! let @/= {a:vt}netrw_regslash|unlet {a:vt}netrw_regslash|endif
 
492
 
550
493
"  call Decho("g:netrw_keepdir=".g:netrw_keepdir.": getcwd<".getcwd()."> acd=".&acd)
551
 
 
552
494
"  call Decho("fo=".&fo.(exists("&acd")? " acd=".&acd : " acd doesn't exist"))
553
 
"  call Dret("s:NetrwOptionRestore : win#".winnr()." buf#".bufnr("."))
 
495
"  call Decho("ro=".&ro." ma=".&ma." mod=".&mod." wrap=".&wrap)
 
496
"  call Dret("s:NetrwOptionRestore : win#".winnr()." buf#".bufnr("%"))
554
497
endfun
555
498
 
556
499
" ---------------------------------------------------------------------
557
500
" s:NetrwSafeOptions: sets options to help netrw do its job {{{2
558
501
fun! s:NetrwSafeOptions()
559
 
"  call Dfunc("s:NetrwSafeOptions() win#".winnr()." buf#".bufnr(".")."<".bufname(bufnr(".")).">")
 
502
"  call Dfunc("s:NetrwSafeOptions() win#".winnr()." buf#".bufnr("%")."<".bufname(bufnr("%")).">")
560
503
"  call Decho("window's ft=".&ft)
561
504
  setlocal cino=
562
505
  setlocal com=
693
636
"     call Decho("reconstructing choice")
694
637
     if match(choice,'"$') != -1
695
638
      " case "..."
696
 
      let choice=strpart(choice,1,s:Strlen(choice)-2)
 
639
      let choice=strpart(choice,1,strlen(choice)-2)
697
640
     else
698
641
       "  case "... ... ..."
699
 
      let choice      = strpart(choice,1,s:Strlen(choice)-1)
 
642
      let choice      = strpart(choice,1,strlen(choice)-1)
700
643
      let wholechoice = ""
701
644
 
702
645
      while match(choice,'"$') == -1
711
654
       endif
712
655
       let choice= a:{ichoice}
713
656
      endwhile
714
 
      let choice= strpart(wholechoice,1,s:Strlen(wholechoice)-1) . " " . strpart(choice,0,s:Strlen(choice)-1)
 
657
      let choice= strpart(wholechoice,1,strlen(wholechoice)-1) . " " . strpart(choice,0,strlen(choice)-1)
715
658
     endif
716
659
    endif
717
660
   endif
761
704
     let uid_machine = g:netrw_machine
762
705
    endif
763
706
   endif
764
 
"   call Decho("executing: !".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".uid_machine.":".escape(b:netrw_fname,' ?&;')." ".tmpfile)
765
 
   exe g:netrw_silentxfer."!".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".uid_machine.":".escape(b:netrw_fname,' ?&;')." ".tmpfile
 
707
"   call Decho("executing: !".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".shellescape(uid_machine.":".escape(b:netrw_fname,' ?&;')." ".tmpfile)
 
708
   exe s:netrw_silentxfer."!".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".shellescape(uid_machine.":".escape(b:netrw_fname,' ?&;')." ".tmpfile)
766
709
   let result           = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
767
710
   let b:netrw_lastfile = choice
768
711
 
774
717
     call s:SaveBufVars()|new|call s:RestoreBufVars()
775
718
     setlocal ff=unix
776
719
     exe "put ='".g:netrw_ftpmode."'"
777
 
"     call Decho("filter input: ".getline("."))
 
720
"     call Decho("filter input: ".getline('.'))
778
721
     if exists("g:netrw_ftpextracmd")
779
722
      exe "put ='".g:netrw_ftpextracmd."'"
780
 
"      call Decho("filter input: ".getline("."))
 
723
"      call Decho("filter input: ".getline('.'))
781
724
     endif
782
725
     exe "put ='".'get \"'.netrw_fname.'\" '.tmpfile."'"
783
 
"     call Decho("filter input: ".getline("."))
 
726
"     call Decho("filter input: ".getline('.'))
784
727
     if exists("g:netrw_port") && g:netrw_port != ""
785
728
"      call Decho("executing: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port)
786
 
      exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port
 
729
      exe s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port
787
730
     else
788
731
"      call Decho("executing: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine)
789
 
      exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".g:netrw_machine
 
732
      exe s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".g:netrw_machine
790
733
     endif
791
734
     " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
792
735
     if getline(1) !~ "^$" && !exists("g:netrw_quiet") && getline(1) !~ '^Trying '
809
752
    setlocal ff=unix
810
753
    if exists("g:netrw_port") && g:netrw_port != ""
811
754
     put ='open '.g:netrw_machine.' '.g:netrw_port
812
 
"     call Decho("filter input: ".getline("."))
 
755
"     call Decho("filter input: ".getline('.'))
813
756
    else
814
757
     put ='open '.g:netrw_machine
815
 
"     call Decho("filter input: ".getline("."))
 
758
"     call Decho("filter input: ".getline('.'))
816
759
    endif
817
760
 
818
761
    if exists("g:netrw_ftp") && g:netrw_ftp == 1
819
762
     put =g:netrw_uid
820
 
"     call Decho("filter input: ".getline("."))
 
763
"     call Decho("filter input: ".getline('.'))
821
764
     put ='\"'.s:netrw_passwd.'\"'
822
 
"     call Decho("filter input: ".getline("."))
 
765
"     call Decho("filter input: ".getline('.'))
823
766
    else
824
767
     put ='user \"'.g:netrw_uid.'\" \"'.s:netrw_passwd.'\"'
825
 
"     call Decho("filter input: ".getline("."))
 
768
"     call Decho("filter input: ".getline('.'))
826
769
    endif
827
770
 
828
771
    if exists("g:netrw_ftpmode") && g:netrw_ftpmode != ""
829
772
     put =g:netrw_ftpmode
830
 
"     call Decho("filter input: ".getline("."))
 
773
"     call Decho("filter input: ".getline('.'))
831
774
    endif
832
775
    if exists("g:netrw_ftpextracmd")
833
776
     exe "put ='".g:netrw_ftpextracmd."'"
834
 
"     call Decho("filter input: ".getline("."))
 
777
"     call Decho("filter input: ".getline('.'))
835
778
    endif
836
779
    put ='get \"'.netrw_fname.'\" '.tmpfile
837
 
"    call Decho("filter input: ".getline("."))
 
780
"    call Decho("filter input: ".getline('.'))
838
781
 
839
782
    " perform ftp:
840
783
    " -i       : turns off interactive prompting from ftp
842
785
    " -n  win32: quit being obnoxious about password
843
786
    norm! 1Gdd
844
787
"    call Decho("executing: %!".g:netrw_ftp_cmd." -i -n")
845
 
    exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i -n"
 
788
    exe s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i -n"
846
789
    " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
847
790
    if getline(1) !~ "^$"
848
791
"     call Decho("error<".getline(1).">")
863
806
    else
864
807
     let useport= ""
865
808
    endif
866
 
"    call  Decho("executing: !".g:netrw_scp_cmd.useport." '".g:netrw_machine.":".escape(b:netrw_fname,g:netrw_fname_escape)."' ".tmpfile)
867
 
    exe g:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".g:netrw_shq.g:netrw_machine.":".escape(b:netrw_fname,g:netrw_fname_escape).g:netrw_shq." ".tmpfile
 
809
"    call Decho("exe s:netrw_silentxfer.!".g:netrw_scp_cmd.useport." ".shellescape(g:netrw_machine.":".escape(b:netrw_fname,g:netrw_fname_escape))." ".tmpfile)
 
810
    exe s:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".shellescape(g:netrw_machine.":".escape(b:netrw_fname,g:netrw_fname_escape))." ".tmpfile
868
811
    let result           = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
869
812
    let b:netrw_lastfile = choice
870
813
 
880
823
     return
881
824
    endif
882
825
 
 
826
    let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
883
827
    if match(b:netrw_fname,"#") == -1
884
828
     " simple wget
885
 
     let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
886
 
"     call Decho("executing: !".g:netrw_http_cmd." ".tmpfile." http://".g:netrw_machine.netrw_fname)
887
 
     exe g:netrw_silentxfer."!".g:netrw_http_cmd." ".tmpfile." http://".g:netrw_machine.netrw_fname
 
829
"     call Decho('using simple wget (# not in b:netrw_fname<'.b:netrw_fname.">)")
 
830
"     call Decho("exe ".s:netrw_silentxfer."!".g:netrw_http_cmd." ".shellescape(tmpfile)." ".shellescape("http://".g:netrw_machine.netrw_fname))
 
831
     exe s:netrw_silentxfer."!".g:netrw_http_cmd." ".shellescape(tmpfile)." ".shellescape("http://".g:netrw_machine.netrw_fname)
888
832
     let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
889
833
 
890
834
    else
891
835
     " wget plus a jump to an in-page marker (ie. http://abc/def.html#aMarker)
 
836
"     call Decho(("wget/curl plus jump (# in b:netrw_fname<".b:netrw_fname.">)")
892
837
     let netrw_html= substitute(netrw_fname,"#.*$","","")
893
838
     let netrw_tag = substitute(netrw_fname,"^.*#","","")
894
839
"     call Decho("netrw_html<".netrw_html.">")
895
840
"     call Decho("netrw_tag <".netrw_tag.">")
896
 
"     call Decho("executing: !".g:netrw_http_cmd." ".tmpfile." http://".g:netrw_machine.netrw_html)
897
 
     exe g:netrw_silentxfer."!".g:netrw_http_cmd." ".tmpfile." http://".g:netrw_machine.netrw_html
 
841
"     call Decho("exe ".s:netrw_silentxfer."!".g:netrw_http_cmd." ".shellescape(tmpfile)." ".shellescape("http://".g:netrw_machine.netrw_html))
 
842
     exe s:netrw_silentxfer."!".g:netrw_http_cmd." ".shellescape(tmpfile)." ".shellescape("http://".g:netrw_machine.netrw_html)
898
843
     let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
899
844
"     call Decho('<\s*a\s*name=\s*"'.netrw_tag.'"/')
900
845
     exe 'norm! 1G/<\s*a\s*name=\s*"'.netrw_tag.'"/'."\<CR>"
923
868
    " perform cadaver operation:
924
869
    norm! 1Gdd
925
870
"    call Decho("executing: %!".g:netrw_dav_cmd)
926
 
    exe g:netrw_silentxfer."%!".g:netrw_dav_cmd
 
871
    exe s:netrw_silentxfer."%!".g:netrw_dav_cmd
927
872
    bd!
928
873
    let result           = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
929
874
    let b:netrw_lastfile = choice
933
878
   elseif     b:netrw_method  == 7
934
879
"    call Decho("read via rsync (method #7)")
935
880
    let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
936
 
"    call Decho("executing: !".g:netrw_rsync_cmd." ".g:netrw_machine.":".netrw_fname." ".tmpfile)
937
 
    exe g:netrw_silentxfer."!".g:netrw_rsync_cmd." ".g:netrw_machine.":".netrw_fname." ".tmpfile
938
 
    let result          = s:NetrwGetFile(readcmd,tmpfile, b:netrw_method)
 
881
"    call Decho("exe ".s:netrw_silentxfer."!".g:netrw_rsync_cmd." ".shellescape(g:netrw_machine.":".netrw_fname)." ".tmpfile)
 
882
    exe s:netrw_silentxfer."!".g:netrw_rsync_cmd." ".shellescape(g:netrw_machine.":".netrw_fname)." ".tmpfile
 
883
    let result           = s:NetrwGetFile(readcmd,tmpfile, b:netrw_method)
939
884
    let b:netrw_lastfile = choice
940
885
 
941
886
   ".........................................
958
903
"    call Decho("read via fetch for ".netrw_option)
959
904
 
960
905
    if exists("g:netrw_uid") && g:netrw_uid != "" && exists("s:netrw_passwd") && s:netrw_passwd != ""
961
 
"     call Decho("executing: !".g:netrw_fetch_cmd." ".tmpfile." ".netrw_option."://".g:netrw_uid.':'.s:netrw_passwd.'@'.g:netrw_machine."/".netrw_fname)
962
 
     exe g:netrw_silentxfer."!".g:netrw_fetch_cmd." ".tmpfile." ".netrw_option."://".g:netrw_uid.':'.s:netrw_passwd.'@'.g:netrw_machine."/".netrw_fname
 
906
"     call Decho("exe ".s:netrw_silentxfer."!".g:netrw_fetch_cmd." ".tmpfile." ".shellescape(netrw_option."://".g:netrw_uid.':'.s:netrw_passwd.'@'.g:netrw_machine."/".netrw_fname))
 
907
     exe s:netrw_silentxfer."!".g:netrw_fetch_cmd." ".tmpfile." ".shellescape(netrw_option."://".g:netrw_uid.':'.s:netrw_passwd.'@'.g:netrw_machine."/".netrw_fname)
963
908
    else
964
 
"     call Decho("executing: !".g:netrw_fetch_cmd." ".tmpfile." ".netrw_option."://".g:netrw_machine."/".netrw_fname)
965
 
     exe g:netrw_silentxfer."!".g:netrw_fetch_cmd." ".tmpfile." ".netrw_option."://".g:netrw_machine."/".netrw_fname
 
909
"     call Decho("exe ".s:netrw_silentxfer."!".g:netrw_fetch_cmd." ".tmpfile." ".shellescape(netrw_option."://".g:netrw_machine."/".netrw_fname))
 
910
     exe s:netrw_silentxfer."!".g:netrw_fetch_cmd." ".tmpfile." ".shellescape(netrw_option."://".g:netrw_machine."/".netrw_fname)
966
911
    endif
967
912
 
968
913
    let result          = s:NetrwGetFile(readcmd,tmpfile, b:netrw_method)
974
919
   elseif     b:netrw_method  == 9
975
920
"    call Decho("read via sftp (method #9)")
976
921
    let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
977
 
"    call Decho("executing: !".g:netrw_sftp_cmd." ".g:netrw_machine.":".netrw_fname." ".tmpfile)
978
 
    exe g:netrw_silentxfer."!".g:netrw_sftp_cmd." ".g:netrw_machine.":".netrw_fname." ".tmpfile
 
922
"    call Decho("exe ".s:netrw_silentxfer."!".g:netrw_sftp_cmd." ".shellescape(g:netrw_machine.":".netrw_fname)." ".tmpfile)
 
923
    exe s:netrw_silentxfer."!".g:netrw_sftp_cmd." ".shellescape(g:netrw_machine.":".netrw_fname)." ".tmpfile
979
924
    let result          = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method)
980
925
    let b:netrw_lastfile = choice
981
926
 
994
939
  endif
995
940
  if s:FileReadable(tmpfile) && tmpfile !~ '.tar.bz2$' && tmpfile !~ '.tar.gz$' && tmpfile !~ '.zip' && tmpfile !~ '.tar' && readcmd != 't'
996
941
"   call Decho("cleanup by deleting tmpfile<".tmpfile.">")
997
 
   call s:System("delete",tmpfile)
 
942
   call s:System("delete",fnameescape(tmpfile))
998
943
  endif
999
944
  call s:NetrwOptionRestore("w:")
1000
945
 
1081
1026
    elseif match(choice,"^\"") != -1
1082
1027
     if match(choice,"\"$") != -1
1083
1028
       " case "..."
1084
 
      let choice=strpart(choice,1,s:Strlen(choice)-2)
 
1029
      let choice=strpart(choice,1,strlen(choice)-2)
1085
1030
     else
1086
1031
      "  case "... ... ..."
1087
 
      let choice      = strpart(choice,1,s:Strlen(choice)-1)
 
1032
      let choice      = strpart(choice,1,strlen(choice)-1)
1088
1033
      let wholechoice = ""
1089
1034
 
1090
1035
      while match(choice,"\"$") == -1
1099
1044
       endif
1100
1045
       let choice= a:{ichoice}
1101
1046
      endwhile
1102
 
      let choice= strpart(wholechoice,1,s:Strlen(wholechoice)-1) . " " . strpart(choice,0,s:Strlen(choice)-1)
 
1047
      let choice= strpart(wholechoice,1,strlen(wholechoice)-1) . " " . strpart(choice,0,strlen(choice)-1)
1103
1048
     endif
1104
1049
    endif
1105
1050
   endif
1114
1059
   " ============================
1115
1060
   if exists("g:netrw_silent") && g:netrw_silent == 0 && &ch >= 1
1116
1061
    echo "(netrw) Processing your write request..."
 
1062
"    call Decho("(netrw) Processing your write request...")
1117
1063
   endif
1118
1064
 
1119
1065
   ".........................................
1134
1080
     endif
1135
1081
    endif
1136
1082
    let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
1137
 
"    call Decho("executing: !".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".g:netrw_shq.tmpfile.g:netrw_shq." ".uid_machine.":".netrw_fname)
1138
 
    exe g:netrw_silentxfer."!".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".g:netrw_shq.tmpfile.g:netrw_shq." ".uid_machine.":".netrw_fname
 
1083
"    call Decho("executing: !".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".shellescape(tmpfile)." ".shellescape(uid_machine.":".netrw_fname))
 
1084
    exe s:netrw_silentxfer."!".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".shellescape(tmpfile)." ".shellescape(uid_machine.":".netrw_fname)
1139
1085
    let b:netrw_lastfile = choice
1140
1086
 
1141
1087
   ".........................................
1144
1090
"    call Decho("write via ftp+.netrc (method #2)")
1145
1091
    let netrw_fname= b:netrw_fname
1146
1092
    new
 
1093
"    call Decho("filter input window#".winnr())
1147
1094
    setlocal ff=unix
1148
1095
    exe "put ='".g:netrw_ftpmode."'"
1149
 
"    call Decho(" filter input: ".getline("."))
 
1096
"    call Decho("filter input: ".getline('.'))
1150
1097
    if exists("g:netrw_ftpextracmd")
1151
1098
     exe "put ='".g:netrw_ftpextracmd."'"
1152
 
"     call Decho("filter input: ".getline("."))
 
1099
"     call Decho("filter input: ".getline('.'))
1153
1100
    endif
1154
1101
    exe "put ='".'put \"'.tmpfile.'\" \"'.netrw_fname.'\"'."'"
1155
 
"    call Decho(" filter input: ".getline("."))
 
1102
"    call Decho("filter input: ".getline('.'))
1156
1103
    if exists("g:netrw_port") && g:netrw_port != ""
1157
1104
"     call Decho("executing: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port)
1158
 
     exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port
 
1105
     exe s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port
1159
1106
    else
 
1107
"     call Decho("filter input window#".winnr())
1160
1108
"     call Decho("executing: %!".g:netrw_ftp_cmd." -i ".g:netrw_machine)
1161
 
     exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".g:netrw_machine
 
1109
     exe s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".g:netrw_machine
1162
1110
    endif
1163
1111
    " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
1164
1112
    if getline(1) !~ "^$"
1180
1128
    setlocal ff=unix
1181
1129
    if exists("g:netrw_port") && g:netrw_port != ""
1182
1130
     put ='open '.g:netrw_machine.' '.g:netrw_port
1183
 
"     call Decho("filter input: ".getline("."))
 
1131
"     call Decho("filter input: ".getline('.'))
1184
1132
    else
1185
1133
     put ='open '.g:netrw_machine
1186
 
"     call Decho("filter input: ".getline("."))
 
1134
"     call Decho("filter input: ".getline('.'))
1187
1135
    endif
1188
1136
    if exists("g:netrw_ftp") && g:netrw_ftp == 1
1189
1137
     put =g:netrw_uid
1190
 
"     call Decho("filter input: ".getline("."))
 
1138
"     call Decho("filter input: ".getline('.'))
1191
1139
     put ='\"'.s:netrw_passwd.'\"'
1192
 
"     call Decho("filter input: ".getline("."))
 
1140
"     call Decho("filter input: ".getline('.'))
1193
1141
    else
1194
1142
     put ='user \"'.g:netrw_uid.'\" \"'.s:netrw_passwd.'\"'
1195
 
"     call Decho("filter input: ".getline("."))
 
1143
"     call Decho("filter input: ".getline('.'))
1196
1144
    endif
1197
1145
    put ='put \"'.tmpfile.'\" \"'.netrw_fname.'\"'
1198
 
"    call Decho("filter input: ".getline("."))
 
1146
"    call Decho("filter input: ".getline('.'))
1199
1147
    " save choice/id/password for future use
1200
1148
    let b:netrw_lastfile = choice
1201
1149
 
1205
1153
    " -n  win32: quit being obnoxious about password
1206
1154
    norm! 1Gdd
1207
1155
"    call Decho("executing: %!".g:netrw_ftp_cmd." -i -n")
1208
 
    exe g:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i -n"
 
1156
    exe s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i -n"
1209
1157
    " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar)
1210
1158
    if getline(1) !~ "^$"
1211
1159
     if  !exists("g:netrw_quiet")
1225
1173
    else
1226
1174
     let useport= ""
1227
1175
    endif
1228
 
"    call Decho("exe ".g:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".g:netrw_shq.tmpfile.g:netrw_shq." ".g:netrw_shq.g:netrw_machine.":".netrw_fname.g:netrw_shq)
1229
 
    exe g:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".g:netrw_shq.tmpfile.g:netrw_shq." ".g:netrw_shq.g:netrw_machine.":".netrw_fname.g:netrw_shq
 
1176
"    call Decho("exe ".s:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".shellescape(tmpfile)." ".shellescape(g:netrw_machine.":".netrw_fname))
 
1177
    exe s:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".shellescape(tmpfile)." ".shellescape(g:netrw_machine.":".netrw_fname)
1230
1178
    let b:netrw_lastfile = choice
1231
1179
 
1232
1180
   ".........................................
1251
1199
    else
1252
1200
     put ='open '.g:netrw_machine
1253
1201
    endif
1254
 
    put ='user '.g:netrw_uid.' '.s:netrw_passwd
 
1202
    if exists("g:netrw_uid") && exists("s:netrw_passwd")
 
1203
     put ='user '.g:netrw_uid.' '.s:netrw_passwd
 
1204
    endif
1255
1205
    put ='put '.tmpfile.' '.netrw_fname
1256
1206
 
1257
1207
    " perform cadaver operation:
1258
1208
    norm! 1Gdd
1259
1209
"    call Decho("executing: %!".g:netrw_dav_cmd)
1260
 
    exe g:netrw_silentxfer."%!".g:netrw_dav_cmd
 
1210
    exe s:netrw_silentxfer."%!".g:netrw_dav_cmd
1261
1211
    bd!
1262
1212
    let b:netrw_lastfile = choice
1263
1213
 
1267
1217
"    call Decho("write via rsync (method #7)")
1268
1218
    let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape)
1269
1219
"    call Decho("executing: !".g:netrw_rsync_cmd." ".tmpfile." ".g:netrw_machine.":".netrw_fname)
1270
 
    exe g:netrw_silentxfer."!".g:netrw_rsync_cmd." ".tmpfile." ".g:netrw_machine.":".netrw_fname
 
1220
    exe s:netrw_silentxfer."!".g:netrw_rsync_cmd." ".tmpfile." ".g:netrw_machine.":".netrw_fname
1271
1221
    let b:netrw_lastfile = choice
1272
1222
 
1273
1223
   ".........................................
1283
1233
    new
1284
1234
    setlocal ff=unix
1285
1235
    put ='put \"'.escape(tmpfile,'\').'\" '.netrw_fname
1286
 
"    call Decho("filter input: ".getline("."))
 
1236
"    call Decho("filter input: ".getline('.'))
1287
1237
    norm! 1Gdd
1288
1238
"    call Decho("executing: %!".g:netrw_sftp_cmd.' '.uid_machine)
1289
 
    exe g:netrw_silentxfer."%!".g:netrw_sftp_cmd.' '.uid_machine
 
1239
    exe s:netrw_silentxfer."%!".g:netrw_sftp_cmd.' '.uid_machine
1290
1240
    bd!
1291
1241
    let b:netrw_lastfile= choice
1292
1242
 
1362
1312
 
1363
1313
  " readcmd=='t': simply do nothing
1364
1314
  if a:readcmd == 't'
 
1315
"   call Decho("ro=".&ro." ma=".&ma." mod=".&mod." wrap=".&wrap)
1365
1316
"   call Dret("NetrwGetFile : skip read of <".a:tfile.">")
1366
1317
   return
1367
1318
  endif
1385
1336
   else
1386
1337
    let tfile= a:tfile
1387
1338
   endif
1388
 
"   call Decho("keepalt exe file ".tfile)
1389
 
   keepalt exe "silent! keepalt file ".tfile
 
1339
"   "   call Decho("exe silent! keepalt file ".tfile)
 
1340
   exe "silent! keepalt file ".tfile
1390
1341
 
1391
1342
   " edit temporary file (ie. read the temporary file in)
1392
1343
   if     rfile =~ '\.zip$'
1407
1358
   endif
1408
1359
 
1409
1360
   " rename buffer back to remote filename
 
1361
"   call Decho("exe silent! keepalt file ".escape(rfile,' '))
1410
1362
   exe "silent! keepalt file ".escape(rfile,' ')
1411
 
   filetype detect
 
1363
   if a:method == 5
 
1364
    set ft=html
 
1365
   else
 
1366
    filetype detect
 
1367
   endif
1412
1368
"   call Dredir("renamed buffer back to remote filename<".rfile."> : expand(%)<".expand("%").">","ls!")
1413
1369
   let line1 = 1
1414
1370
   let line2 = line("$")
1425
1381
 
1426
1382
  else
1427
1383
   " not readable
 
1384
"   call Decho("ro=".&ro." ma=".&ma." mod=".&mod." wrap=".&wrap)
1428
1385
"   call Decho("tfile<".a:tfile."> not readable")
1429
1386
   call netrw#ErrorMsg(s:WARNING,"file <".a:tfile."> not readable",9)
1430
1387
"   call Dret("NetrwGetFile : tfile<".a:tfile."> not readable")
1439
1396
"   call Decho("NetReadFixup() not called, doesn't exist  (line1=".line1." line2=".line2.")")
1440
1397
  endif
1441
1398
 
1442
 
  " update the Buffers menu
1443
 
  if has("gui") && has("gui_running")
1444
 
   silent! emenu Buffers.Refresh\ menu
 
1399
  if has("gui") && has("menu") && has("gui_running") && &go =~ 'm'
 
1400
   " update the Buffers menu
 
1401
   call s:UpdateBuffersMenu()
1445
1402
  endif
1446
1403
 
1447
1404
"  call Decho("readcmd<".a:readcmd."> cmdarg<".v:cmdarg."> tfile<".a:tfile."> readable=".s:FileReadable(a:tfile))
1448
1405
 
1449
1406
 " make sure file is being displayed
1450
 
  redraw!
 
1407
"  redraw!
 
1408
 
 
1409
"  call Decho("ro=".&ro." ma=".&ma." mod=".&mod." wrap=".&wrap)
1451
1410
"  call Dret("NetrwGetFile")
1452
1411
endfun
1453
1412
 
1480
1439
  " rcphf    : [user@]host:filename                  Use rcp
1481
1440
  " scpurm   : scp://[user@]host[[#:]port]/filename  Use scp
1482
1441
  " httpurm  : http://[user@]host/filename           Use wget
1483
 
  " davurm   : [s]dav://host[:port]/path             Use cadaver
 
1442
  " davurm   : dav[s]://host[:port]/path             Use cadaver
1484
1443
  " rsyncurm : rsync://host[:port]/path              Use rsync
1485
1444
  " fetchurm : fetch://[user@]host[:http]/filename   Use fetch (defaults to ftp, override for http)
1486
1445
  " sftpurm  : sftp://[user@]host/filename  Use scp
1491
1450
  let rcphf    = '^\(\(\h\w*\)@\)\=\(\h\w*\):\([^@]\+\)$'
1492
1451
  let scpurm   = '^scp://\([^/#:]\+\)\%([#:]\(\d\+\)\)\=/\(.*\)$'
1493
1452
  let httpurm  = '^http://\([^/]\{-}\)\(/.*\)\=$'
1494
 
  let davurm   = '^s\=dav://\([^/]\+\)/\(.*/\)\([-_.~[:alnum:]]\+\)$'
 
1453
  let davurm   = '^davs\=://\([^/]\+\)/\(.*/\)\([-_.~[:alnum:]]\+\)$'
1495
1454
  let rsyncurm = '^rsync://\([^/]\{-}\)/\(.*\)\=$'
1496
1455
  let fetchurm = '^fetch://\(\([^/@]\{-}\)@\)\=\([^/#:]\{-}\)\(:http\)\=/\(.*\)$'
1497
1456
  let sftpurm  = '^sftp://\([^/]\{-}\)/\(.*\)\=$'
1609
1568
  " Issue an rcp: hostname:filename"  (this one should be last)
1610
1569
  elseif match(a:choice,rcphf) == 0
1611
1570
"   call Decho("(rcp) [user@]host:file) rcphf<".rcphf.">")
1612
 
   let b:netrw_method = 1
1613
 
   let userid        = substitute(a:choice,rcphf,'\2',"")
1614
 
   let g:netrw_machine= substitute(a:choice,rcphf,'\3',"")
1615
 
   let b:netrw_fname  = substitute(a:choice,rcphf,'\4',"")
 
1571
   let b:netrw_method  = 1
 
1572
   let userid          = substitute(a:choice,rcphf,'\2',"")
 
1573
   let g:netrw_machine = substitute(a:choice,rcphf,'\3',"")
 
1574
   let b:netrw_fname   = substitute(a:choice,rcphf,'\4',"")
1616
1575
"   call Decho('\1<'.substitute(a:choice,rcphf,'\1',"").">")
1617
1576
"   call Decho('\2<'.substitute(a:choice,rcphf,'\2',"").">")
1618
1577
"   call Decho('\3<'.substitute(a:choice,rcphf,'\3',"").">")
1713
1672
   nnoremap <buffer> <silent> md        :<c-u>call <SID>NetrwMarkFileDiff(1)<cr>
1714
1673
   nnoremap <buffer> <silent> me        :<c-u>call <SID>NetrwMarkFileEdit(1)<cr>
1715
1674
   nnoremap <buffer> <silent> mf        :<c-u>call <SID>NetrwMarkFile(1,<SID>NetrwGetWord())<cr>
 
1675
   nnoremap <buffer> <silent> mg        :<c-u>call <SID>NetrwMarkFileGrep(1)<cr>
 
1676
   nnoremap <buffer> <silent> mh        :<c-u>call <SID>NetrwMarkHideSfx(1)<cr>
1716
1677
   nnoremap <buffer> <silent> mm        :<c-u>call <SID>NetrwMarkFileMove(1)<cr>
1717
1678
   nnoremap <buffer> <silent> mp        :<c-u>call <SID>NetrwMarkFilePrint(1)<cr>
1718
1679
   nnoremap <buffer> <silent> mr        :<c-u>call <SID>NetrwMarkFileRegexp(1)<cr>
 
1680
   nnoremap <buffer> <silent> ms        :<c-u>call <SID>NetrwMarkFileSource(1)<cr>
1719
1681
   nnoremap <buffer> <silent> mT        :<c-u>call <SID>NetrwMarkFileTag(1)<cr>
1720
1682
   nnoremap <buffer> <silent> mt        :<c-u>call <SID>NetrwMarkFileTgt(1)<cr>
 
1683
   nnoremap <buffer> <silent> mu        :<c-u>call <SID>NetrwUnMarkFile(1)<cr>
1721
1684
   nnoremap <buffer> <silent> mx        :<c-u>call <SID>NetrwMarkFileExe(1)<cr>
1722
1685
   nnoremap <buffer> <silent> mz        :<c-u>call <SID>NetrwMarkFileCompress(1)<cr>
1723
1686
   nnoremap <buffer> <silent> gb        :<c-u>call <SID>NetrwBookmarkDir(1,b:netrw_curdir)<cr>
1724
 
   nnoremap <buffer> <silent> c         :exe "cd ".escape(b:netrw_curdir,g:netrw_cd_escape)<cr>
 
1687
   nnoremap <buffer> <silent> gh        :<c-u>call <SID>NetrwHidden(1)<cr>
 
1688
   nnoremap <buffer> <silent> c         :exe "keepjumps lcd ".fnameescape(b:netrw_curdir)<cr>
1725
1689
   nnoremap <buffer> <silent> C         :let g:netrw_chgwin= winnr()<cr>
1726
1690
   nnoremap <buffer> <silent> d         :call <SID>NetrwMakeDir("")<cr>
1727
1691
   nnoremap <buffer> <silent> i         :call <SID>NetrwListStyle(1)<cr>
1728
1692
   nnoremap <buffer> <silent> o         :call <SID>NetrwSplit(3)<cr>
1729
 
   nnoremap <buffer> <silent> O         :call <SID>NetrwObtain(0)<cr>
 
1693
   nnoremap <buffer> <silent> O         :call <SID>NetrwObtain(1)<cr>
1730
1694
   nnoremap <buffer> <silent> p         :call <SID>NetrwPreview(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord(),1))<cr>
1731
1695
   nnoremap <buffer> <silent> P         :call <SID>NetrwPrevWinOpen(1)<cr>
1732
 
   nnoremap <buffer> <silent> q         :<c-u>call <SID>NetrwBookmarkDir(2,b:netrw_curdir)<cr>
 
1696
   nnoremap <buffer> <silent> qb        :<c-u>call <SID>NetrwBookmarkDir(2,b:netrw_curdir)<cr>
 
1697
   nnoremap <buffer> <silent> mB        :<c-u>call <SID>NetrwBookmarkDir(6,b:netrw_curdir)<cr>
 
1698
   nnoremap <buffer> <silent> qf        :<c-u>call <SID>NetrwFileInfo(1,<SID>NetrwGetWord())<cr>
1733
1699
   nnoremap <buffer> <silent> r         :let g:netrw_sort_direction= (g:netrw_sort_direction =~ 'n')? 'r' : 'n'<bar>exe "norm! 0"<bar>call <SID>NetrwRefresh(1,<SID>NetrwBrowseChgDir(1,'./'))<cr>
1734
1700
   nnoremap <buffer> <silent> s         :call <SID>NetrwSortStyle(1)<cr>
1735
1701
   nnoremap <buffer> <silent> S         :call <SID>NetSortSequence(1)<cr>
1766
1732
   exe 'nnoremap <buffer> <silent> R            :call <SID>NetrwLocalRename("'.b:netrw_curdir.'")<cr>'
1767
1733
   exe 'vnoremap <buffer> <silent> R            :call <SID>NetrwLocalRename("'.b:netrw_curdir.'")<cr>'
1768
1734
   exe 'nnoremap <buffer> <silent> <Leader>m    :call <SID>NetrwMakeDir("")<cr>'
1769
 
   nnoremap <buffer> <F1>               :he netrw-dir<cr>
 
1735
   nnoremap <buffer> <F1>               :he netrw-quickhelp<cr>
1770
1736
 
1771
1737
  else " remote
1772
1738
   call s:RemotePathAnalysis(b:netrw_curdir)
1779
1745
   nnoremap <buffer> <silent> md        :<c-u>call <SID>NetrwMarkFileDiff(0)<cr>
1780
1746
   nnoremap <buffer> <silent> me        :<c-u>call <SID>NetrwMarkFileEdit(0)<cr>
1781
1747
   nnoremap <buffer> <silent> mf        :<c-u>call <SID>NetrwMarkFile(0,<SID>NetrwGetWord())<cr>
 
1748
   nnoremap <buffer> <silent> mg        :<c-u>call <SID>NetrwMarkFileGrep(0)<cr>
 
1749
   nnoremap <buffer> <silent> mh        :<c-u>call <SID>NetrwMarkHideSfx(0)<cr>
1782
1750
   nnoremap <buffer> <silent> mm        :<c-u>call <SID>NetrwMarkFileMove(0)<cr>
1783
1751
   nnoremap <buffer> <silent> mp        :<c-u>call <SID>NetrwMarkFilePrint(0)<cr>
1784
1752
   nnoremap <buffer> <silent> mr        :<c-u>call <SID>NetrwMarkFileRegexp(0)<cr>
 
1753
   nnoremap <buffer> <silent> ms        :<c-u>call <SID>NetrwMarkFileSource(0)<cr>
1785
1754
   nnoremap <buffer> <silent> mT        :<c-u>call <SID>NetrwMarkFileTag(0)<cr>
1786
1755
   nnoremap <buffer> <silent> mt        :<c-u>call <SID>NetrwMarkFileTgt(0)<cr>
 
1756
   nnoremap <buffer> <silent> mu        :<c-u>call <SID>NetrwUnMarkFile(0)<cr>
1787
1757
   nnoremap <buffer> <silent> mx        :<c-u>call <SID>NetrwMarkFileExe(0)<cr>
1788
1758
   nnoremap <buffer> <silent> mz        :<c-u>call <SID>NetrwMarkFileCompress(0)<cr>
1789
1759
   nnoremap <buffer> <silent> gb        :<c-u>call <SID>NetrwBookmarkDir(1,b:netrw_cur)<cr>
 
1760
   nnoremap <buffer> <silent> gh        :<c-u>call <SID>NetrwHidden(0)<cr>
1790
1761
   nnoremap <buffer> <silent> C         :let g:netrw_chgwin= winnr()<cr>
1791
1762
   nnoremap <buffer> <silent> i         :call <SID>NetrwListStyle(0)<cr>
1792
1763
   nnoremap <buffer> <silent> o         :call <SID>NetrwSplit(0)<cr>
1793
1764
   nnoremap <buffer> <silent> O         :call <SID>NetrwObtain(0)<cr>
1794
1765
   nnoremap <buffer> <silent> p         :call <SID>NetrwPreview(<SID>NetrwBrowseChgDir(1,<SID>NetrwGetWord(),1))<cr>
1795
1766
   nnoremap <buffer> <silent> P         :call <SID>NetrwPrevWinOpen(0)<cr>
1796
 
   nnoremap <buffer> <silent> q         :<c-u>call <SID>NetrwBookmarkDir(2,b:netrw_curdir)<cr>
 
1767
   nnoremap <buffer> <silent> qb        :<c-u>call <SID>NetrwBookmarkDir(2,b:netrw_curdir)<cr>
 
1768
   nnoremap <buffer> <silent> mB        :<c-u>call <SID>NetrwBookmarkDir(6,b:netrw_curdir)<cr>
 
1769
   nnoremap <buffer> <silent> qf        :<c-u>call <SID>NetrwFileInfo(0,<SID>NetrwGetWord())<cr>
1797
1770
   nnoremap <buffer> <silent> r         :let g:netrw_sort_direction= (g:netrw_sort_direction =~ 'n')? 'r' : 'n'<bar>exe "norm! 0"<bar>call <SID>NetrwBrowse(0,<SID>NetrwBrowseChgDir(0,'./'))<cr>
1798
1771
   nnoremap <buffer> <silent> s         :call <SID>NetrwSortStyle(0)<cr>
1799
1772
   nnoremap <buffer> <silent> S         :call <SID>NetSortSequence(0)<cr>
1831
1804
endfun
1832
1805
 
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.">")
 
1816
  return repat
 
1817
endfun
 
1818
 
 
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)
 
1830
 
 
1831
  if a:chg == 0
 
1832
   " bookmark the current directory
 
1833
"   call Decho("(user: <b>) bookmark the current directory")
 
1834
   if v:count > 0
 
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
 
1841
    endif
 
1842
   else
 
1843
    " handle no count specified
 
1844
    let g:NETRW_BOOKMARKMAX                       = g:NETRW_BOOKMARKMAX + 1
 
1845
    let g:NETRW_BOOKMARKDIR_{g:NETRW_BOOKMARKMAX} = a:curdir
 
1846
   endif
 
1847
   echo "bookmarked the current directory"
 
1848
 
 
1849
  elseif a:chg == 1
 
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}
 
1854
   else
 
1855
    echomsg "Sorry, bookmark#".v:count." doesn't exist!"
 
1856
   endif
 
1857
 
 
1858
  elseif a:chg == 2
 
1859
"   redraw!
 
1860
   let didwork= 0
 
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."]")
 
1865
    let cnt= 0
 
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}
 
1870
      let didwork= 1
 
1871
     endif
 
1872
     let cnt= cnt + 1
 
1873
    endwhile
 
1874
   endif
 
1875
 
 
1876
   " list directory history
 
1877
   let cnt     = g:NETRW_DIRHIST_CNT
 
1878
   let first   = 1
 
1879
   let histcnt = 0
 
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}
 
1886
     let didwork= 1
 
1887
    endif
 
1888
    let first = 0
 
1889
    let cnt   = ( cnt - 1 ) % g:netrw_dirhistmax
 
1890
    if cnt < 0
 
1891
     let cnt= cnt + g:netrw_dirhistmax
 
1892
    endif
 
1893
   endwhile
 
1894
   if didwork
 
1895
    call inputsave()|call input("Press <cr> to continue")|call inputrestore()
 
1896
   endif
 
1897
 
 
1898
  elseif a:chg == 3
 
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}.">")
 
1906
   endif
 
1907
 
 
1908
  elseif a:chg == 4
 
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
 
1914
   endif
 
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")
 
1918
     setlocal ma noro
 
1919
"     call Decho("setlocal ma noro")
 
1920
     %d
 
1921
     setlocal nomod
 
1922
"     call Decho("setlocal nomod")
 
1923
    endif
 
1924
"    call Decho("exe e! ".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT})
 
1925
    exe "e! ".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}
 
1926
   else
 
1927
    let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT + 1 ) % g:netrw_dirhistmax
 
1928
    echo "Sorry, no predecessor directory exists yet"
 
1929
   endif
 
1930
 
 
1931
  elseif a:chg == 5
 
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")
 
1938
     setlocal ma noro
 
1939
"     call Decho("setlocal ma noro")
 
1940
     %d
 
1941
"     call Decho("removed all lines from buffer (%d)")
 
1942
     setlocal nomod
 
1943
"     call Decho("setlocal nomod")
 
1944
    endif
 
1945
"    call Decho("exe e! ".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT})
 
1946
    exe "e! ".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}
 
1947
   else
 
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
 
1951
    endif
 
1952
    echo "Sorry, no successor directory exists yet"
 
1953
   endif
 
1954
 
 
1955
  elseif a:chg == 6
 
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
 
1961
 
 
1962
   elseif v:count > 0
 
1963
"    call Decho("delete by shifting bookmark#".v:count."<".g:NETRW_BOOKMARKDIR_{v:count}.">")
 
1964
    let cnt= v:count
 
1965
    while cnt < g:NETRW_BOOKMARKMAX
 
1966
     let g:NETRW_BOOKMARKDIR_{cnt} = g:NETRW_BOOKMARKDIR_{(cnt+1)}
 
1967
     let cnt                       = cnt + 1
 
1968
    endwhile
 
1969
    unlet g:NETRW_BOOKMARKDIR_{g:NETRW_BOOKMARKMAX}
 
1970
    let g:NETRW_BOOKMARKMAX= g:NETRW_BOOKMARKMAX - 1
 
1971
 
 
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.">")
 
1975
    let cnt= 1
 
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)}
 
1983
        let cnt                       = cnt + 1
 
1984
       endwhile
 
1985
      endif
 
1986
      unlet g:NETRW_BOOKMARKDIR_{g:NETRW_BOOKMARKMAX}
 
1987
      let g:NETRW_BOOKMARKMAX= g:NETRW_BOOKMARKMAX - 1
 
1988
     endif
 
1989
     let cnt= cnt + 1
 
1990
    endwhile
 
1991
   endif
 
1992
 
 
1993
  endif
 
1994
  call s:NetrwBookmarkMenu()
 
1995
"  call Dret("NetrwBookmarkDir")
 
1996
endfun
 
1997
 
 
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!")
1842
2008
 
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)
 
2013
   return
 
2014
  endif
 
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()")
 
2018
   return
 
2019
  endif
 
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()")
1846
2023
   return
1847
2024
  endif
1848
2025
 
1849
2026
  call s:NetrwOptionSave("w:")
1850
2027
  call s:NetrwSafeOptions()
1851
2028
 
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
1857
 
   2match none
 
2032
   exe "2match netrwMarkFile /".s:netrwmarkfilemtch_{bufnr("%")}."/"
1858
2033
  endif
1859
2034
 
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().">")
1865
2040
 
1866
2041
  elseif !a:islocal && a:dirname !~ '[\/]$' && a:dirname !~ '^"'
1878
2053
   mark '
1879
2054
   call s:NetrwEnew(a:dirname)
1880
2055
   setlocal ma noro
 
2056
"   call Decho("setlocal ma noro")
1881
2057
   let b:netrw_curdir= a:dirname
1882
 
"   call Decho("exe silent! keepalt file ".s:method."://".s:user.s:machine."/".escape(s:path,g:netrw_cd_escape)." (bt=".&bt.")")
1883
 
   exe "silent! keepalt file ".s:method."://".s:user.s:machine."/".escape(s:path,g:netrw_cd_escape)
 
2058
"   call Decho("exe silent! keepalt file ".s:method."://".s:user.s:machine."/".fnameescape(s:path)." (bt=".&bt.")")
 
2059
   exe "silent! keepalt file ".s:method."://".s:user.s:machine."/".fnameescape(s:path)
1884
2060
   exe "silent keepalt doau BufReadPre ".s:fname
1885
2061
   silent call netrw#NetRead(2,s:method."://".s:user.s:machine."/".s:path)
1886
2062
   if s:path !~ '.tar.bz2$' && s:path !~ '.tar.gz'
1891
2067
   " save certain window-oriented variables into buffer-oriented variables {{{3
1892
2068
   call s:SetBufWinVars()
1893
2069
   call s:NetrwOptionRestore("w:")
1894
 
   setlocal noma nomod nowrap
 
2070
   setlocal ma nomod
1895
2071
 
1896
 
"   call Dret("NetrwBrowse : file<".s:fname.">")
 
2072
"   call Decho("ro=".&ro." ma=".&ma." mod=".&mod." wrap=".&wrap)
 
2073
"   call Dret("s:NetrwBrowse : file<".s:fname.">")
1897
2074
   return
1898
2075
  endif
1899
2076
 
1905
2082
  let dirname                = a:dirname
1906
2083
  let s:last_sort_by         = g:netrw_sort_by
1907
2084
 
1908
 
  call s:NetrwMenu(1)                      " set up menu {{{3
1909
 
  if s:NetrwGetBuffer(a:islocal,dirname)   " set up buffer {{{3
 
2085
  " set up menu {{{3
 
2086
  call s:NetrwMenu(1)
 
2087
 
 
2088
  " set up buffer {{{3
 
2089
  let reusing= s:NetrwGetBuffer(a:islocal,dirname)
 
2090
  " maintain markfile highlighting
 
2091
  if exists("s:netrwmarkfilemtch_{bufnr('%')}") && s:netrwmarkfilemtch_{bufnr("%")} != ""
 
2092
"   call Decho("bufnr(%)=".bufnr('%'))
 
2093
"   call Decho("exe 2match netrwMarkFile /".s:netrwmarkfilemtch_{bufnr("%")}."/")
 
2094
   exe "2match netrwMarkFile /".s:netrwmarkfilemtch_{bufnr("%")}."/"
 
2095
  else
 
2096
"   call Decho("2match none")
 
2097
   2match none
 
2098
  endif
 
2099
  if reusing
1910
2100
   call s:NetrwOptionRestore("w:")
1911
2101
   setlocal noma nomod nowrap
1912
 
"   call Dret("NetrwBrowse : re-using buffer")
 
2102
"   call Decho("ro=".&ro." ma=".&ma." mod=".&mod." wrap=".&wrap)
 
2103
"   call Dret("s:NetrwBrowse : re-using buffer")
1913
2104
   return
1914
2105
  endif
1915
2106
 
1946
2137
  " handle g:netrw_keepdir: set vim's current directory to netrw's notion of the current directory {{{3
1947
2138
   if !g:netrw_keepdir
1948
2139
"    call Decho("handle g:netrw_keepdir=".g:netrw_keepdir.": getcwd<".getcwd()."> acd=".&acd)
1949
 
"    call Decho('exe cd '.escape(b:netrw_curdir,g:netrw_cd_escape))
1950
 
    try
1951
 
     exe 'cd '.escape(b:netrw_curdir,g:netrw_cd_escape)
1952
 
    catch /^Vim\%((\a\+)\)\=:E472/
1953
 
     call netrw#ErrorMsg(s:ERROR,"unable to change directory to <".b:netrw_curdir."> (permissions?)",33)
1954
 
     if exists("w:netrw_prvdir")
1955
 
      let b:netrw_curdir= w:netrw_prvdir
1956
 
     else
1957
 
      call s:NetrwOptionRestore("w:")
1958
 
      setlocal noma nomod nowrap
1959
 
      let b:netrw_curdir= dirname
1960
 
"      call Dret("NetrwBrowse : reusing buffer#".(exists("bufnum")? bufnum : 'N/A')."<".dirname."> getcwd<".getcwd().">")
1961
 
      return
1962
 
     endif
1963
 
    endtry
 
2140
"    call Decho("l:acd".(exists("&l:acd")? "=".&l:acd : " doesn't exist"))
 
2141
    if !exists("&l:acd") || !&l:acd
 
2142
"     call Decho('exe keepjumps lcd '.fnameescape(b:netrw_curdir))
 
2143
     try
 
2144
      exe 'keepjumps lcd '.fnameescape(b:netrw_curdir)
 
2145
     catch /^Vim\%((\a\+)\)\=:E472/
 
2146
      call netrw#ErrorMsg(s:ERROR,"unable to change directory to <".b:netrw_curdir."> (permissions?)",61)
 
2147
      if exists("w:netrw_prvdir")
 
2148
       let b:netrw_curdir= w:netrw_prvdir
 
2149
      else
 
2150
       call s:NetrwOptionRestore("w:")
 
2151
       setlocal noma nomod nowrap
 
2152
       let b:netrw_curdir= dirname
 
2153
"       call Decho("ro=".&ro." ma=".&ma." mod=".&mod." wrap=".&wrap)
 
2154
"       call Dret("s:NetrwBrowse : reusing buffer#".(exists("bufnum")? bufnum : 'N/A')."<".dirname."> getcwd<".getcwd().">")
 
2155
       return
 
2156
      endif
 
2157
     endtry
 
2158
    endif
1964
2159
   endif
1965
2160
 
1966
2161
  " --------------------------------
1971
2166
 
1972
2167
   " analyze a:dirname and g:netrw_list_cmd {{{4
1973
2168
"   call Decho("b:netrw_curdir<".(exists("b:netrw_curdir")? b:netrw_curdir : "doesn't exist")."> a:dirname<".a:dirname.">")
1974
 
   if a:dirname == "NetrwTreeListing"
 
2169
   if a:dirname =~ "^NetrwTreeListing\>"
1975
2170
    let dirname= b:netrw_curdir
1976
 
"    call Decho("(dirname was NetrwTreeListing) dirname<".dirname.">")
 
2171
"    call Decho("(dirname was ".a:dirname.") dirname<".dirname.">")
1977
2172
   elseif exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("b:netrw_curdir")
1978
2173
    let dirname= substitute(b:netrw_curdir,'\\','/','g')
1979
2174
    if dirname !~ '/$'
1991
2186
    if !exists("g:netrw_quiet")
1992
2187
     call netrw#ErrorMsg(s:ERROR,"netrw doesn't understand your dirname<".dirname.">",20)
1993
2188
    endif
1994
 
     call s:NetrwOptionRestore("w:")
1995
 
     setlocal noma nomod nowrap
1996
 
"    call Dret("NetrwBrowse : badly formatted dirname<".dirname.">")
 
2189
    call s:NetrwOptionRestore("w:")
 
2190
    setlocal noma nomod nowrap
 
2191
"    call Decho("ro=".&ro." ma=".&ma." mod=".&mod." wrap=".&wrap)
 
2192
"    call Dret("s:NetrwBrowse : badly formatted dirname<".dirname.">")
1997
2193
    return
1998
2194
   endif
1999
2195
   let b:netrw_curdir= dirname
2006
2202
  call s:BrowserMaps(a:islocal)
2007
2203
  call s:PerformListing(a:islocal)
2008
2204
 
2009
 
"  call Dret("NetrwBrowse : did PerformListing")
 
2205
"  call Decho("ro=".&ro." ma=".&ma." mod=".&mod." wrap=".&wrap)
 
2206
"  call Dret("s:NetrwBrowse : did PerformListing")
2010
2207
  return
2011
2208
endfun
2012
2209
 
2013
2210
" ---------------------------------------------------------------------
 
2211
" s:NetrwFileInfo: supports qf (query for file information) {{{2
 
2212
fun! s:NetrwFileInfo(islocal,fname)
 
2213
"  call Dfunc("s:NetrwFileInfo(islocal=".a:islocal." fname<".a:fname.">)")
 
2214
  if a:islocal
 
2215
   if (has("unix") || has("macunix")) && executable("/bin/ls")
 
2216
    if exists("b:netrw_curdir")
 
2217
"     call Decho('using ls with b:netrw_curdir<'.b:netrw_curdir.'>')
 
2218
     if b:netrw_curdir =~ '/$'
 
2219
      echo system("/bin/ls -lsad ".shellescape(b:netrw_curdir.a:fname))
 
2220
     else
 
2221
      echo system("/bin/ls -lsad ".shellescape(b:netrw_curdir."/".a:fname))
 
2222
     endif
 
2223
    else
 
2224
"     call Decho('using ls '.a:fname." using cwd<".getcwd().">")
 
2225
     echo system("/bin/ls -lsad ".shellescape(a:fname))
 
2226
    endif
 
2227
   else
 
2228
    " use vim functions to return information about file below cursor
 
2229
"    call Decho("using vim functions to query for file info")
 
2230
    if !isdirectory(a:fname) && !filereadable(a:fname) && a:fname =~ '[*@/]'
 
2231
     let fname= substitute(a:fname,".$","","")
 
2232
    else
 
2233
     let fname= a:fname
 
2234
    endif
 
2235
    let t  = getftime(fname)
 
2236
    let sz = getfsize(fname)
 
2237
    echo a:fname.":  ".sz."  ".strftime(g:netrw_timefmt,getftime(fname))
 
2238
"    call Decho(fname.":  ".sz."  ".strftime(g:netrw_timefmt,getftime(fname)))
 
2239
   endif
 
2240
  else
 
2241
   echo "sorry, \"qf\" not supported yet for remote files"
 
2242
  endif
 
2243
"  call Dret("s:NetrwFileInfo")
 
2244
endfun
 
2245
 
 
2246
" ---------------------------------------------------------------------
2014
2247
" s:NetrwGetBuffer: {{{2
2015
2248
"   returns 0=cleared buffer
2016
2249
"           1=re-used buffer
2017
2250
fun! s:NetrwGetBuffer(islocal,dirname)
2018
 
"  call Dfunc("s:NetrwGetBuffer(islocal=".a:islocal." dirname<".a:dirname.">)")
 
2251
"  call Dfunc("s:NetrwGetBuffer(islocal=".a:islocal." dirname<".a:dirname.">) liststyle=".g:netrw_liststyle)
 
2252
  let dirname= a:dirname
2019
2253
 
2020
2254
  " re-use buffer if possible {{{3
2021
2255
"  call Decho("--re-use a buffer if possible--")
2022
2256
  if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST
2023
2257
   " find NetrwTreeList buffer if there is one
2024
 
"   call Decho("find NetrwTreeList buffer if there is one")
2025
 
   let dirname= "NetrwTreeListing"
2026
 
   let bufnum = bufnr('\<NetrwTreeListing\>')
2027
 
   if bufnum != -1
 
2258
   if exists("w:netrw_treebufnr") && w:netrw_treebufnr > 0
 
2259
"    call Decho("  re-use w:netrw_treebufnr=".w:netrw_treebufnr)
 
2260
    let eikeep= &ei
 
2261
    set ei=all
 
2262
    exe "b ".w:netrw_treebufnr
 
2263
    let &ei= eikeep
2028
2264
"    call Dret("s:NetrwGetBuffer : bufnum#".bufnum."<NetrwTreeListing>")
2029
2265
    return
2030
2266
   endif
 
2267
   let bufnum= -1
 
2268
"   call Decho("  liststyle=TREE but w:netrw_treebufnr doesn't exist")
2031
2269
 
2032
2270
  else
2033
2271
   " find buffer number of buffer named precisely the same as dirname {{{3
2034
2272
"   call Decho("--find buffer numnber of buffer named precisely the same as dirname--")
2035
2273
"   call Dredir("ls!")
2036
 
   let dirname= a:dirname
2037
 
"   call Decho("find buffer<".dirname.">'s number ")
2038
 
   let bufnum= bufnr(escape(dirname,'\'))
2039
 
"   call Decho("bufnr(dirname<".escape(dirname,'\').">)=".bufnum)
 
2274
 
 
2275
   " get dirname and associated buffer number
 
2276
   let bufnum  = bufnr(escape(dirname,'\'))
 
2277
"   call Decho("  find buffer<".dirname.">'s number ")
 
2278
"   call Decho("  bufnr(dirname<".escape(dirname,'\').">)=".bufnum)
 
2279
 
2040
2280
   if bufnum < 0 && dirname !~ '/$'
2041
2281
    " trying appending a trailing /
2042
 
"    call Decho("try appending a trailing / to dirname<".dirname.">")
 
2282
"    call Decho("  try appending a trailing / to dirname<".dirname.">")
2043
2283
    let bufnum= bufnr(escape(dirname.'/','\'))
2044
2284
    if bufnum > 0
2045
2285
     let dirname= dirname.'/'
2046
2286
    endif
2047
2287
   endif
 
2288
 
2048
2289
   if bufnum < 0 && dirname =~ '/$'
2049
2290
    " trying removing a trailing /
2050
 
"    call Decho("try removing a trailing / from dirname<".dirname.">")
 
2291
"    call Decho("  try removing a trailing / from dirname<".dirname.">")
2051
2292
    let bufnum= bufnr(escape(substitute(dirname,'/$','',''),'\'))
2052
2293
    if bufnum > 0
2053
2294
     let dirname= substitute(dirname,'/$','','')
2054
2295
    endif
2055
2296
   endif
2056
 
"   call Decho("findbuf1: bufnum=bufnr('".dirname."')=".bufnum." bufname(".bufnum.")<".bufname(bufnum)."> (initial)")
2057
 
   let ibuf= 1
 
2297
 
 
2298
"   call Decho("  findbuf1: bufnum=bufnr('".dirname."')=".bufnum." bufname(".bufnum.")<".bufname(bufnum)."> (initial)")
2058
2299
   " note: !~ was used just below, but that means using ../ to go back would match (ie. abc/def/  and abc/ matches)
2059
 
   if bufnum > 0 && bufname(bufnum) != dirname
 
2300
   if bufnum > 0 && bufname(bufnum) != dirname && bufname(bufnum) != '.'
 
2301
    " handle approximate matches
 
2302
"    call Decho("  handling approx match: bufnum#%d<".bufname(bufnum)."> approx= dirname<".dirname.">")
 
2303
    let ibuf    = 1
2060
2304
    let buflast = bufnr("$")
2061
 
"    call Decho("findbuf2: buflast=".buflast)
 
2305
"    call Decho("  findbuf2: buflast=".buflast)
2062
2306
    while ibuf <= buflast
2063
2307
     let bname= substitute(bufname(ibuf),'\\','/','g')
2064
 
"     call Decho("findbuf3: dirname<".dirname."> bufname(".ibuf.")<".bname.">")
2065
 
     if bname != '' && bname !~ '/' && dirname =~ '/'.bname.'$' | break | endif
2066
 
     if bname =~ '^'.dirname.'/\=$' | break | endif
2067
 
     if dirname =~ '^'.bname.'/$' | break | endif
 
2308
"     call Decho("  findbuf3: dirname<".dirname."> bufname(".ibuf.")<".bname.">")
 
2309
     if bname != '' && bname !~ '/' && dirname =~ '/'.bname.'/\=$' | break | endif
 
2310
     if bname   =~ '^'.dirname.'/\=$' | break | endif
 
2311
     if dirname =~ '^'.bname.'/$'     | break | endif
2068
2312
     let ibuf= ibuf + 1
2069
2313
    endwhile
2070
2314
    if ibuf > buflast
2072
2316
    else
2073
2317
     let bufnum= ibuf
2074
2318
    endif
2075
 
"    call Decho("findbuf4: bufnum=".bufnum)
 
2319
"    call Decho("  findbuf4: bufnum=".bufnum." (ibuf=".ibuf." buflast=".buflast.")")
2076
2320
   endif
2077
2321
  endif
2078
2322
 
2079
2323
  " get enew buffer and name it -or- re-use buffer {{{3
2080
 
"  call Decho("--get enewbuffer and name it -or- re-use buffer--")
 
2324
"  call Decho("--get enew buffer and name it OR re-use buffer-- (bufnum=".bufnum.")")
2081
2325
  mark '
2082
2326
  if bufnum < 0 || !bufexists(bufnum)
2083
 
"   call Decho("get enew buffer")
2084
2327
   call s:NetrwEnew(dirname)
 
2328
"   call Decho("  got enew buffer#".bufnr("%")." (altbuf<".expand("#").">)")
2085
2329
   " name the buffer
2086
2330
   if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST
2087
 
"    call Decho('silent! keepalt file NetrwTreeListing')
2088
 
    silent! keepalt file NetrwTreeListing
 
2331
    " Got enew buffer; transform into a NetrwTreeListing
 
2332
"    call Decho("--transform enew buffer#".bufnr("%")." into a NetrwTreeListing --")
 
2333
    if !exists("s:netrw_treelistnum")
 
2334
     let s:netrw_treelistnum= 1
 
2335
    else
 
2336
     let s:netrw_treelistnum= s:netrw_treelistnum + 1
 
2337
    endif
 
2338
    let w:netrw_treebufnr= bufnr("%")
 
2339
"    call Decho("  exe silent! keepalt file NetrwTreeListing ".s:netrw_treelistnum)
 
2340
    exe 'silent! keepalt file NetrwTreeListing\ '.s:netrw_treelistnum
2089
2341
    nnoremap <silent> <buffer> [        :silent call <SID>TreeListMove('[')<cr>
2090
2342
    nnoremap <silent> <buffer> ]        :silent call <SID>TreeListMove(']')<cr>
2091
2343
    nnoremap <silent> <buffer> [[       :silent call <SID>TreeListMove('[')<cr>
2092
2344
    nnoremap <silent> <buffer> ]]       :silent call <SID>TreeListMove(']')<cr>
 
2345
"    call Decho("  tree listing#".s:netrw_treelistnum." bufnr=".w:netrw_treebufnr)
2093
2346
   else
2094
 
"    call Decho('exe silent! keepalt file '.escape(dirname,g:netrw_cd_escape))
2095
2347
"    let v:errmsg= "" " Decho
2096
 
    let escdirname= escape(dirname,g:netrw_cd_escape)
 
2348
    let escdirname= fnameescape(dirname)
 
2349
"    call Decho("  errmsg<".v:errmsg."> bufnr(".escdirname.")=".bufnr(escdirname)."<".bufname(bufnr(escdirname)).">")
 
2350
"    call Decho('  exe silent! keepalt file '.escdirname)
2097
2351
    exe 'silent! keepalt file '.escdirname
2098
 
"    call Decho("errmsg<".v:errmsg."> bufnr(".escdirname.")=".bufnr(escdirname)."<".bufname(bufnr(escdirname)).">")
 
2352
"    call Decho("  errmsg<".v:errmsg."> bufnr(".escdirname.")=".bufnr(escdirname)."<".bufname(bufnr(escdirname)).">")
2099
2353
   endif
2100
 
"   call Decho("named enew buffer#".bufnr("%")."<".bufname("%").">")
 
2354
"   call Decho("  named enew buffer#".bufnr("%")."<".bufname("%").">")
2101
2355
 
2102
2356
  else " Re-use the buffer
2103
 
 
2104
 
"   call Decho("re-use buffer#".bufnum.":")
 
2357
"   call Decho("--re-use buffer#".bufnum.": --")
2105
2358
   let eikeep= &ei
2106
2359
   set ei=all
2107
2360
   if getline(2) =~ '^" Netrw Directory Listing'
2108
 
"    call Decho("re-use buffer#".bufnum."<".((bufnum > 0)? bufname(bufnum) : "")."> using:  keepalt b ".bufnum)
 
2361
"    call Decho("  re-use buffer#".bufnum."<".((bufnum > 0)? bufname(bufnum) : "")."> using:  keepalt b ".bufnum)
2109
2362
    exe "keepalt b ".bufnum
2110
2363
   else
2111
 
"    call Decho("reusing buffer#".bufnum."<".((bufnum > 0)? bufname(bufnum) : "")."> using:  b ".bufnum)
 
2364
"    call Decho("  reusing buffer#".bufnum."<".((bufnum > 0)? bufname(bufnum) : "")."> using:  b ".bufnum)
2112
2365
    exe "b ".bufnum
2113
2366
   endif
 
2367
   if bufname("%") == '.'
 
2368
    exe "silent! keepalt file ".escape(getcwd(),' ')
 
2369
   endif
2114
2370
   let &ei= eikeep
2115
2371
   if line("$") <= 1
2116
2372
    call s:NetrwListSettings(a:islocal)
2117
2373
"    call Dret("s:NetrwGetBuffer 0 : re-using buffer#".bufnr("%").", but its empty, so refresh it")
2118
2374
    return 0
2119
2375
   elseif exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST
2120
 
"    call Decho("clear buffer<".expand("%")."> with :%d")
 
2376
"    call Decho("--re-use tree listing--")
 
2377
"    call Decho("  clear buffer<".expand("%")."> with :%d")
2121
2378
    silent %d
2122
2379
    call s:NetrwListSettings(a:islocal)
2123
2380
"    call Dret("s:NetrwGetBuffer 0 : re-using buffer#".bufnr("%").", but treelist mode always needs a refresh")
2136
2393
"  call Decho("--do netrw settings: make this buffer not-a-file, modifiable, not line-numbered, etc--")
2137
2394
  let fname= expand("%")
2138
2395
  call s:NetrwListSettings(a:islocal)
2139
 
  exe "file ".escape(fname,' ')
 
2396
  exe "keepalt file ".escape(fname,' ')
2140
2397
 
2141
2398
  " delete all lines from buffer {{{3
2142
2399
"  call Decho("--delete all lines from buffer--")
2143
 
"  call Decho("clear buffer<".expand("%")."> with :%d")
 
2400
"  call Decho("  clear buffer<".expand("%")."> with :%d")
2144
2401
  keepalt silent! %d
2145
2402
 
2146
2403
"  call Dret("s:NetrwGetBuffer 0 : buf#".bufnr("%"))
2148
2405
endfun
2149
2406
 
2150
2407
" ---------------------------------------------------------------------
2151
 
"  s:NetrwGetWord: it gets the directory named under the cursor {{{2
 
2408
" s:NetrwGetcwd: get the current directory. {{{2
 
2409
"   Change backslashes to forward slashes, if any.
 
2410
"   If doesc is true, escape certain troublesome characters
 
2411
fun! s:NetrwGetcwd(doesc)
 
2412
"  call Dfunc("NetrwGetcwd(doesc=".a:doesc.")")
 
2413
  let curdir= substitute(getcwd(),'\\','/','ge')
 
2414
  if curdir !~ '[\/]$'
 
2415
   let curdir= curdir.'/'
 
2416
  endif
 
2417
  if a:doesc
 
2418
   let curdir= fnameescape(curdir)
 
2419
  endif
 
2420
"  call Dret("NetrwGetcwd <".curdir.">")
 
2421
  return curdir
 
2422
endfun
 
2423
 
 
2424
" ---------------------------------------------------------------------
 
2425
"  s:NetrwGetWord: it gets the directory/file named under the cursor {{{2
2152
2426
fun! s:NetrwGetWord()
2153
 
"  call Dfunc("NetrwGetWord() line#".line(".")." liststyle=".g:netrw_liststyle." virtcol=".virtcol("."))
 
2427
"  call Dfunc("s:NetrwGetWord() line#".line(".")." liststyle=".g:netrw_liststyle." virtcol=".virtcol("."))
2154
2428
  call s:UseBufWinVars()
2155
2429
 
2156
2430
  " insure that w:netrw_liststyle is set up
2168
2442
"   call Decho("active banner handling")
2169
2443
   norm! 0
2170
2444
   let dirname= "./"
2171
 
   let curline= getline(".")
 
2445
   let curline= getline('.')
2172
2446
 
2173
2447
   if curline =~ '"\s*Sorted by\s'
2174
2448
    norm s
2196
2470
  elseif w:netrw_liststyle == s:THINLIST
2197
2471
"   call Decho("thin column handling")
2198
2472
   norm! 0
2199
 
   let dirname= getline(".")
 
2473
   let dirname= getline('.')
2200
2474
 
2201
2475
  elseif w:netrw_liststyle == s:LONGLIST
2202
2476
"   call Decho("long column handling")
2203
2477
   norm! 0
2204
 
   let dirname= substitute(getline("."),'^\(\%(\S\+ \)*\S\+\).\{-}$','\1','e')
 
2478
   let dirname= substitute(getline('.'),'^\(\%(\S\+ \)*\S\+\).\{-}$','\1','e')
2205
2479
 
2206
2480
  elseif w:netrw_liststyle == s:TREELIST
2207
2481
"   call Decho("treelist handling")
2208
 
   let dirname= substitute(getline("."),'^\(| \)*','','e')
 
2482
   let dirname= substitute(getline('.'),'^\(| \)*','','e')
2209
2483
 
2210
2484
  else
2211
2485
"   call Decho("obtain word from wide listing")
2212
 
   let dirname= getline(".")
 
2486
   let dirname= getline('.')
2213
2487
 
2214
2488
   if !exists("b:netrw_cpf")
2215
2489
    let b:netrw_cpf= 0
2216
2490
    exe 'silent keepjumps '.w:netrw_bannercnt.',$g/^./if virtcol("$") > b:netrw_cpf|let b:netrw_cpf= virtcol("$")|endif'
2217
 
"    call Decho("computed cpf")
 
2491
"   call Decho("computed cpf=".b:netrw_cpf)
2218
2492
   endif
2219
2493
 
2220
2494
"   call Decho("buf#".bufnr("%")."<".bufname("%").">")
2221
2495
   let filestart = (virtcol(".")/b:netrw_cpf)*b:netrw_cpf
2222
2496
"   call Decho("filestart= ([virtcol=".virtcol(".")."]/[b:netrw_cpf=".b:netrw_cpf."])*b:netrw_cpf=".filestart."  bannercnt=".w:netrw_bannercnt)
2223
2497
"   call Decho("1: dirname<".dirname.">")
2224
 
   if filestart > 0|let dirname= substitute(dirname,'^.\{'.filestart.'}','','')|endif
 
2498
   if filestart == 0
 
2499
    norm! 0ma
 
2500
   else
 
2501
    call cursor(line("."),filestart+1)
 
2502
    norm! ma
 
2503
   endif
 
2504
   let rega= @a
 
2505
   call cursor(line("."),filestart+b:netrw_cpf+1)
 
2506
   norm! "ay`a
 
2507
   let dirname = @a
 
2508
   let @a      = rega
2225
2509
"   call Decho("2: dirname<".dirname.">")
2226
 
   let dirname   = substitute(dirname,'^\(.\{'.b:netrw_cpf.'}\).*$','\1','e')
 
2510
   let dirname= substitute(dirname,'\s\+$','','e')
2227
2511
"   call Decho("3: dirname<".dirname.">")
2228
 
   let dirname   = substitute(dirname,'\s\+$','','e')
2229
 
"   call Decho("4: dirname<".dirname.">")
2230
2512
  endif
2231
2513
 
2232
2514
  " symlinks are indicated by a trailing "@".  Remove it before further processing.
2233
2515
  let dirname= substitute(dirname,"@$","","")
2234
2516
 
2235
 
"  call Dret("NetrwGetWord <".dirname.">")
 
2517
  " executables are indicated by a trailing "*".  Remove it before further processing.
 
2518
  let dirname= substitute(dirname,"\*$","","")
 
2519
 
 
2520
"  call Dret("s:NetrwGetWord <".dirname.">")
2236
2521
  return dirname
2237
2522
endfun
2238
2523
 
2242
2527
"  call Dfunc("s:NetrwListSettings(islocal=".a:islocal.")")
2243
2528
  let fname= bufname("%")
2244
2529
  setlocal bt=nofile nobl ma nonu nowrap noro
2245
 
  exe "file ".escape(fname,' ')
 
2530
"  call Decho("setlocal bt=nofile nobl ma nonu nowrap noro")
 
2531
  exe "keepalt file ".escape(fname,' ')
2246
2532
  if g:netrw_use_noswf
2247
2533
   setlocal noswf
2248
2534
  endif
2259
2545
endfun
2260
2546
 
2261
2547
" ---------------------------------------------------------------------
2262
 
" s:PerformListing: {{{2
2263
 
fun! s:PerformListing(islocal)
2264
 
"  call Dfunc("s:PerformListing(islocal=".a:islocal.") buf(%)=".bufnr("%")."<".bufname("%").">")
2265
 
 
2266
 
  call s:NetrwSafeOptions()
2267
 
  setlocal noro ma
2268
 
 
2269
 
"  if exists("g:netrw_silent") && g:netrw_silent == 0 && &ch >= 1       " Decho
2270
 
"   call Decho("(netrw) Processing your browsing request...")
2271
 
"  endif                                                                " Decho
2272
 
 
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")
2277
 
   keepjumps %d
2278
 
  endif
2279
 
 
2280
 
  " save current directory on directory history list
2281
 
  call s:NetrwBookmarkDir(3,b:netrw_curdir)
2282
 
 
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
2288
 
  keepjumps 1d
2289
 
  let w:netrw_bannercnt= 3
2290
 
  exe "keepjumps ".w:netrw_bannercnt
2291
 
 
2292
 
  let sortby= g:netrw_sort_by
2293
 
  if g:netrw_sort_direction =~ "^r"
2294
 
   let sortby= sortby." reversed"
2295
 
  endif
2296
 
 
2297
 
  " Sorted by... {{{3
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")
2301
 
   " 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").">")
 
2559
 
 
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')
 
2564
 
 
2565
  elseif w:netrw_liststyle == s:LONGLIST
 
2566
   " use long list
 
2567
"   call Decho("use long list")
 
2568
   let g:netrw_list_cmd = g:netrw_list_cmd." -l"
 
2569
 
 
2570
  elseif w:netrw_liststyle == s:WIDELIST
 
2571
   " give wide list
 
2572
"   call Decho("use wide list")
 
2573
   let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge')
 
2574
 
 
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')
 
2578
 
2305
2579
  else
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
2310
 
  endif
2311
 
  exe "keepjumps ".w:netrw_bannercnt
2312
 
 
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)
2316
 
   if s:netrwmfloc
2317
 
    keepjumps put ='\"   Copy/Move Tgt: '.s:netrwmftgt.' (local)'
2318
 
   else
2319
 
    keepjumps put ='\"   Copy/Move Tgt: '.s:netrwmftgt.' (remote)'
2320
 
   endif
2321
 
   let w:netrw_bannercnt= w:netrw_bannercnt + 1
2322
 
  endif
2323
 
  exe "keepjumps ".w:netrw_bannercnt
2324
 
 
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
2330
 
   else
2331
 
    keepjumps put ='\"   Showing:       '.g:netrw_list_hide
2332
 
   endif
2333
 
   let w:netrw_bannercnt= w:netrw_bannercnt + 1
2334
 
  endif
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
2339
 
 
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("$"))
2344
 
 
2345
 
  " set up syntax highlighting {{{3
2346
 
"  call Decho("set up syntax highlighting")
2347
 
  if has("syntax")
2348
 
   setlocal ft=netrw
2349
 
   if !exists("g:syntax_on") || !g:syntax_on
2350
 
    setlocal ft=
2351
 
   endif
2352
 
  endif
2353
 
 
2354
 
  " get list of files
2355
 
"  call Decho("Get list of files - islocal=".a:islocal)
2356
 
  if a:islocal
2357
 
   call s:LocalListing()
2358
 
  else " remote
2359
 
   call s:NetrwRemoteListing()
2360
 
  endif
2361
 
"  call Decho("w:netrw_bannercnt=".w:netrw_bannercnt." (banner complete)")
2362
 
 
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()
2369
 
   endif
2370
 
   if line("$") >= w:netrw_bannercnt
2371
 
"    call Decho("manipulate directory listing (sort) : g:netrw_sort_by<".g:netrw_sort_by.">")
2372
 
 
2373
 
    if g:netrw_sort_by =~ "^n"
2374
 
     " sort by name
2375
 
     call s:SetSort()
2376
 
 
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'
2382
 
      else
2383
 
       " reverse direction sorting
2384
 
       exe 'silent keepjumps '.w:netrw_bannercnt.',$sort!'
2385
 
      endif
2386
 
     endif
2387
 
     " remove priority pattern prefix
2388
 
"     call Decho("remove priority pattern prefix")
2389
 
     exe 'silent keepjumps '.w:netrw_bannercnt.',$s/^\d\{3}\///e'
2390
 
 
2391
 
    elseif a:islocal
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'
2397
 
      else
2398
 
"       call Decho('exe silent keepjumps '.w:netrw_bannercnt.',$sort!')
2399
 
       exe 'silent keepjumps '.w:netrw_bannercnt.',$sort!'
2400
 
      endif
2401
 
     endif
2402
 
     exe 'silent keepjumps '.w:netrw_bannercnt.',$s/^\d\{-}\///e'
2403
 
    endif
2404
 
 
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
2408
 
   endif
2409
 
  endif
2410
 
 
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)
2415
 
 
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
2420
 
   norm! 0
2421
 
  endif
2422
 
 
2423
 
  " record previous current directory
2424
 
  let w:netrw_prvdir= b:netrw_curdir
2425
 
"  call Decho("record netrw_prvdir<".w:netrw_prvdir.">")
2426
 
 
2427
 
  " save certain window-oriented variables into buffer-oriented variables {{{3
2428
 
  call s:SetBufWinVars()
2429
 
  call s:NetrwOptionRestore("w:")
2430
 
 
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)
2436
 
   unlet s:treecurpos
2437
 
  endif
2438
 
 
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')
 
2584
  endif
 
2585
  setlocal ma noro
 
2586
"  call Decho("setlocal ma noro")
 
2587
 
 
2588
  " clear buffer - this will cause NetrwBrowse/LocalBrowseCheck to do a refresh
 
2589
"  call Decho("clear buffer<".expand("%")."> with :%d")
 
2590
  %d
 
2591
 
 
2592
  " refresh the listing
 
2593
  let svpos= netrw#NetrwSavePosn()
 
2594
  call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
 
2595
  call netrw#NetrwRestorePosn(svpos)
 
2596
 
 
2597
  " keep cursor on the filename
 
2598
  silent keepjumps $
 
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
 
2603
  endif
 
2604
 
 
2605
"  call Dret("NetrwListStyle".(exists("w:netrw_liststyle")? ' : w:netrw_liststyle='.w:netrw_liststyle : ""))
 
2606
endfun
 
2607
 
 
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")
 
2615
   return
 
2616
  endif
 
2617
"  call Dfunc("NetrwBookmarkMenu() bookmarkcnt=".g:NETRW_BOOKMARKMAX." histcnt=".g:NETRW_DIRHIST_CNT." menucnt=".s:netrw_menucnt)
 
2618
 
 
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'
 
2624
   endif
 
2625
 
 
2626
   " show bookmarked places
 
2627
   let cnt       = 1
 
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>"
 
2633
    endif
 
2634
    let cnt= cnt + 1
 
2635
   endwhile
 
2636
 
 
2637
   " show directory browsing history
 
2638
   let cnt     = g:NETRW_DIRHIST_CNT
 
2639
   let first   = 1
 
2640
   let histcnt = 0
 
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>"
 
2648
    endif
 
2649
    let first = 0
 
2650
    let cnt   = ( cnt - 1 ) % g:netrw_dirhistmax
 
2651
    if cnt < 0
 
2652
     let cnt= cnt + g:netrw_dirhistmax
 
2653
    endif
 
2654
   endwhile
 
2655
  endif
 
2656
"  call Dret("NetrwBookmarkMenu")
2440
2657
endfun
2441
2658
 
2442
2659
" ---------------------------------------------------------------------
2448
2665
"  call Dfunc("s:NetrwBrowseChgDir(islocal=".a:islocal."> newdir<".a:newdir.">) a:0=".a:0." curpos<".string(getpos("."))."> b:netrw_curdir<".(exists("b:netrw_curdir")? b:netrw_curdir : "").">")
2449
2666
 
2450
2667
  if !exists("b:netrw_curdir")
 
2668
   " Don't try to change-directory: this can happen, for example, when netrw#ErrorMsg has been called
 
2669
   " and the current window is the NetrwMessage window.
2451
2670
"   call Decho("(NetrwBrowseChgDir) b:netrw_curdir doesn't exist!")
2452
 
   echoerr "(NetrwBrowseChgDir) b:netrw_curdir doesn't exist!"
 
2671
"   call Decho("getcwd<".getcwd().">")
 
2672
"   call Dredir("ls!")
2453
2673
"   call Dret("s:NetrwBrowseChgDir")
2454
2674
   return
2455
2675
  endif
2456
2676
 
2457
2677
  call s:NetrwOptionSave("s:")
2458
2678
  call s:NetrwSafeOptions()
2459
 
  call netrw#NetrwSavePosn()
2460
 
  let nbcd_curpos = getpos('.')
2461
 
  let dirname     = substitute(b:netrw_curdir,'\\','/','ge')
2462
 
  let newdir      = a:newdir
2463
 
  let dolockout   = 0
 
2679
  let nbcd_curpos                = netrw#NetrwSavePosn()
 
2680
  let s:nbcd_curpos_{bufnr('%')} = nbcd_curpos
 
2681
  let dirname                    = substitute(b:netrw_curdir,'\\','/','ge')
 
2682
  let newdir                     = a:newdir
 
2683
  let dolockout                  = 0
2464
2684
 
2465
2685
  " set up o/s-dependent directory recognition pattern
2466
2686
  if has("amiga")
2483
2703
   " ------------
2484
2704
"   call Decho('case "handling a file": newdir<'.newdir.'> !~ dirpat<'.dirpat.">")
2485
2705
   if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("w:netrw_treedict") && newdir !~ '^\(/\|\a:\)'
2486
 
    let dirname= s:NetrwTreeDir().newdir
 
2706
    let dirname= s:NetrwTreeDir()
 
2707
    if dirname =~ '/$'
 
2708
     let dirname= dirname.newdir
 
2709
    else
 
2710
     let dirname= s:NetrwTreeDir()."/".newdir
 
2711
    endif
2487
2712
"    call Decho("tree listing")
2488
2713
   elseif newdir =~ '^\(/\|\a:\)'
2489
2714
    let dirname= newdir
2494
2719
   " this lets NetrwBrowseX avoid the edit
2495
2720
   if a:0 < 1
2496
2721
"    call Decho("dirname<".dirname."> netrw_cd_escape<".g:netrw_cd_escape."> browse_split=".g:netrw_browse_split)
2497
 
"    call Decho("set up windows for editing<".escape(dirname,g:netrw_cd_escape).">  didsplit=".(exists("s:didsplit")? s:didsplit : "doesn't exist"))
 
2722
"    call Decho("set up windows for editing<".fnameescape(dirname).">  didsplit=".(exists("s:didsplit")? s:didsplit : "doesn't exist"))
2498
2723
    call s:NetrwOptionRestore("s:")
2499
2724
    if !exists("s:didsplit")
2500
2725
     if     g:netrw_browse_split == 1
2516
2741
      call s:NetrwMenu(0)
2517
2742
      " optional change to window
2518
2743
      if g:netrw_chgwin >= 1
2519
 
       exe g:netrw_chgwin."wincmd w"
 
2744
       exe "keepjumps ".g:netrw_chgwin."wincmd w"
2520
2745
      endif
2521
2746
     endif
2522
2747
    endif
2523
2748
    " the point where netrw actually edits the (local) file
2524
2749
    " if its local only: LocalBrowseCheck() doesn't edit a file, but NetrwBrowse() will
2525
2750
    if a:islocal
2526
 
"     call Decho("edit local file: exe e! ".escape(dirname,g:netrw_cd_escape))
2527
 
     exe "e! ".escape(dirname,g:netrw_cd_escape)
2528
 
     let dolockout= 1
 
2751
"     call Decho("edit local file: exe e! ".fnameescape(dirname))
 
2752
     exe "e! ".fnameescape(dirname)
2529
2753
    else
2530
2754
"     call Decho("remote file: NetrwBrowse will edit it")
2531
 
     let dolockout= 1
2532
2755
    endif
 
2756
    let dolockout= 1
2533
2757
   endif
2534
2758
 
2535
2759
  elseif newdir =~ '^/'
2558
2782
    " force a refresh
2559
2783
"    call Decho("clear buffer<".expand("%")."> with :%d")
2560
2784
    setlocal noro ma
 
2785
"    call Decho("setlocal noro ma")
2561
2786
    keepjumps %d
2562
2787
   endif
2563
2788
 
2591
2816
"   call Decho('case liststyle is TREELIST and w:netrw_treedict exists')
2592
2817
   " force a refresh (for TREELIST, wait for NetrwTreeDir() to force the refresh)
2593
2818
   setlocal noro ma
 
2819
"   call Decho("setlocal noro ma")
2594
2820
   if !(exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("b:netrw_curdir"))
2595
2821
"    call Decho("clear buffer<".expand("%")."> with :%d")
2596
2822
    keepjumps %d
2655
2881
  if dolockout
2656
2882
"   call Decho("doing modification lockout settings: ma nomod noro")
2657
2883
   setlocal ma nomod noro
 
2884
"   call Decho("setlocal ma nomod noro")
2658
2885
  endif
2659
2886
 
2660
2887
"  call Dret("s:NetrwBrowseChgDir <".dirname."> : curpos<".string(getpos(".")).">")
2662
2889
endfun
2663
2890
 
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.")")
 
2896
 
 
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','')
 
2902
  endif
 
2903
  let fname= escape(a:fname,"%#")
 
2904
"  call Decho("fname<".fname."> after escape()")
 
2905
 
 
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")
 
2910
   if has("unix")
 
2911
    let s:haskdeinit= s:System("system",'ps -e') =~ 'kdeinit'
 
2912
    if v:shell_error
 
2913
     let s:haskdeinit = 0
 
2914
    endif
 
2915
   else
 
2916
    let s:haskdeinit= 0
 
2917
   endif
 
2918
"   call Decho("setting s:haskdeinit=".s:haskdeinit)
 
2919
  endif
 
2920
 
 
2921
  if a:remote == 1
 
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
 
2926
   setlocal bh=delete
 
2927
"   call Decho("read <".fname.">, now writing: exe w! ".fname)
 
2928
   exe "silent! w! ".fname
 
2929
   q
 
2930
  endif
 
2931
"  call Decho("exten<".exten."> "."netrwFileHandlers#NFH_".exten."():exists=".exists("*netrwFileHandlers#NFH_".exten))
 
2932
 
 
2933
  " set up redirection
 
2934
  if &srr =~ "%s"
 
2935
   if (has("win32") || has("win95") || has("win64") || has("win16"))
 
2936
    let redir= substitute(&srr,"%s","nul","")
 
2937
   else
 
2938
    let redir= substitute(&srr,"%s","/dev/null","")
 
2939
   endif
 
2940
  elseif (has("win32") || has("win95") || has("win64") || has("win16"))
 
2941
   let redir= &srr . "nul"
 
2942
  else
 
2943
   let redir= &srr . "/dev/null"
 
2944
  endif
 
2945
"  call Decho("redir{".redir."} srr{".&srr."}")
 
2946
 
 
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*','','')." "
 
2952
    let oviewer = ''
 
2953
    let cnt     = 1
 
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','')." "
 
2957
     let cnt     = cnt + 1
 
2958
     let oviewer = viewer
 
2959
"     call Decho("!exe: viewer<".viewer.">  viewopt<".viewopt.">")
 
2960
    endwhile
 
2961
   else
 
2962
    let viewer  = g:netrw_browsex_viewer
 
2963
    let viewopt = ""
 
2964
   endif
 
2965
"   call Decho("viewer<".viewer.">  viewopt<".viewopt.">")
 
2966
  endif
 
2967
 
 
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)
 
2972
 
 
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
 
2978
 
 
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
 
2984
 
 
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
 
2989
 
 
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
 
2994
 
 
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
 
2999
 
 
3000
  else
 
3001
   " netrwFileHandlers#Invoke() always returns 0
 
3002
   let ret= netrwFileHandlers#Invoke(exten,fname)
 
3003
  endif
 
3004
 
 
3005
  " if unsuccessful, attempt netrwFileHandlers#Invoke()
 
3006
  if ret
 
3007
   let ret= netrwFileHandlers#Invoke(exten,fname)
 
3008
  endif
 
3009
 
 
3010
"  redraw!
 
3011
 
 
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)
 
3020
"  endif
 
3021
 
 
3022
  if a:remote == 1
 
3023
   setlocal bh=delete bt=nofile
 
3024
   if g:netrw_use_noswf
 
3025
    setlocal noswf
 
3026
   endif
 
3027
   exe "norm! \<c-o>"
 
3028
"   redraw!
 
3029
  endif
 
3030
 
 
3031
"  call Dret("NetrwBrowseX")
 
3032
endfun
 
3033
 
 
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
 
3037
"                      been modified
 
3038
"          dosplit==1: the window will be split before running the local
 
3039
"                      browser
 
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)")
 
3045
  endif
 
3046
  let curfile= b:netrw_curdir
 
3047
"  call Decho("curfile<".curfile.">")
 
3048
 
 
3049
  " save registers
 
3050
  silent! let keepregstar = @*
 
3051
  silent! let keepregplus = @+
 
3052
  silent! let keepregslash= @/
 
3053
 
 
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()
 
3058
 
 
3059
   if a:style == 0      " Explore, Sexplore
 
3060
"    call Decho("style=0: Explore or Sexplore")
 
3061
    exe g:netrw_winsize."wincmd s"
 
3062
 
 
3063
   elseif a:style == 1  "Explore!, Sexplore!
 
3064
"    call Decho("style=1: Explore! or Sexplore!")
 
3065
    exe g:netrw_winsize."wincmd v"
 
3066
 
 
3067
   elseif a:style == 2  " Hexplore
 
3068
"    call Decho("style=2: Hexplore")
 
3069
    exe "bel ".g:netrw_winsize."wincmd s"
 
3070
 
 
3071
   elseif a:style == 3  " Hexplore!
 
3072
"    call Decho("style=3: Hexplore!")
 
3073
    exe "abo ".g:netrw_winsize."wincmd s"
 
3074
 
 
3075
   elseif a:style == 4  " Vexplore
 
3076
"    call Decho("style=4: Vexplore")
 
3077
    exe "lefta ".g:netrw_winsize."wincmd v"
 
3078
 
 
3079
   elseif a:style == 5  " Vexplore!
 
3080
"    call Decho("style=5: Vexplore!")
 
3081
    exe "rightb ".g:netrw_winsize."wincmd v"
 
3082
 
 
3083
   elseif a:style == 6  " Texplore
 
3084
    call s:SaveBufVars()
 
3085
"    call Decho("style  = 6: Texplore")
 
3086
    tabnew
 
3087
    call s:RestoreBufVars()
 
3088
   endif
 
3089
   call s:RestoreWinVars()
 
3090
  endif
 
3091
  norm! 0
 
3092
 
 
3093
  if a:0 > 0
 
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)")
 
3098
   elseif a:1 == '.'
 
3099
    let dirname= exists("b:netrw_curdir")? b:netrw_curdir : getcwd()
 
3100
    if dirname !~ '/$'
 
3101
     let dirname= dirname."/"
 
3102
    endif
 
3103
"    call Decho("using dirname<".dirname.">  (case: ".(exists("b:netrw_curdir")? "b:netrw_curdir" : "getcwd()").")")
 
3104
   elseif a:1 =~ '\$'
 
3105
    let dirname= expand(a:1)
 
3106
   else
 
3107
    let dirname= a:1
 
3108
"    call Decho("using dirname<".dirname.">")
 
3109
   endif
 
3110
  else
 
3111
   " clear explore
 
3112
"   call Decho("clearing explore variables")
 
3113
   2match none
 
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
 
3122
"   redraw!
 
3123
   echo " "
 
3124
   echo " "
 
3125
"   call Dret("netrw#Explore : cleared list")
 
3126
   return
 
3127
  endif
 
3128
 
 
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
 
3135
   else
 
3136
    let b:netrw_curdir= getcwd().'/'.prefixdir
 
3137
   endif
 
3138
   let dirname= substitute(dirname,'^.\{-}\(\*\*/.*\)$','\1','')
 
3139
   let starpat= 4;
 
3140
"   call Decho("pwd<".getcwd()."> dirname<".dirname.">")
 
3141
"   call Decho("case Explore ../**/../filepat (starpat=".starpat.")")
 
3142
 
 
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','')
 
3147
   let starpat= 1
 
3148
"   call Decho("Explore *//pat: (starpat=".starpat.") dirname<".dirname."> -> pattern<".pattern.">")
 
3149
   if &hls | let keepregslash= s:ExplorePatHls(pattern) | endif
 
3150
 
 
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,'^\*\*//','','')
 
3155
   let starpat= 2
 
3156
"   call Decho("Explore **//pat: (starpat=".starpat.") dirname<".dirname."> -> pattern<".pattern.">")
 
3157
 
 
3158
  elseif dirname =~ '^\*/'
 
3159
   " starpat=3: Explore */filepat   (search in current directory for filenames matching filepat)
 
3160
   let starpat= 3
 
3161
"   call Decho("case Explore */filepat (starpat=".starpat.")")
 
3162
 
 
3163
  elseif dirname=~ '^\*\*/'
 
3164
   " starpat=4: Explore **/filepat  (recursive descent search for filenames matching filepat)
 
3165
   let starpat= 4
 
3166
"   call Decho("case Explore **/filepat (starpat=".starpat.")")
 
3167
  else
 
3168
   let starpat= 0
 
3169
  endif
 
3170
 
 
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")
 
3174
   if dirname == ""
 
3175
    let dirname= substitute(expand("%:p"),'^\(.*[/\\]\)[^/\\]*$','\1','e')
 
3176
   endif
 
3177
   if dirname =~ '^scp:' || dirname =~ '^ftp:'
 
3178
"    call Decho("calling NetrwBrowse(0,dirname<".dirname.">)")
 
3179
    call s:NetrwBrowse(0,dirname)
 
3180
   else
 
3181
    if dirname == ""|let dirname= getcwd()|endif
 
3182
"    call Decho("calling LocalBrowseCheck(dirname<".dirname.">)")
 
3183
    call netrw#LocalBrowseCheck(dirname)
 
3184
   endif
 
3185
 
 
3186
"   call Decho("curfile<".curfile.">")
 
3187
   if has("win32") || has("win95") || has("win64") || has("win16")
 
3188
    call search('\<'.substitute(curfile,'^.*[/\\]','','e').'\>','cW')
 
3189
   else
 
3190
    call search('\<'.substitute(curfile,'^.*/','','e').'\>','cW')
 
3191
   endif
 
3192
 
 
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)
 
3197
  elseif a:indx <= 0
 
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>
 
3205
   endif
 
3206
 
 
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
 
3211
    endif
 
3212
    let indx = a:indx
 
3213
"    call Decho("starpat=".starpat.": set indx= [a:indx=".indx."]")
 
3214
"
 
3215
    if indx == -1
 
3216
     " Nexplore
 
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")
 
3224
      return
 
3225
     endif
 
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]
 
3232
      let indx= indx + 1
 
3233
"      call Decho("indx=".indx." (Nexplore while loop)")
 
3234
     endwhile
 
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)
 
3237
 
 
3238
    elseif indx == -2
 
3239
     " Pexplore
 
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")
 
3247
      return
 
3248
     endif
 
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]
 
3255
      let indx= indx - 1
 
3256
"      call Decho("indx=".indx." (Pexplore while loop)")
 
3257
     endwhile
 
3258
     if indx < 0                        | let indx= 0                           | endif
 
3259
"     call Decho("Pexplore: indx= [w:netrw_explore_indx=".w:netrw_explore_indx."]=".indx)
 
3260
 
 
3261
    else
 
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()
 
3268
     endif
 
3269
"     call Decho("starpat=".starpat.": b:netrw_curdir<".b:netrw_curdir.">")
 
3270
 
 
3271
     " switch on starpat to build the w:netrw_explore_list of files
 
3272
     if starpat == 1
 
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
 
3278
 
 
3279
     elseif starpat == 2
 
3280
      " starpat=2: Explore **//pattern (recursive descent search for files containing pattern)
 
3281
"      call Decho("starpat=".starpat.": build **//pattern list")
 
3282
      try
 
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")
 
3291
       return
 
3292
      endtry
 
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)')
 
3296
 
 
3297
     elseif starpat == 3
 
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
 
3303
 
 
3304
     elseif starpat == 4
 
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
 
3310
 
 
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)
 
3314
 
 
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")
 
3321
      return
 
3322
     endif
 
3323
    endif  " if indx ... endif
 
3324
 
 
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)
 
3328
 
 
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)
 
3335
     sleep 1
 
3336
    endif
 
3337
 
 
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.">")
 
3342
 
 
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
 
3347
    endif
 
3348
    if w:netrw_liststyle == s:THINLIST || w:netrw_liststyle == s:LONGLIST
 
3349
     call search('^'.substitute(dirfile,"^.*/","","").'\>',"W")
 
3350
    else
 
3351
     call search('\<'.substitute(dirfile,"^.*/","","").'\>',"w")
 
3352
    endif
 
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)
 
3358
 
 
3359
   else
 
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)
 
3363
    endif
 
3364
    silent! let @* = keepregstar
 
3365
    silent! let @+ = keepregstar
 
3366
    silent! let @/ = keepregslash
 
3367
"    call Dret("netrw#Explore : missing +path_extra")
 
3368
    return
 
3369
   endif
 
3370
 
 
3371
  else
 
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
 
3376
   endif
 
3377
   let newdir= dirname
 
3378
   if !exists("b:netrw_curdir")
 
3379
    call netrw#LocalBrowseCheck(getcwd())
 
3380
   else
 
3381
    call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,newdir))
 
3382
   endif
 
3383
  endif
 
3384
 
 
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
 
3394
    endif
 
3395
    let prvfname= ""
 
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."'").'\>'
 
3401
      else
 
3402
       let s:explore_match= s:explore_match.'\|\<'.escape(strpart(fname,dirlen),g:netrw_markfileesc."'".g:netrw_markfileesc."'").'\>'
 
3403
      endif
 
3404
     elseif fname !~ '^/' && fname != prvfname
 
3405
      if s:explore_match == ""
 
3406
       let s:explore_match= '\<'.escape(fname,g:netrw_markfileesc."'".g:netrw_markfileesc."'").'\>'
 
3407
      else
 
3408
       let s:explore_match= s:explore_match.'\|\<'.escape(fname,g:netrw_markfileesc."'".g:netrw_markfileesc."'").'\>'
 
3409
      endif
 
3410
     endif
 
3411
     let prvfname= fname
 
3412
    endfor
 
3413
"    call Decho("explore_match<".s:explore_match.">")
 
3414
    exe "2match netrwMarkFile /".s:explore_match."/"
 
3415
   endif
 
3416
   echo "<s-up>==Pexplore  <s-down>==Nexplore"
 
3417
  else
 
3418
   2match none
 
3419
   if exists("s:explore_match")  | unlet s:explore_match  | endif
 
3420
   if exists("s:explore_prvdir") | unlet s:explore_prvdir | endif
 
3421
   echo " "
 
3422
"   call Decho("cleared explore match list")
 
3423
  endif
 
3424
 
 
3425
  silent! let @* = keepregstar
 
3426
  silent! let @+ = keepregstar
 
3427
  silent! let @/ = keepregslash
 
3428
"  call Dret("netrw#Explore : @/<".@/.">")
 
3429
endfun
 
3430
 
 
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().
2672
3439
"  call Dfunc("NetrwHide(islocal=".a:islocal.") g:netrw_hide=".g:netrw_hide)
2673
3440
  let svpos= netrw#NetrwSavePosn()
2674
3441
 
2675
 
  if exists("s:netrwmarkfilelist")
2676
 
"   call Decho(((g:netrw_hide == 1)? "unhide" : "hide")." files in markfilelist<".string(s:netrwmarkfilelist).">")
 
3442
  if exists("s:netrwmarkfilelist_{bufnr('%')}")
 
3443
"   call Decho(((g:netrw_hide == 1)? "unhide" : "hide")." files in markfilelist<".string(s:netrwmarkfilelist_{bufnr("%")}).">")
2677
3444
"   call Decho("g:netrw_list_hide<".g:netrw_list_hide.">")
2678
3445
 
2679
3446
   " hide the files in the markfile list
2680
 
   for fname in s:netrwmarkfilelist
 
3447
   for fname in s:netrwmarkfilelist_{bufnr("%")}
2681
3448
"    call Decho("match(g:netrw_list_hide<".g:netrw_list_hide.'> fname<\<'.fname.'\>>)='.match(g:netrw_list_hide,'\<'.fname.'\>')." isk=".&isk)
2682
3449
    if match(g:netrw_list_hide,'\<'.fname.'\>') != -1
2683
3450
     " remove fname from hiding list
2695
3462
"     call Decho("hide: g:netrw_list_hide<".g:netrw_list_hide.">")
2696
3463
    endif
2697
3464
   endfor
2698
 
   unlet s:netrwmarkfilelist
2699
 
   unlet s:netrwmarkfilemtch
 
3465
   unlet s:netrwmarkfilelist_{bufnr("%")}
 
3466
   unlet s:netrwmarkfilemtch_{bufnr("%")}
2700
3467
   2match none
2701
3468
   let g:netrw_hide= 1
2702
3469
 
2718
3485
endfun
2719
3486
 
2720
3487
" ---------------------------------------------------------------------
 
3488
" s:NetrwHidden: invoked by "gh" {{{2
 
3489
fun! s:NetrwHidden(islocal)
 
3490
"  call Dfunc("s:NetrwHidden()")
 
3491
  "  save current position
 
3492
  let svpos= netrw#NetrwSavePosn()
 
3493
 
 
3494
  if g:netrw_list_hide =~ '\(^\|,\)\\(^\\|\\s\\s\\)\\zs\\.\\S\\+'
 
3495
   " remove pattern from hiding list
 
3496
   let g:netrw_list_hide= substitute(g:netrw_list_hide,'\(^\|,\)\\(^\\|\\s\\s\\)\\zs\\.\\S\\+','','')
 
3497
  elseif strlen(g:netrw_list_hide) >= 1
 
3498
   let g:netrw_list_hide= g:netrw_list_hide . ',\(^\|\s\s\)\zs\.\S\+'
 
3499
  else
 
3500
   let g:netrw_list_hide= '\(^\|\s\s\)\zs\.\S\+'
 
3501
  endif
 
3502
 
 
3503
  " refresh screen and return to saved position
 
3504
  call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
 
3505
  call netrw#NetrwRestorePosn(svpos)
 
3506
"  call Dret("s:NetrwHidden")
 
3507
endfun
 
3508
 
 
3509
" ---------------------------------------------------------------------
2721
3510
" s:NetrwLeftmouse: handles the <leftmouse> when in a netrw browsing window {{{2
2722
3511
fun! s:NetrwLeftmouse(islocal)
2723
3512
"  call Dfunc("s:NetrwLeftmouse(islocal=".a:islocal.")")
2816
3605
endfun
2817
3606
 
2818
3607
" ---------------------------------------------------------------------
 
3608
" s:NetrwMakeDir: this function makes a directory (both local and remote) {{{2
 
3609
fun! s:NetrwMakeDir(usrhost)
 
3610
"  call Dfunc("NetrwMakeDir(usrhost<".a:usrhost.">)")
 
3611
 
 
3612
  " get name of new directory from user.  A bare <CR> will skip.
 
3613
  " if its currently a directory, also request will be skipped, but with
 
3614
  " a message.
 
3615
  call inputsave()
 
3616
  let newdirname= input("Please give directory name: ")
 
3617
  call inputrestore()
 
3618
"  call Decho("newdirname<".newdirname.">")
 
3619
 
 
3620
  if newdirname == ""
 
3621
"   call Dret("NetrwMakeDir : user aborted with bare <cr>")
 
3622
   return
 
3623
  endif
 
3624
 
 
3625
  if a:usrhost == ""
 
3626
"   call Decho("local mkdir")
 
3627
 
 
3628
   " Local mkdir:
 
3629
   " sanity checks
 
3630
   let fullnewdir= b:netrw_curdir.'/'.newdirname
 
3631
"   call Decho("fullnewdir<".fullnewdir.">")
 
3632
   if isdirectory(fullnewdir)
 
3633
    if !exists("g:netrw_quiet")
 
3634
     call netrw#ErrorMsg(s:WARNING,"<".newdirname."> is already a directory!",24)
 
3635
    endif
 
3636
"    call Dret("NetrwMakeDir : directory<".newdirname."> exists previously")
 
3637
    return
 
3638
   endif
 
3639
   if s:FileReadable(fullnewdir)
 
3640
    if !exists("g:netrw_quiet")
 
3641
     call netrw#ErrorMsg(s:WARNING,"<".newdirname."> is already a file!",25)
 
3642
    endif
 
3643
"    call Dret("NetrwMakeDir : file<".newdirname."> exists previously")
 
3644
    return
 
3645
   endif
 
3646
 
 
3647
   " requested new local directory is neither a pre-existing file or
 
3648
   " directory, so make it!
 
3649
   if exists("*mkdir")
 
3650
    call mkdir(fullnewdir,"p")
 
3651
   else
 
3652
    let netrw_origdir= s:NetrwGetcwd(1)
 
3653
    exe 'keepjumps lcd '.fnameescape(b:netrw_curdir)
 
3654
"    call Decho("netrw_origdir<".netrw_origdir.">: lcd b:netrw_curdir<".fnameescape(b:netrw_curdir).">")
 
3655
"    call Decho("exe silent! !".g:netrw_local_mkdir.' '.shellescape(newdirname))
 
3656
    exe "silent! !".g:netrw_local_mkdir.' '.shellescape(newdirname)
 
3657
    if !g:netrw_keepdir
 
3658
     exe 'keepjumps lcd '.fnameescape(netrw_origdir)
 
3659
"     call Decho("netrw_keepdir=".g:netrw_keepdir.": keepjumps lcd ".fnameescape(netrw_origdir)." getcwd<".getcwd().">")
 
3660
    endif
 
3661
   endif
 
3662
 
 
3663
   if v:shell_error == 0
 
3664
    " refresh listing
 
3665
"    call Decho("refresh listing")
 
3666
    let svpos= netrw#NetrwSavePosn()
 
3667
    call s:NetrwRefresh(1,s:NetrwBrowseChgDir(1,'./'))
 
3668
    call netrw#NetrwRestorePosn(svpos)
 
3669
   elseif !exists("g:netrw_quiet")
 
3670
    call netrw#ErrorMsg(s:ERROR,"unable to make directory<".newdirname.">",26)
 
3671
   endif
 
3672
"   redraw!
 
3673
 
 
3674
  elseif !exists("b:netrw_method") || b:netrw_method == 4
 
3675
   " Remote mkdir:
 
3676
"   call Decho("remote mkdir")
 
3677
   let mkdircmd  = s:MakeSshCmd(g:netrw_mkdir_cmd)
 
3678
   let newdirname= substitute(b:netrw_curdir,'^\%(.\{-}/\)\{3}\(.*\)$','\1','').newdirname
 
3679
"   call Decho("exe silent! !".mkdircmd." ".shellescape(newdirname))
 
3680
   exe "silent! !".mkdircmd." ".shellescape(newdirname)
 
3681
   if v:shell_error == 0
 
3682
    " refresh listing
 
3683
    let svpos= netrw#NetrwSavePosn()
 
3684
    call s:NetrwRefresh(0,s:NetrwBrowseChgDir(0,'./'))
 
3685
    call netrw#NetrwRestorePosn(svpos)
 
3686
   elseif !exists("g:netrw_quiet")
 
3687
    call netrw#ErrorMsg(s:ERROR,"unable to make directory<".newdirname.">",27)
 
3688
   endif
 
3689
"   redraw!
 
3690
 
 
3691
  elseif b:netrw_method == 2
 
3692
   " COMBAK -- future work
 
3693
   call netrw#ErrorMsg(s:ERROR,"making directories via ftp not currently supported",68)
 
3694
  elseif b:netrw_method == 3
 
3695
   " COMBAK -- future work
 
3696
   call netrw#ErrorMsg(s:ERROR,"making directories via ftp not currently supported",68)
 
3697
  endif
 
3698
 
 
3699
"  call Dret("NetrwMakeDir")
 
3700
endfun
 
3701
 
 
3702
" ---------------------------------------------------------------------
2819
3703
" s:NetrwMarkFile: (invoked by mf) This function is used to both {{{2
2820
3704
"                  mark and unmark files.  If a markfile list exists,
2821
3705
"                  then the rename and delete functions will use it instead
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}.">")
 
3717
 
 
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."'").'\>'
 
3723
 
 
3724
   else
 
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)
 
3732
    else
 
3733
     " rebuild match list to display markings correctly
 
3734
"     call Decho("rebuild s:netrwmarkfilemtch_".curbufnr)
 
3735
     let s:netrwmarkfilemtch_{curbufnr}= ""
 
3736
     let first                           = 1
 
3737
     for fname in s:netrwmarkfilelist_{curbufnr}
 
3738
      if first
 
3739
       let s:netrwmarkfilemtch_{curbufnr}= s:netrwmarkfilemtch_{curbufnr}.'\<'.escape(fname,g:netrw_markfileesc."'".g:netrw_markfileesc."'").'\>'
 
3740
      else
 
3741
       let s:netrwmarkfilemtch_{curbufnr}= s:netrwmarkfilemtch_{curbufnr}.'\|\<'.escape(fname,g:netrw_markfileesc."'".g:netrw_markfileesc."'").'\>'
 
3742
      endif
 
3743
      let first= 0
 
3744
     endfor
 
3745
"     call Decho("ending s:netrwmarkfilelist_"curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}).">")
 
3746
"     call Decho("ending s:netrwmarkfilemtch_"curbufnr."<".s:netrwmarkfilemtch_{curbufnr}.">")
 
3747
    endif
 
3748
   endif
 
3749
 
 
3750
  else
 
3751
   " initialize new markfilelist
 
3752
 
 
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}).">")
 
3757
 
 
3758
   " build initial markfile matching pattern
 
3759
   if a:fname =~ '/$'
 
3760
    let s:netrwmarkfilemtch_{curbufnr}= '\<'.escape(a:fname,g:netrw_markfileesc)
 
3761
   else
 
3762
    let s:netrwmarkfilemtch_{curbufnr}= '\<'.escape(a:fname,g:netrw_markfileesc).'\>'
 
3763
   endif
 
3764
"   call Decho("ending s:netrwmarkfilemtch_".curbufnr."<".s:netrwmarkfilemtch_{curbufnr}.">")
2830
3765
  endif
2831
3766
 
 
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.">")
2835
 
 
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).">")
2841
3774
   else
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
2848
 
    else
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.">")
2854
3781
    endif
2855
3782
   endif
2856
 
 
2857
3783
  else
2858
 
 
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).">")
2863
 
 
2864
 
   if a:fname =~ '/$'
2865
 
    let s:netrwmarkfilemtch= '\<'.escape(a:fname,'*./[\')
2866
 
   else
2867
 
    let s:netrwmarkfilemtch= '\<'.escape(a:fname,'*./[\').'\>'
2868
 
   endif
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).">")
2870
3788
  endif
2871
3789
 
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}."/"
2875
3794
  else
2876
3795
"   call Decho("2match none")
2877
3796
   2match none
2878
3797
  endif
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").">")
2880
3799
endfun
2881
3800
 
2882
3801
" ---------------------------------------------------------------------
2889
3808
"                            g:netrw_decompress      = { ".gz" : "gunzip" , ".bz2" : "bunzip2" , ".zip" : "unzip" , ".tar" : "tar -xf"}
2890
3809
fun! s:NetrwMarkFileCompress(islocal)
2891
3810
"  call Dfunc("s:NetrwMarkFileCompress(islocal=".a:islocal.")")
2892
 
  let svpos= netrw#NetrwSavePosn()
2893
 
  if a:islocal && exists("b:netrw_curdir")
2894
 
   exe "cd ".b:netrw_curdir
2895
 
  endif
 
3811
  let svpos    = netrw#NetrwSavePosn()
 
3812
  let curdir   = b:netrw_curdir
 
3813
  let curbufnr = bufnr("%")
2896
3814
 
2897
 
  if exists("s:netrwmarkfilelist") && exists("g:netrw_compress") && exists("g:netrw_decompress")
2898
 
   for fname in s:netrwmarkfilelist
 
3815
  if exists("s:netrwmarkfilelist_{curbufnr}") && exists("g:netrw_compress") && exists("g:netrw_decompress")
 
3816
   for fname in s:netrwmarkfilelist_{curbufnr}
2899
3817
    " for every filename in the marked list
2900
3818
    for sfx in sort(keys(g:netrw_decompress))
2901
3819
     if fname =~ '\'.sfx.'$'
2902
3820
      " fname has a suffix indicating that its compressed; apply associated decompression routine
2903
3821
      let exe= g:netrw_decompress[sfx]
2904
3822
"      call Decho("fname<".fname."> is compressed so decompress with <".exe.">")
 
3823
      if a:islocal
 
3824
       if g:netrw_keepdir
 
3825
        let fname= s:ComposePath(curdir,fname)
 
3826
       endif
 
3827
      else
 
3828
       let fname= b:netrw_curdir.fname
 
3829
      endif
2905
3830
      if executable(exe)
2906
3831
       if a:islocal
2907
 
        call system(exe." ".fname)
 
3832
        call system(exe." ".fname)
2908
3833
       else
2909
3834
        call s:RemoteSystem(exe." ".fname)
2910
3835
       endif
2918
3843
     unlet exe
2919
3844
    elseif a:islocal
2920
3845
     " fname not a compressed file, so compress it
2921
 
     call system(g:netrw_compress." ".fname)
 
3846
     call system(g:netrw_compress." ".s:ComposePath(b:netrw_curdir,fname))
2922
3847
    else
2923
3848
     " fname not a compressed file, so compress it
2924
3849
     call s:RemoteSystem(g:netrw_compress." ".fname)
2925
3850
    endif
2926
3851
   endfor
2927
 
   unlet s:netrwmarkfilelist
2928
 
   unlet s:netrwmarkfilemtch
2929
 
   2match none
 
3852
   call s:NetrwUnmarkList(curbufnr,curdir)
2930
3853
   call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
2931
3854
   call netrw#NetrwRestorePosn(svpos)
2932
3855
  endif
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
2940
 
"                      directories.
 
3863
"                      directories.  Uses the local-buffer marked file list.
2941
3864
"                      Returns 1=success  (used by NetrwMarkFileMove())
2942
3865
"                              0=failure
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
2947
 
  endif
2948
 
 
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()
2954
 
 
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)
2961
 
 
2962
 
    for fname in s:netrwmarkfilelist
2963
 
"     call Decho("s:NetrwMarkFileCopy: fname<".fname.">")
2964
 
 
2965
 
     " sanity check
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")
2969
 
      return 0
2970
 
     endif
2971
 
 
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)
2980
 
        break
2981
 
       endif
2982
 
      else
2983
 
       call netrw#ErrorMsg(s:ERROR,"command<".g:netrw_localcopycmd."> is not executable!",57)
2984
 
       break
2985
 
      endif
2986
 
 
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)
2991
 
 
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)
2996
 
 
2997
 
     else
2998
 
      " remote to remote copy
2999
 
"      call Decho("remote to remote copy")
3000
 
      call s:NetrwUpload(fname,s:netrwmftgt)
3001
 
     endif
3002
 
    endfor
3003
 
 
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
3009
 
     2match none
 
3868
 
 
3869
  " sanity checks
 
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")
 
3873
   return 0
 
3874
  endif
 
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")
 
3879
   return 0
 
3880
  endif
 
3881
"  call Decho("sanity chk passed: s:netrwmftgt<".s:netrwmftgt.">")
 
3882
  let curdir   = b:netrw_curdir
 
3883
  let curbufnr = bufnr("%")
 
3884
 
 
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))
 
3891
 
 
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)
 
3896
 
 
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)
 
3900
 
 
3901
  elseif !a:islocal && !s:netrwmftgt_islocal
 
3902
"   call Decho("copy from remote to remote")
 
3903
   let curdir = getcwd()
 
3904
   let tmpdir = s:GetTempfile("")
 
3905
   if tmpdir !~ '/'
 
3906
    let tmpdir= curdir."/".tmpdir
 
3907
   endif
 
3908
   if exists("*mkdir")
 
3909
    call mkdir(tmpdir)
 
3910
   else
 
3911
    exe "silent! !".g:netrw_local_mkdir.' '.shellescape(tmpdir)
 
3912
   endif
 
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)
 
3921
     endfor
 
3922
     exe "keepjumps lcd ".fnameescape(curdir)
 
3923
     exe "silent !".g:netrw_local_rmdir." ".fnameescape(tmpdir)
 
3924
    else
 
3925
     exe "keepjumps lcd ".fnameescape(curdir)
3010
3926
    endif
3011
 
   else
3012
 
    call netrw#ErrorMsg(s:ERROR,"missing a markfile copy target! (see help for netrw-mt)",56)
3013
3927
   endif
3014
 
 
3015
 
   " refresh the listing
3016
 
   call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
3017
 
   call netrw#NetrwRestorePosn(svpos)
3018
 
  else
3019
 
   call netrw#ErrorMsg(s:ERROR,"no files marked!",59)
3020
 
  endif
 
3928
  endif
 
3929
 
 
3930
  " -------
 
3931
  " cleanup
 
3932
  " -------
 
3933
"  call Decho("cleanup")
 
3934
 
 
3935
  " remove markings from local buffer
 
3936
  call s:NetrwUnmarkList(curbufnr,curdir)
 
3937
 
 
3938
  " refresh buffers
 
3939
  if !s:netrwmftgt_islocal
 
3940
   call s:NetrwRefreshDir(s:netrwmftgt_islocal,s:netrwmftgt)
 
3941
  endif
 
3942
  if a:islocal
 
3943
   call s:NetrwRefreshDir(a:islocal,b:netrw_curdir)
 
3944
  endif
 
3945
  call s:LocalBrowseShellCmdRefresh()
3021
3946
  
3022
3947
"  call Dret("s:NetrwMarkFileCopy 1")
3023
3948
  return 1
3027
3952
" s:NetrwMarkFileDiff: (invoked by md) This function is used to {{{2
3028
3953
"                      invoke vim's diff mode on the marked files.
3029
3954
"                      Either two or three files can be so handled.
 
3955
"                      Uses the global marked file list.
3030
3956
fun! s:NetrwMarkFileDiff(islocal)
3031
3957
"  call Dfunc("s:NetrwMarkFileDiff(islocal=".a:islocal.") b:netrw_curdir<".b:netrw_curdir.">")
3032
 
  if a:islocal && exists("b:netrw_curdir")
3033
 
   exe "cd ".b:netrw_curdir
3034
 
  endif
3035
 
  if exists("s:netrwmarkfilelist")
3036
 
   let curdir= b:netrw_curdir
 
3958
  let curbufnr= bufnr("%")
 
3959
  if exists("s:netrwmarkfilelist_{curbufnr}")
3037
3960
 
3038
 
   let cnt= 0
 
3961
   let cnt    = 0
 
3962
   let curdir = b:netrw_curdir
3039
3963
   for fname in s:netrwmarkfilelist
3040
3964
    let cnt= cnt + 1
3041
3965
    if !a:islocal
3055
3979
     break
3056
3980
    endif
3057
3981
   endfor
3058
 
   unlet s:netrwmarkfilelist
3059
 
   unlet s:netrwmarkfilemtch
3060
 
   2match none
 
3982
   call s:NetrwUnmarkList(curbufnr,curdir)
3061
3983
  endif
3062
3984
"  call Dret("s:NetrwMarkFileDiff")
3063
3985
endfun
3064
3986
 
3065
3987
" ---------------------------------------------------------------------
3066
3988
" s:NetrwMarkFileEdit: (invoked by me) put marked files on arg list and start editing them {{{2
 
3989
"                       Uses global markfilelist
3067
3990
fun! s:NetrwMarkFileEdit(islocal)
3068
3991
"  call Dfunc("s:NetrwMarkFileEdit(islocal=".a:islocal.")")
3069
 
  if a:islocal && exists("b:netrw_curdir")
3070
 
   exe "cd ".b:netrw_curdir
3071
 
  endif
3072
3992
 
3073
 
  if exists("s:netrwmarkfilelist")
3074
 
   call s:SetRexDir(a:islocal,b:netrw_curdir)
3075
 
   let flist= substitute(escape(join(s:netrwmarkfilelist,"\t"),' '),"\t",' ','g')
3076
 
   " unmark marked file list
3077
 
   unlet s:netrwmarkfilelist
3078
 
   unlet s:netrwmarkfilemtch
3079
 
   2match none
 
3993
  let curdir   = b:netrw_curdir
 
3994
  let curbufnr = bufnr("%")
 
3995
  if exists("s:netrwmarkfilelist_{curbufnr}")
 
3996
   call s:SetRexDir(a:islocal,curdir)
 
3997
   if a:islocal && g:netrw_keepdir
 
3998
    " use complete paths if its local and keepdir enabled
 
3999
    let flist= ""
 
4000
    for fname in s:netrwmarkfilelist
 
4001
"     let flist= flist." ".s:ComposePath(curdir,fname)
 
4002
     let flist= flist." ".fname
 
4003
    endfor
 
4004
   else
 
4005
"    let flist= substitute(escape(join(s:netrwmarkfilelist_{curbufnr},"\t"),' '),"\t",' ','g')
 
4006
    let flist= substitute(escape(join(s:netrwmarkfilelist,"\t"),' '),"\t",' ','g')
 
4007
   endif
 
4008
   " unmark markedfile list
 
4009
"   call s:NetrwUnmarkList(curbufnr,curdir)
 
4010
   call s:NetrwUnmarkAll()
3080
4011
"   call Decho("exe silent args ".flist)
3081
4012
   exe "silent args ".flist
3082
4013
  endif
3086
4017
 
3087
4018
" ---------------------------------------------------------------------
3088
4019
" s:NetrwMarkFileExe: (invoked by mx) execute arbitrary command on marked files, one at a time {{{2
 
4020
"                     Uses the local marked-file list.
3089
4021
fun! s:NetrwMarkFileExe(islocal)
3090
4022
"  call Dfunc("s:NetrwMarkFileExe(islocal=".a:islocal.")")
3091
 
  let svpos= netrw#NetrwSavePosn()
3092
 
  if a:islocal && exists("b:netrw_curdir")
3093
 
   exe "cd ".b:netrw_curdir
3094
 
  endif
 
4023
  let svpos    = netrw#NetrwSavePosn()
 
4024
  let curdir   = b:netrw_curdir
 
4025
  let curbufnr = bufnr("%")
3095
4026
 
3096
 
  if exists("s:netrwmarkfilelist")
 
4027
  if exists("s:netrwmarkfilelist_{curbufnr}")
3097
4028
   " get the command
3098
4029
   call inputsave()
3099
4030
   let cmd= input("Enter command: ","","file")
3102
4033
 
3103
4034
   " apply command to marked files.  Substitute: filename -> %
3104
4035
   " If no %, then append a space and the filename to the command
3105
 
   for fname in s:netrwmarkfilelist
 
4036
   for fname in s:netrwmarkfilelist_{curbufnr}
 
4037
    if a:islocal
 
4038
     if g:netrw_keepdir
 
4039
      let fname= s:ComposePath(curdir,fname)
 
4040
     endif
 
4041
    else
 
4042
     let fname= b:netrw_curdir.fname
 
4043
    endif
3106
4044
    if cmd =~ '%'
3107
4045
     let xcmd= substitute(cmd,'%',fname,'g')
3108
4046
    else
3124
4062
   endfor
3125
4063
 
3126
4064
   " unmark marked file list
3127
 
   unlet s:netrwmarkfilelist
3128
 
   unlet s:netrwmarkfilemtch
3129
 
   2match none
 
4065
   call s:NetrwUnmarkList(curbufnr,curdir)
3130
4066
 
3131
4067
   " refresh the listing
3132
4068
   call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
3133
4069
   call netrw#NetrwRestorePosn(svpos)
 
4070
  else
 
4071
   call netrw#ErrorMsg(s:ERROR,"no files marked!",59)
3134
4072
  endif
3135
4073
  
3136
4074
"  call Dret("s:NetrwMarkFileExe")
3137
4075
endfun
3138
4076
 
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("%")
 
4085
 
 
4086
  " s:netrwmarkfilelist_{curbufnr}: the List of marked files
 
4087
  if exists("s:netrwmarkfilelist_{curbufnr}")
 
4088
 
 
4089
   for fname in s:netrwmarkfilelist_{curbufnr}
 
4090
"     call Decho("s:NetrwMarkFileCopy: fname<".fname.">")
 
4091
     " construct suffix pattern
 
4092
     if fname =~ '\.'
 
4093
      let sfxpat= "^.*".substitute(fname,'^.*\(\.[^. ]\+\)$','\1','')
 
4094
     else
 
4095
      let sfxpat= '^\%(\%(\.\)\@!.\)*$'
 
4096
     endif
 
4097
     " determine if its in the hiding list or not
 
4098
     let inhidelist= 0
 
4099
     if g:netrw_list_hide != ""
 
4100
      let itemnum = 0
 
4101
      let hidelist= split(g:netrw_list_hide,',')
 
4102
      for hidepat in hidelist
 
4103
       if sfxpat == hidepat
 
4104
        let inhidelist= 1
 
4105
        break
 
4106
       endif
 
4107
       let itemnum= itemnum + 1
 
4108
      endfor
 
4109
     endif
 
4110
"     call Decho("fname<".fname."> inhidelist=".inhidelist." sfxpat<".sfxpat.">")
 
4111
     if inhidelist
 
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
 
4118
     else
 
4119
      " set hiding list to sfxpat
 
4120
      let g:netrw_list_hide= sfxpat
 
4121
     endif
 
4122
    endfor
 
4123
 
 
4124
   " refresh the listing
 
4125
   call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
 
4126
   call netrw#NetrwRestorePosn(svpos)
 
4127
  else
 
4128
   call netrw#ErrorMsg(s:ERROR,"no files marked!",59)
 
4129
  endif
 
4130
 
 
4131
"  call Dret("s:NetrwMarkHideSfx")
 
4132
endfun
 
4133
 
 
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("%")
 
4142
 
 
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
 
4150
   endfor
 
4151
   call s:NetrwUnmarkAll()
 
4152
 
 
4153
   " ask user for pattern
 
4154
   call inputsave()
 
4155
   let pat= input("Enter pattern: ","")
 
4156
   call inputrestore()
 
4157
   if pat !~ '^\s'
 
4158
    if pat !~ '^/'
 
4159
     let pat= '/'.pat.'/'
 
4160
    endif
 
4161
    let pat= " ".pat
 
4162
   endif
 
4163
 
 
4164
   " use vimgrep for both local and remote
 
4165
"   call Decho("exe vimgrep".pat." ".netrwmarkfilelist)
 
4166
   exe "vimgrep".pat." ".netrwmarkfilelist
 
4167
 
 
4168
   2match none
 
4169
   call netrw#NetrwRestorePosn(svpos)
 
4170
  endif
 
4171
 
 
4172
"  call Dret("s:NetrwMarkFileGrep")
 
4173
endfun
 
4174
 
 
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
3145
 
  endif
3146
 
 
3147
 
  if exists("s:netrwmarkfilelist")
3148
 
   let svpos= netrw#NetrwSavePosn()
3149
 
   if exists("s:netrwmftgt") && exists("s:netrwmfloc")
3150
 
 
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)
3158
 
        break
3159
 
       endif
3160
 
      else
3161
 
       call netrw#ErrorMsg(s:ERROR,"command<".g:netrw_localmovecmd."> is not executable!",57)
3162
 
       break
3163
 
      endif
3164
 
    else
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
3173
 
       if a:islocal
3174
 
        call s:NetrwLocalRm("---")
3175
 
       else
3176
 
        call s:NetrwRemoteRm("---","---")
3177
 
       endif
3178
 
      endif
3179
 
    endif
3180
 
 
3181
 
   " First, do a copy, then (attempt to) do a delete
3182
 
 
3183
 
   call netrw#NetrwRestorePosn(svpos)
3184
 
  endif
 
4182
  let curdir   = b:netrw_curdir
 
4183
  let curbufnr = bufnr("%")
 
4184
 
 
4185
  " sanity check
 
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")
 
4189
   return
 
4190
  endif
 
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")
 
4195
   return 0
 
4196
  endif
 
4197
"  call Decho("sanity chk passed: s:netrwmftgt<".s:netrwmftgt.">")
 
4198
 
 
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)
 
4209
      break
 
4210
     endif
 
4211
    endfor
 
4212
   else
 
4213
    call netrw#ErrorMsg(s:ERROR,"command<".g:netrw_localmovecmd."> is not executable!",57)
 
4214
   endif
 
4215
 
 
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")
 
4223
   for fname in mflist
 
4224
    let barefname = substitute(fname,'^\(.*/\)\(.\{-}\)$','\2','')
 
4225
    let ok        = s:NetrwLocalRmFile(b:netrw_curdir,barefname,1)
 
4226
   endfor
 
4227
   unlet mflist
 
4228
 
 
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")
 
4236
   for fname in mflist
 
4237
    let barefname = substitute(fname,'^\(.*/\)\(.\{-}\)$','\2','')
 
4238
    let ok        = s:NetrwRemoteRmFile(b:netrw_curdir,barefname,1)
 
4239
   endfor
 
4240
   unlet mflist
 
4241
 
 
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")
 
4249
   for fname in mflist
 
4250
    let barefname = substitute(fname,'^\(.*/\)\(.\{-}\)$','\2','')
 
4251
    let ok        = s:NetrwRemoteRmFile(b:netrw_curdir,barefname,1)
 
4252
   endfor
 
4253
   unlet mflist
 
4254
  endif
 
4255
 
 
4256
  " -------
 
4257
  " cleanup
 
4258
  " -------
 
4259
"  call Decho("cleanup")
 
4260
 
 
4261
  " remove markings from local buffer
 
4262
  call s:NetrwUnmarkList(curbufnr,curdir)                   " remove markings from local buffer
 
4263
 
 
4264
  " refresh buffers
 
4265
  if !s:netrwmftgt_islocal
 
4266
   call s:NetrwRefreshDir(s:netrwmftgt_islocal,s:netrwmftgt)
 
4267
  endif
 
4268
  if a:islocal
 
4269
   call s:NetrwRefreshDir(a:islocal,b:netrw_curdir)
 
4270
  endif
 
4271
  call s:LocalBrowseShellCmdRefresh()
3185
4272
  
3186
4273
"  call Dret("s:NetrwMarkFileMove")
3187
4274
endfun
3188
4275
 
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
3196
 
  endif
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
 
4287
    if a:islocal
 
4288
     if g:netrw_keepdir
 
4289
      let fname= s:ComposePath(curdir,fname)
 
4290
     endif
 
4291
    else
 
4292
     let fname= curdir.fname
 
4293
    endif
3202
4294
    1split
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")
3205
4299
    hardcopy
3206
4300
    q
3207
4301
   endfor
3211
4305
endfun
3212
4306
 
3213
4307
" ---------------------------------------------------------------------
3214
 
 
3215
 
" ===========================================
3216
4308
" s:NetrwMarkFileRegexp: (invoked by mr) This function is used to mark {{{2
3217
4309
"                        files when given a regexp (for which a prompt is
3218
4310
"                        issued).
3219
4311
fun! s:NetrwMarkFileRegexp(islocal)
3220
4312
"  call Dfunc("s:NetrwMarkFileRegexp(islocal=".a:islocal.")")
3221
 
  if a:islocal && exists("b:netrw_curdir")
3222
 
   exe "cd ".b:netrw_curdir
3223
 
  endif
3224
4313
 
3225
4314
  " get the regular expression
3226
4315
  call inputsave()
3229
4318
 
3230
4319
  if a:islocal
3231
4320
   " get the matching list of files using local glob()
3232
 
   let dirname    = escape(b:netrw_curdir,s:netrw_glob_escape)
3233
 
   let filelist   = glob(s:ComposePath(dirname,regexp))
 
4321
"   call Decho("handle local regexp")
 
4322
   let dirname  = escape(b:netrw_curdir,g:netrw_glob_escape)
 
4323
   let filelist = glob(s:ComposePath(dirname,regexp))
3234
4324
   if filelist != ""
3235
4325
    let filelist= filelist."\n"
3236
4326
   endif
3250
4340
  endwhile
3251
4341
 
3252
4342
  else
 
4343
"   call Decho("handle remote regexp")
3253
4344
 
3254
4345
   " convert displayed listing into a filelist
3255
4346
   let eikeep = &ei
3256
4347
   let areg   = @a
3257
4348
   silent %y a
3258
4349
   set ei=all ma
 
4350
"   call Decho("set ei=all ma")
3259
4351
   1split
3260
4352
   enew
3261
4353
   silent norm! "ap
3271
4363
    silent %s/^| //e
3272
4364
    silent! g/^ .*$/d
3273
4365
   endif
 
4366
   " convert regexp into the more usual glob-style format
 
4367
   let regexp= substitute(regexp,'\*','.*','g')
 
4368
"   call Decho("regexp<".regexp.">")
3274
4369
   exe "silent! v/".escape(regexp,'/')."/d"
3275
4370
   let filelist= getline(1,line("$"))
3276
4371
   q!
3286
4381
endfun
3287
4382
 
3288
4383
" ---------------------------------------------------------------------
3289
 
" s:NetrwMarkFileTag: (invoked by mt) This function applies {{{2
3290
 
"                     g:netrw_ctags to marked files
 
4384
" s:NetrwMarkFileSource: (invoked by ms) This function sources marked files {{{2
 
4385
"                        Uses the local marked file list.
 
4386
fun! s:NetrwMarkFileSource(islocal)
 
4387
"  call Dfunc("s:NetrwMarkFileSource(islocal=".a:islocal.")")
 
4388
  let curbufnr= bufnr("%")
 
4389
  if exists("s:netrwmarkfilelist_{curbufnr}")
 
4390
   let netrwmarkfilelist = s:netrwmarkfilelist_{bufnr("%")}
 
4391
   let curdir            = b:netrw_curdir
 
4392
   call s:NetrwUnmarkList(curbufnr,curdir)
 
4393
   for fname in netrwmarkfilelist
 
4394
    if a:islocal
 
4395
     if g:netrw_keepdir
 
4396
      let fname= s:ComposePath(curdir,fname)
 
4397
     endif
 
4398
    else
 
4399
     let fname= curdir.fname
 
4400
    endif
 
4401
    " the autocmds will handle sourcing both local and remote files
 
4402
"    call Decho("exe so ".escape(fname,' '))
 
4403
    exe "so ".escape(fname,' ')
 
4404
   endfor
 
4405
   2match none
 
4406
  endif
 
4407
"  call Dret("s:NetrwMarkFileSource")
 
4408
endfun
 
4409
 
 
4410
" ---------------------------------------------------------------------
 
4411
" s:NetrwMarkFileTag: (invoked by mT) This function applies g:netrw_ctags to marked files {{{2
 
4412
"                     Uses the global markfilelist
3291
4413
fun! s:NetrwMarkFileTag(islocal)
3292
4414
"  call Dfunc("s:NetrwMarkFileTag(islocal=".a:islocal.")")
3293
 
  let svpos= netrw#NetrwSavePosn()
3294
 
  if a:islocal && exists("b:netrw_curdir")
3295
 
   exe "cd ".b:netrw_curdir
3296
 
  endif
 
4415
  let svpos    = netrw#NetrwSavePosn()
 
4416
  let curdir   = b:netrw_curdir
 
4417
  let curbufnr = bufnr("%")
3297
4418
 
3298
4419
  if exists("s:netrwmarkfilelist")
3299
 
"   call Decho("s:netrwmarkfilelist<".string(s:netrwmarkfilelist).">")
3300
 
   let netrwmarkfilelist= string(s:netrwmarkfilelist)
3301
 
   unlet s:netrwmarkfilelist
3302
 
   unlet s:netrwmarkfilemtch
3303
 
   let netrwmarkfilelist= substitute(netrwmarkfilelist,'[[\],]','','g')
3304
 
"   call Decho("netrwmarkfilelist<".netrwmarkfilelist.">")
 
4420
"   call Decho("s:netrwmarkfilelist".string(s:netrwmarkfilelist).">")
 
4421
   if a:islocal && g:netrw_keepdir
 
4422
    let netrwmarkfilelist= ""
 
4423
    for fname in s:netrwmarkfilelist
 
4424
"     let netrwmarkfilelist= netrwmarkfilelist." ".s:ComposePath(curdir,fname)
 
4425
     let netrwmarkfilelist= netrwmarkfilelist." ".fname
 
4426
    endfor
 
4427
   else
 
4428
    let netrwmarkfilelist= string(s:netrwmarkfilelist)
 
4429
    let netrwmarkfilelist= substitute(netrwmarkfilelist,'[[\],]','','g')
 
4430
   endif
 
4431
   call s:NetrwUnmarkAll()
3305
4432
 
3306
4433
   if a:islocal
3307
4434
    if executable(g:netrw_ctags)
3308
 
     if g:netrw_shq != "'"
3309
 
      let netrwmarkfilelist= substitute(netrwmarkfilelist,"'",g:netrw_shq,'g')
3310
 
     endif
 
4435
     call map(netrwmarkfilelist,"shellescape(v:val)")
3311
4436
"     call Decho("call system(".g:netrw_ctags." ".netrwmarkfilelist.")")
3312
4437
     call system(g:netrw_ctags." ".netrwmarkfilelist)
3313
4438
    else
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
3346
4473
  endif
3347
4474
 
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
 
4475
  " set up target
 
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.">")
 
4480
 
3351
4481
  else
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
3355
 
   if g:netrw_cygwin
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.">")
 
4493
   else
 
4494
    let s:netrwmftgt = curdir
 
4495
"    call Decho("isfile: s:netrwmftgt<".s:netrwmftgt.">")
3357
4496
   endif
3358
4497
  endif
 
4498
  if a:islocal
 
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.">")
 
4502
  endif
 
4503
  if g:netrw_cygwin
 
4504
   let s:netrwmftgt= substitute(system("cygpath ".shellescape(s:netrwmftgt)),'\n$','','')
 
4505
   let s:netrwmftgt= substitute(s:netrwmftgt,'\n$','','')
 
4506
  endif
 
4507
  let s:netrwmftgt_islocal= a:islocal
3359
4508
 
 
4509
  if g:netrw_fastbrowse > 0
 
4510
   call s:LocalBrowseShellCmdRefresh()
 
4511
  endif
3360
4512
  call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
3361
4513
  call netrw#NetrwRestorePosn(svpos)
3362
 
"  call Dret("s:NetrwMarkFileTgt")
3363
 
endfun
3364
 
 
3365
 
" ===========================================
 
4514
  if !hadtgt
 
4515
   norm! j
 
4516
  endif
 
4517
 
 
4518
"  call Dret("s:NetrwMarkFileTgt : netrwmftgt<".(exists("s:netrwmftgt")? s:netrwmftgt : "").">")
 
4519
endfun
 
4520
 
 
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.">)")
 
4525
 
 
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
 
4532
   endfor
 
4533
   if s:netrwmarkfilelist == []
 
4534
    unlet s:netrwmarkfilelist
 
4535
   endif
 
4536
 
 
4537
   " getting rid of the local marked-file lists is easy
 
4538
   unlet s:netrwmarkfilelist_{a:curbufnr}
 
4539
  endif
 
4540
  if exists("s:netrwmarkfilemtch_{a:curbufnr}")
 
4541
   unlet s:netrwmarkfilemtch_{a:curbufnr}
 
4542
  endif
 
4543
  2match none
 
4544
"  call Dret("s:NetrwUnmarkList")
 
4545
endfun
 
4546
 
 
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
 
4553
  endif
 
4554
  silent call s:NetrwUnmarkAll2()
 
4555
  2match none
 
4556
"  call Dret("s:NetrwUnmarkAll")
 
4557
endfun
 
4558
 
 
4559
" ---------------------------------------------------------------------
 
4560
" s:NetrwUnmarkAll2: {{{2
 
4561
fun! s:NetrwUnmarkAll2()
 
4562
"  call Dfunc("s:NetrwUnmarkAll2()")
 
4563
  redir => netrwmarkfilelist_let
 
4564
  let
 
4565
  redir END
 
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}
 
4573
  endfor
 
4574
"  call Dret("s:NetrwUnmarkAll2")
 
4575
endfun
 
4576
 
 
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("%")
 
4583
 
 
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}
 
4591
   2match none
 
4592
  endif
 
4593
 
 
4594
"  call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
 
4595
  call netrw#NetrwRestorePosn(svpos)
 
4596
"  call Dret("s:NetrwUnMarkFile")
 
4597
endfun
 
4598
 
 
4599
" ---------------------------------------------------------------------
 
4600
" s:NetrwMenu: generates the menu for gvim and netrw {{{2
 
4601
fun! s:NetrwMenu(domenu)
 
4602
 
 
4603
  if !exists("g:NetrwMenuPriority")
 
4604
   let g:NetrwMenuPriority= 80
 
4605
  endif
 
4606
 
 
4607
  if has("menu") && has("gui_running") && &go =~ 'm' && g:netrw_menu
 
4608
"   call Dfunc("NetrwMenu(domenu=".a:domenu.")")
 
4609
 
 
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
 
4666
 
 
4667
   elseif !a:domenu
 
4668
    let s:netrwcnt = 0
 
4669
    let curwin     = winnr()
 
4670
    windo if getline(2) =~ "Netrw" | let s:netrwcnt= s:netrwcnt + 1 | endif
 
4671
    exe curwin."wincmd w"
 
4672
 
 
4673
    if s:netrwcnt <= 1
 
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
 
4678
    endif
 
4679
   endif
 
4680
"   call Dret("NetrwMenu")
 
4681
  endif
 
4682
 
 
4683
endfun
 
4684
 
 
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.")")
3369
4690
 
3370
 
  if exists("s:netrwmarkfilelist")
3371
 
   for fname in s:netrwmarkfilelist
3372
 
    call netrw#NetrwObtain(a:islocal,fname)
3373
 
   endfor
3374
 
   unlet s:netrwmarkfilelist
3375
 
   unlet s:netrwmarkfilemtch
3376
 
   2match none
 
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)
3377
4695
  else
3378
4696
   call netrw#NetrwObtain(a:islocal,expand("<cWORD>"))
3379
4697
  endif
3383
4701
 
3384
4702
" ---------------------------------------------------------------------
3385
4703
" netrw#NetrwObtain: {{{2
 
4704
"   netrw#NetrwObtain(islocal,fname[,tgtdirectory])
 
4705
"     islocal=0  obtain from remote source
 
4706
"            =1  obtain from local source
 
4707
"     fname  :   a filename or a list of filenames
 
4708
"     tgtdir :   optional place where files are to go  (not present, uses getcwd())
3386
4709
fun! netrw#NetrwObtain(islocal,fname,...)
3387
 
"  call Dfunc("netrw#NetrwObtain(islocal=".a:islocal." fname<".a:fname.">) a:0=".a:0)
 
4710
"  call Dfunc("netrw#NetrwObtain(islocal=".a:islocal." fname<".((type(a:fname) == 1)? a:fname : string(a:fname)).">) a:0=".a:0)
3388
4711
  " NetrwStatusLine support - for obtaining support
3389
4712
 
 
4713
  if type(a:fname) == 1
 
4714
   let fnamelist= [ a:fname ]
 
4715
  elseif type(a:fname) == 3
 
4716
   let fnamelist= a:fname
 
4717
  else
 
4718
   call netrw#ErrorMsg(s:ERROR,"attempting to use NetrwObtain on something not a filename or a list",62)
 
4719
"   call Dret("netrw#NetrwObtain")
 
4720
   return
 
4721
  endif
 
4722
"  call Decho("fnamelist<".string(fnamelist).">")
 
4723
  if a:0 > 0
 
4724
   let tgtdir= a:1
 
4725
  else
 
4726
   let tgtdir= getcwd()
 
4727
  endif
 
4728
"  call Decho("tgtdir<".tgtdir.">")
 
4729
 
3390
4730
  if a:islocal
3391
 
 
3392
 
   " obtain local file from getcwd() to b:netrw_curdir
 
4731
   " obtain a file from b:netrw_curdir to getcwd()
 
4732
"   call Decho("obtain a local file from ".b:netrw_curdir." to ".tgtdir
3393
4733
   if exists("b:netrw_curdir") && getcwd() != b:netrw_curdir
3394
 
    let fname= expand("<cWORD>")
3395
 
    let fcopy= readfile(b:netrw_curdir."/".fname,"b")
3396
 
    call writefile(fcopy,getcwd()."/".fname,"b")
 
4734
    let topath= s:ComposePath(tgtdir,"")
 
4735
    if (has("win32") || has("win95") || has("win64") || has("win16"))
 
4736
     " transfer files one at time
 
4737
     for fname in fnamelist
 
4738
"      call Decho("system(".g:netrw_localcopycmd." ".fname." ".shellescape(topath).")")
 
4739
      call system(g:netrw_localcopycmd." ".fname." ".shellescape(topath))
 
4740
     endfor
 
4741
    else
 
4742
     " transfer files with one command
 
4743
     let filelist= join(map(copy(fname),"shellescape(v:val)"))
 
4744
"     call Decho("system(".g:netrw_localcopycmd." ".filelist." ".shellescape(topath).")")
 
4745
     call system(g:netrw_localcopycmd." ".filelist." ".shellescape(topath))
 
4746
    endif
3397
4747
   elseif !exists("b:netrw_curdir")
3398
4748
    call netrw#ErrorMsg(s:ERROR,"local browsing directory doesn't exist!",36)
3399
4749
   else
3401
4751
   endif
3402
4752
 
3403
4753
  else
3404
 
 
3405
 
   " obtain a remote file to local directory (see tgtdir below)
3406
 
   call s:SetupNetrwStatusLine('%f %h%m%r%=%9*Obtaining '.a:fname)
3407
 
   
3408
 
   " set up target directory (default is vim's idea of the current directory)
3409
 
   if a:0 > 0
3410
 
    let tgtdir= a:1
3411
 
   else
3412
 
    let tgtdir= '.'
3413
 
   endif
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
3423
 
     setlocal ma noro
3424
 
     keepjumps $
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)
3430
 
 
3431
 
     ".........................................
3432
 
     if w:netrw_method == 2
3433
 
      " ftp + <.netrc>: Method #2
3434
 
      setlocal ff=unix
3435
 
      if path != ""
3436
 
       put ='cd '.path
3437
 
"      call Decho("ftp:  cd ".path)
3438
 
      endif
3439
 
      if tgtdir != '.'
3440
 
       put ='lcd '.tgtdir
3441
 
      endif
3442
 
      put ='get '.a:fname
3443
 
"     call Decho("ftp:  get ".a:fname)
3444
 
      put ='quit'
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)
 
4757
   endif
 
4758
   call s:NetrwMethod(b:netrw_curdir)
 
4759
 
 
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
 
4765
    else
 
4766
     let useport= ""
 
4767
    endif
 
4768
    if b:netrw_fname =~ '/'
 
4769
     let path= substitute(b:netrw_fname,'^\(.*/\).\{-}$','\1','')
 
4770
    else
 
4771
     let path= ""
 
4772
    endif
 
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)
 
4776
 
 
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("%")
 
4782
     setlocal ff=unix
 
4783
     if exists("g:netrw_ftpmode") && g:netrw_ftpmode != ""
 
4784
      exe "put ='".g:netrw_ftpmode."'"
 
4785
"      call Decho("filter input: ".getline('$'))
 
4786
     endif
 
4787
 
 
4788
     if exists("b:netrw_fname") && b:netrw_fname != ""
 
4789
      call setline(line("$")+1,'cd "'.b:netrw_fname.'"')
 
4790
"      call Decho("filter input: ".getline('$'))
 
4791
     endif
 
4792
 
 
4793
     if exists("g:netrw_ftpextracmd")
 
4794
      exe "put ='".g:netrw_ftpextracmd."'"
 
4795
"      call Decho("filter input: ".getline('$'))
 
4796
     endif
 
4797
     for fname in fnamelist
 
4798
      call setline(line("$")+1,'get "'.fname.'"')
 
4799
"      call Decho("filter input: ".getline('$'))
 
4800
     endfor
 
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
 
4804
     else
 
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
 
4807
     endif
 
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
 
4811
      setlocal debug=msg
 
4812
      call netrw#ErrorMsg(s:ERROR,getline(1),4)
 
4813
      let &debug= debugkeep
 
4814
     endif
 
4815
 
 
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("%")
 
4821
    setlocal ff=unix
 
4822
 
 
4823
    if exists("g:netrw_port") && g:netrw_port != ""
 
4824
     put ='open '.g:netrw_machine.' '.g:netrw_port
 
4825
"     call Decho("filter input: ".getline('$'))
 
4826
    else
 
4827
     put ='open '.g:netrw_machine
 
4828
"     call Decho("filter input: ".getline('$'))
 
4829
    endif
 
4830
 
 
4831
    if exists("g:netrw_ftp") && g:netrw_ftp == 1
 
4832
     put =g:netrw_uid
 
4833
"     call Decho("filter input: ".getline('$'))
 
4834
     put ='\"'.s:netrw_passwd.'\"'
 
4835
"     call Decho("filter input: ".getline('$'))
 
4836
    else
 
4837
     put ='user \"'.g:netrw_uid.'\" \"'.s:netrw_passwd.'\"'
 
4838
"     call Decho("filter input: ".getline('$'))
 
4839
    endif
 
4840
 
 
4841
    if exists("g:netrw_ftpmode") && g:netrw_ftpmode != ""
 
4842
     put =g:netrw_ftpmode
 
4843
"     call Decho("filter input: ".getline('$'))
 
4844
    endif
 
4845
 
 
4846
    if exists("b:netrw_fname") && b:netrw_fname != ""
 
4847
     call setline(line("$")+1,'cd "'.b:netrw_fname.'"')
 
4848
"     call Decho("filter input: ".getline('$'))
 
4849
    endif
 
4850
 
 
4851
    if exists("g:netrw_ftpextracmd")
 
4852
     exe "put ='".g:netrw_ftpextracmd."'"
 
4853
"     call Decho("filter input: ".getline('$'))
 
4854
    endif
 
4855
 
 
4856
    if exists("g:netrw_ftpextracmd")
 
4857
     exe "put ='".g:netrw_ftpextracmd."'"
 
4858
"     call Decho("filter input: ".getline('$'))
 
4859
    endif
 
4860
    for fname in fnamelist
 
4861
     call setline(line("$")+1,'get "'.fname.'"')
 
4862
    endfor
 
4863
"    call Decho("filter input: ".getline('$'))
 
4864
 
 
4865
    " perform ftp:
 
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
 
4869
    norm! 1Gdd
 
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)
 
4877
     endif
 
4878
    endif
 
4879
   endif
 
4880
 
 
4881
  endif
 
4882
 
 
4883
  " cleanup
 
4884
  if exists("tmpbufnr")
 
4885
   if bufnr("%") != tmpbufnr
 
4886
    exe tmpbufnr."bw!"
 
4887
   else
 
4888
    q!
 
4889
   endif
 
4890
  endif
 
4891
 
 
4892
"  call Dret("netrw#NetrwObtain")
 
4893
endfun
 
4894
 
 
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.
 
4898
"   Returns:
 
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.")")
 
4905
 
 
4906
  " grab a copy of the b:netrw_curdir to pass it along to newly split windows
 
4907
  let curdir    = b:netrw_curdir
 
4908
 
 
4909
  " get last window number and the word currently under the cursor
 
4910
  let lastwinnr = winnr("$")
 
4911
  let curword   = s:NetrwGetWord()
 
4912
  let choice    = 0
 
4913
"  call Decho("lastwinnr=".lastwinnr." curword<".curword.">")
 
4914
 
 
4915
  let didsplit  = 0
 
4916
  if lastwinnr == 1
 
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.")")
 
4919
   if g:netrw_preview
 
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"
 
4922
   else
 
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"
 
4925
   endif
 
4926
   let didsplit  = 1
 
4927
 
 
4928
  else
 
4929
   call s:SaveBufVars()
 
4930
"   call Decho("wincmd p")
 
4931
   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)
 
4937
   let bnrcnt = 0
 
4938
   if &mod
 
4939
"    call Decho("detected: prev window's buffer has been modified: bnr=".bnr." winnr#".winnr())
 
4940
    let eikeep= &ei
 
4941
    set ei=all
 
4942
    windo if winbufnr(0) == bnr | let bnrcnt=bnrcnt+1 | endif
 
4943
    exe bnr."wincmd p"
 
4944
    let &ei= eikeep
 
4945
"    call Decho("bnr=".bnr." bnrcnt=".bnrcnt." buftype=".&bt." winnr#".winnr())
 
4946
    if bnrcnt == 1
 
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())
 
4950
 
 
4951
     if choice == 1
 
4952
      " Yes -- write file & then browse
 
4953
      let v:errmsg= ""
 
4954
      silent w
 
4955
      if v:errmsg != ""
 
4956
       call netrw#ErrorMsg(s:ERROR,"unable to write <".bufname.">!",30)
 
4957
       if didsplit
 
4958
        q
 
4959
       else
 
4960
        wincmd p
 
4961
       endif
 
4962
"       call Dret("NetrwPrevWinOpen ".choice." : unable to write <".bufname.">")
 
4963
       return choice
 
4964
      endif
 
4965
 
 
4966
     elseif choice == 2
 
4967
      " No -- don't worry about changed file, just browse anyway
 
4968
      setlocal nomod
 
4969
      call netrw#ErrorMsg(s:WARNING,bufname." changes to ".bufname." abandoned",31)
 
4970
      wincmd p
 
4971
 
 
4972
     else
 
4973
      " Cancel -- don't do this
 
4974
      if didsplit
 
4975
       q
3449
4976
      else
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
 
4977
       wincmd p
3452
4978
      endif
3453
 
 
3454
 
    ".........................................
3455
 
   elseif w:netrw_method == 3
3456
 
    " ftp + machine,id,passwd,filename: Method #3
 
4979
"      call Dret("NetrwPrevWinOpen ".choice." : cancelled")
 
4980
      return choice
 
4981
     endif
 
4982
    endif
 
4983
   endif
 
4984
  endif
 
4985
 
 
4986
  " restore b:netrw_curdir (window split/enew may have lost it)
 
4987
  let b:netrw_curdir= curdir
 
4988
  if a:islocal < 2
 
4989
   if a:islocal
 
4990
    call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(a:islocal,curword))
 
4991
   else
 
4992
    call s:NetrwBrowse(a:islocal,s:NetrwBrowseChgDir(a:islocal,curword))
 
4993
   endif
 
4994
  endif
 
4995
"  call Dret("NetrwPrevWinOpen ".choice)
 
4996
  return choice
 
4997
endfun
 
4998
 
 
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)
 
5006
 
 
5007
  if a:tgt =~ '^\a\+://'
 
5008
   let tgtdir= substitute(a:tgt,'^\a\+://[^/]\+/\(.\{-}\)$','\1','')
 
5009
  else
 
5010
   let tgtdir= substitute(a:tgt,'^\(.*\)/[^/]*$','\1','')
 
5011
  endif
 
5012
"  call Decho("tgtdir<".tgtdir.">")
 
5013
 
 
5014
  if a:0 > 0
 
5015
   let fromdir= a:1
 
5016
  else
 
5017
   let fromdir= getcwd()
 
5018
  endif
 
5019
"  call Decho("fromdir<".fromdir.">")
 
5020
 
 
5021
  if type(a:fname) == 1
 
5022
   " handle uploading a single file using NetWrite
 
5023
"   call Decho("handle uploading a single file via NetWrite")
 
5024
   1split
 
5025
   let efname= escape(a:fname,g:netrw_fname_escape)
 
5026
"   call Decho("exe e ".efname)
 
5027
   exe "e ".efname
 
5028
"   call Decho("now locally editing<".expand("%").">, has ".line("$")." lines")
 
5029
   if a:tgt =~ '/$'
 
5030
    let wfname= substitute(a:fname,'^.*/','','')
 
5031
    let wfname= escape(a:tgt.wfname,g:netrw_fname_escape)
 
5032
"    call Decho("exe w! ".wfname)
 
5033
    exe "w! ".wfname
 
5034
   else
 
5035
    let wfname= escape(a:tgt,g:netrw_fname_escape)
 
5036
"    call Decho("writing local->remote: exe w ".wfname)
 
5037
    exe "w ".wfname
 
5038
"    call Decho("done writing local->remote")
 
5039
   endif
 
5040
   q!
 
5041
 
 
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()
 
5046
   if a:tgt =~ '^scp:'
 
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
 
5052
    else
 
5053
     let useport= ""
 
5054
    endif
 
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)
 
5060
 
 
5061
   elseif a:tgt =~ '^ftp:'
 
5062
    call s:NetrwMethod(a:tgt)
 
5063
 
 
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())
 
5069
 
 
5070
     exe "put ='".g:netrw_ftpmode."'"
 
5071
"     call Decho("filter input: ".getline('$'))
 
5072
 
 
5073
     if exists("g:netrw_ftpextracmd")
 
5074
      exe "put ='".g:netrw_ftpextracmd."'"
 
5075
"      call Decho("filter input: ".getline('$'))
 
5076
     endif
 
5077
 
 
5078
     call setline(line("$")+1,'lcd "'.fromdir.'"')
 
5079
"     call Decho("filter input: ".getline('$'))
 
5080
 
 
5081
     call setline(line("$")+1,'cd "'.tgtdir.'"')
 
5082
"     call Decho("filter input: ".getline('$'))
 
5083
 
 
5084
     for fname in a:fname
 
5085
      call setline(line("$")+1,'put "'.fname.'"')
 
5086
"      call Decho("filter input: ".getline('$'))
 
5087
     endfor
 
5088
 
 
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
 
5092
     else
 
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
 
5096
     endif
 
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)
 
5101
     else
 
5102
      bw!|q
 
5103
     endif
 
5104
 
 
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
 
5111
 
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('$'))
3461
5115
     else
3462
5116
      put ='open '.g:netrw_machine
3463
 
"     call Decho('ftp:  open '.g:netrw_machine)
 
5117
"      call Decho("filter input: ".getline('$'))
3464
5118
     endif
3465
5119
 
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('$'))
3471
5125
     else
3472
5126
      put ='user \"'.g:netrw_uid.'\" \"'.s:netrw_passwd.'\"'
3473
 
"     call Decho('user '.g:netrw_uid.' '.s:netrw_passwd)
3474
 
     endif
3475
 
 
3476
 
    if path != ""
3477
 
     put ='cd '.path
3478
 
"    call Decho('cd '.a:path)
3479
 
    endif
3480
 
    if tgtdir != '.'
3481
 
     put ='lcd '.tgtdir
3482
 
    endif
3483
 
    put ='get '.a:fname
3484
 
"   call Decho("ftp:  get ".a:fname)
3485
 
    put ='quit'
3486
 
"   call Decho("ftp:  quit")
 
5127
"      call Decho("filter input: ".getline('$'))
 
5128
     endif
 
5129
 
 
5130
     call setline(line("$")+1,'lcd "'.fromdir.'"')
 
5131
"     call Decho("filter input: ".getline('$'))
 
5132
 
 
5133
     if exists("b:netrw_fname") && b:netrw_fname != ""
 
5134
      call setline(line("$")+1,'cd "'.b:netrw_fname.'"')
 
5135
"      call Decho("filter input: ".getline('$'))
 
5136
     endif
 
5137
 
 
5138
     if exists("g:netrw_ftpextracmd")
 
5139
      exe "put ='".g:netrw_ftpextracmd."'"
 
5140
"      call Decho("filter input: ".getline('$'))
 
5141
     endif
 
5142
 
 
5143
     for fname in a:fname
 
5144
      call setline(line("$")+1,'put "'.fname.'"')
 
5145
"      call Decho("filter input: ".getline('$'))
 
5146
     endfor
3487
5147
 
3488
5148
     " perform ftp:
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"
3494
 
 
3495
 
     ".........................................
 
5152
     norm! 1Gdd
 
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
 
5159
      setlocal debug=msg
 
5160
      call netrw#ErrorMsg(s:ERROR,getline(1),15)
 
5161
      let &debug = debugkeep
 
5162
      let mod    = 1
3496
5163
     else
3497
 
      call netrw#ErrorMsg(s:WARNING,"unable to comply with your request<" . choice . ">",28)
3498
 
     endif
3499
 
     " restore
3500
 
     exe "silent! ".endline.",$d"
3501
 
     exe "keepjumps ".curline
3502
 
     setlocal noma nomod ro
3503
 
    else
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)
3507
 
     endif
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
3515
 
     endif
3516
 
"    call Dret("NetrwObtain")
3517
 
     return
 
5164
      bw!|q
 
5165
     endif
3518
5166
    endif
3519
 
 
3520
 
   ".........................................
3521
5167
   else
3522
 
    " scp: Method#4
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
3529
 
    else
3530
 
     let useport= ""
3531
 
    endif
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
3535
 
    endif
3536
 
 
3537
 
    " restore status line
3538
 
    let &stl        = s:netrw_users_stl
3539
 
    let &laststatus = s:netrw_users_ls
3540
 
    redraw!
3541
 
 
3542
 
    " restore NetrwMethod
3543
 
    if exists("keep_netrw_method")
3544
 
     call s:NetrwMethod(keep_netrw_choice)
3545
 
     let w:netrw_method  = keep_netrw_wmethod
3546
 
    endif
 
5168
    call netrw#ErrorMsg(s:ERROR,"can't obtain files with protocol from<".a:tgt.">",63)
3547
5169
   endif
3548
 
 
3549
 
"  call Dret("netrw#NetrwObtain")
3550
 
endfun
3551
 
 
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.">)")
3559
 
 
3560
 
  1split
3561
 
"  call Decho("exe e ".a:fname)
3562
 
  exe "e ".escape(a:fname,g:netrw_fname_escape)
3563
 
  if a:tgt =~ '/$'
3564
 
"   call Decho("exe w ".a:tgt.a:fname)
3565
 
   exe "w ".escape(a:tgt.a:fname,g:netrw_fname_escape)
3566
 
  else
3567
 
"   call Decho("exe w ".a:tgt)
3568
 
   exe "w ".escape(a:tgt,g:netrw_fname_escape)
3569
5170
  endif
3570
 
  q!
3571
5171
 
3572
5172
"  call Dret("s:NetrwUpload")
3573
5173
endfun
3599
5199
  " NetrwBrowseChgDir() may clear the display; hence a NetrwSavePosn() may not work if its placed here.
3600
5200
  " Also, NetrwBrowseChgDir() now does a NetrwSavePosn() itself.
3601
5201
  setlocal ma noro
 
5202
"  call Decho("setlocal ma noro")
3602
5203
"  call Decho("clear buffer<".expand("%")."> with :%d")
3603
5204
  %d
3604
5205
  if a:islocal
3607
5208
   call s:NetrwBrowse(a:islocal,a:dirname)
3608
5209
  endif
3609
5210
  call netrw#NetrwRestorePosn()
3610
 
  redraw!
 
5211
 
 
5212
  " restore file marks
 
5213
  if exists("s:netrwmarkfilemtch_{bufnr('%')}") && s:netrwmarkfilemtch_{bufnr("%")} != ""
 
5214
"   call Decho("exe 2match netrwMarkFile /".s:netrwmarkfilemtch_{bufnr("%")}."/")
 
5215
   exe "2match netrwMarkFile /".s:netrwmarkfilemtch_{bufnr("%")}."/"
 
5216
  else
 
5217
"   call Decho("2match none")
 
5218
   2match none
 
5219
  endif
 
5220
 
 
5221
"  redraw!
3611
5222
"  call Dret("NetrwRefresh")
3612
5223
endfun
3613
5224
 
3614
5225
" ---------------------------------------------------------------------
 
5226
" s:NetrwRefreshDir: refreshes a directory by name {{{2
 
5227
"                    Called by NetrwMarkFileCopy()
 
5228
"                    Interfaces to s:NetrwRefresh() and s:LocalBrowseShellCmdRefresh()
 
5229
fun! s:NetrwRefreshDir(islocal,dirname)
 
5230
"  call Dfunc("s:NetrwRefreshDir(islocal=".a:islocal." dirname<".a:dirname.">) fastbrowse=".g:netrw_fastbrowse)
 
5231
  if g:netrw_fastbrowse == 0
 
5232
   " slowest mode (keep buffers refreshed, local or remote)
 
5233
"   call Decho("slowest mode: keep buffers refreshed, local or remote")
 
5234
   let tgtwin= bufwinnr(a:dirname)
 
5235
"   call Decho("tgtwin= bufwinnr(".a:dirname.")=".tgtwin)
 
5236
 
 
5237
   if tgtwin > 0
 
5238
    " tgtwin is being displayed, so refresh it
 
5239
    let curwin= winnr()
 
5240
"    call Decho("refresh tgtwin#".tgtwin." (curwin#".curwin.")")
 
5241
    exe tgtwin."wincmd w"
 
5242
    call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./')) 
 
5243
    exe curwin."wincmd w"
 
5244
 
 
5245
   elseif bufnr(a:dirname) > 0
 
5246
    let bn= bufnr(a:dirname)
 
5247
"    call Decho("bd bufnr(".a:dirname.")=".bn)
 
5248
    exe "silent bd ".bn
 
5249
   endif
 
5250
 
 
5251
  elseif g:netrw_fastbrowse <= 1
 
5252
"   call Decho("medium-speed mode: refresh local buffers only")
 
5253
   call s:LocalBrowseShellCmdRefresh()
 
5254
  endif
 
5255
"  call Dret("s:NetrwRefreshDir")
 
5256
endfun
 
5257
 
 
5258
" ---------------------------------------------------------------------
 
5259
" s:NetrwSetSort: sets up the sort based on the g:netrw_sort_sequence {{{2
 
5260
"          What this function does is to compute a priority for the patterns
 
5261
"          in the g:netrw_sort_sequence.  It applies a substitute to any
 
5262
"          "files" that satisfy each pattern, putting the priority / in
 
5263
"          front.  An "*" pattern handles the default priority.
 
5264
fun! s:NetrwSetSort()
 
5265
"  call Dfunc("SetSort() bannercnt=".w:netrw_bannercnt)
 
5266
  if w:netrw_liststyle == s:LONGLIST
 
5267
   let seqlist  = substitute(g:netrw_sort_sequence,'\$','\\%(\t\\|\$\\)','ge')
 
5268
  else
 
5269
   let seqlist  = g:netrw_sort_sequence
 
5270
  endif
 
5271
  " sanity check -- insure that * appears somewhere
 
5272
  if seqlist == ""
 
5273
   let seqlist= '*'
 
5274
  elseif seqlist !~ '\*'
 
5275
   let seqlist= seqlist.',*'
 
5276
  endif
 
5277
  let priority = 1
 
5278
  while seqlist != ""
 
5279
   if seqlist =~ ','
 
5280
    let seq     = substitute(seqlist,',.*$','','e')
 
5281
    let seqlist = substitute(seqlist,'^.\{-},\(.*\)$','\1','e')
 
5282
   else
 
5283
    let seq     = seqlist
 
5284
    let seqlist = ""
 
5285
   endif
 
5286
   let sepchr= "\<Char-0xff>"
 
5287
   if priority < 10
 
5288
    let spriority= "00".priority.sepchr
 
5289
   elseif priority < 100
 
5290
    let spriority= "0".priority.sepchr
 
5291
   else
 
5292
    let spriority= priority.sepchr
 
5293
   endif
 
5294
"   call Decho("priority=".priority." spriority<".spriority."> seq<".seq."> seqlist<".seqlist.">")
 
5295
 
 
5296
   " sanity check
 
5297
   if w:netrw_bannercnt > line("$")
 
5298
    " apparently no files were left after a Hiding pattern was used
 
5299
"    call Dret("SetSort : no files left after hiding")
 
5300
    return
 
5301
   endif
 
5302
   if seq == '*'
 
5303
    let starpriority= spriority
 
5304
   else
 
5305
    exe 'silent keepjumps '.w:netrw_bannercnt.',$g/'.seq.'/s/^/'.spriority.'/'
 
5306
    " sometimes multiple sorting patterns will match the same file or directory.
 
5307
    " The following substitute is intended to remove the excess matches.
 
5308
    exe 'silent keepjumps '.w:netrw_bannercnt.',$g/^\d\{3}'.sepchr.'\d\{3}\//s/^\d\{3}'.sepchr.'\(\d\{3}\/\).\@=/\1/e'
 
5309
   endif
 
5310
   let priority = priority + 1
 
5311
  endwhile
 
5312
  if exists("starpriority")
 
5313
   exe 'silent keepjumps '.w:netrw_bannercnt.',$v/^\d\{3}'.sepchr.'/s/^/'.starpriority.'/'
 
5314
  endif
 
5315
 
 
5316
  " Following line associated with priority -- items that satisfy a priority
 
5317
  " pattern get prefixed by ###/ which permits easy sorting by priority.
 
5318
  " Sometimes files can satisfy multiple priority patterns -- only the latest
 
5319
  " priority pattern needs to be retained.  So, at this point, these excess
 
5320
  " priority prefixes need to be removed, but not directories that happen to
 
5321
  " be just digits themselves.
 
5322
  exe 'silent keepjumps '.w:netrw_bannercnt.',$s/^\(\d\{3}'.sepchr.'\)\%(\d\{3}'.sepchr.'\)\+\ze./\1/e'
 
5323
 
 
5324
"  call Dret("SetSort")
 
5325
endfun
 
5326
 
 
5327
" =====================================================================
3615
5328
" s:NetrwSortStyle: change sorting style (name - time - size) and refresh display {{{2
3616
5329
fun! s:NetrwSortStyle(islocal)
3617
5330
"  call Dfunc("s:NetrwSortStyle(islocal=".a:islocal.") netrw_sort_by<".g:netrw_sort_by.">")
3635
5348
"           =4 : local and t
3636
5349
"           =5 : local and v
3637
5350
fun! s:NetrwSplit(mode)
3638
 
"  call Dfunc("NetrwSplit(mode=".a:mode.") alto=".g:netrw_alto." altv=".g:netrw_altv)
 
5351
"  call Dfunc("s:NetrwSplit(mode=".a:mode.") alto=".g:netrw_alto." altv=".g:netrw_altv)
3639
5352
 
3640
5353
  call s:SaveWinVars()
3641
5354
 
3642
5355
  if a:mode == 0
3643
5356
   " remote and o
 
5357
"   call Decho("exe ".(g:netrw_alto? "bel " : "abo ").g:netrw_winsize."wincmd s")
3644
5358
   exe (g:netrw_alto? "bel " : "abo ").g:netrw_winsize."wincmd s"
3645
5359
   let s:didsplit= 1
3646
5360
   call s:RestoreWinVars()
3650
5364
  elseif a:mode == 1
3651
5365
   " remote and t
3652
5366
   let cursorword  = s:NetrwGetWord()
 
5367
"   call Decho("tabnew")
3653
5368
   tabnew
3654
5369
   let s:didsplit= 1
3655
5370
   call s:RestoreWinVars()
3658
5373
 
3659
5374
  elseif a:mode == 2
3660
5375
   " remote and v
 
5376
"   call Decho("exe ".(g:netrw_altv? "rightb " : "lefta ").g:netrw_winsize."wincmd v")
3661
5377
   exe (g:netrw_altv? "rightb " : "lefta ").g:netrw_winsize."wincmd v"
3662
5378
   let s:didsplit= 1
3663
5379
   call s:RestoreWinVars()
3666
5382
 
3667
5383
  elseif a:mode == 3
3668
5384
   " local and o
 
5385
"   call Decho("exe ".(g:netrw_alto? "bel " : "abo ").g:netrw_winsize."wincmd s")
3669
5386
   exe (g:netrw_alto? "bel " : "abo ").g:netrw_winsize."wincmd s"
3670
5387
   let s:didsplit= 1
3671
5388
   call s:RestoreWinVars()
3676
5393
   " local and t
3677
5394
   let netrw_curdir= b:netrw_curdir
3678
5395
   let cursorword  = s:NetrwGetWord()
 
5396
"   call Decho("tabnew")
3679
5397
   tabnew
3680
5398
   let b:netrw_curdir= netrw_curdir
3681
5399
   let s:didsplit= 1
3685
5403
 
3686
5404
  elseif a:mode == 5
3687
5405
   " local and v
 
5406
"   call Decho("exe ".(g:netrw_altv? "rightb " : "lefta ").g:netrw_winsize."wincmd v")
3688
5407
   exe (g:netrw_altv? "rightb " : "lefta ").g:netrw_winsize."wincmd v"
3689
5408
   let s:didsplit= 1
3690
5409
   call s:RestoreWinVars()
3695
5414
   call netrw#ErrorMsg(s:ERROR,"(NetrwSplit) unsupported mode=".a:mode,45)
3696
5415
  endif
3697
5416
 
3698
 
"  call Dret("NetrwSplit")
3699
 
endfun
3700
 
 
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.")")
3706
 
 
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','')
3712
 
  endif
3713
 
  let fname= escape(a:fname,"%#")
3714
 
"  call Decho("fname<".fname."> after escape()")
3715
 
 
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")
3720
 
   if has("unix")
3721
 
    let s:haskdeinit= s:System("system",'ps -e') =~ 'kdeinit'
3722
 
    if v:shell_error
3723
 
     let s:haskdeinit = 0
3724
 
    endif
3725
 
   else
3726
 
    let s:haskdeinit= 0
3727
 
   endif
3728
 
"   call Decho("setting s:haskdeinit=".s:haskdeinit)
3729
 
  endif
3730
 
 
3731
 
  if a:remote == 1
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
3736
 
   setlocal bh=delete
3737
 
"   call Decho("exe w! ".fname)
3738
 
   exe "w! ".fname
3739
 
   q
3740
 
  endif
3741
 
"  call Decho("exten<".exten."> "."netrwFileHandlers#NFH_".exten."():exists=".exists("*netrwFileHandlers#NFH_".exten))
3742
 
 
3743
 
  " set up redirection
3744
 
  if &srr =~ "%s"
3745
 
   if (has("win32") || has("win95") || has("win64") || has("win16"))
3746
 
    let redir= substitute(&srr,"%s","nul","")
3747
 
   else
3748
 
    let redir= substitute(&srr,"%s","/dev/null","")
3749
 
   endif
3750
 
  elseif (has("win32") || has("win95") || has("win64") || has("win16"))
3751
 
   let redir= &srr . "nul"
3752
 
  else
3753
 
   let redir= &srr . "/dev/null"
3754
 
  endif
3755
 
"  call Decho("redir{".redir."} srr{".&srr."}")
3756
 
 
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*','','')." "
3762
 
    let oviewer = ''
3763
 
    let cnt     = 1
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','')." "
3767
 
     let cnt     = cnt + 1
3768
 
     let oviewer = viewer
3769
 
"     call Decho("!exe: viewer<".viewer.">  viewopt<".viewopt.">")
3770
 
    endwhile
3771
 
   else
3772
 
    let viewer  = g:netrw_browsex_viewer
3773
 
    let viewopt = ""
3774
 
   endif
3775
 
"   call Decho("viewer<".viewer.">  viewopt<".viewopt.">")
3776
 
  endif
3777
 
 
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)
3782
 
 
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
3788
 
 
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
3794
 
 
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
3799
 
 
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
3804
 
 
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
3809
 
 
3810
 
  else
3811
 
   " netrwFileHandlers#Invoke() always returns 0
3812
 
   let ret= netrwFileHandlers#Invoke(exten,fname)
3813
 
  endif
3814
 
 
3815
 
  " if unsuccessful, attempt netrwFileHandlers#Invoke()
3816
 
  if ret
3817
 
   let ret= netrwFileHandlers#Invoke(exten,fname)
3818
 
  endif
3819
 
 
3820
 
  redraw!
3821
 
 
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)
3828
 
  endif
3829
 
 
3830
 
  if a:remote == 1
3831
 
   setlocal bh=delete bt=nofile
3832
 
   if g:netrw_use_noswf
3833
 
    setlocal noswf
3834
 
   endif
3835
 
   exe "norm! \<c-o>"
3836
 
   redraw!
3837
 
  endif
3838
 
 
3839
 
"  call Dret("NetrwBrowseX")
 
5417
"  call Dret("s:NetrwSplit")
 
5418
endfun
 
5419
 
 
5420
" ---------------------------------------------------------------------
 
5421
" NetrwStatusLine: {{{2
 
5422
fun! NetrwStatusLine()
 
5423
 
 
5424
" vvv NetrwStatusLine() debugging vvv
 
5425
"  let g:stlmsg=""
 
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("%")
 
5430
"  endif
 
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(".").">"
 
5435
"  endif
 
5436
"  if !exists("w:netrw_explore_list")
 
5437
"   let g:stlmsg=" !X<explore_list>"
 
5438
"  endif
 
5439
" ^^^ NetrwStatusLine() debugging ^^^
 
5440
 
 
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
 
5447
   return ""
 
5448
  else
 
5449
   return "Match ".w:netrw_explore_mtchcnt." of ".w:netrw_explore_listlen
 
5450
  endif
 
5451
endfun
 
5452
 
 
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("%").">")
 
5458
 
 
5459
  let treedir= b:netrw_curdir
 
5460
"  call Decho("set initial treedir<".treedir.">")
 
5461
  let s:treecurpos= netrw#NetrwSavePosn()
 
5462
 
 
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')
 
5468
   else
 
5469
    let treedir= ""
 
5470
   endif
 
5471
 
 
5472
"   call Decho("treedir<".treedir.">")
 
5473
 
 
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")
 
5479
    keepjumps %d
 
5480
"    call Dret("NetrwTreeDir <".treedir."> : (side effect) s:treecurpos<".string(s:treecurpos).">")
 
5481
    return b:netrw_curdir
 
5482
   endif
 
5483
 
 
5484
   " elide all non-depth information
 
5485
   let depth = substitute(getline('.'),'^\(\%(| \)*\)[^|].\{-}$','\1','e')
 
5486
"   call Decho("depth<".depth."> 1st subst")
 
5487
 
 
5488
   " elide first depth
 
5489
   let depth = substitute(depth,'^| ','','')
 
5490
"   call Decho("depth<".depth."> 2nd subst")
 
5491
 
 
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.">")
 
5499
   endwhile
 
5500
   if w:netrw_treetop =~ '/$'
 
5501
    let treedir= w:netrw_treetop.treedir
 
5502
   else
 
5503
    let treedir= w:netrw_treetop.'/'.treedir
 
5504
   endif
 
5505
"   call Decho("bufnr(.)=".bufnr("%")." line($)=".line("$")." line(.)=".line("."))
 
5506
  endif
 
5507
  let treedir= substitute(treedir,'//$','/','')
 
5508
 
 
5509
"  " now force a refresh
 
5510
"" call DECHO("clear buffer<".expand("%")."> with :%d")
 
5511
"  setlocal ma noro
 
5512
"  keepjumps %d
 
5513
 
 
5514
"  call Dret("NetrwTreeDir <".treedir."> : (side effect) s:treecurpos<".string(s:treecurpos).">")
 
5515
  return treedir
 
5516
endfun
 
5517
 
 
5518
" ---------------------------------------------------------------------
 
5519
" s:NetrwTreeDisplay: recursive tree display {{{2
 
5520
fun! s:NetrwTreeDisplay(dir,depth)
 
5521
"  call Dfunc("NetrwTreeDisplay(dir<".a:dir."> depth<".a:depth.">)")
 
5522
 
 
5523
  " insure that there are no folds
 
5524
  setlocal nofen
 
5525
 
 
5526
  " install ../ and shortdir
 
5527
  if a:depth == ""
 
5528
   call setline(line("$")+1,'../')
 
5529
"   call Decho("setline#".line("$")." ../ (depth is zero)")
 
5530
  endif
 
5531
  if a:dir =~ '^\a\+://'
 
5532
   if a:dir == w:netrw_treetop
 
5533
    let shortdir= a:dir
 
5534
   else
 
5535
    let shortdir= substitute(a:dir,'^.*/\([^/]\+\)/$','\1/','e')
 
5536
   endif
 
5537
   call setline(line("$")+1,a:depth.shortdir)
 
5538
  else
 
5539
   let shortdir= substitute(a:dir,'^.*/','','e')
 
5540
   call setline(line("$")+1,a:depth.shortdir.'/')
 
5541
  endif
 
5542
"  call Decho("setline#".line("$")." shortdir<".a:depth.shortdir.">")
 
5543
 
 
5544
  " append a / to dir if its missing one
 
5545
  let dir= a:dir
 
5546
  if dir !~ '/$'
 
5547
   let dir= dir.'/'
 
5548
  endif
 
5549
 
 
5550
  " display subtrees (if any)
 
5551
  let depth= "| ".a:depth
 
5552
 
 
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)
 
5563
   else
 
5564
"    call Decho("<".entry."> is not a key in treedict (no subtree)")
 
5565
    call setline(line("$")+1,depth.entry)
 
5566
   endif
 
5567
  endfor
 
5568
"  call Dret("NetrwTreeDisplay")
 
5569
endfun
 
5570
 
 
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"))
 
5578
 
 
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)")
 
5587
   endif
 
5588
 
 
5589
   " insure that we have at least an empty treedict
 
5590
   if !exists("w:netrw_treedict")
 
5591
    let w:netrw_treedict= {}
 
5592
   endif
 
5593
 
 
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"
 
5601
 
 
5602
   " if past banner, record word
 
5603
   if exists("w:netrw_bannercnt") && line(".") > w:netrw_bannercnt
 
5604
    let fname= expand("<cword>")
 
5605
   else
 
5606
    let fname= ""
 
5607
   endif
 
5608
"   call Decho("fname<".fname.">")
 
5609
 
 
5610
   " display from treetop on down
 
5611
   call s:NetrwTreeDisplay(w:netrw_treetop,"")
 
5612
 
 
5613
"   call Dret("NetrwTreeListing : bufname<".expand("%").">")
 
5614
  endif
 
5615
endfun
 
5616
 
 
5617
" ---------------------------------------------------------------------
 
5618
" s:NetrwWideListing: {{{2
 
5619
fun! s:NetrwWideListing()
 
5620
 
 
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
 
5627
   setlocal ma noro
 
5628
"   call Decho("setlocal ma noro")
 
5629
   let b:netrw_cpf= 0
 
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'
 
5632
   else
 
5633
"    call Dret("NetrwWideListing")
 
5634
    return
 
5635
   endif
 
5636
"   call Decho("max file strlen+1=".b:netrw_cpf)
 
5637
   let b:netrw_cpf= b:netrw_cpf + 1
 
5638
 
 
5639
   " determine qty files per line (fpl)
 
5640
   let w:netrw_fpl= winwidth(0)/b:netrw_cpf
 
5641
   if w:netrw_fpl <= 0
 
5642
    let w:netrw_fpl= 1
 
5643
   endif
 
5644
"   call Decho("fpl= ".winwidth(0)."/[b:netrw_cpf=".b:netrw_cpf.']='.w:netrw_fpl)
 
5645
 
 
5646
   " make wide display
 
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
 
5656
    exe newcolstart
 
5657
    if newcolqty == 0
 
5658
     exe "silent keepjumps norm! 0\<c-v>$hx".w:netrw_bannercnt."G$p"
 
5659
    else
 
5660
     exe "silent keepjumps norm! 0\<c-v>".newcolqty.'j$hx'.w:netrw_bannercnt.'G$p'
 
5661
    endif
 
5662
    exe "silent keepjumps ".newcolstart.','.newcolend.'d'
 
5663
    exe 'silent keepjumps '.w:netrw_bannercnt
 
5664
   endwhile
 
5665
   silent! let @*= keepregstar
 
5666
   exe "silent keepjumps ".w:netrw_bannercnt.',$s/\s\+$//e'
 
5667
   setlocal noma nomod ro
 
5668
"   call Dret("NetrwWideListing")
 
5669
  endif
 
5670
 
 
5671
endfun
 
5672
 
 
5673
" ---------------------------------------------------------------------
 
5674
" s:PerformListing: {{{2
 
5675
fun! s:PerformListing(islocal)
 
5676
"  call Dfunc("s:PerformListing(islocal=".a:islocal.") buf(%)=".bufnr("%")."<".bufname("%").">")
 
5677
 
 
5678
  call s:NetrwSafeOptions()
 
5679
  setlocal noro ma
 
5680
"  call Decho("setlocal noro ma")
 
5681
 
 
5682
"  if exists("g:netrw_silent") && g:netrw_silent == 0 && &ch >= 1       " Decho
 
5683
"   call Decho("(netrw) Processing your browsing request...")
 
5684
"  endif                                                                " Decho
 
5685
 
 
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")
 
5690
   keepjumps %d
 
5691
  endif
 
5692
 
 
5693
  " save current directory on directory history list
 
5694
  call s:NetrwBookmarkDir(3,b:netrw_curdir)
 
5695
 
 
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
 
5701
  keepjumps 1d
 
5702
  let w:netrw_bannercnt= 3
 
5703
  exe "keepjumps ".w:netrw_bannercnt
 
5704
 
 
5705
  let sortby= g:netrw_sort_by
 
5706
  if g:netrw_sort_direction =~ "^r"
 
5707
   let sortby= sortby." reversed"
 
5708
  endif
 
5709
 
 
5710
  " Sorted by... {{{3
 
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")
 
5714
   " 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
 
5718
  else
 
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
 
5723
  endif
 
5724
  exe "keepjumps ".w:netrw_bannercnt
 
5725
 
 
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.">")
 
5729
   keepjumps put =''
 
5730
   if s:netrwmftgt_islocal
 
5731
    call setline(line("."),'"   Copy/Move Tgt: '.s:netrwmftgt.' (local)')
 
5732
   else
 
5733
    call setline(line("."),'"   Copy/Move Tgt: '.s:netrwmftgt.' (remote)')
 
5734
   endif
 
5735
   let w:netrw_bannercnt= w:netrw_bannercnt + 1
 
5736
  else
 
5737
"   call Decho("s:netrwmftgt does not exist, don't make Copy/Move Tgt")
 
5738
  endif
 
5739
  exe "keepjumps ".w:netrw_bannercnt
 
5740
 
 
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
 
5746
   else
 
5747
    keepjumps put ='\"   Showing:       '.g:netrw_list_hide
 
5748
   endif
 
5749
   let w:netrw_bannercnt= w:netrw_bannercnt + 1
 
5750
  endif
 
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
 
5755
 
 
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("$"))
 
5760
 
 
5761
  " set up syntax highlighting {{{3
 
5762
"  call Decho("set up syntax highlighting")
 
5763
  if has("syntax")
 
5764
   setlocal ft=netrw
 
5765
   if !exists("g:syntax_on") || !g:syntax_on
 
5766
    setlocal ft=
 
5767
   endif
 
5768
  endif
 
5769
 
 
5770
  " get list of files
 
5771
"  call Decho("Get list of files - islocal=".a:islocal)
 
5772
  if a:islocal
 
5773
   call s:LocalListing()
 
5774
  else " remote
 
5775
   call s:NetrwRemoteListing()
 
5776
  endif
 
5777
"  call Decho("w:netrw_bannercnt=".w:netrw_bannercnt." (banner complete)")
 
5778
 
 
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()
 
5785
   endif
 
5786
   if line("$") >= w:netrw_bannercnt
 
5787
"    call Decho("manipulate directory listing (sort) : g:netrw_sort_by<".g:netrw_sort_by.">")
 
5788
 
 
5789
    if g:netrw_sort_by =~ "^n"
 
5790
     " sort by name
 
5791
     call s:NetrwSetSort()
 
5792
 
 
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'
 
5798
      else
 
5799
       " reverse direction sorting
 
5800
       exe 'silent keepjumps '.w:netrw_bannercnt.',$sort!'
 
5801
      endif
 
5802
     endif
 
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'
 
5807
 
 
5808
    elseif a:islocal
 
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'
 
5814
      else
 
5815
"       call Decho('exe silent keepjumps '.w:netrw_bannercnt.',$sort!')
 
5816
       exe 'silent keepjumps '.w:netrw_bannercnt.',$sort!'
 
5817
      endif
 
5818
     endif
 
5819
     exe 'silent keepjumps '.w:netrw_bannercnt.',$s/^\d\{-}\///e'
 
5820
    endif
 
5821
 
 
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
 
5825
   endif
 
5826
  endif
 
5827
 
 
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)
 
5832
 
 
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
 
5837
   norm! 0
 
5838
  endif
 
5839
 
 
5840
  " record previous current directory
 
5841
  let w:netrw_prvdir= b:netrw_curdir
 
5842
"  call Decho("record netrw_prvdir<".w:netrw_prvdir.">")
 
5843
 
 
5844
  " save certain window-oriented variables into buffer-oriented variables {{{3
 
5845
  call s:SetBufWinVars()
 
5846
  call s:NetrwOptionRestore("w:")
 
5847
 
 
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")
 
5852
 
 
5853
   call netrw#NetrwRestorePosn(s:treecurpos)
 
5854
   unlet s:treecurpos
 
5855
  endif
 
5856
 
 
5857
"  call Dret("s:PerformListing : curpos<".string(getpos(".")).">")
 
5858
endfun
 
5859
 
 
5860
" ---------------------------------------------------------------------
 
5861
" s:SetupNetrwStatusLine: {{{2
 
5862
fun! s:SetupNetrwStatusLine(statline)
 
5863
"  call Dfunc("SetupNetrwStatusLine(statline<".a:statline.">)")
 
5864
 
 
5865
  if !exists("s:netrw_setup_statline")
 
5866
   let s:netrw_setup_statline= 1
 
5867
"   call Decho("do first-time status line setup")
 
5868
 
 
5869
   if !exists("s:netrw_users_stl")
 
5870
    let s:netrw_users_stl= &stl
 
5871
   endif
 
5872
   if !exists("s:netrw_users_ls")
 
5873
    let s:netrw_users_ls= &laststatus
 
5874
   endif
 
5875
 
 
5876
   " set up User9 highlighting as needed
 
5877
   let keepa= @a
 
5878
   redir @a
 
5879
   try
 
5880
    hi User9
 
5881
   catch /^Vim\%((\a\+)\)\=:E411/
 
5882
    if &bg == "dark"
 
5883
     hi User9 ctermfg=yellow ctermbg=blue guifg=yellow guibg=blue
 
5884
    else
 
5885
     hi User9 ctermbg=yellow ctermfg=blue guibg=yellow guifg=blue
 
5886
    endif
 
5887
   endtry
 
5888
   redir END
 
5889
   let @a= keepa
 
5890
  endif
 
5891
 
 
5892
  " set up status line (may use User9 highlighting)
 
5893
  " insure that windows have a statusline
 
5894
  " make sure statusline is displayed
 
5895
  let &stl=a:statline
 
5896
  setlocal laststatus=2
 
5897
"  call Decho("stl=".&stl)
 
5898
  redraw
 
5899
 
 
5900
"  call Dret("SetupNetrwStatusLine : stl=".&stl)
3840
5901
endfun
3841
5902
 
3842
5903
" ---------------------------------------------------------------------
3932
5993
 
3933
5994
  else
3934
5995
   " use ssh to get remote file listing {{{3
3935
 
"   call Decho("use ssh to get remote file listing: s:netrw_shq<".g:netrw_shq."> s:path<".s:path."> g:netrw_cd_escape<".g:netrw_cd_escape.">")
 
5996
"   call Decho("use ssh to get remote file listing: s:path<".s:path.">")
3936
5997
   let listcmd= s:MakeSshCmd(g:netrw_list_cmd)
3937
5998
"   call Decho("listcmd<".listcmd."> (using g:netrw_list_cmd)")
3938
5999
   if g:netrw_scp_cmd =~ '^pscp'
3939
 
"    call Decho("1: exe silent r! ".listcmd.g:netrw_shq.s:path.g:netrw_shq)
3940
 
    exe "silent r! ".listcmd.g:netrw_shq.s:path.g:netrw_shq
 
6000
"    call Decho("1: exe silent r! ".listcmd.shellescape(s:path))
 
6001
    exe "silent r! ".listcmd.shellescape(s:path)
3941
6002
    " remove rubbish and adjust listing format of 'pscp' to 'ssh ls -FLa' like
3942
6003
    g/^Listing directory/d
3943
6004
    g/^d[-rwx][-rwx][-rwx]/s+$+/+e
3950
6011
"     call Decho("2: exe silent r! ".listcmd)
3951
6012
     exe "silent r! ".listcmd
3952
6013
    else
3953
 
"     call Decho("3: exe silent r! ".listcmd." ".g:netrw_shq.s:path.g:netrw_shq)
3954
 
     exe "silent r! ".listcmd." ".g:netrw_shq.s:path.g:netrw_shq
 
6014
"     call Decho("3: exe silent r! ".listcmd.' "'.shellescape(s:path).'"')
 
6015
     exe "silent r! ".listcmd.' "'.shellescape(s:path).'"'
 
6016
"     call Decho("listcmd<".listcmd."> path<".s:path.">")
3955
6017
    endif
3956
6018
   endif
3957
6019
 
3969
6031
   if s:method == "ftp"
3970
6032
    " cleanup
3971
6033
    exe "keepjumps ".w:netrw_bannercnt
3972
 
    while getline(".") =~ g:netrw_ftp_browse_reject
 
6034
    while getline('.') =~ g:netrw_ftp_browse_reject
3973
6035
     keepjumps d
3974
6036
    endwhile
3975
6037
    " if there's no ../ listed, then put ./ and ../ in
4012
6074
  let svpos= netrw#NetrwSavePosn()
4013
6075
 
4014
6076
  let all= 0
4015
 
  if exists("s:netrwmarkfilelist")
 
6077
  if exists("s:netrwmarkfilelist_{bufnr('%')}")
4016
6078
   " remove all marked files
4017
 
   for fname in s:netrwmarkfilelist
 
6079
   for fname in s:netrwmarkfilelist_{bufnr("%")}
4018
6080
    let ok= s:NetrwRemoteRmFile(a:path,fname,all)
4019
6081
    if ok =~ 'q\%[uit]'
4020
6082
     break
4022
6084
     let all= 1
4023
6085
    endif
4024
6086
   endfor
4025
 
   unlet s:netrwmarkfilelist
4026
 
   unlet s:netrwmarkfilemtch
 
6087
   unlet s:netrwmarkfilelist_{bufnr("%")}
 
6088
   unlet s:netrwmarkfilemtch_{bufnr("%")}
4027
6089
   2match none
4028
6090
 
4029
6091
  else
4066
6128
"    call Decho("attempt to remove file (all=".all.")")
4067
6129
   if !all
4068
6130
    echohl Statement
 
6131
"    call Decho("case all=0:")
4069
6132
    call inputsave()
4070
6133
    let ok= input("Confirm deletion of file<".a:rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ")
4071
6134
    call inputrestore()
4080
6143
   endif
4081
6144
 
4082
6145
   if all || ok =~ 'y\%[es]' || ok == ""
 
6146
"    call Decho("case all=".all." or ok<".ok.">".(exists("w:netrw_method")? ': netrw_method='.w:netrw_method : ""))
4083
6147
    if exists("w:netrw_method") && (w:netrw_method == 2 || w:netrw_method == 3)
 
6148
"     call Decho("case ftp:")
 
6149
     let path= a:path
 
6150
     if path =~ '^\a\+://'
 
6151
      let path= substitute(path,'^\a\+://[^/]\+/','','')
 
6152
     endif
4084
6153
     silent! keepjumps .,$d
4085
 
     call s:NetrwRemoteFtpCmd(a:path,"delete ".a:rmfile)
 
6154
     call s:NetrwRemoteFtpCmd(path,"delete ".'"'.a:rmfile.'"')
4086
6155
    else
 
6156
"     call Decho("case ssh: g:netrw_rm_cmd<".g:netrw_rm_cmd.">")
4087
6157
     let netrw_rm_cmd= s:MakeSshCmd(g:netrw_rm_cmd)
4088
6158
"     call Decho("netrw_rm_cmd<".netrw_rm_cmd.">")
4089
6159
     if !exists("b:netrw_curdir")
4095
6165
"      call Decho("remotedir<".remotedir.">")
4096
6166
"      call Decho("rmfile<".a:rmfile.">")
4097
6167
      if remotedir != ""
4098
 
       let netrw_rm_cmd= netrw_rm_cmd." ".remotedir.escape(a:rmfile,g:netrw_cd_escape)
 
6168
       let netrw_rm_cmd= netrw_rm_cmd." ".shellescape(fnameescape(remotedir.a:rmfile))
4099
6169
      else
4100
 
       let netrw_rm_cmd= netrw_rm_cmd." ".escape(a:rmfile,g:netrw_cd_escape)
 
6170
       let netrw_rm_cmd= netrw_rm_cmd." ".shellescape(fnameescape(a:rmfile))
4101
6171
      endif
4102
6172
"      call Decho("call system(".netrw_rm_cmd.")")
4103
6173
      let ret= system(netrw_rm_cmd)
4108
6178
     endif
4109
6179
    endif
4110
6180
   elseif ok =~ 'q\%[uit]'
 
6181
"    call Decho("ok==".ok)
4111
6182
    break
4112
6183
   endif
4113
6184
 
4171
6242
  " because WinXX ftp uses unix style input
4172
6243
  let ffkeep= &ff
4173
6244
  setlocal ma ff=unix noro
 
6245
"  call Decho("setlocal ma ff=unix noro")
4174
6246
 
4175
6247
  " clear off any older non-banner lines
4176
6248
  " note that w:netrw_bannercnt indexes the line after the banner
4185
6257
   endif
4186
6258
   if exists("g:netrw_ftpextracmd")
4187
6259
    exe "put ='".g:netrw_ftpextracmd."'"
4188
 
"    call Decho("filter input: ".getline("."))
 
6260
"    call Decho("filter input: ".getline('.'))
4189
6261
   endif
4190
 
   exe "put ='".a:listcmd."'"
 
6262
   call setline(line("$")+1,a:listcmd)
4191
6263
"   exe "keepjumps ".w:netrw_bannercnt.',$g/^./call Decho("ftp#".line(".").": ".getline("."))'
4192
6264
   if exists("g:netrw_port") && g:netrw_port != ""
4193
 
"    call Decho("exe ".g:netrw_silentxfer.w:netrw_bannercnt.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port)
4194
 
    exe g:netrw_silentxfer." keepjumps ".w:netrw_bannercnt.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port
 
6265
"    call Decho("exe ".s:netrw_silentxfer.w:netrw_bannercnt.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port)
 
6266
    exe s:netrw_silentxfer." keepjumps ".w:netrw_bannercnt.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine." ".g:netrw_port
4195
6267
   else
4196
 
"    call Decho("exe ".g:netrw_silentxfer.w:netrw_bannercnt.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine)
4197
 
    exe g:netrw_silentxfer." keepjumps ".w:netrw_bannercnt.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine
 
6268
"    call Decho("exe ".s:netrw_silentxfer.w:netrw_bannercnt.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine)
 
6269
    exe s:netrw_silentxfer." keepjumps ".w:netrw_bannercnt.",$!".g:netrw_ftp_cmd." -i ".g:netrw_machine
4198
6270
   endif
4199
6271
 
4200
6272
   ".........................................
4219
6291
   endif
4220
6292
   if exists("g:netrw_ftpextracmd")
4221
6293
    exe "put ='".g:netrw_ftpextracmd."'"
4222
 
"    call Decho("filter input: ".getline("."))
 
6294
"    call Decho("filter input: ".getline('.'))
4223
6295
   endif
4224
 
   exe "put ='".a:listcmd."'"
 
6296
   call setline(line("$")+1,a:listcmd)
4225
6297
 
4226
6298
    " perform ftp:
4227
6299
    " -i       : turns off interactive prompting from ftp
4228
6300
    " -n  unix : DON'T use <.netrc>, even though it exists
4229
6301
    " -n  win32: quit being obnoxious about password
4230
6302
"    exe w:netrw_bannercnt.',$g/^./call Decho("ftp#".line(".").": ".getline("."))'
4231
 
"    call Decho("exe ".g:netrw_silentxfer.w:netrw_bannercnt.",$!".g:netrw_ftp_cmd." -i -n")
4232
 
    exe g:netrw_silentxfer.w:netrw_bannercnt.",$!".g:netrw_ftp_cmd." -i -n"
 
6303
"    call Decho("exe ".s:netrw_silentxfer.w:netrw_bannercnt.",$!".g:netrw_ftp_cmd." -i -n")
 
6304
    exe s:netrw_silentxfer.w:netrw_bannercnt.",$!".g:netrw_ftp_cmd." -i -n"
4233
6305
 
4234
6306
   ".........................................
4235
6307
  else
4275
6347
  let rename_cmd = s:MakeSshCmd(g:netrw_rename_cmd)
4276
6348
 
4277
6349
  " rename files given by the markfilelist
4278
 
  if exists("s:netrwmarkfilelist")
4279
 
   for oldname in s:netrwmarkfilelist
 
6350
  if exists("s:netrwmarkfilelist_{bufnr('%')}")
 
6351
   for oldname in s:netrwmarkfilelist_{bufnr("%")}
4280
6352
"    call Decho("oldname<".oldname.">")
4281
6353
    if exists("subfrom")
4282
6354
     let newname= substitute(oldname,subfrom,subto,'')
4298
6370
    else
4299
6371
     let oldname= a:path.oldname
4300
6372
     let newname= a:path.newname
4301
 
"     call Decho("system(rename_cmd".' "'.escape(oldname," ").'" "'.escape(newname,g:netrw_cd_escape).'"')
4302
 
     let ret= s:System("system",rename_cmd.' "'.escape(oldname,g:netrw_cd_escape).'" "'.escape(newname,g:netrw_cd_escape).'"')
 
6373
"     call Decho("system(rename_cmd".' "'.fnameescape(oldname," ").'" "'.escape(newname).'"')
 
6374
     let ret= s:System("system",rename_cmd.' "'.fnameescape(oldname).'" "'.fnameescape(newname).'"')
4303
6375
    endif
4304
6376
 
4305
6377
   endfor
4306
 
   2match none
4307
 
   unlet s:netrwmarkfilelist
4308
 
   unlet s:netrwmarkfilemtch
 
6378
   call s:NetrwUnMarkFile(1)
4309
6379
 
4310
6380
  else
4311
6381
 
4325
6395
    else
4326
6396
     let oldname= a:path.oldname
4327
6397
     let newname= a:path.newname
4328
 
"    call Decho("system(rename_cmd".' "'.escape(oldname," ").'" "'.escape(newname,g:netrw_cd_escape).'"')
4329
 
     let ret= s:System("system",rename_cmd.' "'.escape(oldname,g:netrw_cd_escape).'" "'.escape(newname,g:netrw_cd_escape).'"')
 
6398
"    call Decho("system(rename_cmd".' "'.fnameescape(oldname," ").'" "'.escape(newname).'"')
 
6399
     let ret= s:System("system",rename_cmd.' "'.fnameescape(oldname).'" "'.fnameescape(newname).'"')
4330
6400
    endif
4331
6401
 
4332
6402
    let ctr= ctr + 1
4341
6411
endfun
4342
6412
 
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").">")
4355
 
 
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')
4360
 
 
4361
 
  elseif w:netrw_liststyle == s:LONGLIST
4362
 
   " use long list
4363
 
"   call Decho("use long list")
4364
 
   let g:netrw_list_cmd = g:netrw_list_cmd." -l"
4365
 
 
4366
 
  elseif w:netrw_liststyle == s:WIDELIST
4367
 
   " give wide list
4368
 
"   call Decho("use wide list")
4369
 
   let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge')
4370
 
 
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')
4374
 
 
4375
 
  else
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')
4380
 
  endif
4381
 
  setlocal ma noro
4382
 
 
4383
 
  " clear buffer - this will cause NetrwBrowse/LocalBrowseCheck to do a refresh
4384
 
"  call Decho("clear buffer<".expand("%")."> with :%d")
4385
 
  %d
4386
 
 
4387
 
  " refresh the listing
4388
 
  let svpos= netrw#NetrwSavePosn()
4389
 
  call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
4390
 
  call netrw#NetrwRestorePosn(svpos)
4391
 
 
4392
 
  " keep cursor on the filename
4393
 
  silent keepjumps $
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
4398
 
  endif
4399
 
 
4400
 
"  call Dret("NetrwListStyle".(exists("w:netrw_liststyle")? ' : w:netrw_liststyle='.w:netrw_liststyle : ""))
4401
 
endfun
4402
 
 
4403
 
" ---------------------------------------------------------------------
4404
 
" s:NetrwWideListing: {{{2
4405
 
fun! s:NetrwWideListing()
4406
 
 
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
4413
 
   setlocal ma noro
4414
 
   let b:netrw_cpf= 0
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'
4417
 
   else
4418
 
"    call Dret("NetrwWideListing")
4419
 
    return
4420
 
   endif
4421
 
"   call Decho("max file strlen+1=".b:netrw_cpf)
4422
 
   let b:netrw_cpf= b:netrw_cpf + 1
4423
 
 
4424
 
   " determine qty files per line (fpl)
4425
 
   let w:netrw_fpl= winwidth(0)/b:netrw_cpf
4426
 
   if w:netrw_fpl <= 0
4427
 
    let w:netrw_fpl= 1
4428
 
   endif
4429
 
"   call Decho("fpl= ".winwidth(0)."/[b:netrw_cpf=".b:netrw_cpf.']='.w:netrw_fpl)
4430
 
 
4431
 
   " make wide display
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
4441
 
    exe newcolstart
4442
 
    if newcolqty == 0
4443
 
     exe "silent keepjumps norm! 0\<c-v>$hx".w:netrw_bannercnt."G$p"
4444
 
    else
4445
 
     exe "silent keepjumps norm! 0\<c-v>".newcolqty.'j$hx'.w:netrw_bannercnt.'G$p'
4446
 
    endif
4447
 
    exe "silent keepjumps ".newcolstart.','.newcolend.'d'
4448
 
    exe 'silent keepjumps '.w:netrw_bannercnt
4449
 
   endwhile
4450
 
   silent! let @*= keepregstar
4451
 
   exe "silent keepjumps ".w:netrw_bannercnt.',$s/\s\+$//e'
4452
 
   setlocal noma nomod ro
4453
 
"   call Dret("NetrwWideListing")
4454
 
  endif
4455
 
 
4456
 
endfun
4457
 
 
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("%").">")
4463
 
 
4464
 
  let treedir= b:netrw_curdir
4465
 
"  call Decho("set initial treedir<".treedir.">")
4466
 
  let s:treecurpos= getpos(".")
4467
 
 
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')
4473
 
   else
4474
 
    let treedir= ""
4475
 
   endif
4476
 
 
4477
 
"   call Decho("treedir<".treedir.">")
4478
 
 
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")
4484
 
    keepjumps %d
4485
 
"    call Dret("NetrwTreeDir <".treedir."> : (side effect) s:treecurpos<".string(s:treecurpos).">")
4486
 
    return b:netrw_curdir
4487
 
   endif
4488
 
 
4489
 
   " elide all non-depth information
4490
 
   let depth = substitute(getline('.'),'^\(\%(| \)*\)[^|].\{-}$','\1','e')
4491
 
"   call Decho("depth<".depth."> 1st subst")
4492
 
 
4493
 
   " elide first depth
4494
 
   let depth = substitute(depth,'^| ','','')
4495
 
"   call Decho("depth<".depth."> 2nd subst")
4496
 
 
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.">")
4504
 
   endwhile
4505
 
   if w:netrw_treetop =~ '/$'
4506
 
    let treedir= w:netrw_treetop.treedir
4507
 
   else
4508
 
    let treedir= w:netrw_treetop.'/'.treedir
4509
 
   endif
4510
 
"   call Decho("bufnr(.)=".bufnr(".")." line($)=".line("$")." line(.)=".line("."))
4511
 
  endif
4512
 
  let treedir= substitute(treedir,'//$','/','')
4513
 
 
4514
 
"  " now force a refresh
4515
 
"  call Decho("clear buffer<".expand("%")."> with :%d")
4516
 
"  setlocal ma noro
4517
 
"  keepjumps %d
4518
 
 
4519
 
"  call Dret("NetrwTreeDir <".treedir."> : (side effect) s:treecurpos<".string(s:treecurpos).">")
4520
 
  return treedir
4521
 
endfun
4522
 
 
4523
 
" ---------------------------------------------------------------------
4524
 
" s:NetrwTreeDisplay: recursive tree display {{{2
4525
 
fun! s:NetrwTreeDisplay(dir,depth)
4526
 
"  call Dfunc("NetrwTreeDisplay(dir<".a:dir."> depth<".a:depth.">)")
4527
 
 
4528
 
  " insure that there are no folds
4529
 
  setlocal nofen
4530
 
 
4531
 
  " install ../ and shortdir
4532
 
  if a:depth == ""
4533
 
   call setline(line("$")+1,'../')
4534
 
"   call Decho("setline#".line("$")." ../ (depth is zero)")
4535
 
  endif
4536
 
  if a:dir =~ '^\a\+://'
4537
 
   if a:dir == w:netrw_treetop
4538
 
    let shortdir= a:dir
4539
 
   else
4540
 
    let shortdir= substitute(a:dir,'^.*/\([^/]\+\)/$','\1/','e')
4541
 
   endif
4542
 
   call setline(line("$")+1,a:depth.shortdir)
4543
 
  else
4544
 
   let shortdir= substitute(a:dir,'^.*/','','e')
4545
 
   call setline(line("$")+1,a:depth.shortdir.'/')
4546
 
  endif
4547
 
"  call Decho("setline#".line("$")." shortdir<".a:depth.shortdir.">")
4548
 
 
4549
 
  " append a / to dir if its missing one
4550
 
  let dir= a:dir
4551
 
  if dir !~ '/$'
4552
 
   let dir= dir.'/'
4553
 
  endif
4554
 
 
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)
4567
 
   else
4568
 
"    call Decho("<".entry."> is not a key in treedict (no subtree)")
4569
 
    call setline(line("$")+1,depth.entry)
4570
 
   endif
4571
 
  endfor
4572
 
"  call Dret("NetrwTreeDisplay")
4573
 
endfun
4574
 
 
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.">")
4581
 
 
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)")
4590
 
   endif
4591
 
 
4592
 
   " insure that we have at least an empty treedict
4593
 
   if !exists("w:netrw_treedict")
4594
 
    let w:netrw_treedict= {}
4595
 
   endif
4596
 
 
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"
4604
 
 
4605
 
   " if past banner, record word
4606
 
   if exists("w:netrw_bannercnt") && line(".") > w:netrw_bannercnt
4607
 
    let fname= expand("<cword>")
4608
 
   else
4609
 
    let fname= ""
4610
 
   endif
4611
 
 
4612
 
   " display from treetop on down
4613
 
   call s:NetrwTreeDisplay(w:netrw_treetop,"")
4614
 
 
4615
 
   " place cursor
4616
 
   if !exists("s:nbcd_curpos")
4617
 
    if fname != ""
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))
4623
 
    endif
4624
 
   endif
4625
 
 
4626
 
"   call Dret("NetrwTreeListing : bufname<".expand("%").">")
4627
 
  endif
4628
 
endfun
4629
 
 
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.">")
4638
 
endfun
4639
 
 
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")
4646
 
endfun
4647
 
 
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.">)")
4652
 
 
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
4655
 
  " a message.
4656
 
  call inputsave()
4657
 
  let newdirname= input("Please give directory name: ")
4658
 
  call inputrestore()
4659
 
"  call Decho("newdirname<".newdirname.">")
4660
 
 
4661
 
  if newdirname == ""
4662
 
"   call Dret("NetrwMakeDir : user aborted with bare <cr>")
4663
 
   return
4664
 
  endif
4665
 
 
4666
 
  if a:usrhost == ""
4667
 
 
4668
 
   " Local mkdir:
4669
 
   " sanity checks
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)
4675
 
    endif
4676
 
"    call Dret("NetrwMakeDir : directory<".newdirname."> exists previously")
4677
 
    return
4678
 
   endif
4679
 
   if s:FileReadable(fullnewdir)
4680
 
    if !exists("g:netrw_quiet")
4681
 
     call netrw#ErrorMsg(s:WARNING,"<".newdirname."> is already a file!",25)
4682
 
    endif
4683
 
"    call Dret("NetrwMakeDir : file<".newdirname."> exists previously")
4684
 
    return
4685
 
   endif
4686
 
 
4687
 
   " requested new local directory is neither a pre-existing file or
4688
 
   " directory, so make it!
4689
 
   if exists("*mkdir")
4690
 
    call mkdir(fullnewdir,"p")
4691
 
   else
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
4697
 
    if !g:netrw_keepdir
4698
 
     exe 'keepjumps cd '.netrw_origdir
4699
 
"     call Decho("netrw_keepdir=".g:netrw_keepdir.": cd ".netrw_origdir." getcwd<".getcwd().">")
4700
 
    endif
4701
 
   endif
4702
 
 
4703
 
   if v:shell_error == 0
4704
 
    " refresh listing
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)
4711
 
   endif
4712
 
   redraw!
4713
 
 
4714
 
  else
4715
 
   " Remote mkdir:
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
4721
 
    " refresh listing
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)
4727
 
   endif
4728
 
   redraw!
4729
 
  endif
4730
 
 
4731
 
"  call Dret("NetrwMakeDir")
4732
 
endfun
4733
 
 
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)
4744
 
 
4745
 
  if a:chg == 0
4746
 
   " bookmark the current directory
4747
 
"   call Decho("(user: <b>) bookmark the current directory")
4748
 
   if v:count > 0
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
4755
 
    endif
4756
 
   else
4757
 
    " handle no count specified
4758
 
    let g:NETRW_BOOKMARKMAX                       = g:NETRW_BOOKMARKMAX + 1
4759
 
    let g:NETRW_BOOKMARKDIR_{g:NETRW_BOOKMARKMAX} = a:curdir
4760
 
   endif
4761
 
   echo "bookmarked the current directory"
4762
 
 
4763
 
  elseif a:chg == 1
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}
4768
 
   else
4769
 
    echomsg "Sorry, bookmark#".v:count." doesn't exist!"
4770
 
   endif
4771
 
 
4772
 
  elseif a:chg == 2
4773
 
   redraw!
4774
 
   let didwork= 0
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."]")
4779
 
    let cnt= 0
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}
4784
 
      let didwork= 1
4785
 
     endif
4786
 
     let cnt= cnt + 1
4787
 
    endwhile
4788
 
   endif
4789
 
 
4790
 
   " list directory history
4791
 
   let cnt     = g:NETRW_DIRHIST_CNT
4792
 
   let first   = 1
4793
 
   let histcnt = 0
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}
4800
 
     let didwork= 1
4801
 
    endif
4802
 
    let first = 0
4803
 
    let cnt   = ( cnt - 1 ) % g:netrw_dirhistmax
4804
 
    if cnt < 0
4805
 
     let cnt= cnt + g:netrw_dirhistmax
4806
 
    endif
4807
 
   endwhile
4808
 
   if didwork
4809
 
    call inputsave()|call input("Press <cr> to continue")|call inputrestore()
4810
 
   endif
4811
 
 
4812
 
  elseif a:chg == 3
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}.">")
4820
 
   endif
4821
 
 
4822
 
  elseif a:chg == 4
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
4828
 
   endif
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")
4832
 
     setlocal ma noro
4833
 
     %d
4834
 
     setlocal nomod
4835
 
    endif
4836
 
"    call Decho("exe e! ".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT})
4837
 
    exe "e! ".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}
4838
 
   else
4839
 
    let g:NETRW_DIRHIST_CNT= ( g:NETRW_DIRHIST_CNT + 1 ) % g:netrw_dirhistmax
4840
 
    echo "Sorry, no predecessor directory exists yet"
4841
 
   endif
4842
 
 
4843
 
  elseif a:chg == 5
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")
4850
 
     setlocal ma noro
4851
 
     %d
4852
 
     setlocal nomod
4853
 
    endif
4854
 
"    call Decho("exe e! ".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT})
4855
 
    exe "e! ".g:NETRW_DIRHIST_{g:NETRW_DIRHIST_CNT}
4856
 
   else
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
4860
 
    endif
4861
 
    echo "Sorry, no successor directory exists yet"
4862
 
   endif
4863
 
  endif
4864
 
  call s:NetrwBookmarkMenu()
4865
 
"  call Dret("NetrwBookmarkDir")
4866
 
endfun
4867
 
 
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")
4875
 
   return
4876
 
  endif
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'
4881
 
   endif
4882
 
 
4883
 
   " show bookmarked places
4884
 
   let cnt       = 0
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>"
4890
 
    endif
4891
 
    let cnt= cnt + 1
4892
 
   endwhile
4893
 
 
4894
 
   " show directory browsing history
4895
 
   let cnt     = g:NETRW_DIRHIST_CNT
4896
 
   let first   = 1
4897
 
   let histcnt = 0
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>"
4905
 
    endif
4906
 
    let first = 0
4907
 
    let cnt   = ( cnt - 1 ) % g:netrw_dirhistmax
4908
 
    if cnt < 0
4909
 
     let cnt= cnt + g:netrw_dirhistmax
4910
 
    endif
4911
 
   endwhile
4912
 
  endif
4913
 
"  call Dret("NetrwBookmarkMenu")
4914
 
endfun
4915
 
 
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.
4919
 
"   Returns:
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.")")
4926
 
 
4927
 
  " grab a copy of the b:netrw_curdir to pass it along to newly split windows
4928
 
  let curdir    = b:netrw_curdir
4929
 
 
4930
 
  " get last window number and the word currently under the cursor
4931
 
  let lastwinnr = winnr("$")
4932
 
  let curword   = s:NetrwGetWord()
4933
 
  let choice    = 0
4934
 
"  call Decho("lastwinnr=".lastwinnr." curword<".curword.">")
4935
 
 
4936
 
  let didsplit  = 0
4937
 
  if lastwinnr == 1
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.")")
4940
 
   if g:netrw_preview
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"
4943
 
   else
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"
4946
 
   endif
4947
 
   let didsplit  = 1
4948
 
 
4949
 
  else
4950
 
   call s:SaveBufVars()
4951
 
"   call Decho("wincmd p")
4952
 
   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)
4958
 
   let bnrcnt = 0
4959
 
   if &mod
4960
 
"    call Decho("detected: prev window's buffer has been modified: bnr=".bnr." winnr#".winnr())
4961
 
    let eikeep= &ei
4962
 
    set ei=all
4963
 
    windo if winbufnr(0) == bnr | let bnrcnt=bnrcnt+1 | endif
4964
 
    exe bnr."wincmd p"
4965
 
    let &ei= eikeep
4966
 
"    call Decho("bnr=".bnr." bnrcnt=".bnrcnt." buftype=".&bt." winnr#".winnr())
4967
 
    if bnrcnt == 1
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())
4971
 
 
4972
 
     if choice == 1
4973
 
      " Yes -- write file & then browse
4974
 
      let v:errmsg= ""
4975
 
      silent w
4976
 
      if v:errmsg != ""
4977
 
       call netrw#ErrorMsg(s:ERROR,"unable to write <".bufname.">!",30)
4978
 
       if didsplit
4979
 
        q
4980
 
       else
4981
 
        wincmd p
4982
 
       endif
4983
 
"       call Dret("NetrwPrevWinOpen ".choice." : unable to write <".bufname.">")
4984
 
       return choice
4985
 
      endif
4986
 
 
4987
 
     elseif choice == 2
4988
 
      " No -- don't worry about changed file, just browse anyway
4989
 
      setlocal nomod
4990
 
      call netrw#ErrorMsg(s:WARNING,bufname." changes to ".bufname." abandoned",31)
4991
 
      wincmd p
4992
 
 
4993
 
     else
4994
 
      " Cancel -- don't do this
4995
 
      if didsplit
4996
 
       q
4997
 
      else
4998
 
       wincmd p
4999
 
      endif
5000
 
"      call Dret("NetrwPrevWinOpen ".choice." : cancelled")
5001
 
      return choice
5002
 
     endif
5003
 
    endif
5004
 
   endif
5005
 
  endif
5006
 
 
5007
 
  " restore b:netrw_curdir (window split/enew may have lost it)
5008
 
  let b:netrw_curdir= curdir
5009
 
  if a:islocal < 2
5010
 
   if a:islocal
5011
 
    call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(a:islocal,curword))
5012
 
   else
5013
 
    call s:NetrwBrowse(a:islocal,s:NetrwBrowseChgDir(a:islocal,curword))
5014
 
   endif
5015
 
  endif
5016
 
"  call Dret("NetrwPrevWinOpen ".choice)
5017
 
  return choice
5018
 
endfun
5019
 
 
5020
 
" ---------------------------------------------------------------------
5021
 
" s:NetrwMenu: generates the menu for gvim and netrw {{{2
5022
 
fun! s:NetrwMenu(domenu)
5023
 
 
5024
 
  if !exists("g:NetrwMenuPriority")
5025
 
   let g:NetrwMenuPriority= 80
5026
 
  endif
5027
 
 
5028
 
  if has("menu") && has("gui_running") && &go =~ 'm' && g:netrw_menu
5029
 
"   call Dfunc("NetrwMenu(domenu=".a:domenu.")")
5030
 
 
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
5078
 
 
5079
 
   elseif !a:domenu
5080
 
    let s:netrwcnt = 0
5081
 
    let curwin     = winnr()
5082
 
    windo if getline(2) =~ "Netrw" | let s:netrwcnt= s:netrwcnt + 1 | endif
5083
 
    exe curwin."wincmd w"
5084
 
 
5085
 
    if s:netrwcnt <= 1
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
5090
 
    endif
5091
 
   endif
5092
 
"   call Dret("NetrwMenu")
5093
 
  endif
5094
 
 
5095
 
endfun
5096
 
 
5097
 
" ==========================================
5098
6414
"  Local Directory Browsing Support:    {{{1
5099
6415
" ==========================================
5100
6416
 
5108
6424
  " The &ft == "netrw" test was installed because the BufEnter event
5109
6425
  " would hit when re-entering netrw windows, creating unexpected
5110
6426
  " refreshes (and would do so in the middle of NetrwSaveOptions(), too)
5111
 
"  call Dfunc("netrw#LocalBrowseCheck(dirname<".a:dirname.">")
5112
 
"  call Decho("isdir=".isdirectory(a:dirname))
 
6427
"  call Decho("netrw#LocalBrowseCheck: isdir<".a:dirname.">=".isdirectory(a:dirname))
5113
6428
  if isdirectory(a:dirname)
5114
 
"   call Decho(" ft=".&ft." b:netrw_curdir<".(exists("b:netrw_curdir")? b:netrw_curdir : " doesn't exist")."> dirname<".a:dirname.">"." line($)=".line("$"))
 
6429
"   call Decho(" ft<".&ft."> b:netrw_curdir<".(exists("b:netrw_curdir")? b:netrw_curdir : " doesn't exist")."> dirname<".a:dirname.">"." line($)=".line("$"))
5115
6430
   if &ft != "netrw" || (exists("b:netrw_curdir") && b:netrw_curdir != a:dirname)
5116
6431
    silent! call s:NetrwBrowse(1,a:dirname)
5117
6432
   elseif &ft == "netrw" && line("$") == 1
5118
6433
    silent! call s:NetrwBrowse(1,a:dirname)
5119
6434
   endif
5120
6435
  endif
5121
 
"  call Dret("netrw#LocalBrowseCheck")
5122
6436
  " not a directory, ignore it
5123
6437
endfun
5124
6438
 
5135
6449
"  if exists("g:netrw_sort_by")|call Decho('g:netrw_sort_by<'.g:netrw_sort_by.">")|else|call Decho("g:netrw_sort_by doesn't exist")|endif
5136
6450
 
5137
6451
  " get the list of files contained in the current directory
5138
 
  let dirname    = escape(b:netrw_curdir,s:netrw_glob_escape)
5139
 
  let dirnamelen = s:Strlen(b:netrw_curdir)
 
6452
  let dirname    = escape(b:netrw_curdir,g:netrw_glob_escape)
 
6453
  let dirnamelen = strlen(b:netrw_curdir)
5140
6454
  let filelist   = glob(s:ComposePath(dirname,"*"))
5141
6455
"  call Decho("glob(dirname<".dirname."/*>)=".filelist)
5142
6456
  if filelist != ""
5143
6457
   let filelist= filelist."\n"
5144
6458
  endif
5145
6459
  let filelist= filelist.glob(s:ComposePath(dirname,".*"))
5146
 
"  call Decho("glob(dirname<".dirname."/.*>)=".glob(dirname.".*"))
 
6460
"  call Decho("glob(dirname<".dirname."/.*>)=".filelist)
5147
6461
 
5148
 
  " if the directory name includes a "$", and possibly other characters,
5149
 
  " the glob() doesn't include "." and ".." entries.
5150
 
  if filelist !~ '[\\/]\.[\\/]\=\(\n\|$\)'
5151
 
"   call Decho("forcibly tacking on .")
5152
 
   if filelist == ""
5153
 
    let filelist= s:ComposePath(dirname,"./")
5154
 
   else
5155
 
    let filelist= filelist."\n".s:ComposePath(b:netrw_curdir,"./")
5156
 
   endif
 
6462
  " Coding choice: either   elide   ./ if present
 
6463
  "                or       include ./ if not present
 
6464
  if filelist =~ '[\\/]\.[\\/]\=\(\n\|$\)'
 
6465
   " elide /path/. from glob() entries if present
 
6466
"   call Decho("elide /path/. from glob entries if present")
 
6467
   let filelist = substitute(filelist,'\n','\t','g')
 
6468
   let filelist = substitute(filelist,'^[^\t]\+[/\\]\.\t','','')
 
6469
   let filelist = substitute(filelist,'[^\t]\+[/\\]\.$','','')
 
6470
   let filelist = substitute(filelist,'\t\zs[^\t]\+[/\\]\.\t','','')
 
6471
   let filelist = substitute(filelist,'\t','\n','g')
 
6472
  endif
5157
6473
"  call Decho("filelist<".filelist.">")
5158
 
  endif
5159
6474
  if filelist !~ '[\\/]\.\.[\\/]\=\(\n\|$\)'
 
6475
    " include ../ in the glob() entry if its missing
5160
6476
"   call Decho("forcibly tacking on ..")
5161
6477
   let filelist= filelist."\n".s:ComposePath(b:netrw_curdir,"../")
5162
6478
"   call Decho("filelist<".filelist.">")
5163
6479
  endif
5164
6480
  if b:netrw_curdir == '/'
5165
6481
   " remove .. from filelist when current directory is root directory
 
6482
"   call Decho("remove .. from filelist")
5166
6483
   let filelist= substitute(filelist,'/\.\.\n','','')
5167
 
"   call Decho("remove .. from filelist")
5168
6484
  endif
 
6485
  " remove multiple contiguous newlines
5169
6486
  let filelist= substitute(filelist,'\n\{2,}','\n','ge')
5170
6487
  if !g:netrw_cygwin && (has("win32") || has("win95") || has("win64") || has("win16"))
5171
6488
   " change all \s to /s
 
6489
"   call Decho('change all \s to /s')
5172
6490
   let filelist= substitute(filelist,'\','/','g')
5173
6491
  else
5174
6492
   " escape all \s to \\
 
6493
"   call Decho('escape all \s to \\')
5175
6494
   let filelist= substitute(filelist,'\','\\','g')
5176
6495
  endif
5177
6496
 
5178
 
"  call Decho("dirname<".dirname.">")
5179
 
"  call Decho("dirnamelen<".dirnamelen.">")
5180
 
"  call Decho("filelist<".filelist.">")
 
6497
"  call Decho("(before while) dirname<".dirname.">")
 
6498
"  call Decho("(before while) dirnamelen<".dirnamelen.">")
 
6499
"  call Decho("(before while) filelist<".filelist.">")
5181
6500
 
5182
6501
  while filelist != ""
5183
6502
   if filelist =~ '\n'
5187
6506
    let filename = filelist
5188
6507
    let filelist = ""
5189
6508
   endif
5190
 
   let pfile= filename
5191
 
   if isdirectory(filename)
 
6509
"   call Decho(" ")
 
6510
"   call Decho("(while) filelist<".filelist.">")
 
6511
"   call Decho("(while) filename<".filename.">")
 
6512
 
 
6513
   if getftype(filename) == "link"
 
6514
    " indicate a symbolic link
 
6515
"    call Decho("indicate <".filename."> is a symbolic link with trailing @")
 
6516
    let pfile= filename."@"
 
6517
 
 
6518
   elseif getftype(filename) == "socket"
 
6519
    " indicate a socket
 
6520
"    call Decho("indicate <".filename."> is a socket with trailing =")
 
6521
    let pfile= filename."="
 
6522
 
 
6523
   elseif getftype(filename) == "fifo"
 
6524
    " indicate a fifo
 
6525
"    call Decho("indicate <".filename."> is a fifo with trailing |")
 
6526
    let pfile= filename."|"
 
6527
 
 
6528
   elseif isdirectory(filename)
 
6529
    " indicate a directory
 
6530
"    call Decho("indicate <".filename."> is a directory with trailing /")
5192
6531
    let pfile= filename."/"
5193
 
   elseif fnamemodify(filename,":p") != resolve(filename)
5194
 
    let pfile= filename."@"
 
6532
 
 
6533
   elseif exists("b:netrw_curdir") && b:netrw_curdir !~ '^.*://' && !isdirectory(filename)
 
6534
    if (has("win32") || has("win95") || has("win64") || has("win16"))
 
6535
     if filename =~ '\.[eE][xX][eE]$' || filename =~ '\.[cC][oO][mM]$' || filename =~ '\.[bB][aA][tT]$'
 
6536
      " indicate an executable
 
6537
"      call Decho("indicate <".filename."> is executable with trailing *")
 
6538
      let pfile= filename."*"
 
6539
     else
 
6540
      " normal file
 
6541
      let pfile= filename
 
6542
     endif
 
6543
    elseif executable(filename)
 
6544
     " indicate an executable
 
6545
"     call Decho("indicate <".filename."> is executable with trailing *")
 
6546
     let pfile= filename."*"
 
6547
    else
 
6548
     " normal file
 
6549
     let pfile= filename
 
6550
    endif
 
6551
 
 
6552
   else
 
6553
    " normal file
 
6554
    let pfile= filename
5195
6555
   endif
 
6556
"   call Decho("pfile<".pfile."> (after *@/ appending)")
 
6557
 
5196
6558
   if pfile =~ '//$'
5197
6559
    let pfile= substitute(pfile,'//$','/','e')
 
6560
"    call Decho("change // to /: pfile<".pfile.">")
5198
6561
   endif
5199
6562
   let pfile= strpart(pfile,dirnamelen)
5200
6563
   let pfile= substitute(pfile,'^[/\\]','','e')
5201
 
"   call Decho(" ")
5202
6564
"   call Decho("filename<".filename.">")
5203
6565
"   call Decho("pfile   <".pfile.">")
5204
6566
 
5236
6598
 
5237
6599
  " cleanup any windows mess at end-of-line
5238
6600
  silent! keepjumps %s/\r$//e
5239
 
  setlocal ts=32
5240
 
"  call Decho("setlocal ts=32")
 
6601
  exe "setlocal ts=".g:netrw_maxfilenamelen
 
6602
"  call Decho("setlocal ts=".g:netrw_maxfilenamelen)
5241
6603
 
5242
6604
"  call Dret("s:LocalListing")
5243
6605
endfun
5248
6610
" buffers to be refreshed after a user has executed some shell command,
5249
6611
" on the chance that s/he removed/created a file/directory with it.
5250
6612
fun! s:LocalBrowseShellCmdRefresh()
5251
 
"  call Dfunc("LocalBrowseShellCmdRefresh() browselist=".string(s:netrw_browselist))
 
6613
"  call Dfunc("LocalBrowseShellCmdRefresh() browselist=".(exists("s:netrw_browselist")? string(s:netrw_browselist) : "empty")." ".tabpagenr("$")." tabs")
5252
6614
  " determine which buffers currently reside in a tab
 
6615
  if !exists("s:netrw_browselist")
 
6616
"   call Dret("LocalBrowseShellCmdRefresh : browselist is empty")
 
6617
   return
 
6618
  endif
 
6619
  if !exists("w:netrw_bannercnt")
 
6620
"   call Dret("LocalBrowseShellCmdRefresh : don't refresh when focus not on netrw windwo")
 
6621
   return
 
6622
  endif
5253
6623
  let itab       = 1
5254
6624
  let buftablist = []
5255
6625
  while itab <= tabpagenr("$")
5256
 
   let buftablist= buftablist + tabpagebuflist()
5257
 
   let itab= itab + 1
 
6626
   let buftablist = buftablist + tabpagebuflist()
 
6627
   let itab       = itab + 1
5258
6628
   tabn
5259
6629
  endwhile
5260
6630
"  call Decho("buftablist".string(buftablist))
 
6631
"  call Decho("s:netrw_browselist<".(exists("s:netrw_browselist")? string(s:netrw_browselist) : "").">")
5261
6632
  "  GO through all buffers on netrw_browselist (ie. just local-netrw buffers):
5262
6633
  "   | refresh any netrw window
5263
6634
  "   | wipe out any non-displaying netrw buffer
5266
6637
  for ibuf in s:netrw_browselist
5267
6638
"   call Decho("bufwinnr(".ibuf.") index(buftablist,".ibuf.")=".index(buftablist,ibuf))
5268
6639
   if bufwinnr(ibuf) == -1 && index(buftablist,ibuf) == -1
 
6640
    " wipe out any non-displaying netrw buffer
5269
6641
"    call Decho("wiping  buf#".ibuf,"<".bufname(ibuf).">")
5270
 
    exe "silent! bw ".ibuf
 
6642
    exe "silent! bd ".ibuf
5271
6643
    call remove(s:netrw_browselist,ibl)
5272
6644
"    call Decho("browselist=".string(s:netrw_browselist))
5273
6645
    continue
5274
6646
   elseif index(tabpagebuflist(),ibuf) != -1
 
6647
    " refresh any netrw buffer
5275
6648
"    call Decho("refresh buf#".ibuf.'-> win#'.bufwinnr(ibuf))
5276
6649
    exe bufwinnr(ibuf)."wincmd w"
5277
6650
    call s:NetrwRefresh(1,s:NetrwBrowseChgDir(1,'./'))
5286
6659
" ---------------------------------------------------------------------
5287
6660
" s:NetrwLocalRm: {{{2
5288
6661
fun! s:NetrwLocalRm(path) range
5289
 
"  call Dfunc("NetrwLocalRm(path<".a:path.">)")
 
6662
"  call Dfunc("s:NetrwLocalRm(path<".a:path.">)")
5290
6663
"  call Decho("firstline=".a:firstline." lastline=".a:lastline)
5291
6664
 
5292
6665
  " preparation for removing multiple files/directories
5294
6667
  let all   = 0
5295
6668
  let svpos = netrw#NetrwSavePosn()
5296
6669
 
5297
 
  if exists("s:netrwmarkfilelist")
 
6670
  if exists("s:netrwmarkfilelist_{bufnr('%')}")
5298
6671
   " remove all marked files
5299
6672
"   call Decho("remove all marked files")
5300
 
   for fname in s:netrwmarkfilelist
 
6673
   for fname in s:netrwmarkfilelist_{bufnr("%")}
5301
6674
    let ok= s:NetrwLocalRmFile(a:path,fname,all)
5302
 
    if ok =~ 'q\%[uit]'
 
6675
    if ok =~ 'q\%[uit]' || ok == "no"
5303
6676
     break
5304
6677
    elseif ok =~ 'a\%[ll]'
5305
6678
     let all= 1
5306
6679
    endif
5307
6680
   endfor
5308
 
   unlet s:netrwmarkfilelist
5309
 
   unlet s:netrwmarkfilemtch
5310
 
   2match none
 
6681
   call s:NetrwUnMarkFile(1)
5311
6682
 
5312
6683
  else
5313
6684
  " remove (multiple) files and directories
5328
6699
     continue
5329
6700
    endif
5330
6701
    let ok= s:NetrwLocalRmFile(a:path,curword,all)
5331
 
    if ok =~ 'q\%[uit]'
 
6702
    if ok =~ 'q\%[uit]' || ok == "no"
5332
6703
     break
5333
6704
    elseif ok =~ 'a\%[ll]'
5334
6705
     let all= 1
5338
6709
  endif
5339
6710
 
5340
6711
  " refresh the directory
5341
 
  call s:NetrwRefresh(1,s:NetrwBrowseChgDir(1,'./'))
5342
 
  call netrw#NetrwRestorePosn(svpos)
 
6712
"  call Decho("bufname<".bufname("%").">")
 
6713
  if bufname("%") != "NetrwMessage"
 
6714
   call s:NetrwRefresh(1,s:NetrwBrowseChgDir(1,'./'))
 
6715
   call netrw#NetrwRestorePosn(svpos)
 
6716
  endif
5343
6717
 
5344
 
"  call Dret("NetrwLocalRm")
 
6718
"  call Dret("s:NetrwLocalRm")
5345
6719
endfun
5346
6720
 
5347
6721
" ---------------------------------------------------------------------
5358
6732
 
5359
6733
  if rmfile !~ '^"' && (rmfile =~ '@$' || rmfile !~ '[\/]$')
5360
6734
   " attempt to remove file
 
6735
"   call Decho("attempt to remove file<".rmfile.">")
5361
6736
   if !all
5362
6737
    echohl Statement
5363
6738
    call inputsave()
5367
6742
    if ok == ""
5368
6743
     let ok="no"
5369
6744
    endif
5370
 
"     call Decho("response: ok<".ok.">")
 
6745
"    call Decho("response: ok<".ok.">")
5371
6746
    let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e')
5372
 
"     call Decho("response: ok<".ok."> (after sub)")
 
6747
"    call Decho("response: ok<".ok."> (after sub)")
5373
6748
    if ok =~ 'a\%[ll]'
5374
6749
     let all= 1
5375
6750
    endif
5377
6752
 
5378
6753
   if all || ok =~ 'y\%[es]' || ok == ""
5379
6754
    let ret= s:System("delete",rmfile)
5380
 
"     call Decho("errcode=".v:shell_error." ret=".ret)
 
6755
"    call Decho("errcode=".v:shell_error." ret=".ret)
5381
6756
   endif
5382
6757
 
5383
6758
  else
5398
6773
   let rmfile= substitute(rmfile,'[\/]$','','e')
5399
6774
 
5400
6775
   if all || ok =~ 'y\%[es]' || ok == ""
5401
 
"     call Decho("1st attempt: system(".g:netrw_local_rmdir.' "'.rmfile.'")')
5402
 
    call s:System("system",g:netrw_local_rmdir.' "'.rmfile.'"')
5403
 
"     call Decho("v:shell_error=".v:shell_error)
 
6776
"    call Decho("1st attempt: system(".g:netrw_local_rmdir.' '.shellescape(rmfile).')')
 
6777
    call s:System("system",g:netrw_local_rmdir.' '.shellescape(rmfile))
 
6778
"    call Decho("v:shell_error=".v:shell_error)
5404
6779
 
5405
6780
    if v:shell_error != 0
5406
 
"      call Decho("2nd attempt to remove directory<".rmfile.">")
 
6781
"     call Decho("2nd attempt to remove directory<".rmfile.">")
5407
6782
     let errcode= s:System("delete",rmfile)
5408
 
"      call Decho("errcode=".errcode)
 
6783
"     call Decho("errcode=".errcode)
5409
6784
 
5410
6785
     if errcode != 0
5411
6786
      if has("unix")
5412
 
"        call Decho("3rd attempt to remove directory<".rmfile.">")
5413
 
       call s:System("system","rm ".rmfile)
 
6787
"       call Decho("3rd attempt to remove directory<".rmfile.">")
 
6788
       call s:System("system","rm ".shellescape(rmfile))
5414
6789
       if v:shell_error != 0 && !exists("g:netrw_quiet")
5415
 
         call netrw#ErrorMsg(s:ERROR,"unable to remove directory<".rmfile."> -- is it empty?",34)
 
6790
        call netrw#ErrorMsg(s:ERROR,"unable to remove directory<".rmfile."> -- is it empty?",34)
 
6791
        let ok="no"
5416
6792
       endif
5417
6793
      elseif !exists("g:netrw_quiet")
5418
 
        call netrw#ErrorMsg(s:ERROR,"unable to remove directory<".rmfile."> -- is it empty?",35)
 
6794
       call netrw#ErrorMsg(s:ERROR,"unable to remove directory<".rmfile."> -- is it empty?",35)
 
6795
       let ok="no"
5419
6796
      endif
5420
6797
     endif
5421
6798
    endif
5436
6813
  let svpos= netrw#NetrwSavePosn()
5437
6814
 
5438
6815
  " rename files given by the markfilelist
5439
 
  if exists("s:netrwmarkfilelist")
5440
 
   for oldname in s:netrwmarkfilelist
 
6816
  if exists("s:netrwmarkfilelist_{bufnr('%')}")
 
6817
   for oldname in s:netrwmarkfilelist_{bufnr("%")}
5441
6818
"    call Decho("oldname<".oldname.">")
5442
6819
    if exists("subfrom")
5443
6820
     let newname= substitute(oldname,subfrom,subto,'')
5456
6833
    let ret= rename(oldname,newname)
5457
6834
   endfor
5458
6835
   2match none
5459
 
   unlet s:netrwmarkfilelist
5460
 
   unlet s:netrwmarkfilemtch
 
6836
   unlet s:netrwmarkfilelist_{bufnr("%")}
 
6837
   unlet s:netrwmarkfilemtch_{bufnr("%")}
5461
6838
  
5462
6839
  else
5463
6840
 
5502
6879
" ---------------------------------------------------------------------
5503
6880
" s:LocalFastBrowser: handles setting up/taking down fast browsing for the local browser {{{2
5504
6881
"
5505
 
"                 Directory Is
 
6882
"     g:netrw_    Directory Is
5506
6883
"     fastbrowse  Local  Remote   
5507
6884
"  slow   0         D      D      D=Deleting a buffer implies it will not be re-used (slow)
5508
6885
"  med    1         D      H      H=Hiding a buffer implies it may be re-used        (fast)
5509
6886
"  fast   2         H      H      
 
6887
"
 
6888
"  Deleting a buffer means that it will be re-loaded when examined, hence "slow".
 
6889
"  Hiding   a buffer means that it will be re-used   when examined, hence "fast".
 
6890
"           (re-using a buffer may not be as accurate)
5510
6891
fun! s:LocalFastBrowser()
5511
6892
"  call Dfunc("LocalFastBrowser() g:netrw_fastbrowse=".g:netrw_fastbrowse)
5512
6893
 
5517
6898
  endif
5518
6899
 
5519
6900
  " append current buffer to fastbrowse list
5520
 
  if g:netrw_fastbrowse <= 1 && (empty(s:netrw_browselist) || bufnr("%") > s:netrw_browselist[-1])
 
6901
  if empty(s:netrw_browselist) || bufnr("%") > s:netrw_browselist[-1]
5521
6902
"   call Decho("appendng current buffer to browselist")
5522
6903
   call add(s:netrw_browselist,bufnr("%"))
5523
6904
"   call Decho("browselist=".string(s:netrw_browselist))
5550
6931
   augroup! AuNetrwShellCmd
5551
6932
  endif
5552
6933
 
5553
 
"  call Dret("LocalFastBrowser")
5554
 
endfun
5555
 
 
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
5559
 
"                      been modified
5560
 
"          dosplit==1: the window will be split before running the local
5561
 
"                      browser
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)")
5567
 
  endif
5568
 
  let curfile= b:netrw_curdir
5569
 
"  call Decho("curfile<".curfile.">")
5570
 
 
5571
 
  " save registers
5572
 
  silent! let keepregstar = @*
5573
 
  silent! let keepregplus = @+
5574
 
  silent! let keepregslash= @/
5575
 
 
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()
5580
 
 
5581
 
   if a:style == 0      " Explore, Sexplore
5582
 
"    call Decho("style=0: Explore or Sexplore")
5583
 
    exe g:netrw_winsize."wincmd s"
5584
 
 
5585
 
   elseif a:style == 1  "Explore!, Sexplore!
5586
 
"    call Decho("style=1: Explore! or Sexplore!")
5587
 
    exe g:netrw_winsize."wincmd v"
5588
 
 
5589
 
   elseif a:style == 2  " Hexplore
5590
 
"    call Decho("style=2: Hexplore")
5591
 
    exe "bel ".g:netrw_winsize."wincmd s"
5592
 
 
5593
 
   elseif a:style == 3  " Hexplore!
5594
 
"    call Decho("style=3: Hexplore!")
5595
 
    exe "abo ".g:netrw_winsize."wincmd s"
5596
 
 
5597
 
   elseif a:style == 4  " Vexplore
5598
 
"    call Decho("style=4: Vexplore")
5599
 
    exe "lefta ".g:netrw_winsize."wincmd v"
5600
 
 
5601
 
   elseif a:style == 5  " Vexplore!
5602
 
"    call Decho("style=5: Vexplore!")
5603
 
    exe "rightb ".g:netrw_winsize."wincmd v"
5604
 
 
5605
 
   elseif a:style == 6  " Texplore
5606
 
    call s:SaveBufVars()
5607
 
"    call Decho("style  = 6: Texplore")
5608
 
    tabnew
5609
 
    call s:RestoreBufVars()
5610
 
   endif
5611
 
   call s:RestoreWinVars()
5612
 
  endif
5613
 
  norm! 0
5614
 
 
5615
 
  if a:0 > 0
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)")
5620
 
   elseif a:1 == '.'
5621
 
    let dirname= exists("b:netrw_curdir")? b:netrw_curdir : getcwd()
5622
 
    if dirname !~ '/$'
5623
 
     let dirname= dirname."/"
5624
 
    endif
5625
 
"    call Decho("using dirname<".dirname.">  (case: ".(exists("b:netrw_curdir")? "b:netrw_curdir" : "getcwd()").")")
5626
 
   elseif a:1 =~ '\$'
5627
 
    let dirname= expand(a:1)
5628
 
   else
5629
 
    let dirname= a:1
5630
 
"    call Decho("using dirname<".dirname.">")
5631
 
   endif
5632
 
  endif
5633
 
 
5634
 
  if dirname =~ '/\*\*/'
5635
 
  " handle .../**/...
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
5640
 
   else
5641
 
    let b:netrw_curdir= getcwd().'/'.prefixdir
5642
 
   endif
5643
 
   let dirname        = substitute(dirname,'^.\{-}\(\*\*/.*\)$','\1','')
5644
 
"   call Decho("pwd<".getcwd()."> dirname<".dirname.">")
5645
 
  endif
5646
 
 
5647
 
  if dirname =~ '^\*/'
5648
 
   " Explore */pattern
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,'^\*\*//','','')
5657
 
   let starstarpat = 1
5658
 
"   call Decho("Explore **//pat: dirname<".dirname."> -> pattern<".pattern.">")
5659
 
  endif
5660
 
 
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)
5668
 
   else
5669
 
    if newdir == ""|let newdir= getcwd()|endif
5670
 
"    call Decho("calling LocalBrowseCheck(newdir<".newdir.">)")
5671
 
    call netrw#LocalBrowseCheck(newdir)
5672
 
   endif
5673
 
"   call Decho("curfile<".curfile.">")
5674
 
   if has("win32") || has("win95") || has("win64") || has("win16")
5675
 
    call search('\<'.substitute(curfile,'^.*[/\\]','','e').'\>','cW')
5676
 
   else
5677
 
    call search('\<'.substitute(curfile,'^.*/','','e').'\>','cW')
5678
 
   endif
5679
 
 
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>
5688
 
   endif
5689
 
 
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
5694
 
    endif
5695
 
    let indx = a:indx
5696
 
"    call Decho("set indx= [a:indx=".indx."]")
5697
 
"
5698
 
    if indx == -1
5699
 
     "Nexplore
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")
5707
 
      return
5708
 
     endif
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]
5715
 
      let indx= indx + 1
5716
 
"      call Decho("indx=".indx." (Nexplore while loop)")
5717
 
     endwhile
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)
5720
 
 
5721
 
    elseif indx == -2
5722
 
     "Pexplore
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")
5730
 
      return
5731
 
     endif
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]
5738
 
      let indx= indx - 1
5739
 
"      call Decho("indx=".indx." (Pexplore while loop)")
5740
 
     endwhile
5741
 
     if indx < 0                        | let indx= 0                           | endif
5742
 
"     call Decho("Pexplore: indx= [w:netrw_explore_indx=".w:netrw_explore_indx."]=".indx)
5743
 
 
5744
 
    else
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()
5751
 
     endif
5752
 
"     call Decho("b:netrw_curdir<".b:netrw_curdir.">")
5753
 
 
5754
 
     if exists("pattern")
5755
 
"      call Decho("pattern exists: building list pattern<".pattern."> cwd<".getcwd().">")
5756
 
      if exists("starstarpat")
5757
 
"       call Decho("starstarpat<".starstarpat.">")
5758
 
       try
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")
5767
 
        return
5768
 
       endtry
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)')
5772
 
      else
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
5777
 
      endif
5778
 
     else
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
5782
 
     endif
5783
 
 
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)
5786
 
 
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")
5793
 
      return
5794
 
     endif
5795
 
    endif
5796
 
 
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)
5800
 
 
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)
5807
 
     sleep 1
5808
 
    endif
5809
 
 
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.">")
5814
 
 
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
5819
 
    endif
5820
 
    if w:netrw_liststyle == s:THINLIST || w:netrw_liststyle == s:LONGLIST
5821
 
     call search('^'.substitute(dirfile,"^.*/","","").'\>',"W")
5822
 
    else
5823
 
     call search('\<'.substitute(dirfile,"^.*/","","").'\>',"w")
5824
 
    endif
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)
5830
 
 
5831
 
   else
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)
5835
 
    endif
5836
 
    silent! let @* = keepregstar
5837
 
    silent! let @+ = keepregstar
5838
 
    silent! let @/ = keepregslash
5839
 
"    call Dret("netrw#Explore : missing +path_extra")
5840
 
    return
5841
 
   endif
5842
 
 
5843
 
  else
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
5848
 
   endif
5849
 
   let newdir= dirname
5850
 
   if !exists("b:netrw_curdir")
5851
 
    call netrw#LocalBrowseCheck(getcwd())
5852
 
   else
5853
 
    call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,newdir))
5854
 
   endif
5855
 
  endif
5856
 
 
5857
 
  silent! let @* = keepregstar
5858
 
  silent! let @+ = keepregstar
5859
 
  silent! let @/ = keepregslash
5860
 
"  call Dret("netrw#Explore : @/<".@/.">")
5861
 
endfun
5862
 
 
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.">")
5873
 
  return repat
5874
 
endfun
5875
 
 
5876
 
" ---------------------------------------------------------------------
5877
 
" s:SetupNetrwStatusLine: {{{2
5878
 
fun! s:SetupNetrwStatusLine(statline)
5879
 
"  call Dfunc("SetupNetrwStatusLine(statline<".a:statline.">)")
5880
 
 
5881
 
  if !exists("s:netrw_setup_statline")
5882
 
   let s:netrw_setup_statline= 1
5883
 
"   call Decho("do first-time status line setup")
5884
 
 
5885
 
   if !exists("s:netrw_users_stl")
5886
 
    let s:netrw_users_stl= &stl
5887
 
   endif
5888
 
   if !exists("s:netrw_users_ls")
5889
 
    let s:netrw_users_ls= &laststatus
5890
 
   endif
5891
 
 
5892
 
   " set up User9 highlighting as needed
5893
 
   let keepa= @a
5894
 
   redir @a
5895
 
   try
5896
 
    hi User9
5897
 
   catch /^Vim\%((\a\+)\)\=:E411/
5898
 
    if &bg == "dark"
5899
 
     hi User9 ctermfg=yellow ctermbg=blue guifg=yellow guibg=blue
5900
 
    else
5901
 
     hi User9 ctermbg=yellow ctermfg=blue guibg=yellow guifg=blue
5902
 
    endif
5903
 
   endtry
5904
 
   redir END
5905
 
   let @a= keepa
5906
 
  endif
5907
 
 
5908
 
  " set up status line (may use User9 highlighting)
5909
 
  " insure that windows have a statusline
5910
 
  " make sure statusline is displayed
5911
 
  let &stl=a:statline
5912
 
  setlocal laststatus=2
5913
 
"  call Decho("stl=".&stl)
5914
 
  redraw!
5915
 
 
5916
 
"  call Dret("SetupNetrwStatusLine : stl=".&stl)
5917
 
endfun
5918
 
 
5919
 
" ---------------------------------------------------------------------
5920
 
" NetrwStatusLine: {{{2
5921
 
fun! NetrwStatusLine()
5922
 
 
5923
 
" vvv NetrwStatusLine() debugging vvv
5924
 
"  let g:stlmsg=""
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("%")
5929
 
"  endif
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(".").">"
5934
 
"  endif
5935
 
"  if !exists("w:netrw_explore_list")
5936
 
"   let g:stlmsg=" !X<explore_list>"
5937
 
"  endif
5938
 
" ^^^ NetrwStatusLine() debugging ^^^
5939
 
 
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
5946
 
   return ""
5947
 
  else
5948
 
   return "Match ".w:netrw_explore_mtchcnt." of ".w:netrw_explore_listlen
5949
 
  endif
5950
 
endfun
5951
 
 
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.'/'
5961
 
  endif
5962
 
  if a:doesc
5963
 
   let curdir= escape(curdir,g:netrw_cd_escape)
5964
 
  endif
5965
 
"  call Dret("NetrwGetcwd <".curdir.">")
5966
 
  return curdir
5967
 
endfun
5968
 
 
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.
5975
 
fun! s:SetSort()
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')
5979
 
  else
5980
 
   let seqlist  = g:netrw_sort_sequence
5981
 
  endif
5982
 
  " sanity check -- insure that * appears somewhere
5983
 
  if seqlist == ""
5984
 
   let seqlist= '*'
5985
 
  elseif seqlist !~ '\*'
5986
 
   let seqlist= seqlist.',*'
5987
 
  endif
5988
 
  let priority = 1
5989
 
  while seqlist != ""
5990
 
   if seqlist =~ ','
5991
 
    let seq     = substitute(seqlist,',.*$','','e')
5992
 
    let seqlist = substitute(seqlist,'^.\{-},\(.*\)$','\1','e')
5993
 
   else
5994
 
    let seq     = seqlist
5995
 
    let seqlist = ""
5996
 
   endif
5997
 
   let eseq= escape(seq,'/')
5998
 
   if priority < 10
5999
 
    let spriority= "00".priority.'\/'
6000
 
   elseif priority < 100
6001
 
    let spriority= "0".priority.'\/'
6002
 
   else
6003
 
    let spriority= priority.'\/'
6004
 
   endif
6005
 
"   call Decho("priority=".priority." spriority<".spriority."> seq<".seq."> seqlist<".seqlist.">")
6006
 
 
6007
 
   " sanity check
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")
6011
 
    return
6012
 
   endif
6013
 
   if seq == '*'
6014
 
    exe 'silent keepjumps '.w:netrw_bannercnt.',$v/^\d\{3}\//s/^/'.spriority.'/'
6015
 
   else
6016
 
    exe 'silent keepjumps '.w:netrw_bannercnt.',$g/'.eseq.'/s/^/'.spriority.'/'
6017
 
   endif
6018
 
   let priority = priority + 1
6019
 
  endwhile
6020
 
 
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'
6028
 
 
6029
 
"  call Dret("SetSort")
6030
 
endfun
6031
 
 
6032
 
" =====================================================================
 
6934
"  call Dret("LocalFastBrowser : browselist<".string(s:netrw_browselist).">")
 
6935
endfun
 
6936
 
 
6937
" ---------------------------------------------------------------------
6033
6938
" Support Functions: {{{1
6034
6939
 
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'
 
6948
   try
 
6949
    silent emenu Buffers.Refresh\ menu
 
6950
   catch /^Vim\%((\a\+)\)\=:E/
 
6951
    let v:errmsg= ""
 
6952
    silent call s:NetrwBMShow()
 
6953
   endtry
 
6954
  endif
 
6955
"  call Dret("s:UpdateBuffersMenu")
 
6956
endfun
 
6957
 
 
6958
" ---------------------------------------------------------------------
 
6959
" s:NetrwBMShow: {{{2
 
6960
fun! s:NetrwBMShow()
 
6961
"  call Dfunc("s:NetrwBMShow()")
 
6962
  redir => bmshowraw
 
6963
   menu
 
6964
  redir END
 
6965
  let bmshowlist = split(bmshowraw,'\n')
 
6966
  if bmshowlist != []
 
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
 
6972
    endif
 
6973
   endif
 
6974
  endif
 
6975
"  call Dret("s:NetrwBMShow : bmshowfunc<".(exists("bmshowfunc")? bmshowfunc : 'n/a').">")
 
6976
endfun
 
6977
 
 
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.">)")
 
6982
 
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
6043
6988
   else
6044
6989
    let ret = a:base . a:subdir
6045
6990
   endif
 
6991
 
6046
6992
  elseif a:subdir =~ '^\a:[/\\][^/\\]' && (has("win32") || has("win95") || has("win64") || has("win16"))
 
6993
"   call Decho("windows")
6047
6994
   let ret= a:subdir
 
6995
 
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,'[^/]\+/$','','')
 
7003
    else
 
7004
     let curpath=""
 
7005
    endif
 
7006
    let ret= urlbase.curpath
 
7007
   else
 
7008
    let ret= urlbase.curpath.a:subdir
 
7009
   endif
6052
7010
"   call Decho("urlbase<".urlbase.">")
6053
7011
"   call Decho("curpath<".curpath.">")
6054
7012
"   call Decho("ret<".ret.">")
 
7013
 
6055
7014
  else
 
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
6060
7020
   endif
 
7021
   let ret= simplify(ret)
6061
7022
  endif
 
7023
 
6062
7024
"  call Dret("s:ComposePath ".ret)
6063
7025
  return ret
6064
7026
endfun
6068
7030
"   0=note     = s:NOTE
6069
7031
"   1=warning  = s:WARNING
6070
7032
"   2=error    = s:ERROR
6071
 
"  Sep 17, 2007 : max errnum currently is 60
 
7033
"  Jun 11, 2008 : max errnum currently is 70
6072
7034
fun! netrw#ErrorMsg(level,msg,errnum)
6073
7035
"  call Dfunc("netrw#ErrorMsg(level=".a:level." msg<".a:msg."> errnum=".a:errnum.") g:netrw_use_errorwindow=".g:netrw_use_errorwindow)
6074
7036
 
6079
7041
  else
6080
7042
   let level= "**note** (netrw) "
6081
7043
  endif
 
7044
"  call Decho("level=".level)
6082
7045
 
6083
7046
  if g:netrw_use_errorwindow
6084
7047
   " (default) netrw creates a one-line window to show error/warning
6086
7049
 
6087
7050
   " record current window number for NetrwRestorePosn()'s benefit
6088
7051
   let s:winBeforeErr= winnr()
 
7052
"   call Decho("s:winBeforeErr=".s:winBeforeErr)
6089
7053
 
6090
7054
   " getting messages out reliably is just plain difficult!
6091
7055
   " This attempt splits the current window, creating a one line window.
6092
7056
   if bufexists("NetrwMessage") && bufwinnr("NetrwMessage") > 0
 
7057
"    call Decho("write to NetrwMessage buffer")
6093
7058
    exe bufwinnr("NetrwMessage")."wincmd w"
6094
 
    set ma noro
 
7059
"    call Decho("setlocal ma noro")
 
7060
    setlocal ma noro
6095
7061
    call setline(line("$")+1,level.a:msg)
6096
7062
    $
6097
7063
   else
 
7064
"    call Decho("create a NetrwMessage buffer window")
6098
7065
    bo 1split
6099
7066
    enew
6100
7067
    setlocal bt=nofile
6101
7068
    file NetrwMessage
 
7069
"    call Decho("setlocal ma noro")
 
7070
    setlocal ma noro
6102
7071
    call setline(line("$"),level.a:msg)
6103
7072
   endif
 
7073
"   call Decho("wrote msg<".level.a:msg."> to NetrwMessage win#".winnr())
6104
7074
   if &fo !~ '[ta]'
6105
7075
    syn clear
6106
7076
    syn match netrwMesgNote     "^\*\*note\*\*"
6114
7084
  else
6115
7085
   " (optional) netrw will show messages using echomsg.  Even if the
6116
7086
   " message doesn't appear, at least it'll be recallable via :messages
6117
 
   redraw!
 
7087
"   redraw!
6118
7088
   if a:level == s:WARNING
6119
7089
    echohl WarningMsg
6120
7090
   elseif a:level == s:ERROR
6169
7139
 
6170
7140
   " sanity check -- does the temporary file's directory exist?
6171
7141
   if !isdirectory(substitute(tmpfile,'[^/]\+$','','e'))
 
7142
"    call Decho("ro=".&ro." ma=".&ma." mod=".&mod." wrap=".&wrap)
6172
7143
    call netrw#ErrorMsg(s:ERROR,"your <".substitute(tmpfile,'[^/]\+$','','e')."> directory is missing!",2)
6173
7144
"    call Dret("s:GetTempfile getcwd<".getcwd().">")
6174
7145
    return ""
6215
7186
   endif
6216
7187
  endif
6217
7188
 
 
7189
"  call Decho("ro=".&ro." ma=".&ma." mod=".&mod." wrap=".&wrap)
6218
7190
"  call Dret("s:GetTempfile <".tmpfile.">")
6219
7191
  return tmpfile
6220
7192
endfun
6223
7195
" s:MakeSshCmd: transforms input command using USEPORT HOSTNAME into {{{2
6224
7196
"               a correct command
6225
7197
fun! s:MakeSshCmd(sshcmd)
6226
 
"  call Dfunc("s:MakeSshCmd(sshcmd<".a:sshcmd.">)")
 
7198
"  call Dfunc("s:MakeSshCmd(sshcmd<".a:sshcmd.">) user<".s:user."> machine<".s:machine.">")
6227
7199
  let sshcmd = substitute(a:sshcmd,'\<HOSTNAME\>',s:user.s:machine,'')
6228
7200
  if exists("g:netrw_port") && g:netrw_port != ""
6229
7201
   let sshcmd= substitute(sshcmd,"USEPORT",g:netrw_sshport.' '.g:netrw_port,'')
6249
7221
   let cmd      = s:MakeSshCmd(g:netrw_ssh_cmd." USEPORT HOSTNAME")
6250
7222
   let remotedir= substitute(b:netrw_curdir,'^.*//[^/]\+/\(.*\)$','\1','')
6251
7223
   if remotedir != ""
6252
 
    let cmd= cmd.' "cd '."'".remotedir."';"
 
7224
    let cmd= cmd.' "cd '.shellescape(remotedir).";"
6253
7225
   else
6254
7226
    let cmd= cmd.' "'
6255
7227
   endif
6285
7257
  if exists("b:netrw_prvdir")         |let netrw_prvdir          = b:netrw_prvdir         |endif
6286
7258
 
6287
7259
  call s:NetrwOptionRestore("w:")
6288
 
  if getline(2) =~ '^" Netrw Directory Listing'
6289
 
"   call Decho("generate a buffer with keepjumps keepalt enew! (1)")
6290
 
   keepjumps keepalt enew!
6291
 
  else
6292
 
"   call Decho("generate a buffer with keepjumps enew! (2)")
6293
 
   keepjumps enew!
6294
 
  endif
 
7260
"  call Decho("generate a buffer with keepjumps keepalt enew!")
 
7261
  keepjumps keepalt enew!
6295
7262
  call s:NetrwOptionSave("w:")
6296
7263
 
6297
7264
  " copy function-local-variables to buffer variable equivalents
6319
7286
    nno <silent> <buffer> [     :silent call <SID>TreeListMove('[')<cr>
6320
7287
    nno <silent> <buffer> ]     :silent call <SID>TreeListMove(']')<cr>
6321
7288
   else
6322
 
    exe "silent! file ".b:netrw_curdir
 
7289
    exe "silent! keepalt file ".b:netrw_curdir
6323
7290
   endif
6324
7291
  endif
6325
7292
 
6326
 
"  call Dret("s:NetrwEnew : buf#".bufnr("%")."<".bufname("%").">")
6327
 
endfun
6328
 
 
6329
 
" ------------------------------------------------------------------------
 
7293
"  call Dret("s:NetrwEnew : buf#".bufnr("%")."<".bufname("%")."> expand(%)<".expand("%")."> expand(#)<".expand("#").">")
 
7294
endfun
 
7295
 
 
7296
" ------------------------------------------------------------------------
 
7297
" netrw#NetrwSavePosn: saves position of cursor on screen {{{2
 
7298
fun! netrw#NetrwSavePosn()
 
7299
"  call Dfunc("netrw#NetrwSavePosn()")
 
7300
  " Save current line and column
 
7301
  let w:netrw_winnr= winnr()
 
7302
  let w:netrw_line = line(".")
 
7303
  let w:netrw_col  = virtcol(".")
 
7304
 
 
7305
  " Save top-of-screen line
 
7306
  norm! H0
 
7307
  let w:netrw_hline= line(".")
 
7308
 
 
7309
  " set up string holding position parameters
 
7310
  let ret          = "let w:netrw_winnr=".w:netrw_winnr."|let w:netrw_line=".w:netrw_line."|let w:netrw_col=".w:netrw_col."|let w:netrw_hline=".w:netrw_hline
 
7311
 
 
7312
  call netrw#NetrwRestorePosn()
 
7313
"  call Dret("netrw#NetrwSavePosn : winnr=".w:netrw_winnr." line=".w:netrw_line." col=".w:netrw_col." hline=".w:netrw_hline)
 
7314
  return ret
 
7315
endfun
 
7316
 
 
7317
" ------------------------------------------------------------------------
 
7318
" netrw#NetrwRestorePosn: restores the cursor and file position as saved by NetrwSavePosn() {{{2
 
7319
fun! netrw#NetrwRestorePosn(...)
 
7320
"  call Dfunc("netrw#NetrwRestorePosn() a:0=".a:0." winnr=".(exists("w:netrw_winnr")? w:netrw_winnr : -1)." line=".(exists("w:netrw_line")? w:netrw_line : -1)." col=".(exists("w:netrw_col")? w:netrw_col : -1)." hline=".(exists("w:netrw_hline")? w:netrw_hline : -1))
 
7321
  let eikeep= &ei
 
7322
  set ei=all
 
7323
  if expand("%") == "NetrwMessage"
 
7324
   exe s:winBeforeErr."wincmd w"
 
7325
  endif
 
7326
 
 
7327
  if a:0 > 0
 
7328
   exe a:1
 
7329
  endif
 
7330
 
 
7331
  " restore window
 
7332
  if exists("w:netrw_winnr")
 
7333
"   call Decho("restore window: exe silent! ".w:netrw_winnr."wincmd w")
 
7334
   exe "silent! ".w:netrw_winnr."wincmd w"
 
7335
  endif
 
7336
  if v:shell_error == 0
 
7337
   " as suggested by Bram M: redraw on no error
 
7338
   " allows protocol error messages to remain visible
 
7339
"   redraw!
 
7340
  endif
 
7341
 
 
7342
  " restore top-of-screen line
 
7343
  if exists("w:netrw_hline")
 
7344
"   call Decho("restore topofscreen: exe norm! ".w:netrw_hline."G0z")
 
7345
   exe "norm! ".w:netrw_hline."G0z\<CR>"
 
7346
  endif
 
7347
 
 
7348
  " restore position
 
7349
  if exists("w:netrw_line") && exists("w:netrw_col")
 
7350
"   call Decho("restore posn: exe norm! ".w:netrw_line."G0".w:netrw_col."|")
 
7351
   exe "norm! ".w:netrw_line."G0".w:netrw_col."\<bar>"
 
7352
  endif
 
7353
 
 
7354
  let &ei= eikeep
 
7355
"  call Dret("netrw#NetrwRestorePosn")
 
7356
endfun
 
7357
 
 
7358
" ---------------------------------------------------------------------
 
7359
" s:NetrwSaveWordPosn: used to keep cursor on same word after refresh, {{{2
 
7360
" changed sorting, etc.  Also see s:NetrwRestoreWordPosn().
 
7361
fun! s:NetrwSaveWordPosn()
 
7362
"  call Dfunc("NetrwSaveWordPosn()")
 
7363
  let s:netrw_saveword= '^'.fnameescape(getline('.')).'$'
 
7364
"  call Dret("NetrwSaveWordPosn : saveword<".s:netrw_saveword.">")
 
7365
endfun
 
7366
 
 
7367
" ---------------------------------------------------------------------
 
7368
" s:NetrwRestoreWordPosn: used to keep cursor on same word after refresh, {{{2
 
7369
"  changed sorting, etc.  Also see s:NetrwSaveWordPosn().
 
7370
fun! s:NetrwRestoreWordPosn()
 
7371
"  call Dfunc("NetrwRestoreWordPosn()")
 
7372
  silent! call search(s:netrw_saveword,'w')
 
7373
"  call Dret("NetrwRestoreWordPosn")
 
7374
endfun
 
7375
 
 
7376
" ---------------------------------------------------------------------
6330
7377
" s:RemotePathAnalysis: {{{2
6331
7378
fun! s:RemotePathAnalysis(dirname)
6332
7379
"  call Dfunc("s:RemotePathAnalysis()")
6390
7437
endfun
6391
7438
 
6392
7439
" ---------------------------------------------------------------------
 
7440
" s:Rexplore: implements returning from a buffer to a netrw directory {{{2
 
7441
"
 
7442
"             s:SetRexDir() sets up <2-leftmouse> maps (if g:netrw_retmap
 
7443
"             is true) and a command, :Rexplore, which call this function.
 
7444
"
 
7445
"             s:nbcd_curpos_{bufnr('%')} is set up by s:NetrwBrowseChgDir()
 
7446
fun! s:NetrwRexplore(islocal,dirname)
 
7447
"  call Dfunc("s:NetrwRexplore(islocal=".a:islocal." dirname<".a:dirname.">)")
 
7448
  if a:islocal
 
7449
   call netrw#LocalBrowseCheck(a:dirname)
 
7450
  else
 
7451
   call s:NetrwBrowse(0,a:dirname)
 
7452
  endif
 
7453
  if exists("s:nbcd_curpos_{bufnr('%')}")
 
7454
   call netrw#NetrwRestorePosn(s:nbcd_curpos_{bufnr('%')})
 
7455
   unlet s:nbcd_curpos_{bufnr('%')}
 
7456
  endif
 
7457
"  call Dret("s:NetrwRexplore")
 
7458
endfun
 
7459
 
 
7460
" ---------------------------------------------------------------------
6393
7461
" s:SaveBufVars: {{{2
6394
7462
fun! s:SaveBufVars()
6395
7463
"  call Dfunc("s:SaveBufVars()")
6457
7525
"  call Dfunc("s:SetRexDir(islocal=".a:islocal." dirname<".a:dirname.">)")
6458
7526
  " set up Rex and leftmouse-double-click
6459
7527
  if a:islocal
6460
 
   exe 'com! Rexplore call netrw#LocalBrowseCheck("'.escape(a:dirname,g:netrw_cd_escape).'")'
 
7528
   exe 'com! Rexplore call s:NetrwRexplore(1,"'.a:dirname.'")'
6461
7529
   if g:netrw_retmap
6462
7530
    silent! unmap <2-leftmouse>
6463
7531
    if !hasmapto("<Plug>NetrwReturn")
6464
7532
     nmap <unique> <silent> <2-leftmouse>       <Plug>NetrwReturn
6465
7533
    endif
6466
 
    exe 'nnoremap <silent> <Plug>NetrwReturn :call netrw#LocalBrowseCheck("'.a:dirname.'")<cr>'
 
7534
    exe 'nnoremap <silent> <Plug>NetrwReturn :call <SID>NetrwRexplore(1,"'.a:dirname.'")<cr>'
6467
7535
   endif
6468
7536
  else
6469
 
   exe 'com! Rexplore call s:NetrwBrowse(0,"'.escape(a:dirname,g:netrw_cd_escape).'")'
 
7537
   exe 'com! Rexplore call s:NetrwRexplore(0,"'.a:dirname.'")'
6470
7538
   if g:netrw_retmap
6471
7539
    silent! unmap <2-leftmouse>
6472
7540
    if !hasmapto("<Plug>NetrwReturn")
6473
7541
     nmap <unique> <silent> <2-leftmouse>       <Plug>NetrwReturn
6474
7542
    endif
6475
 
    exe 'nnoremap <silent> <Plug>NetrwReturn :call <SID>NetrwBrowse(0,"'.a:dirname.'")<cr>'
 
7543
    exe 'nnoremap <silent> <Plug>NetrwReturn :call <SID>NetrwRexplore(0,"'.a:dirname.'")<cr>'
6476
7544
   endif
6477
7545
  endif
6478
7546
"  call Dret("s:SetRexDir")
6479
7547
endfun
6480
7548
 
6481
7549
" ---------------------------------------------------------------------
6482
 
" s:Strlen: this function returns the length of a string, even if its {{{1
6483
 
"           using two-byte etc characters.  Depends on virtcol().
 
7550
" s:Strlen: this function returns the length of a string, even if its {{{2
 
7551
"           using two-byte etc characters.
6484
7552
"           Currently, its only used if g:Align_xstrlen is set to a
6485
 
"           nonzero value.
 
7553
"           nonzero value.  Solution from Nicolai Weibull, vim docs
 
7554
"           (:help strlen()), Tony Mechelynck, and my own invention.
6486
7555
fun! s:Strlen(x)
6487
7556
"  call Dfunc("s:Strlen(x<".a:x.">")
6488
 
  let ret= strlen(substitute(a:x,'.','c','g'))
 
7557
  if g:netrw_xstrlen == 1
 
7558
   " number of codepoints (Latin a + combining circumflex is two codepoints)
 
7559
   " (comment from TM, solution from NW)
 
7560
   let ret= strlen(substitute(a:x,'.','c','g'))
 
7561
 
 
7562
  elseif g:netrw_xstrlen == 2
 
7563
   " number of spacing codepoints (Latin a + combining circumflex is one spacing 
 
7564
   " codepoint; a hard tab is one; wide and narrow CJK are one each; etc.)
 
7565
   " (comment from TM, solution from TM)
 
7566
   let ret=strlen(substitute(a:x, '.\Z', 'x', 'g')) 
 
7567
 
 
7568
  elseif g:netrw_xstrlen == 3
 
7569
   " virtual length (counting, for instance, tabs as anything between 1 and 
 
7570
   " 'tabstop', wide CJK as 2 rather than 1, Arabic alif as zero when immediately 
 
7571
   " preceded by lam, one otherwise, etc.)
 
7572
   " (comment from TM, solution from me)
 
7573
   let modkeep= &mod
 
7574
   exe "norm! o\<esc>"
 
7575
   call setline(line("."),a:x)
 
7576
   let ret= virtcol("$") - 1
 
7577
   d
 
7578
   let &mod= modkeep
 
7579
 
 
7580
  else
 
7581
   " at least give a decent default
 
7582
   ret= strlen(a:x)
 
7583
  endif
6489
7584
"  call Dret("s:Strlen ".ret)
6490
7585
  return ret
6491
7586
endfun
6493
7588
" ---------------------------------------------------------------------
6494
7589
" s:System: using Steve Hall's idea to insure that Windows paths stay {{{2
6495
7590
"              acceptable.  No effect on Unix paths.
6496
 
"  Examples of use:  let result= s:System("system",path)
 
7591
"  Examples of use:  let result= s:System("rm",path)
6497
7592
"                    let result= s:System("delete",path)
 
7593
fun! netrw#System(cmd,path)
 
7594
  echomsg s:System(a:cmd,a:path)
 
7595
endfun
6498
7596
fun! s:System(cmd,path)
6499
7597
"  call Dfunc("s:System(cmd<".a:cmd."> path<".a:path.">)")
6500
7598
 
6513
7611
    exe "let result= ".a:cmd."('".path."')"
6514
7612
    let &shellslash = sskeep
6515
7613
   else
6516
 
    exe "let result= ".a:cmd."(".g:netrw_shq.path.g:netrw_shq.")"
 
7614
"    call Decho("exe let result= ".a:cmd."('".path."')")
 
7615
    exe "let result= ".a:cmd."('".path."')"
6517
7616
   endif
6518
7617
  else
 
7618
"   call Decho("exe let result= ".a:cmd."('".path."')")
6519
7619
   exe "let result= ".a:cmd."('".path."')"
6520
7620
  endif
6521
7621
 
6527
7627
" s:TreeListMove: {{{2
6528
7628
fun! s:TreeListMove(dir)
6529
7629
"  call Dfunc("s:TreeListMove(dir<".a:dir.">)")
6530
 
  let curline  = getline(".")
 
7630
  let curline  = getline('.')
6531
7631
  let prvline  = (line(".") > 1)?         getline(line(".")-1) : ''
6532
7632
  let nxtline  = (line(".") < line("$"))? getline(line(".")+1) : ''
6533
7633
  let curindent= substitute(curline,'^\([| ]*\).\{-}$','\1','')