Back to the talks Previous by track: Fun things with GNU Hyperbole Next by track: Literate programming for the 21st Century Track: General

PGmacs: browsing and editing PostgreSQL databases from Emacs

Eric Marsden (he/him) - eric.marsden@risk-engineering.org, @emarsden@mastodon.social

Format: 14-min talk ; Q&A: BigBlueButton conference room
Etherpad: https://pad.emacsconf.org/2024-pgmacs
Status: TO_CAPTION_QA

Talk

00:01.260 Introduction 01:26.710 Demo 03:53.960 Deletion 05:12.880 Export 05:42.250 HStore 06:11.510 Connecting to a different database 06:31.110 SchemaSpy 07:32.620 Convenience queries 08:18.850 Emacs as an application development platform 09:36.250 Extending pgmacs 11:49.400 Conclusion

Duration: 13:17 minutes

Q&A

02:37.440 Q: Do you know if PGmacs works with TRAMP? 04:38.240 Q: How did you come up with this brilliant idea? 09:26.920 TRAMP continued 13:22.966 Q: Is sqlite-mode also capable of all of this functionality (table relations, etc)? If not, will it be possible to abstract out this functionality from pgmacs somehow? 15:06.511 Q: Would it be possible to move it into Emacs tree? Are the maintainers interested in it? 16:53.850 Q: What do you use for the in-buffer tables? Vtable? 18:16.640 Integrating with Emacs 30?

Listen to just the audio:
Duration: 20:02 minutes

Description

PGmacs provides an Emacs-based browsing and editing interface for the PostgreSQL DBMS. It allows you to browse the contents of database tables, in paginated mode for large tables, to edit column values in the minibuffer or using a widget-based interface, to delete, copy and insert new rows, and to save the contents of a table in CSV or JSON format. You can run shell commands on column values. You can also rename tables and columns, add SQL comments, and generate SchemaSpy diagrams.

PGmacs works both in the terminal and in GUI mode. It uses the pg-el library, which implements the PostgreSQL wire protocol, to connect to PostgreSQL over the network or over a Unix socket.

The talk will provide an overview of the functionality of PGmacs, then show how it can be easily extended to display images stored as database BLOBs inlined in a row-list buffer.

https://github.com/emarsden/pgmacs

About the speaker:

Eric Marsden developed his first Emacs packages pg-el, coffee.el (an implementation of the essential Hyper Text Coffee Pot Control Protocol) and ipp.el as a procrastination exercise to avoid working on his PhD. He continues to use Emacs Lisp in his spare time.

Discussion

Questions and answers

  • Q: This is brilliant, thank you! Do you know if PGmacs works with TRAMP? I often use TRAMP multi-hop to access databases - both remotely when accessing via a 'bastion server' and locally when using OCI containers
    • A: There is no TRAMP support, I'm afraid. PGmacs is directly connecting to the database server over the network. You can set up ssh tunnels, but that would be done separately from Tramp. Thanks :)
      • you can tunnel arbitrary data over ssh
      • ssh subsystems are the thing to look at, I think... I might look at it
      • (sftp works that way: basically you can put arbitrary progams at the remote end... like, oh, say, pgsql. transparently to the ssher.)
      • Possibly PGmacs could setup the tunnel itself, using TRAMP?
    • With docker.el, kubel, etc, it's often possible to for example select a container/pod/whatever that is hosted on a machine you've connected to via TRAMP (such as /podman:\<image>:/path/), and trigger a terminal/eshell as well as port-forwards and other similar things. It'd be nice to be able to use this tool in a similar way since it would open up the ability to use it with complex connection configurations. Doing SSH tunnels manually is ofc totally fine in practice :)
  • Q: \<Donovan>Great work! I'm impressed. How did you come up with this brilliant idea?
    • A: First got the idea by looking at sqlite-mode
  • Q: Is sqlite-mode also capable of all of this functionality (table relations, etc)? If not, will it be possible to abstract out this functionality from pgmacs somehow?
    • A: I'm not veyr familiar with sqlite-mode but  it looks more basic. There are differences between the sql dialects so it will be difficult to abstract it out.
  • Q: Would it be possible to move it into Emacs tree? Are the maintainers interested in it?
    • A: Currently its at a very early stage and is being updated regularly. I also have some philosophical reasons to not do it regarding copyright transfer to the FSF.
  • Q: Almost missed this one, so glad I didn't, but this may have been answered already: what do you use for the in-buffer tables? vtable?
    • A: vtable but "forked" (some changes/improvements, may consider "merging" back with vtable core work)
  • Q:
    • A:

