Colando do gerenciador de área de transferência do OS X no emacs

3

Eu amo emacs. Eu amo ter meu histórico da área de transferência. Eu usei Jumpcut por um longo tempo e recentemente comprei o powerpack para Alfred e tentou seu gerenciador de clipboard.

Eu tenho o mesmo problema com esses dois gerenciadores de área de transferência. Quando tento colar no Emacs, o gerenciador da área de transferência envia um virtual + V para o Emacs. O Emacs interpreta isso como M-v - rolagem para baixo.

Estou usando o Emacs há muito tempo e em muitas plataformas para alterar meus atalhos de teclado. O Emacs é muito personalizável. Como os gerenciadores de pranchetas são usados por usuários nerds, os desenvolvedores dos gerenciadores de pranchetas são ainda mais geek e sabem como resolver problemas nerds.

Portanto, deve haver uma maneira de fazer essas coisas funcionarem juntas.

Existe uma maneira de configurar o emacs para aceitar o colar nativamente (sem alterar meus keybdindings)?

Existe uma maneira de o Jumpcut, o Alfred ou outro gerente da área de transferência enviar algo que o Emacs interpretará (por exemplo, C-y ) apenas para o Emacs?

    
por Doug Harris 01.12.2011 / 22:17

2 respostas

1

Eu não uso o Mac, no Windows eu resolvi isso rebindigando o C-v, que felizmente não uso de outra forma. Mas aqui está uma ideia:

Eu acho que existem ferramentas para Mac que permite ligar qualquer tecla para chamar um aplicativo e verificar qual janela está ativa (algo como Autohotkey ). Escolha alguma tecla de atalho que você usará para chamar o gerenciador da área de transferência (você também pode usar sua tecla de atalho atual se o programa de macro do teclado puder manipulá-la). Anexe uma macro à hotkey que verifica qual janela está ativa e se é emacs então envia uma mensagem primeiro para o emacs via emacsclient para religar M-v como "yank e depois restaurar a ligação original de M-v" e então invoca o gerenciador da área de transferência. Desta forma, quando o gerenciador da área de transferência for colado no emacs, o emacs interpretará M-v como yank e, em seguida, restaurará a vinculação original de M-v à rolagem.

    
por 02.12.2011 / 07:37
0

A origem do Jumpcut (que eu nunca usei) está disponível, portanto você pode alterar fakeCommandV em AppController.m para detectar quando está colando no Emacs. Eu testei o seguinte muito levemente. Eu também tive que fazer algumas mudanças não relacionadas, mas menores, para fazê-lo compilar no meu computador (10.6).

-(void)fakeCommandV
    /*" +fakeCommandV synthesizes keyboard events for Cmd-v Paste
    shortcut. "*/
    // Code from a Mark Mason post to Cocoadev-l
    // What are the flaws in this approach?
    //  We don't know whether we can really accept the paste
    //  We have no way of judging whether it's gone through
    //  Simulating keypresses could have oddball consequences (for instance, if something else was trapping control v)
    //  Not all apps may take Command-V as a paste command (xemacs, for instance?)
    // Some sort of AE-based (or System Events-based, or service-based) paste would be preferable in many circumstances.
    // On the other hand, this doesn't require scripting support, should work for Carbon, etc.
    // Ideally, in the future, we will be able to tell from what environment JC was passed the trigger
    // and have different behavior from each.
{
    NSString* app = [[[NSWorkspace sharedWorkspace] activeApplication]
                     objectForKey:@"NSApplicationName"];
    NSLog(@"Current application: %@",app);
    if ( [app isEqual:@"Emacs"] ) {
        NSNumber *keyCode = [srTransformer reverseTransformedValue:@"Y"];
        CGKeyCode yCode = (CGKeyCode)[keyCode intValue];
        CGPostKeyboardEvent( (CGCharCode)0, (CGKeyCode)59, true ); // Control down
        CGPostKeyboardEvent( (CGCharCode)'y', yCode, true ); // Y down
        CGPostKeyboardEvent( (CGCharCode)'y', yCode, false ); //  Y up
        CGPostKeyboardEvent( (CGCharCode)0, (CGKeyCode)59, false ); // Control up

    } else {
        NSNumber *keyCode = [srTransformer reverseTransformedValue:@"V"];
        CGKeyCode veeCode = (CGKeyCode)[keyCode intValue];
        CGPostKeyboardEvent( (CGCharCode)0, (CGKeyCode)55, true ); // Command down
        CGPostKeyboardEvent( (CGCharCode)'v', veeCode, true ); // V down
        CGPostKeyboardEvent( (CGCharCode)'v', veeCode, false ); //  V up
        CGPostKeyboardEvent( (CGCharCode)0, (CGKeyCode)55, false ); // Command up
    }
}
    
por 04.12.2011 / 14:55