1
0
mirror of https://github.com/SpaceVim/SpaceVim.git synced 2025-02-03 12:10:05 +08:00
SpaceVim/bundle/calendar.vim/autoload/calendar/string.vim

81 lines
2.5 KiB
VimL
Raw Normal View History

" =============================================================================
" Filename: autoload/calendar/string.vim
" Author: itchyny
" License: MIT License
" Last Change: 2016/11/06 12:00:00.
" =============================================================================
let s:save_cpo = &cpo
set cpo&vim
" String manipulations.
" All the functions were imported from vital.vim.
" https://github.com/vim-jp/vital.vim (Public Domain)
let s:cache = calendar#countcache#new('string.vim')
function! calendar#string#truncate(str, width) abort
let key = a:width . 'C' . a:str
if s:cache.has_key(key) | return s:cache.get(key) | endif
if a:str =~# '^[\x20-\x7e]*$'
return len(a:str) < a:width
\ ? printf('%-' . a:width . 's', a:str)
\ : strpart(a:str, 0, a:width)
endif
let ret = a:str
let width = strdisplaywidth(a:str)
if width > a:width
let ret = calendar#string#strwidthpart(ret, a:width)
let width = strdisplaywidth(ret)
endif
if width < a:width
let ret .= repeat(' ', a:width - width)
endif
return s:cache.save(key, ret)
endfunction
function! calendar#string#truncate_reverse(str, width) abort
let key = a:width . 'U' . a:str
if s:cache.has_key(key) | return s:cache.get(key) | endif
if a:str =~# '^[\x20-\x7e]*$'
return len(a:str) < a:width
\ ? printf('%-' . a:width . 's', a:str)
\ : strpart(a:str, len(a:str) - a:width)
endif
let ret = a:str
let width = strdisplaywidth(a:str)
if width > a:width
let ret = calendar#string#strwidthpart_reverse(ret, a:width)
let width = strdisplaywidth(ret)
endif
if width < a:width
let ret = repeat(' ', a:width - width) . ret
endif
return s:cache.save(key, ret)
endfunction
function! calendar#string#strdisplaywidth(str) abort
return strdisplaywidth(a:str)
endfunction
function! calendar#string#strwidthpart(str, width) abort
let key = a:width . 'T' . a:str
if s:cache.has_key(key) | return s:cache.get(key) | endif
let str = tr(a:str, "\t", ' ')
let vcol = a:width + 2
let ret = matchstr(str, '.*\%<' . (vcol < 0 ? 0 : vcol) . 'v')
return s:cache.save(key, ret)
endfunction
function! calendar#string#strwidthpart_reverse(str, width) abort
let key = a:width . 'R' . a:str
if s:cache.has_key(key) | return s:cache.get(key) | endif
let str = tr(a:str, "\t", ' ')
let vcol = strdisplaywidth(str) - a:width
let ret = matchstr(str, '\%>' . (vcol < 0 ? 0 : vcol) . 'v.*')
return s:cache.save(key, ret)
endfunction
let &cpo = s:save_cpo
unlet s:save_cpo