Разнообразные команды – ЧАСТЬ 2

Emacs не  ждет,  пока подоболочка  что-либо сделает.  Можно  переключать окна или буферы и редактировать их, пока оболочка ожидает, или пока она выполняет команду. Вывод из подоболочки ждет до тех пор, пока у Emacs не появится  время на его обработку; прием происходит всякий раз, когда Emacs ожидает ввода с клавиатуры, а также когда есть свободное время.

В качестве имени файла для загрузки подоболочки используется значение переменной explicit-shell-file-name, если оно не nil.  В противном случае, используется переменная среды ESHELL если она установлена, или SHELL.  Если указанное имя файла является относительным, просматриваются каталоги в списке exec-path;  этот инициализируется по переменной среды PATH во время запуска Emacs. Ваш файл ‘.emacs’ может перекрыть одну или обе из этих инициализаций.

Чтобы указать для оболочки систему кодирования, вы можете  использовать команду C-x hRETc непосредственно  перед M-x shell.  Вы также можете задать систему кодирования после запуска оболочки с помощью команды C-x hRETp в ее буфере.  См. Раздел 18.9 [Задание кодирования], с. 168.

Как только оболочка запущена, на вход ей подается содержимое файла ‘~/.emacs_имяоболочки’, если этот файл существует,  где имяоболочки  является именем файла, из которого загружается оболочка. Например, если вы используете bash, то ей посылается файл

‘~/.emacs_bash’.

Команды  cd,  pushd и popd, передаваемые  подчиненной оболочке,  отслеживаются  в Emacs так, чтобы каталог по умолчанию  буфера ‘*shell*’ всегда совпадал с рабочим каталогом оболочки. Эти команды распознаются синтаксически проверкой посылаемых строк ввода. Если вы используете для этих команд псевдонимы, то вы можете указать Emacs, что их тоже  следует распознавать. Например, если значение  переменной shell-pushdregexp соответствует началу командной строки оболочки, то эта строка воспринимается как команда pushd. Если для ‘pushd’ используются псевдонимы, то необходимо изменить эту переменную. Аналогично, shell-popd-regexp и shell-cd-regexp используются для распознавания команд, обозначающих ‘popd’ и ‘cd’.  Причем эти команды распознаются только в начале командной строки оболочки.

Если Emacs получает ошибку при попытке  обработать то, что он считает командами ‘cd’, ‘pushd’ или ‘popd’, он запускает ловушку shell-set-directory-error-hook (см. Раздел 31.2.3 [Ловушки], с. 349).

Если Emacs не отслеживает правильно изменения текущего каталога подоболочки, ис-

пользуйте команду M-x dirs, чтобы спросить оболочку, какой у нее текущий каталог. Эта

команда работает для оболочек, поддерживающих  наиболее распространенный  синтаксис команд; она не работает с необычными оболочками.

Вы также можете использовать M-x dirtrack-mode, чтобы включить (или выключить)

альтернативный и более агрессивный  метод отслеживания изменений текущего каталога.

Emacs определяет в подоболочке переменную среды EMACS  со значением t.   Сценарий оболочки может проверить эту переменную, чтобы определить, запущен ли он из подоболочки Emacs.

30.2.3  Режим Shell

Буферы оболочки использует режим Shell, в котором определено несколько специальных ключей, привязанных к префиксу C-c. Они выбраны так, что имитируют обычные клавиши редактирования и управления заданиями, присутствующие в оболочках  вне Emacs, с той лишь разницей, что сначала вы должны набрать C-c. Ниже приведен полный список таких ключей режима Shell.

hRETi             В конце буфера, посылает строку в качестве ввода; в противном случае копирует текущую строку в конец буфера и посылает  ее (send-shell-input). При копировании строки любой текст  в ее  начале,  соответствующий переменной shell-prompt-pattern, пропускается; значение этой переменной должно быть регулярным выражением, которое соответствует подсказкам, используемым в вашей оболочке.

hTABi              Завершает имя команды или файла перед точкой в буфере оболочки (comintdynamic-complete).    hTABi  также  завершает ссылки на  историю (см.   Раздел 30.2.4.3 [Ссылки на историю], с. 328) и имена переменных среды.

Переменная shell-completion-fignore задает список расширений файлов, которые должны игнорироваться при завершении  в режиме  Shell.   Установка по умолчанию игнорирует  имена файлов, заканчивающиеся  на ‘~’,  ‘#’  или

‘%’.   Другие родственные с Comint  режимы используют переменную comintcompletion-fignore.

M-?            Временно показывает список возможных завершений имени файла перед точкой в буфере оболочки (comint-dynamic-list-filename-completions).

C-d            Либо удаляет один знак, либо посылает eof  (comint-delchar-or-maybe-eof).

Набранный в конце буфера оболочки,  C-d посылает подоболочке eof.   Набран-

ный в любой другой позиции в этом буфере, C-d удаляет один знак, как обычно.

C-c C-a      Перемещает в начало строки, но после подсказки, если она есть (comint-bol).

Если вы наберете эту команду два раза подряд, на второй раз она возвращает к метке процесса, то есть к началу ввода, который вы еще не послали  подоболочке.  (Обычно это одно и то же место — конец подсказки в текущей строке

— но после C-c hSPCметка процесса может оказаться на предыдущей строке.)

