过早发布的尴尬失误

我似乎在各种非聊天类的应用中患上了“过早发送”的毛病。

主要是在电子邮件(Gmail)和 Discourse 中。

发生的情况是,我写完信息,然后不小心就发送出去了。这种不便发生得太频繁了,超出了我的接受范围,这很可能是因为一个键盘快捷键,比如 \text{Ctrl} + \text{Enter},或者(可能更常见的是?)$\text{Tab ↹} 然后 \text{Enter}$。

在 Gmail 上我可以应对:有一个很短的时间窗口可以取消邮件发送。太棒了!:raising_hands: 为了完全避免在写作时发送帖子,我不会填写收件人输入框。我会在发送邮件前最后一步才做这件事。

但在 Discourse 上,对于非私信(PM),这是不可能的。我试过从“分类”选择器中移除默认分类,这样发送帖子时我可能会遇到“分类不能为空”的消息,但唉,我做不到。

过早提交一个主题或回复是很尴尬的。我可以立即删除它,但内容仍然对其他人可见(他们只需点击编辑图标),因为这是 Discourse 的默认行为。而且我无法在它被删除时完成内容,以便之后撤销删除。

最后,我只能选择让我的帖子保持不完整(通常是在一个句子或一个单词中间 :woozy_face:),然后耐心地编辑它,我不太喜欢这样做,因为我写字也慢,或者我删除它,然后写一个新的主题/帖子来代替。

由于这种情况经常发生在长消息上,或者是我需要深思熟虑的消息上,我很高兴能有一个可切换的锁定 :locked_with_pen: 图标,可以完全阻止消息发送。

我并不是特别建议在 Discourse 中添加这个功能……除非很多用户也遇到这种情况 :smile:

这更多是关于分享这种经历,以及在 Discourse 中过早发送帖子所带来的后续尴尬,听取其他成员的意见,并分享防止这种情况发生的想法。

至于我自己,即使是一个用户脚本(userscript)也能解决问题。不幸的是,我不知道如何阻止 Discourse 的键盘快捷键发送帖子,人工智能也不知道。
编辑:请看 The awkward mishap of premature posting - #10 by Canapin

你是否也受到过早发送的困扰?

  • 是的
  • 不是
0 voters

你是否希望能够在 Discourse 中“锁定”编辑器?

  • 是的(内置功能)
  • 是的(第三方)
  • 不——我喜欢冒险
0 voters

期待听到你们的想法!

5 个赞

我也是——在使用触摸屏时。非常烦人。

2 个赞

这太有共鸣了。在 Chat[1] 中也会发生这种情况。有时我希望有一个确认弹出窗口或一个 10 秒的窗口来进行永久删除。


  1. 即 Discourse 中的聊天 ↩︎

4 个赞

对我来说,过早发布的情况并不常见(我 99% 的时间都在使用桌面版),但我能理解那种尴尬。是否可以给用户一个很短的时间来隐藏他们的帖子以便进一步编辑——也许只有在没有回复的情况下?

编辑:当然,那样也无法隐藏编辑历史记录…… :sweat_smile:

2 个赞

我尊重它,但没有亲身体验过。我更喜欢编辑宽限期,因为这样我可以随意重读和校对,而且一旦一个重要的大帖子发布了,我仍然会发现错误。编辑能很好地掩盖我的“罪行”。

人各有异,犯错也各有不同。

1 个赞

我使用外部编辑器来填写任何较长的网站字段,这当然也包括 Discourse 帖子。在编辑器中,我拥有我所有常用的程序员编辑器快捷键绑定,所以它在各个方面都更好。只有当我确定文本完成后,我才会使用复制粘贴将其传输到编辑器中,然后按下那个大按钮。

您考虑过这种工作流程吗?

2 个赞

看到很多不同的经历很有趣。我从不在智能手机上发帖出错,只在桌面上会。

是的,我在其他场景下会使用它。我先在 Google Docs 上写好消息,然后再复制粘贴到目标消息应用程序中。

但在 Discourse 上,如果我需要在帖子中添加图片、引用或使用特定于 Discourse 的功能时,会有点烦人。


我已经写草稿好几天了,每次修改它都总是一种有点紧张的体验,我需要时刻保持格外小心,以免发送出去。:lolsob:

1 个赞

当我写一篇较长的帖子时,我使用类似的解决方案。但由于我正试图停止使用 Google 等服务,并且主要在 iPad 上工作,我的工具是 Ulysses 应用。主要是因为它支持 Markdown。一种与 Discourse 使用的语法不完全相同的语法。

我对这一点有复杂的感受。一方面,我不喜欢需要分离应用程序(但我也将其用于 WordPress;现在在那里创建内容很痛苦),但另一方面,我拥有一个稍微更强大和集中的环境。

这对我是个大问题吗?不,这只是令人恼火。当 Discourse 更改了留下未成熟作品的样式时,情况更糟,我因为肌肉记忆丢失了太多草稿 :zany_face:

1 个赞

一个可能的解决方法是给自己发一个私信(PM)作为草稿。即使不小心发送了,也不会造成任何伤害,因为它只对你自己可见 :slight_smile:

