在插入模式下撤消<CR>


21

有时在插入模式下,我会<CR>误击,并且必须多次击退空格(取决于缩进)才能返回原位。

例如

<div>
  <p> This is some text []</p>
</div>

光标是[],我点击<CR>

<div>
  <p> This is some text 
  []</p>
</div>

现在,我必须按两次退格键才能返回上一行(这种情况还不错,但缩进量不大)。

您知道更好的方法吗?


1
ctrl+w两次似乎都有效并且很容易
reergymerej 2016年

Answers:


10

怎么样:

inoremap <C-\> <C-o>:left 0<Cr><BS>

<C-o>将执行普通模式命令(:left 0),该命令将删除所有缩进,这还将把光标置于行首。<BS>将带您回到最后一行。

这有点像“向后J”。

不幸的是,似乎无法映射Shift + Enter或Ctrl + Enter,因此我选择了<C-\>“作为Enter附近”。


“输入附近”取决于您的键盘:英国的键盘在左移旁边有``:-)
TripeHound 2015年

2
为什么不使用<C-u>代替<C-o>:left 0<CR>
jamessan

@jamessan这是一个“后退J”功能:因此foo<CR>bar<C-\>请留给您foobar。恕我直言,它更有用,但YMMV。
马丁·图尔诺伊

是的,但我要说的是<C-u>(即i_CTRL-U)应该与相同<C-o>:left 0<CR>
jamessan

1
@jamessan好吧,这取决于光标的位置。键入foo<CR>bar<C-u>会留下foo<CR>(+ Vim可能添加的任何自动缩进)。<C-o>:left 0<CR>无论光标处于什么位置,都将始终表现相同。
马丁·图尔诺伊

21

我有这个vimrc,第二部分是相关的:

inoremap <expr> <silent> <cr> pumvisible() ? "<c-y>" : "<c-g>u<cr>"

它的作用:每次Enter在插入模式下命中,它也会“破坏撤消序列,开始新的更改”(请参阅​​参考资料h: i_CTRL-G_u)。这意味着,如果你打Enter误,您可以现在撤消更改而不删除以前插入的行,无论是与ESC u a,或Ctrl-o u,作为Statox建议。基本上,每行可以分别撤消。

资源

编辑/更新:如果您碰巧在Emacs(又名邪恶模式)中使用Vim仿真,则可以使用此软件包获得类似的效果。


现在,我对第一部分以及<c-y>与弹出菜单的关系感到好奇。
8bittree

2
请参阅以下答案:vi.stackexchange.com/a/3844/1800Ctrl-y在插入模式下将完成当前的弹出选择,并且上面的映射也将允许Enter完成。
VanLaser 2015年

好招 不过,我可能会取代最后一部分"<c-g>u<cr>"通过&paste ? "<cr>" : "<c-g>u<cr>",否则下次你错误地粘贴时200线HTML,你将有很多的乐趣解开它。:)
lcd047

2
...和解释:paste启用后,插入模式映射被禁用(根据Vim的帮助)
VanLaser

1
我更喜欢此解决方案,因为其他依赖于Backspace,Ctrl-W和Ctrl-U的解决方案可能无法工作,具体取决于backspace设置选项的方式。
doubleDown

4

我的方法是Ctrl-wBackspace

Ctrl-w删除最后一个单词(我是否忘记了这是否是标准的vim),由于它只是空格,它将带我回到行首。然后Backspace将带我回到我所在的上一行。


亲爱的,我不知道Ctrl-w在插入模式下的用法。但是,“地毯吸烟者”♦仍然更快。因此,默认绑定Ctrl- \似乎没什么用。
nobe4

1
Ctrl + w是“标准Vim” ;-)参见::help i_CTRL-W。而且按两次似乎也可以解决问题?
马丁·图尔诺伊

1
我只是在帮助页面上看到了<C-u>一些有用的信息,因为它删除了新行中的所有字符
nobe4 2015年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.