Попробуйте следующую команду:
function s:MKDir(...)
if !a:0
\|| stridx('`+', a:1[0])!=-1
\|| a:1=~#'\v\\@<![ *?[%#]'
\|| isdirectory(a:1)
\|| filereadable(a:1)
\|| isdirectory(fnamemodify(a:1, ':p:h'))
return
endif
return mkdir(fnamemodify(a:1, ':p:h'), 'p')
endfunction
command -bang -bar -nargs=? -complete=file E :call s:MKDir(<f-args>) | e<bang> <args>
Эта команда предназначена для замены для встроенных :e
.
Условия, в которых MkDir не выполняются (в порядке убывания):
- Команда выполняется без аргументов
- команда запускается с
`generate filename`
или `=generate_filename()`
обратные кавычки в имени файла генераторов или с +command
/++opt
коммутаторами.
- Команда содержит более одного аргумента или не имеет специальных символов.
- Аргумент - это каталог.
- Аргумент - это существующий файл.
- Аргумент - это файл в существующем каталоге.
В последних трех случаях ничего не должно быть сделано, второй и третий случаи не могут быть обработаны, просто сложнее.
выше готов для добавления cnoreabbrev
:
cnoreabbrev <expr> e ((getcmdtype() is# ':' && getcmdline() is# 'e')?'E':'e')
-complete=file
портит вещи: добавить не только завершение, но и обработку аргументов (таким образом, проверку `
расширения и наличие специальных символов не иметь смысл) и запрещает иметь несколько «имен файлов» (таким образом, нет ++ opt).
-bar
не позволяет использовать `="String"`
, потому что "
теперь начинает комментарий. Без -bar
это не :e
эмуляция, потому что вы не можете сделать E file | another command
.
Другой вариант:
function s:MKDir(...)
if !a:0
\|| isdirectory(a:1)
\|| filereadable(a:1)
\|| isdirectory(fnamemodify(a:1, ':p:h'))
return
endif
return mkdir(fnamemodify(a:1, ':p:h'), 'p')
endfunction
command -bang -bar -nargs=? -complete=file E :call s:MKDir(<f-args>) | e<bang> <args>
Пожелайте, чтобы у вас был подходящий плагин. –