Notes

  • I have got 270 tables, and it stays there forever "loading" tables, and nothing appears.
  • Thanks for checking it out! You may have an authentication failure, and PGmacs is not very good at showing that in the connect phase. Switch to the *Messages* buffer and see whether there's an error message there.
    • This is happening with me as well. I noticed this error message in Postgres Logs. It works if I open the postgres database.
    • db-1  | 2024-12-08 18:58:41.524 UTC [48] STATEMENT:  CREATE EXTENSION IF NOT EXISTS vector
    • db-1  | 2024-12-08 18:59:13.831 UTC [50] ERROR:  could not open extension control file "/usr/share/postgresql/14/extension/vector.control": No such file or directory
    • In *Messages* buffer, this is what I see
      • pg-bind: Wrong type argument: stringp, 97
  • OK, thanks for this feedback. It looks like your Postgres vector extension is not well set up, but that really shouldn't be causing a complete connection failure. You can comment out the line (pg-vector-setup con) in function pgmacs-open in pgmacs.el and see whether that helps
      • Let me try that and report back.
      • I got this error: pg-do-startup: Process postgres not running: failed with code 111
      • OK, that means that the network connection failed. There is probably more error information in the backtrace
      • Ah sorry, had stopped the pg. This time I got the same error
      • pg-bind: Wrong type argument: stringp, 97
      • But it didn't try to load vector extensions (from pg logs).
      • With toggle-debug-on-error, this is the backtrace
      • https://gist.github.com/ankitrgadiya/d9ae038489e4f680e3037e2e61584312
      • OK, thanks for that backtrace. I don't immediately see what is wrong here. There is something strange about that shared_urls table, it seems. Are you using pg-el from the github repo? 
      • I created the github issue to continue the discussion: https://github.com/emarsden/pgmacs/issues/9
      • BTW I'm using the postgres docker image.
  • This is amazing! Image inline :o !!

  • I'm impressed by the inline images.  Just sprinkle a little elisp and voila.

  • A PostGIS point field -> osm.el integration would be very cool

  • Interesting idea, will look into that.
  • Super slick Emacs/PG hacking and presentation! Eat your heart out, MS Access
  • another package I never knew I needed
  • Very cool, I'm currently using PG on a small project and it's always a pain to leave emacs to do checks in the database.
  • I just wish it had existed when I was doing massive db work in the 90s/2000s
  • Just installed it, to prevent me from forgetting about it.
  • I just wish it had existed when I was doing massive db work in the 90s/2000s
    • Better 20+ years late than never 😆
  • there is a grantback if you assign copyright to the FSF: you get all the rights you gave away right back again
  • Thanks Eric, looks fantastic, and quite eager to look into those vtable enhancements myself (thanks for answering)
  • YouTube comment: Very impressive, thanks!
  • YouTube comment: Finally a perspective on a potential real excel killer.
  • YouTube comment: How is the duckdb more coming along?

Transcript

