Inserimento automatico di uno spazio quando si inserisce un carattere in base al carattere precedente


8

Di solito dopo aver inserito segni di punteggiatura come . , :faccio uno spazio prima di inserire il carattere successivo. È possibile che Emacs esegua automaticamente questo comportamento? Ad esempio, inserendo qualcosa di simile si .xottiene la digitazione in . xcui xè un carattere arbitrario (ad eccezione di alcuni casi particolari esclusi dall'utente, ad esempio il caso in cui xè un spacese stesso).

A volte questo può aiutare ad accelerare la digitazione.


2
Forse guarda questo: smart-operator
tata

Risposte:


8

L'operatore intelligente sembra promettente, ma non l'ho provato, quindi non posso parlarne. Una soluzione precompilata sarebbe l'ideale, ma se nessuna fosse sufficiente, sarebbe molto semplice racchiudere questa funzionalità e avvolgerla in una modalità minore.

Ecco il mio go:

(defvar auto-punc-punctuation-members
  (string-to-list ".,:;?!")
  "List of charactesr to insert spaces after")

(defvar auto-punc-ignore-members
  (string-to-list " \t")
  "List of characters to not auto insert spaces before")

(defun auto-punc-maybe-do ()
  "If the last entered character is not in `auto-punc-punctuation-members' or `auto-punc-ignore-members',
and the prior character is in `auto-punc-punctuation-members',
insert a space between the two characters. "
  (when (and auto-space-punctuation-mode
             (not (member (char-before) (append auto-punc-punctuation-members auto-punc-ignore-members)))
             (member (char-before (1- (point))) auto-punc-punctuation-members))
    (backward-char 1)
    (insert " ")
    (forward-char 1)))

(define-minor-mode auto-space-punctuation-mode
  "Automatically inserts spaces between some punctuation and other characters."
  :init-value nil
  :lighter "._a"
  :keymap nil
  (make-variable-buffer-local 'post-self-insert-hook)
  (if auto-space-punctuation-mode
      (add-hook 'post-self-insert-hook 'auto-punc-maybe-do)
    (remove-hook 'post-self-insert-hook 'auto-punc-maybe-do)))

Potresti semplicemente aggiungerlo al tuo init e abilitarlo automaticamente quando vuoi

(add-hook 'text-mode-hook 'auto-space-punctuation-mode)

Ogni volta che inserisci un carattere, la funzione auto-punc-maybe-doviene eseguita, leggi la documentazione per assicurarti che questo sia il comportamento che desideri. Fondamentalmente se si digita la punteggiatura, quindi tutto ciò che non è punteggiatura o spazio bianco, verrà inserito automaticamente uno spazio.


2
Confermo che la tua soluzione funziona perfettamente in modalità testo.
Nome

1
Fantastico, felice di sentirlo. Ho appena aggiornato il codice per rendere locale il buffer `post-self-insert-hook, se hai afferrato il codice in precedenza, potresti trovare la modalità funzionante nei buffer che non ti aspetti in quanto potrebbe essere stata aggiunta a livello globale, evocando il nuovo il codice dovrebbe risolverlo.
Jordon Biondo,

2

Potresti essere interessato all'operatore elettrico , è una modalità secondaria abbastanza generale per aggiungere spazio agli operatori (principalmente per le modalità di programmazione, ma funziona anche in modalità testo).

Tuttavia, non esamina ciò che hai digitato dopo l'operatore, quindi non può attualmente gestire la parte "aggiungi uno spazio solo se non ne ho già digitato una" della tua domanda.

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.