6

我想定义一个 vim 宏,在某些时候会中断用户输入,这可能吗?

编辑:原来是录音(q),而不是宏

可以在录音中使用输入命令,但麻烦多于其价值。

我首先将插入输入转义映射到一个键

:map <F2> a<C-R>=input('input: ')<CR>

然后我在 q 寄存器中做了这个录音

name: 

并将其粘贴到新标签中

iname: ^[

在最后一次逃脱之后,我按下<C-V><F2>了这条线:

iname ^[^[OQ

我拉回 q 缓冲区然后使用宏,让我使用输入函数。它有效,但非常糟糕。

4

4 回答 4

3

是的。见功能input({prompt}, [, {text} [, {completion}] ])。甚至还有 inputdialog({prompt} [, {text} [, {cancelreturn}]]), 用于弹出对话框。

于 2012-07-19T19:06:29.877 回答
2

如果您input()在映射或宏中使用,剩余的字符将被视为输入,这不是您想要的。Vim 提供inputsave()inputrestore()函数来临时暂停从映射字符流中读取。

根据 mogelbrod 的回答,这是行不通的;作为itest输入读入:

oBEFORE ^R=input('prompt> ')^Mitest

但这确实:

function! Input()
    call inputsave()
    let text = input('prompt> ')
    call inputrestore()
    return text
endfunction
oBEFORE ^R=Input()^Mitest

不幸的是,因为<C-R>需要一个表达式,我们不能将命令内联,而必须定义一个单独的Input()函数。

于 2012-07-20T06:48:24.563 回答
1

不幸的是,这似乎是不可能的。您可以在宏内部触发input(),但之后似乎无法继续,因为记录的任何其他输入都插入到输入提示中。

将该行拖入一个命名寄存器 ( "qY) 并运行它 ( @q) 来尝试一下。
注意:将^Rand替换^M为 Ctrl-V Ctrl-R/M(请参阅:help i_CTRL-V)。

  • oBEFORE ^R=input('prompt> ') - 作品
  • oBEFORE ^R=input('prompt> ')^Mitest - 有效,但插入itest到提示中
  • oBEFORE ^R=input('prompt> ')<CR>test - 失败
于 2012-07-19T20:16:31.170 回答
0

我已经从这个线程和其他线程收集了信息并编写了这个脚本:

function! MacroInterrupt()
    "call inputsave()
    if strlen(reg_recording()) == 0
        if mode() == 'n'
            call inputsave()
            let tmp_col = col('.')
            let tmp_line = line('.')
            let text = input('input:')
            let line = getline('.')
            call setline('.', strpart(line, 0, col('.') - 1) . text . strpart(line, col('.') - 1))
            call cursor(tmp_line, tmp_col + strlen(text))
            call inputrestore()
            return text
        else
            call inputsave()
            let text = input('input:')
            call inputrestore()
            return text
        endif
    else
        echo "Interrupt added to macro"
        call setreg(reg_recording(), getreg(reg_recording()) . "\<F2>")
        "echo getreg("q")
    endif
    "call inputrestore()
endfunction

map <F2> :call MacroInterrupt() <CR>
inoremap <buffer><expr> <F2> MacroInterrupt()

我希望这可以帮助特别是尝试相同的人。

于 2021-03-29T17:53:36.523 回答