Hoe een externe terminal te openen vanuit emacs
Geplaatst op december 1, 2020 door adminGloednieuwe emacs-gebruiker hier.
Ik wil de mogelijkheid hebben om een terminal te openen met het huidige bestandspad van emacs, zoals wat het open terminal here
-pakket doet in sublieme tekst 2.
Met terminal bedoel ik een aparte externe terminalemulator met bash of zsh, zoals gnome-terminal, niet de geëmuleerde shells in emacs, zoals M-x shell
M-x eshell
, wat ik voorlopig niet kan waarderen.
Ik heb gegoogeld maar niets gevonden … Het lijkt erop dat emacs-jongens het erg leuk vinden om in emacs te leven.
Reacties
Answer
Nog een poging die het proces verwerpt, zodat je terminal zelfs na emacs wordt vermoord.
(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))
Reacties
- Is er een manier om de voortgebrachte terminal aan de levensduur van het emacs-proces?
- Dit ‘ werkt niet (emacs bevriest totdat de terminal afsluit) als je terminal debug-berichten genereert tijdens het laden. Om dit op te lossen, verwissel je de volgorde van
2>&1
en>/dev/null
(zodat>/dev/null
als eerste komt) . - Als ik dit probeer, ‘ laat ik me zelfs de functie niet aanroepen. Na evaluatie zegt de minibuffer
gnome-terminal-here
, maar als jegnome-terminal-here
invoert, staat er[No match]
. - @ UTF-8 Dat ‘ is omdat de functie niet ‘ t is gedeclareerd als een interactief commando. Zie mijn bewerking.
Answer
Welke terminalemulator gebruikt u? Neem KDE “s Konsole
als voorbeeld, schrijf gewoon een functie:
(defun open-konsole () (interactive) (call-process "konsole" nil 0 nil "--workdir" default-directory))
De argumenten van de 5e plaats zijn konsole “s argument. Zie de man-pagina van je favoriete terminalsimulator.
M-x open-konsole
zal een nieuw konsole-proces openen en het huidige default-directory
gebruiken (pwd
in ELisp) als werkmap.
Reacties
- Men kan een nieuw tabblad openen als konsole draait al met
(call-process "konsole" nil 0 nil "--new-tab" "--workdir" default-directory)
. Ook(call-process "wmctrl" nil 0 nil "-a" "\" – Konsole\"")
om zijn venster te activeren.
Antwoord
U kunt het externe pakket terminal-hier gebruiken. Dit doet maar één ding, maar doet het goed; precies wat je hebt gevraagd. En werkt voor mij op meerdere besturingssystemen.
Antwoord
De andere antwoorden werkten niet voor mij. Deze code doet:
(defun open-gnome-terminal () (interactive) (shell-command "gnome-terminal"))
Antwoord
Meestal gebruik ik shell-mode
. Dus ik gebruik veel shell-here . Maar als ik een externe terminal nodig heb. Ik gebruik urxvt-client met tmux en gebruik dit:
- Maak een bestand met de naam “term-here” in / usr / local / bin / met
urxvtc -e bash -c "tmux -q has-session && exec tmux attach-session -d || exec tmux new-session -n$USER -s$USER@$HOSTNAME"
- Nieuwe functie maken in emacs
(defun term-here () (interactive) (start-process "" nil "term-here"))
- Binden aan je favoriete sleutel
Dit opent urxvt-client (met tmux) in je huidige directory. Ik bind het in een dired-mode-map.
(use-package dired :ensure nil :ensure-system-package urxvt :bind ((:map dired-mode-map ("," . term-here))))
Ik kies urxvt-client omdat het snel en eenvoudig is. Vergeet niet uw urxvt-daemon bij het opstarten uit te voeren.
Antwoord
Voortbouwend op terminal-here zoals eerder voorgesteld, ik heeft een kleine functie gemaakt die afhankelijk van het systeem en de desktopomgeving bepaalt welk programma moet worden uitgevoerd.Het kan handig zijn als u van bureaublad wilt veranderen, of uw .emacs
gesynchroniseerd wilt houden tussen verschillende computers. Merk op dat ik de shellcode windows / darwin / gnome / … niet heb getest, alleen KDE wordt voorlopig getest.
;; ########################################################## ;; ### 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))
Antwoord
Dit werkte prima voor mij: (delete-window (async-shell-command "gnome-terminal"))
. Verwissel je terminalcommando.
M-x
ansi-term
geprobeerd? Het ‘ is veel beter danshell
. Ik gebruik het en het werkt echt goed. Of bedoel je een nieuwe grafische terminal (zoals het openen van eengnome-terminal
)?M-! gnome-terminal
geprobeerd, het werkt. Ik ‘ vraag me af waaromM-! bash
niet ‘ kon doen.bash
is een shell,M-! bash
heeft zeker ‘ gewonnen om te doen wat je wilt. Zoek alsjeblieft uit welke terminalemulator je ‘ als eerste gebruikt.