求助:实现Helm风格Org模式缓冲区选择界面失败
问题分析与修复
你的代码核心问题是**cl-remove-if-not的参数位置错误**,导致无法正确筛选出Org模式的缓冲区。具体来说,你把(buffer-list)放在了lambda表达式的闭合括号外面,违反了cl-remove-if-not的调用语法(正确语法为(cl-remove-if-not 筛选函数 目标序列))。
修正后的代码
(defun helm-org-buffers () "Use Helm to select an Org mode buffer." (interactive) (let ((org-buffers (cl-remove-if-not (lambda (buffer) (with-current-buffer buffer (eq major-mode 'org-mode))) (buffer-list)))) ; 将buffer-list移至此处,作为cl-remove-if-not的第二个参数 (helm :sources (helm-build-sync-source "Org Buffers" :candidates (mapcar #'buffer-name org-buffers) :action #'switch-to-buffer) :prompt "Select Org buffer: ")))
额外优化建议
如果想让代码更简洁可靠,可直接用缓冲区对象作为Helm候选(Helm会自动显示缓冲区名称),省去mapcar #'buffer-name的步骤,同时switch-to-buffer直接接收缓冲区对象也更稳妥:
(defun helm-org-buffers () "Use Helm to select an Org mode buffer." (interactive) (helm :sources (helm-build-sync-source "Org Buffers" :candidates (cl-remove-if-not (lambda (buf) (with-current-buffer buf (eq major-mode 'org-mode))) (buffer-list)) :action #'switch-to-buffer) :prompt "Select Org buffer: "))
内容的提问来源于stack exchange,提问作者Emmanuel Goldstein
相关产品推荐
相关产品推荐

