标题:[实践OK]vim diff寄存器使用 Vim 寄存器实现vimdiff多个文件的粘贴,防止dd命令后影响粘贴的内容为删除行的内容的方法。 出处:向东博客 专注WEB应用 构架之美 --- 构架之美,在于尽态极妍 | 应用之美,在于药到病除 时间:Mon, 27 May 2019 14:57:12 +0000 作者:jackx 地址:http://jackxiang.com/post/10207/ 内容: 把光标停留在第一行上,按下yy命令,将第一行复制,然后再移到第二行,按下dd命令,删除第二行。此时如果我们想要粘贴第一行的内容的话,直接按p是不行的,因为此时的p将引用无名寄存器中的内容,而它的内容已经被第二行的内容给覆盖了,所以此时就轮到复制专用寄存器大显身手了,此时如果按下这个命令: "0p <===它是0,不是O,是数字0,别搞错了!! 这时,将会粘贴复制专用寄存器中的内容。 #正常复制:abc #dd各种删 dw #"0p 【调出0号寄存器里的内容】 细节上注意: vim中输入: :reg 后: 得到: l "" jack^J l "0 jack^J "0是双引号加0, 是一个寄存器。(想粘贴它就直接输入: "0p ,不用输入 y"0p ,这点容易搞错,出现无法粘贴上最近一次用 `y` 或 `yy` 命令复制的内容) l "1 xiang^J l "2 xiang^J ============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 配置以及正在使用的主题等因素,有些情况下可能会稍有不同。 Generated by Jackxiang's Bo-blog 2.1.1 Release