Есть ли способ заставить мои emacs распознавать мои псевдонимы bash и пользовательские функции, когда я запускаю команду оболочки?

В моей оболочке у меня есть псевдонимы и пользовательские функции. Когда я нахожусь в экземпляре emacs (я всегда использую emacs -nw) и выполняю команду оболочки (M-!), Я не могу их использовать. Это имеет смысл, поскольку я представляю, что он запускает собственный подоболочек для этого... но есть ли способ (может быть, в моем .emacs), чтобы заставить это работать? Может быть, даже если это связано с поиском среды по умолчанию перед выполнением какой-либо команды оболочки?

Ответы

Ответ 1

Ниже приведены мои комментарии к тому, что, по моему мнению, связано с вопросом:

Я думаю, что команды M-x shell-command и M-x compile выполняют команды в нижней оболочке через call-процесс. Попробуйте следующее в вашем .emacs(или просто оцените):

(setq shell-file-name "bash")
(setq shell-command-switch "-ic")

Я заметил, что после оценки выше, псевдонимы .bashrc выбираются для использования как с командой M-x shell-command, так и с M-x компиляцией, i.e

M-x скомпилировать RET your_alias RET

должен работать.

Моя среда: Emacs 24.1 (preest rc1), OSX 10.7.3

Источник

Ответ 2

Прочитайте http://www.gnu.org/software/bash/manual/bashref.html#Bash-Startup-Files

Для неинтерактивных оболочек единственным исходным файлом является значение переменной среды BASH_ENV. Вы вызываете emacs как BASH_ENV=~/.bashrc emacs , если emacs будет использовать bash для команд оболочки - в некоторых программах специально используется "/bin/sh"

Ответ 3

Чтобы получить shell-command для чтения ~/.bashrc перед выполнением команды в соответствии с методикой, описанной в fooobar.com/questions/288976/..., без потенциальных побочных эффектов из-за того, что $BASH_ENV определен для всего сеанса Emacs, попробуйте это в ~/.emacs.d/init.el (или .emacs):

;; I want M-! (shell-command) to pick up my aliases and so run .bashrc:
(setq shell-file-name "bash-for-emacs.sh")  ; Does this: BASH_ENV="~/.bashrc" exec bash "[email protected]"
(setq shell-command-switch "-c")

Как описано в комментарии во второй строке, также установите (в вашем $PATH) скрипт с именем bash-for-emacs.sh который содержит:

#!/bin/bash

BASH_ENV="~/.bashrc" exec bash "[email protected]"

Обратите внимание, что ваш ~/.bashrc может потребоваться изменить для определения неинтерактивных псевдонимов, даже если [ -z "$PS1" ] истинно (что указывает на неинтерактивную оболочку). Этот подход я использую для своей собственной среды (такой, как она есть), которая находится по адресу https://github.com/jcburley/UnixHome.

Кроме того, это предполагает, что вы хотите использовать Bash в качестве созданной в Emacs оболочки, как и я.

Ответ 4

Нам нужно включить расширение псевдонимов в неинтерактивных оболочках, предпочтительно только тогда, когда они вызываются из emacs (чтобы избежать тонких различий при запуске других оболочек). Мне удалось создать два файла: ~/.alias содержит все мои псевдонимы, например

alias python python27

и ~/.aliasExpand имеет

source ~/.alias
shopt -s expand_aliases

Я также, конечно, заменил все мои псевдонимы в .bashrc на

source ~/.alias

Наконец, я добавил это в мой .emacs:

(setenv "BASH_ENV" "~/.aliasExpand")

Я попробовал решение Keith Flower (сделать оболочки интерактивными), и я получил

bash: невозможно установить группу процессов терминала (-1): не подходит ioctl для устройства bash: в этой оболочке нет управления заданиями

Обратите внимание, что я получил это через намеки Гленна Джекмана и Николаса Дудебо.

Если вы готовы рисковать тем, что у всех ваших оболочек есть расширение псевдонимов, и вы не против запустить все свои .bashrc для каждой оболочки emacs, вы можете упростить это, добавив

shopt -s expand_aliases

на ваш .bashrc и

(setenv "BASH_ENV" "~/.bashrc")

к вашему .emacs

Ответ 5

Поместите псевдонимы и функции в .bashrc, а не .bash_profile. Последний выполняется только в оболочках входа, первый - во всех оболочках.