2015-06-09 37 views
2

我做了C#命令行程序,需要一个窗口句柄和一个字符串作为参数保存。它将带有句柄的窗口带到前台,使用SendKeys发送已传递的字符串,并将之前位于前景的窗口返回到前景。选择文本,并与键盘映射

我做了这个程序,这样我可以从VIM发送文本的选择,在任何程序我想,如Python交互。

我无法弄清楚如何将选择直接发送到程序,但我确实知道如何在可视模式下保存选定的文本(How can I save a text block in visual mode to a file in Vim? - 它可以节省整条线,但对我的目的来说没问题。 ,它不会保存行)。所以我把我的程序的风格化的标签改为一个文件名。我的计划是,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时,它会按预期选择最上面的括号,但它不会将选择保存到文件中。

地发送命令做的工作,所以这不是问题。

+0

为什么不能复制/粘贴? – romainl

+0

你的意思是手动? – phil

回答

2

与所有那些重复a(文本对象,你大概打算占领的最外层括号中的文字。不幸的是,如果文本对象的比较少,那么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()函数来将选择存储在文件中。

+0

你可以举一个例子吗?我不太了解它(我对vim来说很新)。 – phil