2013-07-12 2 views
-5

Фоновый сценарий: когда я отлаживал один VimScript, некоторый код не выполняется. Причина в том, что unmap вызывает одну ошибку, и VimScript выходит из этой ошибки. Поскольку вокруг кода стоит один пустой try-catch, это не очень очевидно, в чем проблема. После окончательного определения проблемы я начинаю думать, что это поведение по умолчанию не очень интуитивное.vim удалить ненужное сопоставление

Это простой код для иллюстрации того, что vim сообщает об ошибке при удалении несуществующего сопоставления экспериментально. В последней строке это не удастся, сказав, что «E31: нет такого отображения».

map <F10> :echo 'hello' 
unmap <F10> 
unmap <F10> 

К сожалению, я не смог найти какой-либо документ о таком поведении. Мог бы кто-нибудь указать мне, где я могу объяснить, как удалить ненужное сопоставление? Какова рациональность этого дизайна? Лично я рассматривал бы удаление не существующих сопоставлений как одно нормальное утверждение и продолжал бы, как обычно.

EDIT: Может возникнуть некоторое недоразумение по этому вопросу. Я не спрашиваю, как подавить ошибку. Я хотел бы знать, почему vim думает, что удаление одного не существующего сопоставления является одной ошибкой. Это так серьезно?

Как указано в ответах и ​​комментариях, это философия unix, чтобы поднять одну ошибку, когда она могла выполнить задание. Я полностью согласен с этим, но в оболочке сценарий продолжает по ошибке по умолчанию, поэтому одни и те же рассуждения не следует применять.

PS: Как было рекомендовано, этот вопрос был перенесен на vim-dev.

+2

Посмотрите на ': help E31' для ссылки doc – FDinoff

+0

@FDinoff Это только документы, когда возникает эта ошибка, а не почему vim вызывает эту ошибку. –

+1

@AlbertNetymk [«Вы должны задавать только практические, ответные вопросы, основанные на реальных проблемах, с которыми вы сталкиваетесь».] (Http://stackoverflow.com/help/dont-ask) Вот почему я думаю, что этот вопрос не очень подходит для Stackoverflow. – glts

ответ

0

Похоже, вы можете редактировать файл, в котором хранится сопоставление, и вручную удалять его, если необходимо. Вот ссылка с некоторыми более подробной информации:

Removing a keymap

2

Вы можете подавить любую ошибку, предваряя :silent!, т.е.

:silent! unmap <F10> 

Есть и другие способы (например, условная проверка ли maparg('<F10>', 'n') пуста), но это канонический способ выполнить команду и игнорировать любые ошибки.

+0

Nice трюк. Моя идея прервать ошибку - обернуть ее внутри одной попытки. Ваш гораздо более элегантный. Однако это не то, что я хочу спросить изначально. См. Раздел «Редактированный вопрос» для уточнения вопроса. –

+0

@AlbertNetymk Один 'try..catch' - лучший способ, если вы абсолютно не уверены, что« такое сопоставление »не является единственной ошибкой, которую может показать вам. Примечание: один 'try..catch/\ C \ V \^Vim (unmap): E31: /', а не catch без шаблона. – ZyX

4

Он не работает, потому что do_map возвращает 2 для неизвестного отображения и this code вызывает ошибку для этого случая. Наверное, это не очень полезно. Аннотате говорит, что этот код не изменился с самой первой версии vim, найденной в ртутном хранилище (7.0001).

Там могут быть разные ответы: я догадываюсь из трех:

  1. VI совместимость: vi было бросать и так должны ВИМ делать
  2. это правильно, что нужно сделать: если команда не делать то, что это было предложено сделать это следует отчет о сбое
  3. предоставляет больше возможностей: если unmapping в существующих отображение является существенным вы можете поймать ошибку, используя :try .. :catch (или оставить как есть указывает на ошибку пользователю), если она нет, всегда есть silent!.Аргумент для EAFP основных адептов и пользователей с крошечным vim: в VimL с использованием maparg() для проверки существования чаще встречается, но для этого требуется +eval (если я не ошибаюсь :try делает это также: весь смысл ex_eval.c содержание файла, где эта команда определяется с помощью #if defined(FEAT_EVAL) || defined(PROTO)).

Но Stackoverflow не подходит для того, чтобы задавать такие вопросы. Для такого старого кода только Брэм может знать ответ, и поэтому вопрос следует задать на vim-dev. Если бы я был им, я бы спросил, почему вам нужен ответ.

+0

Спасибо за подробное объяснение. [Link] (https://bitbucket.org/ZyX_I/vim/src/5bb04d03dfa843c1080ed3872daacc42caa86542/src/ex_docmd.c#cl-8406). Re: 1. Я получаю это поведение с 'nocompatible'. Re: 2. он уже достиг нужного конечного результата, сопоставление теперь не существует. Re: 3. Всегда есть «молчание!», Но то, что я допрашиваю, - это поведение по умолчанию. Это не очень интуитивно. PS: к этому вопросу добавляется объяснение того, почему я задаю этот вопрос. Как и было рекомендовано, он перемещается в vim-dev. Благодарю. –

+0

@AlbertNetymk Ссылка исправлена ​​(нажал соответствующие изменения, на самом деле не изменил ссылку). – ZyX

+0

@AlbertNetymk Re1: Если вы считаете, что вся совместимость vi заканчивается при установке 'nocompatible', вы абсолютно ошибаетесь. Re2: Вы попросили сделать какую-то работу: * unmap *, вы не спросили о конечном результате. Работа не была выполнена. Re3: существует ошибка ': silent' to * suppress *. Не существует ': unsilent', чтобы заставить его кидать (существующий': unsilent' отменяет эффект 'silent'). – ZyX

Смежные вопросы