Fish-shell: لا تعمل لغات UTF-8 على DragonFly BSD و FreeBSD 11 و 12

تم إنشاؤها على ٢١ مايو ٢٠١٦  ·  60تعليقات  ·  مصدر: fish-shell/fish-shell

عند وضع خط مثل:
set LANG zh_CN.UTF-8
إلى .config / fish / config.fish
ثم لا يمكن حذف أي حرف إذا كان الأمر خاطئًا.

فمثلا:

كيت

أريد حذف "e" للأمر "cat"
لكن لا يمكن حذف أي حرف
تحت 2.2.0 جيد.


إصدار الأسماك: الأسماك ، الإصدار 2.3.0

نظام التشغيل: DragonFly testdf.com 4.4-RELEASE DragonFly v4.4.1.18.gc5db8-RELEASE # 0: الخميس 28 يناير 15:02:10 CST 2016 [email protected] : / usr / obj / usr / src / sys / lhmwzy x86_64

المحاكي الطرفي أو الطرفي: xterm

bug

التعليق الأكثر فائدة

لقد فتحت هذا الخطأ FreeBSD . سنظل بحاجة إلى حل بديل لهذا التنفيذ المعطل.

ال 60 كومينتر

أي مفتاح تضغط؟ مسافة للخلف؟

إذا كان هذا صحيحًا ، فيرجى تشغيل bind -k backspace لمعرفة ما تم تعيينه عليه ، ثم قم بتشغيل على سبيل المثال script (أو bash واضغط على ctrl + v) واضغط على المفتاح لمعرفة التسلسل يرسل. (سيقوم البرنامج النصي افتراضيًا بوضع مخرجات تلك الجلسة بالكامل في ملف يسمى "typecript" في الدليل الحالي). يجب أن ترسل Xterm "\ cH" ، والتي يجب أن تلتقطها الأسماك (عبر terminfo ، والتي _تحتاج_ $ TERM لتعيينها بشكل صحيح) كمسافة للخلف.

ستجعل الإصدارات المستقبلية من الأسماك هذا الأمر أسهل إلى حد ما باستخدام برنامج مساعد صغير يسمى "fish_key_reader".

إلى ماذا تم تعيين $ TERM الخاص بك؟ "xterm"؟

المفتاح هو Backspace.
من فضلك أرسل لي رسالة ، وسأعطيك حق الوصول إلى صندوقي ، دعك تعرف السبب.

المفتاح هو Backspace.

لا تخبرنا التسمية الموجودة على المفتاح بتسلسل الأحرف الذي يرسله. هل يمكنك تثبيت الأسماك من المصدر التي تم سحبها من مستودع git؟ إذا كان بإمكانك إذن make fish_key_reader متبوعًا بـ ./fish_key_reader فاضغط على مفتاح backspace. إذا لم تتمكن من تشغيل xxd أو od -tx1z ثم اضغط على مفتاح backspace متبوعًا بـ [ctrl-D]. قم أيضًا بتشغيل bind -k backspace وأظهر لنا هذا الناتج. قم أيضًا بتشغيل echo $TERM .

نفضل عدم تسجيل الدخول إلى نظامك لأسباب تتعلق بالمسؤولية ولأننا لا نقرأ اللغة الصينية ، لذا سيكون من الصعب علينا التعامل مع set LANG zh_CN.UTF-8 .

./fish_key_reader
999999 استخدام dec: 8 hex: 8 char: \ b (aka \ cH)
لمعلوماتك: المنشار تسلسل لربط اسم مفتاح "مسافة للخلف"

ربط -k مسافة للخلف
ربط: لم يتم العثور على ربط للمفتاح "backspace"

صدى $ TERM
إكستريم

ربط: لم يتم العثور على ربط للمفتاح "backspace"

حسنًا ، هذه مشكلتك. يجب أن تقول شيئًا مثل

bind -k backspace backward-delete-char

لا أرى كيف يمكن أن يكون لذلك أي علاقة بإعداد متغير LANG. لقد تجاوزت بطريقة ما روابط المفاتيح الافتراضية. أود البحث في ملفات _ ~ / .config / fish / _ ** الخاصة بك للإشارة إلى كلمة "ربط". أيضًا ، هل تستخدم أي من مديري المكونات الإضافية (على سبيل المثال ، الصياد أو oh-my-fish) أو هل قمت بتثبيت أي نصوص برمجية أخرى لجهات خارجية قد تكون ذات صلة بهذه المشكلة؟

حسنا.
يحتوي ~ / .config / fish / على 3 ملفات فقط

