Hogyan lehet megnyitni egy külső terminált az emacs-ból
On december 1, 2020 by adminVadonatúj emacs felhasználó itt.
Azt akarom, hogy megnyithassak egy terminált az emacs fájlok aktuális elérési útjával, például azt, amit a open terminal here
csomag 2. fenséges szövegben csinál.
Terminál alatt egy külön külső terminál emulátort értek, amely bash vagy zsh rendszert futtat, például a gnome-terminal, nem pedig az emacs-ben lévő emulált héjakat, például M-x shell
M-x eshell
, amit egyelőre nem tudok értékelni.
Googleltem, de nem találtam semmit … Úgy tűnik, hogy az emacs srácok nagyon élvezik az emacs-ban való életet.
Hozzászólások
Válasz
Egy másik próbálkozás, amely elutasítja a folyamatot, így a terminál túlélni fog még emacsot megölik.
(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))
Megjegyzések
- Van-e mód arra, hogy az ívott terminált a az emacs folyamat élettartama?
- Ez ‘ nem működik (az emacs lefagy, amíg a terminál ki nem lép), ha a terminál betölti a hibakeresési üzeneteket. A javításhoz cserélje fel a
2>&1
és a>/dev/null
sorrendet (úgy, hogy a>/dev/null
legyen az első) . - Amikor megpróbálom, Emacs még ‘ sem engedi, hogy meghívjam a függvényt. Kiértékelés után a mini puffer azt mondja, hogy
gnome-terminal-here
, de amikor beírja agnome-terminal-here
-t, azt mondja:[No match]
. - @ UTF-8 Ez ‘ azért van, mert a függvényt nem ‘ nem deklarálták interaktív parancsként. Lásd a szerkesztésemet.
Válasz
Milyen terminálemulátort használsz? Vegyük példaként a KDE “s Konsole
-t, csak írjon egy függvényt:
(defun open-konsole () (interactive) (call-process "konsole" nil 0 nil "--workdir" default-directory))
Az 5. helyről származó args konzol érvelése. Tekintse meg a kívánt terminálszimulátor man oldalát.
M-x open-konsole
új konsole folyamatot nyit meg, és az aktuális default-directory
(pwd
az ELisp-ben) munkakönyvtárként.
Megjegyzések
- Új lapot lehet megnyitni, ha konsole már fut a következővel:
(call-process "konsole" nil 0 nil "--new-tab" "--workdir" default-directory)
. Az ablak aktiválásához szintén(call-process "wmctrl" nil 0 nil "-a" "\" – Konsole\"")
.
Válasz
Használhatja a terminál-ide külső csomagot. Ez csak egyet, de nem jól; pontosan mit kért. És nekem több operációs rendszeren is működik.
Válasz
A többi válasz nem működött nekem. Ez a kód:
(defun open-gnome-terminal () (interactive) (shell-command "gnome-terminal"))
Válasz
Legtöbbször shell-mode
. Tehát erősen használom a shell-here alkalmazást. De amikor külső terminálra van szükségem. Az urxvt-klienst a tmux-szal használom ezzel:
- Hozzon létre “term-here” nevű fájlt a / usr / local / bin / tartalmazó
- Hozzon létre új függvényt az emacs-ban
(defun term-here () (interactive) (start-process "" nil "term-here"))
- Ragaszkodjon kedvenc kulcsához
Ez megnyitja az urxvt-klienst (tmux-szal) az aktuális könyvtárban. Dired-mode-map-ba kötöm.
(use-package dired :ensure nil :ensure-system-package urxvt :bind ((:map dired-mode-map ("," . term-here))))
Az urxvt-klienst választom, mert gyors és egyszerű. Ne felejtsd el futtatni az urxvt-démonot az indításkor.
Válasz
A terminálra építve, az előbbiek szerint, I létrehozott egy kis funkciót, amely a rendszertől és az asztali környezettől függően meghatározza a futtatni kívánt programot.Hasznos lehet, ha szeretné megváltoztatni az asztalt, vagy ha szinkronizálja .emacs
jét több számítógép között. Ne feledje, hogy nem teszteltem a windows / darwin / gnome / … shell kódot, egyelőre csak a KDE tesztelt.
;; ########################################################## ;; ### 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))
Válasz
Ez nekem teljesen jól sikerült: (delete-window (async-shell-command "gnome-terminal"))
. Cserélje ki a terminál parancsát.
M-x
ansi-term
alkalmazást? Ez ‘ sokkal jobb, mint ashell
. Használom, és nagyon jól működik. Vagy egy új grafikus terminálra gondolsz (például egy )?M-! gnome-terminal
, működik. ‘ kíváncsi vagyok, miért nem tudtaM-! bash
‘ csinálni.bash
egy héj,M-! bash
biztosan elnyerte ‘ t, amit akar. Tudja meg, melyik terminálemulátort ‘ használja először.