¿Cuál es la mejor manera de lograr algo como el plegado de código o el tipo de ciclo que usa el modo org? ¿Cuál sería la mejor solución en elisp para crear este tipo de comportamiento?
EDITAR: Lo siento, no estaba claro. Quiero programar algo en elisp que haga cosas muy similares al plegado de código, o en realidad más como org-mode con la jerarquía que se puede expandir. Me pregunto cuál es la mejor manera de lograr este efecto. Creo que he oído que las superposiciones de emacs son una buena solución, pero no lo sé.
En cuanto al plegado, solo uso la pantalla selectiva de conjunto incorporada
EDITAR NÚMERO 2:
Gracias por las respuestas, pero creo que estoy haciendo la pregunta incorrecta, así que permítanme tratar de ser más claro sobre lo que estoy tratando de hacer. Me gustaría crear lo siguiente
Cuando pones tu punto en una función y llamas a esta función elisp, pondrá la definición de la función desde donde esté (estoy pensando en usar la etiqueta de búsqueda para esto) y la desplegará en el búfer actual. La idea es que si tiene que saltar a un búfer diferente para leer la definición de la función, siento que es un cambio de contexto a otro archivo. Así que me gustaría que se comportara como un plegado de código, solo que extrae código externo del búfer. Esto presenta algunos problemas, ya que no se puede pegar el código en el búfer o si alguien lo guarda, se guardará el código extraído. Entonces, me pregunto si hay una forma de crear un área dentro de un búfer que tampoco es parte del búfer. Creo que eso tiene sentido.
fuente
EDIT NB 2
y le hagas una nueva pregunta.Respuestas:
El plegado es generalmente innecesario con emacs, ya que tiene herramientas que implementan explícitamente las acciones que la gente realiza manualmente al plegar código.
La mayoría de las personas tienen un buen éxito con búsquedas incrementales simples. ¿Ves "foo" mencionado en alguna parte? Escriba C-s
foo
, busque la definición, presione Intro, léalo y luego presione C-x C-xpara volver a donde estaba. Sencillo y muy útil.La mayoría de los modos admiten imenu . M-x
imenu
le permitirá saltar a una definición de función (etc.) por su nombre. También puede vincularlo a un clic del mouse para obtener un menú de funciones (o agregarlo a la barra de menú; consulte la página Información para obtener más detalles). Proporciona datos para qué modo de función, lo que le permitirá ver en qué función se encuentra actualmente en la línea de modo. (Sin embargo, ¿por qué sus funciones son tan largas?)También hay una barra de velocidad , que muestra la información del imenu (y otras cosas) gráficamente.
Si desea obtener una descripción general de su archivo, intente M-x
occur
". Dada una expresión regular, creará un nuevo búfer con cada coincidencia en el búfer actual. Puede buscar" (defun "para obtener una descripción general de las funciones del archivo actual Implementos Al hacer clic en el resultado, se moverá a esa posición en el archivo.De todos modos, piense en lo que realmente quiere lograr, y probablemente Emacs lo implemente. No luches con herramientas imperfectas que te hacen doblar y desplegar cosas constantemente.
fuente
modo ocultar-mostrar (
hs-minor-mode
) con combinaciónC-c @ C-M-h
de teclas predeterminada para activar el plegado (hs-hide-all
)fuente
zR
,zM
,zo
,zc
.Otra forma de despellejar al gato:
M-1 Cx $ ¡ y la magia sucede!
Como de costumbre, es magia blanca: Cx $ traerá su código de regreso.
del blog de hechicería menor de emacs
Solo para completar: M-3 Cx $ mostraría un código anidado más profundo y así sucesivamente.
FWIW Hice un pequeño ayudante hoy basado en algo. encontrado aquí para que F5 alterne el plegado de código según la posición actual del cursor:
fuente
Utilizo el modo de esquema menor para plegar mi código de Python. En lugar de necesitar colocar {{{y}}} como en el modo de plegado, usa donde se define el bloque.
http://www.gnu.org/software/emacs/manual/html_node/emacs/Outline-Mode.html http://www.emacswiki.org/emacs/OutlineMinorMode
Estoy bastante seguro de que viene con emacs. Luego agrego esto a mi .emacs
fuente
outline-mode
admite Python listo para usar en emacs 24, sin necesidad deoutline-level
funciones personalizadas . Esto es todo lo que necesitaba agregar a miuser.el
:(add-hook 'python-mode-hook 'outline-minor-mode)
outline-minor-mode-prefix
- las combinaciones de teclas predeterminadas son horribles - yo uso(setq outline-minor-mode-prefix (kbd "C-;"))
También puede obtener el plegado de código utilizando CEDET con el siguiente código en el archivo de inicio:
Después de la evaluación de este código, el triángulo pequeño aparecerá en el área de flecos, por lo que podrá plegar y desplegar el código usándolo. Este método es más preciso, ya que utiliza información sintáctica extraída del código fuente.
fuente
hs-minor-mode funciona a la perfección.
Funciona aún mejor cuando se combina con fold-dwim (haz lo que quiero decir). Luego está fold-dwim-org, que proporciona combinaciones de teclas similares al modo org para el plegado de código. Ambos se pueden instalar vía mermelada (y creo que elpa).
fuente
Aparentemente no hay una solución perfecta, pero creo que la mejor es esta:
http://www.emacswiki.org/emacs/FoldingMode
fuente
vimish-fold
también es una solución agradable y fácil.https://github.com/mrkkrp/vimish-fold .
Desde la página de inicio:
Usando el excelente,
use-package
lo instalo y lo activo usando este fragmento en mi configuración:fuente
Me sorprende que nadie haya mencionado el estrechamiento-ensanchamiento. Es súper impresionante, también viene con emacs. Simplemente seleccione el código en el que desea enfocarse y presione
C-x n n
, para volver al modo de vista completa, simplemente hágaloC-x n w
. Siempre prefiero usar la funcionalidad emacs incorporada que saturar mi espacio de usuario con otro paquete. Si emacs puede hacerlo con la funcionalidad incorporada, entonces lo preferiré a algún paquete de terceros, pero ese soy solo yo, no significa ni implica nada más además de que me gustan las cosas simples sobre las configuraciones largas y complejas.fuente
emacs viene con hs-minor-mode que facilita el plegado de código entre expresiones equilibradas http://www.emacswiki.org/emacs/HideShow
fuente
Creo que su comparación de su "proyecto" con el plegado no es del todo buena, porque plegar consiste en cambiar la apariencia manteniendo intacto el contenido del búfer (el texto). Su proyecto implicaría mostrar texto adicional mientras se mantiene intacto el contenido del búfer, AFAIU. Entonces. no se puede implementar como una composición de inserción y plegado de texto (entonces, se cambiaría el contenido del búfer).
Pero quizás, de hecho es posible con el mismo mecanismo que el plegado con - "superposiciones" ... Considere las propiedades de superposición "antes de la cadena" y "después de la cadena" ; tal vez, podría poner sus definiciones de función en estas cadenas que pertenecen a una superposición de longitud cero en el punto. Mire la función outline-flag-region para ver cómo se usan las superposiciones en el modo de esquema.
fuente
Si lo usa
hs-minor-mode
, podría ser una buena idea establecer también un atajo más conveniente, por ejemplo:fuente
Con inspiración de Inspirado en la respuesta einSelbst :
Voila,
C-x $
de repente se convirtió útil incluso sin ningún tipoC-u
niM-4
de negocios.fuente
Si está usando JavaScript y lo usa
js2-mode.el
, puede:C-c C-f
: alternar ocultar / mostrar todoC-c C-e
: ocultar elementoC-c C-s
: mostrar elementofuente