Hvordan åpne en ekstern terminal fra emacs
On desember 1, 2020 by adminHelt ny emacs-bruker her.
Jeg vil ha muligheten til å åpne en terminal med gjeldende filbane fra emacs, som hva open terminal here
-pakken gjør i sublim tekst 2.
Med terminal mener jeg en separat ekstern terminalemulator som kjører bash eller zsh, som gnome-terminal, ikke de emulerte skallene inne i emacs, som M-x shell
M-x eshell
, som jeg ikke kan sette pris på foreløpig.
Jeg googlet, men hadde ingenting funnet … Det virker som om emacs-gutter virkelig liker å bo i emacs.
Kommentarer
Svar
Nok et forsøk som forkaster prosessen slik at terminalen din vil overleve selv etter emacs blir drept.
(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 det en måte å knytte den gyte terminalen til levetiden til emacs-prosessen?
- Dette fungerer ikke ‘ t (emacs fryser til terminalen går ut) hvis terminalen din genererer feilsøkingsmeldinger når den lastes inn. For å fikse, bytt rekkefølgen på
2>&1
og>/dev/null
(slik at>/dev/null
kommer først) . - Når jeg prøver dette, lar ikke Emacs ‘ meg engang ringe til funksjonen. Etter evaluering sier mini-bufferen
gnome-terminal-here
men når du skriver inngnome-terminal-here
, står det[No match]
. - @ UTF-8 At ‘ er fordi funksjonen ikke var ‘ t erklært som en interaktiv kommando. Se min redigering.
Svar
Hvilken terminalemulator bruker du? Ta KDE «s Konsole
som eksempel, bare skriv en funksjon:
(defun open-konsole () (interactive) (call-process "konsole" nil 0 nil "--workdir" default-directory))
Argumentene fra 5. plass er konsole argument. Se den foretrukne terminalsimulatorens manside.
M-x open-konsole
åpner en ny konsoleprosess og bruker gjeldende default-directory
(pwd
i ELisp) som arbeidskatalog.
Kommentarer
- Man kan åpne en ny fane hvis konsole kjører allerede med
(call-process "konsole" nil 0 nil "--new-tab" "--workdir" default-directory)
. Også(call-process "wmctrl" nil 0 nil "-a" "\" – Konsole\"")
for å aktivere vinduet.
Svar
Du kan bruke den eksterne pakken terminal-her . Dette gjør bare en ting, men gjør det bra; akkurat det du ba om. Og fungerer for meg på flere operativsystemer.
Svar
De andre svarene fungerte ikke for meg. Denne koden gjør:
(defun open-gnome-terminal () (interactive) (shell-command "gnome-terminal"))
Svar
Mesteparten av tiden bruker jeg shell-mode
. Så jeg bruker sterkt shell-here . Men når jeg trenger ekstern terminal. Jeg bruker urxvt-client med tmux ved å bruke dette:
- Opprett fil med navnet «term-here» i / usr / local / bin / inneholder
urxvtc -e bash -c "tmux -q has-session && exec tmux attach-session -d || exec tmux new-session -n$USER -s$USER@$HOSTNAME"
- Opprett ny funksjon i emacs
(defun term-here () (interactive) (start-process "" nil "term-here"))
- Bind til favorittnøkkelen din
Dette åpner urxvt-client (med tmux) i din nåværende katalog. Jeg binder den i dired-mode-map.
(use-package dired :ensure nil :ensure-system-package urxvt :bind ((:map dired-mode-map ("," . term-here))))
Jeg velger urxvt-klient fordi det er raskt og enkelt. Ikke glem å kjøre urxvt-demonen din ved oppstart.
Svar
Bygger på terminal-her som foreslått før, jeg opprettet en liten funksjon som bestemmer avhengig av system og skrivebordsmiljø programmet som skal kjøres.Det kan være nyttig hvis du liker å bytte skrivebord, eller holder .emacs
synkronisert mellom flere datamaskiner. Merk at jeg ikke testet Windows / darwin / gnome / … skallkoden, bare KDE er testet for nå.
;; ########################################################## ;; ### 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 fungerte helt bra for meg: (delete-window (async-shell-command "gnome-terminal"))
. Bytt ut terminalkommandoen.
M-x
ansi-term
? Det ‘ er mye bedre ennshell
. Jeg bruker det og det fungerer veldig bra. Eller mener du en ny grafisk terminal (som å åpne engnome-terminal
)?M-! gnome-terminal
, det fungerer. Jeg ‘ lurer på hvorforM-! bash
ikke kunne ‘ t gjøre det.bash
er et skall,M-! bash
vant ‘ sikkert ikke det du vil. Vennligst finn ut hvilken terminalemulator du ‘ bruker først.