如何在Vim中按Esc键后保留缩进

u91tlkcl  于 2022-11-11  发布在  其他
关注(0)|答案(7)|浏览(160)

我有set autoindent
我转到一行,按下A和<CR>,这会让我转到下一行并插入缩进。但是,如果我按Esc,光标会跳到该行的开头,缩进消失。
我得四处走动,按下制表符才能再次到达正确的地方。
我知道那帮人说:

If you do not type anything on the new line except <BS> or CTRL-D and then type
<Esc>, CTRL-O or <CR>, the indent is deleted again.

有没有办法禁用它,或者至少有一个变通办法?

wvyml7n5

wvyml7n51#

两天前我也遇到了同样的问题。

没有方法可以禁用此功能,但幸运的是,您不需要这样做,因为相反:
**使用Scc**进入插入模式。使用S再次进入插入模式将进入具有适当缩进级别的插入模式,使得Vim删除缩进的事实变得不重要。
**注:**我发现这个技巧在大多数地方都有效。但由于某种原因,它 * 不 * 适用于Python文件。我猜这与Python文件类型干扰了它自己的缩进函数有关,或者沿着的东西。

编辑:
另一个技巧是,你可以定义一种方式,如果你在一个有缩进的行上移动光标,它会保持缩进。这不会解决你马上点击Esc的问题,但这是一个相关的问题,可能也会困扰你。

vaj7vani

vaj7vani2#

一个简单的方法是按'.'(或任何字符),退出,然后按x删除字符。缩进应该保留。

2skhul33

2skhul333#

Alright, I figured this out.
Based on Edan Maor's answer, S or cc should enter insert mode with the proper level of indentation.
...except when it doesn't :)
This works under two circumstances.

  • when cindent is set, it will insert indent based on C formatting rules

This may prove annoying when editing non C-like files.

  • when indentexpr is set.

I found that the best solution is to have this is my .vimrc

set autoindent
set indentexpr=GetIndent()

function GetIndent()
   let lnum = prevnonblank(v:lnum - 1)
   let ind = indent(lnum)
   return ind
endfunction

Now when I press S or cc, it will insert the same indent as on the previous non-blank line.

ql3eal8s

ql3eal8s4#

假设我使用'o'来开始一个新行。我在_vimrc中添加了下面的config(注意我有':set autoindent')

" ugly hack to start newline and keep indent
nnoremap o ox<BS>
nnoremap O Ox<BS>
ee7vknir

ee7vknir5#

键入您文本,然后在正常模式下在该行中按==

xzabzqsa

xzabzqsa6#

值得注意的是,使用正确的插件Scc似乎可以再次正常工作。很可能是python模式修复了这个问题。
https://github.com/klen/python-mode

pu3pd22g

pu3pd22g7#

我本来想达到同样的效果,但因为我想让the plugin showing indent正常工作。这是我的解决方法:我发现<enter>在普通模式下几乎没用,它只会把光标向下移动一行,这可以用j来实现。
所以我在我的.vimrc中添加了这个:

nmap <cr> o.<c-h><esc>

每当我需要一个空行作为缩进时,我就会使用<enter>

相关问题