3

Я люблю Emacs. Я люблю иметь свою историю буфера обмена. Я давно пользовался Jumpcut, недавно купил блок питания для Альфреда и попробовал его менеджер буфера обмена.

У меня та же проблема с обоими этими менеджерами буфера обмена. Когда я пытаюсь вставить в Emacs, менеджер буфера обмена отправляет виртуальный +V в Emacs. Emacs интерпретирует это как M-v - прокрутка вниз.

Я слишком долго использую Emacs и на слишком многих платформах, чтобы менять привязки клавиш. Emacs очень настраиваемый. Поскольку менеджеры буфера обмена используются опытными опытными пользователями, разработчики менеджеров буфера обмена еще более умны и знают о решении вызывающих проблем.

Таким образом, должен быть способ заставить эти вещи работать вместе.

Есть ли способ настроить emacs для непосредственного принятия вставки (без изменения моих назначений клавиш)?

Есть ли способ для Jumpcut, Альфреда или другого менеджера буфера обмена отправить что-то, что Emacs будет интерпретировать (например, C-y) только для Emacs?

2 ответа2

1

Я не использую Mac, в Windows я решил это с помощью rebindig Cv, который, к счастью, я не использую иначе. Но вот идея:

Я предполагаю, что есть инструменты для Mac, которые позволяют вам связать любую клавишу для вызова приложения и проверить, какое окно активно (что-то вроде Autohotkey). Выберите некоторую горячую клавишу, которую вы будете использовать для вызова менеджера буфера обмена (вы также можете использовать его текущую горячую клавишу, если ваша клавиатурная макрос-программа может с этим справиться). Прикрепите макрос к горячей клавише, которая проверяет, какое окно является активным, и, если это emacs, то сначала отправляет сообщение в emacs через emacsclient, чтобы повторно связать Mv как «yank, а затем восстановить первоначальную привязку Mv», а затем вызывает менеджер буфера обмена. Таким образом, когда менеджер буфера обмена вставляется в emacs, тогда emacs интерпретирует Mv как yank, а затем восстанавливает первоначальную привязку Mv к прокрутке.

0

Источник для Jumpcut (который я никогда не использовал) доступен, так что вы можете изменить fakeCommandV в AppController.m чтобы определить, когда он вставляется в Emacs. Я очень легко проверил следующее. Мне также пришлось внести несколько несвязанных, но незначительных изменений, чтобы заставить его скомпилироваться на моем компьютере (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
    }
}

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .