在传统的文本编辑器中,每当我需要打开字符串或括号并在它之间键入内容时,我曾经这样做:
()
或""
但是在vim中(即如果我跟着vim way),这个过程变得相当繁琐,因为我必须进入正常模式才能移动很多次:
()
或""
<ESC>
i
<ESC>
l
a
如果在任何时候使用箭头键都不是一个好习惯,在vim中有更有效的方法来执行此类任务吗?
答案 0 :(得分:2)
没有。在Vim中完成它与在“传统”编辑器中完全相同:
()
或""
left
right
但是......你为什么不输入开场角色,你想要在对内,然后是结束角色?
(
或"
)
或"
太简单了?
答案 1 :(得分:2)
实际上很容易在映射中自动附加那些结束字符,并将光标放在您想要的位置。诀窍是做到这一点,而不是搞乱撤消/重做/重复动作。问题是插入模式下的光标移动命令会破坏&#34;撤消序列&#34;这样,移动光标后所做的任何更改都会与移动光标前所做的更改分开撤消。
警告:以下信息可能会过时
有很多插件可以自动附加这些字符(参见Vim wiki page for appending closing characters的部分列表),而在Vim 7.4之前,其中一些插件甚至还有复杂的解决方法来保持撤销序列的完整性。不幸的是,他们都依赖于Vim中的一个错误,该错误已在7.4版本中得到修复。
add a cursor movement that does not break undo有一个补丁,所以如果你想要compile Vim yourself,你可以抓住那个补丁并使用如下所示的映射(不需要插件!)来做你想做的事:
inoremap ( ()<C-G>U<Left>
inoremap <expr> ) strpart(getline('.'), col('.')-1, 1) == ")" ? "\<C-G>U\<Right>" : ")"
这些映射将插入&#34;()&#34;当你键入一个开口(将光标放在括号之间。当你输入&#39;)时,#39;已经关闭&#39;)&#39;在光标之后,Vim将跳过括号而不是插入新的括号。光标移动前面是<C-G>U
,这是上述补丁添加的功能,允许后续光标移动不会中断撤消序列(只要移动全部在一行中)。
自Vim 7.4.663起,该补丁尚未正式纳入。
答案 2 :(得分:0)
我认为在正常模式下使用箭头键移动是不好的做法,但在你的情况下;在插入模式下移动一个空格,我可能会说使用箭头键可能是最好的做法。
如果你已经死定了,那么你可以使用<i_ctrl-o>
。
:help i_ctrl_o
CTRL-O execute one command, return to Insert mode *i_CTRL-O*
因此,在插入模式下,您可以键入:()<ctrl-o>h<xxx><ctrl-o>l
,其中<xxx>
是括号中的任何内容。
不幸的是,如果光标位于该行的最后一个字符上,那么它不起作用,如果你输入的话很可能就是这样。
要解决该问题,请执行:set virtualedit+=onemore
或将其添加到~/.vimrc
文件中。
请注意,此解决方案比使用箭头键更容易击键,但您不需要将手移离主行,因此无论如何它都可能更快。