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

为什么vim几乎对每个命令都使用寄存器?,vim,macvim,Vim,Macvim,我喜欢编写具有语义含义的命令的简单性。比如说,cib读起来就像一个句子change在括号中-太棒了 但是为什么vim需要将旧内容复制到我的剪贴板中?在该命令中,我没有建议要复制它,而且问题更为严重 dwdiw等也都复制到我的剪贴板/注册表。为什么?这似乎放弃了这些命令的语义价值,我认为这是一种意想不到的行为 我使用这些命令是错误的,还是有办法完全禁用此功能?目前我已经做了一些类似这样的重拍: nnoremap dd”\u dd nnoremap cc”\u cc 但我不希望对每一种可能的非显式复

我喜欢编写具有语义含义的命令的简单性。比如说,
cib
读起来就像一个句子
change在括号中
-太棒了

但是为什么vim需要将旧内容复制到我的剪贴板中?在该命令中,我没有建议要复制它,而且问题更为严重

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

我使用这些命令是错误的,还是有办法完全禁用此功能?目前我已经做了一些类似这样的重拍:

nnoremap dd”\u dd

nnoremap cc”\u cc


但我不希望对每一种可能的非显式复制组合都这样做。

默认情况下,您所说的大多数命令都使用未命名寄存器,
。听起来你也在处理剪贴板被覆盖的问题,这可能是设置为
unnamed
unnamed\u plus
的症状

要回到标准,如果
设置剪贴板?
的输出是这两个选项之一,您可能可以执行
设置剪贴板=

                        *'clipboard'* *'cb'*
'clipboard' 'cb'    string  (default "autoselect,exclude:cons\|linux"
                          for X-windows, "" otherwise)
            global
            {not in Vi}
            {only in GUI versions or when the |+xterm_clipboard|
            feature is included}
    This option is a list of comma separated names.
    These names are recognized:

                        *clipboard-unnamed*
    unnamed     When included, Vim will use the clipboard register '*'
            for all yank, delete, change and put operations which
            would normally go to the unnamed register.  When a
            register is explicitly specified, it will always be
            used regardless of whether "unnamed" is in 'clipboard'
            or not.  The clipboard register can always be
            explicitly accessed using the "* notation.  Also see
            |gui-clipboard|.

                        *clipboard-unnamedplus*
    unnamedplus A variant of the "unnamed" flag which uses the
            clipboard register '+' (|quoteplus|) instead of
            register '*' for all yank, delete, change and put
            operations which would normally go to the unnamed
            register.  When "unnamed" is also included to the
            option, yank operations (but not delete, change or
            put) will additionally copy the text into register
            '*'.
            Only available with the |+X11| feature.
            Availability can be checked with:
                if has('unnamedplus')

我将提供一个不同的观点,并建议您可能非惯用地使用Vim。这绝不是意外的行为。您是否使用
cib
作为粘贴准备,以便
cib
将其搞糟?改为执行
vibp

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

d
然后
p
是用于剪切和粘贴(即移动文本)的正常Vim习惯用法。这是我每天做的一次手术,每天多次,如果
d
不用力拉,那真的很烦人。你似乎认为
d
相当于其他文本编辑器上的
Del
;它相当于
ctrl-x
(剪切)。若要取消此操作,请按您所说的那样执行
”\u d
;我发现我几乎不需要它

作为一个高级示例,
c
和visual mode
p
的默认语义使得交换两个对象变得非常简单;例如:

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

转到“喝过的”、
diw
(删除该单词并将其猛拉),转到“ate”、
viwp
(选择一个单词并粘贴在其上,猛拉先前的内容),
ctrl-o
返回到“喝过的”的位置和
p
(粘贴到光标前):

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

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

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

xnoremap <expr> P '"_d"'.v:register.'P'
xnoremap''u d'。v:寄存器'P'
(来自)。这仅在视觉模式下重新映射
p
(在其他方面与视觉模式下的
p
相同)。既不是
p
也不是
p
外部视觉模式,因此这不是问题