Здесь моя проблема: Я использую Emacs и получаю много буферов, которые все время бесполезны, например * Messages * или * Completions *.
Я хочу привязать \C-y, чтобы закрыть все буферы, которые начинаются с *, за исключением буферов * shell * (и * shell * <k> ).
Чтобы сделать это, я хотел бы добавить Emacs- Lisp в файл .emacs:
(defun string-prefix s1 s2
(if (> (string-length s1) (string-length s2)) nil
(string=? s1 (substring s2 0 (string-length s1))) ))
(defun curry2
(lambda (f)
(lambda (x)
(lambda (y)
(f x y) ))))
(defun filter
(lambda (f l)
(if (null? l) '()
(let ((rest (cdr l)))
(if (f (car l)) (cons (car l) rest)
rest) ))))
(defun kill-useless (arg)
(interactive "p")
(map 'kill-buffer
(filter
(not ((curry2 string-prefix) "*shell*"))
(list-buffers)
) ))
(global-set-key "\C-y" 'kill-useless)
Я уже тестировал string-prefix
и curry2
, используя Scheme и filter
, кажется довольно простым.
К сожалению, я просто не могу нормально работать kill-useless
.
В нем говорится filter: Invalid function: (curry2 string-prefix)
.
Теперь, я как бы отсасываю Emacs- Lisp, я действительно не использую никаких Lisp кроме Схемы, а в Scheme (MIT) это работает:
(filter ((curry2 string-prefix?) "*shell") '("*shell*" "*sh22" "eel"))
;Value 5: ("*shell*")
Мне бы хотелось:
- способ исправления кода
- предложения о том, как это сделать по-другому.
Спасибо!