Автозаполнение / сокращение с расчетом в Vim? - PullRequest
0 голосов
/ 17 декабря 2011

Я пытаюсь написать что-то подобное в Vim, и это вызывает у меня ряд вопросов. Я уверен, что это возможно.

Всякий раз, когда я вставляю число, за которым следует заглавная буква F, например 88F, я хотел бы, чтобы Vim автоматически преобразовал его в 88°F (31°C) - то есть, расширив выражение, но также преобразовав Фаренгейт в Цельсий.

Каков наилучший способ запуска такого расширения? А лучший способ запустить расчет?

Ответы [ 2 ]

1 голос
/ 18 декабря 2011

Это рефакторинг ответа @ 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'))
1 голос
/ 17 декабря 2011
: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 .

...