自动完成/缩写与Vim中的计算?

时间:2011-12-17 17:09:37

标签: vim temperature

我正在尝试在Vim中编写类似这样的内容,并且它为我提出了一系列问题。我确信这是可能的。

每当我插入一个数字后跟大写字母F,如88F时,我希望Vim自动将其转换为88°F (31°C) - 也就是说,扩展表达式,同时将华氏温度转换为摄氏温度。

触发那种内联扩展的最佳方法是什么?并且运行计算的最佳方式是什么?

2 个答案:

答案 0 :(得分:1)

:imap F <ESC>ciw<C-R>=printf('%d°F (%d°C)', str2nr(@"), float2nr((str2nr(@")-32)/1.8))<CR>

它会在88F

中将88°F (31°C)扩展为insert-mode

注意:如果您想输入字符F,请按 Ctrl-V F

答案 1 :(得分:1)

这是@kev答案的重构,不会强迫您使用<C-v>F而不会触及任何寄存器:

inoremap <expr> F ((col('.')>1 && getline('.')[col('.')-2]=~#'^\d$')?(printf(' °F (%d °C)', float2nr((matchstr(getline('.')[:(col('.')-2)], '\d\+$')-32)/1.8))):('F'))

请注意,除非您确切知道原因,否则不得使用imap

<强>更新 假设您使用点作为小数分隔符,请不要使用科学记数法或常用(对于编程语言)截断,如.1==0.110.==10.0

inoremap <expr> F ((col('.')>1 && getline('.')[col('.')-2]=~#'^\d$')?(printf(' °F (%.1g °C)', (str2float(matchstr(getline('.')[:(col('.')-2)], '\v\-?\d+(\.\d+)?$'))-32)/1.8)):('F'))