Есть ли способ заставить мои 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
. Последний выполняется только в оболочках входа, первый - во всех оболочках.