【发布时间】:2015-08-17 02:29:25
【问题描述】:
我正在我的 .vimrc 中设置一个函数(特别是使用 MacVim,但这通常对 vim 应该是通用的)以在我的状态行中显示文件大小(以字节、千字节和兆字节为单位)。虽然该功能非常完美,没有错误,但它给了我意想不到的输出!事后看来,它肯定会产生应有的输出,但不是我想要的输出。
函数如下:
" I modified the FileSize() function shown here to suit my own preferences:
" http://got-ravings.blogspot.com/2008/08/vim-pr0n-making-statuslines-that-own.htm
function! StatuslineFileSize()
let bytes = getfsize(expand("%:p"))
if bytes < 1024
return bytes . "B"
elseif (bytes >= 1024) && (bytes < 10240)
return string(bytes / 1024.0) . "K"
elseif (bytes >= 10240) && (bytes < 1048576)
return string(bytes / 1024) . "K"
elseif (bytes >= 1048576) && (bytes < 10485760)
return string(bytes / 1048576.0) . "M"
elseif bytes >= 10485760
return string(bytes / 1048576) . "M"
endif
endfunction
这是它的基本工作方式:
- 如果文件大小小于 1KB,则以整数形式输出大小(以字节为单位)
- 如果文件大小介于 1KB 和 10KB 之间,则以小数形式输出大小(以千字节为单位)
- 如果文件大小在 10KB 和 1MB 之间,则以整数形式输出千字节大小
- 如果文件大小介于 1MB 和 10MB 之间,则以十进制形式输出大小(以兆字节为单位)
- 如果文件大小大于 10MB,则以 MB 为整数输出大小
第 2 步和第 4 步产生的输出是具有 六 (6) 位精度的小数。我想要的期望输出应该是只有一个 (1)位精度的小数。
我已经搜索了 round() 和 trunc() 函数的帮助文档,但它们只会将浮点数舍入和截断到最接近的整数值,这不是我想要的。我还搜索了 Google 和 StackOverflow 的解决方案,但我能找到的大部分内容都涉及更改编辑缓冲区中的文本或完全不相关的问题,例如 Java 中的舍入浮点数(!!!)
我最好寻找可以做到这一点的 vim 内置函数,例如 round({expr},{prec}) 或 trunc({expr},{prec}),但如果用户定义的函数可以提供足够优雅的解决方案,那么我完全赞成出色地。我不介意输出是否是一个字符串,因为我显然是从StatuslineFileSize() 返回一个字符串!
【问题讨论】: