====== EmacsのCompletionsバッファを新規ウィンドウではなく既存ウィンドウに表示させる ====== 通常、EmacsでTAB補完の時とかに表示されるCompletionsバッファは、フレーム((Emacs用語としてのフレーム))下部を分割した一時的なウィンドウ((Emacs用語としてのウィンドウ))として表示される。言葉じゃわかりにくいので、スクショを張っとくと↓こんな感じね。 {{ :blog:2018:emacs_splitted_completions_window.png |こっちは嫌(Completionsウィンドウが独立に開く)}} 自分のEmacsの使い方は垂直分割した2つのウィンドウ表示が基本で、Completionsバッファは非アクティブな方のウィンドウに出て欲しい。その方が補完候補の一覧性が圧倒的だし、ウィンドウがパカパカしないのがいい。スクショを張(ry {{ :blog:2018:emacs_switched_completions_window.png |こっちがいい(Completionsバッファが非アクティブなウィンドウに表示される)}} [[https://stackoverflow.com/questions/4195666/display-compilation-in-inactive-buffer|ここ]]の回答に載ってるelispを参考に、ウィンドウが1つの時はウィンドウ幅に応じて分割方向を変えるようにしてみた。 (defun display-on-side (buffer &optional not-this-window frame) (let* ((window (or (minibuffer-selected-window) (selected-window))) (display-buffer-function nil) (pop-up-windows nil)) (with-selected-window (or window (error "display-on-side")) (when (one-window-p t) (if (> (window-pixel-width) (window-pixel-height)) (split-window-horizontally) (split-window-vertically)) ) (display-buffer buffer not-this-window frame)))) (setq display-buffer-function 'display-on-side) 水平2分割した状態で使うと、非アクティブなウィンドウの方がCompletions表示時に勝手にリサイズされる問題があったりする…。自分は水平分割使わないので放置してます、すいません。えらいひと直して教えてください。 ===== 参考サイト ===== * [[https://stackoverflow.com/questions/4195666/display-compilation-in-inactive-buffer|emacs - Display compilation in inactive buffer - Stack Overflow]] * [[https://emacs.stackexchange.com/questions/21416/how-to-force-completions-buffer-to-appear-in-a-side-window|How to force completions buffer to appear in a side window? - Emacs Stack Exchange]] * [[https://www.gnu.org/software/emacs/manual/html_node/elisp/Window-Sizes.html|Window Sizes - GNU Emacs Lisp Reference Manual]]