Sådan åbnes en ekstern terminal fra emacs
On december 1, 2020 by adminHelt ny emacs-bruger her.
Jeg vil have muligheden for at åbne en terminal med den aktuelle filsti fra emacs, som hvad open terminal here
-pakken gør i sublim tekst 2.
Med terminal mener jeg en separat ekstern terminalemulator, der kører bash eller zsh, som gnome-terminal, ikke de emulerede skaller inde i emacs, som M-x shell
M-x eshell
, som jeg ikke kan sætte pris på lige nu.
Jeg googlede, men havde intet fundet … Det ser ud til, at emacs-fyre virkelig kan lide at bo i emacs.
Kommentarer
Svar
Et andet forsøg, der afviser processen, så din terminal overlever, selv efter emacs dræbes.
(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
- Er der en måde at binde den gydte terminal til levetid for emacs-processen?
- Dette fungerer ikke ‘ t (emacs fryser, indtil terminalen afslutter), hvis din terminal genererer fejlretningsmeddelelser, når den indlæses. For at rette, skift rækkefølgen af
2>&1
og>/dev/null
(så>/dev/null
kommer først) . - Når jeg prøver dette, lader Emacs ikke engang ‘ mig ringe til funktionen. Efter evaluering siger mini-bufferen
gnome-terminal-here
men når du indtastergnome-terminal-here
, står der[No match]
. - @ UTF-8 At ‘ s fordi funktionen ikke blev ‘ t erklæret som en interaktiv kommando. Se min redigering.
Svar
Hvilken terminalemulator bruger du? Tag KDE “s Konsole
som eksempel, skriv bare en funktion:
(defun open-konsole () (interactive) (call-process "konsole" nil 0 nil "--workdir" default-directory))
Argumenterne fra 5. plads er konsole “argument. Se din foretrukne terminalsimulator manside.
M-x open-konsole
åbner en ny konsoleproces og bruger den aktuelle default-directory
(pwd
i ELisp) som arbejdsmappe.
Kommentarer
- Man kan åbne en ny fane, hvis konsole kører allerede med
(call-process "konsole" nil 0 nil "--new-tab" "--workdir" default-directory)
. Også(call-process "wmctrl" nil 0 nil "-a" "\" – Konsole\"")
for at aktivere vinduet.
Svar
Du kan bruge den eksterne pakke terminal-her . Dette gør kun én ting, men gør det godt; præcis hvad du anmodede om. Og fungerer for mig på flere operativsystemer.
Svar
De andre svar fungerede ikke for mig. Denne kode gør:
(defun open-gnome-terminal () (interactive) (shell-command "gnome-terminal"))
Svar
Det meste af tiden bruger jeg shell-mode
. Så jeg bruger stærkt shell-her . Men når jeg har brug for ekstern terminal. Jeg bruger urxvt-klient med tmux ved hjælp af dette:
- Opret fil med navnet “term-here” i / usr / local / bin / indeholdende
urxvtc -e bash -c "tmux -q has-session && exec tmux attach-session -d || exec tmux new-session -n$USER -s$USER@$HOSTNAME"
- Opret ny funktion i emacs
(defun term-here () (interactive) (start-process "" nil "term-here"))
- Bind til din yndlingsnøgle
Dette åbner urxvt-klient (med tmux) i din nuværende bibliotek. Jeg binder det i dired-mode-map.
(use-package dired :ensure nil :ensure-system-package urxvt :bind ((:map dired-mode-map ("," . term-here))))
Jeg vælger urxvt-klient, fordi den er hurtig og enkel. Glem ikke at køre din urxvt-dæmon ved opstart.
Svar
Bygger på terminal-her som foreslået før, jeg oprettet en lille funktion, der afhænger af systemet og skrivebordsmiljøet, programmet, der skal køres,Det kan være nyttigt, hvis du kan lide at skifte skrivebord eller holde din .emacs
synkroniseret mellem flere computere. Bemærk, at jeg ikke testede Windows / darwin / gnome / … shell-koden, kun KDE er testet for nu.
;; ########################################################## ;; ### 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
Dette fungerede perfekt for mig: (delete-window (async-shell-command "gnome-terminal"))
. Skift din terminalkommando.
M-x
ansi-term
? ‘ er meget bedre endshell
. Jeg bruger det, og det fungerer rigtig godt. Eller mener du en ny grafisk terminal (som at åbne engnome-terminal
)?M-! gnome-terminal
, det fungerer. Jeg ‘ undrer mig over, hvorforM-! bash
ikke kunne ‘ ikke kunne gøre det.bash
er en skal,M-! bash
vandt sikkert ‘ t gør, hvad du vil. Find ud af, hvilken terminalemulator du ‘ bruger først.