Skip to content

Commit 654f30b

Browse files
authored
Merge pull request #96 from alexyaroshuk/feat/break-line-hotkey-fork
feat(app): add "Send with Ctrl+Enter" option
2 parents 705c191 + bf110db commit 654f30b

19 files changed

Lines changed: 134 additions & 15 deletions

File tree

packages/app/src/components/prompt-input.tsx

Lines changed: 42 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ import { Persist, persisted } from "@/utils/persist"
3333
import { usePermission } from "@/context/permission"
3434
import { useLanguage } from "@/context/language"
3535
import { usePlatform } from "@/context/platform"
36+
import { useSettings } from "@/context/settings"
3637
import { useSessionLayout } from "@/pages/session/session-layout"
3738
import { createSessionTabs } from "@/pages/session/helpers"
3839
import { createTextFragment, getCursorPosition, setCursorPosition, setRangeEdge } from "./prompt-input/editor-dom"
@@ -117,6 +118,7 @@ export const PromptInput: Component<PromptInputProps> = (props) => {
117118
const permission = usePermission()
118119
const language = useLanguage()
119120
const platform = usePlatform()
121+
const settings = useSettings()
120122
const { params, tabs, view } = useSessionLayout()
121123
let editorRef!: HTMLDivElement
122124
let fileInputRef: HTMLInputElement | undefined
@@ -1229,22 +1231,47 @@ export const PromptInput: Component<PromptInputProps> = (props) => {
12291231
}
12301232

12311233
// Note: Shift+Enter is handled earlier, before IME check
1232-
if (event.key === "Enter" && !event.shiftKey) {
1233-
event.preventDefault()
1234-
if (event.repeat) return
1235-
if (
1236-
working() &&
1237-
prompt
1238-
.current()
1239-
.map((part) => ("content" in part ? part.content : ""))
1240-
.join("")
1241-
.trim().length === 0 &&
1242-
imageAttachments().length === 0 &&
1243-
commentCount() === 0
1244-
) {
1245-
return
1234+
const modEnter = event.ctrlKey || event.metaKey
1235+
const sendWithModEnter = settings.general.sendWithModEnter()
1236+
if (event.key === "Enter") {
1237+
if (sendWithModEnter) {
1238+
if (modEnter && !event.shiftKey) {
1239+
event.preventDefault()
1240+
if (event.repeat) return
1241+
if (
1242+
working() &&
1243+
prompt
1244+
.current()
1245+
.map((part) => ("content" in part ? part.content : ""))
1246+
.join("")
1247+
.trim().length === 0 &&
1248+
imageAttachments().length === 0 &&
1249+
commentCount() === 0
1250+
) {
1251+
return
1252+
}
1253+
void handleSubmit(event)
1254+
} else if (!modEnter && !event.shiftKey) {
1255+
addPart({ type: "text", content: "\n", start: 0, end: 0 })
1256+
event.preventDefault()
1257+
}
1258+
} else if (!event.shiftKey) {
1259+
event.preventDefault()
1260+
if (event.repeat) return
1261+
if (
1262+
working() &&
1263+
prompt
1264+
.current()
1265+
.map((part) => ("content" in part ? part.content : ""))
1266+
.join("")
1267+
.trim().length === 0 &&
1268+
imageAttachments().length === 0 &&
1269+
commentCount() === 0
1270+
) {
1271+
return
1272+
}
1273+
void handleSubmit(event)
12461274
}
1247-
void handleSubmit(event)
12481275
}
12491276
}
12501277

packages/app/src/components/settings-general.tsx

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -588,6 +588,26 @@ export const SettingsGeneral: Component = () => {
588588
</div>
589589
)
590590

591+
const InputSection = () => (
592+
<div class="flex flex-col gap-1">
593+
<h3 class="text-14-medium text-text-strong pb-2">{language.t("settings.general.section.input")}</h3>
594+
595+
<SettingsList>
596+
<SettingsRow
597+
title={language.t("settings.general.row.sendWithModEnter.title")}
598+
description={language.t("settings.general.row.sendWithModEnter.description")}
599+
>
600+
<div data-action="settings-send-with-mod-enter">
601+
<Switch
602+
checked={settings.general.sendWithModEnter()}
603+
onChange={(checked) => settings.general.setSendWithModEnter(checked)}
604+
/>
605+
</div>
606+
</SettingsRow>
607+
</SettingsList>
608+
</div>
609+
)
610+
591611
const NotificationsSection = () => (
592612
<div class="flex flex-col gap-1">
593613
<h3 class="text-14-medium text-text-strong pb-2">{language.t("settings.general.section.notifications")}</h3>
@@ -743,6 +763,8 @@ export const SettingsGeneral: Component = () => {
743763

744764
<AppearanceSection />
745765

766+
<InputSection />
767+
746768
<NotificationsSection />
747769

748770
<SoundsSection />

packages/app/src/context/settings.tsx

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ export interface Settings {
3131
showReasoningSummaries: boolean
3232
shellToolPartsExpanded: boolean
3333
editToolPartsExpanded: boolean
34+
sendWithModEnter: boolean
3435
showSessionProgressBar: boolean
3536
}
3637
updates: {
@@ -116,6 +117,7 @@ const defaultSettings: Settings = {
116117
showReasoningSummaries: false,
117118
shellToolPartsExpanded: false,
118119
editToolPartsExpanded: false,
120+
sendWithModEnter: false,
119121
showSessionProgressBar: true,
120122
},
121123
updates: {
@@ -229,6 +231,10 @@ export const { use: useSettings, provider: SettingsProvider } = createSimpleCont
229231
setEditToolPartsExpanded(value: boolean) {
230232
setStore("general", "editToolPartsExpanded", value)
231233
},
234+
sendWithModEnter: withFallback(() => store.general?.sendWithModEnter, defaultSettings.general.sendWithModEnter),
235+
setSendWithModEnter(value: boolean) {
236+
setStore("general", "sendWithModEnter", value)
237+
},
232238
showSessionProgressBar: withFallback(
233239
() => store.general?.showSessionProgressBar,
234240
defaultSettings.general.showSessionProgressBar,

packages/app/src/i18n/ar.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -553,6 +553,7 @@ export const dict = {
553553
"settings.desktop.wsl.title": "تكامل WSL",
554554
"settings.desktop.wsl.description": "تشغيل خادم OpenCode داخل WSL على Windows.",
555555
"settings.general.section.appearance": "المظهر",
556+
"settings.general.section.input": "الإدخال",
556557
"settings.general.section.notifications": "إشعارات النظام",
557558
"settings.general.section.updates": "التحديثات",
558559
"settings.general.section.sounds": "المؤثرات الصوتية",
@@ -570,6 +571,9 @@ export const dict = {
570571
"settings.general.row.font.description": "خصّص الخط المستخدم في كتل التعليمات البرمجية",
571572
"settings.general.row.terminalFont.title": "Terminal Font",
572573
"settings.general.row.terminalFont.description": "Customise the font used in the terminal",
574+
575+
"settings.general.row.sendWithModEnter.title": "إرسال باستخدام Ctrl+Enter",
576+
"settings.general.row.sendWithModEnter.description": "استخدم Ctrl+Enter (أو Cmd+Enter على Mac) لإرسال الرسائل بدلاً من Enter",
573577
"settings.general.row.uiFont.title": "خط الواجهة",
574578
"settings.general.row.uiFont.description": "خصّص الخط المستخدم في الواجهة بأكملها",
575579
"settings.general.row.followup.title": "سلوك المتابعة",

packages/app/src/i18n/br.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -560,6 +560,7 @@ export const dict = {
560560
"settings.desktop.wsl.title": "WSL integration",
561561
"settings.desktop.wsl.description": "Executar o servidor OpenCode dentro do WSL no Windows.",
562562
"settings.general.section.appearance": "Aparência",
563+
"settings.general.section.input": "Entrada",
563564
"settings.general.section.notifications": "Notificações do sistema",
564565
"settings.general.section.updates": "Atualizações",
565566
"settings.general.section.sounds": "Efeitos sonoros",
@@ -577,6 +578,9 @@ export const dict = {
577578
"settings.general.row.font.description": "Personalize a fonte usada em blocos de código",
578579
"settings.general.row.terminalFont.title": "Terminal Font",
579580
"settings.general.row.terminalFont.description": "Customise the font used in the terminal",
581+
582+
"settings.general.row.sendWithModEnter.title": "Enviar com Ctrl+Enter",
583+
"settings.general.row.sendWithModEnter.description": "Use Ctrl+Enter (ou Cmd+Enter no Mac) para enviar mensagens em vez de Enter",
580584
"settings.general.row.uiFont.title": "Fonte da interface",
581585
"settings.general.row.uiFont.description": "Personalize a fonte usada em toda a interface",
582586
"settings.general.row.followup.title": "Comportamento de acompanhamento",

packages/app/src/i18n/bs.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -624,6 +624,7 @@ export const dict = {
624624
"settings.desktop.wsl.description": "Pokreni OpenCode server unutar WSL-a na Windowsu.",
625625

626626
"settings.general.section.appearance": "Izgled",
627+
"settings.general.section.input": "Unos",
627628
"settings.general.section.notifications": "Sistemske obavijesti",
628629
"settings.general.section.updates": "Ažuriranja",
629630
"settings.general.section.sounds": "Zvučni efekti",
@@ -642,6 +643,9 @@ export const dict = {
642643
"settings.general.row.font.description": "Prilagodi font koji se koristi u blokovima koda",
643644
"settings.general.row.terminalFont.title": "Terminal Font",
644645
"settings.general.row.terminalFont.description": "Customise the font used in the terminal",
646+
647+
"settings.general.row.sendWithModEnter.title": "Pošalji sa Ctrl+Enter",
648+
"settings.general.row.sendWithModEnter.description": "Koristi Ctrl+Enter (ili Cmd+Enter na Mac) za slanje poruka umjesto Enter",
645649
"settings.general.row.uiFont.title": "UI font",
646650
"settings.general.row.uiFont.description": "Prilagodi font koji se koristi u cijelom interfejsu",
647651
"settings.general.row.followup.title": "Ponašanje nadovezivanja",

packages/app/src/i18n/da.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -619,6 +619,7 @@ export const dict = {
619619
"settings.desktop.wsl.description": "Kør OpenCode-serveren inde i WSL på Windows.",
620620

621621
"settings.general.section.appearance": "Udseende",
622+
"settings.general.section.input": "Input",
622623
"settings.general.section.notifications": "Systemmeddelelser",
623624
"settings.general.section.updates": "Opdateringer",
624625
"settings.general.section.sounds": "Lydeffekter",
@@ -637,6 +638,9 @@ export const dict = {
637638
"settings.general.row.font.description": "Tilpas skrifttypen, der bruges i kodeblokke",
638639
"settings.general.row.terminalFont.title": "Terminal Font",
639640
"settings.general.row.terminalFont.description": "Customise the font used in the terminal",
641+
642+
"settings.general.row.sendWithModEnter.title": "Send med Ctrl+Enter",
643+
"settings.general.row.sendWithModEnter.description": "Brug Ctrl+Enter (eller Cmd+Enter på Mac) til at sende beskeder i stedet for Enter",
640644
"settings.general.row.uiFont.title": "UI-skrifttype",
641645
"settings.general.row.uiFont.description": "Tilpas skrifttypen, der bruges i hele brugerfladen",
642646
"settings.general.row.followup.title": "Opfølgningsadfærd",

packages/app/src/i18n/de.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -569,6 +569,7 @@ export const dict = {
569569
"settings.desktop.wsl.title": "WSL-Integration",
570570
"settings.desktop.wsl.description": "OpenCode-Server innerhalb von WSL unter Windows ausführen.",
571571
"settings.general.section.appearance": "Erscheinungsbild",
572+
"settings.general.section.input": "Eingabe",
572573
"settings.general.section.notifications": "Systembenachrichtigungen",
573574
"settings.general.section.updates": "Updates",
574575
"settings.general.section.sounds": "Soundeffekte",
@@ -587,6 +588,9 @@ export const dict = {
587588
"settings.general.row.font.description": "Die in Codeblöcken verwendete Schriftart anpassen",
588589
"settings.general.row.terminalFont.title": "Terminal Font",
589590
"settings.general.row.terminalFont.description": "Customise the font used in the terminal",
591+
592+
"settings.general.row.sendWithModEnter.title": "Mit Ctrl+Enter senden",
593+
"settings.general.row.sendWithModEnter.description": "Verwende Ctrl+Enter (oder Cmd+Enter auf Mac) zum Senden von Nachrichten statt Enter",
590594
"settings.general.row.uiFont.title": "UI-Schriftart",
591595
"settings.general.row.uiFont.description": "Die im gesamten Interface verwendete Schriftart anpassen",
592596
"settings.general.row.followup.title": "Verhalten bei Folgefragen",

packages/app/src/i18n/en.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -727,6 +727,7 @@ export const dict = {
727727
"settings.desktop.wsl.description": "Run the OpenCode server inside WSL on Windows.",
728728

729729
"settings.general.section.appearance": "Appearance",
730+
"settings.general.section.input": "Input",
730731
"settings.general.section.advanced": "Advanced",
731732
"settings.general.section.notifications": "System notifications",
732733
"settings.general.section.updates": "Updates",
@@ -751,6 +752,9 @@ export const dict = {
751752
"settings.general.row.font.description": "Customise the font used in code blocks",
752753
"settings.general.row.terminalFont.title": "Terminal Font",
753754
"settings.general.row.terminalFont.description": "Customise the font used in the terminal",
755+
756+
"settings.general.row.sendWithModEnter.title": "Send with Ctrl+Enter",
757+
"settings.general.row.sendWithModEnter.description": "Use Ctrl+Enter (or Cmd+Enter on Mac) to send messages instead of Enter",
754758
"settings.general.row.uiFont.title": "UI Font",
755759
"settings.general.row.uiFont.description": "Customise the font used throughout the interface",
756760
"settings.general.row.followup.title": "Follow-up behavior",

packages/app/src/i18n/es.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -627,6 +627,7 @@ export const dict = {
627627
"settings.desktop.wsl.description": "Ejecutar el servidor OpenCode dentro de WSL en Windows.",
628628

629629
"settings.general.section.appearance": "Apariencia",
630+
"settings.general.section.input": "Entrada",
630631
"settings.general.section.notifications": "Notificaciones del sistema",
631632
"settings.general.section.updates": "Actualizaciones",
632633
"settings.general.section.sounds": "Efectos de sonido",
@@ -645,6 +646,9 @@ export const dict = {
645646
"settings.general.row.font.description": "Personaliza la fuente usada en bloques de código",
646647
"settings.general.row.terminalFont.title": "Terminal Font",
647648
"settings.general.row.terminalFont.description": "Customise the font used in the terminal",
649+
650+
"settings.general.row.sendWithModEnter.title": "Enviar con Ctrl+Enter",
651+
"settings.general.row.sendWithModEnter.description": "Usa Ctrl+Enter (o Cmd+Enter en Mac) para enviar mensajes en lugar de Enter",
648652
"settings.general.row.uiFont.title": "Fuente de la interfaz",
649653
"settings.general.row.uiFont.description": "Personaliza la fuente usada en toda la interfaz",
650654
"settings.general.row.followup.title": "Comportamiento de seguimiento",

0 commit comments

Comments
 (0)