我正在尝试定义一个宏,该宏可以快速生成一个随机单词列表。 >进入此

a
b
c
d
e


到目前为止,我所拥有的:


将光标放在字母a

开始记录宏qq


a进入插入模式

<C-x><C-k> - perform dictionary completion on the character before cursor - in this case the letter a`

<C-p>选择完成列表中的最后一项在我的系统上显示为arezzo。 (注意,我的longest设置中包含'completeopt',这是<C-p>在完成过程中以这种方式工作所必需的:'set completeopt=longest,menuone,preview'。)。

<C-y>接受完成

^[^[退出插入模式

j向下移动到下一行,准备在下一行进行相同的操作

q停止记录

当我创建宏并手动执行步骤,一切正常,但是当我执行宏时,我在命令行中看到一条闪烁的消息,例如:


扫描字典文件


宏中的命令仅运行j,并且什么也没有发生,即光标向下移动,但没有完成命令运行。
是否可以使用插入模式在宏中完成操作,如果可以的话,该怎么办?

评论

我不理解您的步骤...在我的vim中执行此操作时,它仅使消息返回原始状态-不选择最后一项。。我用向上箭头键两次选择了最后一个词(我case azures),按Enter键,然后按Esc + j + q ..然后在执行宏时效果很好

@spasic啊,我应该提一下好点,但是我正在使用set completeopt = longest,menuone,preview它的最长选项,这会导致立即插入。如果我从completeopt字符串中删除最长的字符串,则会得到与您相同的行为。另外,是的,箭头键也起作用!谢谢(我忘了您可以使用它们浏览完成列表)

可能弹出菜单会干扰。也许尝试:set completeopt =和a j作为宏。

@Antony我不确定为什么不起作用,但是方向箭头键起作用了。

#1 楼

编辑:真的,您在字典完成之后;您不一定需要插入模式(Ctrl + X模式)来执行此操作。如您所见,它使使用宏变得非常痛苦。下面的脚本无需插入模式即可用于完成字典,以便您可以轻松地在宏内部重复该字典。

将下面的代码添加到.vimrc文件中,关闭并重新打开任何vim窗口输入新功能,然后交替记录​​<C-k>完成操作,并按j下移到下一行。我添加了对longest选项的检查,如果禁用,它将使用系统随机时间选择一个随机条目。如果找到longest选项,则会从字典中手动搜索最长的匹配条目,然后插入该条目。

如果您不喜欢<C-k>映射,请随意更改它。 。它应该可以与您喜欢的任何映射一起使用。

此外,返回用于表达式的表达式以进行评估的命令将在末尾添加一个\<esc>字符,以便我们在每次插入后自动退出插入模式,并且前面的0cw进入插入模式,并确保我们正确覆盖了整个单词。根据您想要的确切行为(如果您的单词在每一行的开头都不太好),您可以使用bcw代替来查找实际的单词开头。但是,返回到确实以该行开头的单词时,您会看到一些奇怪之处。可能有一个更高级的命令可以忽略行尾并立即执行两个操作,但是我找不到一个。

map <expr> <C-k> CompleteDictionary()
fun! CompleteDictionary()
    let cword = expand(“<cword>”)
    let res = []
    for m in readfile(&dictionary)
        if m =~ '^' . cword
            call add(res, m)
        endif
    endfor
    if &completeopt =~ 'longest'
        let max = 0
        let maxindex = 0
        let index = 0
        for item in res
            if strlen(item) > max
                let max = strlen(item)
                let maxindex = index
            endif
            let index = index + 1
        endfor
        return "0cw" . res[maxindex] . "\<esc>"
    else
        return "0cw" . res[system('@echo %RANDOM%') % len(res)] . "\<esc>"
    endif
endfun


此外,这并不难扩展此处的逻辑以创建执行插入模式提供的任何功能的备用映射(例如,使用功能参数)。如果有时间,我将很乐意为您提供帮助,并更新此脚本。

评论


这听起来像是对该问题的合理解释,但是我尝试了两种您建议的解决方案,但似乎都没有帮助。

–丰富
17年11月13日在11:41

您是否也尝试过sleep命令?

– Tim
17年11月13日在15:33

是的,尽管仅建议值为5秒。您是否设法获得了两种解决方案都能正常工作?您可以发布完整的步骤列表吗?

–丰富
17年11月13日在15:44



我不是写这个问题的人。但是,我可以重现该问题:您必须按照评论中的说明(同样,不是我本人)添加最长的completeopt。编辑:糟糕,ctrl-p步骤需要“最长”:不是ctrl-y。提问者描述的步骤仍然可以在vim -Nu NONE中完成,对completeopt进行编辑。

–丰富
17年11月13日在20:41



我想我已经找到了解决方案,请花几分钟时间来更新它的答案。

– Tim
17年11月13日在20:47