选择文本并使用keymap保存

时间:2015-06-09 13:08:44

标签: vim

我制作了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命令确实有效,所以这不是问题。

1 个答案:

答案 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()函数将选择存储在文件中。