我正在尝试在Vim中编写类似这样的内容,并且它为我提出了一系列问题。我确信这是可能的。
每当我插入一个数字后跟大写字母F,如88F
时,我希望Vim自动将其转换为88°F (31°C)
- 也就是说,扩展表达式,同时将华氏温度转换为摄氏温度。
触发那种内联扩展的最佳方法是什么?并且运行计算的最佳方式是什么?
答案 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.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'))