Как я получаю основное Приложение <-> интеграция Emacs?

template
struct square_bracket_invoke_t {
  F f;
  template
  auto operator[](T&& t)const
  -> typename std::result_of< F const&(T&&) >::type
  { return f(std::forward(t)); }
};
template
square_bracket_invoke_t< typename std::decay::type >
make_square_bracket_invoke( F&& f ) {
  return {std::forward(f)};
}

Живой пример .

Код - это C ++ 11, и в нем практически нет накладных расходов.

int main() {
  std::cout << foo( 6, make_square_bracket_invoke([](int x){ return x; } ) ) << "\n";
}

результат равен 0 + 1 + 2 + 3 + 4 + 5 или 15.

Это хорошая идея? Может быть. Но зачем останавливаться на достигнутом?

Для максимального удовольствия:

const auto idx_is = make_square_bracket_invoke([](auto&&f){return make_square_bracket_invoke(decltype(f)(f));});
int main() {
  std::cout << foo( 6, idx_is[[](int x){ return x; }] ) << "\n";
}
11
задан mmccoo 31 March 2009 в 00:06
поделиться

7 ответов

В целом необходимо озираться в emacs руководстве.

Для Вашего третьего маркера смотрите на параметры командной строки emac. В частности, - оценка и-f.

1
ответ дан 3 December 2019 в 06:22
поделиться

Активируемые по щелчку области

