Come aprire un terminale esterno da emacs
Su Dicembre 1, 2020 da adminNuovo utente emacs qui.
Voglio avere la capacità di aprire un terminale con il percorso del file corrente da emacs, come quello che fa il pacchetto open terminal here
nel testo sublime 2.
Per terminale, intendo un emulatore di terminale esterno separato che esegue bash o zsh, come gnome-terminal, non le shell emulate allinterno di emacs, come M-x shell
M-x eshell
, cosa che per ora non posso apprezzare.
Ho cercato su Google ma non ho trovato nulla … Sembra che i ragazzi di emacs si divertano davvero a vivere in emacs.
Commenti
Risposta
Un altro tentativo che rinnega il processo in modo che il tuo terminale sopravviva anche dopo emacs viene interrotto.
(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))
Commenti
- Esiste un modo per collegare il terminale generato al durata del processo emacs?
- Questo ‘ non funziona (emacs si blocca finché il terminale non esce) se il tuo terminale genera messaggi di debug durante il caricamento. Per risolvere il problema, scambia lordine di
2>&1
e>/dev/null
(in modo che>/dev/null
venga prima) . - Quando provo questo, Emacs ‘ non mi lascia nemmeno chiamare la funzione. Dopo la valutazione, il mini buffer dice
gnome-terminal-here
ma quando si immettegnome-terminal-here
, dice[No match]
. - @ UTF-8 Questo ‘ è perché la funzione non è stata ‘ dichiarata come comando interattivo. Vedi la mia modifica.
Risposta
Quale emulatore di terminale stai usando? Prendi “s Konsole
di KDE come esempio, scrivi solo una funzione:
(defun open-konsole () (interactive) (call-process "konsole" nil 0 nil "--workdir" default-directory))
Gli argomenti dal 5 ° posto sono konsole “s argomento. Consulta la pagina man del tuo simulatore di terminale preferito.
M-x open-konsole
aprirà un nuovo processo di konsole e utilizzerà lattuale default-directory
(pwd
in ELisp) come directory di lavoro.
Commenti
- Si può aprire una nuova scheda se konsole è già in esecuzione con
(call-process "konsole" nil 0 nil "--new-tab" "--workdir" default-directory)
. Anche(call-process "wmctrl" nil 0 nil "-a" "\" – Konsole\"")
per attivare la relativa finestra.
Risposta
Puoi utilizzare il pacchetto esterno terminal-here . Questo fa solo una cosa, ma bene; esattamente quello che hai richiesto. E funziona per me su più OS.
Risposta
Le altre risposte non hanno funzionato per me. Questo codice:
(defun open-gnome-terminal () (interactive) (shell-command "gnome-terminal"))
Answer
La maggior parte delle volte che uso shell-mode
. Quindi uso molto shell-here . Ma quando ho bisogno di un terminale esterno. Uso urxvt-client con tmux usando questo:
- Crea un file chiamato “term-here” in / usr / local / bin / contenente
urxvtc -e bash -c "tmux -q has-session && exec tmux attach-session -d || exec tmux new-session -n$USER -s$USER@$HOSTNAME"
- Crea nuova funzione in emacs
(defun term-here () (interactive) (start-process "" nil "term-here"))
- Associa alla tua chiave preferita
Questo aprirà urxvt-client (con tmux) nella directory corrente. Lo lego in dired-mode-map.
(use-package dired :ensure nil :ensure-system-package urxvt :bind ((:map dired-mode-map ("," . term-here))))
Scelgo urxvt-client perché è veloce e semplice. Non dimenticare di eseguire il tuo demone urxvt allavvio.
Risposta
Basandosi sul terminale-qui come proposto prima, io ha creato una piccola funzione che determina a seconda del sistema e dellambiente desktop il programma da eseguire.Può essere utile se ti piace cambiare desktop o mantenere sincronizzato il tuo .emacs
tra più computer. Nota che non ho testato il codice shell di windows / darwin / gnome / …, solo KDE è testato per ora.
;; ########################################################## ;; ### 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))
Risposta
Questo ha funzionato perfettamente per me: (delete-window (async-shell-command "gnome-terminal"))
. Scambia il comando del tuo terminale.
M-x
ansi-term
? È ‘ è molto meglio dishell
. Lo uso e funziona molto bene. O intendi un nuovo terminale grafico (come aprire ungnome-terminal
)?M-! gnome-terminal
, funziona. Mi ‘ mi chiedo perchéM-! bash
non è riuscito ‘ a farlo.bash
è una shell,M-! bash
sicuramente ‘ non farà quello che vuoi. Scopri quale emulatore di terminale ‘ stai utilizzando per primo.