emacsから外部端末を開く方法
On 12月 1, 2020 by admin新しいemacsユーザーはこちら。
open terminal here
パッケージが崇高なテキスト2で行うように、emacsからの現在のファイルパスでターミナルを開く機能が必要です。
ターミナルとは、M-x shell
、今のところ感謝できません。
グーグルで検索しましたが、何も見つかりませんでした… emacsの人たちはemacsでの生活を本当に楽しんでいるようです。
コメント
回答
プロセスを否認して、端末がその後も存続するようにする別の試みemacsが強制終了されます。
(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))
コメント
- 生成されたターミナルをに接続する方法はありますかemacsプロセスの存続期間は?
- 端末がロード時にデバッグメッセージを生成する場合、これは機能しません('(端末が終了するまでemacsはフリーズします)。修正するには、
2>&1
と>/dev/null
の順序を入れ替えます(>/dev/null
が最初になるようにします) 。 - これを試してみると、Emacsは'関数を呼び出させません。評価後、ミニバッファには
gnome-terminal-here
と表示されますが、gnome-terminal-here
と入力すると、[No match]
と表示されます。 - @ UTF-8これは、'関数がインタラクティブコマンドとして宣言されていないためです。'私の編集を参照してください。
回答
どのターミナルエミュレータを使用していますか? KDEのKonsole
を例にとると、関数を記述します。
(defun open-konsole () (interactive) (call-process "konsole" nil 0 nil "--workdir" default-directory))
5位の引数はkonsoleです。 “の引数。お好みのターミナルシミュレータのマニュアルページをご覧ください。
M-x open-konsole
は、新しいkonsoleプロセスを開き、現在のdefault-directory
を使用します。 (ELispのpwd
)作業ディレクトリとして。
コメント
- konsoleの場合、新しいタブを開くことができますはすでに
(call-process "konsole" nil 0 nil "--new-tab" "--workdir" default-directory)
で実行されています。また(call-process "wmctrl" nil 0 nil "-a" "\" – Konsole\"")
でウィンドウをアクティブにします。
回答
外部パッケージターミナル-ここを使用できます。これは1つのことだけを行いますが、うまくいきました。まさにあなたが要求したものです。複数のOSで機能します。
回答
他の回答は機能しませんでした。私のために。このコードは次のことを行います:
(defun open-gnome-terminal () (interactive) (shell-command "gnome-terminal"))
回答
ほとんどの場合shell-mode
。そのため、シェルを多用します-ここ。しかし、外部端末が必要な場合。これを使用して、tmuxでurxvt-clientを使用します:
- / usr / local / bin /に「term-here」という名前のファイルを作成します
urxvtc -e bash -c "tmux -q has-session && exec tmux attach-session -d || exec tmux new-session -n$USER -s$USER@$HOSTNAME"
- emacsで新しい関数を作成する
(defun term-here () (interactive) (start-process "" nil "term-here"))
- お気に入りのキーにバインドする
これにより、現在のディレクトリでurxvt-client(tmuxを使用)が開きます。私はそれをdired-mode-mapでバインドします。
(use-package dired :ensure nil :ensure-system-package urxvt :bind ((:map dired-mode-map ("," . term-here))))
urxvt-clientを選択したのは、高速でシンプルだからです。起動時にurxvtデーモンを実行することを忘れないでください。
回答
ターミナルでの構築-ここでは前に提案したように、私は実行するプログラムをシステムとデスクトップ環境に応じて決定する小さな関数を作成しました。デスクトップを変更したり、.emacs
を複数のコンピューター間で同期したりする場合に便利です。 「windows / darwin / gnome / …シェルコードはテストしていません。現時点では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))
回答
これは私にとっては完全にうまくいきました:(delete-window (async-shell-command "gnome-terminal"))
。ターミナルコマンドを交換してください。
M-x
ansi-term
を試しましたか?'はshell
よりもはるかに優れています。私はそれを使用していて、非常にうまく機能します。または、新しいグラフィカル端末()?M-! gnome-terminal
を試したところです。動作します。 'なぜM-! bash
が'できないのか疑問に思っています。bash
はシェルであり、M-! bash
は確かに'あなたが望むことをしません。 '最初に使用しているターミナルエミュレータを確認してください。