在翻页的时候,如何让光标停留在翻页时候所在的行?

翻页的时候固定光标,现代编辑器都不会这么做吧。看起来是个简单的需求,真要实现就麻烦了。

首先你要区分翻页和其它操作(比如 上/下/左/右)。

假设上面的问题都理清了,当你翻到第 N 页,看见想要找的内容,喜出望外,习惯地按下了 j 键直奔该行,打算复制回原点粘贴,却触发了任意门,两手空空直接回到了原点。。。其实也是有解的:1. 输入 :<行号>, 2. 鼠标点击该行(一会键盘一会鼠标,有点人格分裂)。。。不过这样一来,原点位置又丢了。

改进的方案是对翻页进一步划分:

- 需要回到原点 (第一次翻页的时候设置原点的位置)
- 无需回到原点

这样就可以不管翻了多少页,做了什么操作,都能一键回到原点了。

在我看来,是解决了一个问题,制造了更多麻烦(额外的操作/快捷键/注意力)。一旦忘记设置原点位置就跳到爪哇国了。

另一个比较可行的方案是,像现代编辑器一样,只在鼠标滚轮的时候固定光标,但是这样你除了回原点还是不能有其它操作。

为什么不把这个问题交给一些能自动记录跳转位置的扩展呢,比如 evil,几次 evil-jump-backward 就回来了(你不会向下翻几十页吧),还可以 forward 反向操作,并且不受 buffer 和窗口的限制。

1 个赞

楼上双窗口的做法,跟关机重启拔电池一样,简单粗暴有效,我也经常使用😅 开双窗口,两头对照,不管是参考抄写是复制粘贴,跳转次数最少。

重启是一个非常重要的维护工具,它可以解决90%的问题, 网管的必备工具.

这个问题解决思路有俩:

  1. 使用 ztzbzz 等命令,和 Ctrl+d/u 配合。最简单毋需配置。

    “翻页”时保持光标位置,不丢失上下文焦点。但最好不要用翻页来理解该操作,其实际效果应该类似于拽着画布移动到电脑屏幕的最上方/最下方(以获得更好视野)。

    根据楼主第三楼的描述,这时你应该使用 zt 命令,而不是 Ctrl+d 命令。

  2. 让光标始终保持在屏幕中央,完全不用以上三个命令。

    翻页时会丢失上下文焦点,但是因为光标始终中央,翻页前后的内容是完全可以预料的。其实际效果就是某些编辑器宣传的所谓“打字机模式”。目前我在用这个。

spacemacs 自带这个开关 SPC t -,但是我一般不开,因为影响性能。需要的时候 C-l 就行了。

好像叫 global center cursor mode?原先折腾 spacemacs 时找到开启过(Vim 的使用习惯),但体验不好,具体原因记不得了,好像是闪烁屏幕很跳的感觉。不太清楚 emacs,不知道这么个东东竟然能到影响性能的程度?

是啊,emacs 就是这么奇葩的存在,我也很惊奇,但是我在 org 下打开,移动光标快一点就会卡。也可能是我的配置有问题?

估计是配置问题,我倒是没怎么卡过,顶多是感觉补全慢一点而已。

有些功能还是官方自己实现下好些,什么都指望第三方 elpa 脚本实现,装个几百个包,不出问题就怪了。当然你可以从 mela 一堆包里面试,找出好用不冲突不卡的包弄个功能完善的配置,但这个花费的时间就太多了。

没错,我发现 spacemacs 的性能问题也比较严重,有些包,甚至是底层的包,没有做好优化。比如合作者 bmag 的包 window-purpose,那个包甚至会在你调用 (with-temp-buffer ..) 这种常用的函数时起作用,性能能好才见鬼了。我干脆把它屏蔽了。而且最吃性能的其实是 orgmode,也许你在其它 mode 下都可以跑得很流畅,但是到 org 这就不行了。

不过这也算是 org 的 featrue 吧,谁让它功能那么多呢

我最希望在 emacs 26 中看到的是性能的大幅改观。原生行号应该能提升些性能。

不太清楚 lisp 语法,不会调 bug。

有空可以尝试下 DOOM 那个配置,初看上去还不错。但奇怪也没见人分享使用经验。

DOOM 再好我也不会轻易尝试,我自己写了有 7-8 个 private layer,另外还有不少 local package,已经形成使用习惯了。而且来回折腾的时间成本太高了。

tan 90° ,不存在的。除非换解释器。Rust Emacs 也没有做到惊人程度的性能改观。

这礼拜 Reddit 上有人推荐换 Racket 内核,举双手赞成,因为 Racket 的文档超详尽,还有 Racket 的解释器是 Chez,Chez 的速度比 Chicken,guile,MIT,快太多太多了。

Remacs 的进展很慢很慢,C 代码没换多少,可能连 10 分之一都不到。

根本看不到 Rust 代码的影子。

讲个事,GitHub 代码统计是以文件为单位的,所以其实不能拿来当证据。

然后考虑到许可和政治因素,不太可能用 Racket

@stonejiajia @LdBeth

⋊> cloc ~/gitrepos/remacs
    3318 text files.
    3242 unique files.
     882 files ignored.

github.com/AlDanial/cloc v 1.74  T=29.15 s (83.7 files/s, 70562.8 lines/s)
-----------------------------------------------------------------------------
Language                   files          blank        comment           code
-----------------------------------------------------------------------------
Lisp                        1654         158349         213058        1115523
C                            263          56263          72020         270227
C/C++ Header                 200           8936          13321          39810
TeX                           27           3984           6428          17831
Objective C                    9           3515           2467          15612
m4                           100           1313            859          14140
Rust                          42            876           1126           6548
Bourne Shell                  17            610            865           5371
HTML                          18            178             68           2679
Pascal                         2            191            241           2205
...                          ...            ...            ...            ...
-----------------------------------------------------------------------------
SUM:                        2440         237953         312649        1506407
-----------------------------------------------------------------------------
1 个赞

看到这里想起来刚开始在jetbrains里用vim插件的时候也很不习惯它的C-d C-u,现在细想一下的话,其实还是不习惯,但是编辑的时候这两个键少按了很多(虽然仍然非常多)。
Instead,要找特定符号直接/nnnnn,然后ma mb 'a 'b 'a,给每个地方取个alias,比如constructor就mc、member变量就mm,index函数就mi,这样这个文件编辑一会儿之后脑袋里hashMap很完善了,就想去哪儿就去哪儿,'c瞬间跳转,但是比较占用脑袋空间。楼主写C/C++文件比较大可能不一定好用,我前端文件比较小这样很痛快。

vim/evil用多了就感觉自己越发接近机器了,剪贴板registers和marker registers再也离不开,编辑一行代码,带着我要改什么,眼睛一看先去找unique的字符,逗号括号等等,不够再看两个连一起的(用evil-snipe),人肉正则匹配一下,然后按下c2t, C-r "IDE=更理解代码的编辑器;vim/evil users=更理解代码的程序员。

用evil-jump,C-i, C-o想怎么跳怎么跳。。。

push-mark pop-mark感觉最简单

(setq scroll-preserve-screen-position 'always)