mirror of
https://github.com/SpaceVim/SpaceVim.git
synced 2025-02-03 16:10:05 +08:00
81 lines
2.5 KiB
VimL
Vendored
81 lines
2.5 KiB
VimL
Vendored
" =============================================================================
|
|
" 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
|