95

是否可以在光标位于 Vim 的位置插入换行符而不进入插入模式?这是一个示例([x]表示光标处于打开状态x):

if (some_condition) {[ ]return; }

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

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

4

15 回答 15

114

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

根据您的自动缩进设置,上述可能会或可能不会正确缩进 return 语句。如果不是,则使用sEnterTabEsc换行符替换空格,缩进该行并退出插入模式。您必须用不同的命令替换第二个空格,这样您就不能使用“。” 在这种情况下。

于 2008-10-26T02:11:57.330 回答
12

以下是如何创建一个宏,当您在插入模式下按“g”时在光标处插入换行符:

在 vim 中,输入:

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

在哪里:

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

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

:map g i^M^[

解释:

[Ctrl+V] 表示“引用以下字符”——它允许您在命令中嵌入换行符和转义符。

因此,您将“g”键映射到序列:

i [进入] [退出]

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

调整:

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

享受!

于 2008-10-26T02:53:16.683 回答
12

通过按 Ctrl+Enter 在光标处换行的简单映射:

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

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

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

于 2009-06-02T21:24:30.040 回答
5

如果您通常将单行块扩展为三行,请尝试替换。将左括号更改为括号/返回,将右括号更改为返回/括号。

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

:s/{/{\r/

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

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

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

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

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

于 2008-10-26T04:00:14.130 回答
3

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

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

现在在正常模式下按 K 在您希望发生换行符的字符上将分割该行并将光标留在原处。

于 2016-11-14T21:28:15.930 回答
1

autoindent如果在启用(或任何其他缩进辅助)时将一行分成两部分,Vim 将自动删除光标右侧的任何空格。

如果您不想使用这些设置中的任何一个,请使用s不是i为了用新文本替换空白而不是插入。(如果有多个空格,请将光标放在最左边并使用。)cw

于 2008-10-26T03:23:25.640 回答
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命令。

于 2016-03-03T22:51:47.657 回答
1

o ESC命令会为你做这件事。

于 2020-06-02T04:22:51.173 回答
0

在你的 vimrc 中设置这个键映射

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

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

于 2011-07-30T04:53:54.797 回答
0

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

nmap gs i<CR><ESC>
于 2015-04-23T10:13:07.880 回答
0

Vrapper 中,您可以使用 gql 来拆分行而不进入插入模式,但可能并不总是保持缩进。

于 2015-08-20T19:54:30.100 回答
0

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

  1. 按下v进入可视模式
  2. 选择要拆分的行
  3. 按下:进入命令模式
  4. s/\s/\r/g
  5. 完毕
于 2017-03-25T00:51:57.713 回答
0

如果您有输入:

aaa bbb ccc ddd

并想输出

aaa
bbb
ccc
ddd

你可以使用命令

f r<ENTER>;.;.
于 2017-05-01T00:57:13.853 回答
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因为我不像拆分那样经常使用它,所以我可以覆盖它。

于 2018-12-14T15:26:51.023 回答
-1

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

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

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

于 2008-10-26T03:54:07.310 回答