Emacs 要如何实现 Vscdoe 中 Python 那种折叠效果

@jcs090218

大佬,这个功能好像有个缺陷。 就是如下面这段代码:

def test()
    a = 3
    b = 4

如果我把光标放到 a = 3 上,然后再折叠,就会没有效果。


看了一眼代码,感觉还挺难解的。 expression_statement 不管是啥类型的都是一样的。 不知道有没有匹配不成功,自动向其父级进行匹配的功能?


先切换到行首,再折叠是可行的。就是多了一步操作,vscode 里面是可以折叠的。

是不是少了 :?

- def test()
+ def test():

我這邊是都可以摺疊. 如果還有問題的話就提個 issue 吧? :thinking:

嗯,: 是我打少了。加上也是一样的。

就是光标处于 a = 3 中间的时候,没法折叠。处于 a = 3 左边的时候,是可以折叠的。

你再试一下?也可能是我自己的设置出了问题 :dog:

阿, 我忘記我是使用 vs-edit-mode. 所以他幫我解決了這類問題. 老實說, ts-fold 只提供了正確的折疊代碼的方式. 但並沒有規定/限制你怎麼折疊.

類似 Issue:

目前可能要請使用者自己配置了. :sweat_smile:

可行,谢谢大佬


就是需要手动将 vs-edit-close-nodevs-edit-open-node 手动 remap 到 evil-colse-foldevil-open-fold

之前直接用 ts-fold 的时候是不需要的。

是这两者的底层实现有什么不同吗?

ts-fold 只是單純的在"此處"摺疊. vs-edit 的先移動光標才執行折疊. 由於 vs-edit 顧名思義就是仿 Visual Studio 的折疊方式, 所以不宜放在 ts-fold. 我推薦使用者自己摸索, 畢竟沒有完美的插件. 自己摸索合適的才最完美. :wink:

我好像懂了 :smile:,谢谢大佬

大佬,这条语句这么设置会覆盖掉其它 mode 的设置项的。

我在 github 里面提示一个 issue

就是因为这个才出现的,我改成下面这样就好。

(setf (alist-get 'python-mode ts-fold-range-alist) (ts-fold-parsers-python)) 

另外,请教一下大佬,这是 Tab 的分割线,是怎样实现的。

2023-06-04-19-17-33

對的! 這樣會覆蓋掉! 當初用 setq 因為比較簡單展示!

我是用 highlight-indent-guides 這個插件. :wink:

1 个赞

大佬是不是自己设置了对比度啥的,方便分享一下吗?我自己调不出来你图片中的效果。

不過每個 theme 都長得不一樣; 所以配出來還是得要自己調整.

1 个赞

弄好了,这个效果真得是太赞了呀 :clap: :clap: :clap:
谢谢大佬 :hugs:

不知道大佬有没有碰到下面这种情况。

有時候會遇到這種情況, 不過通常下個指令就會被刷掉了. :thinking:

有些指令能刷掉,有些好像不行。虽然不影响使用,但是看起来还是有点影响观感的,不知道引起这个问题的原因是什么,要是能提前规避掉,就更加好了。

是阿! 現在這個插件是目前最好用的. 但還是有些問題. 希望哪天能有新的代替品. :sweat_smile:

ts-fold 現在支援 29 treesit.el; 不過現在是另一個包. :thinking:

看這, GitHub - emacs-tree-sitter/treesit-fold: Code folding using treesit.el.

1 个赞

怎么还依赖下面这个很老的包?是不是我找错资源了?

安装时有下面的编译错误:

lib/treesit-fold/treesit-fold-indicators.el:32:11: Error: Cannot open load file: 没有那个文件或目录, fringe-helper

代碼是從 ts-fold 移植過來的. 我自己用 fringe-helper 是沒什麼問題. :sweat_smile:

現在已經移除了, Remove dependency in `fringe-helper.el` by DevelopmentCool2449 · Pull Request #7 · emacs-tree-sitter/treesit-fold · GitHub.

1 个赞