Emacs: бродяга не работает
Я пытался открыть удаленный файл через Emacs через Tramp.
(require 'tramp)
(setq tramp-default-method "ssh")
Я получаю сообщение от Emacs
Tramp: ожидание подсказок от удаленной оболочки
Emacs завис и не реагировал ни на какие действия после этого
Emacs был установлен в Windows; удаленный файл был на машине с Linux.
5 ответов
Если учетная запись, к которой вы подключаетесь, использует какое-то странное необычное приглашение оболочки, то есть большая вероятность, что это то, что делает путешествие бродягой.
Войдите в систему как root, затем введите
PS1="> "
(это обычная стандартная оболочка (ZSH, BASH, younameit), которая tramp
поймете) затем переключитесь на учетную запись пользователя и запустите emacs -q
(чтобы убедиться, что ваш .emacs
не вызывает этот беспорядок) и попытаться C-x C-f /sudo:root@localhost:/etc/hosts
и посмотри что к чему.
Вы можете (не рекомендуется) также настроить регулярное выражение, которое определяет, что ожидает tramp:
M-x customize-variable RET tramp-terminal-prompt-regexp
Мой подход:
- Убедитесь, что переменная
tramp-terminal-type
установлен на "немой"
M-x customize-variable RET tramp-terminal-type
- Проверьте это в вашем.* Shrc и подайте правильную подсказку:
case "$TERM" in "dumb") PS1="> " ;; xterm*|rxvt*|eterm*|screen*) PS1="my fancy multi-line \n prompt > " ;; *) PS1="> " ;; esac
Ваш ssh-клиент для Windows - здесь ключ, а метод Tramp 'ssh' почти наверняка неверен.
Если вы используете Cygwin, то вам нужно использовать метод 'sshx', и вам, вероятно, нужно использовать ssh-agent для обработки аутентификации. Подробности здесь: Возможно использование tramp с EmacsW32 и cygwin?
Я предполагаю, что то же самое относится к любому автономному клиенту ssh, который не требует полной установки Cygwin, но использует библиотеки DLL Cygwin. (Я упоминаю об этом, потому что я почти уверен, что помню такую вещь.)
Если вы используете PuTTY, то вам нужен метод plink, как указал Алекс Отт. Если Wiki не достаточно, поиск здесь, вероятно, найдет решения для настройки этого подхода.
Другие альтернативы, которые я могу предложить:
Используйте Cygwin-native Emacs. Это будет медленнее, чем NTEmacs, но, похоже, Tramp хорошо работает с методом 'ssh', и также работает запрос пароля.
Разместите виртуальную машину Linux на своем компьютере с Windows и запустите Emacs на этом. Это довольно большой прыжок, но я предпочитаю использовать Tramp при работе в Windows.
Ну, это дефект бродяги.
Реальное решение состоит в том, чтобы предотвратить загрузку .bashrc
когда tramp
используется. (потому что теперь это PS1, но это может быть PATH или любая другая вещь, которая .bashrc
будет делать это будет вызывать недовольство tramp
...).
Это можно сделать, попросив ssh установить переменную окружения и протестировав ее в .bashrc
:
Добавьте это к ~/.emacs
:
(require 'tramp-sh nil t)
(setf tramp-ssh-controlmaster-options (concat "-o SendEnv TRAMP=yes " tramp-ssh-controlmaster-options))
и что в начале ~/.bashrc
:
if [ ! -z ${TRAMP-x} ] ; then
return
fi
Еще один дефолт tramp
является то, что он не имеет переменной для передачи случайных аргументов ssh
команда, мы должны вернуться на tramp-ssh-controlmaster-options
,
Вы проверили Emacs Wiki для решения? ssh
в PATH
? Также рекомендуется использовать plink
в MS Windows - см. раздел "Встроенные методы" в документации по Tramp
Если проблема заключается в вашем необычном пользовательском приглашении в удаленной оболочке, простой обходной путь - добавить в свой .bashrc
или эквивалент:
if [[ $TERM == "dumb" ]]; then
export PS1="$ "
fi
После того, как вы определите свой PS1
.
Примечание: благодарность за ChasingLogic, так как это их предложение в этой теме.
Кстати - если нужно tramp
в sudo
- Вы можете фактически sudo без бродяги, используя sudoedit
,
В настоящее время я использую эту функцию bash:
erf () { SUDO_EDITOR="emacsclient -a emacs" sudoedit $@; }