首页 文章

我如何使用vim寄存器?

提问于
浏览
848

我只知道一个使用寄存器的实例是通过CtrlR *,我从剪贴板粘贴文本 .

寄存器的其他用途是什么?怎么用?

关于VI寄存器的所有知识(让我们关注vi 7.2) - 与我们分享 .

16 回答

  • 33

    Vim中的寄存器允许您对存储在其中的文本运行操作或命令 . 要访问寄存器,请在命令前键入 "a ,其中 a 是寄存器的名称 . 如果要将当前行复制到寄存器 k ,可以键入

    “凯

    或者您可以使用大写字母附加到注册表中

    “Kyy

    然后,您可以浏览文档并将其粘贴到其他位置

    “kp

    从Linux上的系统剪贴板粘贴

    “p

    从Windows上的系统剪贴板粘贴(或从Linux上的“鼠标突出显示”剪贴板粘贴)

    “* p

    访问所有当前定义的寄存器类型

    :reg

  • 8

    当我发现 0 注册时,我很高兴 . 如果您在不将文本分配给特定寄存器的情况下抽取文本,则它将被分配给 0 寄存器,并保存在默认的 " 寄存器中 . 0" 寄存器之间的区别在于 0 仅填充了被填充的文本,而默认寄存器也填充了使用 d / D / x / X / c / C / s / S 命令删除的文本 .

    当我想复制一些文本,删除一些东西并用复制的文本替换它时,我觉得这很有用 . 以下步骤说明了一个示例:

    • y[motion] 抽取要复制的文本 - 此文本保存在 "0 寄存器中

    • 使用 d[motion] 删除要替换的文本 - 此文本保存在 " 寄存器中

    • "0p 粘贴被拉动的文本

    其中 " 是将寄存器用于下一个命令的命令 .

    在最后一步,如果您要从默认寄存器(使用 p )粘贴,它将使用您刚刚删除的文本(可能不是您想要的) .

    请注意,默认寄存器中的 pP 粘贴 . 手写的等价物是 ""p (或 ""P ), "0 保持最后一次猛拉, "1 保留最后一次删除或更改 .

    有关详细信息,请参阅:help registers .

  • 95

    关于寄存器,我最喜欢的部分之一是将它们用作宏!

    假设您正在处理制表符分隔的值文件:

    ID  Df  %Dev    Lambda
    1   0   0.000000    0.313682
    2   1   0.023113    0.304332
    3   1   0.044869    0.295261
    4   1   0.065347    0.286460
    5   1   0.084623    0.277922
    6   1   0.102767    0.269638
    7   1   0.119845    0.261601
    

    现在您决定需要在%Dev字段的末尾添加百分号(从第2行开始) . 我们将在(任意选择的) m 寄存器中创建一个简单的宏,如下所示:

    • 按: qm :在 m 寄存器下开始录制宏 .

    • EE :转到第3列的末尾 .

    • a :插入模式以追加到此列的末尾 .

    • % :输入我们要添加的百分号 .

    • <ESC> :返回命令模式 .

    • j0 :转到下一行的开头 .

    • q :停止录制宏

    我们现在只需输入 @m 即可在当前行上运行此宏 . 此外,我们可以输入 @@ 重复,或 100@m 这样做100次!生活看起来很不错 .

    此时你应该说,“ BUT WAIT, WHAT THE HECK DOES THIS HAVE TO DO WITH REGISTERS ?”

    优点 . 让我们通过输入 "mp 来调查 m 寄存器的内容 . 然后我们得到以下内容:

    EEa%<ESC>j0
    

    起初,这看起来像你不小心在记事本中打开了一个二进制文件,但是第二眼, it's the exact sequence of characters in our macro!

    你是一个好奇的人,所以让我们做一些有趣的事情并编辑这一行文本以插入一个 ! 而不是无聊的旧 % .

    EEa!<ESC>j0
    

    然后我们通过输入 B"nyE 将其打入 n 寄存器 . 然后,只是为了踢,让我们使用 @n 在我们的数据行上运行 n 宏....

    OMG, IT ADDED A !

    从本质上讲,运行宏就像按下宏的寄存器中的确切键序列 . 如果这不是一个很酷的注册技巧,我会吃掉我的帽子 .

  • 41

    其他有用的寄存器

    "*"+ - 系统剪贴板的内容

    "/ - 最后一次搜索命令

    ": - 最后一个命令 .

    请注意vim宏,您可以编辑它们,因为它们只是录制宏时使用的击键列表 . 因此,您可以将宏写入文本文件(使用 "ap 编写宏a)并编辑它们,然后将它们加载到注册 "ay$ . 存储有用宏的好方法 .

  • 715

    black hole register _ 是寄存器的 /dev/null .

    我在我的vimrc中使用它来允许删除单个字符而不更新默认寄存器:

    noremap x "_x
    

    并以可视模式粘贴而不更新默认寄存器:

    vnoremap p "_dP
    
  • 9

    如果您想在ex-mode命令中粘贴寄存器的内容,请单击 <C-r><registerletter> .

    你为什么要用这个?我想做一个搜索并替换一个长字符串,所以我在可视模式下选择它,开始输入搜索/替换表达式 :%s/[PASTE YANKED PHRASE]//g 并继续我的一天 .

    如果您只想在ex模式下粘贴单个单词,可以在进入ex模式之前确保光标在其上,然后在ex模式下按 <C-r><C-w> 粘贴单词 .

  • 3

    我认为秘密大师寄存器是表达式=寄存器 . 它可用于创意映射 .

    :inoremap  \d The current date <c-r>=system("date")<cr>
    

    您可以将其与上述系统结合使用,或从自定义VimL功能等获取响应 .

    或者只是特别的东西

    <c-r>=35+7<cr>
    
  • 6

    一个很酷的技巧是使用 "1p 粘贴最后一次删除/更改(,然后重复使用 . 来粘贴后续删除 . 换句话说, "1p... 基本上等同于 "1p"2p"3p"4p .

    您可以使用它来反向排序少数几行: dddddddddd"1p....

  • 0

    从vim的帮助页面:

    CTRL-R {0-9a-z"%#:-=.}                  *c_CTRL-R* *c_<C-R>*
            Insert the contents of a numbered or named register.  Between
            typing CTRL-R and the second character '"' will be displayed
            <...snip...>
            Special registers:
                '"' the unnamed register, containing the text of
                    the last delete or yank
                '%' the current file name
                '#' the alternate file name
                '*' the clipboard contents (X11: primary selection)
                '+' the clipboard contents
                '/' the last search pattern
                ':' the last command-line
                '-' the last small (less than a line) delete
                '.' the last inserted text
                                *c_CTRL-R_=*
                '=' the expression register: you are prompted to
                    enter an expression (see |expression|)
                    (doesn't work at the expression prompt; some
                    things such as changing the buffer or current
                    window are not allowed to avoid side effects)
                    When the result is a |List| the items are used
                    as lines.  They can have line breaks inside
                    too.
                    When the result is a Float it's automatically
                    converted to a String.
            See |registers| about registers.  {not in Vi}
            <...snip...>
    
  • 46
    • q5记录编辑到寄存器5(下一个q停止录制)

    • :reg显示所有寄存器及其中的任何内容

    • @ 5执行寄存器5宏(录制编辑)

  • 17

    我使用默认寄存器来访问我的vim窗口中的文本,而无需使用鼠标 .

    • 猛拉文字

    • :!grep "<CTRL-R>0"<CR>

  • 305

    Use registers in commands@ . 例如 . :

    echo @a
    echo @0
    echo @+
    

    在命令中设置它们:

    let @a = 'abc'
    

    现在 "ap 将粘贴 abc .

  • 70

    混淆的一个重要原因是默认寄存器 " . 知道它的工作方式很重要 . 如果大多数时候都避免使用默认寄存器,那就更好了 . Vim文档中的解释:

    Vim fills this register with text deleted with the "d", "c", "s", "x" commands
    or copied with the yank "y" command, regardless of whether or not a specific
    register was used (e.g.  "xdd).  This is like the unnamed register is pointing
    to the last used register.
    

    因此,默认寄存器实际上是指向最后使用的寄存器的指针 . 当您删除或抽出某个东西时,该寄存器将指向其他寄存器 . 您可以通过检查寄存器来测试它 . 总是有另一个寄存器与默认寄存器完全相同:yank寄存器( "0 ),第一个删除寄存器( "1 ),小删除寄存器( "- )或用于删除或抽取的任何其他寄存器 .

    唯一的例外是黑洞登记 . Vim doc说:

    An exception is the '_' register: "_dd does not store the deleted text in any
    register.
    

    通常,通过直接使用会更好: "0"-"1-"9 默认寄存器或命名寄存器 .

  • 14

    一个被忽视的注册表是' . '包含最后插入文本的点寄存器,无论它是如何插入的,例如ct](改为直到]) . 然后你意识到你需要将其插入别处,但不能使用点重复方法 .

    :reg .
     :%s/fred/<C-R>./
    
  • 16

    我最喜欢的注册是 ':' 注册 . 在正常模式下运行 @: 允许我重复先前运行的ex命令 .

  • 1068

    我的朋友布莱恩写了一篇关于此的综合文章 . 我认为这是一个很好的介绍如何使用主题 . https://www.brianstorti.com/vim-registers/

相关问题