imenu里的数据能单独显示在一个窗口里吗?

imenu是emacs自带的一个工具,它能够分析当前缓冲区中的定义。

他基于什么机制分析定义,我不是很清楚(没有去深究,可能是基于正则表达式吧。他似乎能分析racket,其他语言的支持情况我不是很清楚,不过至少能满足我目前的需求)

我的问题是,有没有办法把imenu的数据显示在一个独立窗口里?然后我们可以通过鼠标去点他,就像eclipse等IDE里的outline view功能?

我现在的办法是把他放到菜单栏上,但感觉不是很方便。。。

;; automatically add an Imenu menu to the menu bar
(defun try-to-add-imenu ()
  (condition-case nil (imenu-add-to-menubar "imenu") (error nil)))
(add-hook 'prog-mode-hook 'try-to-add-imenu)

想听听你们的意见

helm的imenu好像就是这样的,以前用过,现在用ivy了,他的imenu就和原生差不多,不过我现在用lsp-ui-imenu也是这个效果,但感觉更好看,而且lsp识别要准确多了

lsp-ui-imenu能有独立outline窗口吗?

就和Eclipse和Visual Studio那样?

是独立一个窗口,但好像并不能用鼠标点

这个 imenu-list 包应该是你想要的

谢谢,已经用上了。

不过这个窗口似乎只能显示在最左边和最右边,能卡到treemac下面去吗?

我所希望的布局:

目前的做法是:

使用imenu-list-minor-mode,然后在Treemacs窗口下,手动打开一个下部窗口,然后再转Ilist,不过每次打开编辑器后都要手动调,不是很方便。

他的imenu-list-smart-toggle不是很智能,只支持:

left, right, above or below, to display the window at the left, right, top or bottom of the frame.。。。

ivy 可以按 C-c C-o,counsel-imenu 和 swiper 都有效,应该是通用的。

同一个作者还有一个包:

这个是专门解决窗口配位置的问题的,可以把你弄好的layout保存下来。

不过我没有用过 ¯\_(ツ)_/¯

treemacs集成了imenu,在对应文件按tab就能够显示outline了。

4 个赞

还真有~~

之前居然一直没发现,感谢!!

没人说speedbar的,更喜欢speedbar的独占一个frame,不需要时隐藏节省屏幕空间,需要时出来但不改变当前窗口大小和位置。

speedbar中显示imenu里下一级的数据,在对应文件按+和-,显示imenu中的全部数据按 “[” 和 “]”(数据太多可能会卡),不知道为什么speedbar不用tab。

补充:speedbar里用空格和用tab的展开折叠差不多

你说的这种有人喜欢有人不喜欢。

在平铺窗口下,这种单独的frame其实是比较讨厌的,还得再为它单独写个规则。而如果直接在Emacs里面,就不用WM特殊处理了。

@Youmu 还得再为它单独写个规则,可能是我没用过平铺窗口的原因吧,单独写个规则控制speedbar的位置大小也不麻烦,几行代码,我的是

 (defun my-speedbar-width() (interactive)(progn
   ;(speedbar t)(setq header-line-format nil) (setq mode-line-format nil)
   (set-frame-width (selected-frame) 34)
   (set-frame-height (selected-frame) 46)
   (set-frame-position (selected-frame) 121 158) ))

是根据不同屏幕大小来设置的,这段代码用于1920*1080分辨率屏幕时speedbar的大小位置,遇到的主要问题是这段代码如果写在speedbar-mode-hook里老出问题,不知道怎么去解决它?

只好单独写出来调用占一个快捷键(emacs启动后只需调用一次),这也没什么,我没有快捷键不够用或者不好按之类的问题,多按下也就自然记住,按键使用方式见这里