runtime(netrw): get rid of s:Strlen() and use strdisplaywidth() Commit: https://github.com/vim/vim/commit/1319009d5990764735a300fdbd0dae094604d8db Author: Luca Saccarola <github.e4...@aleeas.com> Date: Tue Jun 10 20:39:50 2025 +0200
runtime(netrw): get rid of s:Strlen() and use strdisplaywidth() closes: https://github.com/vim/vim/issues/17498 Signed-off-by: Luca Saccarola <github.e4...@aleeas.com> Signed-off-by: Christian Brabandt <c...@256bit.org> diff --git a/runtime/pack/dist/opt/netrw/autoload/netrw.vim b/runtime/pack/dist/opt/netrw/autoload/netrw.vim index 777eb08ce..45034d234 100644 --- a/runtime/pack/dist/opt/netrw/autoload/netrw.vim +++ b/runtime/pack/dist/opt/netrw/autoload/netrw.vim @@ -4676,7 +4676,7 @@ fun! s:NetrwHidden(islocal) if g:netrw_list_hide =~ '\(^\|,\)\(^\|\s\s\)\zs\.\S\+' " remove .file pattern from hiding list let g:netrw_list_hide= substitute(g:netrw_list_hide,'\(^\|,\)\(^\|\s\s\)\zs\.\S\+','','') - elseif s:Strlen(g:netrw_list_hide) >= 1 + elseif strdisplaywidth(g:netrw_list_hide) >= 1 let g:netrw_list_hide= g:netrw_list_hide . ',\(^\|\s\s\)\zs\.\S\+' else let g:netrw_list_hide= '\(^\|\s\s\)\zs\.\S\+' @@ -7765,7 +7765,8 @@ fun! s:NetrwTreeListing(dirname) let w:netrw_treetop= a:dirname let s:netrw_treetop= w:netrw_treetop " use \V in case the directory contains specials chars like '$' or '~' - elseif (w:netrw_treetop =~ ('^'.'\V'.a:dirname) && s:Strlen(a:dirname) < s:Strlen(w:netrw_treetop)) + elseif (w:netrw_treetop =~ ('^'.'\V'.a:dirname) + \ && strdisplaywidth(a:dirname) < strdisplaywidth(w:netrw_treetop)) \ || a:dirname !~ ('^'.'\V'.w:netrw_treetop) let w:netrw_treetop= a:dirname let s:netrw_treetop= w:netrw_treetop @@ -9418,7 +9419,6 @@ endfun " --------------------------------------------------------------------- " s:FileReadable: o/s independent filereadable {{{2 fun! s:FileReadable(fname) - if g:netrw_cygwin let ret = filereadable(s:NetrwFile(substitute(a:fname,g:netrw_cygdrive.'/\(.\)',' :/',''))) else @@ -10111,51 +10111,6 @@ fun! s:ShowStyle() endif endfun -" --------------------------------------------------------------------- -" s:Strlen: this function returns the length of a string, even if its using multi-byte characters. {{{2 -" Solution from Nicolai Weibull, vim docs (:help strlen()), -" Tony Mechelynck, and my own invention. -fun! s:Strlen(x) - - if exists("*strdisplaywidth") - let ret = strdisplaywidth(a:x) - - elseif type(g:Align_xstrlen) == 1 - " allow user to specify a function to compute the string length (ie. let g:Align_xstrlen="mystrlenfunc") - exe "let ret= ".g:Align_xstrlen."('".substitute(a:x,"'","''","g")."')" - - elseif g:Align_xstrlen == 1 - " number of codepoints (Latin a + combining circumflex is two codepoints) - " (comment from TM, solution from NW) - let ret = strlen(substitute(a:x,'.','c','g')) - - elseif g:Align_xstrlen == 2 - " number of spacing codepoints (Latin a + combining circumflex is one spacing - " codepoint; a hard tab is one; wide and narrow CJK are one each; etc.) - " (comment from TM, solution from TM) - let ret = strlen(substitute(a:x, '.\Z', 'x', 'g')) - - elseif g:Align_xstrlen == 3 - " virtual length (counting, for instance, tabs as anything between 1 and - " 'tabstop', wide CJK as 2 rather than 1, Arabic alif as zero when immediately - " preceded by lam, one otherwise, etc.) - " (comment from TM, solution from me) - let modkeep= &l:mod - exe "norm! o\<esc>" - call setline(line("."),a:x) - let ret = virtcol("$") - 1 - d - NetrwKeepj norm! k - let &l:mod = modkeep - - else - " at least give a decent default - let ret = strlen(a:x) - endif - return ret -endfun - -" --------------------------------------------------------------------- " --------------------------------------------------------------------- " s:TreeListMove: supports [[, ]], [], and ][ in tree mode {{{2 fun! s:TreeListMove(dir) diff --git a/runtime/pack/dist/opt/netrw/autoload/netrw/fs.vim b/runtime/pack/dist/opt/netrw/autoload/netrw/fs.vim index a8d8d6bfd..8f3fa5fc8 100644 --- a/runtime/pack/dist/opt/netrw/autoload/netrw/fs.vim +++ b/runtime/pack/dist/opt/netrw/autoload/netrw/fs.vim @@ -25,7 +25,7 @@ endfunction function! netrw#fs#ComposePath(base, subdir) if has('amiga') - let ec = a:base[s:Strlen(a:base)-1] + let ec = a:base[strdisplaywidth(a:base)-1] if ec != '/' && ec != ':' let ret = a:base . '/' . a:subdir else -- -- You received this message from the "vim_dev" maillist. Do not top-post! Type your reply below the text you are replying to. For more information, visit http://www.vim.org/maillist.php --- You received this message because you are subscribed to the Google Groups "vim_dev" group. To unsubscribe from this group and stop receiving emails from it, send an email to vim_dev+unsubscr...@googlegroups.com. To view this discussion visit https://groups.google.com/d/msgid/vim_dev/E1uP3y8-00BplP-4N%40256bit.org.