Подтвердить что ты не робот

Создать файл внутри нового каталога в vim за один шаг?

В то время как в vim я хочу создать новый файл с именем blog_spec.rb внутри [working directory]/spec/models/, но каталог еще не существует?

Какой самый быстрый способ создать каталог и начать редактирование файла? Любые oneliners?

4b9b3361

Ответ 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>

Ответ 2

:!mkdir -p spec/models
:w spec/models/blog_spec.rb

Ответ 3

Если вы часто сталкиваетесь с этим, может быть полезно добавить для него команду.

command -nargs=1 E execute('silent! !mkdir -p "$(dirname "<args>")"') <Bar> e <args>

Если вы добавите эту строку в свой файл .vimrc, вы можете просто использовать ее следующим образом:

:E spec/models/blog_spec.rb

Изменить Это будет работать только на Linux/Mac, а не на Windows.

Ответ 4

Обычно я обнаружил, что родительские каталоги еще не существуют только после попытки сохранить файл.

Этот код предложит вам создать каталог с :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