2 个赞

这是一个添加了可切换锁定功能的撰写器(composer)的用户脚本。
它还会禁用键盘快捷键,并且也适用于移动设备。

IXlc8u1sm4

https://greasyfork.org/en/scripts/566254-discourse-composer-safety-lock

添加或删除 @match 行以在你使用的论坛上启用它。

// ==UserScript==
// @name         Discourse Composer Safety Lock
// @namespace    https://meta.discourse.org
// @version      2.0
// @description  Togglable padlock on the composer to prevent accidental post submission
// @author       Canapin & AI
// @match        https://meta.discourse.org/*
// @grant        none
// @license MIT
// ==/UserScript==
(function () {
  "use strict";
 
  let locked = false;
 
  // Capture-phase listener on #reply-control to block Ctrl/Cmd/Alt+Enter
  function attachBlocker(replyControl) {
    if (replyControl._safetyLockAttached) return;
    replyControl._safetyLockAttached = true;
 
    replyControl.addEventListener(
      "keydown",
      function (e) {
        if (!locked) return;
        if (e.key === "Enter" && (e.ctrlKey || e.metaKey || e.altKey)) {
          e.stopImmediatePropagation();
          e.stopPropagation();
          e.preventDefault();
        }
      },
      true
    );
  }
 
  function updateButtons() {
    const rc = document.getElementById("reply-control");
    if (!rc) return;
    rc.querySelectorAll(".save-or-cancel .btn-primary").forEach((btn) => {
      if (locked) {
        btn.style.pointerEvents = "none";
        btn.style.filter = "grayscale(1) opacity(0.4)";
        btn.setAttribute("tabindex", "-1");
      } else {
        btn.style.pointerEvents = "";
        btn.style.filter = "";
        btn.removeAttribute("tabindex");
      }
    });
  }
 
  // Capture-phase click blocker on save button
  document.addEventListener(
    "click",
    function (e) {
      if (!locked) return;
      if (e.target.closest(".save-or-cancel .btn-primary")) {
        e.stopImmediatePropagation();
        e.stopPropagation();
        e.preventDefault();
      }
    },
    true
  );
 
  // Capture-phase keydown blocker for Enter on focused save button
  document.addEventListener(
    "keydown",
    function (e) {
      if (!locked) return;
      if (
        e.key === "Enter" &&
        e.target.closest(".save-or-cancel .btn-primary")
      ) {
        e.stopImmediatePropagation();
        e.stopPropagation();
        e.preventDefault();
      }
    },
    true
  );
 
  function injectPadlock() {
    if (document.getElementById("composer-lock-btn")) return;
    const title = document.querySelector(".composer-action-title");
    if (!title) return;
 
    const btn = document.createElement("span");
    btn.id = "composer-lock-btn";
    btn.textContent = locked ? "\u{1F512}" : "\u{1F513}";
    btn.style.cssText =
      "cursor:pointer;margin-left:10px;font-size:1.1em;user-select:none;opacity:" +
      (locked ? "1" : "0.5");
 
    btn.addEventListener("click", (e) => {
      e.preventDefault();
      e.stopPropagation();
      locked = !locked;
      btn.textContent = locked ? "\u{1F512}" : "\u{1F513}";
      btn.style.opacity = locked ? "1" : "0.5";
      updateButtons();
    });
 
    title.appendChild(btn);
    updateButtons();
  }
 
  const observer = new MutationObserver(() => {
    const rc = document.getElementById("reply-control");
    if (rc && rc.classList.contains("open")) {
      attachBlocker(rc);
      injectPadlock();
      updateButtons();
    }
  });
 
  observer.observe(document.body, {
    childList: true,
    subtree: true,
    attributes: true,
    attributeFilter: ["class"],
  });
 
  const rc = document.getElementById("reply-control");
  if (rc && rc.classList.contains("open")) {
    attachBlocker(rc);
    injectPadlock();
    updateButtons();
  }
})();
5 个赞

我通常不会遇到这个问题。不确定为什么!不过,我确实有过不小心发送电子邮件的情况——更常见的是,在发送邮件后我马上会产生疑问(收件人错误?信息遗漏?),我非常庆幸 Gmail 在几秒钟内提供了“撤销发送”链接来解除我的疑虑。但这并不经常发生。

所以,发布时也许可以有类似的功能。发布后有几秒钟的时间可以点击“哎呀,这不该这么发出去”的按钮。

我经常因为 shift-enter ctrl-enter 快捷键而这样做。

不是大问题,我只是编辑帖子。

对于敏感内容,我先在单独的编辑器中撰写,然后粘贴到应用程序中再发送。

我使用了我在元(meta)上发布的那个用户脚本,它真的让我在写作时感到安心!

现在我更希望(比以前更希望)有一个内置的功能 :face_with_tongue:

但我看到设计师已经发话了!

image

:laughing:

1 个赞

我做了一个简单的TC来实现这个功能,并在编辑器中添加了一个锁定/解锁按钮。

稍后会发布Meta主题。

1 个赞