多行输入
详解 Claude Code 在交互模式下的多行输入方式,包括 Shift+Enter、三引号、文件输入和 heredoc,解决长 prompt 被截断和粘贴错乱的问题。
打字两行就敲回车,Claude Code 会立刻把这两行当成一个完整 prompt 发出去——这是大多数新人第一次写复杂 prompt 时的痛点。多行输入有好几种姿势,每种适合不同场景。
这篇文章把单行输入和多行输入的差异说清楚,然后逐个介绍 Shift+Enter、三引号、heredoc、文件输入这几种方式。
单行 vs 多行:默认行为
Claude Code 的输入框默认是”单行模式”——按一次 Enter 就提交。这和大多数 chat 界面一致。
# 单行 prompt:直接 Enter 提交
> 解释一下闭包是什么[Enter]
# 错误的多行尝试:每按一次 Enter 都立刻发送
> 看下这段代码[Enter] ← 这一行就发出去了
function foo() {[Enter] ← 这一行又发出去了
}[Enter] ← 还是单独一条
要在一条消息里塞多行内容,必须明确告诉 Claude Code “这个换行别提交”。下面是几种做法。
方式一:Shift+Enter(最常用)
按住 Shift 再按 Enter,光标会换到下一行,但不提交。
> 帮我审查下面这段代码:[Shift+Enter]
function calculateTotal(items) {[Shift+Enter]
return items.reduce((sum, item) => {[Shift+Enter]
return sum + item.price;[Shift+Enter]
}, 0);[Shift+Enter]
}[Shift+Enter]
[Shift+Enter]
有什么可以优化的地方?[Enter]
整段会作为一条消息发给 Claude。
终端兼容性
| 终端 | Shift+Enter 是否原生支持 |
|---|---|
| iTerm2 (macOS) | 支持,但要在 Profile → Keys 里检查没被劫持 |
| Terminal.app (macOS) | 支持 |
| Windows Terminal | 较新版本支持 |
| GNOME Terminal | 支持 |
| Konsole | 支持 |
| Alacritty | 支持 |
| WezTerm | 支持 |
| 老版本 PuTTY | 不支持,按了会直接提交 |
| 大部分 SSH 客户端 | 取决于客户端配置 |
不支持时的备选键位
某些终端可以试试:
Alt+Enter # GNOME 系常用
Ctrl+J # 更老的 Unix 习惯,等价于 LF
Option+Enter # macOS 某些配置
如果都不行,看后面的 """ 三引号方案。
方式二:三引号 """ 多行字符串
在输入框输入 """ 然后按 Enter,Claude Code 会进入”多行模式”——你后面输的所有 Enter 都不会立刻提交,直到你再敲一行 """ 单独的三引号才结束。
> """
> 帮我重构下面的代码,要求:
> 1. 把回调改成 async/await
> 2. 错误用 try/catch 处理
> 3. 加上 JSDoc 注释
>
> function fetchUser(id, callback) {
> db.query('SELECT * FROM users WHERE id = ?', [id], (err, rows) => {
> if (err) return callback(err);
> callback(null, rows[0]);
> });
> }
> """
[Enter]
# 此时整段才提交
""" 模式 vs Shift+Enter 的对比
| 维度 | """ 三引号 | Shift+Enter |
|---|---|---|
| 终端兼容性 | 几乎全部支持 | 取决于终端 |
| 视觉提示 | 进入多行模式后提示符可能变化 | 没有特殊视觉变化 |
| 写错了改 | 还在多行模式里可以继续编辑 | 同样可以编辑 |
| 适合的场景 | 远程 SSH、终端不支持 Shift+Enter | 本地开发、键位顺手 |
| 粘贴大段代码 | 适合(粘贴前先输入 """) | 也行(取决于终端 bracketed paste) |
""" 的常见坑
坑 1:忘了关闭 """ 就一直在多行模式里。
如果你提示符变成奇怪的样子,敲了 Enter 也不发送,先敲一行单独的 """ 试试,或者按 Ctrl+C 取消。
坑 2:内容里本身有 """。
比如你在让 Claude 看一段 Python 文档字符串:
def foo():
"""
这是文档字符串
"""
pass
直接粘进 """ 模式里,Claude Code 会把里面的 """ 当成结束符提前关闭。这种情况建议用 Shift+Enter 或者文件输入。
方式三:通过文件输入
一段超长的 prompt(几百上千行),在终端里贴和编辑都很别扭。直接放文件里更舒服。
claude < file.md:把文件作为输入
# 写一个 prompt 文件
cat > prompt.md <<'EOF'
请按以下步骤分析这个项目:
1. 读取 src/ 目录的整体结构
2. 找出所有有 TODO 注释的地方
3. 评估每个 TODO 的优先级
4. 输出 markdown 表格
分析时请注意:
- 不要修改任何文件
- 输出语言用中文
- 优先级用 P0/P1/P2 表示
EOF
# 把文件内容作为 prompt 启动 Claude
claude < prompt.md
这种方式 Claude 进入交互模式之后,文件内容已经作为第一条 prompt 发出去了,你可以接着对话。
claude -p < file.md:非交互模式跑
如果只想让它跑一次然后退出,加 -p:
claude -p < prompt.md
# Claude 输出结果后直接退出,不进入交互
适合写脚本、CI 跑批处理任务。
cat | claude:管道输入
# 把代码文件内容作为 prompt 一部分
cat src/main.go | claude -p "解释下面这段代码"
注意:管道输入和命令行 prompt 会拼起来,Claude 看到的是 prompt + 文件内容。
方式四:heredoc(适合写脚本)
shell 的 heredoc 语法在脚本里特别好用:
#!/bin/bash
claude -p <<'EOF'
请帮我做以下事情:
1. 检查 package.json 里的依赖有没有过期
2. 列出有 major 版本更新的包
3. 评估升级风险
4. 输出升级建议
输出格式:
- 包名
- 当前版本 → 最新版本
- 风险等级 (low/medium/high)
- 升级建议
EOF
<<'EOF' 用单引号包住 EOF,里面的 $ 不会被 shell 展开。如果你不需要 shell 变量替换,永远用 'EOF' 不要用 EOF,否则 prompt 里的 $variable 会被错误替换。
带变量的 heredoc
需要把 shell 变量传进 prompt 时,去掉单引号:
#!/bin/bash
PROJECT_DIR="src/"
TARGET_LANG="TypeScript"
claude -p <<EOF
请把 $PROJECT_DIR 目录下的代码全部转成 $TARGET_LANG。
保留原有的注释。
EOF
输出的 prompt 是:
请把 src/ 目录下的代码全部转成 TypeScript。
保留原有的注释。
但要小心 prompt 内容里如果有 $、`、\ 等特殊字符,会被 shell 处理。
方式五:剪贴板粘贴
粘贴大段内容是最常见的多行输入方式。Claude Code 默认开启 Bracketed Paste 模式,多行内容能正确保留换行而不会被一次次提交。
# 1. 在编辑器里复制一段长 prompt
# 2. 切到 Claude Code 输入框
# 3. Ctrl+Shift+V(Linux/Windows)或 Cmd+V(macOS)
> 这是一段[多行内容会原样进来,
> 不会被一行行提交,
> 直到你按 Enter 才发送]
Bracketed Paste 没生效怎么办
症状:粘贴的内容每行都被立刻执行(=立刻提交)。
排查:
# 检查终端是否支持
echo $TERM
# 应该是 xterm-256color, screen-256color, tmux-256color 之类
# 在 ~/.inputrc 强制启用
set enable-bracketed-paste on
# tmux 用户检查 .tmux.conf
set -g set-clipboard on
如果排查不出来,最稳妥的方法:先输入 """ 进入多行模式再粘贴。
长 prompt 被截断:原因和解决
症状: 你贴了 3000 字的 prompt,发现 Claude 只看到了开头一段,后面的全没收到。
可能原因:
1. 终端 readline 缓冲区限制
某些终端的输入行长度有上限(4096 字节常见)。一行贴超过会被截断。
解决: 用 """ 让内容分多行,或者文件输入。
2. 内容里有特殊控制字符
复制的内容里混入了不可见字符(终端控制序列、零宽字符),会让输入行为异常。
# 用 cat -A 检查粘贴内容的特殊字符
cat -A prompt.txt
# 看到一堆 ^[、M-^[ 之类的就是有控制字符
解决: 先放文件里,用 tr 清理:
cat dirty_prompt.txt | tr -d '\000-\010\013\014\016-\037' > clean_prompt.txt
claude < clean_prompt.txt
3. Token 上限
prompt 太长(几万 token),可能超过模型上下文。Claude Code 会做压缩或拒绝。
解决:
- 先
/compact压缩一下历史,腾出空间 - 把超长的内容拆成几条消息分批发
- 用文件,让 Claude 用 Read 工具按需读取
# 不要把整个 10 万行的日志直接贴进 prompt
# 改成:
> 我把日志放在 /tmp/error.log 了,请用 Read 工具读取并分析
4. 网络层 buffer 问题
极少数情况下,慢网络 + 大请求会让某些代理把请求截断。
解决: 检查是否走了奇怪的代理;同事如果都正常只你不行,先排查网络。
实战示例:贴一个完整文件给 Claude 改
场景:要让 Claude 重构一个 500 行的 Python 文件。
做法 1:文件输入(推荐)
# 起一个空对话
claude
# 在对话里说
> 请读取 src/legacy.py 并重构,要求:
> - 函数式风格
> - 加类型标注
> - 保留 docstring
# Claude 会用 Read 工具自己读,比贴更省 token
做法 2:贴源码(次推荐)
# 切到包含源码的目录
$ pbcopy < src/legacy.py # macOS
$ xclip -sel clip < src/legacy.py # Linux
# 在 Claude 对话里
> 请重构下面的代码:
> [Shift+Enter]
> [Ctrl+Shift+V 粘贴]
> [Shift+Enter]
> 要求:函数式风格 + 类型标注[Enter]
做法 3:脚本批处理
#!/bin/bash
for f in src/*.py; do
echo "处理 $f..."
claude -p <<EOF > "${f%.py}_refactored.py"
请重构下面的 Python 代码,输出重构后的完整代码(不要解释):
$(cat "$f")
EOF
done
常见问题
Q:我贴完代码后 Claude 把我的 prompt 和代码混在一起理解错了。
A:用 markdown 代码块明确分隔:
> 请帮我审查下面的代码:[Shift+Enter]
> [Shift+Enter]
> ```python[Shift+Enter]
> def foo():[Shift+Enter]
> pass[Shift+Enter]
> ```[Shift+Enter]
> [Shift+Enter]
> 看看有没有性能问题。[Enter]
或者用三个反引号 + 语言标签明确告诉 Claude 这是代码。
Q:多行模式下我想取消,按 Ctrl+C 会退出整个 Claude 吗?
A:按一次 Ctrl+C 只是中断当前输入,不会退 Claude(除非连按两次)。也可以按 Esc 取消。
Q:粘贴时换行被替换成空格了。
A:终端没开 Bracketed Paste,参考前面”Bracketed Paste 没生效怎么办”。
Q:能不能在多行 prompt 里嵌套引用别的对话?
A:直接复制粘贴对方的对话内容到你的 prompt 里就行。Claude 看到的就是文本。
快速参考
单行 直接打字 + Enter
换行不提交 Shift+Enter(首选)
多行模式开关 """ ... """
文件 → prompt claude < file.md
管道输入 echo "..." | claude -p
heredoc claude -p <<'EOF' ... EOF
粘贴大段内容 Ctrl+Shift+V(Bracketed Paste)
取消多行输入 Ctrl+U(清空)/ Esc / Ctrl+C
标记本节教程为已读
记录您的学习进度,方便后续查看。