2

Vim を Emacs のように行をインデントしようとしています (つまり、「タブ文字を挿入する」のではなく、「現在の行を正しいインデントにする」)。Vim は=(または==) を 1 行で使用してこれを行うことができます)。私はimap <Tab> <Esc>==i.vimrc に持っていますが、これによりカーソルが行の最初のスペース以外の文字に移動します。カーソル位置を保持したいので、カーソルを再度調整しなくても、タブを押して入力に戻ることができます。これは可能ですか?

  • 私が今持っているもの(|カーソルを表します):

    function f() {
    doso|mething();
    }
    

    Tab

    function f() {
        |dosomething();
    }
    
  • 私が欲しいもの:

    function f() {
    doso|mething();
    }
    

    Tab

    function f() {
        doso|mething();
    }
    

    また

    function f() {
     |  dosomething();
    }
    

    Tab

    function f() {
       |dosomething();
    }
    
4

3 に答える 3

3

これを行うための「簡単な」方法(つまり、厳密に組み込みの機能を使用する方法)があるとは思いませんが、単純な関数でうまくいきます。あなたの.vimrcファイルで:

function! DoIndent()       
    " Check if we are at the *very* end of the line
    if col(".") == col("$") - 1
        let l:needsAppend = 1
    else
        let l:needsAppend = 0
    endif

    " Move to location where insert mode was last exited
    normal `^

    " Save the distance from the first nonblank column
    let l:colsFromBlank = col(".")
    normal ^
    let l:colsFromBlank = l:colsFromBlank - col(".")

    " If that distance is less than 0 (cursor is left of nonblank col) make it 0
    if l:colsFromBlank < 0                            
        let l:colsFromBlank = 0
    endif

    " Align line
    normal ==

    " Move proper number of times to the right if needed
    if l:colsFromBlank > 0
        execute "normal " . l:colsFromBlank . "l"
    endif

    " Start either insert or line append
    if l:needsAppend == 0
        startinsert
    else
        startinsert!
    endif
endfunction                                   

" Map <Tab> to call this function                                          
inoremap <Tab> <ESC>:call DoIndent()<CR>
于 2013-07-02T21:17:38.667 に答える
0

最後の挿入モードのマークを使用してみてください。次のように、追加コマンドを使用してカーソルを元の場所に戻します。

:imap <Tab> <Esc>==`^a
于 2013-07-02T20:42:04.773 に答える