español - que es emacs
¿Cómo lograr efectos plegables de código en Emacs? (11)
Aparentemente no hay una solución perfecta, pero creo que la mejor es esta:
¿Cuál es la mejor manera de lograr algo así como el plegado de código, o el tipo de ciclo que usa org-mode? ¿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 me gusta más el modo orgánico con la jerarquía que se puede expandir. Me pregunto cuál es la mejor manera de lograr este efecto. Creo que escuché que las superposiciones de emacs son una buena solución, pero no lo sé.
En cuanto a doblar, solo uso la pantalla de selección selectiva de conjuntos
EDITAR NÚMERO 2:
Gracias por las respuestas, pero creo que estoy haciendo la pregunta incorrecta, así que permítanme 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, la definición de la función quedará donde esté (estoy pensando en usar find-tag para esto) y la desplegará en el búfer actual. La idea es si tienes que saltar a un buffer 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 comporte como el plegado de código, solo que extrae el código externo del buffer. Esto presenta algunos problemas ya que no puede pegar manualmente el código en el búfer o si alguien lo guarda guardará el código extraído. Entonces me pregunto si hay una manera de crear un área dentro de un buffer que tampoco sea parte del buffer. Creo que eso tiene sentido.
Creo que su comparación de su "proyecto" con el plegado no es muy buena, porque doblar consiste en cambiar la apariencia y mantener el contenido del tampón intacto (el texto). Su proyecto implicaría mostrar texto adicional mientras mantiene intactos los contenidos del buffer, AFAIU. Asi que. no se puede implementar como una composición de inserción de texto y plegado (entonces, el contenido del buffer se cambiaría).
Pero tal vez, 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"; quizás, podría poner sus definiciones de función en estas cadenas pertenecientes 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.
El plegado generalmente no es necesario con emacs, ya que tiene herramientas que implementan explícitamente las acciones que las personas realizan manualmente al doblar el código.
La mayoría de las personas tiene un buen éxito con simples búsquedas incrementales. Ver "foo" mencionado en alguna parte? Escriba Cs foo
, encuentre la definición, presione enter, léala, y luego presione Cx Cx para volver a donde estaba. Simple y muy útil.
La mayoría de los modos admiten imenu . Mx imenu
le permitirá saltar a una definición de función (etc.) por su nombre. También puede vincularlo con un clic del mouse para obtener un menú de funciones (o agregarlo a la barra de menú, consulte la página de información para obtener más detalles). Proporciona datos para el modo de función-función, que le permitirá ver qué función tiene actualmente dentro de la línea de modo. (¿Por qué tus funciones son tan largas?)
También hay barra de velocidad , que muestra la información de imenu (y otras cosas) gráficamente.
Si desea obtener una visión general de su archivo, intente con Mx ". Dada una expresión regular, creará un nuevo búfer con cada coincidencia en el búfer en uso. Puede buscar" (defun) para obtener una visión general de las funciones. el archivo actual se implementa. Al hacer clic en el resultado, lo moverá a esa posición en el archivo.
Entonces, de todos modos, piensa en lo que realmente quieres lograr, y Emacs probablemente lo implemente. No luches con herramientas imperfectas que te hagan doblar y desplegar cosas constantemente.
Otra forma de desollar al gato:
Da la casualidad de que no necesitas ningún paquete o configuración adicional para eso. Solo ve a cualquier archivo fuente, escribe
¡M-1 Cx $ y la magia sucede!
Como de costumbre, es magia blanca: Cx $ recuperará tu código.
Podemos usar el sistema de ayuda de Emacs para descubrir lo que está sucediendo: Ch k Cx $ nos dice que la combinación de teclas anterior está llamando set-selective-display , una función que toma un argumento numérico (el prefijo M-1 pasa 1 como el valor de ese argumento) y, como era de esperar, establece la visualización selectiva de la variable en el valor de ese argumento.
del blog de wizardry 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 here para que F5 alterne el plegado del código en función de la posición actual del cursor:
(global-set-key (kbd "<f5>") ''set-selective-display-dlw)
(defun set-selective-display-dlw (&optional level)
"Fold text indented same of more than the cursor.
If level is set, set the indent level to LEVEL.
If ''selective-display'' is already set to LEVEL, clicking
F5 again will unset ''selective-display'' by setting it to 0."
(interactive "P")
(if (eq selective-display (1+ (current-column)))
(set-selective-display 0)
(set-selective-display (or level (1+ (current-column))))))
Si usa hs-minor-mode
, puede ser una buena idea también establecer un atajo más conveniente, por ejemplo:
(eval-after-load ''hideshow
''(progn
(global-set-key (kbd "C-+") ''hs-toggle-hiding)))
También puede obtener el plegado del código usando CEDET con el siguiente código en el archivo init:
(global-semantic-folding-mode t)
Después de la evaluación de este código, el pequeño triángulo aparecerá en el área del fringle, por lo que podrá doblar y desplegar el código con él. Este método es más preciso, ya que utiliza información sintáctica, extraída del código fuente
Uso el modo secundario de contorno para doblar mi código python. En lugar de tener que colocar {{{y}}} como en modo plegado, usa donde se define el bloque.
Estoy bastante seguro de que viene con emacs. Luego agrego esto a mis .emacs
;;======= Code folding =======
(add-hook ''python-mode-hook ''my-python-outline-hook)
; this gets called by outline to deteremine the level. Just use the length of the whitespace
(defun py-outline-level ()
(let (buffer-invisibility-spec)
(save-excursion
(skip-chars-forward " ")
(current-column))))
; this get called after python mode is enabled
(defun my-python-outline-hook ()
; outline uses this regexp to find headers. I match lines with no indent and indented "class"
; and "def" lines.
(setq outline-regexp "[^ /t]//|[ /t]*//(def//|class//) ")
; enable our level computation
(setq outline-level ''py-outline-level)
; do not use their /C-c@ prefix, too hard to type. Note this overides some bindings.
(setq outline-minor-mode-prefix "/C-t")
; turn on outline mode
(outline-minor-mode t)
; initially hide all but the headers
;(hide-body)
; make paren matches visible
(show-paren-mode 1)
)
emacs viene con hs-minor-mode que facilita el plegado de código entre expresiones equilibradas http://www.emacswiki.org/emacs/HideShow
hs-minor-mode funciona maravillosamente.
Funciona aún más bellamente cuando se combina con fold-dwim (hago lo que quiero decir). Luego está fold-dwim-org, que proporciona org-modo como enlaces de teclas para el plegado de código. Ambos se pueden instalar a través de mermelada (y creo que elpa).
modo hide-show ( hs-minor-mode
) con la combinación de teclas predeterminada Cc @ CMh
para activar el plegado ( hs-hide-all
)
vimish-fold
es también una solución agradable y fácil.
https://github.com/mrkkrp/vimish-fold .
Desde la página de inicio:
Este es un paquete para doblar texto como en Vim. Tiene las siguientes características:
- plegado de regiones activas;
- buena retroalimentación visual: es obvio qué parte del texto está doblada;
- persistencia por defecto: cuando cierra el archivo, sus pliegues no desaparecen;
- la persistencia escala bien, puedes trabajar en cientos de archivos con muchos pliegues sin efectos adversos;
- no rompe la sangría o algo así;
- los pliegues se pueden alternar del estado plegado para desplegar y volver fácilmente;
- navegación rápida entre pliegues existentes;
- puedes usar el mouse para desplegar pliegues (bueno para principiantes y no solo para ellos);
- para fanáticos del paquete avy: ¡puedes usar avy para doblar texto con un número mínimo de pulsaciones de tecla!
Usando el excelente use-package
lo instalo y lo activo usando este fragmento en mi configuración:
(use-package vimish-fold
:ensure t
:config (vimish-fold-global-mode t))