2012-05-01 2 views
22

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

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

ответ

6

Попробуйте следующую команду:

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 не выполняются (в порядке убывания):

  1. Команда выполняется без аргументов
  2. команда запускается с `generate filename` или `=generate_filename()` обратные кавычки в имени файла генераторов или с +command/++opt коммутаторами.
  3. Команда содержит более одного аргумента или не имеет специальных символов.
  4. Аргумент - это каталог.
  5. Аргумент - это существующий файл.
  6. Аргумент - это файл в существующем каталоге.

В последних трех случаях ничего не должно быть сделано, второй и третий случаи не могут быть обработаны, просто сложнее.

выше готов для добавления 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> 
+0

Пожелайте, чтобы у вас был подходящий плагин. –

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

Это два шага ... – notJim

17

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

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

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

:E spec/models/blog_spec.rb 

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

+3

Это, на мой взгляд, лучше, чем принято отвечать. Это работало очень хорошо для меня. Большое спасибо! – nickcoxdotme

+4

Одна вещь состоит в том, что этот ответ не имеет выполнения табуляции для путей. В приведенном выше примере, если существовала модель 'spec', но« модели »этого не сделали, вам нужно будет ввести« spec »вместо' sp ' – graysonwright

2

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

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

Это именно то, что я искал! часто я не хочу думать о том, существует ли путь до редактирования файла. Я только беспокоюсь об этом, когда я готов сохранить файл. – verboze

Смежные вопросы