0

我正在尝试在 Vim 中编写这样的脚本,这给我带来了一系列问题。我确信这是可能的。

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

触发这种内联扩展的最佳方法是什么?以及运行计算的最佳方法?

4

2 回答 2

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

它将扩展88F88°F (31°C)insert-mode

注意:如果要输入字符F,请按Ctrl-VF

于 2011-12-17T18:31:17.693 回答
1

这是@kev's answer的重构,不会强迫您使用<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.1,例如10.==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'))
于 2011-12-17T22:47:49.050 回答