gpt4 book ai didi

perl - 开始使用 perl 编写 vim 脚本

转载 作者:行者123 更新时间:2023-12-01 13:07:11 24 4
gpt4 key购买 nike

我想创建一个 vim 函数/命令来插入 XSD 样式的时间戳。目前,我在 vimrc 文件中使用以下内容:

nmap <F5> a<C-R>=strftime("%Y-%m-%dT%H:%M:%S-07:00")<CR><Esc>

我想使用 Perl 代码:
use DateTime;
use DateTime::Format::XSD;
print DateTime->now(formatter => 'DateTime::Format::XSD', time_zone => 'America/Phoenix');

但我不知道从哪里开始。我知道我可以定义一个使用 Perl 的函数。例子:
function PerlTest() 
perl << EOF
use DateTime;
use DateTime::Format::XSD;
print DateTime->now(formatter => 'DateTime::Format::XSD', time_zone => 'America/Phoenix');
EOF

但是当我将 vimrc 更改为以下内容时,我没有得到我所期望的:
nmap <F5> a<C-R>=PerlTest()<CR><Esc>

有人可以指出我实现这一点的正确方向吗?这是我第一次尝试在 vim 中编写函数。另外,我使用的是使用 perl 支持编译的 vim 7.2。

最佳答案

首先,您需要查看 :help if_perl有关在 Vim 中使用 Perl 的一般信息。

对于这个特定问题,我不认为进入插入模式和评估表达式的相同方法是最佳选择。看起来语言绑定(bind)没有办法返回这样的值。

您可以做的是让函数获取当前行,将时间字符串放在适当的位置,然后再次设置当前行。

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

那么你的 map 就是 nnoremap <F5> :call PerlTest()<CR> .

我注意到上面的一个问题是,如果该行包含 1 字节!= 1 列的字符(即制表符、多字节字符等),它就不能很好地工作。我尝试了各种尝试解决这个问题的方法,但似乎没有一个能很好地工作。

问题是没有简单的方法可以将 Vim 的光标位置映射到字符串中表示光标当前行的位置。

避免此问题的另一种方法是仅使用 Perl 接口(interface)获取数据,然后从 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>

关于perl - 开始使用 perl 编写 vim 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2208618/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com