在我们的关于 shell 基础的指导下, 得到一个更灵活,功能更强大且多彩的命令行界面为何要这样做?使得在 shell 提示符下过得更轻松,高效在失去连接后恢复先前的会话Stop pushing around that fiddly rodent!这是我的命令行提示符的设置。对于这个小的终端窗口来说，这或许有些长。但你可以根据你的喜好来调整它。作为一个 Linux 用户, 你可能熟悉 shell (又名为命令行)。 或许你需要时不时的打开终端来完成那些不能在 GUI 下处理的必要任务，抑或是因为你处在一个将窗口铺满桌面的环境中，而 shell 是你与你的 linux 机器交互的主要方式。在上面那些情况下，你可能正在使用你所使用的发行版本自带的 Bash 配置。 尽管对于大多数的任务而言，它足够好了，但它可以更加强大。 在本教程中，我们将向你展示如何使得你的 shell 提供更多有用信息、更加实用且更适合工作。 我们将对提示符进行自定义，让它比默认情况下提供更好的反馈，并向你展示如何使用炫酷的 tmux 工具来管理会话并同时运行多个程序。 并且，为了让眼睛舒服一点，我们还将关注配色方案。那么，进击吧，少女！让提示符更美妙大多数的发行版本配置有一个非常简单的提示符，它们大多向你展示了一些基本信息， 但提示符可以为你提供更多的内容。例如，在 Debian 7 下，默认的提示符是这样的:mike@somebox:~$ 上面的提示符展示出了用户、主机名、当前目录和账户类型符号（假如你切换到 root 账户， $ 会变为 #)。 那这些信息是在哪里存储的呢? 答案是：在 PS1 环境变量中。 假如你键入 echo $PS1， 你将会在这个命令的输出字符串的最后有如下的字符：\u@\h:\w$ 这看起来有一些丑陋，并在瞥见它的第一眼时，你可能会开始尖叫，认为它是令人恐惧的正则表达式，但我们不打算用这些复杂的字符来煎熬我们的大脑。这不是正则表达式，这里的斜杠是转义序列，它告诉提示符进行一些特别的处理。 例如，上面的 u 部分，告诉提示符展示用户名， 而 w 则展示工作路径.下面是一些你可以在提示符中用到的字符的列表:d 当前的日期h 主机名n 代表换行的字符A 当前的时间 (HH:MM)u 当前的用户w (小写) 整个工作路径的全称W (大写) 工作路径的简短名称$ 一个提示符号，对于 root 用户为 # 号! 当前命令在 shell 历史记录中的序号下面解释 w 和 W 选项的区别: 对于前者，你将看到你所在的工作路径的完整地址，（例如 /usr/local/bin），而对于后者， 它则只显示 bin 这一部分。现在，我们该怎样改变提示符呢? 你需要更改 PS1 环境变量的内容，试试下面这个：export PS1="I am \u and it is \A $" 现在，你的提示符将会像下面这样：I am mike and it is 11:26 $ 从这个例子出发，你就可以按照你的想法来试验一下上面列出的其他转义序列。 但等等 – 当你登出后，你的这些努力都将消失，因为在你每次打开终端时，PS1 环境变量的值都会被重置。解决这个问题的最简单方式是打开 .bashrc 配置文件（在你的家目录下） 并在这个文件的最下方添加上完整的 export 命令。在每次你启动一个新的 shell 会话时，这个 .bashrc 会被 Bash 读取, 所以你的加强的提示符就可以一直出现。你还可以使用额外的颜色来装扮提示符。刚开始，这将有点棘手，因为你必须使用一些相当奇怪的转义序列，但结果是非常漂亮的。 将下面的字符添加到你的 PS1字符串中的某个位置，最终这将把文本变为红色：\[\e[31m\] 你可以将这里的 31 更改为其他的数字来获得不同的颜色:30 黑色32 绿色33 黄色34 蓝色35 洋红色36 青色37 白色所以，让我们使用先前看到的转义序列和颜色来创造一个提示符，以此来结束这一小节的内容。深吸一口气,弯曲你的手指，然后键入下面这只“野兽”：export PS1="(\!) \[\e[31m\] \[\A\] \[\e[32m\]\u@\h \[\e[34m\]\w \[\e[30m\]$" 上面的命令提供了一个 Bash 命令历史序号、当前的时间、彩色的用户或主机名组合、以及工作路径。假如你“野心勃勃”，利用一些惊人的组合，你还可以更改提示符的背景色和前景色。非常有用的 Arch wiki 有一个关于颜色代码的完整列表：http://tinyurl.com/3gvz4ec。Shell 精要假如你是一个彻底的 Linux 新手并第一次阅读这份杂志，或许你会发觉阅读这些教程有些吃力。 所以这里有一些基础知识来让你熟悉一些 shell。 通常在你的菜单中， shell 指的是 Terminal、 XTerm 或 Konsole， 当你启动它后， 最为实用的命令有这些：ls (列出文件名); cp one.txt two.txt (复制文件); rm file.txt (移除文件); mv old.txt new.txt (移动或重命名文件);cd /some/directory (改变目录); cd .. (回到上级目录); ./program (在当前目录下运行一个程序); ls > list.txt (重定向输出到一个文件)。几乎每个命令都有一个手册页用来解释其选项（例如 man ls – 按 Q 来退出）。在那里，你可以知晓命令的选项，这样你就知道 ls -la 展示一个详细的列表，其中也列出了隐藏文件， 并且在键入一个文件或目录的名字的一部分后， 可以使用 Tab 键来自动补全。Tmux: 针对 shell 的窗口管理器在文本模式的环境中使用一个窗口管理器 – 这听起来有点不可思议， 是吧？ 然而，你应该记得当 Web 浏览器第一次实现分页浏览的时候吧？ 在当时， 这是在可用性上的一个重大进步，它减少了桌面任务栏的杂乱无章和繁多的窗口列表。 对于你的浏览器来说，你只需要一个按钮便可以在浏览器中切换到你打开的每个单独网站， 而不是针对每个网站都有一个任务栏或导航图标。 这个功能非常有意义。若有时你同时运行着几个虚拟终端，你便会遇到相似的情况； 在这些终端之间跳转，或每次在任务栏或窗口列表中找到你所需要的那一个终端，都可能会让你觉得麻烦。 拥有一个文本模式的窗口管理器不仅可以让你像在同一个终端窗口中运行多个 shell 会话，而且你甚至还可以将这些窗口排列在一起。另外，这样还有另一个好处：可以将这些窗口进行分离和重新连接。想要看看这是如何运行的最好方式是自己尝试一下。在一个终端窗口中，输入 screen （在大多数发行版本中，它已经默认安装了或者可以在软件包仓库中找到）。 某些欢迎的文字将会出现 – 只需敲击 Enter 键这些文字就会消失。 现在运行一个交互式的文本模式的程序，例如 nano， 并关闭这个终端窗口。在一个正常的 shell 对话中， 关闭窗口将会终止所有在该终端中运行的进程 – 所以刚才的 Nano 编辑对话也就被终止了， 但对于 screen 来说，并不是这样的。打开一个新的终端并输入如下命令：screen -r 瞧，你刚开打开的 Nano 会话又回来了！当刚才你运行 screen 时， 它会创建了一个新的独立的 shell 会话， 它不与某个特定的终端窗口绑定在一起，所以可以在后面被分离并重新连接（即 -r 选项）。当你正使用 SSH 去连接另一台机器并做着某些工作时， 但并不想因为一个脆弱的连接而影响你的进度，这个方法尤其有用。假如你在一个 screen 会话中做着某些工作，并且你的连接突然中断了（或者你的笔记本没电了，又或者你的电脑报废了——不是这么悲催吧），你只需重新连接或给电脑充电或重新买一台电脑，接着运行 screen -r 来重新连接到远程的电脑，并在刚才掉线的地方接着开始。现在，我们都一直在讨论 GNU 的 screen，但这个小节的标题提到的是 tmux。 实质上， tmux （terminal multiplexer） 就像是 screen 的一个进阶版本，带有许多有用的额外功能，所以现在我们开始关注 tmux。 某些发行版本默认包含了 tmux； 在其他的发行版本上，通常只需要一个 apt-get、 yum install 或 pacman -S 命令便可以安装它。一旦你安装了它过后，键入 tmux 来启动它。接着你将注意到，在终端窗口的底部有一条绿色的信息栏，它非常像传统的窗口管理器中的任务栏： 上面显示着一个运行着的程序的列表、机器的主机名、当前时间和日期。 现在运行一个程序，同样以 Nano 为例， 敲击 Ctrl+B 后接着按 C 键， 这将在 tmux 会话中创建一个新的窗口，你便可以在终端的底部的任务栏中看到如下的信息:0:nano- 1:bash* 每一个窗口都有一个数字，当前呈现的程序被一个星号所标记。 Ctrl+B 是与 tmux 交互的标准方式， 所以若你敲击这个按键组合并带上一个窗口序号， 那么就会切换到对应的那个窗口。你也可以使用 Ctrl+B 再加上 N 或 P 来分别切换到下一个或上一个窗口 – 或者使用 Ctrl+B 加上 L 来在最近使用的两个窗口之间来进行切换（有点类似于桌面中的经典的 Alt+Tab 组合键的效果）。 若需要知道窗口列表，使用 Ctrl+B 再加上 W。目前为止，一切都还好：现在你可以在一个单独的终端窗口中运行多个程序，避免混乱（尤其是当你经常与同一个远程主机保持多个 SSH 连接时）。 当想同时看两个程序又该怎么办呢？针对这种情况， 可以使用 tmux 中的窗格。 敲击 Ctrl+B 再加上 % ， 则当前窗口将分为两个部分：一个在左一个在右。你可以使用 Ctrl+B 再加上 O 来在这两个部分之间切换。 这尤其在你想同时看两个东西时非常实用， – 例如一个窗格看指导手册，另一个窗格里用编辑器看一个配置文件。有时，你想对一个单独的窗格进行缩放，而这需要一定的技巧。 首先你需要敲击 Ctrl+B 再加上一个 :（冒号），这将使得位于底部的 tmux 栏变为深橙色。 现在，你进入了命令模式，在这里你可以输入命令来操作 tmux。 输入 resize-pane -R 来使当前窗格向右移动一个字符的间距， 或使用 -L 来向左移动。 对于一个简单的操作，这些命令似乎有些长，但请注意，在 tmux 的命令模式（前面提到的一个分号开始的模式）下，可以使用 Tab 键来补全命令。 另外需要提及的是， tmux 同样也有一个命令历史记录，所以若你想重复刚才的缩放操作，可以先敲击 Ctrl+B 再跟上一个分号，并使用向上的箭头来取回刚才输入的命令。最后，让我们看一下分离和重新连接 - 即我们刚才介绍的 screen 的特色功能。 在 tmux 中，敲击 Ctrl+B 再加上 D 来从当前的终端窗口中分离当前的 tmux 会话。这使得这个会话的一切工作都在后台中运行、使用 tmux a 可以再重新连接到刚才的会话。但若你同时有多个 tmux 会话在运行时，又该怎么办呢? 我们可以使用下面的命令来列出它们：tmux ls 这个命令将为每个会话分配一个序号； 假如你想重新连接到会话 1， 可以使用 tmux a -t 1. tmux 是可以高度定制的，你可以自定义按键绑定并更改配色方案， 所以一旦你适应了它的主要功能，请钻研指导手册以了解更多的内容。上图中， tmux 开启了两个窗格： 左边是 Vim 正在编辑一个配置文件，而右边则展示着指导手册页。Zsh: 另一个 shell选择是好的，但标准同样重要。 你要知道几乎每个主流的 Linux 发行版本都默认使用 Bash shell – 尽管还存在其他的 shell。 Bash 为你提供了一个 shell 能够给你提供的几乎任何功能，包括命令历史记录，文件名补全和许多脚本编程的能力。它成熟、可靠并文档丰富 – 但它不是你唯一的选择。许多高级用户热衷于 Zsh， 即 Z shell。 这是 Bash 的一个替代品并提供了 Bash 的几乎所有功能，另外还提供了一些额外的功能。 例如， 在 Zsh 中，你输入 ls ，并敲击 Tab 键可以得到 ls 可用的各种不同选项的一个大致描述。 而不需要再打开 man page 了！Zsh 还支持其他强大的自动补全功能： 例如，输入 cd /u/lo/bi 再敲击 Tab 键， 则完整的路径名 /usr/local/bin 就会出现（这里假设没有其他的路径包含 u, lo 和 bi 等字符）。 或者只输入 cd 再跟上 Tab 键，则你将看到着色后的路径名的列表 – 这比 Bash 给出的简单的结果好看得多。Zsh 在大多数的主要发行版本上都可以得到了； 安装它后并输入 zsh 便可启动它。 要将你的默认 shell 从 Bash 改为 Zsh， 可以使用 chsh 命令。 若需了解更多的信息，请访问 www.zsh.org。“未来”的终端你或许会好奇为什么包含你的命令行提示符的应用被叫做终端。 这需要追溯到 Unix 的早期， 那时人们一般工作在一个多用户的机器上，这个巨大的电脑主机将占据一座建筑中的一个房间， 人们通过某些线路，使用屏幕和键盘来连接到这个主机， 这些终端机通常被称为“哑终端”， 因为它们不能靠自己做任何重要的执行任务 – 它们只展示通过线路从主机传来的信息，并输送回从键盘的敲击中得到的输入信息。今天，我们在自己的机器上执行几乎所有的实际操作，所以我们的电脑不是传统意义下的终端，这就是为什么诸如 XTerm、 Gnome Terminal、 Konsole 等程序被称为“终端模拟器” 的原因 – 他们提供了同昔日的物理终端一样的功能。事实上，在许多方面它们并没有改变多少。诚然，现在我们有了反锯齿字体，更好的颜色和点击网址的能力，但总的来说，几十年来我们一直以同样的方式在工作。所以某些程序员正尝试改变这个状况。 Terminology (http://tinyurl.com/osopjv9)， 它来自于超级时髦的 Enlightenment 窗口管理器背后的团队，旨在让终端步入到 21 世纪，例如带有在线媒体显示功能。你可以在一个充满图片的目录里输入 ls 命令，便可以看到它们的缩略图，或甚至可以直接在你的终端里播放视频。 这使得一个终端有点类似于一个文件管理器，意味着你可以快速地检查媒体文件的内容而不必用另一个应用来打开它们。接着还有 Xiki (www.xiki.org)，它自身的描述为“命令的革新”。它就像是一个传统的 shell、一个 GUI 和一个 wiki 之间的过渡；你可以在任何地方输入命令，并在后面将它们的输出存储为笔记以作为参考，并可以创建非常强大的自定义命令。用几句话是很能描述它的，所以作者们已经创作了一个视频来展示它的潜力是多么的巨大(请看 Xiki 网站的截屏视频部分)。并且 Xiki 绝不是那种在几个月之内就消亡的昙花一现的项目，作者们成功地进行了一次 Kickstarter 众筹，在七月底已募集到超过 $84,000。 是的,你没有看错 – $84K 来支持一个终端模拟器。这可能是最不寻常的集资活动了，因为某些疯狂的家伙已经决定开始创办它们自己的 Linux 杂志 ......下一代终端许多命令行和基于文本的程序在功能上与它们的 GUI 程序是相同的，并且常常更加快速和高效。我们的推荐有： Irssi (IRC 客户端); Mutt (mail 客户端); rTorrent (BitTorrent); Ranger (文件管理器); htop (进程监视器)。 若给定在终端的限制下来进行 Web 浏览， Elinks 确实做的很好，并且对于阅读那些以文字为主的网站例如 Wikipedia 来说。它非常实用。微调配色方案在《Linux Voice》杂志社中，我们并不迷恋那些养眼的东西，但当你每天花费几个小时盯着屏幕看东西时，我们确实认识到美学的重要性。我们中的许多人都喜欢调整我们的桌面和窗口管理器来达到完美的效果，调整阴影效果、摆弄不同的配色方案，直到我们 100% 的满意（然后出于习惯,摆弄更多的东西）。但我们倾向于忽视终端窗口，它理应也获得我们的喜爱，并且在 http://ciembor.github.io/4bit 你将看到一个极其棒的配色方案设计器，对于所有受欢迎的终端模拟器（XTerm, Gnome Terminal, Konsole 和 Xfce4 Terminal 等都是支持的应用。），它可以输出其设定。移动滑块直到你看到配色方案最佳， 然后点击位于该页面右上角的 得到方案 按钮。相似的，假如你在一个文本编辑器，如 Vim 或 Emacs 上花费了很多的时间，使用一个精心设计的调色板也是非常值得的。 Solarized http://ethanschoonover.com/solarized 是一个卓越的方案，它不仅漂亮，而且因追求最大的可用性而设计，在其背后有着大量的研究和测试。via: http://www.linuxvoice.com/linux-101-power-up-your-shell-8/作者：Ben Everard 译者：FSSlc 校对：wxy本文由 LCTT 原创翻译，Linux中国 荣誉推出
通过运行在 Android 手机上的自制遥控器来控制你的家庭媒体播放器。Kodi 是一款很优秀的软件，能够将几乎所有电脑变身成媒体中心。它可以播放音乐和视频，显示图片，甚至还能显示天气预报。为了在配置成家庭影院后方便使用，你可以通过手机 app 访问运行在连接到 Wi-Fi 的 XBMC 机器上的服务来控制它。可以找到很多这种工具，几乎覆盖所有智能手机系统。XBMCKodi 原名叫做 XBMC，在你阅读这篇文章的时候，XBMC 已经成为历史。因为法律原因（因为名字 XBMC 或 X-Box Media Center 里引用了不再支持的过时硬件）项目组决定使用新的名字 Kodi。不过，除了名字，其他的都会保持原样。或者说除开通常新版本中所期待的大量新改进。这一般不会影响到遥控软件，它应该能在已有的 XBMC 系统和新的 Kodi 系统上都能工作。我们目前已经配置好了一个用于播放音乐的 Kodi 系统，不过我们找到的所有 Kodi 遥控没一个好用的，特别是和媒体中心连接的电视没打开的时候。它们都有点太复杂了，集成了太多功能在手机的小屏幕上。我们希望能有这样的系统，从最开始就是设计成只用于访问音乐库和电台插件，所以我们决定自己实现一个。它不需要用到 Kodi 的所有功能，因为除了音乐以外的任务，我们可以简单地切换使用通用的 Kodi 遥控。我们的测试系统是一个刷了 RaspBMC 发行版的树莓派，但是我们要做的工具并不受限于树莓派或Kodi那个发行版，它应该可以匹配任何安装了相关插件的基于 Linux 的 Kodi 系统。首先，遥控程序需要一个用户界面。大多数 Kodi 遥控程序都是独立的 app。不过对于我们要做的这个音乐控制程序，我们希望用户可以不用安装任何东西就可以使用。显然我们需要使用网页界面。Kodi 本身自带网页服务器，但是为了获得更多权限，我们还是使用了独立的网页框架。在同一台电脑上跑两个以上网页服务器没有问题，只不过它们不能使用相同的端口。有几个网页框架可以使用。而我们选用 Bottle 是因为它是一个简单高效的框架，而且我们也确实用不到任何高级功能。Bottle 是一个 Python 模块，所以这也将是我们编写服务器模块的语言。你应该能在软件包管理器里找到 Bottle。在基于 Debian 的系统（包括 RaspBMC）里，你可以通过下面的命令安装：sudo apt-get install python-bottle 遥控程序实际上只是连接用户和系统的中间层。Bottle 提供了和用户交互的方式，而我们将通过 JSON API 来和 Kodi 交互。这样可以让我们通过发送 JSON 格式消息的方式去控制媒体播放器。我们将用到一个叫做 xbmcjson 的简单 XBMC JASON API 封装。足够用来发送控制请求，而不需要关心实际的 JSON 格式以及和服务器通讯的无聊事。它没有包含在 PIP 包管理中，所以你得直接从 GitHub 安装：git clone https://github.com/jcsaaddupuy/python-xbmc.git cd python-xbmc sudo python setup.py install 万事俱备，只欠代码。先从 Bottle 开始我们程序的基本结构：from xbmcjson import XBMC from bottle import route, run, template, redirect, static_file, request import os xbmc = XBMC("http://192.168.0.5/jsonrpc", "xbmc", "xbmc") @route('/hello/<name>') def index(name): return template(' Hello {{name}}! ', name=name) run(host="0.0.0.0", port=8000) 这样程序将连接到 Kodi（不过实际上用不到）；然后 Bottle 会开始提供网站服务。在我们的代码里，它将监听主机 0.0.0.0（意味着允许所有主机连接）的端口 8000。它只设定了一个站点，就是 /hello/XXXX，这里的 XXXX 可以是任何内容。不管 XXXX 是什么都将作为参数名传递给 index()。然后再替换进去 HTML 网页模版。你可以先试着把上面内容写到一个文件（我们取的名字是 remote.py），然后用下面的命令启动：python remote.py 然后你可以在浏览器里访问 localhost:8000/hello/world 看看模版生效的效果。@route() 用来设定网页服务器的路径，而函数 index() 会返回该路径的数据。通常是返回由模版生成的 HTML 页面，但是并不是说只能这样（后面会看到）。随后，我们将给应用添加更多页面入口，让它变成一个全功能的 Kodi 遥控，但仍将采用相同代码结构。XBMC JSON API 接口可以从和 Kodi 机器同网段的任意电脑上访问。也就是说你可以在自己的笔记本上开发，然后再布置到媒体中心上，而不需要浪费时间上传每次改动。模版 - 比如前面例子里的那个简单模版 - 是一种结合 Python 和 HTML 来控制输出的方式。理论上，这俩能做很多很多事，但是会非常混乱。我们将只是用它们来生成正确格式的数据。不过，在开始动手之前，我们先得准备点数据。PasteBottle 自带网页服务器，我们用它来测试遥控程序。不过，我们发现它性能有时不够好。当我们的遥控程序正式上线时，我们希望页面能更快一点显示出来。Bottle 可以和很多不同的网页服务器配合工作，而我们发现 Paste 用起来非常不错。而要使用的话，只要简单地安装（Debian 系统里的 python-paste 包），然后修改一下代码里的 run 调用：run(host=hostname, port=hostport, server="paste") 你可以在 http://bottlepy.org/docs/dev/deployment.html 找到如何使用其他服务器的相关细节。从 Kodi 获取数据XBMC JSON API 分成 14 个命名空间：JSONRPC, Player, Playlist, Files, AudioLibrary, VideoLibrary, Input, Application, System, Favourites, Profiles, Settings, Textures 和 XBMC。每个都可以通过 Python 的 XBMC 对象访问（Favourites 除外，明显是个疏忽）。每个命名空间都包含许多方法用于对程序的控制。例如，Playlist.GetItems() 可以用来获取某个特定播放列表的内容。服务器会返回给我们 JSON 格式的数据，但 xbmcjson 模块会为我们转化成 Python 词典。我们需要用到 Kodi 里的两个组件来控制播放：播放器和播放列表。播放器处理播放列表并在每首歌结束时从列表里取下一首。为了查看当前正在播放的内容，我们需要获取正在工作的播放器的 ID，然后根据它找到当前播放列表的 ID。这个可以通过下面的代码来实现：def get_playlistid(): player = xbmc.Player.GetActivePlayers() if len(player['result']) > 0: playlist_data = xbmc.Player.GetProperties({"playerid":0, "properties":["playlistid"]}) if len(playlist_data['result']) > 0 and "playlistid" in playlist_data['result'].keys(): return playlist_data['result']['playlistid'] return -1 如果当前没有播放器在工作（就是说，返回数据的结果部分的长度是 0），或者当前播放器没有处理播放列表，这样的话函数会返回 -1。其他时候，它会返回当前播放列表的数字 ID。当我们拿到当前播放列表的 ID 后，就可以获取该列表的细节内容。按照我们的需求，有两个重要的地方：播放列表里包含的项，以及当前播放所处的位置（已经播放过的项并不会从播放列表移除，只是移动当前播放位置）。def get_playlist(): playlistid = get_playlistid() if playlistid >= 0: data = xbmc.Playlist.GetItems({"playlistid":playlistid, "properties": ["title", "album", "artist", "file"]}) position_data = xbmc.Player.GetProperties({"playerid":0, 'properties':["position"]}) position = int(position_data['result']['position']) return data['result']['items'][position:], position return [], -1 这样可以返回正在播放的项开始的列表（因为我们并不关心已经播放过的内容），而且也包含了用来从列表里移除项的位置信息。API 文档在这里：http://wiki.xbmc.org/?title=JSON-RPC_API/v6。它列出了所有支持的函数，但是关于具体如何使用的描述有点太简单了。JSONJSON 是 JavaScript Object Notation 的缩写，最初设计用于 JavaScript 对象的序列化。目前仍然起到这个作用，但是它也是用来编码任意数据的一种很好用的方式。JSON 对象都是这样的格式：{property1:value1, property2:value2, property3:value3} 支持任意数目的属性/值配对。对 Python 程序员来说，看上去和字典数据结构很相似，不过这两个确实很像。在字典数据结构里，值本身可以是另一个 JSON 对象，或者一个列表，所以下面的格式也是正确的：{"name":"Ben", "jobs":["cook", "bottle-washer"], "appearance": {"height":195, "skin":"fair"}} JSON 通常在网络服务中用来发送和接收数据，并且大多数编程语言都能很好地支持，所以如果你熟悉 Python 的话，你应该可以使用你熟悉的编程语言调用相同的接口来轻松地控制 Kodi。整合到一起把之前的功能连接到 HTML 页面很简单：@route('/juke') def index(): current_playlist, position = get_playlist() return template('list', playlist=current_playlist, offset = position) 只需要抓取播放列表（调用我们之前定义的函数），然后将结果传递给负责显示的模版。负责显示列表数据的模版的主要部分是： Currently Playing: % if playlist is not None: % position = offset % for song in playlist: {{song['title']}} % if song['type'] == 'unknown': Radio % else: {{song['artist'][0]}} % end % if position != offset: remove % else: skip % end % position += 1 % end 可以看到，模版大部分是用 HTML 写的，只有一小部分用来控制输出的其他代码。用两个大括号括起来的变量是输出位置（像我们在第一个 'hello world' 例子里看到的）。你也可以嵌入以百分号开头的 Python 代码。因为没有缩进，你需要用一个 % end 来结束当前的代码块（就像循环或 if 语句）。这个模版首先检查列表是否为空，然后遍历里面的每一项。每一项会用粗体显示歌曲名字，然后是艺术家名字，然后是一个是否跳过（如果是当前正在播的歌曲）或从列表移除的链接。所有歌曲的类型都是 'song'，如果类型是 'unknown'，那就不是歌曲而是网络电台。/remove/ 和 /skip/ 路径只是简单地封装了 XBMC 控制功能，在改动生效后重新加载 /juke：@route('/skip/<position>') def index(position): print xbmc.Player.GoTo({'playerid':0, 'to':'next'}) redirect("/juke") @route('/remove/<position>') def index(position): playlistid = get_playlistid() if playlistid >= 0: xbmc.Playlist.Remove({'playlistid':int(playlistid), 'position':int(position)}) redirect("/juke") 当然，如果不能往列表里添加歌曲的话那这个列表管理功能也不行。因为一旦播放列表结束，它就消失了，所以你需要重新创建一个，这会让事情复杂一些。而且有点让人迷惑的是，播放列表是通过调用 Playlist.Clear() 方法来创建的。这个方法也还用来删除包含网络电台（类型是 unknown）的播放列表。另一个麻烦的地方是列表里的网络电台开始播放后就不会停，所以如果当前在播网络电台，也会需要清除播放列表。这些页面包含了指向 /play/ 的链接来播放歌曲。通过下面的代码处理：@route('/play/<id>') def index(id): playlistid = get_playlistid() playlist, not_needed= get_playlist() if playlistid < 0 or playlist[0]['type'] == 'unknown': xbmc.Playlist.Clear({"playlistid":0}) xbmc.Playlist.Add({"playlistid":0, "item":{"songid":int(id)}}) xbmc.Player.open({"item":{"playlistid":0}}) playlistid = 0 else: xbmc.Playlist.Add({"playlistid":playlistid, "item":{"songid":int(id)}}) remove_duplicates(playlistid) redirect("/juke") 最后一件事情是实现 remove\_duplicates 调用。这并不是必须的 - 而且还有人并不喜欢这个 - 不过可以保证同一首歌不会多次出现在播放列表里。我们也实现了一些页面用来列出收藏歌曲里所有艺术家，以及列出指定艺术家的歌曲和专辑。这些都非常简单，和 /juke 页面基本类似。还需要处理一下 UI，不过功能已经有了。日志通常拿到 XBMC JSON API 并不清楚能用来做什么，而且它的文档也有点模糊。找出如何使用的一种方式是看别的遥控程序是怎么做的。如果打开日志功能，就可以在使用其他遥控程序的时候看到哪个 API 被调用了，然后就可以应用到在自己的代码里。要打开日志功能，把 Kodi 媒体中心 接到显示器上，再依次进入设置 > 系统 > 调试，打开允许调试日志。在打开日志功能后，还需要登录到 Kodi 机器上（比如通过 SSH），然后就可以查看日志了。日志文件的位置应该显示在 Kodi 界面左上角。在 RaspBMC 系统里，文件位置是 /home/pi/.xbmc/temp/xbmc.log。你可以通过下面的命令实时监视哪个 API 接口被调用了：cd /home/pi/.xbmc/temp tail -f xbmc.log | grep "JSON" 增加功能上面的代码都是用来播放 Kodi 媒体库里的歌曲的，但我们还希望能播放网络电台。每个插件都有自己的独立 URL 可以通过普通的 XBMC JSON 命令来获取信息。举个例子，要从电台插件里获取选中的电台，可以使用；@route('/radio/') def index(): my_stations = xbmc.Files.GetDirectory({"directory":"plugin://plugin.audio.radio_de/stations/my/", "properties": ["title","thumbnail","playcount","artist","album","episode","season","showtitle"]}) if 'result' in my_stations.keys(): return template('radio', stations=my_stations['result']['files']) else: return template('error', error='radio') 这样可以返回一个可以和歌曲一样能添加到播放列表的文件。不过，这些文件能一直播下去，所以（之前说过）在添加其他歌曲的时候需要重新创建列表。共享歌曲除了伺服页面模版，Bottle 还支持静态文件，方便用于那些不会因为用户输入而改变的内容。可以是 CSS 文件，一张图片或是一首 MP3 歌曲。在我们的简单遥控程序里（目前）还没有任何用来美化的 CSS 或图片，不过我们增加了一个下载歌曲的途径。这个可以让媒体中心变成一个存放歌曲的 NAS 盒子。在需要传输大量数据的时候，最好还是用类似 Samba 的功能，但只是下几首歌到手机上的话使用静态文件也是很好的方式。通过歌曲 ID 来下载的 Bottle 代码：@route('/download/<id>') def index(id): data = xbmc.AudioLibrary.GetSongDetails({"songid":int(id), "properties":["file"]}) full_filename = data['result']['songdetails']['file'] path, filename = os.path.split(full_filename) return static_file(filename, root=path, download=True) 应用的时候，只需要为 /songsby/ 页面里的相应 ID 加个链接。我们已经把所有的代码过了一遍，不过还需要一点工作来把它们集合到一起。可以自己去 GitHub 页面 https://github.com/ben-ev/xbmc-remote 看下。设置我们的遥控程序已经开发完成，还需要保证让它在媒体中心每次开机的时候都能启动。有几种方式，最简单的是在 /etc/rc.local 里增加一行命令来启动。我们的文件位置在 /opt/xbmc-remote/remote.py，其他文件也和它一起。然后在 /etc/rc.local 最后的 exit 0 之前增加了下面一行。cd /opt/xbmc-remote && python remote.py & GitHub这个项目目前还只是个架子，但是 - 我们运营杂志就意味着没有太多自由时间来编程。不过，我们启动了一个 GitHub 项目，希望能持续完善， 而如果你觉得这个项目有用的话，欢迎做出贡献。要查看最新的进展，请访问 https://github.com/ben-ev/xbmc-remote 看看所处的状态。你可以从页面里获取最新的代码，或者通过命令行复制。如果你希望改善它，可以复制项目到你自己的分支开发，然后在功能完成后发起合并请求。关于如何使用 GitHub 的更多信息，请访问 https://github.com/features。via: http://www.linuxvoice.com/xbmc-build-a-remote-control/作者：Ben Everard 译者：zpl1025 校对：wxy本文由 LCTT 原创翻译，Linux中国 荣誉推出
Mayank Sharma 测试了5款不仅仅是能处理文字的超强文本编辑器。如果你使用Linux已经有很长一段时间，你知道，不管是编辑一款app的配置文件，还是修改shell脚本，或者编写/查看代码，类似LibreOffice的工具并不适合。尽管字面上看起来都是一样，但是你并不需要一个文字处理器来完成这些任务；你需要的是一个文本编辑器。在这个测评中，我们将着眼于5款更能胜任繁重文本工作的轻量级的文本编辑器。他们支持语法高亮，像拼写检查一样轻松处理代码缩进。你可以像你复制/粘贴文本那样容易地使用它们记录宏以及管理代码片段。得益于它们的插件，使得它们足以抗衡其它的以文本为中心的应用程序，一些简单的文本编辑器甚至超出了它们的设计目标。它们能胜任一个源代码编辑器的任务，甚至就是一个集成开发环境。Emacs和Vim是两款最流行和强大的纯文本编辑器。但是，由于一些原因，我们在这个测评中并没有包括它们。首先，如果你使用它们中的任何一个，那么恭喜你：你不需要更换了。其次，它们都有陡峭的学习曲线，尤其是那些熟悉了桌面环境的用户：他们很更愿意投入其他有图形界面的文本编辑器。目录:GeditURL:http://projects.gnome.org/gedit/版本: 3.10许可证: GPLGnome的默认文本编辑器准备好挑战了吗?KateURL: www.kate-editor.org版本: 3.11许可证: LGPL/GPLKate会挑战命运吗?Sublime TextURL: www.sublimetext.com版本: 2.0.2许可证: Proprietary在自由的土地上的带有黄金般的心脏的专利软件。UltraEditURL: www.ultraedit.com版本: 4.1.0.4许可证: Proprietary足够证明它的价值了吗?jEditURL: www.jedit.org版本: 5.1.0许可证: GPL基于Java的编辑器是否会毁掉其他编辑器的世界?关键标准除了Gedit和jEdit以外的所有工具，都是通过其推荐的安装方法安装在Fedora和Ubuntu上。前者已经兼容默认的Gnome桌面，后者仍然固执地反对安装在Fedora上。由于这些是相对简单的应用程序，他们没有复杂的依赖，唯一例外的是jEdit，它要求要有Oracle Java。得益于Gnome和KDE持续的努力，所有编辑器无论在哪个桌面上的外观看起来很好，功能也很正常。这不仅是作为评价的标准，也意味着你不再受制于你的桌面环境兼容的工具。除了它们独特的功能，我们也对所有候选者测试了常规的文本编辑功能。然而，它们并没有被设计为模仿现代字处理器的所有功能，我们也不以此评判。编程语言支持UltraEdit 能进行语法高亮、代码折叠以及拥有项目管理的能力。也有一个罗列源文件中所有函数的功能列表，但并不适用于我们测试的任何代码文件。UltraEdit也支持HTML5，有一个能添加常用HTML标记的HTML工具栏。即使Gnome的默认文本编辑器Gedit，也有几个面向编码的功能特性，例如括号匹配、自动缩进以及为包括C, C++, Java, HTML, XML, Python, Perl, 以及许多其它编程语言进行语法高亮。如果你需要更多的编程辅助功能，看一下Sublime和Kate。Sublime支持多种编程语言并且能为(那些流行的)C#, D, Dylan, Erlang, Groovy, Haskell, Lisp, Lua, MATLAB, OCaml, R, 甚至 SQL 进行语法高亮。如果这还不够，你可以下载插件以支持更多的语言。另外，它的语法高亮功能提供了多个可定制选项。这个应用程序也会进行括号匹配，确保代码段都正确，Sublime的自动补全功能也支持用户创建的变量。就像Komodo IDE，Sublime也可以显示一个全部源代码的滚动预览图，这对于长代码文件导航和在文件中的不同部分跳转很方便。Sublime最好的功能之一就是能在编辑器内部运行特定语言，例如C++, Python, Ruby等的代码，当然假设在你的电脑上安装有编译器以及其它系统工具。省时间而且不用再开终端.你也可以用插件在Kate中开启构建系统功能。另外，你可以为GDB调试器添加一个简单的前端。Kate能和Git，Subversion以及Mercurial版本控制系统一起工作，也提供了一些项目管理的功能。除了能为超过180种语言进行语法高亮，它支持所有的这些辅助功能，例如括号匹配，自动补全和自动缩进。它也支持代码折叠，甚至在一个程序中折叠函数。唯一的遗憾的是jEdit，它声称自己是一个程序员的文本编辑器，但它缺少其他的基本功能，例如代码折叠，它甚至不能提示或者补全函数.评分：Gedit：3/5Kate：5/5Sublime：5/5UltraEdit：3/5jEdit：1/5键盘控制高级文本编辑器的用户希望能完全通过键盘控制和操作，一些应用程序甚至支持用户自定义快捷方式的键盘绑定。你可以轻松的使用Gedit的扩展键盘快捷键。可以在编辑文件时通过工具的快捷键调用工具，例如对一个文档进行拼写检查。你可以看到应用程序内部的一系列默认快捷键，但并没有图形化的方式去自定义它们。相似的，在Sublime中自定义键盘绑定，你需要修改它的XML的键盘映射文件。Sublime由于缺少定义键盘快捷键的图形化界面而饱受批评，但长期使用的用户支持当前的基于文件的机制：这给了他们更多的控制能力。UltraEdit为它"一切都可自定义"的座右铭感到自豪，这也包括键盘快捷键。你可以自定义菜单导航的热键，以及定义你自己的访问大量功能的组合键映射。除了完全可自定义的键盘快捷键以外，jEdit也有为Emacs预定义的键映射。Kate在这方面尤其令人映像深刻。它有简单可访问的自定义键绑定窗口。你可以更改默认的键，或者定义替代的键。另外，Kate也有一个能使用户使用Vi键操作Kate的Vi模式。评分：Gedit：2/5Kate：5/5Sublime：3/5UltraEdit：4/5jEdit：5/5片段和宏宏通过自动化重复的步骤帮助你降低花费在编辑和组织数据上的时间，而代码片段通过创建可重用的源代码块为程序员扩展类似的功能。这两者都能节省你的时间。标准的Gedit安装没有这两种功能中的任何一种，但是你可以通过独立的插件启用这些功能。片段插件随Gedit一起发布，但在Gedit内启用宏插件，则需要你手动下载和安装(被称为gedit-macropy，托管在GitHub上)。Kate也同样通过插件的形式启用片段功能。一旦加入，插件也增加了PHP，Bash和Java的片段库。你可以在侧边栏中显示片段列表以便于访问。可以通过右击片段或者快捷键组合方式编辑它的内容。然而，令人惊讶的是，它不支持宏-尽管用户从2002年就不断要求！jEdit也有一个启用片段的插件。它还可以从用户行为中记录宏或者你也可以用BeanShell 脚本语言(BeanShell支持像Perl和JavaScript那样将脚本对象封装为简单的方法)中写宏。jEdit也有一个可以从jEdit的网站中下载多种宏的插件。Sublime有创建片段和宏的内建功能，也有为大多数编程语言经常使用的函数多种片段。在UltraEdit中片段被称为智能模板，就像Sublime中一样，你可以根据正在编辑的源代码文件类型插入片段。要完成宏记录功能，UltraEdit还有集成了一个基于JavaScript的脚本语言引擎来完成自动任务。你也可以从该编辑器的网站中下载用户提交的宏和脚本。评分：Gedit：3/5Kate：1/5Sublime：5/5UltraEdit：5/5jEdit：5/5易用性不像那些简陋的文本编辑器，这些文本编辑器在这方面可以适应从文档写作者到程序员的各种用户的需要。与精简应用程序相反，他们的开发者在寻找添加更多功能的途径。尽管第一眼看上去这次测评中的大部分应用有一个很相似的布局，经过仔细的检查，你会发现一些可用性的差异。我们通过用户界面的合理使用来介绍它们的功能和特性，而不是铺天盖地地告诉读者。Gedit: 4/5Gedit的外观很普通，它有一个带有很少的菜单和按钮的简单界面。这是一把双刃剑，因为有些用户可能不会发现它真正的潜能。Gedit可以在选项卡中打开多个文件，这些选项卡可以重排和在多个 Gedit窗口之间移动。用户可以选择通过插件来启用侧边栏来浏览文件或者在底部面板显示工具输出内容。这个应用程序会检测到被其它应用程序更改的文件并可以重新加载该文件。为了适配Gnome，在应用程序的最新版本中做了大量的 UI 修改。然而修改还还不稳定，尽管包括了所有的功能，但是菜单交互的一些插件还需要升级。在功能与界面之间取得了良好的平衡，Gedit将其大部分功能隐藏在背后。Kate: 5/5尽管用户界面的主要部分和Gedit相似，Kate可以在两边显示选项卡并且它的菜单更加丰富。该应用程序平易近人，吸引用户来挖掘它的其它功能。Kate可以在KDE的KIO支持的所有协议上透明地打开和保存文件，包括通过HTTP, FTP, SSH, SMB 和 WebDAV。你可以用这个应用同时处理多个文件。但不同于大部分应用程序传统的水平选项卡选择栏，Kate在屏幕的两个方向都有选项卡。左侧的侧边栏显示打开的文件列表。需要同时查看一个文件不同部分的程序员也会感激它可以水平或者竖直分隔界面的能力。Kate能搭建为功能丰富的集成开发环境。Sublime: 5/5Sublime支持你在不同方式同时查看多达四个文件。当你在集中精力编程时，它也有一个只显示文件和菜单的全屏无扰模式。这个编辑器还在右边有个缩略地图，这在长文件中导航非常有用。应用程序为多种编程语言提供多种常用函数的片段，这使得它对于开发者非常有用。另一个精巧的功能是，无论你使用都是文本文档或者代码，都可以任意选择和替换。如果你不喜欢Sublime的Charcoal外观，你可以选择它包含的其它22种主题。UltraEdit: 3/5UltraEdit在界面的顶部和底部加载了多种工具栏。加上切换文档的选项卡、两边的面板，以及分隔区域，使得只剩下一点空间给编辑窗口。使用HTML的网络开发者有很多唾手可得的帮助。你可以通过FTP和SFTP访问远程文件。高级功能，例如记录一个宏以及比较文件，也简单易用。使用应用程序的偏好设置窗口，你可以调整应用程序的多个方面，包括颜色主题和类似语法高亮的其它功能。UltraEdit的用户界面是高度可配置的 — 你可以像改变其它许多方面那样简单的自定义工具栏和菜单的布局。jEdit: 3/5在可用性方面，首先一个不好就是jEdit不能在基于RPM的发行版上安装。导航编辑器需要一些时间来适应，因为它的菜单和其它流行的应用程序顺序不同，而且有些普通桌面用户不熟悉的名字。但是，该应用程序有详细的内部帮助，这有利于缓解学习曲线。jEdit会高亮你所在的当前行，并使你能以多种查看方式分隔窗口。你可以简单地从应用程序中安装和管理插件，除了使用完整的宏，jEdit也支持你快速记录一个临时的宏。由于它的Java基础，jEdit在任何桌面环境中都不能给人宾至如归的感觉可用性和支持在Gedit和Kate之间有很多相似性。两个应用程序都得益于他们各自的父项目，Gnome和KDE，捆绑在各种主流的发行版中。另外两个项目都是跨平台的，有Windows和Mac OS X版本以及原生的Linux版本。Gedit托管在Gnome的网站上，并有一个简单的用户指南、关于多种插件的信息，以及包括邮件列表和IRC通道在内的常用联系方式。你也可以在其它基于Gnome的发行版，例如Ubuntu中找到使用信息。相似地，Kate得益于KDE的资源，并包括详细的用户信息以及邮件列表和IRC通道。你也可以从应用程序中获取相应的离线用户指南。除了Linux，UltraEdit在Windows和Mac OS X中也可用，虽然在应用程序中并没有包括，但在启动时也有详细的用户指南。为了辅助用户的使用，UltraEdit保存了一个常见问题的数据库，一系列关于多种特定功能的详细介绍，用户还可以在论坛版块彼此帮助。另外，付费用户也可以通过邮件从开发者中获取支持。Sublime支持一样多的平台，但是你需要单独为每种平台购买许可证。开发者通过博客让用户了解正在进行的开发，并积极参加它的论坛。这个项目支持设施的亮点是提供免费的详细教程和视频课程。Sublime非常漂亮。由于jEdit是用java编写的，所以它在多种平台中都可用。在它的网站上你可以找到一个详细的用户指南以及一些插件帮助文档的链接。然而，这里没有能使用户和其他用户或者开发者交流的途径。评分：Gedit：4/5Kate：4/5Sublime：5/5UltraEdit：3/5jEdit：2/5附加组件和插件不同的用户有不同的需求，一个简单的轻量级应用程序只能做到这么多。这就是为什么需要插件的原因。应用程序依赖于这些小部件来扩展它们的功能集并让更多的用户使用。UltraEdit是一个例外。它没有第三方插件，但开发者将例如HtmlTidy这样的第三方工具集成到了UltraEdit。Gedit附带了好多已安装的插件，你可以下载更多的更多gedit插件包。基于和Gedit版本的兼容性，项目网站也有到多个第三方插件的链接。三个对程序员非常有用的插件是：Code Comment、在底部面板增加一个终端的Terminal Plugin以及Session Saver。当你用多个文件开发项目的时候Session Saver相当有用。你可以在选项卡中打开文件，保存会话，你可以用一键恢复，就可以按照你保存时的选项卡顺序打开所有的文件。类似的，你可以通过用内部的插件管理器增加插件来扩展Kate。除了令人映像深刻的项目插件，一些开发者使用的插件包括嵌入式终端，它能编译和调试代码，以及对数据库执行SQL查询。Sublime的插件是用Python写的，文本编辑器包括了一个类似于apt-get，能使用户查找，安装，升级和移除插件包的名为Package Control的工具。通过插件，你可以在Sublime中使用Git版本控制，以及美化JavaScript代码的JSLint工具。Sublime Linter能指出你代码中的错误，是编码人员必备的插件。jEdit拥有最令人印象深刻的插件设施。该应用有超过200个插件，可以在它们自己的专用网站中浏览。网站通过不同的类型列出了插件，例如文件管理，版本控制，文本等。你可以在每个类型下找到很多的插件。一些最好的插件是Android插件，它们提供了和Android项目协同工作的工具；你可以使用TomcatSwitch插件创建和控制外部Jakarta Tomcat服务器进程；以及类似于Vi功能的Vimulator插件。你可以通过使用jEdit的插件管理器安装这些插件。评分：Gedit：3/5Kate：4/5Sublime：4/5UltraEdit：1/5jEdit：5/5纯文本编辑尽管它们强大的额外功能甚至可能会取代几种完全成熟的应用程序，有时候可能只需要使用这些庞大的文本编辑器读、写或者编辑简单的纯文本。虽然你可以使用它们中的任何一个输入文本，我们通过普通文本编辑的方便性评价它们。Gnome的默认文本编辑器Gedit，支持取消和重做机制以及搜索和替换。它可以对多种语言进行拼写检查，并能通过使用Gnome GVFS库访问和编辑远程文件。你也可以使用Kate进行拼写检查，它也可以让你对任何高亮文本进行Google搜索。它还有一个能可视化告知用户文件中更改过但没有保存的行的行修改系统。另外，它通过允许用户在文件中使用书签简化长文档的导航。Sublime有很多可选择的编辑命令，例如缩进文本和格式化段落。它的自动保存功能帮助防止用户丢失他们的更改。高级用户还会喜欢基于正则表达式的递归查找和替换功能，以及选择多个不连续的文本块并执行统一操作。UltraEdit也允许用户在查找和替换功能中使用正则表达式，并能通过FTP编辑远程文件。JEdit一个独特的功能是它支持被称为寄存器的不限数目的剪切板。你可以复制文本片段到这些寄存器中，在编辑会话过程中都可用。评分：Gedit：4/5Kate：5/5Sublime：5/5UltraEdit：4/5jEdit：4/5我们的评比在这里的所有编辑器都足以替换你已有的文本编辑器，来编辑文本和调整配置文件。事实上，没准它们会组合起来作为你的集成开发环境。这些应用程序都有各种各样功能，它们的开发者不会考虑剥离功能，而是增加越来越多的功能。jEdit排在这次测试的最后面。因为它不仅坚持使用专有的Oracle Java运行时环境，不能在你的Fedora机器上安装，而且开发者并不积极和用户交互。UltraEdit做的稍微好一点。这个商业专用工具专注于网络开发者，不为非开发者的高级用户提供任何功能，使得它不值得推荐为免费软件的替代品。排在第三的是Gedit。作为Gnome的默认编辑器，它没有任何内在的问题，但尽管有很多积极的方面，它还是略微被Sublime和Kate超越。开诚布公地说，Kate是比Gedit更通用的编辑器，甚至考虑到他们的插件系统，评分也优于Gnome的默认编辑器。Sublime和Kate都相当好。他们在我们的大多数测试中表现同样出色。Kate由于不支持宏而落后于Sublime，但键盘友好和能简单定义自定义键绑定又使Kate找回优势。Kate成功的原因可以归结为它通过最小化学习曲线提供了最大化的功能。尽管使用它吧，不仅作为简单文本编辑器使用，或者容易使用语法高亮编辑配置文件，甚至得益于其项目管理能力能使用它协作一个复杂的编程项目。我们不是选择Kate去替换一个类似“[XX，在这里插入你最喜欢的专业工具]”的全面的集成开发环境。但是它是一个专业工具理想的、全面的、以及完美的垫脚石。Kate为能快速响应你的需要而设计，它的界面并不会使你茫然，并且和那些过于复杂的应用一样的有用。1st KateLicence LGPL/GPL Version 3.11www.kate-editor.org拥有超能力，态度温和的文本编辑器。Kate是KDE项目中最有用的应用程序之一。2nd Sublime TextLicence 专利 Version 2.0.2www.sublimetext.com值得你每分钱的专业文本编辑器 - 简单易用，功能全面而且看起来很棒。3rd GeditLicence GPL Version 3.10http://projects.gnome.org/gedit在Gnome中就用它吧。这是一个奇妙的文本编辑器，确实令人钦佩的工作，但这里的竞争实在太大了。4th UltraEditLicence Proprietary Version 4.1.0.4www.ultraedit.com关注于为网络开发者提供各种便利，而不为普通用户提供任何特殊功能。5th jEditLicence GPL Version 5.1.0www.jedit.org缺乏支持，不支持Fedora，缺乏好看的界面，jEdit被贬低到最后。你也许希望尝试…随你发行版发布的默认文本编辑器也能帮助你一些高级任务。例如KDE的KWrite和Raspbian的Nano。得益于KDE的katepart组件，KWrite继承了一些Kate的功能，得益于在树莓派上的可用性，Nano也开始重现风头。如果你希望跟随Linux大师的脚步，你总是可以尝试高大上的文本编辑器Emacs和Vim。想尝试Vim强大的用户首先可以考虑gVim，它通过图形界面展现了Vim的强大。除了jEdit和Kate，这里还有其他模仿Emacs和Vim之类的旧式高级编辑器的编辑器，比如JED 编辑器和Joe's Own Editor，这两者都有Emacs的模拟模式。另一方面，如果你在寻找轻量级的代码编辑器，可以看看Bluefish和Geany。他们的存在是为了填补文本编辑器和全面集成的开发平台之间的空隙。via: http://www.linuxvoice.com/text-editors/作者：Ben Everard 译者：ictlyh 校对：royaso,wxy本文由 LCTT 原创翻译，Linux中国 荣誉推出
给那些怀旧的游戏骨灰粉丝们：自制一台树莓派街机
利用当代神奇设备来重温80年代的黄金记忆。你需要以下硬件一台树莓派以及一张4GBSD卡一台支持HDMI的LCD显示屏游戏手柄或者...一个JAMMA街机游戏机外壳机箱J-Pac或者I-Pac80年代有太多难忘的记忆；冷战结束，Quatro碳酸饮料，Korg Polysix合成器，以及Commodore 64家用电脑。但对于某些年轻人来说，这些都没有街机游戏机那样有说服力，或那种甜蜜的叛逆。笼罩着烟味和此起彼伏的8比特音效，它们就是在挤出来的时间里去探索的洞穴：50分钱和一个游戏币能让你消耗整个午餐时间，在这些游戏上磨练着你的技能：小蜜蜂，城市大金刚，蜈蚣，行星射击，吃豆小姐，火凤凰，R-Rype，大金刚，雷霆计划，铁手套，街头霸王，超越赛车，防卫者争战...噢，这个列表太长了。这些游戏，以及玩这些游戏的街机机器，仍然像30年前那样有吸引力。不像年轻时候那样，现在可以不用装一兜零钱就能玩了，最终让你超越那些有钱的孩子以及他们无休止的‘继续游戏’。所以是时候打造一个你自己的基于Linux的街机游戏机了，然后挑战一下过去的最高分。我们将会包括所有的步骤，来将一个便宜的街机游戏机器外壳变成一台Linux驱动的多平台复古游戏系统。但是这并不意味着你就一定要搭建一个同样的系统。比如说，你可以放弃那个又大又重还有潜在致癌性外壳的箱子本身，而是将内部控制核心装进一个旧游戏主机或同等大小的盒子里。或者说，你也可以简单地放弃小巧的树莓派，而将系统的大脑换成一台更强劲的Linux主机。举个例子，它可以作为运行SteamOS的一个理想平台，用来玩那些更优秀的现代街机游戏。在之后的几个页面里，我们将搭建一台基于树莓派的街机游戏机，你应该也能从其中发现很多点子应用到你自己的项目上，即使它们和我们这个项目不太一样。然后因为我们是用无比强大的MAME来做这件事情，你几乎可以让它在任意平台上运行。我们是在B+型号出来以前完成的这个项目。它应该也可以同样工作在更新的主板上，你应该不用一个带电源的USB Hub也可以声明强调一下，我们捣腾的电子器件可能会让你受到电击。请确保你做的任何改动都是有资质的电子工程师帮你检查过的。我们也不会深入讨论如何获取游戏，但是有很多合法的资源，例如基于MAME模拟器的老游戏，以及较新的商业游戏。第一步：街机机柜街机机柜本身就是最大的挑战。我们在eBay上淘了个二手的90年代初的双人泡泡龙游戏机。然后花了£220装在一台旅行车后面送过来。类似这种机柜的价格并不确定。我们看到过很多在£100以内的。而另一方面，还有很多人愿意花数千块钱去买原版侧面贴纸完整的机器。决定买一个街机机柜，主要有两个考虑。第一个是它的体积：这东西又大又重。又占地方，而且需要至少两个人才能搬动。如果你不缺钱的话，还可以买DIY机柜或者全新的小一点的，例如适合摆在桌子上的那种。然后，酒柜也能很合适。这种机柜可能很便宜，但是他们都很重。不要一个人去搬。一些更古老的机器可能还会需要一点小关怀，例如重新喷个漆以及一些修理工作除了获得更加真实的游戏体验以外，购买原版的街机机柜的一个绝佳理由是可以使用原版的控制器。从eBay上买到的大多数机器都支持两个人同时玩，有两个摇杆以及每个玩家各自的一些按钮，再加上玩家一和玩家二的选择按钮。为了兼容更多游戏，我们建议您找一台每个玩家都有6个按键的型号，这个是通用配置。也许你还想看看支持超过两位玩家的控制台，或者有空间放其他游戏控制器的，比如说街机轨迹球（类似疯狂弹珠这种游戏需要的），或者一个旋钮（打砖块）。这些待会都可以轻松装上去，因为有现成的现代USB设备。控制器是第二考虑的，而且我们认为是最重要的，因为要通过它把你的摇动和拍打转变成游戏里的动作。当你准备买一个机柜时需要考虑一种叫JAMMA的东西，它是日本娱乐机械制造商协会（Japan Amusement Machinery Manufacturers Association）的缩写。JAMMA是街机游戏机里的行业标准，定义了包含游戏芯片的电路板和游戏控制器的连接方式，以及投币机制。它是一个连接两个玩家的摇杆和按钮的所有线缆的接口电路，把它们统一到一个标准的连接头。JAMMA就是这个连接头的大小以及引脚定义，这就意味着不管你安装的主板是什么，按钮和控制器都将会连接到相同功能接口，所以街机的主人只需要再更换下机柜上的外观图片，就可以招揽新玩家了。但是首先，提醒一下：JAMMA连接头上带有12V电压供电，通常由大多数街机里都有的电源模块供给。为了避免意外短路或是不小心掉个螺丝刀什么的造成损坏，我们完全切断了这个供电。在本教程后面的任何阶段，我们也不会用到这个连接头上的任何电源脚。第二步：J-PAC有一点非常方便，你可以买到这样一种设备，连接街机机柜里的JAMMA接头和电脑的USB端口，将机柜上的摇杆和按键动作都转换成（可配置的）键盘命令，它们可以在Linux里用来控制任何想玩的游戏。这个设备就叫J-Pac（www.ultimarc.com/jpac.html – 大概£54）。它最大的特点不是它的连接性；而是它处理和转换输入信号的方式，因为它比标准的USB手柄强太多太多了。每一个输入都有自己独立的中断，而且没有限制同时按下或按住的按钮或摇杆方向的数量。这对于类似街头霸王的游戏来说非常关键，因为他们依赖于同时迅速按下的组合键，而且用来对那些发飙后按下自己所有按键的不良对手发出致命一击时也必不可少。许多其他控制器，特别是那些生成键盘输入的，受到了他们所采用的USB控制器的同时六个输入的限制，以及一堆的Alt，Shift和Ctrl键的特殊处理的限制。J-Pac还可以接入倾角传感器，甚至某些投币装置，不用预先配置就可以在Linux下工作了。另外的选择是一个类似的叫I-Pac的设备。它做了和J-Pac相同的事情，只不过不支持JAMMA接头。这意味着你不能把JAMMA控制器接上去，但同时也就是说你可以设计你自己的控制器布局，再把每个控制接到I-Pac上去。这对第一个项目来说也许有点小难，但是这却是许多街机迷们选择的方式，特别是他们想设计一个支持四个玩家的控制板的时候，或者是一个整合许多不同类型控制的面板的时候。我们采用的方式并不是我们推荐必须要做的，我们改造了一个输入有问题的二手X-Arcade Tankstick控制面板，换上了新的摇杆和按钮，再接到新的JAMMA接口，这样有一个非常好的地方就是可以用便宜的价格（£8）买到所有用到的线材包括电路板边缘插头。上图是我们已经装到机柜上的J-Pac。右边的蓝色和红色导线接到我们的机柜上额外的1号和2号玩家按钮不管你选择的是I-Pac或是J-Pac，它们产生的按键都是MAME的默认值。也就是说运行模拟器之后不需要手动调整输入。例如玩家1，会默认将键盘方向键映射成上下左右，以及将左边的Ctrl，左边的ALT，空格和左边的Shift键映射到按钮1-4。但是真正实用的功能是，对于我们来说，是双键快捷方式。当按下并按住玩家1按钮后，就可以通过把玩家1的摇杆拉到下的位置发出用来暂停游戏的P按键，推到上的位置调整音量，以及推到右的位置来进入MAME自己的设置界面。这些特殊组合键设计的很巧妙，不会对正常玩游戏带来任何干扰，因为他们只有在按住玩家1按钮后才会生效，然后可以让你正在运行游戏的时候也能做任何需要的事情。例如，你可以完全地重新配置MAME，使用它自己的菜单，在玩游戏的时候改变输入绑定和灵敏度。最后，按住玩家1按钮然后按下玩家2按钮就可以退出MAME，如果你使用了启动菜单或MAME管理器的话就很有用了，因为他们会自动启动游戏，然后你就可以用最快的速度开始玩另一个游戏了。对于显示屏我们采取了比较保守的方式，拿掉了街机原装的笨重的而且已经坏掉的CRT，换成一个低成本的LCD显示器。这样做有很多好处。首先，这个显示器有HDMI接口，这样他就可以轻易地直接连接到树莓派或是现代的显卡上。第二，你也不用去设定驱动街机屏幕所需要的低频率刷新模式，也不需要驱动它的专用图形硬件。第三，这也是最安全的方式，因为街机屏幕往往在机身背后没有保护措施，让很高的电压离你的手只有几英寸的距离。也不是说你完全不能用CRT，如果那就是你追求的体验的话 – 这也是获得所追求的游戏体验的最真实的方式，但是我们在软件里充分细调了CRT模拟部分，我们对输出已经很满意了，而且不需要用那个古老的CRT更是让我们高兴。你也许还需要考虑用一个老式的4:3长宽比的LCD，而不是那种宽屏的现代产品，因为4:3模式用来玩竖屏或横屏的游戏更实用。比如说玩竖屏的射击游戏，例如雷电，如果使用宽屏显示器的话，会在屏幕两边都有一个黑条。这些黑条一般会用来显示一些游戏指引，或者你也可以把屏幕翻转90度，这样就可以用上每个像素了，但这却不实用，除非你只玩竖屏游戏或者有一个容易操作的旋转支座。装载显示屏也很重要。如果你拿掉了CRT的话，没有现成的地方安装LCD。我们的方式是买了一些中密度纤维板(MDF)并切割成适合原来摆放CRT的地方。固定以好，我们把一个便宜的VESA支座放在中间。VESA底座可以用来挂载大多数屏幕，大的或小的。最后，因为我们的机柜前面有烟玻璃，我们必须保证亮度和对比度都设置的足够高。第三步：装配现在几个硬件大件都选好了，而且也基本上确定了最终街机机柜要摆放的地方，把这几个配件装到一起并没有太大难度。我们安全地把机柜后面的电源输入部分拆开，然后在背后的空间接了一个符合插座。接在了电源开关之后的电线上。几乎所有的街机机柜右上角都有个电源开关，但通常在机柜靠下一点的地方有大量的导线铰接在它上面，也就是说我们的设备可以使用普通的电源连接头。我们的机柜上还有一个荧光管，用做机器上边灯罩的背光，之前是直接连接到电源上的，我们可以用一个普通插头让它保持和电源连接。当你打开机柜上的电源开关的时候，电流会流入机柜里的各个部件 - 你的树莓派和显示屏都会开机，所有一切就都准备好了。J-Pac模块直接插到JAMMA接口上，但你可能还需要一点手动调整。标准的JAMMA只支持每个玩家最多三个按键（尽管许多非正式的支持四个），而J-Pac可以支持六个。为了连接额外的按钮，你需要把按钮开关的一端接到J-Pac的GND上，另一端接到J-Pac板边有螺丝固定的输入上。它们被标记成1SW4，1SW5，1SW6，2SW4，2SW5和2SW6。J-Pac也有声音的直通连接，但是我们发现杂音太多没法用。改成把机柜上的喇叭连接到一个二手的SoundBlaster功放上，再接到树莓派的音频输出端口。声音不一定要纯正，但音量一定要足够大。我们的树莓派已经接到J-Pac左边，也已经连接了显示屏和USB hub然后把J-Pac或I-Pac模块通过PS2转USB连接线接到你的PC或树莓派，也可以直接接到PC的PS2接口。要用旧的PS2接头的话额外还有个要求，你的电脑得足够古老还有这个，但是我们测试发现用USB性能是一样的。当然，这个不能用于不带PS2的树莓派，而且别忘了树莓派也需要供电。我们一般建议使用一个带电源的USB hub，因为没有供电是树莓派不工作最常见的错误。你还需要保证树莓派的网络正常，要么通过以太网（也许使用一个藏到机柜里的电力线适配器），或者通过无线USB设备。网络很关键是因为在树莓派被藏到机柜里后你还可以重新配置它，不用接键盘或鼠标就可以让你调整设置以及执行管理任务。投币装置在街机模拟社区里，让投币装置工作在模拟器上工作就会和商业产品太接近了。这就意味着你有潜在的可能对使用你机器的人收取费用。这不仅仅只是不正当，考虑到运行在你自己街机上的那些游戏的来源，这将会是非法的。这很显然违背了模拟的精神。不过，我们和其他热爱者觉得一个能工作的投币装置更进一步地靠近了街机的真实，而且值得付出努力来营造对那个过去街机的怀念。丢个10便士硬币到投币口然后再听到机器发出增加点数的声音，没有什么比得上这种感受了。实际上难度也不大。取决于你街机上的投币装置，以及它如何发信号通知投了几个币。大多数投币装置分为两个部分。较大的一部分是硬币接收和验证装置。这是投币过程的物理部分，用于检测硬币是否真实以及确定它的价值。这是通过一个游戏点数逻辑电路板来实现的，通常用一个排线连接，上边还带有很多DIP开关。这些开关用来决定接受哪种硬币，以及一个硬币能产生多少点数。然后就是简单地找到输出开关，每个点数都会触发它一次，然后把它接到JAMMA连接头的投币输入上，或者直接接到J-Pac。我们的投币装置型号是Mars MS111，在90年代早期的英国很常见，网上有大量关于每个DIP开关作用的信息，也有如何重新编程控制器来接受新硬币的方法。我们还能在这个装置的12V上接个小灯用来照亮投币孔。第四步：软件MAME是这种规模项目唯一可行的模拟器，它如今支持运行在数不清的不同平台上的各种各样的游戏，从第一代街机到一些最近的机器。从这个项目中还孕育出了MESS，一个多模拟器的超级系统，针对的平台是80到90年代的家庭电脑以及电视游戏机。如何配置MAME本身都可以写上六页的文章了。它是一个复杂的，无序的，伟大的软件程序，模拟了如此之多的CPU，声卡，芯片，控制器以及那么多的选项，就像MythTV，你都永远不能真正配置好它。但是也有个相对省事的方式，一个特别为树莓派构建的版本。它叫PiMAME。它是一个可下载的发布版和脚本，基于Raspbian，这是树莓派的默认发布版。它不仅仅会把MAME装到树莓派上（这很有用因为没有哪个默认仓库里有这个），还会安装其他一些精选出来的模拟器，并通过一个前端来管理他们。MAME，举个例子，是一个有数十个参数的命令行应用。但是PiMAME还有一个妙招 - 它安装了一个简单的网页服务器，可以在连接上网络后让你通过浏览器来安装新游戏。这是一个很好的优点，因为把游戏文件放到正确的目录下是使用MAME的困难之一，这还能让你连接到树莓派的存储设备得到最优使用。还有，PiMAME会通过用来安装它的脚本更新自己，所以保持最新版本就太简单了。目前来说这个非常有用，因为在编写这个项目的时候，正好在0.8版这样一个重大更新发布的时间点上。我们在三月份早期时发现有一些轻微的不稳定，但是我们确定在你读到这篇文章的时候一切都会解决。安装PiMAME最好的方式就是先装Raspbian。你可以通过NOOBS安装，使用电脑上的图形工具，或者通过dd命令把Raspbian的内容直接写入到你的SD卡中。就像我们上个月的BrewPi教程里曾提到的，这个过程在之前已经被记录过很多次，所以就不再浪费口水了。想简单点就装一下NOOBS，参照树莓派网站上的指引。在装好Raspbian并跑起来以后，请确保使用配置工具来释放SD卡上的空间，以及确保系统已经更新到最新（sudo apt-get update; sudo apt-get upgrade）。然后再确保已经安装好了git工具包。当前任意Raspbian版本都会自带git，不过你仍然可以通过命令sudo apt-get install git检查一下。然后再在终端里输入下面的命令把PiMAME安装器从项目的GitHub仓库克隆到本地：git clone https://github.com/ssilverm/pimame_installer 之后，如果命令工作正常的话你应该能看到如下的反馈输出：Cloning into ‘pimame_installer’... remote: Reusing existing pack: 2306, done. remote: Total 2306 (delta 0), reused 0 (delta 0) Receiving objects: 100% (2306/2306), 4.61 MiB | 11 KiB/s, done. Resolving deltas: 100% (823/823), done. 这个命令会创建一个叫‘pimame\_installer’的新目录，然后下一步就是进入这个目录再执行它里面的脚本：cd pimame_installer/ sudo ./install.sh 这个命令会安装和配置很多软件。所需的时间长短也取决于你的因特网速度，因为需要下载大量的包。我们那个简陋的树莓派加15Mb因特网连接用了差不多45分钟来执行完这个脚本，在这之后你会收到重启机器的提示。你现在可以安全的通过输入sudo shutdown -r来重启了，因为这个命令会自动处理剩下的SD卡写入操作。这就是安装的全部事情了。在重启树莓派后，就会自动登录，然后会出现PiMAME启动菜单。在0.8版本里这是个非常漂亮的界面，有每个支持平台的图片，还有红色图标提示已经安装了多少个游戏。现在应该可以用控制器来操作了。如果需要检查控制器是否正确连接，可以用SSH连接到树莓派然后检查一下文件/dev/input/by-id/usb-UltimarcI-PACUltimarc\_I-PAC-event-kbd是否存在。默认的按键配置就可以让你选择要在你的街机上运行哪个模拟器。我们最感兴趣的就是第一个，名字叫‘AdvMAME’，不过你也许会很惊讶看到还有一个MAME可选的，MAME4ALL。MAME4ALL是特别为树莓派构建的，使用了旧版的MAME源代码，所以它所支持的ROMS的性能也是最佳的。这是很合理的，因为你的树莓派不可能玩那些要求很高的游戏，所以没有理由苛求模拟器的没必要的兼容性。现在剩下的事情就是找些游戏装到你的系统里（参考下面的方法），然后尽情享受吧！via: http://www.linuxvoice.com/arcade-machine/作者：Ben Everard 译者：zpl1025 校对：wxy本文由 LCTT 原创翻译，Linux中国 荣誉推出