2016-03-02 2 views
1

Я пытаюсь написать очень простой основной режим emacs для редактирования исходных файлов ассемблера (для конкретного микроконтроллера). Я использовал https://www.emacswiki.org/emacs-test/ModeTutorial в качестве отправной точки. Он работает, но я хотел бы изменить две вещи, но не могу найти решение.определение основного режима emacs

И да, я заинтересован в более глубоком понимании eLisp со временем, но я также пытаюсь быстро взломать мой путь к определению рабочего режима, потому что мне это нужно сейчас (не понимая тонкости - я знаю, RTFM ...).

Во всяком случае, я надеюсь получить ответ на два вопроса:

1) В то время как подсветка синтаксиса работает, я не получаю, чтобы быть нечувствительным к регистру. Я попытался добавить (setq font-lock-keywords-case-fold-search t) к функции ниже, но она, похоже, не имеет желаемого эффекта.

(defun xasm-mode() 
    (interactive) 
    (kill-all-local-variables) 
    (use-local-map xasm-mode-map)   
    (set-syntax-table xasm-mode-syntax-table) 
    ;; set up font-lock 
    (set (make-local-variable 'font-lock-defaults) '(xasm-font-lock-keywords)) 
    (setq font-lock-keywords-case-fold-search t) 
    (setq major-mode 'xasm-mode) 
    (setq mode-name "XASM")  
    (run-hooks 'xasm-mode-hook)) 

2) Второй вопрос наверняка демонстрирует свое невежество ... В принципе, в выражении приведенной ниже структуры, я хотел бы заменить «регулярное выражение» буквального (который работает) на значение, которое в переменном (здесь: х, с й бытием (правильно), вычисленным с регулярным выражением-OPT) ... Но я не знаю, как вставить значениех здесь :-(

(setq x 'xyz) 
(defconst v2 
    (list 
    '("regexp" . foo) 
)) 

Спасибо для ваших советов.

+1

Независимо от ваших реальных вопросов, вы изучили 'define-generic-mode'? https://www.gnu.org/software/emacs/manual/html_node/elisp/Generic-Modes.html – Thomas

+1

Для вашего второго вопроса, что вы ищете, это «backquote», описанный в [этом ответе] (http : //stackoverflow.com/a/11875822/113848), а также [в справочнике elisp] (https://www.gnu.org/software/emacs/manual/html_node/elisp/Backquote.html). – legoscia

ответ

2

Проверьте документацию с C-h v font-lock-defaults RET:

... Значения по умолчанию должны иметь вид:

(KEYWORDS [KEYWORDS-ONLY [CASE-FOLD [СИНТАКСИС-ALIST ...]]]) ...

Который говорит вам, что вы можете установить поведение «случай-складка» прямо:

(set (make-local-variable 'font-lock-defaults) 
    '(xasm-font-lock-keywords nil t)) 

Кроме того, сделайте себе одолжение и использовать определить производный-режим (и обновления в зависимости от того DOc вы обнаружили, что указал вам defun+interactive+setqmode-name+... так относится к define-derived-mode а) ,

+0

Спасибо, я переключился на производный режим, и он работает – user52366

3

В то время как подсветка синтаксиса, я не понимаю, что это без учета регистра. Я попытался добавить (setq font-lock-keywords-case-fold-search t) к функции ниже, но это , похоже, не имеет желаемого эффекта.

Возможно, это потому, что вы используете defun вместо того, чтобы использовать более современный-define-derived-mode:

(define-derived-mode xasm-mode prog-mode "XASM" 
    ;; set up font-lock 
    (set (make-local-variable 'font-lock-defaults) '(xasm-font-lock-keywords)) 
    (set (make-local-variable 'font-lock-keywords-case-fold-search) t)) 

Если это не сработает, я думаю, вы просто должны сделать его нечувствительным вручную, [a-z] ->[a-zA-Z] и т.д.

Второй вопрос наверняка показывает мое невежество ... в принципе, в выражении приведенной ниже структуре, я бы Ли ke, чтобы заменить литерал «regexp» (который работает) на значение, которое находится в переменной (здесь: x, с x (правильно) вычислено regexp-opt) ... Но я не знаю, как для ввода значения x здесь :-(

Использовать оператор запятой как legoscia Указанный. В вашем случае, это будет выглядеть следующим образом:

(defconst v2 
    `(
    ("regexp" . ,foo) 
    )) 

Для оценки foo внутри кавычки, мы ставим запятую перед ним, ,foo.

+0

Я перешел в производный режим, и сработало нечувствительное к регистру совпадение. Я начал с 'defun' из-за этого (https://www.emacswiki.org/emacs/ModeTutorial), что, вероятно, не было лучшей идеей. – user52366