cat config.fish
set LANG zh_CN.UTF-8
cat fishd.lhmtestdf.com 
# This file is automatically generated by the fish.
# Do NOT edit it directly, your changes will be overwritten.
SET __fish_init_1_50_0:\x1d
SET __fish_init_2_3_0:\x1d
SET fish_color_autosuggestion:555\x1eyellow
SET fish_color_command:005fd7\x1epurple
SET fish_color_comment:red
SET fish_color_cwd:green
SET fish_color_cwd_root:red
SET fish_color_end:green
SET fish_color_error:red\x1e\x2d\x2dbold
SET fish_color_escape:cyan
SET fish_color_history_current:cyan
SET fish_color_host:normal
SET fish_color_match:cyan
SET fish_color_normal:normal
SET fish_color_operator:cyan
SET fish_color_param:00afff\x1ecyan
SET fish_color_quote:brown
SET fish_color_redirection:normal
SET fish_color_search_match:\x2d\x2dbackground\x3dpurple
SET fish_color_selection:\x2d\x2dbackground\x3dpurple
SET fish_color_user:green
SET fish_color_valid_path:\x2d\x2dunderline
SET fish_greeting:Welcome\x20to\x20fish\x2c\x20the\x20friendly\x20interactive\x20shell\x0aType\x20\x1b\x5b32mhelp\x1b\x5b30m\x1b\x28B\x1b\x5bm\x20for\x20instructions\x20on\x20how\x20to\x20use\x20fish
SET fish_key_bindings:fish_default_key_bindings
SET fish_pager_color_completion:normal
SET fish_pager_color_description:555\x1eyellow
SET fish_pager_color_prefix:cyan
SET fish_pager_color_progress:cyan

تحت الأسماك 2.2.0
ربط الأمر ouput:

