如何在宏中使用插入模式完成?


11

我正在尝试定义一个宏,该宏可以快速生成随机单词列表。
我希望宏将其转换为类似的列表

a
b
c
d
e

进入这个

arezzo
bywords
czars
détente
eyrie

到目前为止,我有:

  • 将光标放在字母上 a
  • 开始录制宏 qq
  • a 进入插入模式
  • <C-x><C-k> - perform dictionary completion on the character before cursor - in this case the letter一个
  • <C-p>选择出现的完成列表中的最后一项,在我的系统上,其单词为arezzo。(请注意,我已将其longest包括在我的'completeopt'设置中,<C-p>在完成过程中以这种方式工作是必需的:)'set completeopt=longest,menuone,preview'
  • <C-y> 接受完成
  • ^[^[ 退出插入模式
  • j 下移到下一行,准备在下一行进行相同的操作
  • q 停止录音

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

扫描字典文件

并且没有任何反应,仅j运行了宏中的命令,即光标向下移动了一行,但没有任何完成命令运行。
是否可以在宏中使用插入模式补全,如果可以,该怎么办?


我不明白你<C-p>一步...当我这样做,在我的VIM,它只是提供了一个消息back at original-没有选择的最后一个项目。我用向上箭头键两次选择最后一个字(我的情况azures),按下进入并然后Esc+j+q..然后在执行宏时效果很好
Sundeep

1
@spasic啊,我应该提一下好点,但是我使用 set completeopt=longest,menuone,preview它的longest选项导致<C-p>立即插入。如果我longestcompleteopt字符串中删除,则会得到与您相同的行为。另外,是的,箭头键也起作用!谢谢(我忘了你可以用它们来导航完成列表)
the_velour_fog

可能弹出菜单会干扰。也许尝试:set completeopt=a<c-x><c-k><esc>j作为您的宏。
安东尼

@Antony我不确定为什么<Cp>不能正常工作,但是方向箭头键可以工作。
the_velour_fog

Answers:


2

编辑:真的,您在字典完成后;您不一定需要插入模式(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

另外,在这里扩展逻辑以创建执行插入模式提供的任何功能的备用映射(使用例如功能参数)将不困难。如果有时间,我将很乐意协助解决这些要求并更新此脚本。


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

您是否也尝试过该sleep命令?
蒂姆(Tim)

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

我不是写这个问题的人。不过,我可以重现该问题:你必须添加最长completeopt(而不是由我再次)在注释中的描述。编辑:糟糕,'longest'ctrl-p步骤是必需的:不是ctrl-y。尽管如此步骤所述:在对我的问题,提问者的工作vim -Nu NONEcompleteopt编辑。
Rich

我想我已经找到了解决方案,请花几分钟时间来更新它的答案。
蒂姆(Tim)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.