2

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

例子

  • 我现在拥有|的(代表光标):

    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 回答
1

在插入模式下总是有<C-T>and <C-D>(即CtrlTand CtrlD)来动态缩进和缩进。

这些不会改变光标位置——它们是内置功能。

于 2013-07-02T20:45:26.913 回答
0

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

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