Skip to content
This repository was archived by the owner on Sep 11, 2024. It is now read-only.

Commit db61d34

Browse files
committed
Add option to send/edit a message with Ctrl + Enter / Command + Enter
When editing multi-line text this option helps to prevent accidentally sending a message too early. With this option, Enter just inserts a new line. For example, composing programming code in a dev chat becomes much easier when Enter just inserts a new line instead of sending the message. Signed-off-by: Clemens Zeidler <[email protected]>
1 parent 83c2ae2 commit db61d34

File tree

5 files changed

+19
-4
lines changed

5 files changed

+19
-4
lines changed

src/components/views/rooms/EditMessageComposer.js

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,10 @@ import EditorStateTransfer from '../../../utils/EditorStateTransfer';
2929
import classNames from 'classnames';
3030
import {EventStatus} from 'matrix-js-sdk';
3131
import BasicMessageComposer from "./BasicMessageComposer";
32-
import {Key} from "../../../Keyboard";
32+
import {Key, isOnlyCtrlOrCmdKeyEvent} from "../../../Keyboard";
3333
import MatrixClientContext from "../../../contexts/MatrixClientContext";
3434
import {Action} from "../../../dispatcher/actions";
35+
import SettingsStore from "../../../settings/SettingsStore";
3536

3637
function _isReply(mxEvent) {
3738
const relatesTo = mxEvent.getContent()["m.relates_to"];
@@ -135,7 +136,10 @@ export default class EditMessageComposer extends React.Component {
135136
if (event.metaKey || event.altKey || event.shiftKey) {
136137
return;
137138
}
138-
if (event.key === Key.ENTER) {
139+
const ctrlEnterToSend = !!SettingsStore.getValue('MessageComposerInput.ctrlEnterToSend');
140+
const send = ctrlEnterToSend ? event.key === Key.ENTER && isOnlyCtrlOrCmdKeyEvent(event)
141+
: event.key === Key.ENTER;
142+
if (send) {
139143
this._sendEdit();
140144
event.preventDefault();
141145
} else if (event.key === Key.ESCAPE) {

src/components/views/rooms/SendMessageComposer.js

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,11 +39,12 @@ import * as sdk from '../../../index';
3939
import Modal from '../../../Modal';
4040
import {_t, _td} from '../../../languageHandler';
4141
import ContentMessages from '../../../ContentMessages';
42-
import {Key} from "../../../Keyboard";
42+
import {Key, isOnlyCtrlOrCmdKeyEvent} from "../../../Keyboard";
4343
import MatrixClientContext from "../../../contexts/MatrixClientContext";
4444
import {MatrixClientPeg} from "../../../MatrixClientPeg";
4545
import RateLimitedFunc from '../../../ratelimitedfunc';
4646
import {Action} from "../../../dispatcher/actions";
47+
import SettingsStore from "../../../settings/SettingsStore";
4748

4849
function addReplyToMessageContent(content, repliedToEvent, permalinkCreator) {
4950
const replyContent = ReplyThread.makeReplyMixIn(repliedToEvent);
@@ -122,7 +123,10 @@ export default class SendMessageComposer extends React.Component {
122123
return;
123124
}
124125
const hasModifier = event.altKey || event.ctrlKey || event.metaKey || event.shiftKey;
125-
if (event.key === Key.ENTER && !hasModifier) {
126+
const ctrlEnterToSend = !!SettingsStore.getValue('MessageComposerInput.ctrlEnterToSend');
127+
const send = ctrlEnterToSend ? event.key === Key.ENTER && isOnlyCtrlOrCmdKeyEvent(event)
128+
: event.key === Key.ENTER && !hasModifier;
129+
if (send) {
126130
this._sendMessage();
127131
event.preventDefault();
128132
} else if (event.key === Key.ARROW_UP) {

src/components/views/settings/tabs/user/PreferencesUserSettingsTab.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ export default class PreferencesUserSettingsTab extends React.Component {
3333
'MessageComposerInput.autoReplaceEmoji',
3434
'MessageComposerInput.suggestEmoji',
3535
'sendTypingNotifications',
36+
'MessageComposerInput.ctrlEnterToSend',
3637
];
3738

3839
static TIMELINE_SETTINGS = [

src/i18n/strings/en_EN.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -477,6 +477,7 @@
477477
"Enable big emoji in chat": "Enable big emoji in chat",
478478
"Send typing notifications": "Send typing notifications",
479479
"Show typing notifications": "Show typing notifications",
480+
"Use Ctrl + Enter to send a message (Mac: Command + Enter)": "Use Ctrl + Enter to send a message (Mac: Command + Enter)",
480481
"Automatically replace plain text Emoji": "Automatically replace plain text Emoji",
481482
"Mirror local video feed": "Mirror local video feed",
482483
"Enable Community Filter Panel": "Enable Community Filter Panel",

src/settings/Settings.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -321,6 +321,11 @@ export const SETTINGS: {[setting: string]: ISetting} = {
321321
displayName: _td("Show typing notifications"),
322322
default: true,
323323
},
324+
"MessageComposerInput.ctrlEnterToSend": {
325+
supportedLevels: LEVELS_ACCOUNT_SETTINGS,
326+
displayName: _td("Use Ctrl + Enter to send a message (Mac: Command + Enter)"),
327+
default: false,
328+
},
324329
"MessageComposerInput.autoReplaceEmoji": {
325330
supportedLevels: LEVELS_ACCOUNT_SETTINGS,
326331
displayName: _td('Automatically replace plain text Emoji'),

0 commit comments

Comments
 (0)