Was ist der beste Weg, um Remote-Dateien mit Emacs und SSH zu öffnen

79

Ich verbinde mich mit dem Remote-Computer mit ssh [email protected]. Wenn ich eine Datei auf dem Remote-Computer öffnen muss, z.

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

und das öffnet die index.htmlDatei in der Shell. Ich habe festgestellt, dass einige emacs-Befehle funktionieren, andere jedoch nicht. Zum Beispiel C-wfunktioniert nicht; M-<funktioniert nicht. Wie kann ich das beheben und wie arbeite ich am besten mit Emacs und SSH?

Ich fand diese Frage, aber es machte mich verwirrter.

Zeynel
quelle
1
Was sind einige Beispiele für Befehle, die funktionieren? (Manchmal sind auf dem Remotecomputer unterschiedliche Tastenkombinationen vorhanden - überprüfen Sie Ihre .emacs-Datei auf dem Remotecomputer - und manchmal funktioniert ein ganzer Schlüssel anders - z. B. absorbiert der GNU-Bildschirm standardmäßig den Strg-A-Teil eines Befehls, bevor er zu Emacs gelangen kann.)
Kbshimmyo
1
C-Raum, CF, Cg Arbeit
Zeynel
Ich konnte die .emacs-Datei jetzt nicht auf dem Remote-Computer finden, aber ich weiß, dass ich auf dem anderen Computer keine neuen Schlüsselbindungen vorgenommen habe
Zeynel
Ja, ich bin mir nicht sicher, was dazu führt, dass diese Tastenkombinationen nicht funktionieren. Öffnet Emacs die Datei auf dem Remote-Server im selben Modus wie lokal (wo alle Befehle funktioniert haben)? Vielleicht dies könnte einen Anhaltspunkt geben - M-x describe-mode.
Kbshimmyo
Führen Sie Emacs auch auf Ihrem lokalen Computer aus? Gibt es einen Grund, warum Sie die Remote-Emacs im Vergleich zu einem lokalen verwenden möchten?
Carl Groner

Antworten:

155

Im Allgemeinen bevorzuge ich das Öffnen von Remote-Dateien von einer lokalen Emacs-Instanz.

Während Sie Emacs auf Ihrem lokalen Computer ausführen, unterscheidet sich das Öffnen einer Remote-Datei über ssh nicht wesentlich vom Öffnen einer anderen Datei außer einer etwas anderen Syntax .

Für ssh können Sie eingeben C-x C-f. Jetzt in den Minipuffer, den Sie eingeben möchten /ssh:user@host:/path/to/file(Beachten Sie, dass die Tab-Vervollständigung funktioniert, sobald Sie mit der Eingabe eines Pfads beginnen. Beachten Sie auch das führende /Zeichen). Die vollständigen Dokumente finden Sie hier .

In Ihrem Beispiel wäre das:

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

Jetzt können Sie Remote-Dateien über ssh in Emacs bearbeiten, während Sie Ihre lokale Konfiguration und alle installierten Pakete usw. verwenden.

Carl Groner
quelle
22
OP könnte interessiert sein zu wissen, dass diese Funktionalität aufgerufen wird: trampund es ist eines der nützlichsten Dinge, die Sie jemals verwenden werden. Es wird sogar aus der Ferne kompiliert!
PMR
Dies funktioniert hervorragend und alle Befehle scheinen zu funktionieren, aber ich sehe, dass ich sie nicht bearbeiten kann, index.htmlda der Puffer schreibgeschützt ist. Ich kann jedoch dieselbe Datei bearbeiten, wenn ich sie auf dem Remotecomputer öffne. Übrigens, als ich die Datei C-x C-f /ssh:user@host filenamedamit geöffnet habe, habe ich nach dem Passwort gefragt.
Zeynel
Ich habe eine andere Datei aus dem Dokumentverzeichnis ausprobiert und konnte diese problemlos bearbeiten.
Zeynel
Wissen Sie, wie Sie damit einen Port angeben können?
Philip Kirkbride
4
@PhilipKirkbride Die vollständig dokumentierte Syntax ist/method:user@host#port:filename
Carl Groner
27

Um die obige Antwort zu ergänzen, können Sie Verknüpfungen für Computer schreiben, die Sie häufig verwenden:

(defun connect-remote ()
  (interactive)
  (dired "/[email protected]:/"))

Dadurch wird ein diredPuffer auf einem Remotecomputer geöffnet . Sie können in diesem Puffer wie in einem lokalen Puffer navigieren.

Wenn Sie SSH-Schlüssel für den Remote-Computer eingerichtet haben, müssen Sie nicht einmal das Kennwort eingeben.

Wenn Sie eine Reihe von Remote - Computern haben, können Sie einige erkennbaren Namen jede Funktion geben, zum Beispiel connect-cupcake, connect-kitkatund verwenden smexPaket für die Fertigstellung.

