Fish-shell: Локали UTF-8 не работают в DragonFly BSD, FreeBSD 11, 12

Созданный на 21 мая 2016  ·  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

Самый полезный комментарий

Я обнаружил эту ошибку FreeBSD . Нам все равно нужно будет исправить эту неработающую реализацию.

Все 60 Комментарий

Какую клавишу вы нажимаете? Backspace?

Если это правда, запустите bind -k backspace чтобы узнать, что он установлен, а затем запустите, например, script (или bash и нажмите ctrl + v) и нажмите клавишу, чтобы узнать, какая последовательность он отправляет. (По умолчанию скрипт помещает весь вывод этого сеанса в файл с именем «typescript» в текущем каталоге). Xterm должен послать "\ cH", который рыба должен (через terminfo, который _должен_ $ TERM быть установлен должным образом) забрать как backspace.

В будущих версиях Fish это будет немного проще с помощью небольшой вспомогательной программы под названием «fish_key_reader».

Какой у вас $ TERM установлен? «xterm»?

ключ - Backspace.
пожалуйста, пришлите мне письмо, и я открою вам свой ящик, пусть вы выясните причину.

ключ - Backspace.

Метка на ключе не сообщает нам, какую последовательность символов он отправляет. Можете ли вы установить Fish из исходного кода, извлеченного из репозитория git? Если вы можете, тогда make fish_key_reader за которым следует ./fish_key_reader нажмите клавишу возврата. Если вы не можете запустить xxd или od -tx1z нажмите клавишу возврата, а затем [ctrl-D]. Также запустите bind -k backspace и покажите нам этот результат. Также запустите echo $TERM .

Мы бы предпочли не входить в вашу систему как по причинам ответственности, так и потому, что мы не читаем по-китайски, поэтому нам будет сложно работать с set LANG zh_CN.UTF-8 .

./fish_key_reader
999999 мкс десятичное: 8 шестнадцатеричное: 8 символов: \ b (также известное как \ cH)
К вашему сведению: последовательность пилы для имени клавиши привязки "backspace"

привязать -k backspace
bind: привязка для клавиши backspace не обнаружена

echo $ TERM
xterm

bind: привязка для клавиши backspace не обнаружена

Ладно, это твоя проблема. Он должен сказать что-то вроде

bind -k backspace backward-delete-char

Я не понимаю, как это может иметь какое-либо отношение к установке переменной LANG. Вы каким-то образом переопределили привязки клавиш по умолчанию. Я бы поискал в ваших файлах _ ~ / .config / fish / _ ** упоминания слова «привязка». Кроме того, используете ли вы какие-либо менеджеры плагинов (например, fisherman или oh-my-fish), или вы установили какие-либо сторонние скрипты, которые могут иметь отношение к этой проблеме?

ХОРОШО.
~ / .config / fish / имеет только 3 файла: config.fish fish_history fishd.lhmtestdf.com

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
команда bind 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

Как вы установили Fish 2.3.0? Похоже, вы запускаете двоичный файл fish, который не может найти свои сценарии пользовательского пространства.

из источника

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.fish_ и не испытал никаких проблем. Как говорит @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 не выводит ничего, кроме приглашения оболочки? Вы должны были получить массу вывода, которая выглядит следующим образом:

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 на этой системе? Если не откуда взялся двоичный файл fish? Что произойдет, если вы вместо 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 working.outputs как:

<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 , кроме приглашения оболочки.

на другой коробке 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

fish-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 и собрал и установил Fish из 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.

Буду рад опробовать любой патч.

В списке рассылки 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. И, конечно же, все три возвращают false для iswalnum(INTERNAL_SEPARATOR) . Кроме того, мы никогда не передаем эти специальные символы функциям вроде fwprintf (), поэтому я не понимаю, почему это вообще актуально.

Действительно хороший сокращенный тестовый пример @zanchey!

Как вы устанавливаете DragonflyBSD? Я пробовал использовать ночной ISO, а также версию ISO 4.4.3 (с использованием Virtualbox) и не смог воспроизвести проблему с помощью сокращенного тестового примера fwprintf.

