Является ли это ошибкой в вычислении строкового выражения Vim?

#vim

#vim

Вопрос:

Я отлаживал проблему с плагином, запущенным в Vim73 на Arch Linux, и, похоже, это связано с ошибкой в вычислении строкового выражения.

В этой установке Vim выражение 'xxx' > '' оценивается в 0 (false), в то время как во всех других Vim, которые я видел, выражение оценивается (как и должно быть) в 1 (true).

Кто-нибудь знает объяснение этому? Vim Arch Linux не был скомпилирован с множеством встроенных функций, но действительно ли может быть какая-то функция, которая изменяет оценку строковых выражений?

Есть ли какие-либо настройки Vim (кодировка?) это могло изменить результат этого сравнения строк? Это была простая установка Vim (ничего примечательного в vimrc), дающая плохой результат, не видел, где можно было бы изменить настройку, даже если есть какая-то настройка, которая влияет на этот результат.

Спасибо за любую информацию.

ОБНОВЛЕНИЕ: Оказывается, эта проблема была вызвана ошибкой в функции сравнения строк в последней версии 64-разрядной Vim, когда установлен флаг Vim ‘ignorecase’. Непустая строка должна быть больше пустой строки, независимо от того, игнорируется регистр или нет, но Vim возвращал false . Отчет об ошибке здесь: http://groups.google.com/group/vim_dev/browse_thread/thread/313bc7c46a19cd40

Обходными путями были бы: (1) использовать оператор сравнения, который вызывает сравнение ‘matchcase’, например, mystring_var ># '' или (2) использовать !empty(mystring_var) .

Комментарии:

1. Можете ли вы показать фактический код, в котором используется выражение?

2. Вы можете попросить пользователя попробовать загрузить vim с помощью другого ftplugin (запустив его таким же образом), чтобы увидеть, проблема ли это в вашем плагине или в самом vim.

Ответ №1:

Чтобы узнать ответ на этот вопрос, вы должны взглянуть на документацию. Вот цитата из *41.4* Conditionals раздела:

Логические операторы работают как с числами, так и со строками. При сравнении двух строк используется математическое различие. При этом сравниваются значения байтов, которые могут быть неправильными для некоторых языков.

При сравнении строки с числом строка сначала преобразуется в число. Это немного сложно, потому что, когда строка не выглядит как число, используется нулевое число. Пример:

 :if 0 == "one"
:  echo "yes"
:endif
  

Это будет означать «да», потому что «один» не выглядит как число, таким образом, это
преобразуется в число ноль.

По-видимому, vim не гарантирует результат для операции, которую вы пытаетесь выполнить, и вам не следует полагаться на это. Если вы хотите сравнить длину строк, взгляните на *strlen()* .

Комментарии:

1. @freitass — Спасибо, но я не понимаю, как это решает мою проблему. Во-первых, я сравниваю две строки, а не строку и число. Во-вторых, при сравнении непустой строки с пустой строкой, есть ли время, когда ‘nonemptystring’ > » должен принимать значение 0? В-третьих, установка vim возвращает разные результаты для одного и того же выражения после инициализации моего ftplugin. (Смотрите ОБНОВЛЕНИЕ, о котором идет речь выше.) Я все еще чего-то здесь не понимаю?

2. Основываясь на документах vim, он не поддерживает ваше выражение, и это не означает, что vim перестанет работать при получении такого выражения, он может просто вернуть некоторый случайный ответ. Если вы не укажете мне, где в документе vim говорится, что делает «string < строка», я не могу полагаться на оператор ‘<‘ для строк. Ответ таков: используйте *strlen()* . Кстати, я все еще не знаю, что вы хотите сравнить (это длина строки?).

3. @freitass: Я думаю, вы неправильно понимаете, что говорится в документации. Здесь не говорится, что вы не можете сравнивать строки или что результаты сравнения строк могут быть случайными. Это смешно. В нем говорится, что результаты «могут быть неправильными для некоторых языков». Вот почему я спросил о кодировках в своем вопросе. Но даже при одинаковой кодировке две машины возвращают разные значения для одного и того же выражения. Я не понимаю, как это может быть правильно.

4. Извините, я действительно неправильно это понял. И, видя ваше обновление, я мало что могу сделать, поскольку я не запускаю ArchLinux.

5. В группе сообщений vim кто-то, я думаю, правильно определил проблему как связанную с использованием параметра ‘ignorecase’. Когда установлен параметр ignorecase, некоторые установки vim возвращают значение false для этого выражения: 'anystring' > '' . Я думаю, это должно быть связано с недостатком либо в дизайне, либо в реализации ‘ignorecase’, но я все еще пытаюсь разобраться. (теперь интересно, происходит ли это только в 64-разрядной vim . . . )