如何在Vim中插入光标而不进入插入模式的换行符?

时间:2008-10-26 02:09:45

标签: vim performance text-editor

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

if (some_condition) {[ ]return; }

偶尔,我可能想要输入更多代码。所以我按 i 进入插入模式,按 Enter 插入换行符,然后删除多余的空格。接下来,我将进入正常模式并将光标定位在右大括号之前,然后执行相同的操作以将其放在自己的行上。

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

15 个答案:

答案 0 :(得分:94)

对于您给出的示例,您可以使用 r Enter 将Enter替换为单个字符(空格)。然后, f space 继续前进到下一个空格并重复上一个命令。

根据您的自动注册设置,上述内容可能会或可能不会正确缩进返回语句。如果没有,那么使用 s 输入 Tab Esc 代替用换行符替换空格,缩进行,并退出插入模式。您必须使用其他命令替换第二个空格,以便不能使用“。”在这种情况下。

答案 1 :(得分:11)

如果在插入模式下时按“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 [Enter] [Escape]

这是在光标前插入换行符,然后退出插入模式的vim。

<强>调整菜谱方案:

  • 您可以将'g'替换为尚未链接到您使用的命令的任何字符。
  • 在命令中添加更多内容,例如 f}i^M^[O - 这将 f 指示} i < / strong>插入另一个换行符,然后从插入模式中退出, O 写一个空行,以便输入更多代码。
  • 您可以将命令添加到.vimrc或.exrc文件中以使其永久化。只需从头开始省略冒号,因此命令以“map”
  • 开头

享受!

答案 2 :(得分:10)

一个简单的映射,按Ctrl + Enter键打破光标处的行:

  

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

基本上进入'插入'模式,插入换行符并返回正常模式。

将它放在.vimrc文件中以备将来使用。

答案 3 :(得分:4)

如果您通常将一个行块扩展为三行,请尝试替换。将开口支架更换为支架/返回,将关闭支架更换为返回/支架。

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

:s/{/{\r/

由于您经常要使用此功能,您可以将完整序列映射到未使用的按键,如下所示:

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

如果您在序列中看到 ^ M ,请输入 [Ctrl-V] ,然后按输入

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

检查:help map-which-keys以获取有关选择要映射的未使用击键的建议。

答案 4 :(得分:2)

假设您可以将<suite name="Suite" parallel="tests" preserve-order="true"> 映射到其他内容(选择您喜欢的其他键),并使用标记K作为临时标记,为什么不这样做呢?< / p>

'

现在在正常模式下按K,然后在你想要换行的字符上将分割线并将光标留在原位。

答案 5 :(得分:1)

如果在启用autoindent(或任何其他缩进辅助)的情况下断开一行,Vim将自动终止光标右侧的任何空格。

如果您不想使用其中任何设置,请使用s代替i,以便 s 为空白添加新文本而不是仅插入。 (如果有多个空格,请将光标放在最左边,然后使用cw。)

答案 6 :(得分:0)

在vimrc中设置此键映射

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

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

答案 7 :(得分:0)

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

nmap gs i<CR><ESC>

答案 8 :(得分:0)

Vrapper中,您可以使用gql,它将分割一行而不进入插入模式,但可能无法始终保持缩进。

答案 9 :(得分:0)

基本上,当你拆分一条线时,你要么只想插入一个回车,要么就是你在一个空间的情况下,用一个回车来替换它。那么,为什么选择其中一个呢?这是我对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命令。

答案 10 :(得分:0)

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

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

答案 11 :(得分:0)

如果你有输入:

aaa bbb ccc ddd

并想输出

aaa
bbb
ccc
ddd

您可以使用命令

f r<ENTER>;.;.

答案 12 :(得分:0)

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

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

它会在光标处进行简单的换行,如果存在的话会照顾到前一行的任何尾随空白,然后将光标返回到正确的位置。

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

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

gk -上一行

:无声! s / \ v + $ // -正则表达式替换行末的任何空白

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

`w -返回w

下的标记

本质上结合了 r i < cr>

注意:我将此绑定到 S ,这可能会覆盖一个有用的密钥,但是它是 cc 的同义词,因为我使用它的频率不高进行拆分,可以覆盖它。

答案 13 :(得分:0)

o ESC命令将为您完成。

答案 14 :(得分:-1)

此映射将分解您拥有的任何单行函数。只需将光标放在线上并在正常模式下点击“g”:

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

这假设您在左大括号后面有一个空格,在结束大括号前有一个空格。看看它是否适合你。