edit: Мне также удалось собрать и установить Fish на 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 : Похоже, это та же проблема, которую видел test -z "$name" .

@faho , Да, я просто отлаживал сбой функции псевдонима и пришел к такому же выводу. Независимо от того, объясняет ли это все эти симптомы BSD или нет, это кажется хорошим местом, чтобы копнуть глубже, поскольку строки с двойными кавычками включают один из наших внутренних токенов, VARIABLE_EXPAND_SINGLE, который находится в диапазоне зарезервированных символов Unicode.

Кроме того, я добавил операторы отладки и все используемые нами функции isw...() (например, iswalnum() ) возвращают правильный результат для этих внутренних токенов во FreeBSD 12. Итак, предложение, данное @zanchey кем-то в списке рассылки BSD определять наш собственный iswalnum бесполезно.

Фактически, вы можете довольно легко воспроизвести расширение 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...() . Но разве это лучшее решение? Это, безусловно, самый простой способ реализации. Есть ли у кого-нибудь лучшее решение?

PS Я склонен классифицировать эту проблему как «улучшение», а не как «ошибку», потому что мы говорим об улучшении Fish для обхода ошибки на одной из поддерживаемых нами платформ. Да? Нет? Какая разница? :улыбка:

PPS, я подтвердил, что переопределение платформы при условии iswalnum() устраняет эту проблему во FreeBSD 12.

Мой предпочтительный способ справиться с этим - проверить поведение во время настройки и переопределить функции тогда и только тогда, когда они несовместимы в этом отношении.

Я не собираюсь основывать переопределение функций платформы на тестах autoconf. Сначала мы видели экземпляры дистрибутивов, которые имели правильное (или неправильное) поведение в одном выпуске, а затем изменили поведение в следующем выпуске. Бинарный файл, созданный для FreeBSD 10, например, должен по-прежнему корректно работать на FreeBSD 12. Если мы основываем наше поведение на тесте autoconf, это не сработает. Во-вторых, рассматриваемые тесты чрезвычайно дешевы, даже если мы обернем их, чтобы гарантировать правильное поведение, а вызовы затронутых функций не попадают в критические циклы производительности. В-третьих, нам нужна одна из вспомогательных функций, которые это изменение представит, чтобы гарантировать, что мы не позволим пользователям вводить наши волшебные кодовые точки только для внутреннего использования (которые находятся в моем списке TODO) в наше внутреннее состояние.

Кроме того, для записи, когда я написал следующее утверждение в предыдущем комментарии, я поменял местами два дистрибутива:

С другой стороны, GNU неправильно возвращает единицу для iswgraph () для символов частного использования, начиная с 0xF600, которые мы используем, в то время как FreeBSD правильно возвращает ноль.

Согласно Unicode FAQ, кодовые точки в областях частного использования предназначены для классификации как имеющие связанный глиф (т. Е. iswgraph() должен возвращать его), но не являются буквенно-цифровыми (т. Е. iswalnum() должен возвращать нуль).

Мне кажется, что тест autoconf, проверяющий результат iswalnum () для одного из этих значений, будет работать.

Бинарные пакеты FreeBSD из портов не будут построены для другой библиотеки, отличной от целевой - это составляет основу того, как работают все наши тесты во время настройки.

Как указано, это будет излишне отменять предоставляемую системой функцию в 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 11.0-RELEASE-p1, и это серьезно меня раздражает. Вы знаете, будет ли патч интегрирован в FreeBSD 11.0-RELEASE и когда это произойдет?

Обратите внимание, что мы работаем над этой ошибкой в ​​fish, созданной из git head. Если у вас все еще возникают проблемы с рыбой из git head на BSD, дайте нам знать. Обходной путь отсутствует в Fish 2.3.1 или любой более ранней версии, но будет в следующем выпуске 2.4.0.

Это изменение довольно самодостаточно - его легко перенести на резервную копию для любого сопровождающего.

Уже в обзоре кода.
https://reviews.freebsd.org/D8148

Отлично.

@shanavar Я

Компиляция Fish из 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 рейтинги