@@ -6,9 +6,9 @@ import autoload 'dir/g.vim'
66
77export def Sep (escape : bool = false): string
88 if escape
9- return has (" win32" ) ? ' \\' : ' /'
9+ return has (" win32" ) && ! & shellslash ? ' \\' : ' /'
1010 else
11- return has (" win32" ) ? ' \' : ' /'
11+ return has (" win32" ) && ! & shellslash ? ' \' : ' /'
1212 endif
1313enddef
1414
@@ -150,36 +150,52 @@ export def ListDirTree(name: string): list<dict<any>>
150150 endtry
151151enddef
152152
153+ def CopyFile (src : string , dst: string )
154+ const content = readfile (resolve (src ), " b" )
155+ writefile (content, dst, " b" )
156+ enddef
157+
158+ def CopyDir (src : string , dst: string )
159+ const src_resolved = resolve (src )
160+ mkdir (dst, " p" )
161+ for item in readdirex (src_resolved, ' 1' , {sort : ' none' })
162+ const src_path = src_resolved .. Sep () .. item.name
163+ const dst_path = dst .. Sep () .. item.name
164+
165+ if item.type == " dir"
166+ CopyDir (src_path, dst_path)
167+ else
168+ CopyFile (src_path, dst_path)
169+ endif
170+ endfor
171+ enddef
172+
153173# XXX : explore jobs here...
154174export def Copy ()
155175 if mark .IsEmpty () | return | endif
156176 if ! isdirectory (get (b: , " dir_cwd" , " " )) | return | endif
157177
158- var copy_cmd = " cp"
159- var dest_dir = $ " {b:dir_cwd}"
160-
161- if &shell = ~ ' pwsh'
162- copy_cmd = " Copy-Item -Force"
163- elseif has (" win32" )
164- copy_cmd = " copy /Y"
165- endif
178+ var dest_dir = b: dir_cwd
166179
167180 var override = false
168181 # 1 - override all files
169182 # -1 - do not override anything
170183 var override_all = 0
171184
185+ const mark_dir = mark .Dir ()
172186 var file_list = mark .List ()- >copy ()
173187 var dir_list = mark .List ()- >copy ()- >filter ((_, v ) = > v .type = ~ ' dir\|linkd\|junction' )
174188 for item in dir_list
175- file_list += ListDirTree ($ " {mark.Dir() }{Sep()}{item.name}" )
189+ file_list += ListDirTree ($ " {mark_dir }{Sep()}{item.name}" )
176190 endfor
177191 for item in file_list
178- var src = $ " {mark.Dir() }{Sep()}{item.name}"
179- var dst = $ " {b:dir_cwd }{Sep()}{item.name}"
192+ var src = $ " {mark_dir }{Sep()}{item.name}"
193+ var dst = $ " {dest_dir }{Sep()}{item.name}"
180194 try
181- if item.type = ~ ' dir\|linkd\|junction' && ! isdirectory (dst)
182- mkdir (dst, " p" )
195+ if item.type = ~ ' dir\|linkd\|junction'
196+ if ! isdirectory (dst)
197+ mkdir (dst, " p" )
198+ endif
183199 else
184200 var file_exists = filereadable (dst)
185201 if file_exists && override_all == 0
@@ -210,15 +226,11 @@ export def Copy()
210226 if ! isdirectory (fnamemodify (dst, " :h" ))
211227 mkdir (fnamemodify (dst, " :h" ), " p" )
212228 endif
213- if &shell = ~ ' pwsh'
214- system ($ ' {copy_cmd} "{resolve(src)}" "{dst}"' - >escape (' "' ))
215- else
216- system ($ ' {copy_cmd} "{resolve(src)}" "{dst}"' )
217- endif
229+ CopyFile (src , dst)
218230 endif
219231 endif
220232 catch
221- echo v: exception
233+ echom v: exception
222234 endtry
223235 endfor
224236 mark .Clear ()
@@ -228,23 +240,17 @@ export def Duplicate()
228240 if mark .IsEmpty () | return | endif
229241 if ! isdirectory (get (b: , " dir_cwd" , " " )) | return | endif
230242
231- var copy_cmd = " cp -R"
232- var copy_dir_cmd = " cp -R"
233- var dest_dir = $ " {b:dir_cwd}"
234-
235- if has (" win32" )
236- copy_cmd = " copy /Y"
237- copy_dir_cmd = " xcopy /EIH"
238- endif
243+ const mark_dir = mark .Dir ()
244+ var dest_dir = b: dir_cwd
239245
240246 for item in mark .List ()
241- var src = $ " {mark.Dir() }{Sep()}{item.name}"
242- var dst = $ " {b:dir_cwd }{Sep()}{GetDuplicateName(item.name)}"
247+ var src = $ " {mark_dir }{Sep()}{item.name}"
248+ var dst = $ " {dest_dir }{Sep()}{GetDuplicateName(item.name)}"
243249 try
244250 if item.type == ' dir'
245- system ( $ ' {copy_dir_cmd} "{resolve( src)}" "{ dst}" ' )
251+ CopyDir ( src , dst)
246252 else
247- system ( $ ' {copy_cmd} "{resolve( src)}" "{ dst}" ' )
253+ CopyFile ( src , dst)
248254 endif
249255 catch
250256 echo v: exception
@@ -258,28 +264,23 @@ export def Move()
258264 if mark .IsEmpty () | return | endif
259265 if ! isdirectory (get (b: , " dir_cwd" , " " )) | return | endif
260266
261- var move_cmd = " mv"
262- var dest_dir = $ " {b:dir_cwd}"
263-
264- if &shell = ~ ' pwsh'
265- move_cmd = " Move-Item -Force"
266- elseif has (" win32" )
267- move_cmd = " move /Y"
268- endif
269267
270268 var override = false
271269 # 1 - override all files
272270 # -1 - do not override anything
273271 var override_all = 0
274272
273+ var dest_dir = b: dir_cwd
274+ const mark_dir = mark .Dir ()
275275 var file_list = mark .List ()- >copy ()
276276 var dir_list = mark .List ()- >copy ()- >filter ((_, v ) = > v .type = ~ ' dir\|linkd\|junction' )
277277 for item in dir_list
278- file_list += ListDirTree ($ " {mark.Dir() }{Sep()}{item.name}" )
278+ file_list += ListDirTree ($ " {mark_dir }{Sep()}{item.name}" )
279279 endfor
280280 for item in file_list
281- var src = $ " {mark.Dir()}{Sep()}{item.name}"
282- var dst = $ " {b:dir_cwd}{Sep()}{item.name}"
281+ var src = $ " {mark_dir}{Sep()}{item.name}"
282+ var dst = $ " {dest_dir}{Sep()}{item.name}"
283+
283284 try
284285 if item.type = ~ ' dir\|linkd\|junction' && ! isdirectory (dst)
285286 mkdir (dst, " p" )
@@ -313,19 +314,16 @@ export def Move()
313314 if ! isdirectory (fnamemodify (dst, " :h" ))
314315 mkdir (fnamemodify (dst, " :h" ), " p" )
315316 endif
316- if &shell = ~ ' pwsh'
317- system ($ ' {move_cmd} "{resolve(src)}" "{dst}"' - >escape (' "' ))
318- else
319- system ($ ' {move_cmd} "{resolve(src)}" "{dst}"' )
320- endif
317+ CopyFile (src , dst)
318+ delete (src )
321319 endif
322320 endif
323321 catch
324322 echo v: exception
325323 endtry
326324 endfor
327325 for item_dir in dir_list
328- Delete ($ " {mark.Dir() }{Sep()}{item_dir.name}" )
326+ delete ($ " {mark_dir }{Sep()}{item_dir.name}" , ' rf ' )
329327 endfor
330328 for buf_info in g .OtherDirBuffers ()
331329 setbufvar (buf_info.bufnr , " dir_invalidate" , true)
0 commit comments