Hay varias preguntas similares a esta. Los he leído todos y no proporcionan una respuesta para mi escenario. Quiero que emacs prefiera divisiones verticales (división de ventanas en partes izquierda y derecha) sobre 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 split-height-umbral y split-width-umbral. Estas variables deben tener valores enteros. Si el umbral de altura de división es menor 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 menor que el ancho de la ventana, la división coloca la nueva ventana a la derecha.
Entonces, si ambos split-height-threshold
y 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 a conjunto split-height-threshold
a nil
, pero que no me gusta que debido a que desactiva la división horizontal por completo.
He examinado la split-window-sensibly
función, pero no soy lo suficientemente bueno en elisp para escribir mi propia my-split-window-sensibly
función que funciona como quiero.
fuente
split-window-preferred-function
que se puede configurar para usar una función personalizada. Eche un buen vistazo a la funciónsplit-window-sensibly
y vea si puede satisfacer sus necesidades ajustando ciertas variables como mencionó en su pregunta, y también lea la cadena de documentos de esa función ... si no se puede hacer para satisfacer sus necesidades, entonces se puede escribir otra, u obtener ayuda para escribir otra función ...Respuestas:
En mi experiencia, este es un problema más difícil 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é con qué terminé, pero es posible que tengas que jugar un poco.
Primero: la
split-window-sensibly
función existente 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 una disposición de lado a lado. Es bastante fácil crear una función que tenga la preferencia opuesta, que es esencialmente solo una copia desplit-window-sensibly
las preferencias invertidas:Así que ahora tenemos dos funciones: la original que "prefiere" una pila vertical y la nueva que "prefiere" una pila horizontal.
Luego necesitamos una función que tiende a preferir la que preferimos usar.
Debe 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 altura. Puede pensar que lo quería donde la ventana existente es 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 algunos mínimos sanos. Establezco un
split-height-threshold
4 (es decir, no quiero, a menos que sea inevitable, tener menos de 2 líneas en una ventana) y unsplit-width-threshold
40 (es decir, no quiero, a menos que sea inevitable, tener menos de 20 caracteres de ancho en una ventana), al menos creo que eso es lo que significan.Entonces uno solo se une
split-window-preferred-function
asplit-window-really-sensibly
Otra idea (que podría preferir) sería simplemente sustituir la disposición de "preferencia de lado a lado" y establecerla
split-width-threshold
en 80: entonces obtendría ventanas de lado a lado siempre que hubiera espacio para ellos, creo.fuente
split-height/width-threshold
valores por defecto o de lo contrario lapop-to-buffer
función crearía nuevas divisiones en lugar de reutilizar las antiguas. Prefiero tener una sola división derecha / izquierda y no quiero que las funciones de emacs se metan con eso.Puede usar mi paquete
el-patch
para implementar la funciónsplit-window-sensibly-prefer-horizontal
de manera que haga obvio lo que ha cambiado desde el originalsplit-window-sensibly
, y también le permite detectar si la definición original cambia en una futura versión de Emacs:fuente
Encontré esta solución en la lista de correo de Emacs , y funciona de maravilla:
Felicitaciones a Alexander, el autor original.
fuente