abo-abo
quelle
Das ist toll. Ich werde es versuchen. Haben Sie auch eine Antwort auf die Frage, die ich im obigen Kommentar gestellt habe: Ich kann diese Datei bearbeiten, /usr/share/nginx/html/index.htmlwenn ich sie auf dem Remote-Computer öffne. aber wenn ich es mit ssh öffne, index.htmlist es schreibgeschützt. Warum ist das?
Zeynel
Ich vermute, dass Sie keine Verbindung zum Root-Benutzer herstellen und normalerweise nur dieser schreiben kann /usr/share/.
Abo-Abo
Aber wie verbinde ich mich als Root? Ich habe ein paar Dinge ausprobiert, C-x C-f /sudo ssh:user@host filenameaber das funktioniert nicht.
Zeynel
1
Dies ist ein Problem, das ich vor einiger Zeit ohne Erfolg zu lösen versucht habe. Ich kann tramp verwenden, um eine Verbindung zu Remote herzustellen, oder um eine Verbindung zu Local als Sudo herzustellen, aber nicht zu beiden. Eine Problemumgehung besteht darin, sich selbst zum Eigentümer eines /usr/share/nginx/html/Ordners zu machen chown.
Abo-Abo
Ich habe die Datei geöffnet /etc/nginx/sites-available/example.com.confund bearbeitet, gespeichert und geschlossen. Jetzt habe ich es wieder geöffnet und dieses Mal kann ich es nicht bearbeiten? Ich gehe davon aus, dass es etwas mit Berechtigungen zu tun hat. Können Sie mir helfen zu verstehen, warum dies geschieht?
Zeynel
18

Und um @ abo-abos Beitrag über "Verknüpfungen" hinzuzufügen -

Verwenden Sie Emacs-Lesezeichen. Erstellen Sie Lesezeichen einfach normal, wenn Sie eine entfernte Datei oder ein entferntes Verzeichnis besuchen. DannC-x r bspringen Sieeinfachzu einem entfernten Lesezeichen, dessen Namen Sie angeben (mit Vervollständigung).

Wenn Sie Lesezeichen + verwenden, werden entfernte Lesezeichen speziell in der hervorgehoben *Bookmark List*, damit Sie sie leichter erkennen können. Remote-Lesezeichen, auf die mit suoder sudo( root) zugegriffen werden muss, werden unterschiedlich hervorgehoben.

Wenn Sie Dired + verwenden , können Sie auch schnell mehrere entfernte Dateien oder Verzeichnisse mit Lesezeichen versehen, indem Sie das enthaltene entfernte Verzeichnis in Dired aufrufen, markieren und drücken C-x b. Sie müssen den Lesezeichen keine Namen geben. Sie sind nach den Dateien benannt. Selbst wenn Sie diese Lesezeichen niemals zum Navigieren zu den entfernten Dateien verwenden, können Sie sie mit Lesezeichen + -Tags verwenden , um die Dateien zu organisieren und damit Teilmengen davon zu bearbeiten.

Wenn Sie Eiszapfen verwenden, können Sie die Abschlusskandidaten immer dann, wenn Sie einen Befehl verwenden, um zu einem Lesezeichen zu springen, auf diejenigen beschränken, die entfernt sind, indem Sie C-M-@während des Abschlusses drücken .

Drew
quelle
10

Das Originalposter zeigte Interesse daran, entfernte Dateien als Root-Benutzer zu öffnen. Dies kann mit dem folgenden Befehl erfolgen:

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

Weitere Dokumentation finden Sie hier: https://www.emacswiki.org/emacs/TrampMode#toc14

Alex
quelle
3

Eine einfache Antwort, die sich auf die Remote-Maschine konzentriert:

Wenn ich vorhabe, alle meine Emacs auf dem Remote-Computer auszuführen, verwende ich

ssh -X username@hostname

Führen Sie dann Emacs in der Remotesitzung aus und zeigen Sie sie wieder auf meinem lokalen Computer an. Es ist eine alte Frage, aber ich wollte sie der Vollständigkeit halber einwerfen. Zugegeben, es gibt einige Probleme mit der xhost / X-Konfiguration, aber in vielen Netzwerken funktioniert dies sofort!

JimLohse
quelle
2

Der SSH-Modus für Emacs ist genau das, wonach Sie suchen.

Sobald Sie es eingerichtet haben, laufen Sie einfach

M-x ssh RET hostname RET

Anschließend werden Sie zweimal zur Eingabe Ihres Kennworts aufgefordert (einmal zur Befehlszeile, einmal zum Laden von Dateien).

Zum größten Teil können Sie es wie jede andere Shell behandeln (nicht interaktiv und ein paar kleine Unterschiede, aber das war's).

Es verfolgt, in welchem ​​Verzeichnis Sie sich befinden. Wenn Sie also eine Datei aus dem angezeigten Verzeichnis öffnen möchten, wird sie automatisch im richtigen Verzeichnis gestartet und Sie müssen nur den Dateinamen eingeben.

Emacs Wiki hat auch mehr Infos.

Drake Sobania
quelle