Emacs Helm: 使用关键字搜索、获取、执行任何东西
Helm 是一个emacs的软件包,定义了一个通用框架,交互式地、动态缩减式地使用关键字选择、获取、执行任何东西。比如:
- 执行emacs 命令
- 打开文件
- 查看man文档
- 执行grep操作
- 执行apt命令
- 相看imenu函数定义
- 切换buffer
Helm软件包本身包含两部分,框架本身及应用。以上列表均为应用。基于框架,可以轻松创建新的应用。
基本原理
Helm的三个重要概念:candidate, narrowing, action.
Candidate
Candidate即候选值,是一个列表,保存所有可供选择的条目。对于打开文件的命令,candidate是所有的文件名称的列表。
Narrowing
Helm命令启动后,用户未输入任何关键字前,会将candidate中的所有条目显示出来,每行显示一个项,可通过'C-n', 'C-p'上下移动光标选择当前条目。
如果candidate的数目较少,此时没必要输入关键字,通过上下移动光标选择就行了;但如果candidate数目较多,目标条目没有被显示在第一页,可输入关键字,对candidate的条目进行筛选,只有匹配到关键字的条目才会被显示出来。这就是narrowing。
值得一提的是,这个过程是动态的,即每输入一个字符,candidate的条目都会被重新筛选。有时只输入了一个字符,目标条目已经显示在第一页,则可停止输入,通过移动光标选择当前条目;有时输入了一个关键字,目标条目仍然没有出现,则可按空格,继续输入另一个关键字,进行更精确的筛选,直到目标条目出现为止。
输入的关键字越多,candidate的数目会越少,目标条目出现在第一页第一个条目位置的机率就越大,进而选择也就越方便。
Action
当一个candidate被选中后,按下Enter后,就会有一个action被执行。对于打开文件,其action对应到emacs命令就是'find-file'。可以为一个条目定义多个action,如对于文件条目action可以为打开文件、重命令文件、删除文件等。 通过TAB键从多个action中选择,如果直接按Enter会执行第一个action.
定义一个新的helm应用
基本例子
要定义一个新的helm命令,只需定义一个变量指定candidate及对应的action,然后将其作为参数传给helm就可以了,以下为一个例子。
(setq some-helm-source
'((name . "HELM at the Emacs")
(candidates . (1 2 3 4))
(action . (lambda (candidate)
(message-box "%s" candidate))))) (helm :sources '(some-helm-source))
其中定义candidate、action的变量叫做source, 是一个assoc list。candidates是一个list, action是一个函数,action函数被调用时,当前选择的candidate会被作为参数传入。
定义多个action
上面的例子中action的值为一个匿名函数,如果要定义多个action,则需要将action的值设置为一个list,list的元素是一个cons:(说明 . 函数)。如下所示,定义了两个action。
(setq some-helm-source
'((name . "HELM at the Emacs")
(candidates . (1 2 3 4))
(action .
(("Display" . (lambda (candidate)
(message-box "%s" candidate)))
("None" . identify)
))
))
(helm :sources '(some-helm-source))
将candidate的选择值与真实值分离
有时候需要通过不同的值选择candidate,此时可将candidates设置为cons (KEY . VALUE)的list。其中KEY将用于选择,VALUE将作为action函数的输入参数值。
(setq some-helm-source
'((name . "HELM at the Emacs")
(candidates . (("one" . 1) 2 ("three" . 3) 4))
(action .
(("Display" . (lambda (candidate)
(message-box "%s" candidate)))
("None" . identify)
))
))
(helm :sources '(some-helm-source))
动态candidate
有时candidates需要动态计算,或者静态计算量会很大,此时可将candidates设置为一个函数,这个函数将被用于计算所有candidates的值。
(defun random-candidates ()
"Return a list of 4 random numbers from 0 to 10"
(loop for i below 4 collect (random 10))) (setq some-helm-source
'((name . "HELM at the Emacs")
(candidates . random-candidates)
(action . (lambda (candidate)
(message "%s" candidate))))) (helm :sources '(some-helm-source))
添加一个persistent action
Persistent action是指执行action后,不退出helm,类似于预览功能,默认绑定在\C-z。通过'persistent-action'来指定,如果未指定,则与第一个action一样。
(setq some-helm-source
'((name . "HELM at the Emacs")
(candidates . (1 2 3 4))
(persistent-action . (lambda (candidate) (message "%s" candidate)))
(action . (lambda (candidate)
(message-box "%s" candidate))))) (helm :sources '(some-helm-source))
helm-org-headlines的定义
这个命令由helm默认提供,其定义如下,可为实现新的命令提供参考。
(setq helm-source-org-headline
`((name . "Org Headline")
(headline
,@(mapcar
(lambda (num)
(format "^\\*\\{%d\\} \\(.+?\\)\\([ \t]*:[a-zA-Z0-9_@:]+:\\)?[ \t]*$"
num))
(number-sequence 1 8)))
(condition . (eq major-mode 'org-mode))
(migemo)
(subexp . 1)
(persistent-action . (lambda (elm)
(helm-action-line-goto elm)
(org-cycle)))
(action-transformer
. (lambda (actions candidate)
'(("Go to line" . helm-action-line-goto)
("Refile to this headline" . helm-org-headline-refile)
("Insert link to this headline"
. helm-org-headline-insert-link-to-headline)))))) (defun helm-org-headlines ()
"Preconfigured helm to show org headlines."
(interactive)
(helm-other-buffer 'helm-source-org-headline "*org headlines*"))
Emacs Helm: 使用关键字搜索、获取、执行任何东西的更多相关文章
- XE3随笔18:实例 - 解析 Google 关键字搜索排名
同上例类似, 通过 'http://clients1.google.cn/complete/search?&q=' + "关键字" 可以获取 Google 的关键字搜索排名 ...
- Oracle中获取执行计划的几种方法分析
以下是对Oracle中获取执行计划的几种方法进行了详细的分析介绍,需要的朋友可以参考下 1. 预估执行计划 - Explain PlanExplain plan以SQL语句作为输入,得到这条S ...
- 【百度地图API】如何用圆形搜索获取中心点周围100米内全部关键点?如天安门附近所有的餐厅、加油站、宾馆、大厦等
原文:[百度地图API]如何用圆形搜索获取中心点周围100米内全部关键点?如天安门附近所有的餐厅.加油站.宾馆.大厦等 摘要: 在LBS上有这样一个常用的功能,查找附近所有的关键点(POI点,比如标志 ...
- oracle获取执行计划及优缺点 详解
一.获取执行计划的6种方法(详细步骤已经在每个例子的开头注释部分说明了):1. explain plan for获取: 2. set autotrace on : 3. statistics_leve ...
- 案例:使用dbms_xplan.display_cursor无法获取执行计划
案例:使用dbms_xplan.display_cursor无法获取执行计划 环境:RHEL 6.5 + Oracle 11.2.0.4 在一次测试中发现使用dbms_xplan.display_cu ...
- vue.js(11)--案例--关键字搜索列表
关键字搜索品牌案例 (1)页面布局 <div class="app"> <div class="panel panel-primary"> ...
- sql关键字的解释执行顺序
sql关键字的解释执行顺序 分类: 笔试面试总结2013-03-17 14:49 1622人阅读 评论(1) 收藏 举报 SQL关键字顺序 表里面的字段名什么符号都不加,值的话一律加上单引号 有一 ...
- kettle job如何利用java的反射机制获取执行的sql语句
kettle job中的JavaScript如何获取同一个job中SQL步骤的执行语句并让执行语句记录在日志中呢?首先写日志需要用到job中JavaScript写日志的方法,其次是利用java反射机制 ...
- 获取执行计划——EXPLAN PLAN
一般获取执行计划有四种途径:1.执行explain plan,查询结果输出表.2.查询动态性能视图,它显示缓存在库缓存中的执行计划(有时查不出结果是因为执行计划已经不在库缓存中).3.查询AWR或St ...
随机推荐
- python全栈开发从入门到放弃之面向对象的三大特性
组合 class Course: def __init__(self,name,period,price): self.name = name self.period = period self.pr ...
- Linux系统——引导过程与服务控制
一.Linux开机启动原理(十步) (1)开机自检BIOS 开机检测,主板检测 (2)MBR引导 硬盘512字节 (3)GRUB菜单 操作系统菜单 (4)加载内核(kernel) 启动操作系统核心,根 ...
- CodeChef - COUNTARI Arithmetic Progressions (FFT)
题意:求一个序列中,有多少三元组$(i,j,k)i<j<k $ 满足\(A_i + A_k = 2*A_i\) 构成等差数列. https://www.cnblogs.com/xiuwen ...
- 性能调优之MySQL篇一:MySQL性能计数器
计数器 计数器分析 Threads_connected 表示当前有多少个客户连接该mysql服务器,连接数是否过多,网络是否存在问题,它是动态变化的,当达到最大连接数时,数据库系统就不能提供更多的连接 ...
- 分布式存储系统 Ceph
你了解Ceph吗? Ceph是一种分布式存储系统,它可以将多台服务器组成一个超大集群,把这些机器中的磁盘资源整合到一块儿,形成一个大的资源池(PB级别),然后按需分配给应用使用. 那么你知道Ceph的 ...
- C语言基础温故
一.C语言中数组动态增长有哪些方法? 1.在原数组单元后面是没法再扩长的,因为后面的单元没法保证一定有.所以,数组原址动态增长肯定是不行的: 2.要么定义长一点的数组,要么自已把N个数组用链表串起来, ...
- docker基本用法和命令
1.安装docker 检查有没有curl which curl 如果没有用以下命令可安装:sudo apt-get install curl 通过官方提供的脚本安装最新docker curl -sSL ...
- Python3.x:遍历select下拉框获取value值
Python3.x:遍历select下拉框获取value值 Select提供了三种选择方法: # 通过选项的顺序,第一个为 0 select_by_index(index) # 通过value属性 s ...
- linux ftp 简单搭建
1.安装 yum install vsftpd 2.重启服务 /sbin/service vsftpd restartShutting down vsftpd: [ OK ]Starting vsft ...
- SVN主从高可用
https://blog.csdn.net/conwayli/article/details/80235738