为什么vim几乎每个命令都使用寄存器?

时间:2016-12-12 21:43:24

标签: vim macvim

我喜欢组成具有语义含义的命令的简单性。例如,cib读起来就像句子change in brackets - 很精彩。

但为什么vim需要将旧内容复制到剪贴板中?在那个命令中我没有提出我想要复制它并且问题更加深入。

dw diw等都会复制到我的剪贴板/注册表中。为什么?这似乎放弃了这些命令的语义价值,我认为这是意外行为。

我使用这些命令是错误的,还是有某种方法可以完全禁用此功能?目前我做了一些像这样的重映射:

nnoremap dd "_dd

nnoremap cc "_cc

但我不想为非显式复制的每一种可能组合做到这一点。

2 个答案:

答案 0 :(得分:6)

默认情况下,您正在谈论的大多数命令都使用未命名的寄存器Died on test #1 at Module.callback (http://localhost:4200/assets/tests.js:250:19) at Module.exports (http://localhost:4200/assets/vendor.js:131:32) at requireModule (http://localhost:4200/assets/vendor.js:30:18) at TestLoader.require (http://localhost:4200/assets/test-support.js:7104:7) at TestLoader.loadModules (http://localhost:4200/assets/test-support.js:7096:14) at Function.TestLoader.load (http://localhost:4200/assets/test-support.js:7126:22) at http://localhost:4200/assets/test-support.js:7009:18: Cannot instantiate a component without a renderer. Please ensure that you are creating <(subclass of Ember.Component):ember210> with a proper container/registry.@ 9 ms Source: Error: Cannot instantiate a component without a renderer. Please ensure that you are creating <(subclass of Ember.Component):ember210> with a proper container/registry. at Class.init (http://localhost:4200/assets/vendor.js:51954:15) at Class.superWrapper [as init] (http://localhost:4200/assets/vendor.js:50175:22) at Class.init (http://localhost:4200/assets/vendor.js:50443:19) at Class.superWrapper (http://localhost:4200/assets/vendor.js:50175:22) at Class.init (http://localhost:4200/assets/vendor.js:50493:19) at Class.superWrapper (http://localhost:4200/assets/vendor.js:50175:22) at Class.exports.default._emberMetal.Mixin.create._Mixin$create.init (http://localhost:4200/assets/vendor.js:51000:17) at Class.superWrapper (http://localhost:4200/assets/vendor.js:50175:22) at Class.init (http://localhost:4200/assets/vendor.js:17472:19) at Class.superWrapper [as init] (http://localhost:4200/assets/vendor.js:50175:22) 。听起来你正在处理剪贴板被覆盖所有这些事情,这可能是将clipboard设置为"unnamed的症状。

要返回标准版,如果unnamed_plus的输出是这两个选项之一,则可以执行set clipboard=

set clipboard?

答案 1 :(得分:1)

我会提出不同意见,并建议您可能非惯用地使用Vim。这绝不是出乎意料的行为。您是否正在使用cib作为粘贴准备,以便cib将其搞砸?请改为vibp

  

dw diw等都会复制到我的剪贴板/注册表中。为什么?这似乎放弃了这些命令的语义价值,我认为这是意外行为。

d然后p是剪切和粘贴(即移动文本)的正常Vim习语。这是我每天都要做的一项操作,每天多次,如果d没有猛拉,那真的很烦人。您似乎认为d在其他文本编辑器上等同于Del;它相当于ctrl-x(切割)。要取消此操作,您可以按照说明"_d进行操作;我发现我几乎不需要它。

作为一个高级示例,c和可视模式p的默认语义使得交换两个对象变得微不足道;例如:

  

我喝了所有的食物,吃了他们所有的威士忌。

转到“喝酒”,diw(删除单词然后猛拉它),转到“ate”,viwp(选择一个单词并粘贴到其上,然后放弃以前的内容),{ {1}}返回“喝”的地方和ctrl-o(在光标前粘贴):

  

我吃了所有的食物,喝了他们所有的威士忌。

(我还有一个插件,它将“函数参数”定义为文本对象,所以如果我混淆或重构参数顺序,我在编码中使用相同的习惯用法。)

我唯一想要更常防止的是在视觉模式下粘贴(因此我可以多次粘贴相同的内容);为此,我使用

P

(来自here)。这仅在可视模式下重新映射xnoremap <expr> P '"_d"'.v:register.'P' (否则在可视模式下与P相同)。视觉模式之外的pp都没有,所以这不是问题。