#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 . . . )