hajime-f
@hajime-f (藤田 肇)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

Emacs 上で zsh を便利に使いたい

解決したいこと

macOS の VSCode では、

  1. Cmd+j でシェルがサブウィンドウで起動し、フォーカスがシェルに当たる
  2. 再度 Cmd+j でサブウィンドウが閉じ、フォーカスがエディタに戻る

と動作します。
これと同じことを Emacs 上で実現したいと考えています。

M-x term で zsh が起動しますが、下記の問題があります。

  1. 編集中のバッファが切り替わり、zsh のバッファに強制的に移行する(VSCode のようにサブウィンドウで開かない)
  2. zsh バッファでは Emacs のキーバインドが使えない

Emacs における理想の動作は、VSCode と同じように、

  1. Cmd+j で画面が二分割され、下画面(下バッファ)で zsh が起動してフォーカスが当たる
  2. 再度 Cmd+j で上画面にフォーカスが当たり、下バッファが閉じて一画面に戻る

です。

これを実現できている方、いらっしゃいませんでしょうか。
もしいたら、方法をご教授いただきたく、よろしくお願いいたします。

0

3Answer

この件、自己解決しました!
下記のとおりに設定すれば、所望の動作が実現しました🙆‍♂️

(defun toggle-zsh-window ()
  (interactive)
  (if (get-buffer-window "*terminal*")
      (progn
        (switch-to-buffer (other-buffer))
        (delete-window (get-buffer-window "*terminal*")))
    (progn
      (split-window-below)
      (other-window 1)
      (term "/bin/zsh")
      (rename-buffer "*terminal*"))))
(global-set-key (kbd "C-'") 'toggle-zsh-window)
(add-hook 'term-mode-hook
          (lambda ()
            (define-key term-raw-map (kbd "C-'") 'toggle-zsh-window)))
1Like

こんな感じでしょうか?
以下の一文を .emacs.d/init.el の末尾に記述して試してください。

(defun my-shell ()
  (interactive)
  (let ((buf (shell)))
    (split-window-below)
    (switch-to-buffer (other-buffer buf))
    (switch-to-buffer-other-window buf))
    (local-set-key (kbd "M-j") 'delete-window)
)

(global-set-key (kbd "M-j") 'my-shell)

Emacs のキーバインドが使えない

ということなので term ではなく shell を使うようにしています。

0Like

Comments

  1. @hajime-f

    Questioner

    うおおお!神!!
    理想とする動作にかなり近いです!!ありがとうございます!!

    ...1点だけ、shell だと zsh-completions などの zsh の機能が使えず、シェルとして貧弱なので、term を使いたいのです。。
    こちらなんとかならないでしょうか。。?

こんな感じの設定を考えました。

(defun toggle-zsh-window ()
  (interactive)
  (if (get-buffer-window "*shell*")
      (progn
        (delete-window (get-buffer-window "*shell*"))
        (switch-to-buffer (other-buffer)))
    (progn
      (split-window-below)
      (other-window 1)
      (term "/bin/zsh")
      (rename-buffer "*shell*"))))
(global-set-key (kbd "C-j") 'toggle-zsh-window)

C-j を押すことで「画面が二分割され、下画面(下バッファ)で zsh が起動してフォーカスが当たる」については実現できます。

ところが、「再度 C+j で上画面にフォーカスが当たり、下バッファが閉じて一画面に戻る」が実現できないんですね...😔

なんとかならないでしょうか。。

0Like

Your answer might help someone💌