如何在Vim中不进入插入模式的情况下在光标所在的位置插入换行符?


88

是否可以在光标未进入插入模式的情况下在Vim中插入换行符?这是一个示例([x]表示光标位于x):

if (some_condition) {[ ]return; }

有时,我可能想输入更多代码。因此,我按i进入插入模式,按Enter插入换行符,然后删除多余的空间。接下来,我将进入普通模式并将光标置于右大括号之前,然后执行相同的操作以使其完全独立。

我已经做了一段时间了,但是肯定有更好的方法吗?


您要插入某些内容而不进入INSERT模式吗?
杰里米·坎特雷尔

26
@ jeremy-cantrell是的,就像“ J”加入下一行并在不进入INSERT模式的情况下插入空格一样!
awendt 2011年

Answers:


107

对于您给出的示例,您可以使用rEnterEnter键替换单个字符(空格)。然后,fspace.前进到下一个空间并重复上一个命令。

根据您的自动缩进设置,以上内容可能会也可能不会正确缩进return语句。如果不是,请改用sEnterTabEsc换行符代替空格,缩进该行,然后退出插入模式。您将不得不用不同的命令替换第二个空格,以便不能使用'。'。在这种情况下。


1
我认为这是最简单的解决方案。谢谢格雷格。
Mark A. Nicolosi

4
“ f [space]”应等效于“ W”(即移至下一个whitepsace)
Nathan Fellman

4
“ W”将一个字符移得太远,它将移至下一个空格之后的下一个字符。
Greg Hewgill 09年

1
如果不想使用进入插入模式,也可以使用>><<帮助缩进s
Conner 2012年

12

以下是创建一个宏的方法,该宏在处于插入模式时每按一次'g'都会在光标处插入换行符:

在vim中,键入:

:map g i[Ctrl+V][Enter][Ctrl+V][Esc][Enter]

哪里:

  • [Ctrl + V]表示按住Ctrl键并按“ v”
  • [Enter]表示按Enter键
  • [Esc]表示按Esc键

在您按下vim窗口的底部之前,您将看到以下内容,直到您按最终的Enter键:

:map g i^M^[

说明:

[Ctrl + V]的意思是“引用以下字符”-允许您在命令中嵌入换行符和转义字符。

因此,您要将'g'键映射到序列:

i [输入] [转义]

这是vim,用于在光标之前插入换行符,然后退出insert模式

调整:

  • 您可以将“ g”替换为尚未链接到您使用的命令的任何字符。
  • 更添加到命令,例如 f}i^M^[O -这将˚F IND的}nsert另一个新行,然后在插入模式和逃生Ø笔的空行,让您输入更多的代码。
  • 您可以将命令添加到.vimrc或.exrc文件中以使其永久。只是从一开始就省略了冒号,因此命令以“ map”开头

请享用!


您回答了该主题中措辞不佳的问题,而不是发帖中的问题。他想知道的是如何轻松摆脱断线但不再起作用的空白。
亚里斯多德·帕加尔兹

谢谢。更新了“调整”部分,以完成作者要求的(我认为)。当我测试它时,vi自动为我删除了多余的空间;如果不使用'x'删除它们。为什么vi命令看起来像调制解调器线路噪音?:-)
亚当·利斯

11

一个简单的映射,可通过按Ctrl + Enter断开光标处的行:

:nmap <c-cr> i<cr><Esc>

本质上会进入“插入”模式,插入换行符并返回到正常模式。

将其放在您的.vimrc文件中,以备将来使用。


5

如果通常将一个行块扩展为三行,请尝试替换。将左括号更改为括号/折线,将右括号更改为折线/括号。

用方括号/ return代替方括号的命令如下所示:

