Edit1。拿两个。试图吸收Luc的反馈。没有临时文件(readfile()
原来在VIM 6.x中不可用,我在某些系统上)。
:function InsertCmd(cmd)
: let l = system(a:cmd)
: let l = substitute(l, '\n$', '', '')
: exe "normal a".l
: redraw!
:endfunction
:imap <silent> <F5> <C-O>:call InsertCmd('echo date \| md5sum \| cut -d" " -f1')<CR>
:map <silent> <F5> :call InsertCmd('echo date \| md5sum \| cut -d" " -f1')<CR>
:put
不能使用,因为它工作在行方式。我用<C-O>
代替<Esc>...<Insert>
。我离开了重绘,因为它有助于调用命令生成输出到stderr的情况。
或者用<C-R>=
:
:function InsertCmd(cmd)
: let l = system(a:cmd)
: let l = substitute(l, '\n$', '', '')
: return l
:endfunction
:imap <silent> <F5> <C-R>=InsertCmd('echo date \| md5sum \| cut -d" " -f1')<CR>
也就是function!
和function
之间的区别?
大多数时间在命令结束时感叹意味着强制执行。 (建议查看:help
,因为不同的命令使用!
的方式不同,但VIM会尝试记录所有形式的命令。)对于function
,它告诉VIM覆盖此函数的先前定义。例如。如果将上面的代码放入func1.vim
文件中,则第一次:source func1.vim
可以正常工作,但第二次将失败,并且函数InsertCmd已被定义。
我曾尝试实施过一次something similar here。我不擅长VIM编程,因此看起来很蹩脚,Luc的建议应该优先考虑。
这里去反正:
:function InsertCmd(cmd)
: exe ':silent !'.a:cmd.' > /tmp/vim.insert.xxx 2>/dev/null'
: let l = readfile('/tmp/vim.insert.xxx', '', 1)
: exe "normal a".l[0]
: redraw!
:endfunction
:imap <silent> <F5> <Esc>:call InsertCmd('hostname')<CR><Insert>
:map <silent> <F5> :call InsertCmd('hostname')<CR>
尽管是瘸腿的,它的工作原理虽然。
如果您的方法有一个问题,它与临时文件有关。多个用户不能使用相同的脚本。最好使用tempname()。否则,可能会增强一些内容: - 不重绘, - 返回l [0], - 并将其插入' ='以避免与光标位置有关的错误。 –
2010-07-09 09:58:49
@Luc:' =' - 非常非常酷。 'tempname()' - 很好的了解。感谢您的建议。 –
Dummy00001
2010-07-09 12:23:29
“命令结束时的感叹号意味着强制执行。”这不是真的。有很多反例。见':g',':delm',':put',... – 2010-07-12 15:36:24