Библиотека виджета позволила бы Вам превратить части своего буфера в кнопки (также радио-поля, флажки, списки), который выполнит elisp, когда Вы нажмете их. Например:

    (require 'widget)

(defun simple-widget-example ()
   (interactive)
  (switch-to-buffer "*Simple widget example*")

  (let ((inhibit-read-only t))
    (erase-buffer))

  (let ((all (overlay-lists)))
    ;; Delete all the overlays.
    (mapcar 'delete-overlay (car all))
    (mapcar 'delete-overlay (cdr all)))

  (widget-insert "Sample button\n")
  (widget-create 'push-button
         :notify (lambda (&rest ignore) 
               (message "Poop! Ha Ha!"))
         "Press Me")

  (use-local-map widget-keymap)

  (widget-setup))

См. библиотеку виджета Emacs

5
ответ дан 3 December 2019 в 06:22
поделиться

чтобы заставить emacs выполнить код шепелявости просто создают функцию, которая является интерактивной, и затем можно назвать его с помощью имени функции M-x. Следующее является основной функцией, которая вновь откроет файл.

    (defun na-reopen-file ()
  "Reopen file in buffer."
  (interactive)
  (let ((p (point)))
    (progn
      (find-alternate-file buffer-file-name)
      (goto-char p) ) ) )

Для взаимодействия с Вашим приложением можно выполнить асинхронный процесс и связаться с ним с помощью буфера. проверьте функцию начинать-процесса в руководство.

Поскольку создание нажимает на способные ссылки, можно использовать следующие функции

  (make-button beg end 'action 'nmap-clear-buffer 'follow-link t)
  ;;for color
  (put-text-property beg end 'face nmap-active-button )
0
ответ дан 3 December 2019 в 06:22
поделиться

Вы хотите асинхронный процесс, который говорит с Emacs. Посмотрите в руководстве Emacs в разделе по процессам. Хорошее место для запуска могло бы быть с start-process или start-process-shell-command функции.

Например, код Вы могли посмотреть на источник для man команда, распределенная с emacs или источником для vc-do-command. (Для наблюдения исходного кода введите C-h f затем имя функции и затем нажмите на название функции в окне справки.)

3
ответ дан 3 December 2019 в 06:22
поделиться

Вы могли бы хотеть посмотреть на Distel (интеграция Emacs с системой обмена сообщениями Erlang) и СЛИЗЬ (интерфейс между Emacs и языком Common LISP). Это два режима Emacs, которые включают довольно впечатляющую интеграцию другой системы, говоря с ним асинхронно. В частности, существует статья о том, как Distel был реализован, наряду с некоторой другой хорошей информацией о том, как он работает здесь.

5
ответ дан 3 December 2019 в 06:22
поделиться

Это отчасти зависит от того, как Вы хотите настроить вещи. Определенно часть руководства по процессам стоит считать. Чтение кода для 'comint пакет является хорошим местом для запуска.

Вы перечислили довольно ограниченный набор функциональности, которую требуется выставить, который мог быть решен прямым подключением. Можно найти полезные служебные функции путем взгляда на то, что обеспечивается в 'сети-utils (сеть-utils находить-библиотеки M-x RET).

Если бы приложение, с которым Вы пытаетесь соединиться, имеет интерпретируемый язык, я соединился бы с этим, в противоположность записи пользовательского синтаксического анализатора на стороне приложения.

Запуск Emacs из приложения

Так как Вы запускаетесь, Emacs из приложения (в противоположность другому пути (который, возможно, сделал это задание легче)), это - то, что я, вероятно, сделал бы:

  • запишите мало сценария жемчуга для открытия сокета и чтения-записи к нему
  • настроенный' (чтение (оценка (печать))) цикл в интерпретаторе (или запись пользовательская) и подключение это к сокету/порту
  • запустите Emacs с вызовом функции (-оценка или - выполняется), определение сокета
  • запустите сценарий жемчуга как подпроцесс и порт (см., как нижняя шепелявость или нижний-tcl делает это),

В той точке что-либо от Emacs могло быть отправлено в подпроцесс жемчуга ('comint-send-string) и перейтись к Вашему REPL и иметь желаемый эффект там. Аналогично, можно передать команды обратно emacs, просто отправив по строкам, и анализировать их функциями, которые Вы всунули 'comint-output-filter-functions.

Вы затем записали бы две небольших библиотеки, один на Вашем интерпретируемом языке APP, и один в Emacs, чтобы сделать независимо от того, что функциональность имеет смысл. emacs библиотека должна, вероятно, быть упакована как майор (или незначительная) режим в зависимости от того, на что похожи файлы. Если они должны только использоваться с приложением, главным режимом, если бы они - (например), файлы C++, незначительный режим был бы лучше, учитывая, что Вы, вероятно, хотели бы усилить c ++-mode.

Я записал бы небольшой сценарий жемчуга в жемчуге, в противоположность elisp, просто b/c я знаю, как взаимодействовать с 'comint. Если небольшой сценарий жемчуга мог бы быть заменен блоком elisp и все еще обладать преимуществом с помощью comint, это будет добавленной премией.

У меня есть в значительной степени та же установка для Tcl/Tk, только материал соединения обрабатывается Tk, отправляют команду. Это работает действительно хорошо.

Запуск приложения от Emacs

Теперь, если Вы могли бы, вместо этого, запустить приложение от Emacs, вышеупомянутое все еще применяется, только можно избавиться от небольшого сценария жемчуга и просто взаимодействовать через 'comint интерфейс. Никакие сокеты не необходимы.

  • Вам все еще было бы нужно 'repl цикл (если приложение не может оставить stdin/stdout связанным с интерпретатором
  • Библиотеки остались бы тем же

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

Однако могло бы быть легче разрабатывать/тестировать этот путь (запускающийся от Emacs). Вы могли прибавить связь с сокетом позже как улучшение. Какой бы ни больше мотивирует...

5
ответ дан 3 December 2019 в 06:22
поделиться

Я не уверен, какому количеству это поможет, но Вы могли бы хотеть взглянуть на реализацию СЛИЗИ, которая, в то время как ориентированная шепелявость, имеет некоторые очень хорошие функции. Можно настроить его для присоединения к рабочему процессу легко, например. Не точно, что Вы хотите, но это имеет все части и довольно гладко.

0
ответ дан 3 December 2019 в 06:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: