2010-10-20 2 views
6

в -w и -W варианты Vim имеют теоретически следующий эффект:используя -W вариант Vim

-w {scriptout} Все символы, которые вы печатаете записаны в «scriptout» файл , пока не выйдете из Вима. Это полезно, если вы хотите создать файл сценария, который будет использоваться с «vim -s» или «: source!». Когда файл «scriptout» уже существует, добавляются новые символы . См. Также | complex-repeat |. {scriptout} не может начать с цифры. {не в Vi}

-W {scriptout} Подобно -w, но не добавляйте, перезапишите существующий файл. {не в Vi}

Но когда я делаю это, файл {scriptout} всегда будет начинаться с шестнадцатеричной последовательностью, как 80 fd 60 (иногда это 80 fd 62).

Я использую gvimportable.exe 7.3 из portableapps.com. С переключателем -u NONE он делает то же самое.

Для чего это «магическое число»? В Windows с gvim.exe я не могу воспроизвести свой сценарий до тех пор, пока не удалю эти три ведущих байта ...

Похоже, что эта функция, которая может быть очень полезной, плохо документирована.

Благодарим за ответы.

+0

Когда я тестировал с помощью опции '-W', vim не добавлял лишних символов в начало файла. Вы должны попробовать еще раз, не используя '.vimrc', используя' vim -u NONE -W somefile' –

+0

Вот что я сделал ... все-таки 'vim -u NONE -W scriptout', ZQ и' xxd' my_scriptout покажет '80fd 605a 51 '(..'ZQ) – Benoit

+0

Я посмотрел на это пару недель назад и не смог воспроизвести его в Linux ... теперь, когда я знаю, что вы используете мой gVim Portable (yay!), Я попробую еще раз в Windows и посмотрим, смогу ли я это понять. (Завтра, а не сегодня.) –

ответ

6

(Этот ответ, вероятно, фрагментирован значительно, мне потребовалось некоторое время, чтобы поиграть - я тоже хотел найти решение, потому что это заинтриговало меня - не только щедрость 200: П. Это более или менее показывает мой ход мысли и экспериментирование.)

Теперь я могу воспроизвести его с помощью gvim на Linux, то есть /usr/bin/vim.gnome -g; бег как vim -g делает так же.


Копаясь в код: (бесполезно в этом случае, но весело делать и научиться делать)

Я просмотрел исходный код, и теперь я могу объяснить это несколько (но не полезно!); он получает outfile FILE (src/globals.h:1004) комплект (src/main.h:2275); это затем записывается в src/getchar.h:1501 в методе updatescript, который используется gotchars (строка 1215), который используется vgetorpeek, который используется vgetc и vpeekc ... (нет, я не знаю, где это происходит!), то они используются в ряде мест.

В любом случае, я полагаю, что ключ находится где-то в src/gui.c, но я не знаю, где на данный момент! Также возможно, что некоторая ключевая последовательность «отправляется» (физически или практически, я не знаю), но, видя, что проблема одинакова на разных платформах, скорее всего, это проблема Vim, чем в противном случае.


Интересные ситуации приводит к вероятному объяснению:

Также стоит отметить, что если вы автоматически бросить курить, gvim -u NONE -w scriptout -c quit (:quit после загрузки) или gvim -u NONE -w scriptout -c quit (мгновенное :quit, никогда не показывает GUI), то файл сценария остается пустым.

Кроме того, если вы открыты Gvim, а затем закройте его с помощью кнопки X, не нажимая ни одной клавиши:

0000000: 80fd 6280 fd63 80fd 62     ..b..c..b 

Если открыть Gvim, щелкнуть по кнопке, нажмите назад и использовать :q:

0000000: 80fd 6280 fd63 80fd 6280 fd2c 80fd 2e3a ..b..c..b..,...: 
0000010: 710d          q. 

Итак, я думаю, что события окна внутренне переведены на что-то другое. 80 fd 62 - открытая последовательность, а 80 fd 63 80 fd 62 - близкая последовательность.

Я нашел еще один способ запускать 80fd, что приводит меня к тому, что это своего рода «пользователь имеет доступ к окну»; по умолчанию с GNOME в Ubuntu, Ctrl + Alt + S что-то делает с окном (не помню, как он называется, переводит его в строку заголовка, приложение внутри теряет управление клавиатурой и т. д.). gvim ... (вы знаете, аргументы!), я<Ctrl + Alt + S (контракт) Ctrl + Alt + S (расширенный) >EscZ Q производит это для я:

0000000: 80fd 6269 3c80 fd63 80fd 623e 1b5a 51 ..bi<..c..b>.ZQ 

Реферат:, так что у нас есть то, на что я верю, это решение; gVim ловит оконные сообщения в той или иной форме и - должен ли он или не должен - помещает их в свой scriptout. Если вы думаете, что это не должно (или хотели бы знать, почему они остались или если они даже предназначены или вам вообще нужно заботиться), спросите, пожалуйста, в списке Vim.

+0

Обратите внимание, что это тестирование было выполнено полностью на Linux, как только я обнаружил, что проблема проявляется там, а также в Windows. Если вы хотите, я могу поиграть с ним аналогичным образом в Windows, или вы можете. Я думаю, вы найдете примерно то же самое: делать что-то с самим окном, ставит вещи в сценарий. –

1

Мое лучшее предположение, что это ошибка в коде GUI gVim.

Использование gVim 7.3, если я запустил gvim -u NONE -W scriptout, тогда я вижу проблему, но если я запустил vim -u NONE -W scriptout, тогда ненужных байтов нет.

Я также протестировали Vim 7.2 из оболочки в Linux, версии Vim включены в Snow Leopard (7.2), а также графический интерфейс пользователя и терминальные версии MacVim 7,2 (с mvim -W и /Applications/MacVim/Contents/MacOS/Vim -W, соответственно), и все они правильно работали.

+0

Благодарим вас за ответ.Вероятно, я обязан заглянуть в код, чтобы узнать, почему он это делает. Не могли бы вы попробовать это и под Linux? – Benoit

+0

@Benoit Yup, отлично работает на Linux, и как с терминала, так и с GUI на OS X. Я отредактировал свой ответ, чтобы показать это. – Rich