我制作了c#命令行程序,它将窗口句柄和字符串作为参数。它将带有句柄的窗口带到前台,使用SendKeys发送传递的字符串,并将之前在前台的窗口带回前台。
我创建了这个程序,这样我就可以从vim中选择文本到我想要的任何程序,比如python interactive。
我无法弄清楚如何将选择直接发送到程序,但我确实找到了如何以可视模式保存所选文本(How can I save a text block in visual mode to a file in Vim? - 它可以节省整行,但这对我的目的来说没问题理想情况下,它不会只保存线条。所以我将程序的styring paraeter更改为文件名。我的计划是vim会将所选文本保存到文件中,并使用文件名调用该程序。
这是我的vimrc的一部分
let g:send_keys_handle = 0
let g:send_keys_file = $home . "\\vim\\send.txt"
function! SendSelection()
if g:send_keys_handle
silent !cls
let x = "silent !cmdHost " . g:send_keys_handle . " " . "\"" . g:send_keys_file . "\""
echom x
execute x
endif
endfunction
command! SendS call SendSelection()
noremap <F5> <esc>va(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a(:w ~\vim\send.txt<cr>
键映射不完整,但vim现在甚至都没有执行所有操作。当我按F5时,它会按预期选择最上面的括号,但不会将选择保存到文件中。
SendS命令确实有效,所以这不是问题。
答案 0 :(得分:2)
对于所有重复的a(
文本对象,您可能打算捕获最外面括号中的文本。不幸的是,如果parens少于文本对象,Vim将发出蜂鸣声并中止映射,因此其余部分将不会被执行。
一种可能的解决方案是将其拆分为两部分,并使用:normal!
进行选择。这只会中止:normal
部分;映射的其余部分仍将执行。但是,您需要使用gv
重新建立视觉选择。
nnoremap <F5> :execute 'normal! va(a(a(a(a(a(a(a(a(a(a(a(a(a(a(a('<CR>gv:w ~\vim\send.txt<CR>
替代:write
(也会发出消息,并设置备用文件,除非您提前:keepalt
)将y
对选择进行分析,并使用较低级writefile()
函数将选择存储在文件中。