2015-05-03 2 views
4

Я пытаюсь написать функцию elisp, которая отмечает функцию тестирования Python как зеленую или красную в зависимости от ввода. Аргументы довольно понятны. Навигационная часть работает, но часть put-text-property просто ничего не делает. Я пробовал eval, используя функции match-*, но я не могу понять возвращаемые значения. Они также, похоже, возвращают разные вещи, в зависимости от того, какой буфер i eval дюйма.match- * функции не ведут себя?

Основная цель этого вопроса взята из соответствующей части rainbow-mode.el, и там она работает безупречно.

Что случилось с звонком put-text-property? Связано ли, что я могу сделать, чтобы отладить это и узнать больше?

(defun snake-decorate-test (file class func status) 
    ; FIXME: Path hardcoded while developing. 
    (find-file (format "/home/thiderman/git/piper/%s" file)) 
    (beginning-of-buffer) 
    (re-search-forward (format "^class %s(" class) nil t) 
    (re-search-forward (format "^ def \\(%s\\)(" func) nil t) 
    (put-text-property 
    (match-beginning 1) (match-end 1) 
    'face `((:background ,(if (s-equals? status ".") 
          "#007200" "#720000")))))``` 

ответ

3
  1. Является ли этот буфер шрифта заблокирован? Если да, попробуйте использовать font-lock-face вместо face как свойство текста. Замок шрифта жадный - он стирает (переопределяет) любой face, подчеркивая, что вы добавляете.

  2. Вы пытались его отладить?

    a. Вы использовали C-u C-x = на персонаже, который, как вы ожидаете, должен быть выделен вашим кодом? Вы можете обнаружить, что на самом деле у него есть свойство face, которое вы пытались его выдать, но блокировка шрифта переопределяет это выделение (см. # 1).

    b. Используйте M-x debug-on-entry snake-decorate-test, а затем пройдите через функцию, используя d (иногда c, чтобы пропустить шаг). Используйте e в любое время, чтобы оценить любой sexp и посмотреть возвращаемое значение.

    c. Кроме того, добавьте вызовы к message, которые распечатывают промежуточное состояние, которое вы хотите проверить, чтобы вы могли видеть, что происходит. Например, покажите себе, что такое (match-beginning 1), чтобы убедиться, что это то, что вы ожидаете.

+0

Первое предложение сработало! Это потрясающе! Большое спасибо! : D Кроме того, спасибо за советы по отладке. Я довольно новичок в emacs, потратив большую часть десятилетия на vim и, наконец, перейдя. Elisp является удивительным, но трудно понять в таких ситуациях, как отладка. Ваши советы будут заветными! –

Смежные вопросы