Vim/Emacs keybinding for `Preview.app`

Does anybody have ideas about using emacs/ vim key binding for Preview.app to browser pdf files and how?


You can edit the "Up" and "Down" keyboard shortcuts by going to System Preferences / Keyboard / Application Shortcuts, add a new shortcut for Preview.app. I've mapped Option-J to down, Option-K to up. It won't let you map just J and K, for some reason. But at least you can now browse a PDF without leaving the home row.


As @tty suggested, using Karabiner is brilliant. I made some extra rules.

You can navigate using HJKL and zoom using FDER. Read the file for more information.

Here is my private.xml:

<?xml version="1.0"?>
<root>
  <appdef>
    <appname>PREVIEW</appname>
    <equal>com.apple.Preview</equal>
  </appdef>

  <item>
    <name>Vi Navigation in Preview</name>
    <identifier>private.preview.vinav</identifier>
    <only>PREVIEW</only>
    <uielementrole_not>AXTextField, AXTextArea</uielementrole_not>
    <modifier_only>
        ModifierFlag::NONE,
        ModifierFlag::SHIFT_L | ModifierFlag::NONE,
        ModifierFlag::SHIFT_R | ModifierFlag::NONE,
    </modifier_only>
    <appendix>Navigate using the HJKL keys</appendix>
    <autogen>__KeyToKey__ KeyCode::J, KeyCode::CURSOR_DOWN</autogen>
    <autogen>__KeyToKey__ KeyCode::K, KeyCode::CURSOR_UP</autogen>
    <autogen>__KeyToKey__ KeyCode::H, KeyCode::CURSOR_LEFT</autogen>
    <autogen>__KeyToKey__ KeyCode::L, KeyCode::CURSOR_RIGHT</autogen>
  </item>

  <item>
    <name>Vi Zoom in Preview</name>
    <identifier>private.preview.vizoom</identifier>
    <only>PREVIEW</only>
    <uielementrole_not>AXTextField, AXTextArea</uielementrole_not>
    <modifier_only>
        ModifierFlag::NONE,
        ModifierFlag::SHIFT_L | ModifierFlag::NONE,
        ModifierFlag::SHIFT_R | ModifierFlag::NONE,
    </modifier_only>
    <appendix>Zoom using E/R: out/in</appendix>
    <appendix>Zoom to fit: F</appendix>
    <appendix>Zoom to 100%: D</appendix>
    <autogen>__KeyToKey__ KeyCode::F, KeyCode::KEYPAD_9, VK_COMMAND</autogen>
    <autogen>__KeyToKey__ KeyCode::D, KeyCode::KEYPAD_0, VK_COMMAND</autogen>
    <autogen>__KeyToKey__ KeyCode::R, KeyCode::KEYPAD_PLUS, VK_COMMAND</autogen>
    <autogen>__KeyToKey__ KeyCode::E, KeyCode::KEYPAD_MINUS, VK_COMMAND</autogen>
  </item>
</root>

Use this

Very excellent!!!

I found it recently.

https://pqrs.org/macosx/keyremap4macbook/index.html.en


Self-plug – I’ve made a Karabiner rule that adds vim jk bindings to Preview. I didn’t want to use the other Karabiner rules that added systemwide vim bindings.

https://github.com/xrisk/preview-vim

To use: copy the preview-vim.json file from the repository (or take the copy from below), paste it in your ~/.config/karabiner/assets/complex_modifications, and then enable the rule from Karabiner.

{
    "title": "Map jk in Preview",
    "rules": [
        {
            "description": "map jk",
            "manipulators": [
                {
                    "type": "basic",
                    "from": {
                        "key_code": "j"
                    },
                    "to": [
                        {
                            "key_code": "down_arrow"
                        }
                    ],
                    "conditions": [
                        {
                            "type": "frontmost_application_if",
                            "bundle_identifiers": ["^com.apple.Preview$"]
                        }
                    ]
                },
                {
                    "type": "basic",
                    "from": {
                        "key_code": "k"
                    },
                    "to": [
                        {
                            "key_code": "up_arrow"
                        }
                    ],
                    "conditions": [
                        {
                            "type": "frontmost_application_if",
                            "bundle_identifiers": ["^com.apple.Preview$"]
                        }
                    ]
                }
            ]
        }
    ]
}

Contributions are welcome!

Also sidenote: you might want to look into using zathura; it might fit your use-case.