You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js如何跨平台获取终端当前光标位置?

Node.js 跨平台终端光标位置操作方案

核心结论

Node.js 原生未提供process.stdout.x、process.stdout.y这类直接读取光标坐标的属性,但可以通过内置模块和标准ANSI转义序列实现完全跨平台的光标操作需求,不需要依赖Linux专属方案或者第三方库。

两种适配需求的实现方式

方案1:无需主动获取坐标,直接实现「修改指定位置后恢复光标」

这是最简便的方案,直接用终端标准的光标保存/恢复转义序列即可,性能更高,逻辑更简单:

// 1. 先保存当前光标位置
process.stdout.write('\x1B[s')

// 2. 移动光标到你要更新的目标坐标,注意x、y均从1开始计数
const targetX = 5
const targetY = 3
process.stdout.write(`\x1B[${targetY};${targetX}H`)

// 3. 写入你要更新的内容
process.stdout.write('新的内容')

// 4. 恢复到之前保存的光标位置
process.stdout.write('\x1B[u')

方案2:主动获取当前光标坐标

如果确实需要拿到当前的x、y坐标值,可以通过内置readline模块配合光标查询转义序列实现:

const readline = require('readline')

function getCursorPos() {
  return new Promise((resolve) => {
    const rl = readline.createInterface({
      input: process.stdin,
      output: process.stdout
    })
    // 发送查询光标位置的指令
    process.stdout.write('\x1B[6n')
    process.stdin.once('data', (buf) => {
      const res = buf.toString().match(/\[(\d+);(\d+)R/)
      rl.close()
      resolve(res ? {
        y: parseInt(res[1], 10),
        x: parseInt(res[2], 10)
      } : null)
    })
  })
}

// 调用示例
async function main() {
  const pos = await getCursorPos()
  console.log('当前光标坐标:', pos)
}
main()

注意事项

  • 上述方案仅在TTY终端环境下生效,可通过process.stdout.isTTY提前判断环境是否支持
  • Windows系统下Node.js默认已兼容ANSI转义序列,无需额外配置

内容的提问来源于stack exchange,提问作者David Alsh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 12:15:03