Jak otworzyć zewnętrzny terminal z emacsa
On 1 grudnia, 2020 by adminZupełnie nowy użytkownik emacsa tutaj.
Chcę mieć możliwość otwierania terminala z bieżącą ścieżką do pliku z emacsa, tak jak robi to pakiet open terminal here
w wysublimowanym tekście 2.
Terminem rozumiem oddzielny emulator terminala zewnętrznego, na którym działa bash lub zsh, np. gnome-terminal, a nie emulowane powłoki wewnątrz emacsa, na przykład M-x shell
M-x eshell
, czego na razie nie mogę docenić.
Poszukałem w Google, ale nic nie znalazłem … Wygląda na to, że ludzie z emacsa naprawdę lubią mieszkać w emacsie.
Komentarze
Odpowiedz
Kolejna próba, która wyrzeka się procesu, aby Twój terminal przetrwał nawet po emacs został zabity.
(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))
Komentarze
- Czy istnieje sposób na powiązanie uruchomionego terminala z czas życia procesu emacsa?
- To nie ' t działa (emacs zawiesza się do zakończenia pracy terminala), jeśli twój terminal generuje komunikaty debugowania podczas ładowania. Aby to naprawić, zamień kolejność
2>&1
i>/dev/null
(tak, aby>/dev/null
było pierwsze) . - Kiedy próbuję, Emacs nie ' nie pozwala mi nawet wywołać tej funkcji. Po dokonaniu oceny w minibuforze jest napisane
gnome-terminal-here
, ale przy wpisywaniugnome-terminal-here
pojawia się[No match]
. - @ UTF-8 To ' s, ponieważ funkcja nie została ' zadeklarowana jako komenda interaktywna. Zobacz moją zmianę.
Odpowiedz
Jakiego emulatora terminala używasz? Weźmy jako przykład KDE „s Konsole
, po prostu napisz funkcję:
(defun open-konsole () (interactive) (call-process "konsole" nil 0 nil "--workdir" default-directory))
Argumentami z piątego miejsca są konsole argument. Zobacz stronę podręcznika swojego preferowanego symulatora terminala.
M-x open-konsole
otworzy nowy proces konsoli i użyje obecnego default-directory
(pwd
w ELisp) jako katalog roboczy.
Komentarze
- Można otworzyć nową kartę, jeśli konsola już działa z
(call-process "konsole" nil 0 nil "--new-tab" "--workdir" default-directory)
. Ponadto(call-process "wmctrl" nil 0 nil "-a" "\" – Konsole\"")
, aby aktywować jego okno.
Odpowiedź
Możesz użyć zewnętrznego pakietu terminal-here . To robi tylko jedną rzecz, ale tak to dobrze; dokładnie to, o co prosiłeś. I działa dla mnie na wielu systemach operacyjnych.
Odpowiedź
Pozostałe odpowiedzi nie zadziałały dla mnie. Ten kod daje:
(defun open-gnome-terminal () (interactive) (shell-command "gnome-terminal"))
Odpowiedź
Najczęściej używam shell-mode
. Dlatego intensywnie używam shell-here . Ale kiedy potrzebuję zewnętrznego terminala. Używam klienta urxvt z tmux, używając tego:
- Utwórz plik o nazwie „term-tutaj” w / usr / local / bin / zawierający
urxvtc -e bash -c "tmux -q has-session && exec tmux attach-session -d || exec tmux new-session -n$USER -s$USER@$HOSTNAME"
- Utwórz nową funkcję w emacs
(defun term-here () (interactive) (start-process "" nil "term-here"))
- Powiąż z ulubionym kluczem
To otworzy urxvt-client (z tmux) w twoim bieżącym katalogu. Wiążę to na mapie trybu dired.
(use-package dired :ensure nil :ensure-system-package urxvt :bind ((:map dired-mode-map ("," . term-here))))
Wybieram urxvt-client, ponieważ jest szybki i prosty. Nie zapomnij uruchomić swojego demona urxvt podczas uruchamiania.
Odpowiedź
Opierając się na terminalu, jak zaproponowano wcześniej, ja stworzył małą funkcję, która określa w zależności od systemu i środowiska graficznego program do uruchomienia.Może to być przydatne, jeśli lubisz zmieniać pulpit lub synchronizować .emacs
między kilkoma komputerami. Zauważ, że nie testowałem kodu powłoki windows / darwin / gnome / …, na razie testowane jest tylko 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))
Odpowiedź
U mnie zadziałało doskonale: (delete-window (async-shell-command "gnome-terminal"))
. Zamień polecenie terminala.
M-x
ansi-term
? To ' jest znacznie lepszy niżshell
. Używam go i działa naprawdę dobrze. Czy masz na myśli nowy terminal graficzny (np. otwieraniegnome-terminal
)?M-! gnome-terminal
, działa. ' Zastanawiam się, dlaczegoM-! bash
nie mógł ' tego zrobić.bash
to powłoka,M-! bash
z pewnością wygrał ' t rób co chcesz. Dowiedz się, jakiego emulatora terminala ' używasz jako pierwszy.