So öffnen Sie ein externes Terminal über Emacs
On Dezember 1, 2020 by adminBrandneuer Emacs-Benutzer hier.
Ich möchte die Möglichkeit haben, ein Terminal mit dem aktuellen Dateipfad von Emacs zu öffnen, wie es das open terminal here
-Paket in erhabenem Text 2 tut.
Mit Terminal meine ich einen separaten externen Terminalemulator, auf dem bash oder zsh ausgeführt wird, wie z. B. gnome-terminal, nicht die emulierten Shells in emacs, wie M-x shell
M-x eshell
, was ich im Moment nicht zu schätzen weiß.
Ich habe gegoogelt, aber nichts gefunden … Es scheint, dass Emacs-Jungs es wirklich genießen, in Emacs zu leben.
Kommentare
- Haben Sie versucht,
M-x
ansi-term
? Es ‚ ist viel besser alsshell
. Ich benutze es und es funktioniert wirklich gut. Oder meinst du ein neues grafisches Terminal (wie das Öffnen eines )? - @PythonNut Ich ‚ habe es gerade versucht, es konnte sogar nicht ‚ Ich kümmere mich immer noch um ein neues Terminalfenster. Ahhh, ich ‚ habe gerade versucht
M-! gnome-terminal
, es funktioniert. Ich ‚ frage mich, warumM-! bash
‚ es nicht tun konnte. - @Ply_py Ich denke, Sie müssen Terminalemulator und Shell mitteilen.
bash
ist eine Shell,M-! bash
wird ‚ sicherlich nicht tun, was Sie wollen. Bitte finden Sie heraus, welchen Terminalemulator Sie ‚ zuerst verwenden. - @kuanyui Ahh, ich habe gerade diese beiden Wörter gesucht … und die Antworten hier . Klar habe ich die Begriffe Shell und Terminal (Emulator) verwechselt. Vielen Dank, ich ‚ werde die Frage bearbeiten.
- Shell und Ansi-Term übernehmen definitiv die Tab-Vervollständigung, zumindest mit Bash. Ich benutze jeden Tag Shell.
Antwort
Ein weiterer Versuch, der den Prozess ablehnt, damit Ihr Terminal auch danach überlebt emacs wird getötet.
(defun run-gnome-terminal-here () (interactive "@") (shell-command (concat "konsole --workdir" (file-name-directory (or load-file-name buffer-file-name)) " > /dev/null 2>&1 & disown") nil nil))
Kommentare
- Gibt es eine Möglichkeit, das erzeugte Terminal mit dem zu verbinden? Lebensdauer des Emacs-Prozesses?
- Dies funktioniert nicht ‚ (Emacs friert ein, bis das Terminal beendet wird), wenn Ihr Terminal beim Laden Debug-Meldungen generiert. Um dies zu beheben, tauschen Sie die Reihenfolge von
2>&1
und>/dev/null
aus (sodass>/dev/null
an erster Stelle steht). . - Wenn ich dies versuche, lässt Emacs ‚ mich nicht einmal die Funktion aufrufen. Nach der Auswertung sagt der Minipuffer
gnome-terminal-here
, aber wenn Siegnome-terminal-here
eingeben, wird[No match]
angezeigt. - @ UTF-8 Das ‚ ist, weil die Funktion ‚ nicht als interaktiver Befehl deklariert wurde. Siehe meine Bearbeitung.
Antwort
Welchen Terminalemulator verwenden Sie? Nehmen Sie als Beispiel die Konsole
von KDE. Schreiben Sie einfach eine Funktion:
(defun open-konsole () (interactive) (call-process "konsole" nil 0 nil "--workdir" default-directory))
Die Argumente vom 5. Platz sind konsole „s Argument. Weitere Informationen finden Sie in der Manpage Ihres bevorzugten Terminalsimulators.
M-x open-konsole
öffnet einen neuen Konsolenprozess und verwendet die aktuelle default-directory
(pwd
in ELisp) als Arbeitsverzeichnis.
Kommentare
- Bei Konsole kann ein neuer Tab geöffnet werden wird bereits mit
(call-process "konsole" nil 0 nil "--new-tab" "--workdir" default-directory)
ausgeführt. Außerdem(call-process "wmctrl" nil 0 nil "-a" "\" – Konsole\"")
, um das Fenster zu aktivieren.
Antwort
Sie können das externe Paket terminal-here verwenden. Dies tut nur eines, tut es aber es ist gut, genau das, was Sie angefordert haben. Und funktioniert für mich unter mehreren Betriebssystemen.
Antwort
Die anderen Antworten haben nicht funktioniert für mich. Dieser Code führt Folgendes aus:
(defun open-gnome-terminal () (interactive) (shell-command "gnome-terminal"))
Antwort
Meistens verwende ich shell-mode
. Daher verwende ich häufig shell-here . Aber wenn ich ein externes Terminal brauche. Ich verwende urxvt-client mit tmux wie folgt:
- Erstellen Sie eine Datei mit dem Namen „term-here“ in / usr / local / bin / mit
urxvtc -e bash -c "tmux -q has-session && exec tmux attach-session -d || exec tmux new-session -n$USER -s$USER@$HOSTNAME"
- Neue Funktion in Emacs erstellen
(defun term-here () (interactive) (start-process "" nil "term-here"))
- An Ihren Lieblingsschlüssel binden
Dies öffnet den urxvt-client (mit tmux) in Ihrem aktuellen Verzeichnis. Ich binde es in dired-mode-map.
(use-package dired :ensure nil :ensure-system-package urxvt :bind ((:map dired-mode-map ("," . term-here))))
Ich wähle urxvt-client, weil es schnell und einfach ist. Vergessen Sie nicht, Ihren urxvt-Daemon beim Start auszuführen.
Antwort
Aufbauend auf Terminal-hier, wie zuvor vorgeschlagen, I. hat eine kleine Funktion erstellt, die abhängig vom System und der Desktop-Umgebung das auszuführende Programm bestimmt.Dies kann hilfreich sein, wenn Sie den Desktop ändern möchten oder wenn Sie Ihre .emacs
zwischen mehreren Computern synchronisieren möchten. Beachten Sie, dass ich den Shell-Code windows / darwin / gnome / … nicht getestet habe, sondern nur KDE.
;; ########################################################## ;; ### Open terminal ;; ########################################################## ;; Define a function to recognize the desktop environment easily ;; You shouldn"t need to touch this function (defun get-desktop-environment () (interactive) (let ( ;; Create new variable with DE name (de_env (getenv "XDG_CURRENT_DESKTOP")) ;; Make sure search is case insensitive (case-fold-search t)) (cond ((eq system-type "darwin) "darwin") ((memq system-type "(windows-nt ms-dos cygwin)) "windows") ((string-match ".*kde.*" de_env) "kde") ((string-match ".*gnome.*" de_env) "gnome") ((string-match ".*unity.*" de_env) "unity") ((string-match ".*xfce.*" de_env) "xfce") ((string-match ".*lxde.*" de_env) "lxde") ((string-match ".*mate.*" de_env) "mate") ((string-match ".*cinnamon.*" de_env) "cinnamon") (t "unknown")))) ;; You can edit this function if you want to change the default command for a specific desktop (defun get-terminal (path) (alist-get (get-desktop-environment) "(("darwin" . ("open" "-a" "Terminal.app" ".")) ("windows" . ("cmd.exe" "/C" "start" "cmd.exe")) ("kde" . ("konsole" "--workdir" ".")) ("gnome" . ("gnome-terminal" "--working-directory=.")) ("xfce" . ("xfce4-terminal" "--working-directory=."))) "("x-terminal-emulator") nil "equal)) (use-package terminal-here :ensure t :bind (("<f6>" . terminal-here-launch)) :config (setq terminal-here-terminal-command #"get-terminal))
Antwort
Das hat bei mir einwandfrei funktioniert: (delete-window (async-shell-command "gnome-terminal"))
. Tauschen Sie Ihren Terminalbefehl aus.
Schreibe einen Kommentar