Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Emacs Lisp:循环遍历函数_Emacs_Elisp_Elfeed - Fatal编程技术网

Emacs Lisp:循环遍历函数

Emacs Lisp:循环遍历函数,emacs,elisp,elfeed,Emacs,Elisp,Elfeed,我使用elfeed阅读emacs中的RSS,并希望创建一个在不同视图之间循环的函数:news、9gag、nonnews等 我试图通过快速研究来编写一些代码。当我按ctrl+向右箭头键时,它会在视图中循环。它工作得很好,但我认为它不是最方便的代码 我还希望在按ctrl+左箭头键时使其反向遍历视图 ;;cycle through views (setq a 0) (defun cycle-list-view () (interactive) (if (= a 3) (progn

我使用elfeed阅读emacs中的RSS,并希望创建一个在不同视图之间循环的函数:news、9gag、nonnews等

我试图通过快速研究来编写一些代码。当我按ctrl+向右箭头键时,它会在视图中循环。它工作得很好,但我认为它不是最方便的代码

我还希望在按ctrl+左箭头键时使其反向遍历视图

;;cycle through views
(setq a 0)
(defun cycle-list-view ()
  (interactive)
  (if (= a 3)
    (progn
    (elfeed-read-9gag)
    (setq a 4)
    ))
  (if (= a 2)
    (progn
    (elfeed-read-nonnews)
    (setq a 3)      
    ))
  (if (= a 1)
    (progn
    (elfeed-read-news)
    (setq a 2)      
    ))
  (if (= a 0)
    (progn
    (elfeed-read-defaultnews)
    (setq a 1)      
    ))
  (if (= a 4)
    (progn
    (setq a 0)
    ))
  )

 (global-set-key (kbd "<C-right>") 'cycle-list-view)
;;循环浏览视图
(setq a 0)
(取消循环列表视图()
(互动)
(如果(=a 3)
(项目
(elfeed-read-9gag)
(setq a 4)
))
(如果(=a 2)
(项目
(elfeed阅读非新闻)
(setq a 3)
))
(如果(=a 1)
(项目
(阅读新闻)
(setq a 2)
))
(如果(=a 0)
(项目
(elfeed阅读默认新闻)
(setq a 1)
))
(如果(=A4)
(项目
(setq a 0)
))
)
(全局设置键(kbd“”)循环列表视图)

您可能应该将数据放在一个单独的变量中,让您的代码简单地在该结构中维护一个全局索引变量。也许是这样的:

(defvar elfeed-views-list "List of views for `elfeed-cycle-views'.
Each member should be a cons of a label string and a function.
`elfeed-views--index' is a pointer into this structure."
  (("default" . #'elfeed-read-defaultnews)
   ("news" . #'elfeed-read-news)
   ("nonnews" . #'elfeed-read-nonnews)
   ("9gag" . #'elfeed-read-9gag)))
添加新视图不再需要更改代码——只需将另一项推到列表的末尾即可

现在,循环函数需要做的就是增加或减少此结构中的索引,并且如果超过末尾,请注意换行:

;; The double dash in the name suggests a private variable
(defvar elfeed-views--index "Index into `elfeed-views-list' for `elfeed-cycle-views'.
Use that function to manipulate the index." 0)

(defun elfeed-cycle-views (&optional skip)
  "Update `elfeed-views--index' by adding SKIP (default 1) and
wrapping if necessary, then call the function at this index in
`elfeed-views-list'."
  (interactive)
  (setq elfeed-views--index (+ elfeed-views-index (or skip 1)))
   ;; BUG: skips with an absolute value bigger than 1 don't wrap properly.
  (if (>= elfeed-views--index (length elfeed-views-list))
    (setq elfeed-views--index 0)
   (when (< elfeed-views--index 0)
     (setq elfeed-views--index (1- (length elfeed-views-list))) ))
  (eval (cdr (nth elfeed-views--index elfeed-views-list))) )
;;名称中的双破折号表示一个私有变量
(defvar elfeed views——将“索引”索引到“elfeed循环视图”的“elfeed视图列表”。
使用该函数操作索引。“0)
(取消elfeed循环视图(&可选跳过)
“通过添加跳过(默认值1)和
如果需要,请包装,然后在中调用此索引处的函数
`elfeed视图列表“.”
(互动)
(setq elfeed views—索引(+elfeed views索引(或跳过1)))
;错误:绝对值大于1的跳过未正确包装。
(如果(>=elfeed视图--索引(长度elfeed视图列表))
(setq elfeed视图--索引0)
(当(
现在可以通过传递-1作为SKIP参数来实现另一种循环方式

(未经测试,但至少这会给你一些想法。)


撇开文体不谈,您想了解
cond
而不是
if
语句的可怕顺序。显然,您必须强制对代码执行非直观的反向排序顺序,因为您不知道此控制结构。

看来tripleee的答案适用于您提出的一般问题(关于如何循环遍历函数列表)。对于特定的问题(通过Elfeed过滤器循环),我在不久前为自己编写了一个实现,并认为我会将其发布在这里,以防对您有用

如果没有看到您正在调用的代码(例如,
elfeed read news
),很难说这与您的实现有何不同,但我猜您不需要将所有视图都编写为单独的函数(除非您还希望命令直接跳到特定视图)

另外,我应该注意,我的实现使用了
dash
库,您可以在MELPA上找到它

(defvar my/elfeed收藏夹过滤器
“(@6个月前+未读”
“+待办事项”)
“Elfeed常用过滤器的列表。
使用“my/elfeed search next favorite filter”循环浏览
这些。”)
(取消我的/elfeed搜索下一个收藏夹筛选器(&可选详细信息)
“在“我的/elfeed收藏夹过滤器”中应用下一个过滤器。”。
如果当前搜索筛选器是
`my/elfeed favorite筛选器”,立即应用筛选器
在列表中的那个之后,如果
必要的。
如果当前搜索筛选器不是
`my/elfeed favorite filters',应用
列表
如果“my/elfeed favorite filters”为空,只需应用默认值
过滤器。
返回应用的筛选器。当以交互方式调用或可选
VERBOSE参数为非nil,还打印一条消息通知用户
新应用的过滤器的名称。”
(交互式“p”)
(让((新过滤器
(列出my/elfeed收藏夹过滤器中的my/Succession)
elfeed搜索筛选器:循环(0)
(elfeed搜索集过滤器新过滤器)
(详细时(消息“已应用筛选器:%s”elfeed搜索筛选器))
elfeed搜索过滤器)
(取消列表中的我的/继任者(列表和可选循环)
“返回ELT后面列表中的元素。
如果ELT不是列表的元素,则返回nil。
如果ELT是列表中的最后一个元素,如果
可选参数CYCLE为非nil;否则,返回nil。“
(需要“破折号”;用于“-drop while”
(let((发现(-drop while)(λ(x)(不等于x)))
(列表)
(续)
((找到空值)无)
((或(找到cdr)(空循环))(找到cadr))
(:else(车辆列表(())))
我不使用“循环后退”命令,但很容易在上面加上:

(取消我的/elfeed搜索上一个收藏夹筛选器(&可选详细)
“在“我的/elfeed收藏夹过滤器”中应用上一个过滤器。”。
作为“my/elfeed搜索下一个最喜爱的过滤器”,但向后循环。“
(交互式“p”)
(let((我的/elfeed收藏夹过滤器(反转我的/elfeed收藏夹过滤器)))
(my/elfeed搜索下一个收藏夹筛选器详细信息)))

请参见功能
设置瞬态映射
。您可以使用它来循环,而不需要全局变量。或者测试
最后一个命令
,如果是同一个命令,则循环执行。(事实上,在各种行为之间有几种循环方式。)