Shift + Up não é reconhecido pelo Emacs em um terminal

15

Muitas vezes eu uso Shift+ Up/Downpara selecionar uma região no Emacs. Funciona bem no modo GUI, mas quando emacsé chamado com a -nwopção eu posso selecionar linhas apenas com Shift+ Down. O Shift+ Upnão funciona, recebo esta mensagem de erro no minibuffer:

<select> is undefined

Como posso resolver este problema?

WeSenseASoulInSearchOfAnswers
fonte

Respostas:

13

Um terminal de texto transmite apenas caracteres (mais precisamente, bytes), não chaves. As teclas e os acordes das teclas (teclas com modificadores) são codificados como seqüências de caracteres. As teclas que inserem caracteres imprimíveis são enviadas como elas mesmas; As teclas de função são enviadas como seqüências de escape. A maioria das seqüências de escape consiste no caractere Escape ( ?\ena sintaxe do Emacs) seguido por dois ou mais caracteres imprimíveis. Consulte Teclas de controle e para cima / para baixo no terminal para uso pelo emacs e Como funcionam a entrada do teclado e a saída de texto? Para maiores informações.

O Emacs possui um mecanismo para converter seqüências de escape em sua própria noção de chaves. A tabela de conversão input-decode-mapé inicializada quando o Emacs é iniciado (ou mais precisamente, quando um novo quadro é aberto: essa variável tem um valor diferente em cada terminal). Às vezes, o Emacs não conhece todas as seqüências de escape enviadas pelo terminal.

No seu caso, parece que o Emacs tem a interpretação errada para a sequência de escape enviada por Shift+ Up. Você precisa dizer para interpretar isso como S-upantes select. Primeiro, descubra qual é a sequência de escape. No *scratch*buffer, pressione Ctrl+ Qe Shift+ Up. O comando C-qfaz com que o próximo caractere, que é o caractere de escape, seja inserido literalmente, seguido pelo restante da sequência de escape. Digamos que o envio de Shift+ em nosso sistema, você precisará redefinir a entrada correspondente em :Up\e[1;2Ainput-mode-map

(define-key input-decode-map "\e[1;2A" [S-up])

Em princípio, input-decode-mapdeve ser definido por terminal. Na prática, é muito raro ter dois terminais nos quais a mesma sequência de escape codifica chaves diferentes, portanto, uma configuração global funcionará bem.

Gilles 'SO- parar de ser mau'
fonte
Sua resposta parece responder à minha pergunta aqui - emacs.stackexchange.com/questions/33988 . Are the (define-key ...)comandos que deveriam entrar no init.el? Existe um exemplo detalhado em algum lugar que eu possa olhar?
precisa
Os define-keycomandos @vfclists entram no seu arquivo init. Pode ser ~/.emacs.d/init.elou alguns outros locais. Você encontrará vários exemplos de usos define-keypesquisando define-key, mas descobrir qual mapa vincular é outro problema. Vários mapas estão envolvidos: global-map, input-decode-map, function-key-map, keyboard-translate-map. Não sei como responder sua pergunta porque não conheço o Spacemacs. Eu não recomendo o uso de pacotes, como o Spacemacs, que redefinem as interfaces padrão.
Gilles 'SO- stop be evil'
Mudei para o emacs regular para aprender o modo organizacional e consegui trabalhar input-decode-mapdepois de encontrar alguns exemplos. Posso input-decode-mapaplicar isso quando o usuário está inserindo texto em um buffer?
Vfclists
@vfclists input-decode-mapé um dos mapas principais que se aplicam. Veja o manual para detalhes.
Gilles 'SO- stop be evil'
5

No emacs, a região é delimitada pelo ponto (cursor) e pela marca (alguma posição anterior do cursor, que foi "marcada").

Assim, para "selecionar uma região", você precisa colocar essa marca e, em seguida, mover seu ponto.

A maneira mais fácil de colocar a marca é pressionar C-SPC. Em seguida, basta mover o cursor, você verá a "região" estender-se.

Para "desmarcar a região", você pode pressionar C-SPCnovamente.

Como "shift + motion" é uma combinação de teclas comum em outro software, por padrão, ele simula esse comportamento de "selecionar região". No entanto, ele não funciona no terminal, porque o shift não pode ser enviado ao emacs como uma tecla modificadora.

Observe que, geralmente, o C-SPCmétodo é muito mais poderoso do que outros métodos para selecionar uma região: você não está limitado a cima / baixo / esquerda / direita para movimento (você pode usar a pesquisa por exemplo ...) e não requer que você mantenha uma combinação desconfortável de teclas por um longo tempo.

T. Verron
fonte