2012-05-04 9 views
5

He definido el carácter \ para comportarme como una palabra que forma parte de latex-mode, y estoy muy contento con los resultados. Lo único que me molesta es que una secuencia como \alpha\beta se trata como una sola palabra (que es el comportamiento esperado, por supuesto).Definir un carácter como un límite de palabras

¿Hay alguna manera de hacer que emacs interprete un carácter específico como una palabra "starter"? De esta manera, siempre se consideraría parte de la palabra que lo sigue, pero nunca formará parte de la palabra que lo precede.

Para mayor claridad, he aquí un ejemplo:

\alpha\beta 
^  ^
1   2 

Si el punto está en 1 y pulse M-d, la cadena "\ alpha" debe ser matado. Si el punto es 2 y presiono M-<backspace>, se debe eliminar la cadena "\ beta".

¿Cómo puedo lograr esto?

Respuesta

3

Otro pensamiento:
su requerimiento es muy parecido a lo que prevé subword-mode camelCase.

No se puede personalizar el comportamiento del modo de subword, las expresiones regulares están codificadas, pero ciertamente podría copiar esa biblioteca y modificarla para sus propósitos.

M-xfind-libraryRET RETsubword

que presumiblemente sería una solución muy robusta.

Editar: actualizada de los comentarios, como se sugiere:

Para el registro, el cambio de todas las instancias de [[:upper:]]-[\\\\[:upper:]] en las funciones subword-forward-internal y subword-backward-internal dentro subword.el funciona muy bien =) (siempre como "\" se define como sintaxis "w").

Personalmente me gustaría estar más dispuestos a hacer una copia de la biblioteca de editar directamente, a menos que con el propósito de hacer de la biblioteca existente de un poco más de uso general, para lo cual la solución más sencilla parece ser a mueva esas expresiones regulares a variables, después de lo cual sería trivial tener versiones modificadas de buffer local para este tipo de propósito.

Editar 2: Como de Emacs 24.3 (actualmente una release candidate), palabra parcial en modo facilita este con los nuevos subword-forward-regexp y subword-backward-regexp variables (para modificaciones simples), y los subword-forward-function y subword-backward-function variables (para modificaciones más complejas).

Al hacer esas variables regexp buffer-local en latex-mode con los valores deseados, puede usar subword-mode directamente.

+0

Sí, me he estado preguntando si el modo de subpalabras podría ser de alguna ayuda. Voy a comprobar a cabo las expresiones regulares. – Malabarba

+0

En realidad, si logro hacer que '\\' sea tratado en mayúsculas, _subword-mode_ me haría el resto. Creo que está configurado en * Propiedades de sintaxis *, pero todavía no estoy seguro. – Malabarba

+0

Buena idea, pero me parece que no se puede tener un carácter en mayúsculas sin especificar su variante en minúsculas? (Estoy viendo 'Case Tables' y' Case Conversion' debajo de '(elisp) Strings and Characters', así como las definiciones' [: upper:] 'y' [: lower:] 'en' (elisp) Char Classes'.) – phils

2

Usted debe ser capaz de implementar esto usando las propiedades de texto Sintaxis:

M-:(info "(elisp) Syntax Properties")RET

Editar: En realidad, no estoy seguro de si se puede hacer con precisión ¿esta?

Lo siguiente (que es solo experimentación) está cerca, pero M-<backspace> en 2 solo eliminará "beta" y no el "\" anterior.

Supongo que podría reasignar backward-kill-word a una función que verificó el "\" anterior y mató eso también. Bastante hacky, pero probablemente sería el truco si no hay una solución más limpia.

No he jugado con esta funcionalidad antes; tal vez alguien más puede aclarar.

(modify-syntax-entry ?\\ "w") 
(setq parse-sexp-lookup-properties t) 
(setq syntax-propertize-function 'my-propertize-syntax) 
(defun my-propertize-syntax (start end) 
    "Set custom syntax properties." 
    (save-excursion 
    (goto-char start) 
    (while (re-search-forward "\\w\\\\" end t) 
     (put-text-property 
     (1- (point)) (point) 'syntax-table (cons "." ?\\))))) 
Cuestiones relacionadas