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"; }
В целом необходимо озираться в emacs руководстве.
Для Вашего третьего маркера смотрите на параметры командной строки emac. В частности, - оценка и-f.
Активируемые по щелчку области
Библиотека виджета позволила бы Вам превратить части своего буфера в кнопки (также радио-поля, флажки, списки), который выполнит 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 выполнить код шепелявости просто создают функцию, которая является интерактивной, и затем можно назвать его с помощью имени функции 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 )
Вы хотите асинхронный процесс, который говорит с Emacs. Посмотрите в руководстве Emacs в разделе по процессам. Хорошее место для запуска могло бы быть с start-process
или start-process-shell-command
функции.
Например, код Вы могли посмотреть на источник для man
команда, распределенная с emacs или источником для vc-do-command
. (Для наблюдения исходного кода введите C-h f затем имя функции и затем нажмите на название функции в окне справки.)
Вы могли бы хотеть посмотреть на Distel (интеграция Emacs с системой обмена сообщениями Erlang) и СЛИЗЬ (интерфейс между Emacs и языком Common LISP). Это два режима Emacs, которые включают довольно впечатляющую интеграцию другой системы, говоря с ним асинхронно. В частности, существует статья о том, как Distel был реализован, наряду с некоторой другой хорошей информацией о том, как он работает здесь.
Это отчасти зависит от того, как Вы хотите настроить вещи. Определенно часть руководства по процессам стоит считать. Чтение кода для 'comint пакет является хорошим местом для запуска.
Вы перечислили довольно ограниченный набор функциональности, которую требуется выставить, который мог быть решен прямым подключением. Можно найти полезные служебные функции путем взгляда на то, что обеспечивается в 'сети-utils (сеть-utils находить-библиотеки M-x RET).
Если бы приложение, с которым Вы пытаетесь соединиться, имеет интерпретируемый язык, я соединился бы с этим, в противоположность записи пользовательского синтаксического анализатора на стороне приложения.
Так как Вы запускаетесь, Emacs из приложения (в противоположность другому пути (который, возможно, сделал это задание легче)), это - то, что я, вероятно, сделал бы:
В той точке что-либо от 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, вышеупомянутое все еще применяется, только можно избавиться от небольшого сценария жемчуга и просто взаимодействовать через 'comint интерфейс. Никакие сокеты не необходимы.
Это было бы намного легче, но только работает, если пользовательский поток позволяет Вам пойти то направление. (У меня есть догадка, которую Вы пишете этому для больше, чем просто своего использования.)
Однако могло бы быть легче разрабатывать/тестировать этот путь (запускающийся от Emacs). Вы могли прибавить связь с сокетом позже как улучшение. Какой бы ни больше мотивирует...
Я не уверен, какому количеству это поможет, но Вы могли бы хотеть взглянуть на реализацию СЛИЗИ, которая, в то время как ориентированная шепелявость, имеет некоторые очень хорошие функции. Можно настроить его для присоединения к рабочему процессу легко, например. Не точно, что Вы хотите, но это имеет все части и довольно гладко.