在vim中,如何使用setreg将回车添加到寄存器中?

Posted

技术标签:

【中文标题】在vim中,如何使用setreg将回车添加到寄存器中?【英文标题】:In vim, how can I add a carriage return to a register using setreg? 【发布时间】:2012-01-15 00:00:20 【问题描述】:

我的 .vimrc 中有这个命令:

vip:normal @g<CR>

当我通过输入缓冲区设置寄存器“g”时,它可以工作:

qg<CR>jq

如果我输入 :registers,它会显示:

--- Registers ---

"g   ^Mj

之后,输入@g 会导致回车,然后光标移动到下一行。 ^M 以特殊颜色显示。

但是,当我在 vimrc 中使用 setreg 命令时,如果我键入 @g,则什么也不会发生。

call setreg('g','^Mj')

如果我输入 :registers,它会显示:

--- Registers ---

"g   ^Mj

^M 不是特殊颜色。

我的 .vimrc 中有以下内容:

map <CR> :call MyFunction<CR>

我要存入寄存器的回车是运行MyFunction。只要我手动填充缓冲区而不是使用 setreg,就会完美调用 MyFunction。

我哪里做错了?我的平台是 Linux。

【问题讨论】:

你是如何在call setreg('g','^Mj')中输入^M的?你用 ctrl-v ctrl-m 吗?或者只是输入了一个插入符号和一个 M? caret M...啊...我曾尝试输入 caret v caret m 但失败了。我没有意识到您实际上必须在插入模式下键入 ctrl-v ctrl-m,而不是写入字符串“^V^M”。感谢那!实际上按下这些键是有效的。寄存器设置正确。感谢您的帮助。 ctrl-v 是我通常用来获取^M 【参考方案1】:

您正在寻找"\&lt;cr&gt;""\r"

call setreg('g',"\<cr>j")
call setreg('g',"\rj")

或者更简单

let @g = "\<cr>j"
let @g = "\rj"

更多帮助

:h expr-quote
:h let-@

【讨论】:

【参考方案2】:

一般来说,避免在 vim 脚本的行中使用 ascii 控制字符(低于 0x20)。当您再次阅读 vimrc 时,如果它没有足够的行数,vim 可能会检测到错误的行终止模式(mac?)

使用nr2char(13) 在字符串文字中包含^M

call setreg('g', nr2char(13).'j')

否则正如 sidyll 在他的评论中告诉你的那样,可以在插入模式下使用 CTRL-V 输入控制字符。

【讨论】:

【参考方案3】:

最佳答案并不总是有效。 提供\n 在我的情况下起到了作用。

:let @a="foo"
:let @a="\nbar"

确保使用双引号。

【讨论】:

\n 实际上在我需要在宏末尾输入回车时救了我。 \n 在宏的末尾给你 ^J 。而 \ 和 \ 和 \r 都导致 ^M^J

以上是关于在vim中,如何使用setreg将回车添加到寄存器中?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Vim 剪贴板里面的东西粘贴到 Vim 之外的地方

如何在vim中将选定的行复制到剪贴板

如何在Vim中复制到剪贴板?

vim中如何拷贝全文到win10的其他程序

如何在 vim 中设置默认寄存器?

如何在 Windows 上的 Bash 的 vim 中“复制到剪贴板”? [关闭]