Jak otevřít externí terminál z emacsu
On 1 prosince, 2020 by adminZcela nový uživatel emacs zde.
Chci mít možnost otevírat terminál s aktuální cestou k souboru z emacsu, jako to dělá balíček open terminal here
ve vznešeném textu 2.
Terminálem mám na mysli samostatný externí emulátor terminálu, na kterém běží bash nebo zsh, například gnome-terminal, nikoli emulované skořápky uvnitř emacs, jako M-x shell
M-x eshell
, což zatím nemohu ocenit.
Vygooglil jsem se, ale nenašel jsem nic … Zdá se, že emacsové si život v emacsu opravdu užívají.
Komentáře
jsem se právě pokusilM-! gnome-terminal
, funguje to. ‚ Zajímalo by mě, pročM-! bash
to nemohu ‚ udělat.
bash
je prostředí, M-! bash
určitě nebude ‚ dělat, co chcete. Zjistěte prosím, jaký emulátor terminálu ‚ používáte jako první. Odpovědět
Další pokus, který proces odmítá, aby váš terminál přežil i po emacs je zabit.
(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))
Komentáře
- Existuje způsob, jak svázaný terminál spojit s životnost procesu emacs?
- Toto ‚ nefunguje (emacs zamrzne, dokud terminál neopustí), pokud váš terminál při načítání generuje ladicí zprávy. Chcete-li to opravit, vyměňte pořadí
2>&1
a>/dev/null
(aby>/dev/null
byl na prvním místě) . - Když to zkusím, Emacs mi ‚ ani nedovolí zavolat funkci. Po vyhodnocení mini buffer říká
gnome-terminal-here
, ale při zadánígnome-terminal-here
říká[No match]
. - @ UTF-8 To ‚ s, protože funkce nebyla ‚ deklarována jako interaktivní příkaz. Viz moje úprava.
Odpověď
Jaký terminálový emulátor používáte? Jako příklad si vezměte KDE „s Konsole
, stačí napsat funkci:
(defun open-konsole () (interactive) (call-process "konsole" nil 0 nil "--workdir" default-directory))
Argy z 5. místa jsou konsole argument. Podívejte se na manuálovou stránku preferovaného simulátoru terminálu.
M-x open-konsole
otevře nový proces konzoly a použije aktuální default-directory
(pwd
v ELispu) jako pracovní adresář.
Komentáře
- V případě konsole lze otevřít novou kartu již běží s
(call-process "konsole" nil 0 nil "--new-tab" "--workdir" default-directory)
. Také(call-process "wmctrl" nil 0 nil "-a" "\" – Konsole\"")
aktivovat jeho okno.
Odpověď
Můžete použít externí balíček terminal-here . To dělá jen jednu věc, ale dělá to dobře; přesně to, co jste požadovali. A funguje pro mě na více operačních systémech.
Odpověď
Ostatní odpovědi nefungovaly pro mě. Tento kód:
(defun open-gnome-terminal () (interactive) (shell-command "gnome-terminal"))
Odpověď
Většinu času používám shell-mode
. Takže hodně používám shell-here . Ale když potřebuji externí terminál. Používám urxvt-client s tmux pomocí tohoto:
- Vytvořit soubor s názvem „term-here“ v / usr / local / bin / obsahující
urxvtc -e bash -c "tmux -q has-session && exec tmux attach-session -d || exec tmux new-session -n$USER -s$USER@$HOSTNAME"
- Vytvořit novou funkci v emacsu
(defun term-here () (interactive) (start-process "" nil "term-here"))
- Vázat na váš oblíbený klíč
Tím se otevře urxvt-client (s tmux) ve vašem aktuálním adresáři. Svázám to v dired-mode-map.
(use-package dired :ensure nil :ensure-system-package urxvt :bind ((:map dired-mode-map ("," . term-here))))
Volím klienta urxvt, protože je rychlý a jednoduchý. Nezapomeňte spustit svého démona urxvt při spuštění.
Odpovědět
V návaznosti na navrhovaný terminál zde vytvořil malou funkci, která určuje v závislosti na prostředí systému a desktopu, který má program spustit.Může to být užitečné, pokud rádi měníte plochu, nebo chcete .emacs
synchronizovat mezi několika počítači. Všimněte si, že jsem netestoval kód prostředí Windows / darwin / gnome / …, zatím je testováno pouze KDE.
;; ########################################################## ;; ### 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))
Odpověď
To pro mě fungovalo naprosto v pořádku: (delete-window (async-shell-command "gnome-terminal"))
. Vyměňte příkaz terminálu.
M-x
ansi-term
? ‚ je mnohem lepší nežshell
. Používám to a funguje to opravdu dobře. Nebo máte na mysli nový grafický terminál (jako otevřenígnome-terminal
)?