Cum se deschide un terminal extern de la emacs
On decembrie 1, 2020 by adminUtilizator nou de emacs aici.
Vreau să am posibilitatea de a deschide un terminal cu calea fișierului curent de la emacs, așa cum face pachetul open terminal here
în textul sublim 2.
Prin terminal, mă refer la un emulator de terminal extern separat care rulează bash sau zsh, cum ar fi gnome-terminal, nu shell-urile emulate din emacs, precum M-x shell
M-x eshell
, ceea ce nu pot să apreciez deocamdată.
Am căutat pe Google, dar nu am găsit nimic … Se pare că băieților emacs le place foarte mult să trăiască în emacs.
Comentarii
Răspuns
O altă încercare care renegă procesul, astfel încât terminalul dvs. va supraviețui chiar și după emacs este ucis.
(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))
Comentarii
- Există o modalitate de a lega terminalul generat de durata de viață a procesului emacs?
- Acest lucru nu ‘ funcționează (emacs se blochează până când terminalul iese) dacă terminalul dvs. generează mesaje de depanare la încărcare. Pentru a remedia, schimbați ordinea
2>&1
și>/dev/null
(astfel încât>/dev/null
să fie primul) . - Când încerc acest lucru, Emacs ‘ nici măcar nu mă lasă să apelez la funcție. După evaluare, mini tamponul spune
gnome-terminal-here
, dar când introducețignome-terminal-here
, scrie[No match]
. - @ UTF-8 Asta ‘ deoarece funcția nu a fost ‘ declarată ca o comandă interactivă. Vedeți editarea mea.
Răspuns
Ce emulator de terminal folosiți? Luați KDE „s Konsole
ca exemplu, scrieți doar o funcție:
(defun open-konsole () (interactive) (call-process "konsole" nil 0 nil "--workdir" default-directory))
Argumentele de pe locul 5 sunt console argumentul lui. Consultați pagina manuală a simulatorului de terminal preferat.
M-x open-konsole
va deschide un nou proces de consolă și va folosi actualul default-directory
(pwd
în ELisp) ca director de lucru.
Comentarii
- Se poate deschide o filă nouă dacă consultăm rulează deja cu
(call-process "konsole" nil 0 nil "--new-tab" "--workdir" default-directory)
. De asemenea,(call-process "wmctrl" nil 0 nil "-a" "\" – Konsole\"")
pentru a-i activa fereastra.
Răspuns
Puteți utiliza pachetul extern terminal-aici . Acest lucru face doar un lucru, dar nu bine; exact ceea ce ai solicitat. Și funcționează pentru mine pe mai multe sisteme de operare.
Răspuns
Celelalte răspunsuri nu au funcționat pentru mine. Acest cod face:
(defun open-gnome-terminal () (interactive) (shell-command "gnome-terminal"))
Răspuns
De cele mai multe ori folosesc shell-mode
. Așa că folosesc foarte mult shell-here . Dar când am nevoie de terminal extern. Folosesc urxvt-client cu tmux folosind acest lucru:
- Creați fișierul numit „term-here” în / usr / local / bin / care conține
urxvtc -e bash -c "tmux -q has-session && exec tmux attach-session -d || exec tmux new-session -n$USER -s$USER@$HOSTNAME"
- Creați o funcție nouă în emacs
(defun term-here () (interactive) (start-process "" nil "term-here"))
- Legați-vă de cheia preferată
Aceasta va deschide urxvt-client (cu tmux) în directorul curent. Îl leg în dired-mode-map.
(use-package dired :ensure nil :ensure-system-package urxvt :bind ((:map dired-mode-map ("," . term-here))))
Aleg urxvt-client deoarece este rapid și simplu. Nu uitați să rulați urxvt-daemon la pornire.
Răspunde
Construind pe terminal-aici, așa cum s-a propus mai înainte, eu a creat o mică funcție care determină în funcție de sistem și mediul desktop programul de rulat.Poate fi util dacă doriți să schimbați desktopul sau să vă păstrați .emacs
sincronizat între mai multe computere. Rețineți că nu am testat codul shell Windows / darwin / gnome / …, doar KDE este testat pentru moment.
;; ########################################################## ;; ### 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))
Răspuns
Acest lucru a funcționat perfect pentru mine: (delete-window (async-shell-command "gnome-terminal"))
. Schimbați comanda terminalului.
M-x
ansi-term
? ‘ este mult mai bun decâtshell
. Îl folosesc și funcționează foarte bine. Sau vă referiți la un terminal grafic nou (cum ar fi deschiderea unuignome-terminal
)?M-! gnome-terminal
, funcționează. ‘ mă întreb de ceM-! bash
nu a putut ‘ să o fac.bash
este un shell,M-! bash
cu siguranță a câștigat ‘ pentru a nu face ce vrei. Vă rugăm să aflați ce emulator de terminal ‘ utilizați mai întâi.