# Vim tip for Quiver

I was finding myself struggling to navigate between long wrapped lines in Quiver using Vim's j and k commands. Text, as opposed to code, can have long physical lines. I could break them up by add a line break after every period but that feels strange. While perusing the Quiver wiki I landed on the Vim section (opens new window). There was my answer:

Quiver has line wrapping turned on by default (src). To get j and k working normally, either use :set nowrap or :map j gj and :map k gk.

I applied the keymap and it worked beautifully. I also learned about Vim's gj option for the first time. Here is the documenation (opens new window) if you are interested.

# AppleScript

The next problem was that the map commands were not being persisted. At every restart, I would have to retype :map j gj and :map k gk. The docs came in handy again and pointed me to this applescript (opens new window). The script would programmatically open Quiver and type in those commands. I modified the script to my preferences (opens new window). Gave it the correct access permissions for an executable via chmod 755 Quiver.sh and ran it.

# Accessability Permissions

I got the following error: execution error: System Events got an error: osascript is not allowed to send keystrokes. (1002).

Turns out my Script Editor didn't have enough permissions. So I went under System Preferences > Security & Privacy > Privacy > Accessibility and checked the box.

Accessibility Screen

However, I wasn't done yet. I ran ./Quiver.sh again and got the same permission error. After some research, I realized I needed to give iTerm (opens new window) those same permissions. This is because I was using iTerm to run the script. I gave it those permissions and it worked without errors. However, Quiver's vim mode started acting weird. Turns out I needed to (programmatically) press Return between the two map calls. I modified my script (opens new window) to add keystroke return between the two map calls and it worked.

Here is the full applescript:

tell application "Quiver"
end tell

tell application "System Events"
    -- jump to the correct location (split mode pane)
    keystroke tab
    keystroke tab

    -- if we were already in the cell, jump back
    key down {shift}
    keystroke tab
    keystroke tab
    key up {shift}
    delay 0.01

    -- remap vim
    keystroke ":map j gj"
    keystroke return
    keystroke ":map k gk"
    keystroke return
end tell

# Handy Alias

The last step was to add an alias so I don't have to remember the full file path to the script. I added this to my .zshrc:

# Quiver
alias quiver='/Users/jibrankalia/dotfiles/quiver/Quiver.sh'

I then ran source ~/.zshrc so that my current shell picked up the changes. I then typed quiver to the shell and voila everything worked.

Thank you for reading.

Credit to Vincent Yang (opens new window) for the original script.

Last Modified: 9/21/2020, 12:46:10 PM