Inserir automaticamente um espaço ao inserir um caractere, dependendo do caractere anterior

8

Normalmente, depois de inserir sinais de pontuação, como . , :faço para criar um espaço antes de inserir o próximo caractere. É possível que o Emacs faça esse comportamento automaticamente? Por exemplo, a inserção de algo como .xresulta em digitar . xwhere xé um caractere arbitrário (exceto em alguns casos particulares excluídos pelo usuário, por exemplo, o caso em que xé um space).

Às vezes, isso pode ajudar a acelerar a digitação.

Nome
fonte
2
Talvez veja o seguinte: smart-operator
babá

Respostas:

8

O operador inteligente parece promissor, mas eu não tentei, então não posso falar por isso. Uma solução pré-construída seria ideal, mas se nenhuma for suficiente, seria muito fácil empacotar a gravação dessa funcionalidade e encapsulá-la em um modo menor.

Aqui está o meu ir:

(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)))

Você pode simplesmente adicioná-lo ao seu init e habilitá-lo automaticamente quando quiser

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

Sempre que você inserir um caractere, a função será auto-punc-maybe-doexecutada, leia a documentação para garantir que esse seja o comportamento que você deseja. Basicamente, se você digitar pontuação, qualquer coisa que não seja pontuação ou espaço em branco, um espaço será inserido automaticamente.

Jordon Biondo
fonte
2
Confirmo que sua solução funciona perfeitamente no modo de texto.
Nome
1
Ótimo, feliz em ouvir isso. Acabei de atualizar o código para tornar o buffer `post-self-insert-hook local, se você pegou o código anteriormente, poderá encontrar o modo trabalhando em buffers que você não espera, pois pode ter sido adicionado globalmente, avaliando o novo código deve corrigi-lo.
Jordon Biondo
2

Você pode estar interessado em operador elétrico , é um modo secundário bastante geral para adicionar espaçamento em torno dos operadores (principalmente para modos de programação, mas funciona também nos modos de texto).

No entanto, ele não analisa o que você digitou após o operador, portanto, atualmente não pode lidar com a parte "adicionar um espaço apenas se eu ainda não digitar um" da sua pergunta.

dshepherd
fonte