资讯专栏INFORMATION COLUMN

Nodejs命令行光标位置的设置

Null / 1264人阅读

摘要:引子很多使用开发的工具都会提供一个命令行操作界面,这些工具在执行的过程中会实时更新执行进度或数据的下载解压缩进度等,例如,这些信息会再终端的同一行的同一位置显示,而不是一行一行逐次打印显示那么其是怎么实现的有没有相应地模块提供这个功能呢嗯,

引子

很多使用nodejs开发的工具都会提供一个命令行操作界面(CLI),这些工具在执行的过程中会实时更新执行进度或数据的下载解压缩进度等,例如10%,20%,30%...
这些信息会再终端的同一行的同一位置显示,而不是一行一行逐次打印显示......
那么其是怎么实现的?nodejs有没有相应地模块提供这个功能呢?

嗯,NodeJS中有的,它就是readline模块,这个模块提供了正行数据读取写入,终端提示符位置控制等API

实现的功能

本文章提供一个样例代码,主要说明终端提示符位置控制问题,把需要注意的点都列在其中了

终端字符显示宽度问题
终端界面能够显示的字符区域大小问题
终端当前提示符的位置问题
终端相同位置上内容实时更新的问题

这些问题在样例中都有涉及及说明到

使用nodejs的readline模块对命令行控制终端的提示符位置进行控制
模拟询问用户是否启动应用
启动应用后实时更新运行进度信息从1%~100%,此信息显示同一行的同一个位置

代码实现
    var readline = require("readline");
    var util=require("util");
    var inputStream=process.stdin;
    var outputStream=process.stdout;
    var rl = readline.createInterface({
        input: inputStream,
        output: outputStream,
        terminal:true
    });
    var promptStr="MyApp> ";
    
   
    //获得字符串实际长度,中文2,英文1
    //控制台中中文占用2个英文字符的宽度
    var getDisplayLength=function(str) {
        var realLength = 0, len = str.length, charCode = -1;
        for (var i = 0; i < len; i++) {
            charCode = str.charCodeAt(i);
            if (charCode >= 0 && charCode <= 128) realLength += 1;
            else realLength += 2;
        }
        return realLength;
    };
    
   
    //计算一个字符串在当前控制台中占用的行数和列数信息
    //outputStream.rows及outputStream.columns属性为当前控制台的显示的窗口的大写
    var getStrOccRowColumns=function(str){
        //str=promptStr+str;
        var consoleMaxRows=outputStream.rows;
        var consoleMaxColumns=outputStream.columns;
        var strDisplayLength=getDisplayLength(str);
        var rows=parseInt(strDisplayLength/consoleMaxColumns,10);
        var columns=parseInt(strDisplayLength-rows*consoleMaxColumns,10);
    
        return {
            rows:rows,
            columns:columns
        }
    
    };
    
    //console.log(getDisplayLength(promptStr));
    rl.setPrompt(promptStr);
    rl.prompt();
    
    rl.question("你想要个启动应用处理吗?", function(answer) {
        rl.prompt();
        rl.write(util.format("启动应用得到的回复为:%s
", answer));
        //更新同一个位置显示的字符信息,每1秒更新1一次,一直到100%
        var k= 0,max=100,prevOutputContent,outputContent,
        cursorDx=0,cursorDy= 0,dxInfo;
        //计算
        rl.prompt();
        var interval=setInterval(function(){
            if(k           
               
                                           
                       
                 

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/86031.html

相关文章

  • Linux快速学习-vi编辑器常用命令

    摘要:级版目录进入退出三种模式光标移动文本修改查找替换设置环境进入退出进入命令示例说明进入编辑器,类似于打开文本编辑器软件用编辑器打开文件  级版 目录1. 进入退出2. 三种模式3. 光标移动4. 文本修改5. 查找替换6. 设置环境1. 进入退出进入命令示例说明vi进入vi编辑器,类...

    stormzhang 评论0 收藏0
  • linux下vi使用笔记

    摘要:按屏幕往后移动半页。按移动到光标所在行的行首按光标跳到下个字的开头按光标跳到下个字的字尾按光标回到上个字的开头按光标移到该行的第个位置,如。例如,,表示移动光标至文章的第行行首。 01:查找和替换 例1:要找about字符串 /about 在命令行输入/后接要查找的字符串,下一个匹配按n(ext),上一个是N?about 在当前位置找,n跳到前一个匹配/about$ 匹配行尾的a...

    Awbeci 评论0 收藏0

发表评论

0条评论

Null

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<