Como enviar uma guia literal para o bash no modo shell do emacs?

7

Desejo ignorar completamente o suporte à conclusão do modo de comint, confiando no processo subordinado para fazer isso por mim. Especificamente, se eu estiver executando:

  • emacs
    • modo shell
      • bater

Quero TABser passado para o processo bash e expandido por ele.

Se eu estiver correndo:

  • emacs
    • modo shell
      • bater
        • psql

Então eu gostaria TABde ser tratado pelo psql.

Eu tentei isso em um gancho no modo de shell sem sucesso:

(define-key shell-mode-map "\t" 'self-insert-command)

Quando isso é definido, a TABchave insere uma guia literal na linha de comando, o que não é de todo útil para mim.

Eu também tentei isso, mas quando acertei TABnada acontece:

(defun cr/comint-send-tab ()
  "Send a tab character to the current buffer's process"
  (interactive)
  (comint-send-input t t)
  (process-send-string (current-buffer) "\t"))

(define-key shell-mode-map "\t" 'cr/comint-send-tab)

Como posso fazer isso?

Chris R
fonte
+1: eu estava explorando quase exatamente o mesmo caso de uso quando encontrei essa pergunta!
setjmp

Respostas:

7

Os shell-modebuffers do Emacs não são terminais (ou seja, eles não usam ptys (pseudo-terminais)), portanto, nenhum programa em execução nesse buffer (o shell, os programas executados pelo shell, etc.) pode executar caracteres em um entrada de tempo. Cada linha é digitada por inteiro e enviada somente quando ENTERpressionada. Para ver a prova, execute o ttycomando em um shell-modebuffer, e sua saída será not a tty.

Fran
fonte
1
Para sua informação, apesar de parecer que isso não é verdade porque você pode executar a edição da linha de comando com Ctrl-B, Ctrl-Fetc., isso ocorre apenas porque o próprio modo de shell simula os recursos típicos de edição de linha de comando de shell como Bash, Zsh, Korn shell , etc., usando os próprios recursos internos de edição do Emacs.
Fran
3

Tente quoted-insertqual é (por padrão) vinculado a C-q. O próximo caractere digitado será literalmente inserido no buffer.

Então, C-qTABirá inserir uma guia literal.

Não sei o que isso faz nos modos comuns (em relação à conclusão do bash) e não estou em posição de testá-lo.

kjfletch
fonte
1
Isso tem o mesmo efeito que minha segunda tentativa, acima. Não vai, infelizmente.
Chris R
2

Que tal experimentar o terminal do Emacs (em vez de shell).

M-x term

Trey Jackson
fonte
1
Term tem seu próprio conjunto de problemas, começando com algumas interações interessantes com o meu conjunto existente de ajustes bashrc.
Chris R
1

Você pode usar o caractere de citação do bash, que é Ctrl-V. Para inserir um TAB literal no bash em execução no buffer de shell do Emacs, faça

C-q C-v C-q TAB

toomas
fonte