2012-05-04 11 views
5

Ho definito il carattere \ come un componente costitutivo della parola in latex, e sono piuttosto soddisfatto dei risultati. L'unica cosa che mi infastidisce è che una sequenza come \alpha\beta viene trattata come una singola parola (che è il comportamento previsto, ovviamente).Definire un carattere come un limite di parole

C'è un modo per rendere emacs interpretare un carattere specifico come una parola "starter"? In questo modo sarebbe sempre considerato parte della parola che lo segue, ma mai parte della parola che lo precede.

Per chiarezza, ecco un esempio:

\alpha\beta 
^  ^
1   2 

Se il punto è a 1 e mi preme M-d, la stringa "\ alpha" dovrebbe essere ucciso. Se il punto è 2 e si preme M-<backspace>, la stringa "\ beta" deve essere interrotta.

Come posso ottenere questo risultato?

risposta

3

Un altro pensiero:
la vostra esigenza è molto simile a quello che subword-mode prevede camelCase.

Non è possibile personalizzare il comportamento della modalità subword - le espressioni regolari sono hardcoded - ma si può certamente copiare quella libreria e modificarla per i propri scopi.

M-xfind-libraryRETsubwordRET

Che presumibilmente essere una soluzione piuttosto robusto.

Edit: aggiornati dai commenti, come suggerito:

Per la cronaca, cambiando ogni istanza di [[:upper:]]-[\\\\[:upper:]] nelle funzioni subword-forward-internal e subword-backward-internal all'interno subword.el grandi opere =) (il più a lungo poiché "\" è definita come sintassi "w").

Personalmente sarei più propenso a fare una copia della libreria di modificarlo direttamente, a meno che al fine di rendere la libreria esistente un po 'più generico, per il quale la soluzione più semplice sembra essere a spostare le espressioni regolari in variabili - dopo di che sarebbe banale avere versioni modificate localmente per questo scopo.

Edit 2: Come dell'Emacs 24.3 (attualmente release candidate), sottoparola modalità facilita questo con i nuovi subword-forward-regexp e subword-backward-regexp variabili (per semplici modifiche), e le subword-forward-function e subword-backward-function variabili (per modifiche più complesse).

Rendendo le variabili regexp locali al buffer in modalità latex con i valori desiderati, è possibile utilizzare direttamente la modalità subword.

+0

Sì, mi sono chiesto se la modalità di parola secondaria potrebbe essere di qualche aiuto. Controllerò le espressioni regolari. – Malabarba

+0

In realtà, se riesci a ottenere che '' viene trattato come maiuscolo, _subword-mode_ farebbe il resto per me. Penso che sia configurato in * Proprietà della sintassi *, ma non ne sono ancora sicuro. – Malabarba

+0

Bella idea, ma mi sembra piuttosto che non si possa avere un carattere maiuscolo senza specificare la sua variante minuscola? (Sto guardando 'Case Tables' e' Case Conversion' sotto '(elisp) Stringhe e caratteri', così come' [: upper:] 'e' [: lower:] 'definizioni in' (elisp) Classi Char .') – phils

2

Si dovrebbe essere in grado di implementare questo utilizzando le proprietà di testo sintassi:

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

Edit: In realtà, non sono sicuro se si può fare con precisione Questo?

Quanto segue (che è solo sperimentazione) è vicino, ma M-<backspace> in 2 eliminerà solo "beta" e non il precedente "\".

Suppongo che è possibile rimappare backward-kill-word a una funzione che ha verificato quello precedente "\" e ha ucciso anche quello. Giustamente hacky, ma probabilmente farebbe il trucco se non ci fosse una soluzione più pulita.

Non ho ancora giocato con questa funzionalità; forse qualcun altro può chiarire.

(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 "." ?\\))))) 
Problemi correlati