Não emparelhe aspas no modo de par elétrico

7

Como faço electric-pair-modepara não emparelhar aspas (simples ou duplas)? Eu ainda quero que emparelhe todo o resto (colchetes, chaves, etc.), mas não aspas.

Ben
fonte
Você já tentou personalizar electric-pair-inhibit-predicate?
Elethan
@elethan onde encontro essa electric-pair-inhibit-predicatevariável? É desconhecido para o meu emacs 24.3.1
ggll
@ggll Estou usando o Emacs 25.1.1 e para mim está elec-pair.el.
Elethan
Na fonte de electric-pair-mode, electric-pair-pairse electric-pair-text-pairsé usado para personalização, mas electric-pair-text-syntax-tabletem precedência. Um gancho que defina localmente essas variáveis ​​deve ser suficiente para que isso funcione. Vou verificar se é esse o caso mais tarde e postar uma resposta.
DoMiNeLa10

Respostas:

5

Adicione o seguinte ao seu arquivo de inicialização do emacs:

(setq electric-pair-inhibit-predicate
      (lambda (c)
        (if (char-equal c ?\") t (electric-pair-default-inhibit c))))

Referência da publicação do meu blog: https://www.topbug.net/blog/2016/09/29/emacs-disable-WER-pairs-for-electric-pair-mode/

xuhdev
fonte
11
Isso não funciona para mim. Aspas duplas ainda estão emparelhadas.
Ben
@ Ben Qual versão do emacs você possui. Adicione essas informações à sua pergunta. Por favor, tente o código desta resposta com emacs -Q(emacs iniciado com a opção de linha de comando -Q). Talvez algum outro pacote interfira. O código funciona para mim com o GNU Emacs 25.3.1 (x86_64-unknown-cygwin, GTK + versão 3.22.20) de 11/09/2017.
Tobias
Estou adicionando uma resposta porque ainda não posso comentar. @xuhdev tem a resposta certa, mas por razões que eu realmente não entendo no meu sistema ao avaliar: (setq par elétrico de inibição de predicado (lambda (c) (if (char-equal c? \ ") t (elétrico -pair-default-inibit c)))) eu recebo (lambda (c) (if (char-equal c 34) t (par elétrico-inibição por padrão c))). Então tente Mx custom-variable, escolha electric -pair-inibit-predicate e, em seguida, escolha na função value-menu e na caixa write: (lambda (c) (if (char igual a c? \ ") t (inibição de par elétrico c)) ) Desta forma, ele funciona para minhas configurações na EMAC
D. Dimakakos
Por favor, não poste uma pseudo resposta no lugar de um comentário. Quando você ganhar um pouco de pontos de "reputação", poderá comentar. Se você está se perguntando por que ?\"acaba sendo impresso como 34, é porque o "caractere é igual ao número inteiro 34. No Emacs, os caracteres são números inteiros positivos de um determinado intervalo.
Drew
Este deve ser um problema da versão electric.el. Eu estou usando GNU Emacs 24.3.1 (x86_64-redhat-linux-gnu) of 2016-01-13.
Ben
3

Parece que você não pode. As várias personalizações permitem apenas adicionar pares.

Se você estiver disposto a usar um pacote diferente para fazer o emparelhamento, tente os smartparens . Você pode definir aspas para não emparelhar da seguinte maneira:

(sp-pair "'" nil :actions :rem)
(sp-pair "\"" nil :actions :rem)
zck
fonte
Observe que smartparens carece de alguns recursos sutis do par elétrico que não são imediatamente óbvios. Se você conseguir superar isso (ou modificá-los você mesmo), pode valer a pena mudar de qualquer maneira. O Smartparents possui outros recursos úteis e é muito mais flexível.
jcaw
Você poderia mencionar um recurso sutil de par elétrico ausente dos smartparens, @JackCC?
Omar
Já faz um tempo desde que eu mudei, então elas podem estar erradas, mas no topo da minha cabeça: se você tiver uma chave de fechamento imediatamente após o cursor (ou com espaço em branco entre elas), digitar a chave de abertura electric-pairrespeitará o fechamento existente braçadeira. Em smartparens, uma nova chave de fechamento é sempre criada, a menos que você esteja no modo estrito (que tem outros efeitos colaterais fortes). Por exemplo: |)-> (|)em electric-pairversus |)-> (|))em smartparens. O símbolo do tubo |representa o cursor.
jcaw
Da mesma forma, se você estiver dentro electric-paire tiver uma chave de fechamento quatro linhas abaixo, com apenas espaço em branco entre o cursor e a chave de fechamento e digitar essa chave de fechamento, ela substituirá a chave abaixo, fazendo com que ela fique nivelada com o cursor. Isso não acontece a smartparensmenos que você esteja no modo estrito. Este é um bom atalho ao editar algo como lisp (ou mesmo algo como Python, honestamente), porque reduz a sobrecarga cognitiva da formatação de expressões s. Pode fazer com que os aparelhos de equilíbrio sejam mais confusos.
jcaw
Eu acredito que electric-pairtambém herda seus pares da tabela de sintaxe do modo atual, enquanto que smartparensvocê precisa programar explicitamente em cada par. Eu poderia estar errado sobre isso.
jcaw
2

Atualização: a resposta de @ xuhdev é preferível, pois não interfere no código do Emacs.

Pode valer a pena uma solicitação de recurso tendo isso personalizável. No momento, parece trivial modificar o código em questão.

Posteriormente, carregue sua própria variante da função de par elétrico após a inserção automática

Abra o elec-pair.el e copie a partir daí

(defun electric-pair-post-self-insert-function ()
[ ... ] )

Em seguida, procure no corpo qualquer

(memq syntax '(?\( ?\) ?\" ?\$))

e exclua o ?\"de lá, ou seja,

(memq syntax '(?\( ?\) ?\$))

mas não excluir? \ "em outros lugares (!)

e recarregar, ou seja, avaliar a função alterada.

Para recarregar na próxima sessão, coloque-o em algum arquivo "my-modified-stuff.el" e carregue-o no seu arquivo init.

Andreas Röhler
fonte
Esta é a única solução que funcionou para o emacs 24.3.1.
21917 Ben