Tratar los símbolos como palabras en los modos de programa

12

Hay una serie de comandos en Emacs que se aplican a las "palabras". Los ejemplos incluyen forward-word, kill-word, upcase-word, mark-word, transpose-words, etc. La definición de "palabra" parece variar un poco entre los comandos. Por ejemplo, forward-wordse detendrá en un guión bajo dentro de una palabra (p foo_bar. Ej. ) Pero mark-wordno se detendrá en el guión bajo.

¿Es posible cambiar la definición de "palabra" cuando estoy en modo programado para que Emacs use los límites de palabras apropiados para la sintaxis del idioma actual?

Cuando estoy adentro c-mode, quiero forward-wordsaltar los guiones bajos, y cuando estoy adentro lisp-mode, quiero forward-wordsaltar tanto los guiones como los guiones bajos, etc.

nispio
fuente

Respuestas:

4

Emacs ya debería usar " los límites de palabras apropiados para la sintaxis del idioma actual ". Si no es así, presente un error para el modo principal para ese idioma.

Pero tal vez realmente no quieres decir palabras . Quizás te refieres a la sintaxis de símbolos , no a la sintaxis de palabras. Emacs distingue los dos.

Para la sintaxis de símbolos, use comandos de símbolos, no comandos de palabras: forward-symboletc. De su descripción, esto es lo que realmente quiere.

Si cree que realmente quiere usar una función de palabra en un símbolo, puede cambiar la categoría de sintaxis de caracteres particulares para tener una sintaxis constituyente de palabra en lugar de una sintaxis constituyente de símbolo. Pero, en general, esto no es lo que desea hacer y no debería necesitar hacerlo.

Consulte el manual de Elisp para obtener información sobre la sintaxis de caracteres. Y vea el manual de Emacs y el manual de Elisp para comandos y otras funciones que operan en símbolos (no símbolos de Lisp, sino texto con sintaxis de símbolos, en cualquier idioma).

Y tenga en cuenta que las operaciones en sexps a menudo son útiles también para actuar sobre símbolos: C-M-f( forward-sexp), C-M-t( transpose-sexps), etc.

Dibujó
fuente
C-M-festá obligado forward-sexpy no se comporta en nada como lo que usted describe. Tienes razón en que lo que quiero es navegar por símbolos, pero no veo esa opción.
nispio
@nispio forward sexpes esencialmente forward-symbolla mayor parte del tiempo, con la versatilidad añadida de también va sobre tirantes a juego. Deberías darle una oportunidad.
Malabarba
@Malabarba Estoy totalmente en desacuerdo con que forward-sexpes una aproximación cercana a forward-symbol. Para empezar, puede saltar de manera confusa sobre funciones completas, aterrizando cientos de líneas desde donde comenzó. También salta sobre listas de argumentos, etc. E intente esto: dado el siguiente código lisp, (global-set-key [remap list-buffers] 'ibuffer)coloque el cursor en el medio de la palabra remapy ejecútelo forward-sexpvarias veces. Se genera un error cuando se alcanza el cierre ]. No, gracias.
nispio
@nispio Siempre uso una combinación de sexp y navegación de palabras. De esa manera puedo evitar cualquiera de estos problemas, mientras tengo la versatilidad de ambos. Pero todo es una cuestión de preferencia. ;-) Si sabes que nunca te perderás la navegación de palabras, superword-modepodría ser tu chico.
Malabarba
Lo siento, no debería haber sugerido eso C-M-fy C-M-tactuar sobre símbolos (actúan sobre sexps). Lo editaré para corregir esa impresión. Pero ciertamente puede vincular forward-symbola cualquier clave que desee, si lo encuentra particularmente útil. No existe transpose-symbols, pero puede escribir uno, nuevamente, si cree que es útil.
Dibujó
11

Echa un vistazo a superword-modey subword-mode. Superword trata los guiones bajos como parte de una palabra en lugar de un límite, por foo_bar lo que se trataría como una sola palabra .
Subword hace lo contrario pero para camelCase, por lo que fooBarse trata como dos palabras en lugar de una.

Parece que el comportamiento que desea es para cc-modeusar superword-mode.

(add-hook 'c-mode-common-hook 'superword-mode)

Recomendaría leer sobre la fuente subword-mode, ya que incluso si esos dos modos no están haciendo exactamente lo que desea, deberían mostrarle cómo cambiar el comportamiento de detección de palabras.

Discusión más larga sobre emacsredux y ergomacs .

dgtized
fuente
¿Es posible hacer que superword-modejugar sea agradable paredit? Por ejemplo, paredit-forward-kill-wordno elimina la palabra completa (que contiene guiones bajos) cuando superword-modeestá habilitada.
Renan Ranelli
Está cambiando la definición de una palabra, y pareditestá respetando eso, así que creo que está haciendo lo que se le pide.
Dgtized
La cuestión es que el crédito no respeta eso. paredit-forward-kill-wordno mata la misma palabra definida por superword-mode.
Renan Ranelli
Oh, lo leí mal. Hmm Solo eché un vistazo paredit-forward-kill-wordy parece que está haciendo su propio análisis. Por lo tanto, podría ser capaz de cambiar eso, pero probablemente no.
Dgtized
3

Si entendí su pregunta, podría modificar la tabla de sintaxis del idioma, por ejemplo, para c ++:

(modify-syntax-entry ?_ "w" c++-mode-syntax-table)

M-x apropos luego buscar la tabla de sintaxis también debería ayudarte.

Nsukami _
fuente