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

时间:2009-03-16 03:22:32

标签: vim

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

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

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

  • 光标位于单词
  • 我按一个键序列,例如CTRL-I
  • vi / Vim计算出我正在使用的所有单词
  • vi / Vim调用我的共享库,传递单词,并接收反转/循环替换
  • vi / Wim用新单词
  • 替换原始单词

我没有任何线索,如果/如何让vi / Vim这样做,我没有运气搜索。

感激地收到任何建议......

3 个答案:

答案 0 :(得分:6)

尝试

inoremap <C-i> <esc>"hciw<C-R>=libcall('path/to/your.dll', 'func', @h)<CR>

它的作用:

  • 为插入模式创建地图&lt; Ctrl + i&gt;
  • &LT; ESC&GT;切换到正常模式“hciw将光标移动到寄存器h
  • &lt; C-r&gt; =插入下一个表达式的光标位置结果
  • libcall(...)在运行时库中调用函数。
  • @h是'h'寄存器的值。

如果您想使用可以从命令行运行的简单二进制文件,您可以使用

inoremap <C-i> <esc>"hciw<C-R>=substitute(system('mybin --word='.@h), "\n", '', 'g')<CR>

答案 1 :(得分:1)

我不知道如何从普通的vim脚本调用共享库,但是如果你可以为你的库创建一个python包装器并且你使用的是大于7的vim版本,你可以在其中调用python脚本VIM。
首先,检查您是否启用了python支持:键入

:version
在vim里面列出可用的功能;如果它有python支持,你应该在某处看到'+ python'(否则为'-python')。如果你没有启用python,你可以参考this post来编译带有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>

这当然不是一个完全有效的解决方案,但我希望它会让你走上良好的道路。

答案 2 :(得分:1)

有很多方法可以做到这一点(:h expand(),...)。其中一个是以下内容)

:nnoremap triggerkeysequence ciw<c-r>=libcall('path/to/your.dll', 'your_function',@")<cr>

BTW:<c-i><tab>,您确定要覆盖此密钥的操作吗?