Jika saya memanggil vim foo/bar/somefile
tetapi foo/bar
belum ada, Vim menolak untuk menyimpan.
Saya tahu saya dapat beralih ke shell atau melakukan :!mkdir foo/bar
dari Vim tetapi saya malas :) Apakah ada cara untuk membuat Vim melakukan itu secara otomatis ketika itu menyimpan buffer?
mkdir -p %:h
lebih baik karena berfungsi untuk jalur yang tidak ada bersarang, tidak menimbulkan kesalahan saat jalur sudah ada, dan%:h
merupakan jalur lengkap dari file saat ini. Namun, saya tidak tahu cara mengaktifkannya secara otomatis. Biasanya, ini dilakukan dengan perintah otomatis tetapiBufWritePre
acara tersebut tampaknya tidak berfungsi di sini.write
dan memanggil sistem kemkdir -p
ondirname
jika tidak, petakan keW
... Saya terlalu malas untuk mencari sintaks dan mempostingnya sebagai jawaban ... Maaf:w
untukmkdir -p %:h
diikuti oleh builting:write
Jawaban:
Perhatikan kondisi:
expand("<afile>")!~#'^\w\+:/'
akan mencegah vim membuat direktori untuk file sepertiftp://*
dan!isdirectory
akan mencegah panggilan mkdir yang mahal.Perbarui : solusi yang lebih baik yang juga memeriksa buftype dan penggunaan yang tidak kosong
mkdir()
:sumber
call mkdir(expand('%:h'), 'p')
mungkin lebih portabel.Berdasarkan saran untuk pertanyaan saya, inilah yang akhirnya saya dapatkan:
Ini mendefinisikan
:W
perintah. Idealnya, saya ingin memiliki semua:w!
,:wq
,:wq!
,:wall
dll bekerja sama, tapi aku tidak yakin apakah itu mungkin tanpa dasarnya reimplementing mereka semua dengan fungsi kustom.sumber
:W
, layar saya menjadi hampir kosong. Saya akan mencoba dan menghapus opsi saya sebelumnya dan memberikan umpan balik.Saya menambahkan ini ke ~ / .vimrc saya
cnoremap mk. !mkdir -p <c-r>=expand("%:h")<cr>/
Jika saya perlu membuat direktori tempat saya berada, saya mengetik
:mk.
dan itu menggantikannya dengan "! Mkdir -p / path / to / my / file /" dan mengizinkan saya untuk meninjau perintah sebelum saya memanggilnya.sumber
Saya
:saveas!
membuat direktori jika hilang: https://github.com/henrik/dotfiles/commit/54cc9474b345332cf54cf25b51ddb8a9bd00a0bbsumber
Kode ini akan meminta Anda untuk membuat direktori dengan
:w
, atau lakukan saja dengan:w!
:sumber
Saya pikir saya berhasil melakukan ini dalam tiga baris, menggabungkan apa yang dikatakan orang lain tentang jawaban ini.
Ini sepertinya berhasil:
Ia mencoba untuk membuat folder secara otomatis saat menyimpan buffer. Jika sesuatu yang buruk terjadi (yaitu masalah izin), itu hanya akan menutup dan membiarkan file menulis gagal.
Jika ada yang melihat kekurangan yang jelas, silakan kirim komentar. Saya tidak terlalu ahli dalam vimscript.
EDIT: Catatan berkat ZyX
sumber
%
dalam skrip seperti itu. Vim tidak akan melarikan diri setiap simbol khusus: misalnya, jika Anda mengedit sebuah file bernama/mnt/windows/Documents and Settings/User/_vimrc
Anda akan berakhir memiliki empat direktori baru:/mnt/windows/Documents
,./and
,./Settings
dan./Settings/User
. Dan, omong-omong, Anda tidak perlu di:execute
sini.system()
fungsi untuk panggilan shell yang senyap, tetapi Anda tidak memerlukan keduanya:execute
dan%:p:h
::silent !mkdir -p %:p:h
berfungsi persis seperti yang telah Anda tulis (meskipun Anda mungkin perlu:redraw!
di bagian akhir, dalam hal ini akan:execute
berguna), tetapi lebih baik digunakancall system('mkdir -p '.shellescape(expand('%:p:h')))
. Gunakan:execute '!command' shellescape(arg, 1)
(dengan argumen kedua untuk shellescape) jika Anda harus menggunakan poni, bukansystem()
. Gunakan poni jika argumen lolos berisi baris baru.:source ~/.vimrc
) (ini untuk apaaugroup
danautocmd!
untuk), membatalkan tampilan setelah meluncurkan shell perintah (untuk aparedraw!
), membuat direktori sampah jika menggunakan pseudo-file (dalam kode pertama yang dipotong itu diperiksa hanya dengan mencocokkan nama file dengan pola, tetapi di yang kedua saya juga memeriksa&buftype
) dan panggilan shell yang tidak berguna dalam direktori kasus ada (isdirectory()
kondisi).%
ekspansi yang tidak pernah disarankan untuk digunakan oleh siapa pun. File pseudo digunakan dalam banyak plugin (misalnya buronan atau aurum saya), oleh karena itu mereka layak untuk diperhatikan. Sumber daya vimrc juga merupakan praktik umum. Anda dapat memiliki apa pun yang Anda inginkan di vimrc, hanya saja jangan menyarankannya sebagai jawaban. Menggunakan:silent! call mkdir(expand('%:p:h'), 'p')
varian memecahkan dua poin yang saya sebutkan dan ketiga saya tidak menyebutkan:!mkdir
tidak akan berfungsi di windows.