Comment ouvrir un terminal externe depuis emacs
On décembre 1, 2020 by adminNouvel utilisateur emacs ici.
Je veux avoir la possibilité douvrir un terminal avec le chemin de fichier actuel depuis emacs, comme ce que fait le paquet open terminal here
dans le texte sublime 2.
Par terminal, je veux dire un émulateur de terminal externe séparé exécutant bash ou zsh, comme gnome-terminal, pas les shells émulés à lintérieur demacs, comme M-x shell
M-x eshell
, que je ne peux pas apprécier pour le moment.
Jai cherché sur Google mais je nai rien trouvé … Il semble que les gars demacs aiment vraiment vivre dans emacs.
Commentaires
Réponse
Un autre essai qui désavoue le processus afin que votre terminal survivra même après emacs est tué.
(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))
Commentaires
- Existe-t-il un moyen de lier le terminal généré au durée de vie du processus emacs?
- Cela ne fonctionne ‘ t (emacs se bloque jusquà la sortie du terminal) si votre terminal génère des messages de débogage lors du chargement. Pour résoudre le problème, permutez lordre
2>&1
et>/dev/null
(afin que>/dev/null
vienne en premier) . - Quand jessaye ceci, Emacs ne ‘ me laisse même pas appeler la fonction. Après évaluation, le mini tampon dit
gnome-terminal-here
mais lors de la saisie degnome-terminal-here
, il dit[No match]
. - @ UTF-8 Cela ‘ car la fonction na pas été ‘ déclarée comme une commande interactive. Voir ma modification.
Réponse
Quel émulateur de terminal utilisez-vous? Prenez KDE « s Konsole
comme exemple, écrivez simplement une fonction:
(defun open-konsole () (interactive) (call-process "konsole" nil 0 nil "--workdir" default-directory))
Les arguments de la 5e place sont konsole « s argument. Consultez la page de manuel de votre simulateur de terminal préféré.
M-x open-konsole
ouvrira un nouveau processus konsole et utilisera default-directory
(pwd
dans ELisp) comme répertoire de travail.
Commentaires
- On peut ouvrir un nouvel onglet si konsole est déjà en cours dexécution avec
(call-process "konsole" nil 0 nil "--new-tab" "--workdir" default-directory)
.(call-process "wmctrl" nil 0 nil "-a" "\" – Konsole\"")
pour activer sa fenêtre.
Réponse
Vous pouvez utiliser le package externe terminal-here . Cela ne fait quune chose, mais le fait il bien; exactement ce que vous avez demandé. Et fonctionne pour moi sur plusieurs OS.
Réponse
Les autres réponses nont pas fonctionné pour moi. Ce code fait:
(defun open-gnome-terminal () (interactive) (shell-command "gnome-terminal"))
Réponse
La plupart du temps, jutilise shell-mode
. Jutilise donc beaucoup shell-here . Mais quand jai besoin dun terminal externe. Jutilise urxvt-client avec tmux en utilisant ceci:
- Créer un fichier nommé « term-here » dans / usr / local / bin / contenant
urxvtc -e bash -c "tmux -q has-session && exec tmux attach-session -d || exec tmux new-session -n$USER -s$USER@$HOSTNAME"
- Créer une nouvelle fonction dans emacs
(defun term-here () (interactive) (start-process "" nil "term-here"))
- Lier à votre clé préférée
Cela ouvrira urxvt-client (avec tmux) dans votre répertoire actuel. Je le lie dans dired-mode-map.
(use-package dired :ensure nil :ensure-system-package urxvt :bind ((:map dired-mode-map ("," . term-here))))
Jai choisi urxvt-client car il est simple et rapide. Noubliez pas dexécuter votre démon urxvt au démarrage.
Réponse
En me basant sur le terminal-here comme proposé précédemment, je créé une petite fonction qui détermine en fonction du système et de lenvironnement de bureau le programme à exécuter.Cela peut être utile si vous aimez changer de bureau ou garder votre .emacs
synchronisé entre plusieurs ordinateurs. Notez que je n « ai pas testé le code shell windows / darwin / gnome / …, seul KDE est testé pour le moment.
;; ########################################################## ;; ### 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))
Réponse
Cela a parfaitement fonctionné pour moi: (delete-window (async-shell-command "gnome-terminal"))
. Echangez votre commande de terminal.
M-x
ansi-term
? Cela ‘ est bien meilleur queshell
. Je lutilise et cela fonctionne très bien. Ou voulez-vous dire un nouveau terminal graphique (comme ouvrir ungnome-terminal
)?M-! gnome-terminal
, ça marche. Je ‘ me demande pourquoiM-! bash
na pas pu ‘ le faire.bash
est un shell,M-! bash
a sûrement gagné ‘ t faire ce que vous voulez. Veuillez trouver quel émulateur de terminal vous ‘ utilisez en premier.