Usando C-M-% para fazer um query-replace-regexp no Emacs rodando no terminal Mac

6

Estou tentando fazer uma pesquisa e substituição de expressões regulares no Emacs, sendo executado no programa Terminal no meu MacBook Pro, que está executando o OS X 10.6.2. Tanto quanto eu sei, isso pode ser feito pressionando C-M-% (estou assumindo que isso significa Ctrl + Alt + Shift + 5. Por favor, corrija-me se eu estiver errado, já que estou apenas começando a aprender Emacs). No entanto, quando faço isso, não funciona.

Eu posso fazer isso digitando Mx query-replace-regexp, e quando faço isso, vejo um lembrete na parte inferior da tela dizendo que também posso fazer isso com CM-%, mas quando tento CM-% nada acontece.

EDIT: Eu gostaria de acrescentar que eu tenho a opção de terminal "Usar opção como meta-chave" ativada, e parece funcionar bem. Por exemplo, eu posso usar alt-B e alt-F para avançar e voltar uma palavra por vez no bash e no Emacs.

EDIT 2: Eu também gostaria de mencionar que eu tenho o meu terminal definido para declarar o tipo de terminal como "xterm" em vez do padrão "xterm-color". Eu fiz isso por razões não relacionadas a essa questão (para evitar que meu prompt colorido parecesse engraçado depois de cancelar uma pesquisa reversa). No entanto, eu experimentei no Emacs com "xterm" e "xterm-color", e de qualquer forma eu tenho o mesmo problema com C-M -%.

Como posso fazer isso funcionar?

    
por Elias Zamaria 14.12.2009 / 19:30

4 respostas

2

Diferente dos aplicativos baseados em GUI, os aplicativos baseados em terminal (como quase todos aqueles que você executa dentro das janelas Terminal ) são limitados em quais combinações de teclas podem ser percebidas. Quando os terminais eram hardware real (não apenas emulado por programas como Terminal e xterm ), terminais como o DEC's VT-100 tinham uma tecla Control , mas só funcionou em conjunto com outras teclas . Como a maioria dos programas de emulação de terminal emulam um VT-100 (e seus sucessores, incluindo o VT-102 e o VT-220), não há como realmente enviar um Controle - Shift - 5 (ou qualquer C-% no seu teclado) para um programa baseado em terminal.

Você provavelmente terá mais sorte mapeando query-replace-regexp para uma chave (combinação) que realmente transmite algo. As "teclas F" são (geralmente) mapeadas em um estilo VT-220 que as entradas xterm-color termcap / terminfo sabem como analisar (F1-F4 / F5 podem estar no estilo VT-100!). Se necessário, você pode configurar o Terminal para enviar quaisquer códigos que seu termcap / terminfo esteja esperando (pelo menos eu posso no Terminal 10.4 ). Você pode atribuir códigos a uma tecla F simples ou a uma tecla F com um único modificador (Shift, Control ou Option). Quaisquer modificadores não seriam passados (através do terminal) para o Emacs como tal, mas você poderia mapear algumas dessas combinações para os códigos de tecla do terminal para teclas de função superiores (F14-F20) (a menos que a combinação seja feita por um atalho do sistema— “ Acesso total ao teclado ”, Expose e Spaces (?)).

(global-set-key (kbd "<f13>") 'query-replace-regexp) ; I have a full-sized keyboard with an F13 on it.

Note que o F1-F4 pode não funcionar corretamente, dependendo da configuração do Terminal e do emacs . Por exemplo, no meu sistema (10.4), o Terminal é configurado com “ ESC OP” (o código da chave VT-100) para F1, mas emacs espera “ ESC [11 ~” (uma sequência xterm 'antiga'). As chaves funcionam bem em emacs se eu reconfigurar Terminal (;I; Keyboard) ou emacs (veja abaixo).

; Expect VT-100 key codes for F1-F4
(define-key function-key-map "\eOP" [f1])
(define-key function-key-map "\eOQ" [f2])
(define-key function-key-map "\eOR" [f3])
(define-key function-key-map "\eOS" [f4])
    
por 15.12.2009 / 09:40
1

Você já tentou <esc> C-% ? Isso funciona para mim.

A chave de escape é frequentemente mapeada para meta (e alt (opção em um mac) é não sempre mapeada para meta). A única coisa é que você não o mantém pressionado como uma tecla de mudança, apenas acerta.

BTW - Se você está acostumado a usar alt como meta, a pergunta seguinte é "Como mapear alt para meta no terminal mac?" Que acredito ter sido perguntado no Stack Overflow há muito tempo: Opção ou tecla Command como chave Meta para LispBox no Macintosh sugere colocar (setq mac-command-modifier 'meta) no seu arquivo .emacs.

    
por 15.12.2009 / 03:39
1

Pesquisando em function-key-map ( C-h v function-key-map ), descobri que C-x @ c está vinculado a event-apply-control-modifier . Isso parece funcionar, mas interage mal com a maneira como o Terminal envia as chaves Meta com a opção “Usar opção como meta-chave” (envia um caractere ESC antes do caractere normal).

Quando você digita Controle - x @ c Opção - Shift - 5 , o emacs C-x @ c ESC % . No entanto, ele liga o modificador de controle artificial à chave Escape em vez de traduzir o ESC % para M-% . Então, acaba interpretando como C-ESC % . Tentar empilhar esses modificadores artificiais Control e Meta também falha, porque o primeiro C-x na segunda sequência modificadora artificial absorve o primeiro modificador artificial.

Mas aponta para uma possibilidade:

; cargo cult adaptation of event-apply-control-modifier
(defun event-apply-control-meta-modifiers (ignore-prompt)
  (vector
   (event-apply-modifier
    (event-apply-modifier (read-event)
                          'control 26 "C-")
    'meta 27 "M-")))
(define-key function-key-map (kbd "C-x @ %") 'event-apply-control-meta-modifiers)

Agora, você pode digitar Controle - x @ Deslocamento - 5 Shift - 5 , o emacs verá C-x @ % % , interpretará como C-M-% e executará finalmente query-replace-regexp .

    
por 16.12.2009 / 12:16
1

Para a substituição de consultas no MacBook Pro 2017 com o OSX Sierra, executando emacs integrados no Terminal, use

<esc> % 

em sequência. Se necessário (dependendo do layout do teclado), use < shift > tecla para acessar o sinal%.

    
por 14.08.2017 / 10:52