从vi/Vim调用键序列上的共享对象

从vi/Vim调用键序列上的共享对象,vim,Vim,我有一个共享库(以二进制形式;我有源代码),用于在VisualStudio中的源文件中的符号之间反转/循环 我希望能够在vi和/或Vim中使用相同的功能 具体来说,我想做的是以下场景: 光标在一个单词上 我按了一系列键,例如CTRL-I vi/Vim算出了我所用的全部单词 vi/Vim调用我的共享库,传递单词,并接收反转/循环替换 vi/Wim用新词替换原来的词 我没有任何线索,如果/如何让vi/Vim这样做,我没有任何运气搜索 感激地收到任何建议…试试看 inoremap <C-i&

我有一个共享库(以二进制形式;我有源代码),用于在VisualStudio中的源文件中的符号之间反转/循环

我希望能够在vi和/或Vim中使用相同的功能

具体来说,我想做的是以下场景:

  • 光标在一个单词上
  • 我按了一系列键,例如CTRL-I
  • vi/Vim算出了我所用的全部单词
  • vi/Vim调用我的共享库,传递单词,并接收反转/循环替换
  • vi/Wim用新词替换原来的词
我没有任何线索,如果/如何让vi/Vim这样做,我没有任何运气搜索

感激地收到任何建议…

试试看

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>