V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
perfee
V2EX  ›  macOS

干掉 MAC 系统的 ctrl + click = right click(包括支持 idea 下 ctrl+click 跳转定义处功能)

  •  1
     
  •   perfee · 2020-11-22 22:55:29 +08:00 · 1570 次点击
    这是一个创建于 1247 天前的主题,其中的信息可能已经有所发展或是发生改变。

    MAC:“用户你好,我是你爹”。 “如果你不用 mac 鼠标,那最好不要用外设鼠标了,因为我规定 ctrl+click = right click” 。。。。

    说下背景:

    我是个软粉,酷爱 windows 。所以日常常用快捷键都是 win 风格,尤其是 IDE 中,ctrl + click 调转到代码定义处,早形成了肌肉记忆。你让我改?改是不可能改的。

    无奈公司发 mac 电脑,看着同事都用 mac,我把 mac 扔一边吃灰,继续用着我的 surface 写代码。过了一年多,我觉得每天上下班拿电脑有些累,那能不能用着 mac,还使用着 win 风格的快捷键?我开始尝试了。 平时常用的 ctrl+c,v,a,z,s 等等,这些都好办,搞一个全局的映射就好了嘛(这里推荐免费神器 Karabiner: https://github.com/pqrs-org/Karabiner-Elements )。 另外 cmd,alt,fn,ctrl 键盘位置互换,mac 也提供的有这个功能。用外设的时候可以根据外部键盘互换一下。

    好了,开始进入正题:

    MAC 上的 ctrl + click = right click 这个设定十分恶心,我是无论如何也不接受这个设定的。 上 Karabiner 代码,把 ctrl + click 改成 ${ 当前是 idea 吗 ? (ctrl + B) : click}. 这个代码既全局屏蔽了 ctrl + click = right click 的设定,也能在 idea 上正常工作,让其实现跳转到定义处功能。 //代码明天上班后贴上来。

    另外我还想到了在 mac 神器 iterm2 上,实现右键复制,右键粘贴的功能,就像 windows terminal 上行为一样吗,明天开始写 script 实现它。

    第 1 条附言  ·  2020-11-25 22:33:33 +08:00

    附上 karabiner 修改 idea ctrl+click (ctrl+alt+click 的未实现,不过如出一辙,把代码改下就可以实现 ctrl+alter+click 避免出现右键菜单的功能)代码:

    {
      "title": "Ctrl Click On Idea",
      "rules": [
        {
          "description": "Ctrl Click On Idea",
          "manipulators": [
            {
              "type": "basic",
              "from": {
                "pointing_button": "button1",
                "modifiers": {
                  "mandatory": [
                    "left_control"
                  ],
                  "optional": [
                    "caps_lock"
                  ]
                }
              },
              "to": [
                {
                  "pointing_button": "button1"
                }
              ],
              "to_delayed_action": {
                "to_if_invoked": [
                  {
                    "key_code": "b",
                    "modifiers": [
                      "left_control"
                    ]
                  }
                ]
              },
              "conditions": [
                {
                  "type": "frontmost_application_if",
                  "bundle_identifiers": [
                    "^com\\.jetbrains\\.intellij"
                  ]
                }
              ],
              "parameters": {
                "basic.to_delayed_action_delay_milliseconds": 10
              }
            }
          ]
        },
        {
          "description": "Disabled Ctrl + Left",
          "manipulators": [
            {
              "type": "basic",
              "from": {
                "pointing_button": "button1",
                "modifiers": {
                  "mandatory": [
                    "left_control"
                  ],
                  "optional": [
                    "caps_lock"
                  ]
                }
              },
              "to": [
                {
                  "pointing_button": "button1"
                }
              ]
            }
          ]
        }
      ]
    }
    

    导入到 karabiner 中即可。

    第 2 条附言  ·  2020-11-25 22:34:02 +08:00
    **下面是 iterm2 上,实现选中后右键复制,右键粘贴的代码:**
    ```
    #!/usr/bin/env python3.7

    import iterm2

    async def main(connection):
    app = await iterm2.async_get_app(connection)

    @iterm2.RPC
    async def smartCopyAndPaste():
    window = app.current_terminal_window
    if (window is None): return
    tab = window.current_tab
    if (tab is None): return
    session = tab.current_session
    if (session is None): return
    selection = await session.async_get_selection()
    text = await session.async_get_selection_text(selection)

    if ((text is None) or (len(text) == 0)):
    await iterm2.MainMenu.async_select_menu_item(connection, "Paste")
    return

    await iterm2.MainMenu.async_select_menu_item(connection, "Copy")
    await session.async_set_selection(iterm2.Selection([]))

    # Remember to call async_register!
    await smartCopyAndPaste.async_register(connection)

    iterm2.run_forever(main)
    ```
    把上述代码导入到 iterm2 的 script 中,然后绑定一个快捷键(假定是 **ctrl+alt+m**) 来执行这个 smartCopyAndPaste() 方法,最后用 karabiner 设置在 iterm2 上把右键映射为 **ctrl+alt+m**。
    这样点右键等同于执行上述代码,就实现了:
    右键 -> 有选中文本吗 ? (复制&取消选中) : 粘贴。
    的效果
    第 3 条附言  ·  2020-11-25 22:41:56 +08:00

    上边 iterm2 的 python 代码缩进坏了,因为我发布的时候忘记选择 markdown 了。这里补一下吧,万一真有人要用呢,也算是个小小的分享了。

    #!/usr/bin/env python3.7
    
    import iterm2
    
    async def main(connection):
        app = await iterm2.async_get_app(connection)
    
        @iterm2.RPC
        async def smartCopyAndPaste():
            window = app.current_terminal_window
            if (window is None): return
            tab = window.current_tab
            if (tab is None): return
            session = tab.current_session
            if (session is None): return
            selection = await session.async_get_selection()
            text = await session.async_get_selection_text(selection)
    
            if ((text is None) or (len(text) == 0)): 
                await iterm2.MainMenu.async_select_menu_item(connection, "Paste")
                return
    
            await iterm2.MainMenu.async_select_menu_item(connection, "Copy")
            await session.async_set_selection(iterm2.Selection([]))
    
        # Remember to call async_register!
        await smartCopyAndPaste.async_register(connection)
    
    iterm2.run_forever(main)
    
    4 条回复    2020-11-25 22:39:50 +08:00
    kingfalse
        1
    kingfalse  
       2020-11-23 08:53:20 +08:00 via Android   ❤️ 4
    建议别折腾了,直接装 windows
    perfee
        2
    perfee  
    OP
       2020-11-25 22:23:42 +08:00
    @kingfalse 公司电脑,安全组的人天天监控着,动不得啊。

    已经折腾完毕了,基本上所有操作都保持和 windows 上一致了。
    全局替换了 ctrl+c,a,z,v,x -> cmd+c,a,z,v,x
    idea 所有快捷键和 win 完全一致
    alt+tab 已找到替代软件
    连 iterm2 上的右键复制,右键粘贴都让我给写脚本实现了,目前保持和 windows terminal 完全一致。
    叉会儿腰。
    perfee
        3
    perfee  
    OP
       2020-11-25 22:37:50 +08:00
    我认为基本上 mac 上所有的快捷键问题都可以用 karabiner 搞定,就是有的需要自己写一点脚本,官网文档很全,都有 demo 。
    另外 iterm2 真是个神器,写代码可以定制超多功能,基本上可以做到随心所欲了。
    最重要的是这两个东西都是免费的。
    perfee
        4
    perfee  
    OP
       2020-11-25 22:39:50 +08:00
    上边 iterm2 的 python 代码缩进坏了,因为我发布的时候忘记选择 markdown 了。这里补一下吧,万一真有人要用呢,也算是个小小的分享了。

    #!/usr/bin/env python3.7

    import iterm2

    async def main(connection):
    app = await iterm2.async_get_app(connection)

    @iterm2.RPC
    async def smartCopyAndPaste():
    window = app.current_terminal_window
    if (window is None): return
    tab = window.current_tab
    if (tab is None): return
    session = tab.current_session
    if (session is None): return
    selection = await session.async_get_selection()
    text = await session.async_get_selection_text(selection)

    if ((text is None) or (len(text) == 0)):
    await iterm2.MainMenu.async_select_menu_item(connection, "Paste")
    return

    await iterm2.MainMenu.async_select_menu_item(connection, "Copy")
    await session.async_set_selection(iterm2.Selection([]))

    # Remember to call async_register!
    await smartCopyAndPaste.async_register(connection)

    iterm2.run_forever(main)
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5039 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 09:45 · PVG 17:45 · LAX 02:45 · JFK 05:45
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.