Ответ 1
Попробуйте выполнить следующую команду:
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()`
генераторами файлов backticks или с помощью переключателей+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>