Emacs Major-Mode для Mathematica на основе CC-Mode -- emacs поле с участием wolfram-mathematica поле с участием elisp пол Связанный проблема

Emacs major-mode for Mathematica based on cc-mode


5
vote

проблема

русский

**** Решение для выдачи 1 от Стефана - см. Ответ ниже ****

I Отметить <Код> в качестве символа Escape в таблице синтаксиса, но затем переопределите это обозначение элементов синтаксиса Mathematica, таких как <код> [Infinity] . Вот мой <код> syntax-propertize-function :

 <код> (defconst math-syntax-propertize-function   (syntax-propertize-rules    ("\\\[\([A-Z][A-Za-z]*\)]" (0 "_"))))   

Я ссылаюсь на это из <код> (defun math-node() функции, как так:

 <код>   (set (make-local-variable 'syntax-propertize-function)        math-syntax-propertize-function)   

В моей первой попытке я не использовал функцию make-local-variable , и я был удивлен, когда мой ELISP буфер подчеркивает вышел.

**** Конечное решение для выпуска 1 ****

Я реализую основной режим в Emacs, полученный из CC-Mode для редактирования файлов Mathematica. Цель представляет собой синтаксис выделения и отступа. Я оставлю взаимодействие с ядром Mathematica на потом.

У меня есть основные функциональные возможности, но есть пара прилипающих точек, которые дают мне неприятности.

**** Выпуск 1 ** - <код> символ используется в качестве символа Escape и для префикса мультирамных, кронкетных ключевых слов. **

Как и многие языки, Mathematica использует <код> $query = "SELECT DISTINCT ID, post_title, location FROM $wpdb->posts WHERE post_type='listing' "; $value = $wpdb->get_results($query); print_r($value); 0 символ для сбережений <код> $query = "SELECT DISTINCT ID, post_title, location FROM $wpdb->posts WHERE post_type='listing' "; $value = $wpdb->get_results($query); print_r($value); 1 и другие <код> $query = "SELECT DISTINCT ID, post_title, location FROM $wpdb->posts WHERE post_type='listing' "; $value = $wpdb->get_results($query); print_r($value); 2 символов - строки.

Математика имеет то, что называется в Mathematica, говорить синтаксические символы, такие как <код> $query = "SELECT DISTINCT ID, post_title, location FROM $wpdb->posts WHERE post_type='listing' "; $value = $wpdb->get_results($query); print_r($value); 3 , <код> $query = "SELECT DISTINCT ID, post_title, location FROM $wpdb->posts WHERE post_type='listing' "; $value = $wpdb->get_results($query); print_r($value); 4 , <код> $query = "SELECT DISTINCT ID, post_title, location FROM $wpdb->posts WHERE post_type='listing' "; $value = $wpdb->get_results($query); print_r($value); 5 , которые представляют операторы и константы математики.

И, Mathematica делает тяжелое использование <код> $query = "SELECT DISTINCT ID, post_title, location FROM $wpdb->posts WHERE post_type='listing' "; $value = $wpdb->get_results($query); print_r($value); 6 и <код> $query = "SELECT DISTINCT ID, post_title, location FROM $wpdb->posts WHERE post_type='listing' "; $value = $wpdb->get_results($query); print_r($value); 7 вместо <кода> $query = "SELECT DISTINCT ID, post_title, location FROM $wpdb->posts WHERE post_type='listing' "; $value = $wpdb->get_results($query); print_r($value); 8 и <код> $query = "SELECT DISTINCT ID, post_title, location FROM $wpdb->posts WHERE post_type='listing' "; $value = $wpdb->get_results($query); print_r($value); 9 для определений функций и Вызывы и т. Д.

Итак, если я отметку <код> как escape символ в синтаксическом таблице, то мои кронштейны становятся неправильно сочетаны в любом месте, что я использую символ синтаксиса. Например,

 <Код> 1  

Конечно, CC-Mode намерен игнорировать <код> 2 сразу после <код> 3 . Учитывая функциональный характер математики, режим практически бесполезно, если он не может соответствовать скобкам. Думайте Lisp без сопоставления парна.

Если я не ставлю <код> 4 в таблицу синтаксиса в качестве escape символ, то как я могу обрабатывать escape последовательностей в комментариях и строках?

Было бы здорово, если бы я мог положить время, элемент, бесконечность и т. д. в списке ключевых слов и иметь все правильно.

**** Выпуск 2 ** - синтаксис Mathematica достаточно отличается от C, C ++, Java, OBJC и т. Д., Встроенный синтаксический анализ CC-Mode не всегда дает желаемый результат. **

.

Рассмотрим следующий код код:

 <код> 5  

Это форматы красиво, потому что выражения распознаются как список аргументов.

Однако, если список передан как аргумент,

 <код> 6  

Результат не является красивой, потому что выражения считаются продолжениями одного оператора в <Код> 7 и <код> 8 . К сожалению, простой хак настройки <код> 9 <код> [Infinity]0 разбивает фактические продолжения, как,

 <код> [Infinity]1  

Что вы хотите отступить.

Вопрос в том, что в Mathematica <код> [Infinity]2 и <код> [Infinity]3 списки разграничения и не блокировки кода.

Вот текущий файл ELISP, который я у меня ing:

 <код> [Infinity]4  

и скриншот некоторых отформатированный код.

Английский оригинал

****Solution to Issue 1 by Stephan - see Answer below****

I mark as an escape character in the syntax table, but then override that designation for the Mathematica syntax elements like [Infinity]. Here is my syntax-propertize-function:

(defconst math-syntax-propertize-function   (syntax-propertize-rules    ("\\\[\([A-Z][A-Za-z]*\)]" (0 "_")))) 

I referenced it from the (defun math-node() function like so:

  (set (make-local-variable 'syntax-propertize-function)        math-syntax-propertize-function) 

In my first attempt, I didn't use the make-local-variable function and I was surprised when my elisp buffer highlighting went awry.

****End Solution to Issue 1****

I am implementing a major-mode in Emacs derived from cc-mode for editing Mathematica files. The goal is syntax highlighting and indentation. I will leave interfacing with the Mathematica kernel for later.

I have the basic functionality working, but there are a couple of sticking points that are giving me trouble.

****Issue 1** - The character is used as an escape character and to prefix multi-character, bracketed keywords. **

Like many languages, Mathematica uses the character to escape " and other characters is strings.

Mathematic has what are called in Mathematica speak Syntax Characters like [Times], [Element], [Infinity], etc. that represent mathematica operators and constants.

And, Mathematica makes heavy use of [ and ] instead of ( and ) for function definitions and calls, etc.

So, if I mark as an escape character in the syntax-table, then my brackets become mis-matched anywhere I use a Syntax Character. E.g.,

    If[x < [Pi], True, False] 

Of course, cc-mode is intent on ignoring the [ right after the . Given the functional nature of Mathematica, the mode is almost useless if it cannot match brackets. Think lisp without paren matching.

If I don't put in the syntax-table as an escape character, then how do I handle escape sequences in comments and strings?

It would be great if I could put Times, Element, Infinity, etc in a keyword list and have everything work correctly.

****Issue 2** - The syntax of Mathematica is different enough from C,C++,Java,ObjC, etc. that cc-mode's builtin syntactical analysis doesn't always produce the desired result.**

Consider the following code block:

    FooBar[expression1,            expression2,            expression3]; 

This formats beautifully because the expressions are recognized as an argument list.

However, if a list is passed as an argument,

    FooBar[{expression1,                 expression2,                 expression3}]; 

the result is not pretty because the expressions are considered continuations of a single statement within the { and }. Unfortunately, the simple hack of setting c-continuation-offset to 0 breaks actual continuations like,

    addMe[x_Real, y_Real] :=         Plus[x, y]; 

which you want to be indented.

The issue is that in Mathematica { and } delineate lists and not code blocks.

Here is the current elisp file I am using:

(require 'cc-mode)  ;; There are required at compile time to get the sources for the                                 ;; language constants.                                                                           (eval-when-compile   (require 'cc-langs)   (require 'cc-fonts))  ;; Add math mode the the language constant system. This needs to be                              ;; done at compile time because that is when the language constants                              ;; are evaluated.                                                                                (eval-and-compile   (c-add-language 'math-mode 'c-mode))   ;; Function names                                                                                (c-lang-defconst c-cpp-matchers   math (append         (c-lang-const c-cpp-matchers c)         ;; Abc[                                                                                          '(("\<\([A-Z][A-Za-z0-9]*\)\>\[" 1 font-lock-type-face))         ;; abc[                                                                                          '(("\<\([A-Za-z][A-Za-z0-9]*\)\>\[" 1 font-lock-function-name-face))         ;; Abc                                                                                           '(("\<\([A-Z][A-Za-z0-9]*\)\>" 1 font-lock-keyword-face))         ;; abc_                                                                                          '(("\<\([a-z][A-Za-z0-9]*[_]\)\>" 1 font-lock-variable-name-face))         ))  ;; font-lock-comment-face                                                                        ;; font-lock-doc-face                                                                            ;; font-lock-string-face                                                                         ;; font-lock-keyword-fact                                                                        ;; font-lock-function-name-face                                                                  ;; font-lock-constant-face                                                                       ;; font-lock-type-face                                                                           ;; font-lock-builtin-face                                                                        ;; font-lock-reference-face                                                                      ;; font-lock-warning-face                                                                          ;; There is no line comment character.                                                           (c-lang-defconst c-line-comment-starter   math nil)  ;; The block comment starter is (*.                                                              (c-lang-defconst c-block-comment-starter   math "(*")  ;; The block comment ender is *).                                                                (c-lang-defconst c-block-comment-ender   math "*)")  ;; The assignment operators.                                                                     (c-lang-defconst c-assignment-operators   math '("=" ":=" "+=" "-=" "*=" "/=" "->" ":>"))  ;; The operators.                                                                                (c-lang-defconst c-operators   math `(          ;; Unary.                                                                                        (prefix "+" "-" "!")          ;; Multiplicative.                                                                               (left-assoc "*" "/")          ;; Additive.                                                                                     (left-assoc "+" "-")          ;; Relational.                                                                                   (left-assoc "<" ">" "<=" ">=")          ;; Equality.                                                                                     (left-assoc "==" "=!=")            ;; Assignment.                                                                                   (right-assoc ,@(c-lang-const c-assignment-operators))          ;; Sequence.                                                                                     (left-assoc ",")))   ;; Syntax modifications necessary to recognize keywords with                                     ;; punctuation characters.                                                                       ;; (c-lang-defconst c-identifier-syntax-modifications                                            ;;   math (append '((?\ . "w"))                                                                 ;;             (c-lang-const c-identifier-syntax-modifications)))                                 ;; Constants.                                                                                    (c-lang-defconst c-constant-kwds   math '( "False" "True" )) ;; "\[Infinity]" "\[Times]" "\[Divide]" "\[Sqrt]" "\[Element]" ))                                                                                                (defcustom math-font-lock-extra-types nil   "Extra types to recognize in math mode.")  (defconst math-font-lock-keywords-1 (c-lang-const c-matchers-1 math)   "Minimal highlighting for math mode.")  (defconst math-font-lock-keywords-2 (c-lang-const c-matchers-2 math)   "Fast normal highlighting for math mode.")  (defconst math-font-lock-keywords-3 (c-lang-const c-matchers-3 math)   "Accurate normal highlighting for math mode.")  (defvar math-font-lock-keywords math-font-lock-keywords-3   "Default expressions to highlight in math mode.")  (defvar math-mode-syntax-table nil   "Syntax table used in math mode.")  (message "Setting math-mode-syntax-table to nil to force re-initialization") (setq math-mode-syntax-table nil)  ;; If a syntax table has not yet been set, allocate a new syntax table                           ;; and setup the entries.                                                                        (unless math-mode-syntax-table   (setq math-mode-syntax-table         (funcall (c-lang-const c-make-mode-syntax-table math)))    (message "Modifying the math-mode-syntax-table")    ;; character (                                                                                   ;; ( - open paren class                                                                          ;; ) - matching paren character                                                                  ;; 1 - 1st character of comment delimitter (**)                                                  ;; n - nested comments allowed                                                                   (modify-syntax-entry ?( "()1n" math-mode-syntax-table)    ;; character )                                                                                   ;; ) - close parent class                                                                        ;; ( - matching paren character                                                                  ;; 4 - 4th character of comment delimitter (**)                                                  ;; n - nested comments allowed                                                                   (modify-syntax-entry ?) ")(4n" math-mode-syntax-table)    ;; character *                                                                                   ;; . - punctuation class                                                                         ;; 2 - 2nd character of comment delimitter (**)       ;; 3 - 3rd character of comment delimitter (**)                                                  (modify-syntax-entry ?* ". 23n" math-mode-syntax-table)    ;; character [                                                                                   ;; ( - open paren class                                                                          ;; ] - matching paren character                                                                  (modify-syntax-entry ?[ "(]" math-mode-syntax-table)    ;; character ]                                                                                   ;; ) - close paren class                                                                         ;; [ - mathcing paren character                                                                  (modify-syntax-entry ?] ")[" math-mode-syntax-table)    ;; character {                                                                                   ;; ( - open paren class                                                                          ;; } - matching paren character                                                                  (modify-syntax-entry ?{ "(}" math-mode-syntax-table)    ;; character }                                                                                   ;; ) - close paren class                                                                         ;; { - matching paren character                                                                  (modify-syntax-entry ?} "){" math-mode-syntax-table)    ;; The following characters are punctuation (i.e. they cannot appear                             ;; in identifiers).                                                                              ;;                                                                                               ;; / ' % & + - ^ < > = |                                                                         (modify-syntax-entry ?/ "." math-mode-syntax-table)   (modify-syntax-entry ?' "." math-mode-syntax-table)   (modify-syntax-entry ?% "." math-mode-syntax-table)   (modify-syntax-entry ?& "." math-mode-syntax-table)   (modify-syntax-entry ?+ "." math-mode-syntax-table)   (modify-syntax-entry ?- "." math-mode-syntax-table)   (modify-syntax-entry ?^ "." math-mode-syntax-table)   (modify-syntax-entry ?< "." math-mode-syntax-table)   (modify-syntax-entry ?= "." math-mode-syntax-table)   (modify-syntax-entry ?> "." math-mode-syntax-table)   (modify-syntax-entry ?| "." math-mode-syntax-table)    ;; character $                                                                                   ;; _ - word class (since $ is allowed in identifier names)                                       (modify-syntax-entry ?$ "_" math-mode-syntax-table)    ;; character                                                                                    ;; . - punctuation class (for now treat  as punctuation                                         ;;     until we can fix the [word] issue).                                                      (modify-syntax-entry ?\ "." math-mode-syntax-table)    ) ;; end of math-mode-syntax-table adjustments                                                  ;;                                                                                               ;;                                                                                               (defvar math-mode-abbrev-table nil   "Abbrevation table used in math mode buffers.")  (defvar math-mode-map (let ((map (c-make-inherited-keymap)))                         map)   "Keymap used in math mode buffers.")  ;; math-mode                                                                                     ;;                                                                                               (defun math-mode ()   "Major mode for editing Mathematica code."    (interactive)   (kill-all-local-variables)    (c-initialize-cc-mode t)    (set-syntax-table math-mode-syntax-table)    (setq major-mode 'math-mode         mode-name "Math"         local-abbrev-table math-mode-abbrev-table         abbrev-mode t)    (use-local-map math-mode-map)    (c-init-language-vars math-mode)   (c-common-init 'math-mode)    (run-hooks 'c-mode-common-hook)   (run-hooks 'math-mode-hook)   (c-update-modeline))  (provide 'math-mode)                    

And a screenshot of some formatted code.

</div
        
       
       

Список ответов

5
 
vote
vote
Лучший ответ
 
<Р> В то время как CC-режим предназначен для адаптации к различным языкам, я не уверен, что он будет служить вам хорошо для Mathematica, потому что синтаксис слишком далек от того, хорошо поддерживается куб.см режим. Я хотел бы предложить, чтобы попытаться SMIE (Углубление двигатель, который появился в Emacs-23.4 и который изначально был построен для SML, но в настоящее время используется для различных языков). Так же, как CC-режим, SMIE не является идеальным для всех языков, либо, но я не удивлюсь, если он работает лучше, чем CC-режим в вашем случае. <Р> Для выдачи обратной косых черт, лучше всего использовать <код> NSURLRequest *request = [[NSURLRequest alloc] initWithURL:[NSURL URLWithString:@"YOUR_URL"]]; // Check the cache. NSCachedURLResponse *cachedResponse = [[NSURLCache sharedURLCache] cachedResponseForRequest:request]; NSLog(cachedResponse ? @"Cached response found!" : @"No cached response found."); //Load cache [NSURLConnection sendSynchronousRequest:request returningResponse:NULL error:NULL]; 8 , чтобы изменить вытекающую природу конкретного слэша (либо набор как побег в синтаксисе-таблице, а затем отметьте о [ Foo] как не избежать, или оставить как не избежать в синтаксической-таблицы, а затем отметьте те о »и \, как побег).
 

While cc-mode is designed to be adaptable to various languages, I'm not sure it will serve you well for Mathematica, because the syntax is too far from the one well-supported by cc-mode. I would suggest to try SMIE (an indentation engine that appeared in Emacs-23.4 and that was originally built for SML but is currently used for a variety of languages). Just like cc-mode, SMIE is not ideal for all languages either, but I wouldn't be surprised if it works better than cc-mode in your case.

For the backslash issue, your best bet is to use syntax-propertize-function to change the escaping-nature of specific backslashes (either set as escaping in the syntax-table and then mark the of [foo] as non-escaping, or leave the as non-escaping in the syntax-table and then mark those of " and \ as escaping).

</div
 
 
         
         

Связанный проблема

0  Почему Джулия не писала и нарисовать работу внутри Emacs?  ( Why doesnt julias gadfly and draw work inside of emacs ) 
Почему «ничья» не работает при запуске внутри ESS + Emacs (но работает нормально, используя интерпретатор обычной «JULIA MyFile.jl»)? <код> using Gadfly dra...

4  Окрашивайте фрагменты текста в Emacs  ( Colorize snippets of text in emacs ) 
Предположим, у меня есть несколько слов, которые я хотел бы выделить, поэтому я хочу изменить цвет этих нескольких слов только на, скажем, зеленый. Есть ли ...

25  Как я могу разумно пережить Clojure в Emacs?  ( How do i intelligently re indent clojure in emacs ) 
Я новичок в Clojure и новый для Emacs. Есть ли у эмблей, чтобы разумно повторно отступить за весь файл? Если нет, есть, по крайней мере, способ отступовать ...

94  Автозаполнение Bash в Emacs Shell-Mode  ( Bash autocompletion in emacs shell mode ) 
в терминале GNOME, Bash делает Smart Auto-завершение. Например <код> apt-get in<TAB> становится <код> apt-get install в режиме Emacs Shell-mode, э...

4  Какой самый эффективный рабочий процесс Emacs для Compilation и интерактивных циклов выполнения (C ++ / Makefile)  ( Whats the most efficient emacs workflow for compilation and interactive executi ) 
Что является предпочтительной практикой для цикла компиляционного запуска в Emacs? Ранее я использовал m-x compile (сопоставлен на f12 ) с помощью команд...

0  Xemacs Открытый прямоугольник без вкладок  ( Xemacs open rectangle without tabs ) 
Я хотел бы использовать команду открытого прямоугольника (C-X R o) с помощью его только добавления пробелов. Кажется, что когда-то превысим определенное кол...

3  Поддержка изображения Emacs  ( Emacs image support ) 
У меня есть интерес к использованию поддержки изображения в Emacs, как описано здесь http://www.gnu.org/software/emacs/eleisp/html_node/images.html У меня...

8  Emacs: переопределение команды в Haskell-Mode (Haskell-Mode-Took)  ( Emacs redefining command in haskell mode haskell mode hook ) 
В Emacs в Haskell-режиме я хотел изменить команду . "C-X C-S" к . «C-X C-S», а затем «C-C C-L». Принимая кий от: haskell.org: emacs / keybindings и...

0  Как сделать Xcope в Emacs не удалить мой файл cscope.out и регенерация базы данных  ( How to make xcope in emacs not remove my cscope out file and regenerate the data ) 
Я запускаю Emacs 24.3 на Ubuntu. У меня это в моем файле .emacs: (Требовать xcscope) (Cscope-setup) (SetQ Cscope-do-not-not-update-database t) У...

13  Советы и трюки для Viper-режима Emacs и The Likes [закрыто]  ( Tips and tricks for emacs viper mode and the likes ) 
<в сторону CLASS = "S-NEWACTS S-WELTIVE__info JS-Post-New Imide MB16« Роль = «Статус»> закрыт . Этот вопрос находится на основе мнения . В настоящее вре...

10  Остановить блок-режим, работающий на запуске EMACS  ( Stop tramp mode running on emacs startup ) 
Я пробовал Брод-режим , но теперь я не могу избавиться от этого .. Всякий раз, когда я начинаю Emacs, он проводит около 20 секунд, проходящих через различные...

1  EShell - где находится каталог по умолчанию и путь?  ( Eshell where is the default directory and the path defined ) 
Две маленькие вопросы в отношении конфигурации Eshell. Я посмотрел на параметры настройки и даже исходный код, но безрезультатно. Может быть, я должен был взя...

3  Ошибки в Emacs Начало REPL  ( Errors in emacs starting repl ) 
Я использую Emacs для разработки Clojure. Когда я начал заменять Cider-jack-in, я получил некоторую ошибку, но я могу видеть только несколько последних строк ...

0  Eshell и цветной выход  ( Eshell and color output ) 
Я сталкиваюсь с странным поведением относительно реализации цвета для выходов оболочки при использовании ESHELL. Это содержание моих .emacs: <код> (require ...

0  Multi Page HTML-макет, который работает на Chrome 58  ( Multi page html layout that works on chrome 58 ) 
Я пытаюсь создать HTML-страницу, которую можно прочитать на экране, а также напечатано на бумаге. Расположение страницы немного расширена и использует E.g. <К...




© 2021 www.qaru.top All Rights Reserved. Q&A House все права защищены


Licensed under cc by-sa 3.0 with attribution required.