使用退格键的Vim宏

3

我要保存一个包含退格键字符的vim宏到我的vimrc文件。这个宏的想法是在js文件中添加一个文档段落。因此,如果我有以下函数:

function foo() {
}

我会将光标放在函数行上,运行宏,它将创建:

function foo() {
    /*
    | <- Cursor ends up here in insert mode.
    */
}

当我创建宏时,我得到了以下寄存器:
o/*^M<80>kb<80>kb<80>kb*/<80>ku^M<80>kb<80>kb<80>kb

(<80> 是一个单个的字符)

我尝试将以下内容添加为 let 命令:

let a='o/*^M<80>kb<80>kb<80>kb*/<80>ku^M<80>kb<80>kb<80>kb'

但是当我运行它时,它只会打印出:
function foo() {
    /*^M<80>kb<80>kb<80>kb*/<ESC>O<80>kb<80>kb<80>kb 
}

我是否漏掉了某些字符转义的步骤?也许有一种不同且更好的方法来完成这个任务吗?

2个回答

4

那些<80>kb是退格键的内部键码。将每个键码替换为\<BS>(并将^M写为\<CR>),然后将整个宏字符串放在双引号中,就可以了。

另外,要分配给寄存器a,需要使用@a


这正是我正在寻找的!我找不到退格键的代码。 - Nadav Sheffer
请参见 :h key-notation - Ingo Karkat

3

所有小于<80>kb的内容并不重要:它们只是Vim内部使用的,你根本不需要它们。

记住,宏只是一系列按键操作。如果你知道自己在干什么,那么直接将操作/按键记录下来甚至不需要录制步骤或者甚至不需要Vim本身。这就是这里或#vim上的所有常客所做的事情:Vim是一种语言,你只需要考虑实现目标所需的步骤,然后就可以编写宏:

o/*^M*/^[O

o    open a new line below the current line
/*   insert /*
^M   insert a line break
*/   insert */
^[   go back to normal mode
O    open a new line above the current line

要在函数中使用该宏,请使用:normal命令,在命令行或vimscript上下文中执行正常模式命令:
:norm! o/*^M*/^[O

直接在映射中使用该宏:

nnoremap <key> o/*^M*/^[O

要将该宏保存在您的~/.vimrc文件中:
let @a = "o/*^M*/^[O"

请按下@a键。

重要提醒:

^M is obtained with <C-v><CR>
^[ is obtained with <C-v><Esc>

参考资料:

:help recording
:help registers
:help :normal
:help i_ctrl-v

谢谢,你的<C-v>提示让我开心了一整天。它可以在编辑缓冲区中的宏时轻松插入CR、Esc、BS和其他字符... - Pivert

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接