Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
p在Vi/Vim中的非直观行为_Vim_Vi - Fatal编程技术网

p在Vi/Vim中的非直观行为

p在Vi/Vim中的非直观行为,vim,vi,Vim,Vi,在Vim中,当我们尝试粘贴最后一个yank时,我们按p。此时,我希望寄存器粘贴到光标所在的位置,而不是光标之后 lore[m] ipsum i lore|m ipsum <-- before the cursor lore[m] ipsum a lorem| ipsum <-- after the cursor 更准确地说,它的行为类似于“a”,是“i”的一个特殊版本。但是'p'是一个如此原始的命令,我希望它的行为像'I'而不是'a' At the cursor - After

在Vim中,当我们尝试粘贴最后一个yank时,我们按p。此时,我希望寄存器粘贴到光标所在的位置,而不是光标之后

lore[m] ipsum
i
lore|m ipsum <-- before the cursor
lore[m] ipsum
a
lorem| ipsum <-- after the cursor
更准确地说,它的行为类似于“a”,是“i”的一个特殊版本。但是'p'是一个如此原始的命令,我希望它的行为像'I'而不是'a'

At the cursor - After the cursor
i - a
P - p
附加问题:为什么i+=h?

很难与直觉抗辩-每个人都有自己的:-

p行为的原因与a相同:您需要一种在文本后粘贴的方法。否则,在行尾忽略较新的Vim设置(如“virtualedit”)就不可能做到这一点,这在旧vi中不存在,在其他地方,您必须移动光标,这很麻烦!在粘贴之前

左移
同样,光标在Esc之后向左移动,以便始终定位在有效字符上。有关更多详细信息和补救措施,请参阅。

您感到困惑:这些命令都不适用于光标,因为在正常模式下,光标始终位于字符上。在光标处粘贴或在光标处进入插入模式意味着应该删除光标下的字符,这很少是我们想要的,iapP的行为与此一致

我不在游标处启动insert模式,而是在游标之前,p遵循相同的逻辑:未命名寄存器的内容在游标之前插入

lore[m] ipsum
i
lore|m ipsum <-- before the cursor
lore[m] ipsum
a
lorem| ipsum <-- after the cursor
然而,如果无法在现有文本v{motion}p上粘贴,或者在删除光标下的字符或各种疯狂的文本操作技巧时启动插入模式,那么Vim将非常糟糕

为了充分利用Vim,您必须接受模态,更具体地说,必须习惯于正常模式下光标的行为


额外回答:退出插入模式时,正常模式光标位置始终位于插入模式光标左侧的字符上。这是一个半任意的选择,这种选择是有意义的,相反的行为将光标放在右边,在我看来没有多大意义。

Vim绝对不是关于直觉的。