Por que digitar '<<<' produz '<< EOF \ n <' quando no modo de script de shell?

13

Sempre que estou editando um script de shell no emacs e digitando três divisas para redirecionar uma string bruta para stdin, o emacs insere os caracteres 'EOF' e uma nova linha entre eles, então

cat <<< 'some string'

torna-se

cat <<EOF
< 'some string'

Posso voltar e excluir os caracteres extras para obter o buffer no estado desejado, mas esse é um comportamento muito desagradável, e parece acontecer apenas no modo de script de shell, que geralmente é a única vez que digito esse padrão. Existe maneira de desativar esse comportamento?

Erik
fonte

Respostas:

13

Isso é causado por sh-electric-here-document-mode. Quando ativado, <<irá inserir um esqueleto de documento aqui.

Isso é ativado por padrão. Você pode desativá-lo com um gancho, como:

(add-hook 'sh-mode-hook (lambda () (sh-electric-here-document-mode -1)))
glucas
fonte
4
Outra opção, é claro, é inserir <<<com C-3 <.
glucas
1
Obrigado por mostrar como desativá-lo. Esse modo sh-elétrico-aqui-documento é um recurso bastante inútil, IMO.
Dan Moulding
Também: sh-mode-hooknão funcionou para mim, mas sh-set-shell-hookfuncionou.
Felipe Lema 20/05
17

glucas está exatamente correto, mas para complementar sua resposta, eu tenho esse código que usei para tornar a inserção de documentos aqui um pouco mais inteligente.

Este conselho, juntamente com o sh-electric-here-document-modeativado, faz com que, se você digitar duas divisas, o documento automático aqui seja criado, mas, se o próximo caractere digitado for outra divisa, ele será revertido e você ficará com apenas <<<.

(defadvice sh--maybe-here-document (around be-smart-about-it activate)
  "Do normal here doc auto insert, but if you type another chevron, revert and leave just <<<."
  (if (and (= (current-column) 1)
           (looking-back "^<")
           (looking-at "\nEOF")
           (save-excursion
             (forward-line -1)
             (end-of-line 1)
             (looking-back "<<EOF")))
      (progn (delete-region (search-backward "EOF") (search-forward "EOF" nil t 2))
             (insert "<"))
    ad-do-it))

Claro que isso significa que se você realmente deseja iniciar um documento aqui com uma divisa, precisará inseri-lo em bruto C-q<. Portanto, depende do que você faz mais, se você faz mais strings aqui do que documentos aqui, pode ser bom ter, mesmo se não o fizer, é raro que você queira iniciar um documento aqui com uma divisa e ser incomodado.

insira a descrição da imagem aqui

Jordon Biondo
fonte
Ah, que legal!
glucas