[Finda] 一个支持索引 Emacs Buffers 的 Mac Launcher

https://keminglabs.com/finda/

相比 Spotlight、Alfred 和 LaunchBar 等,Finda 非常简单,没什么看似「高级」的功能,比如计算器,默认还支持索引 Emacs Buffers (设置方法),所以我打算先试上一段时间。

(搜索 Emacs 的 *scratch* Buffer)

关于 Emacs 配置

直接用官方的配置,我修改了其中的 finda-switch-to-buffer,为了重用已有的窗口

注:Finda 是个闭源付费(19.99 USD)软件,但可免费试用一段时间。

原理上是用emacsclient获取buffer列表然后模糊匹配?

(defun princ-bufferlist ()
  (->> (buffer-list)
       (-map #'buffer-name)
       (--remove (string-prefix-p " " it))))
130 chino@archlinux ~/.emacs.d (git)-[master] % emacsclient --eval '(princ-bufferlist)'                                                                                                    :(
("*scratch*" "*helpful function: buffer-list*" "*helpful function: buffer-live-p*" "dash-functional.el" "*helpful function: -not*" "*WoMan-Log*" "*WoMan 1perl perlre*" "*WoMan 1perl perl*" "*WoMan 1 split*" "test.perl" "custom.el" "*helpful command: switch-to-buffer*" "*Pp Eval Output*" "*helpful function: string-prefix-p*" "awesome-tab" "magit: awesome-tab" "powerline-separators.el" "powerline-themes.el" "site-lisp" "lib" "etc" "autoloads" "aggressive-indent-mode" "magit-process: awesome-tab" "awesome-tab.el" ".emacs.d" "basic.el" "aggressive-indent.elc" "aggressive-indent.el" "*Messages*" "magit-process: .emacs.d" "magit-diff: .emacs.d" "magit: .emacs.d" "*Flycheck error messages*" "magit-log: awesome-tab" "magit-revision: awesome-tab" "*Help*")
chino@archlinux ~/.emacs.d (git)-[master] % emacsclient -c --eval '(switch-to-buffer "dash-functional.el")'
#<buffer dash-functional.el>

Alfred之类的稍微编下程就能做到?

对,这个工具非常简单

  1. 收集候选项目(窗口、App、文件、浏览器 Tab、浏览器历史、Emacs Buffers);
  2. 用户输入字符串过滤;
  3. 用户按 RET 打开这个选项。

所以不像 Alfred、LaunchBar,这个没啥别的功能,也就没有各种术语(Workflow、Instant Send),也就没学习成本。

可以,我之前也试过

rofi是一个linux下的快速启动栏,它可以从stdin读取补全项,然后输出到stdout。

#!/bin/sh
:; -*- mode: emacs-lisp; coding: utf-8 -*-
:; exec emacsclient -c --eval "(load (expand-file-name \"$0\"))" -- "$@"

(require 'cl-lib)
(require 's)

(defun get-current-buffers ()
  (s-replace-regexp "\n+" "\n"
                    (string-join (thread-last (buffer-list)
                                   (mapcar #'buffer-name)
                                   (cl-remove-if (lambda (it) (string-prefix-p " " it))))
                                 "\n")))

(defun do-switch-buffer ()
  (switch-to-buffer (with-temp-buffer
                      (erase-buffer)
                      (shell-command (format "echo '%s' | rofi -matching fuzzy  -dmenu" (get-current-buffers)) (current-buffer))
                      (s-trim (buffer-string)))))


(do-switch-buffer)

为什么没有截图演示?因为rofi进入之后就拦截了键盘事件。我flameshot都用不了了

%E6%B7%B1%E5%BA%A6%E5%BD%95%E5%B1%8F_Desktop_20190227171213


有趣的玩法。妈妈再也不用担心helm和ivy的补全太丑了

(defun Mx-with-rofi ()
  (interactive)
  (ignore-errors
    (command-execute (intern-soft
                      (with-temp-buffer
                        (erase-buffer)
                        (shell-command (format "echo '%s' | rofi -matching fuzzy -dmenu"
                                               (s-join "\n" (counsel--M-x-externs)))
                                       (current-buffer))
                        (s-trim (buffer-string)))) 'record)))
4 个赞

因为我平时的工作流是基于 emacs + qutebrowser + i3 的, 我也写了一个类似楼上的东西,不过包括这三方面而已。

预览如下:

bufferswitch

gist 如下:

PS: 论坛中可能有大量使用 firefox 的同学,可以考虑使用这两个插件与 rofi 联动:

GitHub - blackhole89/rofi-tab-switcher: A rofi-based tab switcher for Firefox.

GitHub - cubimon/rofi-tabs: Select or rename firefox/tmux tabs from rofi

5 个赞

今天试了试把 firefox 加进来,效果如下:

bufferswitch

这个我还没来得及推上去。

顺便改了改 firefox 的默认快捷键, Ctrl-n 再也不会打开一个新窗口了。

链接如下: https://wangz.me/2020-07-28-firefox.html

2 个赞

这个脚本真是让 rofi 的体验好上很多,感谢。

请问能推一下 Firefox 的脚本吗。 :rofl:

可能还要在等一下,我想再整整 firefox 再推出来。

1 个赞