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

ren*_*ick 4 vim carriage-return vim-registers

我的.vimrc中有这个命令:

vip:normal @g<CR>
Run Code Online (Sandbox Code Playgroud)

当我通过键入缓冲区来设置寄存器'g'时,它会起作用:

qg<CR>jq
Run Code Online (Sandbox Code Playgroud)

如果我输入:register,它显示:

--- Registers ---

"g   ^Mj
Run Code Online (Sandbox Code Playgroud)

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

但是,当我在我的vimrc中使用setreg命令时,如果我输入@g,则没有任何反应.

call setreg('g','^Mj')
Run Code Online (Sandbox Code Playgroud)

如果我输入:register,它显示:

--- Registers ---

"g   ^Mj
Run Code Online (Sandbox Code Playgroud)

^ M不是特殊颜色.

我的.vimrc中有以下内容:

map <CR> :call MyFunction<CR>
Run Code Online (Sandbox Code Playgroud)

我想要存储在寄存器中的回车是运行MyFunction.只要我手动填充缓冲区而不是使用setreg,MyFunction就会被完美地调用.

我哪里出错了?我的平台是Linux.

Pet*_*ker 8

你正在寻找"\<cr>""\r"

call setreg('g',"\<cr>j")
call setreg('g',"\rj")
Run Code Online (Sandbox Code Playgroud)

或者更简单

let @g = "\<cr>j"
let @g = "\rj"
Run Code Online (Sandbox Code Playgroud)

获得更多帮助

:h expr-quote
:h let-@
Run Code Online (Sandbox Code Playgroud)


Ben*_*oit 5

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

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

call setreg('g', nr2char(13).'j')
Run Code Online (Sandbox Code Playgroud)

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