给 skim 加点键盘快捷键!

Posted on May 23, 2024 by Yu Cong
Tags:

2024 年八月之后, 就没有再使用自己编译的 skim 了, 键盘快捷键用的不多

这个方法并不是十分完美, 修改 scrollPoint 之后不知道该如何更新边栏(目录和预览). 如果能做到更新边栏且平滑滚动就十分不错.

skim 长这个样子(不是那个 fuzzy finder in rust)
skim

和 preview 一样用 apple pdfkit, 但是很多地方做的要更好, 而且还在 sourceforge 上开源的. 据说 ZATHURA 差不多是个能读 pdf 的 vim, 但是对 mac 的屏幕支持有点垃圾. 没有用过

之前最好用的 pdf reader 是 okular, 可以很方便的用一些 vim keybindings, 但是 skim 不行, 所以要试试改源码了

另外我在用(upd: 没有继续用了) karabiner, 有些很好用的配制比如 https://ke-complex-modifications.pqrs.org/?q=vim, 在 normal mode 下 j k 貌似直接映射到 上下箭头.
karabiner-vim-plus

原本使用 karabiner 就可以解决问题了, 但是 skim 没有自己处理按上下箭头之后的操作而是扔给 pdfkit 里面的代码处理. apple 认为按DownArrow 你只需要将屏幕下移 1/3 行, 移动太慢完全无法使用.
SKPDFView-keydown

大概是 1848 行那里直接扔给另外的 keyDown 来处理了. 不过好在 objective c 足够像 C++, 即使从来没接触过, 当成大概也能改一改. 需要去 sourceforge 那里搞到源码, 扔到 xcode 里面按照网站上说的办法就能编译了. 需要改的是 SKPDFView.m, 处理键盘按键的函数在 1746 行叫做 - (void)keyDown:(NSEvent *)theEvent 只要在里面加上处理对应 eventChar 的 else if 就好了.
code

然后需要实现 myscrollDown,myscrollUp. 在别的代码里可以翻到 skim 是怎么写 scroll 操作的, 直接抄过来. 在 SKMainWindowController_Actions.m 里面有这样的代码
- (void)scrollUp:(id)sender {
    NSScrollView *scrollView = [[self pdfView] scrollView];
    NSClipView *clipView = [scrollView contentView];
    NSPoint point = [clipView bounds].origin;
    point.y += [clipView isFlipped] ? -4.0 * [scrollView verticalLineScroll] 
    : 4.0 * [scrollViewverticalLineScroll];
    [clipView scrollPoint:point];
}

- (void)scrollDown:(id)sender {
    NSScrollView *scrollView = [[self pdfView] scrollView];
    NSClipView *clipView = [scrollView contentView];
    NSPoint point = [clipView bounds].origin;
    point.y += [clipView isFlipped] ? 4.0 * [scrollView verticalLineScroll] 
    : -4.0 * [scrollViewverticalLineScroll];
    [clipView scrollPoint:point];
}

抄过来然后根据 xcode 的提示修改一下
code

编译, 找到 skim.app, 扔到 application 里面, 结束!

完全不会写 objective c 也能加点功能 :)