2

我使用以下代码cc在该行不为空时保留现有缩进,并在该行为空时使用计算的缩进(使用indentexpr)。

function SmartCC()
  if getline('.') !~# '\S'
    return 'cc'
  else
    let spaces = repeat(' ', indent('.'))
    return '0d$i' . spaces
  endif
endfunction
nnoremap <expr> cc SmartCC()

我唯一遇到的问题是,与内置 不同的是,它会cc插入“真实”空格而不是“暂定”空格,如果在该行上没有键入任何内容,则会自动删除这些空格。

有没有办法插入这样的暂定空格?

或者也许我想要实现的目标已经可以通过设置一些秘密选项来实现?

为了清楚起见,删除所有尾随空格的插件不是解决方案。

4

3 回答 3

1

尝试以下技巧:

function SmartCC_IndentExpr(indent, savedindentexpr)
    let &l:indentexpr=a:savedindentexpr
    return a:indent
endfunction
function SmartCC()
    if getline('.')=~#'\S'
        let &l:indentexpr='SmartCC_IndentExpr('.indent('.').', '.string(&l:indentexpr).')'
    endif
    return 'cc'
endfunction
nnoremap <expr> cc SmartCC()

. 这个想法是&l:indentexpr只为评估期设置cc。众所周知,在这种情况下只检查一次缩进,并且在这种情况下cc之前没有任何东西触发检查,那么在第二次检查缩进之前,它本身可以用于恢复,因为另一个原因。cc&l:indentexpr&l:indentexpr

于 2012-11-07T17:45:49.490 回答
0

cc已经足够聪明,可以保留当前行的缩进。你有autoindent吗?

于 2012-11-07T10:21:23.050 回答
0

我不能说按需空间剥离,但我有这个可以在保存时删除尾随空格,也许这对你来说就足够了吗?

autocmd BufWritePre *.{c,cpp,h}  %s/\s\+$//e
于 2012-11-08T00:17:54.053 回答