【问题标题】:(g)Vim -> show 4 spaces, but save 2 spaces (tabs)(g)Vim -> 显示 4 个空格,但节省 2 个空格(制表符)
【发布时间】:2013-01-25 02:21:01
【问题描述】:

是否可以打开缩进 2 个空格的文件,但显示 4 个空格缩进,当我创建 4 个空格时,它会以 2 个空格格式保存?

编辑

事实证明,如果文件混合了制表符、2 个空格和 4 个空格,我还需要能够确保它能够正常工作。

编辑 2

所以,这是我目前的解决方案。我必须重新映射我的(最初映射到:w),以便我可以将光标放回原来的位置(并在我保存时给我一个“历史记录”,直到光标位置。有没有办法这样做不会影响光标位置(也不会将替换添加到历史记录中)?

function! s:ShimSpaces()
    nunmap <C-S>
    nmap <C-S> ms``mt:w<Cr>`t`s
    augroup SeoTabs
        autocmd!
        autocmd BufReadPost,BufWritePost * set tabstop=4
        autocmd BufReadPost,BufWritePost * %substitute/^ \+/&&/e
        autocmd BufReadPost              * %substitute/ \+$//e
        autocmd BufWritePre              * %substitute/^\( \+\)\1/\1/e
        autocmd BufWritePre              * set tabstop=2
        autocmd BufWritePre              * retab
    augroup END
endfunction
command! -n=0 -bar ShimSpaces :call s:ShimSpaces()

【问题讨论】:

  • 我希望这对您来说是一个可能的解决方案。 stackoverflow.com/questions/5217058/…
  • 感谢您的尝试,苏迪普。不完全的。我在想 Ingo 可能在下面有正确的想法。 (只需要尝试一下。)感谢您的回复!

标签: vim spaces


【解决方案1】:

这与here所问的相反。

帮助中有一个关于不同标签宽度的类似用例的示例,请参阅:help retab-example

将其调整为将空间加倍/减半:

:augroup AdaptIndent
    :autocmd!
    :autocmd BufReadPost,BufWritePost  * %substitute/^ \+/&&/e
    :autocmd BufWritePre               * %substitute/^\( \+\)\1/\1/e
:augroup END

使用*,这将影响所有打开的文件。要将其限制为某些文件,请参阅:help autocmd-patterns

编辑:使用:augroup 包装,这可以通过:autocmd! AdaptIndent 再次关闭。这样,您可以轻松地打开/关闭它。为了方便使用,我将它放在一个函数中并定义一个自定义命令来调用它。

【讨论】:

  • 喜欢这个想法。我还没有尝试过,但我会告诉你的。谢谢!
  • 其实 - 一个问题。我将如何做到这一点,以便我可以在会话期间打开或关闭它?
  • 这里还有一个问题:如果我不确定其他从事此工作的人是否混合了制表符、2 个空格和 4 个空格,我该怎么办?
  • 对于所有(当前和未来)文件?!我已经在答案中添加了说明。
  • 你要求空间,你有空间。选项卡使这更复杂,但可以解决。看看:retab
猜你喜欢
  • 1970-01-01
  • 2012-02-25
  • 1970-01-01
  • 1970-01-01
  • 2021-07-01
  • 1970-01-01
  • 2013-02-19
  • 2010-12-13
  • 2010-09-09
相关资源
最近更新 更多