一九七�年代廉价的电子图像显示器出现之前,大型机的终端通常使用电传打字机(teleprinter)来跟用户交互;电传打字机的输出印在纸上,用户输入的字符就像打字机一样是删不掉的,而且用户输入什么就会立刻传给服务器;后来有了以电子显示器为输出设备的终端,一开始也只能一个字符一个字符地给服务端发信息,到七十年代末能一次给服务器发送一整行信息的「智能」终端才成为主流。此时键盘上才有了现代电脑用户觉得司空见惯(拿键盘当钢琴使的 HHKB Pro 2 用户请扭过头去)的方向键。而按下方向键给终端发送的是控制光标移动的命令,这些命令最初的表示方法是转义字串(escape sequence),也就是「我先说几个字符,说完这几个字符之后再说的那个字符请不要当作字面意思理解」。这个字符在 ANSI 标准里面排行第 27(0x1B),它是个看不见的字符,一般写「」来代表。而 ANSI 的终端机标准里面,光标上、下、右、左移动的指令分别规定为 [A,[B,[C,[D,其中方括号跟字母之间还可以插入一个数字来表示要移动几位。

你现在使用的终端模拟器,不管是 Terminal.app 还是 iTerm 2,其实都是在用软件模拟当年用硬件实现的终端,并且还在底层帮你把按下的方向键转化为能够用来移动光标的特定转义字串。编一个 C 程序,main 里只有一行 getchar(); 编译运行(或者先在 iTerm 里按 ctrl + v ),再按上下右左,屏幕上都会显示 ^[[A ^[[B ^[[C ^[[D。其中 ^[ 就代表 esc 字符(因为 ctrl + [ 输入的字符是 0x1B)。

而无论 bash、zsh 还是 OS X 系统自备的 Python shell,其实都是在底层将你按下方向键所产生的这三个字符按照 ANSI 标准理解为你要移动光标,并移动光标。这种「把三个字符按照 ANSI 标准理解为你要移动光标」,或者叫做「line editing」,的功能是如此常用,以至于人们写了专门的程序库来做这件事,它叫做 The GNU Readline Library 。

但问题在于,readline 采用 GPL v3 授权,这一授权要求所有使用 readline 的程序必须开源。在版权法执行得比我国好的国家里,这是个严重的问题,OS X 里面也就因此没有 readline 库。所以,如果你不去弄一份 GNU Readline,virtualenv(注:此处我把 pythonz 和 virtualenv 弄混了。virtualenv 并不能编译 Python,只是创建一份隔离开来的 Python 运行环境)你自己编译的 Python shell 就没有 line editing 功能;而如果你在创建虚拟环境的时候指定了这一自行编译的版本作为该环境的 Python,那么当你切换到那个环境的时候就会出现这样的问题。为了在不带 GNU Readline 的系统下给 Python 程序提供 line editing 功能,Python 提供了 https:// pypi.python.org/pypi/re adline 模块,以内嵌 GNU readline 库。更多信息可以读它的文档。

那么苹果 OS X 自带的 Python shell 是怎样实现 line editing 的呢?是用 BSD 授权的 Editline Library (libedit) 。

此外,也有可能是 virtualenv 没有正确地处理独立环境里的库——在 https:// pypi.python.org/pypi/vi rtualenv 一页上搜寻「readline」,可以看到不少都和 OS X 有关,所以应该确定自己在使用 virtualenv 的最新版本。

而 readline 提供的功能,除去按方向键移动光标,还包括比如 ctrl + a 到行首、ctrl + e 到行尾、alt + f 前进一个单词、alt + b 后退一个单词之类;如果觉得 Emacs 讨厌,还可以转用 vi key-binding。如何才能挖掘出 readline 的全部功能,就留给读者做为习题好了。

> 以及如何修复

easy_installreadline

python3.7shell显示行数_XShell远程CentOS7,Python3命令行下按方向键出现的乱码问题...相关推荐

  1. VMware15 centos7.9命令行字体放大

    VMware15 centos7.9命令行字体放大 查看字体命令:cd /lib/kbd/consolefonts 修改字体命令:setfont latarcyrheb-sun32 先输入第一行在输入 ...

  2. 编程打印如下形式的杨辉三角形,打印的杨辉三角形的行数n(不超过10行)要求由用户从键盘输入。要求按照如下函数原型进行编程,不能使用全局变量

    /* 6.3 编程打印如下形式的杨辉三角形,打印的杨辉三角形的行数n(不超过10行)要求由用户从键盘输入.要求按照如下函数原型进行编程,不能使用全局变量 1 1 1 1 2 1 1 3 3 1 1 4 ...

  3. SSH远程登录RaspberryPi命令行响应缓慢问题

    SSH远程登录RaspberryPi命令行响应缓慢问题 1. 问题 2. 分析 3. 解决 3.1 去掉PAM部分鉴权模块 3.2 去掉sshd的DNS设置 3.3 无线WiFi信号优化 方法一:if ...

  4. Git统计代码行数;Java实现统计代码行数,忽略空行、注释行

    前言 某天,产品叫我算下某个项目的代码行数,我一愣,这怎么统计?总不可能一个文件一个文件算吧?后面我找了下,git是可以统计提交到仓库的所有的代码的,不过有个问题,就是假如有些文件我不想算进去怎么办? ...

  5. python3命令需要使用命令行开发者工具_3 个 Python 命令行工具

    用 Click.Docopt 和 Fire 库写你自己的命令行应用. 有时对于某项工作来说一个命令行工具就足以胜任.命令行工具是一种从你的 shell 或者终端之类的地方交互或运行的程序.Git 和 ...

  6. Leetcode06.将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。

    文章目录 一.题目 二.数学规律法解题思路 1.特殊情况 2.进行周期分析 3.同行相邻点的位置分析 4.注意事项 5.代码实现 三.模拟法 一.题目 将一个给定字符串 s 根据给定的行数 numRo ...

  7. java读取csv文件的行数_JMeter 读取 CSV 文件数据行数

    在用 JMeter 做测试时,经常需要调用外部 CSV 文件的数据到脚本中使用,如果我们想对 CSV 文件中数据的行数进行统计,这个怎么做呢? 针对上面表格的数据,我们一起来学习一下如何统计数据行数吧 ...

  8. centos7使用命令行查看开机启动项和服务启动状态

    centos7使用命令行查看开机启动项和服务启动状态 查看开机启动项 查看单个服务开机启动状态 第一种grep方法 第二种命令行 查看哪些为开机启动的服务 查看开机启动项 systemctl list ...

  9. linux脚本求命令行上整数和,《Linux命令行与shell脚本编程大全》 第二十二章 学习札记...

    <Linux命令行与shell脚本编程大全> 第二十二章 学习笔记 第二十二章:使用其他shell 什么是dash shell Debian的dash shell是ash shell的直系 ...

最新文章

  1. LeetCode 206. 反转链表(Reverse Linked List) 16
  2. [转]不定义JQuery插件,不要说会JQuery
  3. deepin-wine-qq无法加载图片解决方案
  4. 创业公司这三年,Java老本都快吃完了!
  5. 1.13 总结-深度学习第三课《结构化机器学习项目》-Stanford吴恩达教授
  6. java 状态设计模式_JAVA设计模式:状态模式
  7. 非计算机专业教学改革,非计算机专业算法分析与设计教学改革论文
  8. 【uva 1395】Slim Span(图论--最小生成树+结构体快速赋值 模版题)
  9. C# 读取word2003 并且显示在界面上的方法
  10. 上海中环C位出道,自动驾驶天团横「扫」北上广
  11. 【转】使用并口控制笔记本软驱中的电机
  12. 「冰狐智能辅助」如何实现在线实时调试?
  13. 浅谈对程序员的认识_8年编程生涯回顾:谈谈我对程序员的理解
  14. it工种分类_什么是运维?运维工种有哪些
  15. python map函数的作用_python语言基础之map函数,urlib.request,多线程
  16. 在jsp页面上直接打开PDF文件
  17. post请求路径出错NET:ERR_CONNECTION_RESET
  18. 【你好,windows】Windows 7 X64 Ultimate繁体纯净版2020.3.15
  19. 客户端禁用Cookie后session失效的问题
  20. 概率论—贝叶斯定理 解析

热门文章

  1. 访问不了firefox附加组件页面怎么办
  2. 客户端触发PostBack回发的两种写法
  3. 创建一个单选框的html代码是,HTML试题(超有用).doc
  4. uc浏览器邀请码_UC密保手机不能用?冬树教你如何一招申诉成功!
  5. CSDN审核机制有点迷惑,决定逐步搬迁到简书
  6. Android8.0前后Camera架构对比(二十三)
  7. WSL2之kali安装界面kex
  8. webrtc之SVC实现(十)
  9. Ubuntu音频开发audacity(十)
  10. RabbitMQ之安装windows