尝试用 Emacs 作为 kiity 终端的 scrollback_pager

kitty 不像 alacritty 有 vi mode,而是选择将 scrollback buffer 通过管道的方式传外部程序,在外部程序做搜索、选择、复制等操作。搜了一圈大部分 scrollback_pager 都是用 vim。想用 emacs 只能自己用折腾一下,最后效果还可以。效果可以看下这个视频

#!/bin/bash
# use /bin/zsh if macOS

if ! [ -v TTY ]; then
    TTY=/dev/tty
fi
STDIN=$TTY
STDOUT=$TTY

TMP="$(mktemp /tmp/kitty_scrollback_XXXX)";
cat >"$TMP";

# `--terminal/-t $TTY` or `0<$STDIN 1>$STDOUT`
# Eliminate the "standard input is not a tty" error message when running Emacs in a pipe.
emacs -t $TTY -nw -Q --eval  \
      "(let ((b (create-file-buffer \"*kitty_scrollback*\")))
            (menu-bar-mode -1)  \
            (switch-to-buffer b) \
            (insert-file-contents \"${TMP}\")  \
            (delete-file \"${TMP}\")  \
            (require 'ansi-color)  \
            (ansi-color-apply-on-region (point-min) (point-max)) \
            (read-only-mode)  \
            (visual-line-mode) \
            (set-window-start (selected-window) (line-beginning-position ${1})) \
            (setq mode-line-format nil) \
            (setq truncate-lines t) \
            (defadvice kill-ring-save (before copy-to-system-in-tty activate) \
                (pcase system-type  \
                   ('gnu/linux (call-process-region (ad-get-arg 0) (ad-get-arg 1) \"xsel\" nil nil nil \"-ib\"))  \
                   ('darwin (call-process-region (ad-get-arg 0) (ad-get-arg 1) \"pbcopy\" nil nil nil))  \
                )) \
)"

详细的说明在这个 gist

3 个赞

emacs不能用管道,需要创建一个临时文件,所以scrollback_pager大都用vim/nvim或者默认的less

vim的问题是把ansi color的控制字符显示出来,显得很乱。需要打开terminal mode或者直接去掉ansi color的字符,这样就没有颜色了。

我是把ansi color去掉后直接用macOS自带的vim。

vim和emacs相比:

  1. 配置简单,都在配置文件里面写即可,不用再多加个shell;
  2. 在启动快;
  3. 内存占用少;
  4. 喜欢vim的键绑定。

scrollback_pager sh -c '~/bin/vtclean|vim -c "normal G" -c "map <silent> q :qa!<CR>" -c "set nonumber is hls ignorecase clipboard+=unnamed" -c "colorscheme desert" -'

vtclean的url:GitHub - lunixbochs/vtclean: strips terminal escapes from text, can preserve color

(不知道乃们有没有听说过 eless?

3 个赞

真不错,感谢安利

最开始也配置了 vim 作为 scrollback_pager,后来发现默认的 less 就够了,在 scrollback 里面基本用不上高级的编辑功能,scrollback 的目的主要是要从之前的命令输出里面查找内容或者复制文本,而 kitty 自带的 shell integration 功能 + hint 功能足以满足日常使用需求了。通过 shell integration 按 ctrl+shift+g 或者 ctrl+shift+h 进入 scrollback buffer,然后用 hint 快捷键快速选中拷贝内容,超级方便

哈哈,有种刚开始爬山发现别人已经站在山顶的感觉。:sweat_smile:

@georgealbert emacs 方案性能确实不是一个量级,不过都是离造成困扰还很远 :joy:-Q 启动也是毫秒级的。记得之前用 nvim 是可以简单配置一下直接渲染 ansi color 的。

@tennix 试了下,这个体验不错。能代替我用 vim 时候的场景。不过用 emacs 后还是回不去了,高级功能就不说了,主要是操作的一致性,降低心智负担。唯一的问题是 minibuf 会导致 viewport 比 kitty 少一行,最后一行需要翻页才能显示,emacs 又不能不用 minibuf :grinning: