window – Prefiere las divisiones verticales sobre las horizontales

Pregunta:

Hay varias preguntas similares a esta. Los he leído todos y no dan una respuesta para mi escenario. Quiero que emacs prefiera las divisiones verticales (dividir las ventanas en partes izquierda y derecha) sobre las horizontales, incluso si es posible la división horizontal y vertical . Esto es lo que dice el manual :

La división puede ser vertical u horizontal, dependiendo de las variables umbral de altura dividida y umbral de ancho dividido. Estas variables deben tener valores enteros. Si el umbral de altura dividido es más pequeño que la altura de la ventana elegida, la división coloca la nueva ventana debajo. De lo contrario, si el umbral de ancho de división es más pequeño que el ancho de la ventana, la división coloca la nueva ventana a la derecha.

Entonces, si tanto el split-height-threshold split-width-threshold como el split-height-threshold split-width-threshold son más pequeños que el ancho y la altura de la ventana, emacs realizará una división horizontal. Quiero lo contrario. Si ambos umbrales son más pequeños, realice una división vertical.

Una forma de lograrlo es establecer el split-height-threshold en nil , pero no me gusta porque desactiva la división horizontal por completo.

He examinado la función split-window-sensibly , pero no soy lo suficientemente bueno en elisp para escribir mi propia función de my-split-window-sensibly que funcione como quiero.

Respuesta:

En mi experiencia, este es un problema más difícil de lo que uno podría pensar, porque la idea intuitiva de lo que es sensible no siempre es fácil de expresar en términos precisos. Solo describiré lo que terminé con, pero es posible que tengas que jugar.

Primero: la función existente de split-window-sensibly siempre prefiere terminar con una pila horizontal de ventanas (que, de manera bastante confusa, llama una "división" vertical, aunque la división es horizontal …) sobre un lado a lado arreglo lateral. Es bastante fácil crear una función que tenga la preferencia opuesta, que es esencialmente una copia de split-window-sensibly con las preferencias invertidas:

(defun split-window-sensibly-prefer-horizontal (&optional window)
"Based on split-window-sensibly, but designed to prefer a horizontal split,
i.e. windows tiled side-by-side."
  (let ((window (or window (selected-window))))
    (or (and (window-splittable-p window t)
         ;; Split window horizontally
         (with-selected-window window
           (split-window-right)))
    (and (window-splittable-p window)
         ;; Split window vertically
         (with-selected-window window
           (split-window-below)))
    (and
         ;; If WINDOW is the only usable window on its frame (it is
         ;; the only one or, not being the only one, all the other
         ;; ones are dedicated) and is not the minibuffer window, try
         ;; to split it horizontally disregarding the value of
         ;; `split-height-threshold'.
         (let ((frame (window-frame window)))
           (or
            (eq window (frame-root-window frame))
            (catch 'done
              (walk-window-tree (lambda (w)
                                  (unless (or (eq w window)
                                              (window-dedicated-p w))
                                    (throw 'done nil)))
                                frame)
              t)))
     (not (window-minibuffer-p window))
     (let ((split-width-threshold 0))
       (when (window-splittable-p window t)
         (with-selected-window window
               (split-window-right))))))))

Así que ahora tenemos dos funciones: la original que "prefiere" una pila vertical y la nueva que "prefiere" una pila horizontal.

A continuación, necesitamos una función que tiende a preferir la que preferiríamos usar.

(defun split-window-really-sensibly (&optional window)
  (let ((window (or window (selected-window))))
    (if (> (window-total-width window) (* 2 (window-total-height window)))
        (with-selected-window window (split-window-sensibly-prefer-horizontal window))
      (with-selected-window window (split-window-sensibly window)))))

Necesita jugar con los valores aquí, pero la idea básica es que preferimos una disposición vertical siempre que haya al menos el doble de ancho que de alto. Puede pensar que lo quería donde la ventana existente sea más ancha que alta, pero en mi experiencia eso no es correcto y le permite terminar con ventanas que son demasiado delgadas.

Finalmente, también necesitamos tener unos mínimos cuerdos. Establecí un split-height-threshold de split-height-threshold de 4 (es decir, no quiero, a menos que sea inevitable, tener menos de 2 líneas en una ventana) y un split-width-threshold de split-width-threshold de 40 (es decir, no quiero, a menos que es inevitable tener menos de 20 caracteres en una ventana), al menos creo que eso es lo que significan.

Luego, uno simplemente une la split-window-preferred-function split-window-really-sensibly

(setq
   split-height-threshold 4
   split-width-threshold 40 
   split-window-preferred-function 'split-window-really-sensibly)

Otra idea (que quizás prefiera) sería simplemente sustituir la disposición de "preferencia por lado a lado" y establecer el split-width-threshold en 80: entonces obtendría ventanas de lado a lado siempre que hubiera espacio para ellos, creo.

Leave a Comment

Your email address will not be published.

Scroll to Top

istanbul avukat

-

web tasarım