[00:00:01.260] Introduction
Hi, this is a short presentation about PGmacs, which is a browsing and editing interface for Postgres databases. My name is Eric Marsden, and I'm the developer of this Emacs Lisp library. PGmacs was inspired by sqlite-mode, which is a great feature available from Emacs 29 onwards. It allows you to view and modify SQLite databases you might have lying around. It's a really great feature. It would be even better, however, if it were able to use a real database. And I happen to know that was possible because a few years ago, I wrote an Emacs Lisp library, pg.el, which implements the wire protocol used for communication over the network between a Postgres client and the Postgres backend, the Postgres server. I've included here an example of what it looks like to use this library. You connect to the database by specifying the database name, your username, your password, potentially the hostname that you're connecting to. Once you're connected, you can then execute SQL statements, for example, to create a new table, to insert values into that table, and to count the number of rows in a table. And pg.el does automatic type conversion to and from Emacs Lisp types and Postgres types for you. Probably the best is to jump straight into a demo of PGmacs. When we connect to a database, we see up the top of the buffer, some information about the backend that we're connected to, some version information and the total database size on disk. There are some shortcuts to some commands we can run on the database, and there's a list of tables that we have access to, with again, metainformation about their size on disk and their owner. Now, we can enter a table by pressing return. Here we again see some metainformation about the table, such as the list of columns, the SQL type of each column, any defaults that might be present and any SQL constraints. We see any indexes that might be present on this table, and then we see the list of rows of data in the table. If we see any information which is incorrect or incomplete, we can easily fix it by pressing enter again, and this updates the information present in the database. PGmacs shows us this in the minibuffer it has updated one row. We can look at help for the key bindings that are present in this type of buffer. If we scroll down, we can see that we can upcase the value of a cell with M-u. Let's try that out. Okay, here we have updated the value of the cell in the database. We can now lowercase it, and we can put it back to the initial title case of the value. We can also run a shell command on a cell value, to count the number of characters, for example. We can run a shell command with a prefix argument, which updates the value in the database with the output from the shell command. So that has updated the database. If we do that again, that will reverse the value. If we come back to the list of tables, we see that there is a table which is called deleteme. We can try renaming this table with R, we can look at what is in this table.
[00:03:53.960] Deletion
Okay, there is only one row of information that doesn't seem very important, so let's delete that. Let's now delete the table with DEL. PGmacs asks for confirmation, and we've deleted the table. Now when we have a big table with a lot of data, PGmacs is going to show us the results paginated, so we can go chunk by chunk through the table. We can implement a where filter on the rows to only show the rows that match a certain SQL clause. So for example, here we have some temperature measurements. We want to focus on measurements that are more than 40 degrees Celsius, for example. Okay, we have now filtered on a certain number of rows. The filter is shown to us just up here, and we see here that we have some values that look anomalous. There's one, 140, and one is 61. We probably want to delete them, they represent errors. We can mark them for deletion with d, and then really delete them, expunge them, as in Dired, with x. We can export this table in CSV format, thanks to this little button up here. Here we have our table conveniently formatted as CSV. We can also export a particular row to JSON by typing j, let's look at what that looks like. Okay, here's the JSON for one of the rows in the table. Now let's look at a table that contains a column of type HStore. This is a Postgres-specific key-value map. Then the attributes column is of type JSON, which can be stored natively in Postgres. It's possible to edit these values using a widget-based interface by typing w, and here we have a convenient interface for modifying these types of values. Likewise, for the JSON type parameter, we can update using a widget-based interface.
[00:06:11.510] Connecting to a different database
Let's connect to a different database. We do that with a M-x pgmacs, and then enter our username and password. Here we have the list of tables present in this database.
[00:06:31.110] SchemaSpy
PGmacs has some support for running the SchemaSpy utility, which generates a graphical representation of the relationships between tables in this database, which can be useful when you're discovering the database. Here is the SVG that's output by this utility. This is a test database containing information about a digital media store. It has a table with information about the tracks that are available. If we look at this table, we see that we have the name of the track, a reference to the album, album ID. This is a reference to a foreign key, a key in the table which is called album. Now we can follow this foreign key reference simply by pressing Enter, and here we find it's the album called For Those About To Rock. And in the same way, here we have a foreign key reference to the relevant artist which we can follow. That's, of course, AC/DC.
[00:07:32.620] Convenience queries
And finally, PGmacs has some convenience queries that allows us to list the procedures which are defined in this database. Here we have the built-in procedures, mostly used by the PostGIS extension. We can also display some more information about our backend. Here we have the list of extensions which are available. We can load one of these extensions if we have the rights to do that. Here we've loaded the relevant extension. We can show some information about the Postgres settings also, and update them if we have the rights to do that.
[00:08:18.850] Emacs as an application development platform
Now I'm preaching to the converted, but Emacs is a really great application development platform. PGmacs is currently around 3000 lines of code. A first point of comparison, PGCLI, which is a text user interface for accessing Postgres implemented in Python, is 17,000 lines of code. PGAdmin4, which is a well-known Python GUI for administrating Postgres databases, is almost half a million lines of code. And DBeaver, implemented in Java, is almost a million lines of code. Developing things on Emacs, you get for free portability between different platforms. As I'm showing you, it works great on Linux, which is where I developed this library. It also works perfectly in the terminal, except for some of the functionality I showed, which requires SVG support. It also works well, if you're into that kind of thing, on MacOS and on Windows. And it even works perfectly on Haiku, which is a free BeOS clone. Emacs is actually really pretty on this operating system, so congratulations to the people who did the port there. Now, of course, the main advantage of building on the Emacs development platform, is that the application is easy for the user to extend.
[00:09:36.250] Extending pgmacs
To illustrate that, previously we were looking at a table of temperature measurements. Imagine we want to highlight rows in this table, which look anomalous, where the value looks a bit extreme. That's quite easy to do with a bit of Emacs Lisp. We define a function, which, if the cell value is bigger than 40, is going to display it in a face which has a dark red foreground. We can now register this display function for the measurement column in the temperatures table. And if we reopen the table now, we see that the anomalous measurements are indeed highlighted in red. Another example, imagine we have a table which contains image data. There's a column which is of BYTEA type, which contains images in binary form. We can display these inline as follows. We create an inline image display function, using Emacs' image support. And then we'd register this function to display the image column in the inline image table. If we now reopen the inline image table, we see the images are displayed inline. And as a final example of customisation, here's how to bind a key to a specific function, in the row-list buffer. Let's define a function that does a DuckDuckGo lookup for a particular value in the Emacs web browser. We can define a function which does a funcall on the cell value for this DuckDuckGo lookup function. And finally we can define a key, the capital D key, in the row-list map, which calls this function that does a DuckDuckGo lookup. And now if I'm browsing information in a table that I want to do a web search on, I can use my D shortcut and see some web results concerning the cell.
[00:11:49.400] Conclusion
So to conclude, the source and installation instructions for PGmacs are available on GitHub. It requires Emacs 29. There is a prebuilt container image which you can use for testing. It's a Docker image. The Docker image only works in terminal mode. And of course that's a recommended way of testing Emacs Lisp code that you load into your Emacs before having read it. It works with any recent version of Postgres over the past 10 years, including the latest release, Postgres 17. It does work with a certain number of databases that are compatible with Postgres, such as ParadeDB, TimescaleDB and IvorySQL. However, it doesn't work with all databases that claim to be Postgres compatible. It doesn't work, for example, with CrateDB or with CockroachDB or some others that you see listed here. The reason for that is that these databases don't implement the system tables that PGmacs queries to obtain information about the columns present in a table, the size on disk, the ownership of tables, etc. PGmacs supports TLS encrypted connections to the database, as well as local Unix socket connections. And in terms of stability, I would classify it as beta status. I do use it myself in production on some not very important data. Really, it works quite well. Thanks for your attention.

