В то время как в vim я хочу создать новый файл с именем blog_spec.rb
внутри [working directory]/spec/models/
, но каталог еще не существует?
Какой самый быстрый способ создать каталог и начать редактирование файла? Любые oneliners?
В то время как в vim я хочу создать новый файл с именем blog_spec.rb
внутри [working directory]/spec/models/
, но каталог еще не существует?
Какой самый быстрый способ создать каталог и начать редактирование файла? Любые oneliners?
Попробуйте выполнить следующую команду:
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>
:!mkdir -p spec/models
:w spec/models/blog_spec.rb
Если вы часто сталкиваетесь с этим, может быть полезно добавить для него команду.
command -nargs=1 E execute('silent! !mkdir -p "$(dirname "<args>")"') <Bar> e <args>
Если вы добавите эту строку в свой файл .vimrc, вы можете просто использовать ее следующим образом:
:E spec/models/blog_spec.rb
Изменить Это будет работать только на Linux/Mac, а не на Windows.
Обычно я обнаружил, что родительские каталоги еще не существуют только после попытки сохранить файл.
Этот код предложит вам создать каталог с :w
или просто сделать это с помощью :w!
:
augroup vimrc-auto-mkdir
autocmd!
autocmd BufWritePre * call s:auto_mkdir(expand('<afile>:p:h'), v:cmdbang)
function! s:auto_mkdir(dir, force)
if !isdirectory(a:dir)
\ && (a:force
\ || input("'" . a:dir . "' does not exist. Create? [y/N]") =~? '^y\%[es]$')
call mkdir(iconv(a:dir, &encoding, &termencoding), 'p')
endif
endfunction
augroup END