Clarifications
- This works most of the time. Sometimes it doesn't. Needs a bit more testing.
- the new version of Lemmy (link to PR) will have a few shortcuts, and this userscript will be deprecated. But until then, I will keep using it.
Original post:
cross-posted from: https://sh.itjust.works/post/42893
Decided to make a little script that listens to textareas in post & comments, and if you press Ctrl Enter while focusing on them, it submits them. I use this to post comments faster and with less bother. It's reminiscent of the RES feature to do the same thing.
If you use Greasemonkey or Tampermonkey, you can install this easily and instantly have CtrlEnter to submit. Let me know any improvements I can make.
// ==UserScript== // @name Lemmy Form Submit with Ctrl+Enter // @version 1.0 // @description Submit forms with Ctrl+Enter in Lemmy instances so you don't have to click the button every time you want to post something. // @author God (https://sh.itjust.works/u/god) // @match https://*/post/* // @match https://*/comment/* // @icon https://join-lemmy.org/static/assets/icons/favicon.svg // ==/UserScript== var isLemmy = document.head.querySelector("[name~=Description][content]").content === "Lemmy"; if (isLemmy) { // Define a global variable to keep track of the currently focused textarea. var currentFocusedTextarea = null; // Function to attach focus and blur event handlers to all textareas. function attachEventHandlers() { document.querySelectorAll("textarea").forEach((textarea) => { if (!textarea.dataset.ctrlEnterHandled) { textarea.dataset.ctrlEnterHandled = true; // Check if this textarea is currently focused const wasFocused = document.activeElement === textarea; textarea.addEventListener("focus", function () { currentFocusedTextarea = this; }); textarea.addEventListener("blur", function () { currentFocusedTextarea = null; }); // If this textarea was focused, blur and re-focus it to ensure event handlers get triggered if (wasFocused) { textarea.blur(); textarea.focus(); } } }); } // Attach a keydown event handler to the entire document. document.addEventListener("keydown", function (event) { // If Ctrl + Enter is pressed if (event.ctrlKey && event.key === "Enter") { // If a textarea is focused and contains text if ( currentFocusedTextarea && currentFocusedTextarea.value.trim() !== "" ) { // Your submit logic here handleSubmit(currentFocusedTextarea); } } }); function handleSubmit(textarea) { // find the closest type="submit" button and press it. textarea.closest("form").querySelector('[type="submit"]').click(); } // Call the function initially to cover textareas that exist when the page is first loaded. attachEventHandlers(); // Observe the document for changes and reattach event handlers when new textareas are added. const observer = new MutationObserver(function (mutations) { mutations.forEach((mutation) => { if (mutation.type === "childList") { attachEventHandlers(); } }); }); observer.observe(document.body, { childList: true, subtree: true }); }