Edit1.Возьми два.Пытаюсь воспринять обратную связь от Люка.Без временного файла (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
нельзя использовать, поскольку он работает по линиям.Я заменил <Esc>...<Insert>
на все лучше <C-O>
.Я оставил перерисовку, так как это помогает в случаях, когда вызываемая команда производит вывод в 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 уже определена.
Я сделалодин раз, прежде чем попытаться реализовать нечто подобное здесь .Я не очень хорош в программировании на VIM, поэтому он выглядит неубедительным, и предложение от Люка должно иметь преимущество.
Здесь все равно:
: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>
Несмотря на то, что он хром, он работает, хотя.