bind
bind '' self-insert
bind \n execute
bind \ck kill-line
bind \cy yank
bind \t complete
bind \e\n commandline\ -i\ \\n
bind \e\[A up-or-search
bind \e\[B down-or-search
bind -k down down-or-search
bind -k up up-or-search
bind \e\[C forward-char
bind \e\[D backward-char
bind -k right forward-char
bind -k left backward-char
bind -k dc delete-char
bind -k backspace backward-delete-char
bind backward-delete-char
bind \e\[H beginning-of-line
bind \e\[F end-of-line
bind \e\[1\~ beginning-of-line
bind \e\[4\~ end-of-line
bind -k home beginning-of-line
bind -k end end-of-line
bind -k sdc backward-delete-char
bind \e\eOC nextd-or-forward-word
bind \e\eOD prevd-or-backward-word
bind \e\e\[C nextd-or-forward-word
bind \e\e\[D prevd-or-backward-word
bind \eO3C nextd-or-forward-word
bind \eO3D prevd-or-backward-word
bind \e\[3C nextd-or-forward-word
bind \e\[3D prevd-or-backward-word
bind \e\[1\;3C nextd-or-forward-word
bind \e\[1\;3D prevd-or-backward-word
bind \e\eOA history-token-search-backward
bind \e\eOB history-token-search-forward
bind \e\e\[A history-token-search-backward
bind \e\e\[B history-token-search-forward
bind \eO3A history-token-search-backward
bind \eO3B history-token-search-forward
bind \e\[3A history-token-search-backward
bind \e\[3B history-token-search-forward
bind \e\[1\;3A history-token-search-backward
bind \e\[1\;3B history-token-search-forward
bind \ca beginning-of-line
bind \ce end-of-line
bind \ey yank-pop
bind \cw backward-kill-path-component
bind \cp history-search-backward
bind \cn history-search-forward
bind \cf forward-char
bind \cb backward-char
bind \ct transpose-chars
bind \et transpose-words
bind \eu upcase-word
bind \ec capitalize-word
bind \ backward-kill-word
bind \eb backward-word
bind \ef forward-word
bind \e\[1\;5C forward-word
bind \e\[1\;5D backward-word
bind \e\[1\;9A history-token-search-backward
bind \e\[1\;9B history-token-search-forward
bind \e\[1\;9C forward-word
bind \e\[1\;9D backward-word
bind \e. history-token-search-backward
bind -k ppage beginning-of-history
bind -k npage end-of-history
bind \e\< beginning-of-buffer
bind \e\> end-of-buffer
bind \el __fish_list_current_token
bind \ew 'set tok (commandline -pt); if test $tok[1]; echo; whatis $tok[1]; commandline -f repaint; end'
bind \cl 'clear; commandline -f repaint'
bind \cc 'commandline ""'
bind \cu backward-kill-line
bind \ed kill-word
bind \cd delete-or-exit
bind -k f1 __fish_man_page
bind \eh __fish_man_page
bind \ep __fish_paginate
bind -k btab complete-and-search
bind \e cancel
bind \e\[I 'begin;end'
bind \e\[O 'begin;end'

ولكن تحت fish-2.3.0 ، خرج ربط الأمر:

bind
bind '' self-insert
bind \n execute
bind \r execute
bind \t complete
bind \cc 'commandline ""'
bind \cd exit
bind \ce bind

كيف قمت بتثبيت الأسماك 2.3.0؟ يبدو أنك تقوم بتشغيل برنامج ثنائي للأسماك لا يمكنه العثور على نصوص مساحة المستخدم الخاصة به.

من المصدر

git clone
autoconf
configure
gmake
gmake install

حسنًا ، هذا يبدو معقولًا. ماذا تخرج الأوامر التالية:

echo $__fish_active_key_bindings
echo $fish_function_path

هل يوجد _fish_default_key_bindings.fish_ في أحد أدلة مسار الوظيفة (عادةً ما يكون آخر دليل مدرج)؟ لدي فضول بشأن ما ينتج عن functions fish_default_key_bindings . لا تقم بنسخ هذا الناتج ولصقه ولكن يجب أن يتطابق مع ما هو موجود في ملف _fish_default_key_bindings.fish_. أيضًا ، يتم عادةً إعداد روابط المفاتيح بواسطة البرنامج النصي ___ fish_config_interactive.fish_ الذي يجب أن يكون في أحد المجلدات المدرجة بواسطة مسار الوظيفة var.

عندما أحذف .config / fish / config.fish ، كل شيء يعمل بشكل جيد.
ولكن عندما أضع السلسلة set LANG zh_CN.UTF-8 على .config / fish / config.fish أو /usr/local/etc/fish/config.fish ، تأتي المشكلة.

لا ينتج echo $__fish_active_key_bindings أي شيء.

المخرجات echo $fish_function_path :
/home/lhm/.config/fish/functions /usr/local/etc/fish/functions /usr/local/share/fish/vendor_functions.d /usr/local/share/fish/functions

عندما أحذف .config / fish / config.fish أو أعلق على جميع الأسطر في /usr/local/etc/fish/config.fish ، تكون النواتج:

الناتج echo $__fish_active_key_bindings :
fish_default_key_bindings

الناتج echo $fish_function_path :
/home/lhm/.config/fish/functions /usr/local/etc/fish/functions /usr/local/share/fish/vendor_functions.d /usr/local/share/fish/functions

الملف fish_default_key_bindings.fish موجود في /usr/local/share/fish/functions/fish_default_key_bindings.fish

يبدو أن الأسماك لا تحدد روابط المفاتيح أبدًا.

هذا إما لأن __fish_config_interactive (الذي يتضمن إعداد الربط) لا يتم تشغيله أبدًا (والذي يجب أن يكون قبل موجهك الأول مباشرةً) أو لأن $ fish_key_bindings الخاص بك فارغ (ربما يجب أن نعود إلى الروابط الافتراضية إذا كانت القيمة غير صالح).

نظرًا لأنه يبدو أنه يتم تشغيله عن طريق تعيين $ LANG ، فإنه يشير إلى مشكلة في الترميز.

قد تكون جميع ملفات التكوين وملف fishd لطيفة في شكل أصلي لأنني لست متأكدًا مما إذا كان github يحاول بشكل مفيد إصلاح الترميز. أيضًا ، ما هي قيمة $ LANG الخاصة بك إذا لم تقم بتعيينها في config.fish؟ (يجب أن يكون متوافقًا مع ASCII ، لأنه بخلاف ذلك لا أعتقد أنه يمكننا حتى قراءة ملفاتنا الخاصة ، لكنك لا تعرف أبدًا)

أضفت set LANG zh_CN.UTF-8 إلى سمكتي _config. ولم أواجه أي مشاكل. كما يقول faho ، يبدو أن هذا يمثل مشكلة في ترميز الأحرف. على وجه التحديد ، لم يتم ترميز ملفات الأسماك الخاصة بك على أنها UTF-8. ماذا يشير file /usr/local/share/fish/functions/__fish_config_interactive.fish ؟ إذا كانت تقول "ASCII text" ، فأضف سطر LANG الخاص بك ، ثم ابدأ قذيفة جديدة مثل هذه لتجميع ناتج تصحيح الأخطاء:

script
fish -d5
exit
exit

ثم أرفق ملف _typescript_ بهذه المشكلة.

file /usr/local/share/fish/functions/__fish_config_interactive.fish
/usr/local/share/fish/functions/__fish_config_interactive.fish: ASCII text

cat typescript output:
Script started on Mon May 23 07:34:02 2016
@ ~/home/lhm> /usr/local/bin/fish -d5
@ ~/home/lhm> exit

@ ~/home/lhm> exit

بحق الجحيم؟ أنت تقول أن fish -d5 لم ينتج أي مخرجات بخلاف مطالبة shell؟ يجب أن تكون قد حصلت على الكثير من المخرجات التي تشبه ما يلي:

fish: Continue job 1, gid 0 (fish_title), COMPLETED, NON-INTERACTIVE
fish: proc::read_try('fish_title')
fish: io_buffer_t::read: blocking read on fd 3

هل DragonFly إشارة إلى https://www.dragonflybsd.org/؟ أتساءل عما إذا كان هذا النص الموجود على صفحة الويب ، "نظام محلي جديد" ، مناسبًا. هل قمت ببناء سمكة من git head على هذا النظام؟ إذا لم يكن الأمر كذلك ، من أين أتت الأسماك الثنائية؟ ماذا يحدث إذا كنت بدلاً من ذلك set LANG C أو set LANG en_US.UTF-8 .

نعم ، https://www.dragonflybsd.org/ هي الصفحة الرئيسية للمشروع.
أقوم بالبناء من مصدر git مثل:

git clone
autoconf
configure
gmake
gmake install

يمكن لـ LANG C فقط أن تجعل عمل fish -d5 مخرجات مثل:

<2> fish: sourcing /usr/local/share/fish/config.fish
<4> fish: Exec job 'builtin source /usr/local/share/fish/config.fish' with id 1
<4> fish: Exec job 'set -g IFS \n\ \t' with id 2
<3> fish: Skipping fork: no output for internal builtin 'set'
<3> fish: Set status of set -g IFS \n\ \t to 0 using short circuit
<3> fish: Job is constructed
<4> fish: Continue job 2, gid 0 (set -g IFS \n\ \t), COMPLETED, NON-INTERACTIVE
<4> fish: Exec job 'status --is-interactive' with id 2
<3> fish: Skipping fork: no output for internal builtin 'status'
<3> fish: Set status of status --is-interactive to 0 using short circuit
<3> fish: Job is constructed
<4> fish: Continue job 2, gid 0 (status --is-interactive), COMPLETED, NON-INTERACTIVE
<4> fish: Exec job 'not set -q NVIM_LISTEN_ADDRESS' with id 2
<3> fish: Skipping fork: no output for internal builtin 'set'
<3> fish: Set status of not set -q NVIM_LISTEN_ADDRESS to 1 using short circuit
<3> fish: Job is constructed
<4> fish: Continue job 2, gid 0 (not set -q NVIM_LISTEN_ADDRESS), COMPLETED, NON-INTERACTIV

set LANG en_US.UTF-8 هي نفس نتيجة set LANG zh_CN.UTF-8 ، ولم ينتج عنها أي مخرجات بخلاف مطالبة shell.

على صندوق DF 4.4 آخر

/usr/local/bin/fish -d5
There is no fish_key_bindings function called: 'fish_default_key_bindings'
Reverting to default bindings
There is no fish_key_bindings function called: 'fish_default_key_bindings'
Reverting to default bindings
There is no fish_key_bindings function called: 'fish_default_key_bindings'
Reverting to default bindings
There is no fish_key_bindings function called: 'fish_default_key_bindings'
Reverting to default bindings
There is no fish_key_bindings function called: 'fish_default_key_bindings'
Reverting to default bindings
There is no fish_key_bindings function called: 'fish_default_key_bindings'
Reverting to default bindings
There is no fish_key_bindings function called: 'fish_default_key_bindings'
Reverting to default bindings

الأسماك 2.2.0 يعمل بشكل جيد.

حسنًا ، من الواضح أن هناك عدم توافق بين دوال الأسماك ودالات حرف DragonFly العريضة أو خطأ في الأخير. هل يمكنك الوصول إلى نظام DragonFly 4.3 الذي يمكنك بناء الأسماك عليه واختبارها؟ سيكون من الجيد لو تمكنا من البدء بتأكيد أن التغييرات التي تم إدخالها على الدعم المحلي لـ DragonFly 4.4 هي التغيير الرئيسي.

لقد اختبرت أحدث سمكة على صندوق 4.2-RELEASE DragonFly ، كل شيء يعمل بشكل جيد.

cat .config/fish/config.fish 
set -gx LANG zh_CN.UTF-8

locale
LANG="zh_CN.UTF-8"
LC_CTYPE="zh_CN.UTF-8"
LC_COLLATE="zh_CN.UTF-8"
LC_TIME="zh_CN.UTF-8"
LC_NUMERIC="zh_CN.UTF-8"
LC_MONETARY="zh_CN.UTF-8"
LC_MESSAGES="zh_CN.UTF-8"
LC_ALL=""


/usr/local/bin/fish -v
fish, version 2.3.0-162-g85e701f

uname -a
DragonFly . 4.2-RELEASE DragonFly v4.2.4-RELEASE #6: Sun Aug  9 13:25:14 EDT 2015     [email protected]:/usr/obj/home/justin/release/4_2/sys/X86_64_GENERIC  x86_64

حسنًا ، من فضلك تحدث إلى مسؤولي صيانة DragonFly. أنا لا أقول أن الخطأ يكمن في شفراتهم. لكن من المرجح أن يكون لديهم تفسير لماذا لا تؤدي وظائف مثل mbrtowc() و wcrtomb() إلى النتيجة المتوقعة عندما تستدعيها الأسماك. من المستبعد جدًا أن يؤثر هذا السلوك على الأسماك فقط.

يمكنني إعادة إنتاج هذا على DragonFly BSD 4.5-DEVELOPMENT أيضًا ، مع أي لغة UTF-8 (مثل en_AU.UTF-8 ).

@ krader1961
لذا ، هل يمكن أن تعطيني حالة اختبار لاختبار وظائف mbrtowc () و wcrtomb ()؟

حسنًا ، من فضلك تحدث إلى مسؤولي صيانة DragonFly. أنا لا أقول أن الخطأ يكمن في شفراتهم. لكن من المرجح أن يكون لديهم تفسير لماذا لا تؤدي وظائف مثل mbrtowc () و wcrtomb () إلى النتيجة المتوقعة عندما تستدعيها الأسماك. من المستبعد جدًا أن يؤثر هذا السلوك على الأسماك فقط.

لذا ، هل يمكن أن تعطيني حالة اختبار لاختبار وظائف mbrtowc () و wcrtomb ()؟

كنت سأقترح

$ gmake fish_tests
$ ./fish_tests convert

لكن هذا لا يفشل. إجراء جميع الاختبارات عبر ./fish_tests فشل في عدة اختبارات ولكن لا شيء من شأنه أن يفسر هذه المشكلة.

لقد قمت بتثبيت DragonFly 4.4.3 وقمت ببناء وتركيب الأسماك من git head. بدء تشغيل الأسماك بـ set -x LANG en_US.UTF-8 في _config.fish_ أدى إلى حدوث الكثير من الأخطاء غير المتوقعة مثل

alias: Name cannot be empty
There is no fish_key_bindings function called: 'fish_default_key_bindings'
Reverting to default bindings

ليس من المستغرب أن يظهر bind عددًا قليلاً جدًا من روابط المفاتيح نظرًا لأن الارتباطات الافتراضية ضئيلة للغاية. أبلغ الأمر locale عن C حتى قمت بتعيينه صراحة على en_US.UTF-8 . السابق يعمل بينما الأخير لا يعمل. حقيقة أن اللغة الافتراضية للنظام هي "C" بدلاً من "en_US.UTF-8" أمر مدهش. هل يشير ذلك إلى أن مطوري DragonFly يدركون أن دعم UTF-8 لديه مشاكل؟

قد أقضي أو لا أقضي المزيد من الوقت في تصحيح هذا. أنا أشجعك على التحدث إلى مسؤولي صيانة DragonFly لأنهم من المحتمل أن يكونوا قادرين على تقديم نظرة ثاقبة حول هذه المشكلة.

لدي حقيبة اختبار صغيرة جدًا مع fwprintf ، لذلك سأطلب أنواع DragonFly BSD.

سأكون سعيدا لاختبار أي رقعة.

يقول روميك في القائمة البريدية لـ

لقد نظرت إلى المحلل اللغوي في fish-shell ، فأنت تستخدم أحرفًا خاصة مباشرة في تدفق الإدخال لتمييز أشياء مختلفة ، مثل BRACKET_BEGIN و BRACKET_END و BRACKET_SEP و INTERNAL_SEPARATOR وما إلى ذلك.

هذا جيد حتى تقابل اللغة التي تكون فيها الأحرف أعضاء كاملين في الأبجدية.
كما ترى ، نطاق Unicode هو 0x0 إلى 0x10FFFF ، والرمز INTERNAL_SEPARATOR له رمز 0xFDD7.

في وظيفة DragonFly BSD تتحقق وظيفة iswalnum () من جميع المواقع في وقت واحد ، لذلك
أن لديك ثلاثة خيارات:
1) استخدم iswalnum الخاص بك ():

diff --git a/src/common.h b/src/common.h
index e59dfc0..e8c01c3 100644
--- a/src/common.h
+++ b/src/common.h
@@ -769,4 +769,8 @@ __attribute__((noinline)) void debug_thread_error(void);
 /// specified base, return -1.
 long convert_digit(wchar_t d, int base);

+inline int iswalnum(wchar_t chr) {
+ return((chr >= L'a' && chr <= L'z') || (chr >= L'A' && chr <= L'Z') || iswdigit(chr));
+}
+
 #endif

2) استخدم قيمًا أكبر لأحرفك الخاصة (لم أختبر هذا).

3) شيء آخر :)

أتساءل عما إذا كان هذا الشخص يعرف أي شيء عن Unicode. هذه "الأحرف الخاصة" هي أحرف منطقة للاستخدام الخاص تم تعريفها على أنها ليست أبجدية: https://en.wikipedia.org/wiki/Unicode_character_property#General_Category. لقد اختبرت هذا على OS X و Linux و DragonFly. وبالتأكيد ، فإن النتائج الثلاثة جميعها خاطئة مقابل iswalnum(INTERNAL_SEPARATOR) . أيضًا ، لا نقوم أبدًا بتمرير هذه الأحرف الخاصة إلى وظائف مثل fwprintf () ، لذلك لا أرى سبب أهمية ذلك.

حالة اختبار مخفضة لطيفة حقًاzanchey!

كيف تقوم بتثبيت DragonflyBSD؟ لقد جربت مع ISO ليليًا وكذلك إصدار ISO 4.4.3 (باستخدام Virtualbox) ولم أتمكن من إعادة إنتاج المشكلة مع حالة الاختبار المخفضة fwprintf.

تحرير: تمكنت أيضًا من بناء الأسماك وتثبيتها على 4.4.3 ، وتجتاز الاختبارات أيضًا ، باستثناء اختبارات المخطر.

حالة الاختبار تفشل فقط عبر SSH - إنها تعمل في وحدة تحكم النظام في VirtualBox.

أوه ، واو. هل تستخدم Vagrant؟

كلا ، فقط برنامج VirtualBox 5.0.20 عادي.

سأحصل على ملكية هذا بعد إغلاق # 3406 كنسخة مكررة. سأحاول إيجاد الوقت لتثبيت FreeBSD وإعادة إنتاج المشكلة وإذا نجحت في تصحيحها أكثر.

lhmwzy هذه على الأرجح نفس مشكلة # 3406. لمعلوماتك ، قمت بتقسيم هذه المشكلة الأخيرة وتتبعها للالتزام f2246dfb343bea19beb176fb2cc534f85513b2eb.

من التحديث الخاص بي إلى الإصدار رقم 3406 (لاحظ أنني أعمل الآن مع FreeBSD 12 بدلاً من DragonFly BSD):

لمعلوماتك ، لقد قمت بتثبيت FreeBSD 12 ويمكنني إعادة إنتاج هذه المشكلة. السبب في عدم عمل أي من المفاتيح هو أن روابط المفاتيح الافتراضية لم يتم إعدادها في لغة UTF-8:

Reverting to default bindings
The function call stack limit has been exceeded. Do you have an accidental infinite loop?
fish: __fish_reload_key_bindings VARIABLE SET fish_key_bindings
      ^
in event handler: handler for variable 'fish_key_bindings'

توجد أخطاء أخرى أيضًا مثل alias: Name cannot be empty . لقد أكدت أيضًا أن البناء من git checkout f2246df~ لا يظهر المشكلة. وهو أمر مدهش للغاية بالنسبة لي بصفتي مؤلف هذا التغيير.

عمل جيد في العثور على الالتزام حيث تباعد السلوك. ومع ذلك ، ليس من الواضح لي ما هو الخطأ في ذلك.

توجد أخطاء أخرى مثل الاسم المستعار: لا يمكن أن يكون الاسم فارغًا

@ krader1961 : يبدو أن هذه هي نفس المشكلة floam saw: علامات الاقتباس التي تحتوي على متغيرات فقط فيها test -z "$name" .

faho ، نعم ، كنت أقوم فقط وتوصلت إلى نفس النتيجة. سواء كان ذلك يفسر جميع أعراض BSD هذه أم لا ، يبدو أنه مكان جيد للبحث بشكل أعمق نظرًا لأن السلاسل ذات الاقتباس المزدوج تتضمن أحد الرموز المميزة الداخلية الخاصة بنا ، VARIABLE_EXPAND_SINGLE ، الموجودة في نطاق أحرف unicode المحجوز.

أضفت أيضًا بيانات تصحيح الأخطاء وجميع وظائف isw...() التي نستخدمها (على سبيل المثال ، iswalnum() ) تُرجع النتيجة الصحيحة لتلك الرموز المميزة الداخلية على FreeBSD 12. لذا فإن الاقتراح الذي قدمه شخص ما إلى

في الواقع ، يمكنك إعادة إنتاج توسيع var داخل مشكلة سلسلة ذات علامات اقتباس مزدوجة بسهولة تامة باستخدام لغة UTF-8 على BSD:

$ set wtf b
$ echo a "$wtf" c
a  c
$ echo "a $wtf c"
a b c
$ echo "a $wtf"
a
$ echo "$wtf c"
b c

بالتأكيد يستحق التعمق في ما يحدث عند إنهاء مرجع var باقتباس مزدوج. كل الأمثلة المذكورة أعلاه تعمل بشكل جيد مع LC_ALL = C.

كنت مخطئًا عندما قلت قبل بضع ساعات أن iswalnum() أعاد الإجابة الصحيحة على FreeBSD. لقد أطلقت خطأً على هذه الوظيفة في إخراج التصحيح الخاص بي قبل استدعاء setlocale("") . يُظهر نقل مطبوعات التصحيح تلك أن كتلة نقطة الرمز 32 التي تبدأ من 0xFDD0 تؤدي إلى إرجاع iswalnum() و iswgraph() واحدًا بدلاً من القيمة الصحيحة ، صفر ، على FreeBSD ولكن ليس GNU. من ناحية أخرى ، يُرجع GNU بشكل غير صحيح واحدًا مقابل iswgraph() لحروف الاستخدام الخاص بدءًا من 0xF600 التي نستخدمها بينما تُرجع FreeBSD صفرًا بشكل صحيح.

لذلك يبدو أننا سنضطر إلى تنفيذ أغلفة خاصة بنا حول هذه الوظائف للحصول على السلوك الصحيح بغض النظر عن النظام الأساسي. أحتاج إلى التفكير قليلاً في كيفية القيام بذلك بأقل قدر من التعليمات البرمجية الإضافية وطبقات مربكة من التجريد.

لقد فتحت هذا الخطأ FreeBSD . سنظل بحاجة إلى حل بديل لهذا التنفيذ المعطل.

لقد أنشأنا بالفعل النمط الذي يجب أن يستدعي رمز السمك fish_wcswidth() بدلاً من wcswidth() . لقد كرسنا ذلك كقاعدة cppcheck (انظر _.cppcheck.rule_). يمكننا أن نفعل الشيء نفسه مع مجموعة وظائف isw...() . لكن هل هذا هو الحل الأفضل؟ إنه بالتأكيد الأسهل في التنفيذ. هل لديها أفضل حل؟

ملاحظة ، أنا أميل إلى تصنيف هذه المشكلة على أنها "تحسين" بدلاً من "خطأ" لأننا نتحدث عن تحسين الأسماك للتغلب على خطأ في أحد الأنظمة الأساسية التي ندعمها. نعم؟ لا؟ من يهتم؟ :ابتسامة:

PPS ، لقد تحققت من أن تجاوز النظام الأساسي المقدم iswalnum() إصلاح هذه المشكلة على FreeBSD 12.

الطريقة المفضلة للتعامل مع هذا هي التحقق من السلوك في وقت التكوين ، وتجاوز الوظائف إذا وفقط إذا كانت غير متوافقة في هذا الصدد.

لن أقوم بتجاوز وظائف النظام الأساسي في اختبارات التشغيل التلقائي. أولاً ، لقد رأينا حالات توزيعات لها سلوك صحيح (أو غير صحيح) في إصدار واحد ثم قلب السلوك في إصدار لاحق. على سبيل المثال ، يجب أن يظل البرنامج الثنائي المصمم لـ FreeBSD 10 يعمل بشكل صحيح على FreeBSD 12. إن اعتماد سلوكنا على اختبار تلقائي لا يعالج ذلك. ثانيًا ، الاختبارات المعنية رخيصة للغاية حتى لو قمنا بلفها لضمان السلوك الصحيح واستدعاءات الوظائف المتأثرة ليست في حلقات الأداء الحرجة. ثالثًا ، نحتاج إلى إحدى الوظائف المساعدة التي سيقدمها هذا التغيير للتأكد من أننا لا نسمح للمستخدمين بحقن نقاط الشفرة للاستخدام الداخلي السحري فقط (الموجودة في قائمة TODO الخاصة بي) في حالتنا الداخلية.

أيضًا ، للتسجيل عندما كتبت البيان التالي في تعليق سابق ، قمت بعكس التوزيعين:

من ناحية أخرى ، يُرجع GNU بشكل غير صحيح واحدًا لـ iswgraph () من أجل استخدام أحرف خاصة تبدأ من 0xF600 التي نستخدمها بينما تُرجع FreeBSD صفرًا بشكل صحيح.

وفقًا لأسئلة Unicode FAQ في مناطق الاستخدام الخاص ، من المفترض أن يتم تصنيفها على أنها تحتوي على حرف رسومي مرتبط (على سبيل المثال ، يجب أن يُرجع iswgraph() واحدًا) ولكنها ليست أبجدية رقمية (على سبيل المثال ، يجب إرجاع iswalnum() صفر).

يبدو لي أن اختبارًا تلقائيًا للتحقق من نتيجة iswalnum () على إحدى هذه القيم.

لن يتم إنشاء حزم FreeBSD الثنائية من المنافذ مقابل libc مختلف عن الهدف - وهذا يشكل الأساس لكيفية عمل جميع اختبارات وقت التكوين الخاصة بنا.

كما تم الالتزام ، سيؤدي ذلك إلى تجاوز الوظيفة التي يوفرها النظام بشكل غير ضروري على Linux و OS X أيضًا ، @ krader1961.

تم بناء Fish وربطها ديناميكيًا مقابل libc مشترك على FreeBSD:

$ ldd fish
fish:
        libncurses.so.8 => /lib/libncurses.so.8 (0x800948000)
        libthr.so.3 => /lib/libthr.so.3 (0x800b9c000)
        libc++.so.1 => /usr/lib/libc++.so.1 (0x800dc3000)
        libcxxrt.so.1 => /lib/libcxxrt.so.1 (0x801082000)
        libm.so.5 => /lib/libm.so.5 (0x8012a0000)
        libc.so.7 => /lib/libc.so.7 (0x8014cb000)
        libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x801885000)

هل تقول على يقين 100٪ أنه إذا تغير سلوك النظام الفرعي المحلي فإن libc.so سيتغير رقم الإصدار؟ ليس لدي الوقت ولا الرغبة في استكشاف هذا السؤال. أفضل أن أكون متحفظًا نظرًا لأن إصلاحي لن يؤثر بشكل ملحوظ على سلوك أو أداء الأسماك.

هل تقول على يقين 100٪ أنه إذا تغير سلوك النظام الفرعي المحلي فإن libc.so سيتغير رقم الإصدار؟

"ليست مشكلتنا".

"ليست مشكلتنا"

بالطبع هذه مشكلتنا. هذا هو سبب وجود fish_wcswidth() وحلول مماثلة للتطبيقات المعطلة.

الخطأ موجود في أداة localedef التي تنشئ ملفات ctype ، وقد نشأت مع Illumos. ثابت على DF هنا:

https://github.com/DragonFlyBSD/DragonFlyBSD/commit/07ed7d329a83714ec268e2f3ce026bba5a1ac5c2

jrmarino : شكرا على المعلومات! هل تعرف متى سينتقل هذا إلى أنظمة تشغيل مختلفة؟ هل تغيير DF يحصل بالفعل على المستخدمين؟

تم التثبيت على FreeBSD أيضًا https://svnweb.freebsd.org/base؟view=revision&revision=306782

شكرا جزيلا لعميدتك! لقد قمت للتو بالترقية إلى FreeBSD 11.0-RELEASE-p1 ، وهذا أمر مزعج للغاية. هل تعرف ما إذا كان سيتم دمج التصحيح في FreeBSD 11.0-RELEASE أو متى سيتم ذلك؟

لاحظ أننا نعمل على حل هذا الخطأ في الأسماك المبنية من git head. إذا كنت لا تزال تواجه مشكلات مع الأسماك من git head على BSD ، فأخبرنا بذلك. الحل ليس في الأسماك 2.3.1 أو أي إصدار سابق ولكن سيكون في الإصدار 2.4.0 القادم.

التغيير قائم بذاته إلى حد ما - يجب أن يكون من السهل دعمه لأي مشرفين هناك.

بالفعل في مراجعة التعليمات البرمجية.
https://reviews.freebsd.org/D8148

عظيم.

سأقوم بدمج

تجميع الأسماك من git يعمل بالنسبة لي على FreeBSD 11.0-RELEASE-p1:

sudo pkg remove fish
sudo pkg install autoconf  gmake
git clone [email protected]:fish-shell/fish-shell.git
cd fish-shell
autoconf
./configure
gmake
sudo gmake install

ثم أضف /usr/local/bin/fish إلى /etc/shells وقم بتشغيل chsh -s fish لتغيير قوقعتك إلى Fish.

لذلك لم أكن الشخص الوحيد الذي يعاني من هذه المشاكل. شكرًا لكم جميعًا على التصحيح ، لقد كان هذا يقودني إلى الجنون.

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات