diff --git a/apps/web/src/oj/learn/components/CodeRunBlock.vue b/apps/web/src/oj/learn/components/CodeRunBlock.vue
index 4f32afa..3aa3bee 100644
--- a/apps/web/src/oj/learn/components/CodeRunBlock.vue
+++ b/apps/web/src/oj/learn/components/CodeRunBlock.vue
@@ -10,6 +10,8 @@ import { explainRuntimeError } from "oj/problem/utils/runtimeError"
import { useAuthModalStore } from "shared/store/authModal"
import { useUserStore } from "shared/store/user"
import { mainWrapExtensions, wrapMain } from "../wrapMain"
+import { hangWrapExtensions } from "../hangIndent"
+import { useBreakpoints } from "shared/composables/breakpoints"
const CodeEditor = defineAsyncComponent(() => import("shared/components/CodeEditor.vue"))
@@ -35,7 +37,12 @@ const message = useMessage()
const { copy } = useClipboard({ legacy: true })
const original = computed(() => (props.wrapMain ? wrapMain(props.code) : props.code))
-const extensions = computed(() => (props.wrapMain ? mainWrapExtensions : []))
+const { isDesktop } = useBreakpoints()
+// 手机上折行(见 hangIndent.ts);桌面正文 720 宽,长行少,照旧横着滚
+const extensions = computed(() => [
+ ...(props.wrapMain ? mainWrapExtensions : []),
+ ...(isDesktop.value ? [] : hangWrapExtensions),
+])
const value = ref(original.value)
const input = ref("")
const running = ref(false)
diff --git a/apps/web/src/oj/learn/components/ExerciseDebug.vue b/apps/web/src/oj/learn/components/ExerciseDebug.vue
index 8b5a7a1..bc96d16 100644
--- a/apps/web/src/oj/learn/components/ExerciseDebug.vue
+++ b/apps/web/src/oj/learn/components/ExerciseDebug.vue
@@ -2,6 +2,7 @@
import ExerciseResult from "./ExerciseResult.vue"
import type { Exercise, ExerciseDebugData } from "utils/types"
import { highlightLines } from "shared/highlight"
+import { hangStyle } from "../hangIndent"
const props = defineProps<{ exercise: Exercise; lang?: string }>()
const emit = defineEmits<{
@@ -93,7 +94,7 @@ function reset() {
+ > +
- 这段代码会输出什么?
+ ++ 这段代码会输出什么? +
+