2

保存時にファイルを圧縮し、保存後にファイルを解凍するために使用しているコマンドがいくつかあります(最初のインデントのみ)。私が苦労していることの1つは、コマンドを履歴に追加したくないということです。コマンドもカーソル位置などもありません。

私がしなければならないことは、viminfo書き込み前のオンをオフにしてから、書き込み後のオンに戻すことだと思いました。しかし、私はそれを理解できないようです。これが私が使っている関数です:

function! s:CompressIndent()
    augroup CompressIndent
        autocmd!

        " Befor writing, change 4 spaces (and single tabs) into 2 spaces
        autocmd BufWritePre * set viminfo="NONE"              " Turn off 'history' before making the pre-write substitutions
        autocmd BufWritePre * %substitute/^\( \+\)\1/\1/e " Halve the number of spaces of indentation
        autocmd BufWritePre * set tabstop=2               " Make sure that tabs = 2 spaces before re-tabbing
        autocmd BufWritePre * retab                       " Turn tabs into two spaces

        " When opening a file (and after writing the file) turn 2 spaces into (and 4 tabs) into 4 spaces
        autocmd BufReadPost,BufWritePost * set tabstop=4         " Make sure to display in 4 tabs
        autocmd BufReadPost,BufWritePost * %substitute/^ \+/&&/e " Double the number of spaces of indentation on Reading and writing
        autocmd BufReadPost,BufWritePost * set viminfo='20,\"200 " Turn back on history
    augroup END
endfunction

私は試しましset viminfo="NONE"set viminfo=""。どちらも効果がないようでした。

どんな助けでもいただければ幸いです!

ありがとう!

編集

これで私は今ここにいますが、まだ完全には機能していません(インデントは壊れていますが、histdel()も完全には機能しません。ファイルを保存した後、カーソルは完全に新しいものに移動します位置と元に戻る履歴が分岐しているか、何か奇妙なものです:

function! s:CompressIndent()
    augroup CompressIndent
        autocmd!

        " Befor writing, change 4 spaces (and single tabs) into 2 spaces
        autocmd BufWritePre * call s:SpaceSubstitution("2") " Halve the number of    spaces of indentation
        autocmd BufWritePre * set tabstop=2                 " Make sure that tabs = 2 spaces before re-tabbing
        autocmd BufWritePre * retab                         " Turn tabs into two spaces

        " When opening a file (and after writing the file) turn 2 spaces into (and 4 tabs) into 4 spaces
        autocmd BufReadPost,BufWritePost * set tabstop=4    " Make sure to display in 4 tabs
        autocmd BufReadPost,BufWritePost * call s:SpaceSubstitution("4") " Double the number of spaces of indentation on Reading and writing
    augroup END
endfunction
command! -n=0 -bar CompressIndent :call s:CompressIndent()

function! s:SpaceSubstitution(toSpaces)
    if a:toSpaces == "2"
        %substitute/^\( \+\)\1/\1/e
    else
        %substitute/^ \+/&&/e
    endif

    call histdel('search', -1)
endfunction
4

2 に答える 2

2

Vimには履歴を操作するための4つの機能があり:h history-functions、リストと簡単な説明が表示されます。4つのうち、必要なものは次のとおりです。

histdel()

で読むことができます:h histdel()

于 2013-01-27T08:38:28.367 に答える
2

操作'viminfo'は、ここで使用するには大きすぎるクラブです。によって実行されるコマンドは:autocmd、コマンド履歴に追加されません。

私が見る唯一のものは:substitute、検索履歴と現在の検索パターンを汚染することです。コマンドをに移動し:function、autocmdから呼び出すことで、多くのことを回避できます。を参照してください:help function-search-undo

関数の最後で行う必要があるのは、履歴から検索パターンを削除することだけです。

:call histdel('search', -1)

編集:現在のカーソル位置を維持するに:substituteは、次のようにラップします。

let l:save_view = winsaveview()
    %substitute/...
call winrestview(l:save_view)
于 2013-01-27T09:53:50.093 に答える