(发布)Oil.nvim 的简单仿品 Oil.el:直接输入文件名,快速建立多个文件

搞了一个 oil.nvim 的仿品 oil.el,直接输入文件名,快速建立多个文件

2 个赞

Indeed you can do this:

M-x embark-shell-command-on-buffer RET <select buffer ...> xargs -l touch
1 个赞

没看到 embark-shell-command-on-buffer 这个命令

如果只是当前buffer的话可以采用

C-x h M-| xargs -l touch

如果希望对选中区域先进行一些编辑,然后把编辑后的结果作为参数调用emacs命令,可以使用 oboe.el 提供的oboe-blow函数。

1 个赞

你不觉得,你这一套下来,流程比我这个要复杂多了

只是一些不用写代码的尝试而已。

我提到这些主要是因为注意到emacs里似乎没有提供功能上类似xargs的命令,用一个命令处理一个buffer中所有的行(或者其它同类型的序列对象)。如果有这样一个函数,那么只要对所有的行调用dired-create-empty-file,不需要专门实现一个插件。

embark框架可以做这件事,但是embark要用户自己实现并绑定embark命令,不能直接调用任意命令(存疑)。

我看到 reddit 上有用户提到这个 M-! touch LICENSE,oil.el 的操作方法。也是另外一个不用写代码的方式。

我觉得受到了一些启发:

There are two modes to design the interaction mode of structural editing in Emacs, one is direct, encapsule an editing function and assign it on a key. Another is indirect, you just create a selection function, which pass the selected region to structural editing handlers, just like proxying objects. The later one will be considerable when you can not spare one single keyhit to an editing function. Generally a proxy doesn’t have to be a object-selection function, it can also be high-level abstracts, like filters, parsers, mathematical categories, etc.

  • In direct mode, key sequences are logical categories of functions.
  • In proxy mode, key sequences don’t only play a role as logic categories, but also work as a semantic of operations.

我有点没明白它说的 proxy-mode 的意思

这里的proxy可以理解为被操作对象集合上定义的一个好的拓扑,或者说一个monad类型。

举个例子,比如,我想要实现一个叫做kill-thing的函数集,它可以kill用thing-at-point识别到某种thing,例如word, symbol, line, paragraph等等。如果按照direct的逻辑做的话,那我们就得实现一个函数集,对应kill-wordkill-symbolkill-line等等,这些函数集可能汇集在一个keymap里面,然后使用某个前缀按键触发。前缀给Emacs传递的信息是“我们的下一个键可能是……”,也就是说它只起到句法上前缀的作用,并不具有额外的结构上的意义。这中间不管发生了什么(比如,我们突然改了主意,进入递归编辑移动了point的位置,我不确定能不能这么做),都不会直接影响你按的下一个键对应的函数运行的正确性。

如果按照proxy的逻辑做,那我们或许能找到一个合适的proxy set,例如我们可以实现函数集mark-wordmark-symbolmark-line等等。我们可以先调用mark-xxx标记选取的东西,然后直接调用kill-region即可。此处的mark-函数集就是一个proxy,在第一次击键之后,我们给Emacs传递的信息不仅是“我们的下一个键可能是……”,还包括了当前的选区,因此这次击键传递了一个上下文参数。如果我们又去中途移动point,那么即使下一个键(C-k)的触发完全正确,结果也是错误的。如果你想修正这个错误,就得重新设置选区,而不仅仅是移动point。

如果我们想把第二种做法封装成一个函数,我们只需要对kill-region这一个函数做一个lift操作,把它的输入接到一个wrapper上,比如我们可能做一个transient菜单让用户选择(不能用keymap,因为Emacs的keyseq识别过程不允许介入副作用的,需要依赖transient这种额外支持)使用哪个mark-函数标记范围,然后直接调用kill-region就可以了。

3 个赞