Cómo abrir una terminal externa desde emacs
On diciembre 1, 2020 by adminNuevo usuario de emacs aquí.
Quiero tener la capacidad de abrir una terminal con la ruta de archivo actual de emacs, como lo que hace el paquete open terminal here
en texto sublime 2.
Por terminal, me refiero a un emulador de terminal externo separado que ejecuta bash o zsh, como gnome-terminal, no los shells emulados dentro de emacs, como M-x shell
M-x eshell
, que no puedo apreciar por ahora.
Busqué en Google pero no encontré nada … Parece que los chicos de emacs realmente disfrutan de vivir en emacs.
Comentarios
Respuesta
Otro intento que rechaza el proceso para que su terminal sobreviva incluso después emacs se mata.
(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))
Comentarios
- ¿Hay alguna manera de vincular el terminal generado al vida útil del proceso emacs?
- Esto no ‘ t funciona (emacs se congela hasta que la terminal sale) si su terminal genera mensajes de depuración al cargar. Para solucionarlo, cambie el orden de
2>&1
y>/dev/null
(de modo que>/dev/null
sea lo primero) . - Cuando intento esto, Emacs no ‘ ni siquiera me deja llamar a la función. Después de la evaluación, el mini búfer dice
gnome-terminal-here
pero al ingresargnome-terminal-here
, dice[No match]
. - @ UTF-8 Eso ‘ s porque la función no fue ‘ t declarada como un comando interactivo. Mira mi edición.
Respuesta
¿Qué emulador de terminal estás usando? Tome KDE «s Konsole
como ejemplo, simplemente escriba una función:
(defun open-konsole () (interactive) (call-process "konsole" nil 0 nil "--workdir" default-directory))
Los argumentos del 5º lugar son konsole «s argumento. Vea la página de manual de su simulador de terminal preferido.
M-x open-konsole
abrirá un nuevo proceso de consola y usará el default-directory
actual (pwd
en ELisp) como directorio de trabajo.
Comentarios
- Se puede abrir una nueva pestaña si konsole ya se está ejecutando con
(call-process "konsole" nil 0 nil "--new-tab" "--workdir" default-directory)
. También(call-process "wmctrl" nil 0 nil "-a" "\" – Konsole\"")
para activar su ventana.
Respuesta
Puede usar el paquete externo terminal-here . Esto solo hace una cosa, pero no bien; exactamente lo que solicitó. Y funciona para mí en varios sistemas operativos.
Respuesta
Las otras respuestas no funcionaron para mí. Este código hace:
(defun open-gnome-terminal () (interactive) (shell-command "gnome-terminal"))
Responder
La mayor parte del tiempo uso shell-mode
. Así que uso mucho shell-here . Pero cuando necesito un terminal externo. Yo uso urxvt-client con tmux usando esto:
- Crear archivo llamado «term-here» en / usr / local / bin / que contiene
urxvtc -e bash -c "tmux -q has-session && exec tmux attach-session -d || exec tmux new-session -n$USER -s$USER@$HOSTNAME"
- Crear nueva función en emacs
(defun term-here () (interactive) (start-process "" nil "term-here"))
- Vincular a tu clave favorita
Esto abrirá urxvt-client (con tmux) en su directorio actual. Lo ato en dired-mode-map.
(use-package dired :ensure nil :ensure-system-package urxvt :bind ((:map dired-mode-map ("," . term-here))))
Elijo urxvt-client porque es rápido y sencillo. No olvide ejecutar su urxvt-daemon al inicio.
Respuesta
Construyendo en terminal-here como se propuso antes, creó una pequeña función que determina en función del sistema y el entorno de escritorio el programa a ejecutar.Puede ser útil si le gusta cambiar de escritorio o mantener su .emacs
sincronizado entre varias computadoras. Tenga en cuenta que no probé el código de shell de windows / darwin / gnome / …, solo KDE está probado por ahora.
;; ########################################################## ;; ### 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))
Respuesta
Esto funcionó perfectamente bien para mí: (delete-window (async-shell-command "gnome-terminal"))
. Cambie su comando de terminal.
M-x
ansi-term
? It ‘ es mucho mejor queshell
. Lo uso y funciona muy bien. ¿O te refieres a una nueva terminal gráfica (como abrir unagnome-terminal
)?M-! gnome-terminal
, funciona. Yo ‘ me pregunto por quéM-! bash
no pude ‘ hacerlo.bash
es un caparazón,M-! bash
seguramente no ‘ hará lo que quieras. Averigüe qué emulador de terminal ‘ está usando primero.