2012-04-07 11 views
0

私はいくつかの行を選択してその周りにvirtualeditブロックを作成するためのスクリプトを作成しようとしています。一番長い行の後に1列。選択肢の周りにvirtualeditブロックを作成します

これはそれを行う必要がありますどのように私のコード

function! VirtualEdit() 
    let EndLine = line("'>") 

    set virtualedit = all 

    let maxlength = max(map(range(line("'<"), line("'>")), "virtcol([v:val, '$'])"))-1 
    call cursor(1,maxlength+1) 
    normal "^Q".EndLine."jc<space><ESC>" 

    set virtualedit = '' 
endfunction 

では
1である)私の選択で最も長い行(MAXLENGTH)を制御します。
2)最長行+1列の列の選択範囲の最初の行にカーソルを置きます。
3)ビジュアルブロック選択をアクティブにするより(私のウィンドウのコマンドはC-Qです)
4)ビジュアルブロックを選択範囲の最後の行まで伸ばしてください(私のPCのコマンドは下に移動する= "j")。
5)「c」キーを使用して「スペース」文字を挿入し、ESCを使用して挿入モードを終了し、仮想ブロック列をスペースで埋めます。

しかし、私は通常のコマンドで変数(Endline)を使用する方法を見つけることができません。
私は上記の例ではキーがあり、動作しないことにも注意しました。
どうしたのですか?

答えて

3

現在地多くのエラーを持っている:

  1. :set

    は、あなたが式を受け付けません=
  2. :setの周りにスペースを持たせていない、のでset ve=''は、:set ve=あるlet &ve=''let &ve="''"ではありません。
  3. :normalコマンドも式を受け入れません。実行されたばかりの文字列を受け入れます。したがって、:normal "^はレジスタ^を使用しようとしていますが、失敗し(そのようなレジスタはありません)、残りの行の処理を停止します。式を:normalに渡すには、:executeを使用します。
  4. :normalコマンドは、<Key>の構文を受け入れません。 viml式もどちらも、"\<Key>"(注:二重引用符とバックスラッシュのみ)を持っていません。 ^Q構文は誰にも受け入れられず、テキストファイルの中に未処理の制御コード(vimで^Qと表示されています)を持つことは最適ではありません。
  5. :normalを使用しないでください。ほとんどの場合、必要ありません(この場合は^Q\<C-v>に置き換える必要があります)。
  6. virtualedit値をハードコードしないでください。代わりの

    set ve=all 
    <...> 
    set ve= 
    

    使用

    let savedve=&ve 
    set ve=all 
    try 
        <...> 
    finally 
        let &ve=savedve 
    endtry 
    
  7. {N}jは「N番目の行に移動」ではなく、「Nラインをダウン」を意味します。 「第N行に行く」は{N}ggまたは{N}Gです。
  8. let maxlen=<...>-1があり、maxlenが使用されている行はmaxlen+1です。それはおかしい。

あなたがこの問題を解決する場合は、続行することができますが、virtualeditを調整し、全く:normalを使用して必要はありません。

function AddSpaces() 
    let [lstart, lend]=[line("'<"), line("'>")] 
    if lstart>lend 
     let [lstart, lend]=[lend, lstart] 
    endif 
    let maxcol=max(map(range(lstart, lend), "virtcol([v:val, '$'])")) 
    let newlines=map(range(lstart, lend), 'printf("%-'.maxcol.'s", getline(v:val))') 
    call setline(lstart, newlines) 
endfunction 
+0

はあなたにZYXをありがとう!私は毎日勉強していますが、学ぶことはまだまだあります。もう少しあなたのメッセージを勉強します。現時点では、このエラーが発生しました。機能の設定を知らない。 – Reman

+0

@レモン。はい、 'setline'でなければなりません。ファイルから変更を貼り付けるのを忘れました。コードを書いてテストしました。申し訳ありません。 – ZyX

+0

はい、動作します!ちょうど1つのこと:上記の関数で選択した空行も含めて変更する必要があるのは何ですか? – Reman

関連する問題