我正在尝试在 Vim 中编写这样的脚本,这给我带来了一系列问题。我确信这是可能的。
每当我插入一个后跟大写 F 的数字时88F
,我希望 Vim 自动将其转换为88°F (31°C)
- 即扩展表达式,同时将华氏温度转换为摄氏温度。
触发这种内联扩展的最佳方法是什么?以及运行计算的最佳方法?
我正在尝试在 Vim 中编写这样的脚本,这给我带来了一系列问题。我确信这是可能的。
每当我插入一个后跟大写 F 的数字时88F
,我希望 Vim 自动将其转换为88°F (31°C)
- 即扩展表达式,同时将华氏温度转换为摄氏温度。
触发这种内联扩展的最佳方法是什么?以及运行计算的最佳方法?
: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-VF。
这是@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'))