エラーをスローせずにVimがファイルを書き込めないようにするにはどうすればよいですか?


10

私はこの答えのコードを改善して、不足しているディレクトリを作成する前に確認を求めようとしています。これは私が書いたものです:

function! CreateDirectoryAskConfirmation(path)
    if !isdirectory(a:path)
        echohl Question
        echo "Create directory " . a:path . "?"
        echohl None

        let response = nr2char(getchar())
        if response ==? "y"
            call mkdir(a:path, "p")
        endif
    endif
endfunction

autocmd BufWritePre * call CreateDirectoryAskConfirmation(expand("<afile>:p:h"))

1つ欠けているのyは、プロンプトを押さない場合は、Vimに書き込みを中止させて、エラーが発生しないようにE212: Can't open file for writingするためです。エラーメッセージを非表示にするために別のキーを押す必要はありません。これを達成する方法はありますか?

回答:


9

BufWritePreautocmd を使用する代わりに、次のBufWriteCmd 場所からautocmd を使用できます:help BufWriteCmd

「+」が「cpo」にあり、別のファイルcpo- +に書き込む場合を除き、ファイルの書き込みを行い、成功した場合は「変更」をリセットする必要があります。

:writeautocmdから呼び出すだけです。これは設定を処理しますmodified

したがって、ロジックが変更され:write、ディレクトリがすでに存在する場合に呼び出さ:writeれ、ディレクトリがまだ存在しない場合は、作成後に呼び出されます。を押しnても何も起こりません。これにより、バッファはそのままになり、再設定されないmodifiedため:qE37: No write since last changeエラーが発生します。

function! CreateDirectoryAskConfirmation(path, dir)
    silent doautocmd BufWritePre

    " Directory exists, :write and return
    if isdirectory(a:dir)
        execute 'write ' . a:path
        silent doautocmd BufWritePost
        return
    endif

    " Ask for confirmation to create this directory
    echohl Question
    echo "Create directory `" . a:dir . "' [y/N]?"
    echohl None

    let response = nr2char(getchar())
    " mkdir() and :write if we want to make a directory
    if response ==? "y"
        call mkdir(a:dir, "p")
        execute 'write ' . a:path
        silent doautocmd BufWritePost
    endif
endfunction

autocmd BufWriteCmd * call CreateDirectoryAskConfirmation(expand("<amatch>:p"), expand("<amatch>:p:h"))

2
VimScriptファイルでは:、コマンドの先頭は必要ありません。
tommcdo 2015

@tommcdoありがとう。何らかの理由で、私の脳は時々これを忘れてしまいます> _ <
Martin Tournoij、2015

2
@ toro2kありがとう。私はそれについて知りませんでした。私は自分の回答を編集silentしましたautogroup。これを使用していない場合はメッセージが表示されないように追加しました。また、気づいた別の問題を修正しました:w another_name。動作しませんでした(動作しません)。
Martin Tournoij、2015

2
@ toro2kそれ以外の場合writeは、現在のファイル名に(単にを入力したときと同じように:write)書き込み、機能し:write another_filenameません(元のファイル名を引き続き使用します)。
Martin Tournoij、2015

1
@whitesiroiこのbufype設定を使用して、バッファタイプを取得できます。修正を加えて投稿を自由に編集してください(または、修正しない場合は、次の週に行います)。
Martin Tournoij
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.