:s/{/{\r/

由于您想经常使用它,因此可以将整个序列映射到未使用的击键,如下所示:

:map <F7> :s/{/{\r/ ^M :s/}/\r}/ ^M

在序列中看到^ M的地方,键入[Ctrl-V],然后按Enter键。

现在,将光标放在采样线上的任意位置,按映射键,然后添加回车符。

检查:help map-which-keys有关选择未使用的按键以进行映射的建议。


BTW:g未映射,因为它用作许多由两次击键组成的vim映射的“名称空间”键(请参阅参考资料:h g)。因此,此映射实际上是不可行的。
Hotschke 2015年

是否有一个好的命令可以报告已g被用作“命名空间”键的命令?
slothbear15年

不是特别。正如我所说的,:help g是查看默认列表g+某些映射的一种方法。z[ ]是其他“命名空间”键,请参见例如:help index。您可以调用:verbose map g以查看以g开头的所有当前定义的映射。有用webresources是viemu.com/vi-vim-cheat-sheet.gifvimcasts.org/blog/2014/02/follow-my-leadervimeo.com/85343734(幻灯片:speakerdeck.com/nelstrom/follow-my -leader
Hotschke

3

假设您可以映射K到其他对象(选择您喜欢的其他键),并且可以将标记'用作临时标记,那么为什么不这样做呢?

:nmap K m'a<CR><Esc>`'

现在,以正常模式在要换行的字符上按K后,将拆分该行并将光标保留在原处。


1

如果在autoindent启用(或任何其他缩进辅助功能)的同时将行换成两行,Vim会自动杀死光标右边的任何空格。

如果你不希望使用任何这些设置,使用s,而不是i为了小号ubstitute为空白的新文本,而不是仅仅插入。(如果有多个空格,请将光标放在最左侧,然后cw改用。)


1

基本上,当您分割一行时,您只想插入回车符,或者如果您在空格中,则用回车符替换。好吧,为什么要选择一个或另一个呢?这是我对K的映射:

"Have K split lines the way J joins lines
nnoremap <expr>K getline('.')[col('.')-1]==' ' ? "r<CR>" : "i<CR><Esc>"

我使用三元运算符将这两个动作压缩为一个键映射。分解它,<expr>意味着键映射的输出可以动态变化,在这种情况下,取决于条件getline('.')[col('.')-1]==' ',这是询问vim光标下的字符是否为空格的漫长方式。最后,熟悉的三元运算符? :要么用换行符(r<CR>)替换空格,要么插入新的(i<CR><Esc>

现在,您已经有了一个可爱的姐妹键映射到J命令。


这很漂亮。我不确定我是否曾经有意使用过K,但这可能使其值得在其他地方摆脱或重新映射。
dragon788 '16

0

在您的vimrc中设置此键映射

:map <C-m> i<CR><Esc>h

如果要在vim中使用它,请按Ctrl + m。


0

恕我直言,内置映射gs不是有用的映射(使vim进入睡眠状态),可以使用它进行拆分:

nmap gs i<CR><ESC>


0

实际上,您需要以下组合操作:

  1. 按下v进入可视模式
  2. 选择要拆分的行
  3. :进入命令模式
  4. s/\s/\r/g
  5. 完成了

0

如果您有输入:

aaa bbb ccc ddd

并想输出

aaa
bbb
ccc
ddd

您可以使用以下命令

f r<ENTER>;.;.

0

我发现这是我所期望的相反行为的最忠实的实现 J

nnoremap S i<cr><esc>^mwgk:silent! s/\v +$//<cr>:noh<cr>`w

它在光标处进行了简单化的新行,如果存在任何空白,则照顾前一行中的任何尾随空格,然后将光标返回到正确的位置。

i <cr> <esc> -这是建议的最常见的解决方案之一,它不会删除光标下的非空格字符,但也会留下尾随空格

^mw -转到新行的开头并在下面创建标记 w

gk -上一行

:silent! s/\v +$//<cr> -正则表达式替换行尾的任何空格

:noh<cr> -清除所有突出显示正则表达式可能已打开的搜索

`w -归还商标 w

本质上结合了两者的r<esc><cr>i<cr><esc>

注意:我有S一个可能会覆盖一个有用键的约束,但这是它的同义词cc,由于我不像拆分时那样频繁使用它,因此可以覆盖它。



-1

此映射将破坏您拥有的任何单行功能。只需将光标放在行上,然后在正常模式下按“ g”即可:

:map g ^f{malr<CR>`a%hr<CR>`a

这假定您在打开括号后有一个空格,在关闭括号前有一个空格。看看是否适合您。

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.