patch 9.1.1432: GTK GUI: Buffer menu does not handle unicode correctly
Problem: GTK GUI: Buffer menu does not handle unicode correctly
Solution: Get rid of the BMHash() function (SUN Haitao)
fixes: #17403
closes: #17405
Signed-off-by: SUN Haitao <sunhaitao@devtaste.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
diff --git a/runtime/menu.vim b/runtime/menu.vim
index c9acf76..afe61d6 100644
--- a/runtime/menu.vim
+++ b/runtime/menu.vim
@@ -2,7 +2,7 @@
" You can also use this as a start for your own set of menus.
"
" Maintainer: The Vim Project <https://github.com/vim/vim>
-" Last Change: 2023 Aug 10
+" Last Change: 2025 Jun 04
" Former Maintainer: Bram Moolenaar <Bram@vim.org>
" Note that ":an" (short for ":anoremenu") is often used to make a menu work
@@ -693,12 +693,7 @@
if s:bmenu_count == &menuitems && s:bmenu_short == 0
s:BMShow()
else
- var name = expand("<afile>")
- var num = str2nr(expand("<abuf>"))
- if s:BMCanAdd(name, num)
- s:BMFilename(name, num)
- s:bmenu_count += 1
- endif
+ s:BMRedraw()
endif
endif
enddef
@@ -746,6 +741,10 @@
s:bmenu_count = 0
s:bmenu_items = {}
+ s:BMRedraw()
+enddef
+
+def s:BMRedraw()
# Remove old menu, if it exists; keep one entry to avoid a torn off menu to
# disappear. Use try/catch to avoid setting v:errmsg
try
@@ -768,26 +767,30 @@
unmenu &Buffers.Dummy
# figure out how many buffers there are
+ var buffer_menu_items = []
var buf = 1
while buf <= bufnr('$')
- if s:BMCanAdd(bufname(buf), buf)
- s:bmenu_count = s:bmenu_count + 1
+ var name = bufname(buf)
+ if s:BMCanAdd(name, buf)
+ add(buffer_menu_items, [substitute(name, ".", '\L\0', ""), name, buf])
endif
buf += 1
endwhile
+ s:bmenu_count = len(buffer_menu_items)
+
if s:bmenu_count <= &menuitems
s:bmenu_short = 0
endif
# iterate through buffer list, adding each buffer to the menu:
- buf = 1
- while buf <= bufnr('$')
- var name = bufname(buf)
- if s:BMCanAdd(name, buf)
- call s:BMFilename(name, buf)
- endif
- buf += 1
- endwhile
+ sort(buffer_menu_items)
+
+ var i = 0
+ for menu_item in buffer_menu_items
+ s:BMFilename(menu_item[1], menu_item[2], i)
+ i += 1
+ endfor
+
s:bmenu_wait = 0
aug buffer_list
au!
@@ -796,22 +799,6 @@
aug END
enddef
-def s:BMHash(name: string): number
- # Make name all upper case, so that chars are between 32 and 96
- var nm = substitute(name, ".*", '\U\0', "")
- var sp: number
- if has("ebcdic")
- # HACK: Replace all non alphabetics with 'Z'
- # Just to make it work for now.
- nm = substitute(nm, "[^A-Z]", 'Z', "g")
- sp = char2nr('A') - 1
- else
- sp = char2nr(' ')
- endif
- # convert first six chars into a number for sorting:
- return (char2nr(nm[0]) - sp) * 0x800000 + (char2nr(nm[1]) - sp) * 0x20000 + (char2nr(nm[2]) - sp) * 0x1000 + (char2nr(nm[3]) - sp) * 0x80 + (char2nr(nm[4]) - sp) * 0x20 + (char2nr(nm[5]) - sp)
-enddef
-
def s:BMHash2(name: string): string
var nm = substitute(name, ".", '\L\0', "")
if nm[0] < 'a' || nm[0] > 'z'
@@ -832,17 +819,16 @@
enddef
" Insert a buffer name into the buffer menu.
-def s:BMFilename(name: string, num: number)
+def s:BMFilename(name: string, num: number, index: number)
var munge = s:BMMunge(name, num)
- var hash = s:BMHash(munge)
var cmd: string
if s:bmenu_short == 0
s:bmenu_items[num] = munge
- cmd = 'an ' .. g:bmenu_priority .. '.' .. hash .. ' &Buffers.' .. munge
+ cmd = 'an ' .. g:bmenu_priority .. '.9999.' .. index .. ' &Buffers.' .. munge
else
var menu_name = s:BMHash2(munge) .. munge
s:bmenu_items[num] = menu_name
- cmd = 'an ' .. g:bmenu_priority .. '.' .. hash .. '.' .. hash .. ' &Buffers.' .. menu_name
+ cmd = 'an ' .. g:bmenu_priority .. '.9999.0.' .. index .. ' &Buffers.' .. menu_name
endif
exe cmd .. ' :confirm b' .. num .. '<CR>'
enddef