Hur man öppnar en extern terminal från emacs
On december 1, 2020 by adminHelt ny emacs-användare här.
Jag vill ha möjligheten att öppna en terminal med aktuell filsökväg från emacs, som vad open terminal here
-paketet gör i sublim text 2.
Med terminal menar jag en separat extern terminalemulator som kör bash eller zsh, som gnome-terminal, inte de emulerade skalen inuti emacs, som M-x shell
M-x eshell
, som jag inte kan uppskatta för tillfället.
Jag googlade men hittade ingenting … Det verkar som om emacs-killar verkligen tycker om att bo i emacs.
Kommentarer
Svar
Ytterligare ett försök som avvisar processen så att din terminal kommer att överleva även efter emacs dödas.
(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))
Kommentarer
- Finns det ett sätt att knyta den skapade terminalen till livslängden för emacs-processen?
- Detta fungerar inte ’ (emacs fryser tills terminalen går ut) om din terminal genererar några felsökningsmeddelanden vid laddning. För att fixa, byt ordningen på
2>&1
och>/dev/null
(så att>/dev/null
kommer först) . - När jag försöker göra det, låter Emacs inte ens ’ mig ringa funktionen. Efter utvärderingen säger mini-bufferten
gnome-terminal-here
men när du angergnome-terminal-here
står det[No match]
. - @ UTF-8 Att ’ beror på att funktionen ’ inte förklarades som ett interaktivt kommando. Se min redigering.
Svar
Vilken terminalemulator använder du? Ta KDE ”s Konsole
som exempel, skriv bara en funktion:
(defun open-konsole () (interactive) (call-process "konsole" nil 0 nil "--workdir" default-directory))
Args från femte plats är konsole argument. Se din föredragna terminalsimulators mansida.
M-x open-konsole
öppnar en ny konsoleprocess och använder aktuell default-directory
(pwd
i ELisp) som arbetskatalog.
Kommentarer
- Man kan öppna en ny flik om konsole körs redan med
(call-process "konsole" nil 0 nil "--new-tab" "--workdir" default-directory)
.(call-process "wmctrl" nil 0 nil "-a" "\" – Konsole\"")
för att aktivera dess fönster.
Svar
Du kan använda det externa paketet terminal-här . Detta gör bara en sak, men gör det bra; exakt vad du begärde. Och fungerar för mig på flera operativsystem.
Svar
De andra svaren fungerade inte för mig. Den här koden gör:
(defun open-gnome-terminal () (interactive) (shell-command "gnome-terminal"))
Svar
För det mesta använder jag shell-mode
. Så jag använder starkt shell-here . Men när jag behöver extern terminal. Jag använder urxvt-client med tmux med detta:
- Skapa fil med namnet ”term-here” i / usr / local / bin / innehållande
urxvtc -e bash -c "tmux -q has-session && exec tmux attach-session -d || exec tmux new-session -n$USER -s$USER@$HOSTNAME"
- Skapa ny funktion i emacs
(defun term-here () (interactive) (start-process "" nil "term-here"))
- Bind till din favoritknapp
Detta öppnar urxvt-client (med tmux) i din nuvarande katalog. Jag binder den i dired-mode-map.
(use-package dired :ensure nil :ensure-system-package urxvt :bind ((:map dired-mode-map ("," . term-here))))
Jag väljer urxvt-klient eftersom det är snabbt och enkelt. Glöm inte att köra din urxvt-daemon vid start.
Svar
Bygga på terminal-här som föreslagits tidigare, jag skapade en liten funktion som bestämmer beroende på system och skrivbordsmiljö programmet som ska köras.Det kan vara användbart om du gillar att byta skrivbord eller håller din .emacs
synkroniserad mellan flera datorer. Observera att jag inte testade shell-koden windows / darwin / gnome / …, bara KDE testas för tillfället.
;; ########################################################## ;; ### 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))
Svar
Detta fungerade helt bra för mig: (delete-window (async-shell-command "gnome-terminal"))
. Byt ut ditt terminalkommando.
M-x
ansi-term
? Det ’ är mycket bättre änshell
. Jag använder det och det fungerar riktigt bra. Eller menar du en ny grafisk terminal (som att öppna engnome-terminal
)?M-! gnome-terminal
, det fungerar. Jag ’ undrar varförM-! bash
inte kunde ’ t gör det.bash
är ett skal,M-! bash
vann säkert ’ t gör vad du vill. Ta reda på vilken terminalemulator du ’ använder först.