Claude Code输入交互模式

多行输入

详解 Claude Code 在交互模式下的多行输入方式,包括 Shift+Enter、三引号、文件输入和 heredoc,解决长 prompt 被截断和粘贴错乱的问题。

· 阅读约 11 分钟

打字两行就敲回车,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

标记本节教程为已读

记录您的学习进度,方便后续查看。