使用==时保留光标位置

时间:2013-07-02 20:35:30

标签: vim indentation auto-indent

我正在尝试使用像Emacs这样的Vim缩进行(即“使当前行成为正确的缩进”而不是“插入制表符”)。 Vim可以使用 = (或 == )执行此操作。我的.vimrc中有imap <Tab> <Esc>==i但这会使光标移动到该行的第一个非空格字符。我希望保留光标位置,这样我就可以点击标签返回打字而不必再次调整光标。这可能吗?

实施例

  • 我现在拥有的内容(|表示光标):

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

    标签

    function f() {
        |dosomething();
    }
    
  • 我想要的是什么:

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

    标签

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

    另外

    function f() {
     |  dosomething();
    }
    

    标签

    function f() {
       |dosomething();
    }
    

3 个答案:

答案 0 :(得分: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>

答案 1 :(得分:1)

始终有<C-T><C-D>(即 Ctrl T Ctrl D )在插入模式下即可缩进和缩进。

这些不会改变光标位置 - 它们是内置功能。<​​/ p>

答案 2 :(得分:0)

尝试使用上次插入模式的标记,并使用append命令将光标设置回原来的位置,例如:

:imap <Tab> <Esc>==`^a