Estoy escribiendo un modo principal para un lenguaje de programación, pero quiero admitir versiones anteriores de Emacs. prog-modeEs relativamente nuevo. Quiero heredar de prog-modesi está definido, pero de lo contrario seguiré haciendo algo sensato.
¿Cuál es el mejor enfoque? ¿Debo defalias prog-modeusar Emacsen más antiguo, o eso interferirá con otros modos si hacen lo mismo?
major-mode
prog-mode
version-compatibilty
Wilfred Hughes
fuente
fuente

prog-mode. En particular, sufrirá la falta de unión léxica.Respuestas:
A costa de un enlace de símbolo de nivel superior adicional, hay una solución muy clara que evita repetir el
define-derived-modeformulario:Funciona bien en cualquier Emacs> = 23. Se me ocurrió esto hace
haml-modeun par de años IIRC, y parece haberse extendido desde allí a varios otros modos principales. Lo principal que hace ladefine-derived-modemacro con el símbolo del modo padre es generar código que llama a su función: en este sentido,defaliashace que la nueva variable sea exactamente equivalente a la función con alias.Una advertencia es que esto puede confundir
derived-mode-p, por lo que el código que verifica si su modo se derivaprog-modepuede no funcionar correctamente. En la práctica, no he encontrado ningún problema: es más habitual que se conecte dicho códigoprog-mode-hook, que aún se ejecuta.(Como Jorgen señala en los comentarios,
define-derived-modetambién usa lamode-classpropiedad del símbolo del modo principal ydefaliasno la copia. Al momento de escribir, esta propiedad solo parece ser utilizada paraspecial-mode).Actualización: en estos días, simplemente sugiero que se requiera al menos Emacs 24, ya que las versiones anteriores son obsoletas durante mucho tiempo.
fuente
prog-mode, pero no funcionará para todos los modos.define-derived-modecopia lamode-classpropiedad del símbolo en el modo secundario. Eldefaliasserá no transferir esta propiedad. Simode-classes relevante para su caso de uso, debe copiarlo / configurarlo manualmente.mode-classdenota la propiedad.tl; dr: Use
ify su propia función init:Luego haga toda la inicialización del modo en
your-cool-init.Explicación más larga:
El problema es que la forma oficial de escribir un modo principal derivado es usar la
define-derived-modemacro:En Emacsen anterior (anterior a 24), esto se rompe cuando
prog-mode. Y no puede usarlo(if (fboundp 'prog-mode) ...)allí porque la macro espera un símbolo literal y lo citará en la expansión.define-derived-modeusa el padre de muchas maneras. Debería copiarlos en su propia definición de modo para utilizarlos, y eso es tedioso y propenso a errores.Entonces, la única forma es usar dos
define-derived-modedeclaraciones diferentes , dependiendo de siprog-modeexiste o no. Eso te deja con el problema de escribir tu código de inicialización dos veces. Lo cual, por supuesto, es malo, por lo que extrae eso en su propia función, como se describe anteriormente.(La mejor solución es, por supuesto, abandonar el soporte para 23.xy usar el alcance léxico. Pero supongo que ya consideró y eliminó esa opción. :-))
fuente
prog-modeEmacsen anterior? ¿Tendría sentido derivar detext-modeofundamental-modesiprog-modeno está disponible?fboundpprimero, solo con ladefine-derived-modedeclaración? Entonces, ¿el modo real con definición completa puede derivarse de ese modo intermedio? De esta forma, no es necesario definir todo el modo dos veces.fundamental-modees equivalente a derivar denil(y de hecho,define-derived-modereemplazafundamental-modeconnil), aunquetext-modeno es apropiado, ya que el código del programa no es texto. La mayoría de las configuraciones predeterminadastext-modeno tienen sentido en los modos de programación fuera de los comentarios. Por esoprog-modese introdujo en Emacs 24.define-derived-modedefiniciones en unaifforma, solo para el modo intermedio en lugar del modo final. Reemplazaría ladefunfunción de inicio por unadefine-derived-modepara el modo final. No creo que esto sea particularmente preferible. También podría definirprog-modeuno, como sugiere la pregunta original, pero eso puede confundir fácilmente a otros modos en los que confíanfboundppara verificar la presencia de ese modo.define-derived-modesean necesarias dos declaraciones diferentes . Hace un par de años se me ocurrió la solución que publiqué como respuesta por separado, y parece funcionar bien en Emacs 23 y 24. El código como se usa en varios modos principales populares.Creo que probar usando
fboundptiene más sentido.fuente
Puede definir una macro de contenedor para
define-derived-modeque evalúe sus argumentos.(Advertencia: solo mínimamente probado).
fuente