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
,并且什么也没有发生,即光标向下移动,但没有完成命令运行。是否可以使用插入模式在宏中完成操作,如果可以的话,该怎么办?
#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
评论
我不理解您的@spasic啊,我应该提一下好点,但是我正在使用set completeopt = longest,menuone,preview它的最长选项,这会导致
可能弹出菜单会干扰。也许尝试:set completeopt =和a
@Antony我不确定为什么