[实践OK]vim diff寄存器使用 Vim 寄存器实现vimdiff多个文件的粘贴,防止dd命令后影响粘贴的内容为删除行的内容的方法。

jackxiang 2019-5-27 14:57 | |
把光标停留在第一行上,按下yy命令,将第一行复制,然后再移到第二行,按下dd命令,删除第二行。此时如果我们想要粘贴第一行的内容的话,直接按p是不行的,因为此时的p将引用无名寄存器中的内容,而它的内容已经被第二行的内容给覆盖了,所以此时就轮到复制专用寄存器大显身手了,此时如果按下这个命令:
"0p      <===它是0,不是O,是数字0,别搞错了!!
这时,将会粘贴复制专用寄存器中的内容。




============ChatGPT说===============================================
在 Vim 中,理解寄存器的工作原理对于有效地操作文本非常重要。你提到的步骤是正确的,但可能有一些细节需要注意,尤其是在不同系统(如 macOS)上可能存在的细微差异。下面是详细解释和操作步骤:

### 理解 Vim 寄存器

1. **无名寄存器 (`""`)**:默认的寄存器,用于存储最后一次删除或复制的内容。
2. **复制寄存器 (`"0`)**:用于存储最近一次用 `y` 或 `yy` 命令复制的内容。
3. **删除寄存器 (`"1`, `"2`, 等)**:用于存储最近的删除操作内容。

### 操作步骤

#### 1. 复制第一行

将光标移动到第一行,按 `yy` 命令,将第一行复制到寄存器 `0` 和无名寄存器 `""`。

```vim
yy
```

#### 2. 删除第二行

将光标移动到第二行,按 `dd` 命令,删除第二行,并将其内容存储到无名寄存器 `""` 和删除寄存器 `1`。

```vim
dd
```

#### 3. 粘贴第一行的内容

现在,如果你直接按 `p`,将会粘贴无名寄存器 `""` 中的内容,也就是刚刚删除的第二行的内容。要粘贴之前复制的第一行的内容,你需要引用复制寄存器 `0`。

```vim
"0p
```

### 完整步骤示例

1. **移动到第一行并复制:**

    ```vim
    gg (移动到第一行)
    yy (复制第一行)
    ```

2. **移动到第二行并删除:**

    ```vim
    j (移动到第二行)
    dd (删除第二行)
    ```

3. **粘贴第一行的内容:**

    ```vim
    "0p (粘贴复制寄存器中的内容)
    ```

### 解释

- `gg`:移动到文件的第一行。
- `yy`:复制当前行。
- `j`:移动光标到下一行。
- `dd`:删除当前行。
- `"0p`:使用寄存器 `0` 粘贴内容。

### 常见问题

1. **命令未生效**:确保在正常模式下执行这些命令。按 `Esc` 确保你在正常模式下。
2. **寄存器内容被覆盖**:确认每个步骤都按正确的顺序执行,且没有意外的命令干扰寄存器的内容。

通过正确理解和使用寄存器,你可以更高效地进行文本操作。如果还有问题,尝试通过 `:registers` 命令查看当前寄存器的内容,以确保你理解每个寄存器中的数据。









================遇到的问题=======================
我先把光标停留在第一行上,按下yy命令,将第一行复制,然后再移到第二行,按下dd命令,删除第二行。此时如果我们想要粘贴第一行的内容的话,直接按p是不行的,因为此时的p将引用无名寄存器中的内容,而它的内容已经被第二行的内容给覆盖了,所以此时就轮到复制专用寄存器大显身手了,此时如果按下这个命令:
"0p
这时,将会粘贴复制专用寄存器中的内容。这里直接贴结果图可能看不出什么效果,那我就贴一下用dd删除了第二行后所有寄存器的内容给大家看看吧:
  l  ""   ddline^J     当前寄存器是",里存的是删除的内容。
  l  "0   yyline^J     0 是复制专用寄存器

