从 OS X 剪贴板管理器粘贴到 emacs

从 OS X 剪贴板管理器粘贴到 emacs

我喜欢 emacs。我喜欢有剪贴板历史记录。我用过跳切很长一段时间,最近购买了电源包阿尔弗雷德并尝试了它的剪贴板管理器。

这两个剪贴板管理器都存在同样的问题。当我尝试粘贴到 Emacs 中时,剪贴板管理器会向 Emacs发送一个虚拟+ 。Emacs 将其解释为-- 向下滚动。VM-v

我已经使用 Emacs 太久了,而且在太多平台上都用过,以至于无法更改我的键绑定。Emacs 非常可定制。由于剪贴板管理器是由极客高级用户使用的,因此开发商剪贴板管理员甚至更加技术娴熟,知道如何解决棘手的问题。

所以,必须有一种方法可以让这些东西协同工作。

有没有办法配置 emacs 以本机接受粘贴(无需更改我的键盘设置)?

有没有办法让 Jumpcut、Alfred 或其他剪贴板管理器发送一些 Emacs 可以解释的内容(例如C-y)仅适用于 Emacs?

答案1

我不使用 Mac,在 Windows 上我通过重新绑定 Cv 解决了这个问题,幸运的是,我不用它。但这里有一个想法:

我猜 Mac 上有一些工具可以让你绑定任意键来调用应用程序并检查哪个窗口处于活动状态(比如自动热键)。选择一些热键,用于调用剪贴板管理器(如果您的键盘宏程序可以处理,您也可以使用其当前热键)。将一个宏附加到热键,检查哪个窗口处于活动状态,如果是 emacs,则它首先通过 emacsclient 向 emacs 发送一条消息,将 Mv 重新绑定为“复制,然后恢复 Mv 的原始绑定”,然后调用剪贴板管理器。这样,当剪贴板管理器粘贴到 emacs 中时,emacs 会将 Mv 解释为复制,然后恢复 Mv 的原始绑定以进行滚动。

答案2

Jumpcut 的源代码(我从未使用过)是可用的,因此您可以更改fakeCommandVAppController.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
    }
}

相关内容