Como abrir um terminal externo de emacs
On Dezembro 1, 2020 by adminNovo usuário emacs aqui.
Eu quero ter a capacidade de abrir um terminal com o caminho do arquivo atual do emacs, como o que o pacote open terminal here
faz em texto sublime 2.
Por terminal, quero dizer um emulador de terminal externo separado executando bash ou zsh, como gnome-terminal, não os shells emulados dentro do emacs, como M-x shell
M-x eshell
, o que não posso apreciar por agora.
Pesquisei, mas não encontrei nada … Parece que os caras do emacs realmente gostam de viver no emacs.
Comentários
Resposta
Outra tentativa que rejeita o processo para que seu terminal sobreviva mesmo depois emacs é eliminado.
(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))
Comentários
- Existe uma maneira de amarrar o terminal gerado ao tempo de vida do processo emacs?
- Isso não ‘ t funciona (o emacs congela até que o terminal saia) se seu terminal gerar qualquer mensagem de depuração ao carregar. Para corrigir, troque a ordem de
2>&1
e>/dev/null
(de modo que>/dev/null
venha primeiro) . - Quando tento fazer isso, o Emacs não ‘ nem me deixa chamar a função. Após a avaliação, o mini buffer diz
gnome-terminal-here
, mas ao entrar emgnome-terminal-here
, diz[No match]
. - @ UTF-8 Isso ‘ s porque a função não foi ‘ declarada como um comando interativo. Veja minha edição.
Resposta
Que emulador de terminal você está usando? Pegue o KDE “s Konsole
como exemplo, apenas escreva uma função:
(defun open-konsole () (interactive) (call-process "konsole" nil 0 nil "--workdir" default-directory))
Os argumentos do 5º lugar são konsole “s argumento. Consulte a página de manual do simulador de terminal de sua preferência.
M-x open-konsole
abrirá um novo processo do konsole e usará o default-directory
atual (pwd
em ELisp) como diretório de trabalho.
Comentários
- É possível abrir uma nova guia se o konsole já está em execução com
(call-process "konsole" nil 0 nil "--new-tab" "--workdir" default-directory)
. Além disso,(call-process "wmctrl" nil 0 nil "-a" "\" – Konsole\"")
para ativar sua janela.
Resposta
Você pode usar o pacote externo terminal-aqui . Isso faz apenas uma coisa, mas faz está bem; exatamente o que você solicitou. E funciona para mim em vários sistemas operacionais.
Resposta
As outras respostas não funcionaram para mim. Este código:
(defun open-gnome-terminal () (interactive) (shell-command "gnome-terminal"))
Responde
Na maioria das vezes eu uso shell-mode
. Portanto, eu uso intensamente o shell-here . Mas quando preciso de terminal externo. Eu uso urxvt-client com tmux usando isto:
- Crie um arquivo chamado “term-here” em / usr / local / bin / contendo
urxvtc -e bash -c "tmux -q has-session && exec tmux attach-session -d || exec tmux new-session -n$USER -s$USER@$HOSTNAME"
- Crie uma nova função no emacs
(defun term-here () (interactive) (start-process "" nil "term-here"))
- Vincule à sua chave favorita
Isso abrirá o urxvt-client (com tmux) em seu diretório atual. Eu o vinculo no mapa do modo dired.
(use-package dired :ensure nil :ensure-system-package urxvt :bind ((:map dired-mode-map ("," . term-here))))
Escolho o urxvt-client porque é rápido e simples. Não se esqueça de executar o urxvt-daemon na inicialização.
Resposta
Construindo no terminal-aqui como proposto antes, eu criou uma pequena função que determina, dependendo do sistema e ambiente de área de trabalho, o programa a ser executado.Pode ser útil se você gosta de mudar a área de trabalho ou manter seu .emacs
sincronizado entre vários computadores. Observe que eu não testei o código do shell windows / darwin / gnome / …, apenas o KDE foi testado por enquanto.
;; ########################################################## ;; ### 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))
Resposta
Funcionou perfeitamente bem para mim: (delete-window (async-shell-command "gnome-terminal"))
. Troque o comando do terminal.
M-x
ansi-term
? Ele ‘ é muito melhor queshell
. Eu uso e funciona muito bem. Ou você quer dizer um novo terminal gráfico (como abrir umgnome-terminal
)?M-! gnome-terminal
, funciona. Eu ‘ estou me perguntando por queM-! bash
não poderia ‘ não fazer isso.bash
é um shell,M-! bash
com certeza não ‘ fará o que quiser. Descubra qual emulador de terminal você ‘ está usando primeiro.