Прежде всего, вам нужно взглянуть на : справка if_perl для получения общей информации об использовании Perl из Vim.
Для этого конкретного вопроса я не думаю, что наилучшим вариантом является тот же подход, что и в режиме вставки и оценке выражения. Не похоже, что у языковых привязок есть способ вернуть такое значение.
Вместо этого можно сделать так, чтобы функция получила текущую строку, поместила строку времени в соответствующее место и снова установила текущую строку.
fun! PerlTest()
perl << EOF
use DateTime;
use DateTime::Format::XSD;
my ($row, $col) = $curwin->Cursor();
my ($line) = $curbuf->Get($row);
substr($line, $col + 1, 0,
DateTime->now(formatter => 'DateTime::Format::XSD',
time_zone => 'America/Phoenix'));
$curbuf->Set($row, $line);
EOF
endfun
Тогда ваша карта будет просто nnoremap <F5> :call PerlTest()<CR>
.
Одна проблема, с которой я обратил внимание на вышесказанное, заключается в том, что она не работает должным образом, если строка содержит символы, где 1 байт! = 1 столбец (т. Е. Табуляции, многобайтовые символы и т. Д.). Я пытался исправить это разными способами, но ни один из них, похоже, не работает очень хорошо.
Проблема в том, что нет простого способа отобразить позицию курсора Vim на позицию в строке, которая представляет текущую строку курсора.
Другой подход, позволяющий избежать этой проблемы, состоит в том, чтобы просто использовать интерфейс Perl для получения данных, а затем вставить данные из Vim.
fun! PerlTest()
let a_reg = getreg('a', '1')
let a_reg_type = getregtype('a')
perl << EOF
use DateTime;
use DateTime::Format::XSD;
my $date = DateTime->now(formatter => 'DateTime::Format::XSD',
time_zone => 'America/Phoenix');
VIM::Eval("setreg('a', '$date', 'c')");
EOF
normal "ap
call setreg('a', a_reg, a_reg_type)
endfun
nnoremap <F5> :call PerlTest()<CR>