P: ¿cómo puedo obtener nuevos buffers para honrar el mapeo auto-mode-alist?
Al encontrar un archivo , Emacs compara la extensión del archivo auto-mode-alistpara determinar qué modo principal usar para el búfer del archivo. ¿Hay alguna forma de utilizar la información auto-mode-alistpara determinar el modo de un búfer que (todavía) no tiene un archivo asociado?
Es decir: si abro un nuevo búfer cuyo nombre tiene algo parecido a una extensión de archivo, ¿puedo hacer que se abra automáticamente en el modo esperado? Por ejemplo, si tuviera que abrir un nuevo búfer a-new-buffer.elque aún no está asociado con un archivo, quiero que se abra en emacs-lisp-modelugar del modo predeterminado.
buffers
major-mode
Dan
fuente
fuente

auto-mode-alist, hace que el búfer " visite " el archivo (y eso se encarga de todo).orgbúfer temporal para probar nuevas funciones en las que estoy escribiendo para su usoorg-mode; b) unRbuffer temporal para hacer algunas manipulaciones estadísticas rápidas y descartables; c) un búfer de texto temporal para componer un correo electrónico. En cada caso, no quiero crear un archivo para visitar, solo quiero un búfer desechable que, sin embargo, se abra en el modo apropiado.C-x C-fno , no " crear un archivo de la visita ". Ese es un malentendido fundamental. Simplemente hacen exactamente lo que estás buscando. Es solamente si y cuando intenta guardar el búfer que un archivo se crea. Si no intenta guardar el búfer, no se crea ningún archivo. Lo que quieres, por lo que entiendo hasta ahora, es "visitar un archivo" (lo que realmente significa abrir un búfer en el modo adecuado).Respuestas:
Comandos de visita de archivos como
C-x C-fno crear un archivo para visitar. Hacen lo que estás buscando.Solo si y cuando intentas guardar el búfer se crea un archivo .
Si no intenta guardar el búfer, no se crea ningún archivo. Lo que quieres, por lo que entiendo hasta ahora, es " visitar un archivo " (lo que realmente significa abrir un búfer en el modo adecuado).
fuente
npara no guardar o (a menudo) simplemente guardo el búfer. Y luego lanzo el archivo creado ... o no.)*scratch*: se le pide que guarde cuando ese dedo golpea automáticamenteC-x C-s.Si ha estado usando la solución de Juri Linkov durante años.
Creo búferes temporales con algo así
C-xbtest.orgC-j. Elmajor-modeestá determinado por la extensión del archivo a través deauto-mode-alist.Para probar el efecto puedes probar
(prog1 (and (switch-to-buffer "my-new.org") major-mode) (kill-buffer "my-new.org"))=>org-mode. En una limpieza,emacs -qla prueba volveríafundamental-mode.fuente
adviceopción que había estado usando. No estoy seguro de si sigo para qué(prog1...)sirve la parte, pero la(setq-default major-mode ...)parte es bastante agradable.prog1prueba solo muestra que obtienes lo esperadomajor-modeal cambiar a un búfer. Evalúe lasetq-defaultparte y ejecute la prueba. Volveráorg-modeSin elsetq-defaultvolveríafundamental-mode.Descubrí una forma basada en consejos usando ideas que vinieron de los comentarios de @ Drew y la respuesta de @ glucas que registraré aquí en caso de que sean útiles para alguien.
La versión corta: use
afterconsejos para consultar si el búfer tiene un nombre de archivo asociado, configure uno temporalmente si no lo tiene, y luego deje que el resto de laset-auto-modemaquinaria se encargue de los detalles. Después de un poco de pruebas (no extensas), parece estar funcionando bien.Para
ido-switch-buffery vainillaswitch-to-buffer, los dos consejos serían:Considero que esta opción es útil además de
find-fileque @Drew levantó porque mis dedos pueden adelantarse a mi cerebro: la memoria muscular a menudo me llevará al territorio de cambio a buffer antes de que se me ocurra completamentefind-filelo que necesito. Ahora, ambas opciones están disponibles.ACTUALIZACIÓN: error pequeño pero potencialmente irritante en el código anterior: volverá a ejecutar el gancho de modo en el búfer cada vez que lo cambie. Lo siguiente le da un nombre de archivo real fuera del
/tmpdirectorio y evita ese problema:fuente
La
set-auto-modefunción establece el modo en función del archivo asociado con un búfer. Aquí hay una función que se establece temporalmentebuffer-file-namedesde el nombre del búfer para establecer el modo:Puede ejecutar esto cuando se cambia el nombre de un búfer utilizando consejos:
No estoy seguro del mejor lugar para conectar esto para afectar los nuevos buffers. Aquí estoy usando el
buffer-list-update-hook, pero eso se llama en más casos de los que necesitamos.fuente
buffer-list-update-hookporquechange-major-mode-hookno se llamaba con el búfer actual esperado. Para el registro, probablemente tenga más sentido aconsejar a su función switch-buffer como lo hace @Dan en su respuesta.Puede usar buffers * scratch * con el fin de crear buffers temporales que tengan el mismo modo principal que el archivo en el que podría estar trabajando.
Aquí una respuesta de emacs SE que podría resolver su problema:
¿Cómo puedo alternar rápidamente entre un archivo y un búfer * scratch * que tiene el mismo modo principal?
La pregunta y la respuesta mencionadas fueron publicadas por mí. La respuesta en la función hace lo siguiente:
*scratch-X-mode*si aún no existe, y cambia a este búfer recién creado.*scratch-X-mode*ya existe, simplemente cambia a ese búfer.fuente
Aquí hay algunas buenas respuestas, pero quería agregar una cosa más. Emacs tiene un montón de características y, a menudo, hay varias formas de hacer algo. Puede agregar etiquetas en la parte superior de cualquier archivo que indiquen a emacs de qué tipo es, independientemente de la extensión. Por ejemplo agregando esto:
En la parte superior de un archivo se le hará saber a emacs que es un archivo Python incluso sin la
.pyextensión. Tenga en cuenta que#al principio de la línea hay un comentario de estilo Python. Para diferentes tipos de archivos puede usar diferentes comentarios. Por ejemplo, para especificar un archivo Lisp que utiliza;para iniciar una línea de comentarios y establecer el modo en emacs de esta manera:Consulte Especificar variables de archivo y Elegir modos de archivo .
fuente
switch-buffer) y que el modo se configure automáticamente en algo diferentefundamental-mode.