可以在不进入插入模式的情况下在光标位于Vim的位置插入换行符吗?以下是一个示例([x]
表示游标位于x
):
if (some_condition) {[ ]return; }
偶尔,我可能想要输入更多代码。所以我按 i 进入插入模式,按 Enter 插入换行符,然后删除多余的空格。接下来,我将进入正常模式并将光标定位在右大括号之前,然后执行相同的操作以将其放在自己的行上。
我已经做了一段时间,但肯定有更好的方法吗?
答案 0 :(得分:94)
对于您给出的示例,您可以使用 r Enter 将Enter替换为单个字符(空格)。然后, f space 。继续前进到下一个空格并重复上一个命令。
根据您的自动注册设置,上述内容可能会或可能不会正确缩进返回语句。如果没有,那么使用 s 输入 Tab Esc 代替用换行符替换空格,缩进行,并退出插入模式。您必须使用其他命令替换第二个空格,以便不能使用“。”在这种情况下。
答案 1 :(得分:11)
如果在插入模式下不时按“g”,则创建一个在光标处插入换行符的宏:
从vim中输入:
:map g i[Ctrl+V][Enter][Ctrl+V][Esc][Enter]
其中:
您将在vim窗口底部看到以下内容,直到您按下最后一个Enter:
:map g i^M^[
<强>解释强>
[Ctrl + V]表示“引用以下字符” - 它允许您在命令中嵌入换行符和转义字符。
所以你要将'g'键映射到序列:
i [Enter] [Escape]
这是在光标前插入换行符,然后退出插入模式的vim。
<强>调整菜谱方案:强>
f}i^M^[O
- 这将 f 指示} 和 i < / strong>插入另一个换行符,然后从插入模式中退出, O 写一个空行,以便输入更多代码。享受!
答案 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)
实际上,您需要以下组合操作:
:
进入命令模式s/\s/\r/g
答案 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
注意:我将此绑定到 S ,这可能会覆盖一个有用的密钥,但是它是 cc 的同义词,因为我使用它的频率不高进行拆分,可以覆盖它。
答案 13 :(得分:0)
o
ESC
命令将为您完成。
答案 14 :(得分:-1)
此映射将分解您拥有的任何单行函数。只需将光标放在线上并在正常模式下点击“g”:
:map g ^f{malr<CR>`a%hr<CR>`a
这假设您在左大括号后面有一个空格,在结束大括号前有一个空格。看看它是否适合你。