* C Hello World Emacs module @ 2021-10-05 10:07 Emanuel Berg via Users list for the GNU Emacs text editor 2021-10-05 10:37 ` Omar Polo 2021-10-06 7:35 ` Christian Barthel 0 siblings, 2 replies; 7+ messages in thread From: Emanuel Berg via Users list for the GNU Emacs text editor @ 2021-10-05 10:07 UTC (permalink / raw) To: help-gnu-emacs Can one write a Hello World program in C, compile it, and bring it in and have it `message' and/or `insert' that string in Emacs? Is there a minimal working example, in the LaTeX lingo, for C modules in Emacs? -- underground experts united https://dataswamp.org/~incal ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: C Hello World Emacs module 2021-10-05 10:07 C Hello World Emacs module Emanuel Berg via Users list for the GNU Emacs text editor @ 2021-10-05 10:37 ` Omar Polo 2021-10-05 11:15 ` Emanuel Berg via Users list for the GNU Emacs text editor 2021-10-06 7:35 ` Christian Barthel 1 sibling, 1 reply; 7+ messages in thread From: Omar Polo @ 2021-10-05 10:37 UTC (permalink / raw) To: Emanuel Berg; +Cc: help-gnu-emacs Emanuel Berg via Users list for the GNU Emacs text editor <help-gnu-emacs@gnu.org> writes: > Can one write a Hello World program in C, compile it, and > bring it in and have it `message' and/or `insert' that string > in Emacs? > > Is there a minimal working example, in the LaTeX lingo, for > C modules in Emacs? Other than in the manual, I've found this article by skeeto to be really helpful in understanding how modules works: https://nullprogram.com/blog/2016/11/05/ The first bit of code is how to call `message' with "Hello, world!" as argument. HTH ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: C Hello World Emacs module 2021-10-05 10:37 ` Omar Polo @ 2021-10-05 11:15 ` Emanuel Berg via Users list for the GNU Emacs text editor 2021-10-05 11:26 ` Omar Polo 0 siblings, 1 reply; 7+ messages in thread From: Emanuel Berg via Users list for the GNU Emacs text editor @ 2021-10-05 11:15 UTC (permalink / raw) To: help-gnu-emacs Omar Polo wrote: >> Is there a minimal working example, in the LaTeX lingo, for >> C modules in Emacs? > > Other than in the manual, I've found this article by skeeto > to be really helpful in understanding how modules works: > > https://nullprogram.com/blog/2016/11/05/ > > The first bit of code is how to call `message' with "Hello, > world!" as argument. OK, thanks, that one step closer, there's this #include "emacs-module.h" int plugin_is_GPL_compatible; int emacs_module_init(struct emacs_runtime *ert) { emacs_env *env = ert->get_environment(ert); emacs_value message = env->intern(env, "message"); const char hi[] = "Hello, world!"; emacs_value string = env->make_string(env, hi, sizeof(hi) - 1); env->funcall(env, message, 1, &string); return 0; } In a real module, it’s common to create function objects for native functions, then fetch the fset symbol and make a Lisp call on it to bind the newly-created function object to a name. You’ll see this in action later. But still missing is the command(s) and options to compile and instructions how to make it visible from Emacs ... Also I'd like to have the example as it would look "[i]n a real module" ... so it shouldn't just be a MWE, it should be a MCAWE (Minimal Correct and Applicable Working Example) :) -- underground experts united https://dataswamp.org/~incal ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: C Hello World Emacs module 2021-10-05 11:15 ` Emanuel Berg via Users list for the GNU Emacs text editor @ 2021-10-05 11:26 ` Omar Polo 2021-10-05 11:47 ` Emanuel Berg via Users list for the GNU Emacs text editor 0 siblings, 1 reply; 7+ messages in thread From: Omar Polo @ 2021-10-05 11:26 UTC (permalink / raw) To: Emanuel Berg; +Cc: help-gnu-emacs Emanuel Berg via Users list for the GNU Emacs text editor <help-gnu-emacs@gnu.org> writes: > Omar Polo wrote: > >>> Is there a minimal working example, in the LaTeX lingo, for >>> C modules in Emacs? >> >> Other than in the manual, I've found this article by skeeto >> to be really helpful in understanding how modules works: >> >> https://nullprogram.com/blog/2016/11/05/ >> >> The first bit of code is how to call `message' with "Hello, >> world!" as argument. > > OK, thanks, that one step closer, there's this > > #include "emacs-module.h" > > int plugin_is_GPL_compatible; > > int emacs_module_init(struct emacs_runtime *ert) { > emacs_env *env = ert->get_environment(ert); > emacs_value message = env->intern(env, "message"); > const char hi[] = "Hello, world!"; > emacs_value string = env->make_string(env, hi, sizeof(hi) - 1); > env->funcall(env, message, 1, &string); > return 0; > } > > In a real module, it’s common to create function objects for > native functions, then fetch the fset symbol and make a Lisp > call on it to bind the newly-created function object to > a name. You’ll see this in action later. > > But still missing is the command(s) and options to compile and > instructions how to make it visible from Emacs ... > > Also I'd like to have the example as it would look "[i]n > a real module" ... so it shouldn't just be a MWE, it should be > a MCAWE (Minimal Correct and Applicable Working Example) > > :) There's a Makefile linked in the article, which even if it has a .POSIX target is just a GNU Makefile, but anyway. https://github.com/skeeto/joymacs/blob/master/Makefile Assuming you're on some UNIX flavors, you need to create a shared library. This means that you need to compile every object file with -fPIC and then bundle 'em together with something like cc -shared -fPIC -o your-module.so obj1.o obj2.o obj3.o ... (where obj1.o, obj2.o etc are your compiled C files, for e.g. cc -fPIC -c obj1.c -o obj1.o ) To load it, IIRC is mentioned in the manual, you just drop the .so file inside `load-path' and `require' it like it were a .el/.elc file. How structure it heavily depends on what you want to do. Usually one wants to export some functions from C to elisp, but you may want to do something else. In the linked article the first snippet (the one you quoted) shows how to translate (message "Hello, world!") in a C module, later examples shows how to make functions callable from elisp. Another example is emacs-libpq, the bindings for the postgresql library. It is of course CAWE (correct and applicable working example), don't know if I would consider it minimal thought. https://github.com/anse1/emacs-libpq/blob/master/pq-core.c#L354 They define a handy DEFUN macro to prettify the process of registering functions. In the end, how to do it heavily depends how what you want to do ;) ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: C Hello World Emacs module 2021-10-05 11:26 ` Omar Polo @ 2021-10-05 11:47 ` Emanuel Berg via Users list for the GNU Emacs text editor 0 siblings, 0 replies; 7+ messages in thread From: Emanuel Berg via Users list for the GNU Emacs text editor @ 2021-10-05 11:47 UTC (permalink / raw) To: help-gnu-emacs Omar Polo wrote: > There's a Makefile linked in the article, which even if it > has a .POSIX target is just a GNU Makefile, but anyway. > > https://github.com/skeeto/joymacs/blob/master/Makefile > > Assuming you're on some UNIX flavors, you need to create > a shared library. This means that you need to compile every > object file with -fPIC and then bundle 'em together with > something like Yes, I'm on Debian 11! Thanks a lot, will get back to you with questions/results later Gw ... -- underground experts united https://dataswamp.org/~incal ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: C Hello World Emacs module 2021-10-05 10:07 C Hello World Emacs module Emanuel Berg via Users list for the GNU Emacs text editor 2021-10-05 10:37 ` Omar Polo @ 2021-10-06 7:35 ` Christian Barthel 2021-11-06 13:05 ` Emanuel Berg via Users list for the GNU Emacs text editor 1 sibling, 1 reply; 7+ messages in thread From: Christian Barthel @ 2021-10-06 7:35 UTC (permalink / raw) To: Emanuel Berg; +Cc: help-gnu-emacs On Tue, Oct 05 2021, Emanuel Berg via Users list for the GNU Emacs text editor wrote: > Can one write a Hello World program in C, compile it, and > bring it in and have it `message' and/or `insert' that string > in Emacs? > > Is there a minimal working example, in the LaTeX lingo, for > C modules in Emacs? You might want to have a look at this: <http://diobla.info/blog-archive/modules-tut.html> As far as I can remember, I followed those instructions when writing a C module. -- Christian Barthel ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: C Hello World Emacs module 2021-10-06 7:35 ` Christian Barthel @ 2021-11-06 13:05 ` Emanuel Berg via Users list for the GNU Emacs text editor 0 siblings, 0 replies; 7+ messages in thread From: Emanuel Berg via Users list for the GNU Emacs text editor @ 2021-11-06 13:05 UTC (permalink / raw) To: help-gnu-emacs Emacs Dynamic Module example with all the fixings: https://dataswamp.org/~incal/emacs-init/more/dm/ Here's the C. Follow the hyperlink for the Makefile, header file, and Elisp. #include "dm.h" #include <emacs-module.h> #include <stdio.h> int plugin_is_GPL_compatible; int emacs_module_init(struct emacs_runtime* runtime) { if (runtime->size < (long int)sizeof(*runtime)) { return 1; // incompatible/mismatch Emacs binary } emacs_env* env = runtime->get_environment(runtime); if (env->size < (long int)sizeof(*env)) { return 2; // ditto module API } int __attribute__((unused)) emacs_version; if ((long int)sizeof(struct emacs_env_29) <= env->size) { emacs_version = 29; } else { return 3; // too old Emacs } emacs_value hw_func = env->make_function(env, 0, 0, hw, NULL, NULL); emacs_value hw_symbol = env->intern(env, "hw-func"); emacs_value args[] = {hw_symbol, hw_func}; env->funcall(env, env->intern(env, "defalias"), 2, args); return 0; } emacs_value hw(emacs_env* env, ptrdiff_t nargs __attribute__((unused)), emacs_value* args __attribute__((unused)), void* data __attribute__((unused))) { emacs_value str = env->make_string(env, "Dynamic Module Operational", 26); return str; } -- underground experts united https://dataswamp.org/~incal ^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2021-11-06 13:05 UTC | newest] Thread overview: 7+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2021-10-05 10:07 C Hello World Emacs module Emanuel Berg via Users list for the GNU Emacs text editor 2021-10-05 10:37 ` Omar Polo 2021-10-05 11:15 ` Emanuel Berg via Users list for the GNU Emacs text editor 2021-10-05 11:26 ` Omar Polo 2021-10-05 11:47 ` Emanuel Berg via Users list for the GNU Emacs text editor 2021-10-06 7:35 ` Christian Barthel 2021-11-06 13:05 ` Emanuel Berg via Users list for the GNU Emacs text editor
Code repositories for project(s) associated with this external index https://git.savannah.gnu.org/cgit/emacs.git https://git.savannah.gnu.org/cgit/emacs/org-mode.git This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.