Как лучше всего открывать удаленные файлы с помощью emacs и ssh

80

Я подключаюсь к удаленной машине с помощью ssh user@192.168.1.5. Когда мне нужно открыть файл на удаленном компьютере, я делаю это, например,

emacs /usr/share/nginx/html/index.html

и это открывает index.htmlфайл в оболочке. Я заметил, что некоторые команды emacs работают, а другие нет. Например, C-wне работает; M-<не работает. Как я могу это исправить и как лучше всего работать с emacs и ssh?

Я нашел этот вопрос, но он еще больше сбил меня с толку.

Зейнель
источник
1
Какие примеры действительно работают? (Иногда на удаленном компьютере существуют разные сочетания клавиш - проверьте свой файл .emacs на удаленном компьютере - и иногда весь ключ работает по-другому - например, экран GNU по умолчанию поглощает часть команды Ctrl-A, прежде чем она сможет попасть в emacs.)
kbshimmyo
1
C-space, CF, Cg work
Зейнель
Мне не удалось найти файл .emacs на удаленной машине, но я знаю, что не делал никаких новых привязок клавиш на другой машине
Зейнель
да, я не уверен, что приводит к тому, что этот набор сочетаний клавиш не работает. Открывает ли emacs файл на удаленном сервере в том же режиме, в котором он открывал бы его локально (где все команды работали)? Возможно, это может дать ключ к разгадке M-x describe-mode.
kbshimmyo
Вы также запускаете emacs на своем локальном компьютере? Есть ли причина, по которой вы хотите использовать удаленный emacs по сравнению с локальным?
Карл Гронер

Ответы:

157

Обычно я предпочитаю открывать удаленные файлы из локального экземпляра Emacs.

При запуске Emacs на вашем локальном компьютере открытие удаленного файла через ssh не сильно отличается от открытия любого другого файла, за исключением немного другого синтаксиса .

Для ssh вы можете ввести C-x C-f. Теперь в минибуфере, который вы хотите ввести /ssh:user@host:/path/to/file(обратите внимание, что завершение табуляции будет работать, когда вы начнете вводить путь. Также обратите внимание на ведущий /символ). См. Полную документацию здесь .

В вашем примере это будет:

C-x C-f /ssh:user@192.168.1.5:/usr/share/nginx/html/index.html

Теперь вы можете редактировать удаленные файлы через ssh в Emacs, используя вашу локальную конфигурацию и любые установленные пакеты и т. Д.

Карл Гронер
источник
24
OP может быть интересно узнать, что эта функция называется: trampи это одна из самых полезных вещей, которые вы когда-либо будете использовать. Он даже компилируется удаленно!
pmr
Это отлично работает, и все команды работают, но я вижу, что он не позволяет мне редактировать, index.htmlпотому что он говорит, что буфер доступен только для чтения. Но я могу редактировать тот же файл, если открою его на удаленном компьютере. Кстати, когда я открыл файл с C-x C-f /ssh:user@host filenameним, меня спросили пароль.
Zeynel
Я попробовал другой файл из каталога Documents, и я смог отредактировать его без проблем.
Zeynel
Вы знаете, как указать порт с этим?
Филип Киркбрайд,
5
@PhilipKirkbride Полный документированный синтаксис/method:user@host#port:filename
Карл
28

Чтобы добавить к ответу выше, вы можете написать ярлыки для компьютеров, которые вы часто используете:

(defun connect-remote ()
  (interactive)
  (dired "/user@192.168.1.5:/"))

Это откроет diredбуфер на удаленной машине. Вы можете перемещаться по этому буферу, как по локальному.

Если вы настроили ключи ssh для удаленного компьютера, вам даже не нужно вводить пароль.

Если у вас есть несколько удаленных машин, вы можете дать узнаваемое имя каждой функции, например connect-cupcake, connect-kitkatи использовать smexpackage для завершения.

abo-abo
источник
Это замечательно. Я попробую. У вас также есть ответ на вопрос, который я задал в комментарии выше: я могу отредактировать этот файл, /usr/share/nginx/html/index.htmlесли открою его на удаленной машине; но когда я открываю его с помощью ssh, он доступен index.htmlтолько для чтения. Почему это?
Zeynel
Я предполагаю, что вы не подключаетесь к пользователю root, и обычно только он может писать /usr/share/.
abo-abo
но как мне подключиться как пользователь root? Я пробовал такие вещи, C-x C-f /sudo ssh:user@host filenameно это не сработало.
Zeynel
1
Это проблема, которую я пытался решить некоторое время назад, но безуспешно. Я могу использовать tramp для подключения к удаленному или для подключения к локальному как sudo, но не то и другое одновременно. Обходной путь - стать владельцем /usr/share/nginx/html/папки с расширением chown.
abo-abo
Я открыл файл, /etc/nginx/sites-available/example.com.confотредактировал его, сохранил и закрыл. Теперь я его снова открыл, и на этот раз не могу его редактировать? Я предполагаю, что это связано с разрешениями. Вы можете помочь мне понять, почему это происходит?
Zeynel
18

А чтобы добавить в пост @ abo-abo о "ярлыках" -

Используйте закладки Emacs. Просто создайте закладки обычно, когда вы посещаете удаленный файл или каталог. Затем просто используйтеC-x r bдля перехода к удаленной закладке, имя которой вы указываете (с завершением).

Если вы используете Bookmark +, то удаленные закладки выделяются специальным образом *Bookmark List*, чтобы вам было легче их распознать. А удаленные закладки, к которым необходимо получить доступ с помощью suили sudo( root), выделяются по-другому.

Если вы используете Dired +, вы также можете быстро добавить в закладки несколько удаленных файлов или каталогов, посетив их удаленный каталог в Dired, отметив их и нажав C-x b. Не нужно давать названия закладкам; они названы в честь файлов. Даже если вы никогда не используете эти закладки для перехода к удаленным файлам, вы можете использовать их с тегами Bookmark + для организации файлов и, таким образом, работы с их подмножествами.

Если вы используете Icicles, то всякий раз, когда вы используете команду для перехода к закладке, вы можете сузить список кандидатов для завершения до тех, которые являются удаленными, нажав C-M-@во время завершения.

Нарисовал
источник
10

Оригинальный плакат выразил заинтересованность в открытии удаленных файлов от имени пользователя root. Это можно сделать с помощью команды:

C-x C-f /ssh:you@remotehost|sudo:remotehost:/path/to/file RET

Дополнительную документацию можно найти здесь: https://www.emacswiki.org/emacs/TrampMode#toc14

Alex
источник
3

Простой ответ, касающийся удаленной машины:

Если я планирую работать с emacs на удаленной машине, я использую

ssh -X username@hostname

а затем запустить emacs в удаленном сеансе, чтобы снова отобразить на моем локальном компьютере. Это старый вопрос, но я хотел бы добавить его для полноты картины. Конечно, есть некоторые проблемы с конфигурацией xhost / X, но во многих сетях это сработает сразу же!

JimLohse
источник
2

Режим SSH для emacs - это то, что вы ищете.

Как только вы его настроите, вы просто запустите

M-x ssh RET hostname RET

Затем он дважды запрашивает ваш пароль (один раз для командной строки, один раз для загрузки файлов).

По большей части вы можете обращаться с ней как с любой другой оболочкой (неинтерактивная и с некоторыми незначительными отличиями, но это все).

Он отслеживает, в каком каталоге вы находитесь, поэтому, когда вы хотите открыть файл из каталога, который вы просматриваете, он автоматически запускается в правильном каталоге, и вам просто нужно ввести имя файла.

Emacs Wiki также имеет больше информации.

Дрейк Собания
источник