C-c hSPCi      Накапливает несколько строк ввода, и потом посылает их вместе. Эта команда вставляет перед точкой перевод строки, но не посылает предшествующий текст на вход подоболочки — по крайней мере не сейчас. Обе строки, и та, что перед переводом строки, и та, что после, будут посланы вместе (и с разделяющим их переводом строки), когда вы нажмете hRETi.

C-c C-u      Уничтожает весь текст, который еще не был послан в качестве ввода (comintkill-input).

C-c C-w     Уничтожает слово перед точкой (backward-kill-word).

C-c C-c      Прерывает оболочку или ее текущее подзадание, если оно существует (comintinterrupt-subjob).  Эта команда уничтожает также весь предназначенный для ввода текст, который еще не был послан.

C-c C-z      Останавливает оболочку или ее  текущее  подзадание, если оно  существует (comint-stop-subjob).  Эта команда уничтожает также  весь  текст,  который еще не был послан в качестве ввода.

C-c C-\       Посылает сигнал выхода оболочке или ее текущему подзаданию, если оно существует (comint-quit-subjob). Эта команда уничтожает также весь предназначенный  для ввода текст, который еще не был послан.

C-c C-o      Уничтожает  последнюю порцию вывода от команды оболочки  (comint-killoutput). Это полезно, если команда оболочки извергает много текста, который только мешает.

C-c C-r

C-M-l          Прокручивает окно так, чтобы начало последней порции вывода оказалось ввер-

ху; также перемещает туда курсор (comint-show-output).

C-c C-e      Прокручивает окно, чтобы начало последней порции вывода оказалось внизу

(comint-show-maximum-output).

C-c C-f       Перемещает вперед на одну команду оболочки, но в пределах текущей строки (shell-forward-command).  Переменная shell-command-regexp указывает, как распознать конец команды.

C-c C-b      Перемещает назад на одну команду оболочки, но в пределах текущей строки

(shell-backward-command).

C-c C-l       Показывает историю команд оболочки этого буфера  в другом  окне  (comintdynamic-list-input-ring).

M-x dirs   Спрашивает оболочку о текущем каталоге,  чтобы Emacs  скоординировался с оболочкой.

M-x send-invisible hRETтекст hRETi

Считывает текст и посылает его на вход оболочки  без эхо. Это полезно, когда команда оболочки запускает программу, спрашивающую пароль.

Или вы можете сообщить Emacs, как распознавать запросы пароля и выклю-

чать для них эхо:

(add-hook  ’comint-output-filter-functions

’comint-watch-for-password-prompt)

M-x comint-continue-subjob

Возобновляет процесс оболочки. Это полезно, если вы нечаянно приостановили процесс оболочки.1

M-x comint-strip-ctrl-m

Убирает все знаки control-M из текущей порции вывода оболочки. Наиболее удобный способ использовать  эту команду — запускать ее автоматически, когда вы получаете вывод от подоболочки. Чтобы сделать так, вычислите следующее лисповское выражение:

(add-hook  ’comint-output-filter-functions

’comint-strip-ctrl-m)

M-x comint-truncate-buffer

Эта команда усекает буфер оболочки до определенного максимального  числа строк, задаваемого переменной comint-buffer-maximum-size.  Это можно сделать автоматически каждый раз при получении вывода от подоболочки таким способом:

1  Вы не должны приостанавливать процесс оболочки. Приостановка подзадания в оболочке — это совсем другое дело, это обычная практика,  но для продолжения подзадания вы используете саму  оболочку; данная команда этого не сделает.

(add-hook  ’comint-output-filter-functions

’comint-truncate-buffer)

Режим Shell также настраивает команды работы с абзацами таким образом, что только подсказки оболочки начинают абзацы. Таким образом, абзац состоит из введенной команды плюс из следующего за ней в буфере вывода.

Режим Shell происходит от режима Comint, режима общего назначения для общения с интерактивными подпроцессами. Большинство возможностей режима Shell в действительности дает режим Comint, как вы можете  понять из имен перечисленных выше команд. Особые средства режима Shell включают выбор регулярного выражения для распознавания подсказки, средство отслеживания каталогов и несколько пользовательских команд.

Другие средства Emacs, использующие варианты режима Comint, включают GUD (см. Раздел 23.5 [Отладчики], с. 249) и M-x run-lisp (см. Раздел 23.10 [Запуск внешнего Лиспа], с. 256).

Вы можете использовать M-x comint-run для выполнения любой программы по вашему выбору в неизмененном режиме Comint — без особенностей  режима Shell.

30.2.4  История команд оболочки

Буферы оболочки поддерживают три способа  повторения более  ранних команд.  Вы можете  использовать  те  же  ключи,  что  используются в минибуфере;  они работают во многом так же,  как в минибуфере, вставляя текст предыдущих команд, всегда оставляя точку в конце буфера. Вы можете переместиться по буферу назад к предыдущим командам в их начальной позиции и затем снова послать их или скопировать в конец. Или вы можете использовать знак ‘!’ для ссылок на старые команды.

30.2.4.1  Список истории оболочки

M-p            Извлекает следующую более старую команду оболочки.

M-n            Извлекает следующую более новую команду оболочки.

M-r regexp hRETi

M-s regexp hRETi

Производит поиск команды оболочки, соответствующей регулярному выраже-

нию regexp, вперед или назад.

C-c C-x (режим Shell)

Извлекает следующую команду в списке истории.

Источник: Ричард Столмен, Руководство по GNU Emacs

Похожие посты:

Вы можете оставить комментарий, или ссылку на Ваш сайт.

Оставить комментарий