是否可以在光标位于 Vim 的位置插入换行符而不进入插入模式?这是一个示例([x]
表示光标处于打开状态x
):
if (some_condition) {[ ]return; }
有时,我可能想输入更多代码。所以我会按i进入插入模式,按Enter插入换行符,然后删除多余的空间。接下来,我将进入正常模式并将光标定位在右大括号之前,然后执行相同的操作以使其在自己的行上。
我已经这样做了一段时间,但肯定有更好的方法吗?
是否可以在光标位于 Vim 的位置插入换行符而不进入插入模式?这是一个示例([x]
表示光标处于打开状态x
):
if (some_condition) {[ ]return; }
有时,我可能想输入更多代码。所以我会按i进入插入模式,按Enter插入换行符,然后删除多余的空间。接下来,我将进入正常模式并将光标定位在右大括号之前,然后执行相同的操作以使其在自己的行上。
我已经这样做了一段时间,但肯定有更好的方法吗?
对于您给出的示例,您可以使用rEnterEnter 替换单个字符(空格)。然后,fspace.向前移动到下一个空格并重复上一个命令。
根据您的自动缩进设置,上述可能会或可能不会正确缩进 return 语句。如果不是,则使用sEnterTabEsc换行符替换空格,缩进该行并退出插入模式。您必须用不同的命令替换第二个空格,这样您就不能使用“。” 在这种情况下。
以下是如何创建一个宏,当您在非插入模式下按“g”时在光标处插入换行符:
在 vim 中,输入:
:map g i[Ctrl+V][Enter][Ctrl+V][Esc][Enter]
在哪里:
在您按下最后的 Enter 之前,您将在 vim 窗口的底部看到以下内容:
:map g i^M^[
解释:
[Ctrl+V] 表示“引用以下字符”——它允许您在命令中嵌入换行符和转义符。
因此,您将“g”键映射到序列:
i [进入] [退出]
这是 vim在光标前插入换行符,然后退出插入模式。
调整:
f}i^M^[O
-- 这将找到 }并插入另一个换行符,然后退出插入模式并打开一个空行供您输入更多代码。享受!
通过按 Ctrl+Enter 在光标处换行的简单映射:
:nmap <c-cr> i<cr><Esc>
基本上进入“插入”模式,插入换行符并返回正常模式。
把它放在你的 .vimrc 文件中以备将来使用。
如果您通常将单行块扩展为三行,请尝试替换。将左括号更改为括号/返回,将右括号更改为返回/括号。
用括号/返回替换括号的命令如下所示:
:s/{/{\r/
由于您想经常使用它,您可以将完整序列映射到未使用的击键,如下所示:
:map <F7> :s/{/{\r/ ^M :s/}/\r}/ ^M
在序列中看到^M的地方,键入[Ctrl-V],然后按enter。
现在,将光标放在采样行的任意位置,按映射键,然后添加回车。
查看:help map-which-keys
有关选择未使用的按键进行映射的建议。
假设您可以映射K
到其他东西(选择您喜欢的其他键),并且使用标记'
作为临时标记可以,为什么不这样做呢?
:nmap K m'a<CR><Esc>`'
现在在正常模式下按 K 在您希望发生换行符的字符上将分割该行并将光标留在原处。
autoindent
如果在启用(或任何其他缩进辅助)时将一行分成两部分,Vim 将自动删除光标右侧的任何空格。
如果您不想使用这些设置中的任何一个,请使用而s
不是i
为了用新文本替换空白而不是插入。(如果有多个空格,请将光标放在最左边并使用。)cw
基本上,当您拆分一行时,您要么只想插入回车,要么如果您在空格上,请将其替换为回车。那么,为什么要满足于其中一个呢?这是我对 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
命令。
o
ESC
命令会为你做这件事。
在你的 vimrc 中设置这个键映射
:map <C-m> i<CR><Esc>h
如果要在 vim 中使用它,请按 Ctrl+m。
恕我直言,内置映射gs
不是有用的映射(让 vim 进入睡眠状态),可以使用它进行拆分:
nmap gs i<CR><ESC>
在Vrapper 中,您可以使用 gql 来拆分行而不进入插入模式,但可能并不总是保持缩进。
实际上,您需要以下组合操作:
:
进入命令模式s/\s/\r/g
如果您有输入:
aaa bbb ccc ddd
并想输出
aaa
bbb
ccc
ddd
你可以使用命令
f r<ENTER>;.;.
我发现这是我期望的相反行为的最忠实的实现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因为我不像拆分那样经常使用它,所以我可以覆盖它。
此映射将分解您拥有的任何单行函数。只需将光标放在行上并在正常模式下按“g”:
:map g ^f{malr<CR>`a%hr<CR>`a
这假设您在左大括号之后有一个空格,在右大括号之前有一个空格。看看这是否适合你。