2012-05-17 16 views
7

En Verilog se encierran bloques de código entre las palabras 'begin' y 'final' como este:Definir paréntesis de varios caracteres en Emacs

if(foo) begin 
    x <= 1'b0; 
    y <= 1'b0; 
end else begin 
    x <= x_d; 
    y <= y_d; 
end 

¿Hay alguna manera de establecer comienzan y terminan como paréntesis en Emacs, para que pueda usar check-parens o similar para encontrar cualquiera que no coincida?

He intentado añadir esta (y variaciones de) a mi archivo ~/.emacs, pero no le gusta ...

(modify-syntax-entry ?begin "(end") 
(modify-syntax-entry ?end ")begin") 

Gracias.

+0

Este tipo de cosas normalmente se maneja con el motor de sangría. Puede usarlo para verificar la sintaxis, por ejemplo marcando todo el buffer y ejecutando 'indent-region'. Si el final del archivo está incorrectamente sangrado, tiene una discrepancia de inicio/finalización. – Lindydancer

+0

@Lindydancer gracias, pero estoy trabajando en el código que está siendo editado por varias personas a la vez, todas usando diferentes editores, y por lo tanto a menudo diferentes secciones del código se sangran de diferentes maneras. Además, algunos de los archivos tienden a ser muy largos, y el seleccionar todo 'indent-region' puede tomar mucho tiempo ... – kiteflyingmonkey

+0

En ese caso, escribiría simplemente un paquete personalizado encontrando pares de inicio/fin coincidentes. No es trivial, pero creo que sería un buen ejercicio en elisp, si eres nuevo en él. – Lindydancer

Respuesta

2

Lamentablemente, la infraestructura de coincidencia de paréntesis de Emacs no comprende gran parte de los tokens de caracteres múltiples. La nueva biblioteca SMIE agregada en Emacs-23.4 está destinada en parte a abordar este problema. Permite que los modos principales describan la sintaxis del lenguaje (en un tipo muy limitado de gramática) luego de que elementos como C-M-f y C-M-b sabrán cómo saltar sobre elementos lógicos, p. omita de begin a su correspondiente end. Como señala LindyDancer, tales cosas son generalmente necesarias para la sangría, y de hecho la principal motivación detrás de SMIE era proporcionar un motor de sangría genérico.

Ahora Verilog no usa SMIE pero implementa comandos de navegación similares. Lo que probablemente podría intentar algo así como

(defun sm-verilog-check-parens() 
    (save-excursion 
    (goto-char (point-min)) 
    (while (not (eobp)) 
     (verilog-forward-sexp)))) 

Tho No sé si verilog-forward-sexp le dará advertencias pertinentes/errores si se topa con el fin de tampón en un momento inesperado.

Cuestiones relacionadas