Captioner: eric

Q&A transcript (unedited)

And I believe we are live. Hi, Eric, how are you doing? Very well, thanks. It's a pleasure to have you as one of our speakers but it's also very nice to see you present about pgmacs because I found your talk to be very didactic and very visual. So thank you for taking the time to do a very nice presentation. I wanted to give the opportunity as I do with other speakers to maybe talk about some stuff that you could not include into the talk because of the format. So is there anything you'd like to share with the viewers that you weren't able to include? Oh, I think I gave most of the most of the relevant information. This is a fairly young application. I've been developing this since roughly the beginning of the year. So there are probably some rough edges that people will run into if they use Postgres differently from what I do. Or they hear maybe conflicts with some other Emacs packages that people use that I don't use. So I would really welcome people trying it out and sending out bug reports if they do encounter some. Yeah, I mean, it's usually... Go on, please. Yeah, that would certainly help to make sure it's nice and robust. And of course, if you're letting this loose on some production database that you might have, you want this to be quite robust, obviously. Yeah, indeed. Because usually, you know, when you start publishing packages like this, that's when you realize that it has bad interaction with other modes in the Emacs of other persons. But especially when you're dealing with databases, you also realize that the domain space of what you're trying to do with your mode also is hugely dependent on what people have in their database, which schema they have. So, indeed, if you have been interested, and I think plenty of people have been interested by what you've presented, part of the reason a software becomes great is that you've got plenty of people making bug reports and making sure that all the faults have been ironed out. So, you know what your task is. I will also ask you, particularly right now, people currently viewing, to add your questions on the pad as usual, because you've had plenty of nice reactions, but I'm sure you have plenty of questions as well. So Eric, what I'll be doing, I'll be reading you the questions so that it's a little more didactic. Starting with the first one. This is
[00:02:37.440] Q: Do you know if PGmacs works with TRAMP?
brilliant, thank you. Do you know if pgmacs works with TRAMP? I often use TRAMP multi-hop to access databases both remotely when accessing via bastion server and locally when using OCI containers. I believe you've already answered but if you could just perhaps read your answer as well for everyone to benefit from it. Yep, sure, that's my comment indeed. So I haven't currently implemented any TRAMP support. I'm not sure that TRAMP is really useful for this type of situation, because as I understand it, TRAMP is establishing SSH connections itself to remote servers. pgmacs is doing the same thing, so it doesn't currently have any support for hooking in with the TRAMP support. Right. Pardon me if I missed the presentation. Oh, go on, please. I guess you could set up an SSH tunnel. It does work with an SSH tunnel, obviously, but there's no support for hooking into an SSH tunnel that TRAMP might be able to create. I'm not sure TRAMP actually uses SSH tunnels rather than direct commands, but anyway. Yeah, I think that might be useful. Yeah, I don't know either. I don't have the answer whether TRAMP actually can create tunnels like this. I'm usually used to TRAMP connecting to an endpoint, be it a directory or a file, and the tunnel is just you accessing the file. But usually, if you're trying to access a remote Postgres database, you would probably manage the port forwarding in a separate terminal just to be able to make sure that everything maps correctly to your machine, and then you would launch pgmacs with the forward port information. That's, I assume, how you would do it anyway. But yeah, I mean, if you could specify what you mean by TRAMP support and if you have something specific in mind, I'm talking to the questioner, feel free to specify and we'll see if you can answer it. But in the meantime, moving to the next question.
[00:04:38.240] Q: How did you come up with this brilliant idea?
Great work, I'm impressed. How did you come up with this brilliant idea, I assume, to create pgmacs? Well, thanks for the compliment. It's a lot of fun developing something which is, as I said, such a small amount of code and which provides quite a bit of useful functionality. In particular, if you compare it with existing Terminal mode applications for manipulating Postgres data, they are not as extensible as Emacs is naturally. So I actually got the idea for developing this when I first tested out the SQLite mode, which is available in Emacs 29.1. And I thought, well, that's really quite impressive. And it allows you to delete rows and insert content and so on. And I was thinking, yeah, Emacs is a, is a useful environment to do that. And since several years ago, when I was doing my PhD, so to avoid doing my PhD, I was developing Emacs, I was developing stuff in Emacs Lisp and one of the libraries I developed was an interface to Postgres over the network. So that's the library called pg.el, which is used by pgmacs to access Postgres and to do all the parsing of data which arrives in Postgres formats into the Emacs Lisp into the Emacs corresponding versions. So, for example, integers are passed as Emacs integers, floating point numbers as floating point numbers, and so on. Right, yeah. I mean, it's pretty needed, obviously, when you have such a tooling like this, to make sure that the type conversion works properly, because the types that you have in Postgres do not necessarily map over to what we have in Emacs. Like, I'm interested, how would you handle g's and b columns in pgmacs? JSON is mapped to an edis dict, a dictionary. It depends on the top level object type for your JSON column. If it's an array, it's mapped to an Emacs Lisp array. If it's a dict, which is most common, it's mapped to an Emacs Lisp dictionary. All right, well it makes perfect sense. So I can break in with a question. Thanks, I just helped myself to the BBB privilege of kind of running around backstage, being a helper backstage. So thanks for your awesome talk, Eric. I super appreciated it. You know, I noticed that you that you're on a slightly older version of Emacs that I deal with in helping with producing the Windows binaries I run into and with some other stuff I do. I'm dealing with that friction of sometimes I've got some work of my own that applies against a specific version of Emacs and it's a bunch of work to think about moving it forward. Just curious if you started thinking about that or if you routine, if that's a routine that you haven't done or there's something maybe specifically going on with, you know, with trunk development that looks intimidating to deal with. Thanks for the comment. I'm not sure I'm using a really old version for Windows. I don't really develop often on Windows, but I I occasionally check that it works, and I took a screenshot that I included in the slides here, but I think I'm using 29.4, the current version on Windows. I thought I saw 29.1, so that's probably my, I probably missed it when it went by. My bad. No, no, I use it via the choco package updater so that updates the Emacs version quite easily on Windows. So thanks for your work on maintaining Windows binaries. I realize that was- I sit downstream at the end of a lot of other people's hard work and then just focus on trying to QA well and help catch problems early. It's really fun. But of course, my pleasure. Coming back to the previous question, so the the questionnaire actually provided a little more context. So
[00:09:26.920] TRAMP continued
with docker.el, kubel, etc, it's often possible to, for example, select a container pod or whatever that is hosted on the machine you've connected to via TRAMP, such as Podman, colon image colon path and trigger a terminal shell as well as pull forward on other similar things. It'd be nice to be able to use this tool in a similar way since it would open up the ability to use it with complex connection configuration. Doing SSH tunnel manually is of course totally fine in practice and if it is actually the case personally when I need to remote into a kubernetes machine I use POSIX script that I use on most of my machines but I don't do it inside Emacs. But yeah, if such a thing is possible via TRAMP, it definitely feels like it would be possible to do something similar in pgmacs. So perhaps that's a path of investigation for you that has opened up. Yeah, thanks for these comments. I'll look into that indeed if people have some shortcuts registered in TRAMP. So not for a terminal, because pgmacs won't work through a terminal, but through a port forward, then that would be convenient. I'll see how easy that is to set up. Yeah, I'm pretty sure the way it works is that it starts some processes in the background in Emacs just to either maintain the port forward or to maybe remap some kubecon things or whatever. So with pgmacs, considering complex pipelines to get to the end destination, it feels like it would be possible to do something. But perhaps it's not the responsibility of pgmacs, perhaps it's the responsibility of another, perhaps something that would target TRAMP more so than pgmacs. But it's nice to see again how the beauty of Emacs is that everything is Elisp at the end, and the way they interact, you might want to question yourself whether this belongs more to pgmacs or more to TRAMP, but at the end of the day, both applications will be able to benefit from the functions of the other. So that's the beauty of the philosophy right here. I do see... Absolutely, I agree. Sorry, before we move to different questions, an additional point. I should point out that to warn people that probably running over an SSH tunnel is going to be a bit slow. I mostly use it on my own machine via a local Unix connection. And for some reason that I haven't understood, pgmacs is quite a bit slower when it's even connecting to the same database on the local machine, but via Emacs' network support instead of via the Unix socket support. There is like a factor 10 difference in throughput and in latency. I don't really understand why currently, because it's using exactly the same Emacs Lisp level primitives. And when you do this using other libraries like libpq, which is the Postgres standard official library for connecting to Postgres, there's not such a performance difference. So there's probably something that is not working perfectly in the Emacs network support. I'll have to see whether I can investigate how to improve that performance. Yeah, I'm going to say it sounds like a great bug to have because it feels like it will allow you to dig deeper into Emacs to understand what is going on here. Because as you said, normally it's supposed to work exactly the same, especially if it's still in your local machine, but it doesn't. Personally, that's the kind of bug that I really like and that I'd like to spend more time investigating. So perhaps you might think otherwise, but I wish you luck on the debugging with this particular matter. All right, moving to the last question that we have and then we'll probably go on a little bit of a break.
[00:13:22.966] Q: Is sqlite-mode also capable of all of this functionality (table relations, etc)? If not, will it be possible to abstract out this functionality from pgmacs somehow?
Question. Is SQLite mode also capable of all of this functionality, table relations, etc.? If not, would it be possible to abstract out this functionality from pgmacs somehow? So I'm not very familiar with SQLite because I don't really use it very much myself. I'm not sure I can answer that question. Sorry about that. I think it is probably a bit more basic because SQLite itself is quite a bit more basic in terms of the types of indexes it's able to support and the types of constraints it's able to support. Is it relevant to create an abstract API for connecting to databases? I think there is already actually a library that abstracts out from SQLite and Postgres. Postgres, when you connect to it via a PSQL subsystem, it might be worthwhile doing that, but there are often a few minor differences in SQL syntax and so on between databases. So it might be difficult to have something that really works with generic queries in an effective way. All these SQL dialects are a little bit different, unfortunately. So there was another question about I was just going to read out the next question.
[00:15:06.511] Q: Would it be possible to move it into Emacs tree? Are the maintainers interested in it?
So have you thought about integrating your work into the Emacs tree? Do you know if people are interested? This was a question from the past. Yeah, I think it's probably a bit young to do so, so far. I'm updating it quite regularly. Maybe once it's more stabilized, I wouldn't necessarily object to this. I have some sort of philosophical objections to giving away my copyright, so I'm not sure that will actually be possible. Oh, that'd be interesting. I'd love to get you on maybe a panel talk about that sometime. Something I'd think about. Well, from a very simple point of view, I think that the copyright and the system works well with the existing license and without a license transfer, so I don't feel that the, sorry, without a copyright transfer, I don't feel that the copyright transfer is really a necessary step for taking things away from maintainers. It feels like asking the maintainers to give up on some of their copyright... Indeed. Yeah, I see where that's a little beyond our scope, but it's a fascinating topic and I appreciate your sharing your views there. I mean, that sounds like a whole topic of its own, frankly. Yeah. Corwin, do you want to fill the last question? Sure. So the question was, I almost missed this one, so glad I didn't. This may have been answered already.
[00:16:53.850] Q: What do you use for the in-buffer tables? Vtable?
What do you use for in-buffer tables? Do you use vtable? Yep. Thanks for the question. It is indeed vtable. However, it's not really vtable. It's a fork that I made, which is called pgmix table. because Vtable doesn't have exactly the right functionality in particular for recoloring rows when you add a row. So I've currently forked this. I'm thinking about giving those back as patches to Vtable, plausibly. I know that there is some ongoing work also on vTable in the core. So I'll have to look at what is plausible to feed back into the main version. All right, great. I think we are nearing the end of the Q&A. We are due to move to the next talk in about three minutes now. I can fill 30 seconds or a minute of that with I guess one more maybe back and forth and I'll try to be quicker this time. First of all, thanks for your kind remarks. But my question wasn't really about Windows so much, it was just how I'm relating... So have you, let me put it more simply, have you
[00:18:16.640] Integrating with Emacs 30?
started looking at integrating with Emacs 30 or with the master branch at all? Do you have any sense of how much work it's going to be for you to carry things forward there? I've tested it with the pre-release, yes. I mean, just a very basic testing and everything works perfectly. There's really no... There was no difference that I have noticed between 29.4 and the 30 pre-release on the aspects that I use at least in Emacs. Neato. That was it, Leo. Thanks for letting me back in for one more bite at the apple there. And I appreciate everybody tuning in and participating in the Q&A and this awesome talk. Thanks for your questions. That was great. Yeah, and thank you for answering them and for the presentation as well. So we'll be moving in about two minutes to the next talk, which is pre-recorded as well. Well, we didn't really give you the chance, Eric, to have the last word. So do you have any last word? please try it out, try out pgmacs and send some feedback that'll help improve it over time. Sure, great. Well, thank you so much, Eric, for taking the time to come to the conference, and we'll see you soon. Thank you. Bye, everyone. Bye. And we'll be live with the next talk in about 1 minute 30. So we'll take a little bit of a breather, go make some coffee, go take a bio break. We'll be back soon. See you in a bit.

Questions or comments? Please e-mail eric.marsden@risk-engineering.org

Back to the talks Previous by track: Fun things with GNU Hyperbole Next by track: Literate programming for the 21st Century Track: General