Режим C (и конкретно c-mode-map
переменная), обеспечивается названным пакетом cc-mode
, нет c-mode
.
(eval-after-load 'cc-mode
'(define-key c-mode-map (kbd "C-") 'compile))
Для Вашего другого метода, поскольку уже ответил vschum, Вы пропускаете список аргументов в Вашем defun
. Кроме того, c-mode-common-hook
не правильное место для этого: это выполнилось каждый раз, когда Вы переходите к режиму C. Правильное время для добавления привязки - когда режим C загружается; можно сделать это любой через генерала eval-after-load
механизм как выше, или через c-initialization-hook
:
(defun my-c-mode-common-hook ()
(define-key c-mode-map (kbd "C-") 'compile))
(add-hook 'c-initialization-hook 'my-c-mode-common-hook)
Стандарт POSIX 2008 года имеет описание раздела "Shell и Утилиты". Обычно, если Вы придерживаетесь этого, Ваши сценарии должны довольно соответствовать требованиям завтрашнего дня, кроме возможно для депрекаций, но они едва происходят в течение ночи, таким образом, у Вас должно быть много времени для обновления сценариев.
В некоторых случаях, где выходной формат для единственной утилиты значительно различается через платформы и версии, стандарт POSIX может включать опцию, обычно названную -p
или -P
который указывает гарантируемый и предсказуемый выходной формат. Пример этого time
утилита, которая имеет широко переменные реализации. При необходимости в стабильном API/выходном формате Вы использовали бы time -p
.
Если необходимо использовать утилиту фильтра, которая не охвачена стандартом POSIX, то Вы в значительной степени во власти поставщиков программного блока распределения / восходящие разработчики, как Вы во власти удаленных веб-разработчиков при выполнении веб-очистки.
Я попытаюсь ответить на основе своего опыта.
Команды действительно не придерживаются формальной спецификации, но они действительно придерживаются требования, чтобы использовать и генерировать ориентированный на строку на текст.
Да, конечно. Прежде чем утилиты GNU стали фактическим стандартом, у большого количества поставщиков будет изворотливый вывод, особенно относительно ps
и ls
. Это вызвало много боли. Сегодня, только HP поставляет суперизворотливые команды. Исторически, утилиты Berkeley Software Distribution (BSD) были главным разрывом с прошлым. Спецификация POSIX была разрывом с прошлым, но теперь это широко принято.
Команды Unix действительно назревали со временем. Все еще не невозможно повредить некоторый сценарий, записанный для более старой версии. Думайте о недавней тенденции к UTF-8 как кодирование текстового файла. Это изменение требовало изменять основные утилиты как tr
. В прошлом простым текстом был почти всегда ASCII (или что-то закрывается), таким образом, прописные буквы сформировали числовой диапазон, также, как и строчные буквы. Это больше не верно с UTF-8, таким образом, tr
добирается, чтобы принять, что различные параметры командной строки указывают вещи как "прописной" или "алфавитно-цифровое".
Один из лучших способов "усилить" Ваши фильтры не состоит в том, чтобы зависеть от конкретного текстового расположения. Например, не делать cut -c10-24
, который зависит от положений строки. Использовать cut -f2
вместо этого, который прервал бы 2-е, разделенное от вкладки поле. awk
повреждения любая входная строка в 1$, 2$, 3$..., которые являются пробелом, разделенным по умолчанию. Зависьте от высокоуровневых понятий как "поля", а не понятий низшего уровня как позиция столбцов. Кроме того, используйте регулярные выражения: sed
и awk
может оба сделать вещи с регулярными выражениями, которые не заботятся о некотором различии во входе. Другой прием должен обработать вход во что-то, в отношении формата которого Ваш фильтр может быть требователен. Использовать tr -cs '[a-zA-z0-9]' '[\n]'
повредить текст в отдельное слово на строку, без пунктуации. Вы просто не заботитесь о том, на что входной текст похож в этом случае.
Во-первых, очень краткие ответы на Ваши вопросы:
При высказывании "API" Вы используете термин, который (хорошо это или плохо) подразумевает слишком много формальности вокруг конвенций ввода/вывода фильтра. Очень (и я действительно имею в виду "очень"), широко, основные конвенции для данных, которые любезны к легкой фильтрации,
Классическим примером был бы формат/etc/passwd. Но, эти конвенции по умолчанию, вероятно, нарушаются до некоторой степени чаще, чем они сопровождаются к букве.
Вашим четвертым вопросом, как защитить себя от вариаций в выходной структуре, является действительно единственный, о котором можно сделать что-либо.
В конце Вы не можете защитить себя полностью от проблем, по поводу которых Вы волнуетесь, и нет никакого единственного места для смотрения для "категорического" оператора того, что должна сделать определенная команда. Для многих сценариев оболочки, особенно записанные для персонального или небольшого использования, это просто не проблема
Только покрывая 1) Вашего вопроса.
Естественно API могут всегда изменяться в желании их создателей и таким образом повреждать зависимое программное обеспечение на любом языке. Тем не менее прекрасная идея относительно инструментов Unix, которые ввод-вывод "API" - то, что нет практически ни одного (возможно, 0x0a
как конец строки). Хороший сценарий фильтрует данные с инструментами Unix вместо того, чтобы создать его. Это означает, что Ваш сценарий может повредиться, потому что спецификация ввода или вывода изменилась, но не потому что формат ввода-вывода (снова, нет действительно одного) отдельных инструментов, используемых в измененном сценарии (потому что что-то, что действительно не существует, не может действительно измениться).
При прохождении через списка основных инструментов существуют немногие, что я также приписал бы производителя, только в противоположность фильтру:
Вот инструменты, которые ожидают конкретный формат ввода, более конкретный, чем быть потоком байтов:
Существует другая область с намного более высоким риском поломки, а именно, интерфейса командной строки. Большинство инструментов имеет отличающиеся функции и через системы и через временную шкалу. Примеры
man 1p find
например, для чтения POSIX находят страницу справочника вместо системной страницы справочника. В моей системе мне нужны установленные страницы-справочника-posix.И даже когда с помощью таких переключателей, обычно там ошибки не будут тонко представлены и отравят данные. Большинство программ просто откажется работать с неизвестным переключателем.
В заключение, я сказал бы, что оболочка имеет на самом деле потенциал того, чтобы быть одним из большинства портативных языков (это портативно, когда Вы пишете сценарий портативно). Сравните со своими любимыми языками сценариев, где тонкие ошибки происходят, или Ваш фаворит скомпилировал программу, которая уступит компиляции.
Кроме того, в редких местах, где поломка может произойти из-за несовместимостей, она, вероятно, была бы не из-за вызванного времени, но из-за разнообразия через различные системы (значение, если она работает на Вас, она сделала так за 20 лет до этого и будет через 20 лет, также). Это - заключение простоты инструментов.
Существуют только фактические стандарты IO — пробел и пустой указатель разделили вывод.
Что касается совместимости, мы обычно возвращаемся к проверке номеров версий отдельных фильтров. Не то, чтобы они изменяются очень, но когда Вы хотите использовать совершенно новую функцию и все еще хотеть, чтобы сценарий работал на более старых версиях, у Вас есть к "ifdef" он так или иначе. Нет практически никакого механизма создания отчетов возможности, сохраните для того, чтобы вручную записать тестовые сценарии.
Сценарии действительно повреждаются, некоторые чаще, чем другие. Старое и известное программное обеспечение имеет тенденцию относительно оставаться таким же и часто имеет флаги совместимости, когда оно изменяется так или иначе.
Сценарии, записанные в одной системе, имеют тенденцию продолжать работу, но часто повреждать другого.