Tratta i simboli come parole in modalità prog


12

Ci sono un certo numero di comandi in Emacs che si applicano alle "parole". Esempi includono forward-word, kill-word, upcase-word, mark-word, transpose-words, ecc La definizione di "parola" sembra variare un po 'tra i comandi. Ad esempio, forward-wordsi fermerà a un carattere di sottolineatura all'interno di una parola (ad esempio foo_bar), ma mark-wordnon si fermerà al carattere di sottolineatura.

È possibile cambiare la definizione di "parola" quando sono in una modalità prog in modo che Emacs utilizzerà i limiti di parola appropriati per la sintassi della lingua corrente?

Quando sono dentro c-modevoglio forward-wordsaltare i trattini bassi, e quando ci sono lisp-modevoglio forward-wordsaltare sia trattini che caratteri di sottolineatura, ecc.

Risposte:


4

Emacs dovrebbe già usare " i limiti di parole appropriati per la sintassi della lingua corrente ". In caso contrario, presentare un bug per la modalità principale per quella lingua.

Ma forse non intendi davvero le parole . Forse vuoi dire sintassi dei simboli , non sintassi delle parole. Emacs distingue i due.

Per la sintassi dei simboli, usa i comandi dei simboli, non i comandi delle parole: forward-symbolecc. Dalla tua descrizione, questo è ciò che desideri davvero.

Se ritieni di voler davvero utilizzare una funzione di parola su un simbolo, puoi cambiare la categoria di sintassi di caratteri particolari per avere una sintassi costituente una parola anziché una sintassi costituente un simbolo. Ma generalmente questo non è quello che vuoi fare e non dovresti aver bisogno di farlo.

Consultare il manuale di Elisp per informazioni sulla sintassi dei caratteri. E vedi il manuale di Emacs e il manuale di Elisp per i comandi e altre funzioni che operano sui simboli (non sui simboli Lisp, ma sul testo con sintassi dei simboli, in qualsiasi lingua).

E tieni presente che le operazioni su sexps sono spesso utili anche per agire sui simboli: C-M-f( forward-sexp), C-M-t( transpose-sexps), ecc.


C-M-fè legato forward-sexpe non si comporta come quello che descrivi. Hai ragione sul fatto che quello che voglio è navigare con simboli, ma non vedo quell'opzione.
nispio,

@nispio forward sexpè essenzialmente il forward-symbolpiù delle volte, con l'ulteriore versatilità di andare oltre le parentesi graffe corrispondenti. Dovresti dargli una possibilità.
Malabarba,

@Malabarba Non sono affatto d'accordo sul fatto che forward-sexpsia una stretta approssimazione di forward-symbol. Per cominciare, può saltare confusamente su intere funzioni, atterrando centinaia di linee da dove hai iniziato. Salta anche su elenchi di argomenti, ecc. E prova questo: dato il seguente codice lisp (global-set-key [remap list-buffers] 'ibuffer)posiziona il cursore nel mezzo della parola remaped eseguilo forward-sexpalcune volte. Si genera un errore quando raggiunge la chiusura ]. No grazie.
nispio,

@nispio Uso sempre una combinazione di sexp e navigazione di parole. In questo modo posso evitare qualsiasi di questi problemi, pur avendo la versatilità di entrambi. Ma è tutta una questione di preferenza. ;-) Se sai che non ti perderai mai la navigazione delle parole, superword-modepotrebbe essere il tuo ragazzo.
Malabarba,

Mi dispiace, non avrei dovuto suggerirlo C-M-fe C-M-tagire sui simboli (agiscono sui sexp). Modificherò per correggere quell'impressione. Ma puoi sicuramente legarti forward-symbola qualsiasi chiave che ti piace, se la trovi particolarmente utile. No transpose-symbols, ma puoi scriverne uno, se lo ritieni utile.
Disegnò il

11

Dai un'occhiata a superword-modee subword-mode. Superword tratta i caratteri di sottolineatura come parte di una parola anziché come un confine, quindi foo_bar verrebbero trattati come una sola parola .
La subword fa il contrario ma per camelCase, quindi fooBarviene trattata come due parole anziché una.

Sembra che il comportamento che desideri sia cc-modeda usare superword-mode.

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

Consiglierei di leggere la fonte per subword-mode, poiché anche se queste due modalità non stanno facendo esattamente quello che vuoi, dovrebbero mostrarti come cambiare il comportamento del rilevamento delle parole.

Discussione più lunga su emacsredux e ergomacs .


È possibile superword-modegiocare bene paredit? Ad esempio, paredit-forward-kill-wordnon elimina l'intera parola (contenente caratteri di sottolineatura) quando superword-modeè abilitata.
Renan Ranelli,

Sta cambiando la definizione di una parola e la pareditsta rispettando, quindi penso che stia facendo ciò che gli viene chiesto.
dgtized

Il fatto è che il paredit non lo rispetta. paredit-forward-kill-wordnon uccide la stessa parola definita da superword-mode.
Renan Ranelli,

Oh ho letto male. Hmm. Ho appena dato un'occhiata paredit-forward-kill-worde sembra che stia facendo il proprio analisi. Quindi potrebbe essere in grado di scambiarlo, ma probabilmente no.
dgtized

3

Se ho capito la tua domanda, potresti modificare la tabella della sintassi del linguaggio, ad esempio per c ++:

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

M-x apropos quindi cercare la tabella di sintassi dovrebbe aiutare anche te.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.