从vi/Vim调用键序列上的共享对象
我有一个共享库(以二进制形式;我有源代码),用于在VisualStudio中的源文件中的符号之间反转/循环 我希望能够在vi和/或Vim中使用相同的功能 具体来说,我想做的是以下场景:从vi/Vim调用键序列上的共享对象,vim,Vim,我有一个共享库(以二进制形式;我有源代码),用于在VisualStudio中的源文件中的符号之间反转/循环 我希望能够在vi和/或Vim中使用相同的功能 具体来说,我想做的是以下场景: 光标在一个单词上 我按了一系列键,例如CTRL-I vi/Vim算出了我所用的全部单词 vi/Vim调用我的共享库,传递单词,并接收反转/循环替换 vi/Wim用新词替换原来的词 我没有任何线索,如果/如何让vi/Vim这样做,我没有任何运气搜索 感激地收到任何建议…试试看 inoremap <C-i&
- 光标在一个单词上
- 我按了一系列键,例如CTRL-I
- vi/Vim算出了我所用的全部单词
- vi/Vim调用我的共享库,传递单词,并接收反转/循环替换
- vi/Wim用新词替换原来的词
inoremap <C-i> <esc>"hciw<C-R>=libcall('path/to/your.dll', 'func', @h)<CR>
inoremap“hciw=libcall('path/to/your.dll','func',@h)
它的作用是:
- 为插入模式创建映射
- 切换到正常模式“hciw”将光标下的字移动到寄存器h中
- =将下一个表达式的结果插入光标位置
- libcall(…)调用运行时库中的函数
- @h是“h”寄存器的值
inoremap <C-i> <esc>"hciw<C-R>=substitute(system('mybin --word='.@h), "\n", '', 'g')<CR>
inoremap“hciw=substitute(系统('mybin--word='.@h)、“\n”、“g”)
我不知道如何从普通的vim脚本调用共享库,但是如果您可以为库创建python包装器,并且您使用的vim版本大于7,则可以在vim中调用python脚本。首先,检查是否启用了python支持:type
:version
在vim内部列出可用的特性;如果它支持python,则应该在某处看到“+python”(否则为“-python”)。如果没有启用python,则可以参考使用python支持编译vim
然后,您可以映射一个键来调用当前位于光标下的单词的python函数:
python << EOF
import vim
import MySharedLibraryPythonBinding
def MyFunction():
# get word under cursor
x = vim.eval('expand ("<cword>")')
# get replacement
MySharedLibraryPythonBinding.GetReplacement(x)
# replace contents (you'll need some work here...)
vim.current.line = "add something sensible here..."
EOF
nmap <F3> :py MyFunction( expand("<cword>") )<CR>
python有很多方法(:h expand(),…)。下面是其中之一)
:nnoremap triggerkeysequence ciw=libcall('path/to/your.dll','your_function',@'))
顺便说一句:
是
,您确定要覆盖此键上的操作吗?顺便说一句,您可能需要删除尾随的“\n”。在system()的情况下(它不响应您的需求),这是肯定的,在libcall()的情况下我不知道。注意:libcall()不是另一个解决方案。这就是解决办法。system()不满足OP的需要:调用共享库中的函数。此外,必须对system()输出进行分析,以修剪“\n$”@Luc:“二进制格式”。我想它的意思是“二进制”可执行文件。需要修剪的不全是“\n”,而是最后一个“\n”。@Luc:我想这对这种情况没关系。只要它只是一个单词,就可以了。如果它是一个多行代码段,那么它确实很重要。无论如何,我们已经在使用system(),我们可以给出基于matchstr()的简化的“最终”system()答案,或者使用临时变量、测试和[0:-2]/strpart()优化的答案。
:nnoremap triggerkeysequence ciw<c-r>=libcall('path/to/your.dll', 'your_function',@")<cr>