从这里可以看出,无名寄存器保存的是dd命令删除的内容,而复制专用寄存器(0)保存的是y命令复制的内容。
"0p 就能打印出yyline,而直接p就会打印删的内容ddline。




vimdiff 的优势在于能同时查看各个文件的差别,而:
vimdiff *   则对整个目录的文件进行比对,如果复制:
yy 后再control+w(w按两次)跳到另一个文件里按p粘贴上去,
发现原来那行不需要了,于是得dd删掉,而此时再通过control+w(w按两次)到第仨文件,再按p时,则是粘贴的内容是刚删的那行内容,怎么办?

用寄存器:
vim中输入
:reg

a-z26个命名寄存器中的a即可,如下:
可以用"{register}y来拷贝到{register}中, 用"{register}p来粘贴{register}中的内容。

实践:
"ayy可以拷贝当前行到寄存器a中,而"ap则可以粘贴寄存器a中的内容。   #是单引号ayy ,单引号ap进行粘贴,少引单引号不行。

结论:合理地使用可以极大地提高效率。


===========================================================================
"+p可以粘贴剪切板的内容,
":p可以粘贴上一个Vim命令(比如你刚刚费力拼写的正则表达式),
"/p可以粘贴上一次搜索关键词(你猜的没错,正是normal模式下的/foo搜索命令)。
在Vim中可通过:reg来查看每个寄存器当前的值。


来自:https://harttle.land/2016/07/25/vim-registers.html


"+p 是用来粘贴剪贴板的内容,而不是将其放入寄存器中。在 Vim 中,要将剪贴板的内容放入寄存器中,你可以使用以下步骤:
进入命令行模式,按下 : 键。
输入以下命令,将剪贴板的内容放入指定寄存器(假设你想将内容放入 a 寄存器):

:let @a = @+
这将会将剪贴板内容复制到寄存器 a 中。

按下 Enter 键,剪贴板的内容就会被放入寄存器中。
现在,你可以在替换命令中使用寄存器 a,使用 :%s#\V原内容#\=@a#g 来进行替换。这里的 \=@a 表示使用寄存器 a 中的内容作为替换文本。
再次对之前的混淆回答表示歉意,希望这次的回答能够解决你的疑问。



如何查看寄存器 a 中的值?
要查看寄存器 `a` 中的值,你可以在 Normal 模式下使用以下命令:

```
:echo @a
```
在 Normal 模式下,按下 `:` 进入命令行模式,然后输入上述命令。按下 `Enter` 后,Vim 将会在状态栏显示寄存器 `a` 中的内容。
这将会显示寄存器 `a` 中的文本内容,以便你查看和确认寄存器中的值。

vim如何打开状态栏?
Mac:Contrl + g
两行状态栏: :set laststatus=2

在 Vim 中,状态栏通常是默认显示的,它位于编辑器底部,用于显示各种状态信息、命令的输出以及其他相关信息。如果你的状态栏没有被关闭,它应该是默认显示的。
如果你误操作关闭了状态栏,你可以通过以下方法重新打开:
如果你在 Normal 模式下,只需按下 Ctrl + g。这将会在底部显示一个短暂的信息栏,其中包含当前的文件名、行号等信息,它通常会自动消失。
如果你想恢复完整的状态栏,可以在 Normal 模式下执行以下命令:
:set laststatus=2
这会将状态栏恢复为显示,同时在状态栏中显示更多信息。
请注意,状态栏的显示取决于你的 Vim 配置以及正在使用的主题等因素,有些情况下可能会稍有不同。

作者:jackxiang@向东博客 专注WEB应用 构架之美 --- 构架之美,在于尽态极妍 | 应用之美,在于药到病除
地址:https://jackxiang.com/post/10207/
版权所有。转载时必须以链接形式注明作者和原始出处及本声明!


最后编辑: jackxiang 编辑于2024-6-14 09:33
评论列表
发表评论

昵称

网址

电邮

打开HTML 打开UBB 打开表情 隐藏 记住我 [登入] [注册]