计算机‎ > ‎软件‎ > ‎

Linux


在 Debian 9 安装 shadowsocks 服务端

发布者:guo rue,发布时间:2019年9月28日 下午9:05   [ 更新时间:2019年9月28日 下午9:21 ]

我之前在一台 VPS 上安装了 shadowsocks 服务端
http://wiki.guoruei.org/computer/software/linux/install-shadowsocks-on-ubuntu-vps
然后本地客户端用的是树莓派,系统是 raspbian 基于 debian7 改造的。
http://wiki.guoruei.org/computer/software/linux/install-shadowsocks-on-raspberry-pi-at-local

最近那个运行服务端的服务器被坏人盯上了。我找到新的一台运行 debian 9 的服务器重新安装服务端。然后设置开机启动。

安装和配置 shadowsocks 服务端流程和之前有点不一样了。

不知为何现在 pip 安装的 shadowsocks 已经和原来的配置文件,运行命令,不相容了。用原来的配置写进去,用原来的命令运行,却不成功。所幸我找到了替代,那就是。用 debian 的安装包。

sudo apt install shadowsocks

安装好后。配置文件和之前的一样。

但是由于 debian7 和 debian9 的开机启动机制不一样。所以就不能用原来的配置方法设置开机启动。

下面是 debian9 基于 systemd 开机启动 shadowsocks 服务端的方法。

编写开机文件
sudo nano /etc/systemd/system/shadowsocks.service

在里面写上配置
[Unit]
Description=Shadowsocks Client Service
After=network.target

[Service]
Type=simple
User=root
ExecStart=/usr/bin/ssserver -c /etc/shadowsocks.json

[Install]
WantedBy=multi-user.target

把 /etc/shadowsocks.json 修改为你的 shadowsocks.json 路径,如:/home/shadowsocks/shadowsocks.json

使文件生效
systemctl enable /etc/systemd/system/shadowsocks.service
这里提示输入 root 用户的密码


由于本地的 DNS 已经被投毒。我们还需要服务器进行 DNS 解析,所以要配置服务器的 NAMESERVER 具体参考这个脚本
http://wiki.guoruei.org/computer/software/linux/debian-kvm-2

然后重启服务器系统就可以了。

在 debian 9 更新 firefox 57 之后各种老旧扩展报废的修复

发布者:Glory Nong,发布时间:2019年3月4日 上午1:54   [ 更新时间:2019年3月4日 上午2:07 ]

在 debian 9 通常你以为
sudo apt update
然后
sudo apt upgrade
就各种老问题都拜拜了。。。然后,就来了新问题。这个 firefox 57 还有 58. 59. 60. 不是你认识的那个 firefox 了。你甚至有一声感慨,哇靠这是啥?

修复是不可能修复的,他们一帮人尽是弄出新问题。为什么要我去擦屁股。常言道,美好时光,只在昨日。

只是到了 Firefox 56 for developers 和 Firefox 57 (Quantum) for developers 才是不一样的。所以 55.54.53 什么的不用考虑了。
https://developer.mozilla.org/en-US/docs/Mozilla/Firefox/Releases

你可以安装 debian 仓库里的 firefox 新版本。看看他们都再搞什么。然后无法使用旧扩展。
sudo apt install fuckfox

安装 firefox 56 开发者版本,用来保持旧有扩展顺利使用。

到这里去找对应的架构系统包,还可以选择语言
http://ftp.mozilla.org/pub/devedition/releases/56.0b9/
下载
wget -t 99 -w 3 https://download-origin.cdn.mozilla.net/pub/devedition/releases/56.0b9/linux-x86_64/en-US/firefox-56.0b9.tar.bz2
其实 mozilla 有多个下载镜像,不要在意这些地址的细节。下载回来就行。

解压
tar xjf firefox-56.0b9.tar.bz2
列出文件,发现有一个 firefox 文件夹
ls
firefox
我选择 opt 目录下面创建要存放这个软件的文件夹
sudo mkdir /opt/mozilla/
把这个 firefox 文件夹移动过去,并且改名为 firefox-dev-56
sudo mv firefox /opt/mozilla/firefox-dev-56

然后去创建桌面图标

列出专门存放桌面图标的文件夹
ls /usr/share/applications
你会看见很多的文件,他们都是 .desktop 结尾的桌面图标文件。
emacs24.desktop                      gnome-tweak-tool.desktop               org.gnome.gedit.desktop
emacs24-term.desktop                 gnome-universal-access-panel.desktop   org.gnome.Hitori.desktop
empathy.desktop                      gnome-user-accounts-panel.desktop      org.gnome.Logs.desktop
eog.desktop                          gnome-user-share-webdav.desktop        org.gnome.Maps.desktop
evince.desktop                       gnome-wacom-panel.desktop              org.gnome.Nautilus.desktop
evince-previewer.desktop             golly.desktop                          org.gnome.Nibbles.desktop
evolution-calendar.desktop           goobox.desktop                         org.gnome.Packages.desktop
evolution.desktop                    gparted.desktop                        org.gnome.PackageUpdater.desktop
fcitx-config-gtk3.desktop            gpk-log.desktop                        org.gnome.Photos.desktop
fcitx-configtool.desktop             gthumb.desktop                         org.gnome.Polari.desktop
fcitx.desktop                        gthumb-import.desktop                  org.gnome.Screenshot.desktop
fcitx-skin-installer.desktop         gucharmap.desktop                      org.gnome.Shell.desktop
filezilla.desktop                    hamster-time-tracker.desktop           org.gnome.Shell.PortalHelper.desktop
firefox-esr.desktop                  hamster-time-tracker-overview.desktop  org.gnome.Software.desktop
firefox-esr.desktop.diverted         hamster-windows-service.desktop        org.gnome.SoundRecorder.desktop
five-or-more.desktop                 iagno.desktop                          org.gnome.taquin.desktop
flash-player-properties.desktop      icedtea-netx-javaws.desktop            org.gnome.Terminal.desktop
其中就有 firefox esr 不过不管他。我们新建一个桌面图标用来启动 firefox dev 版。
sudo nano /usr/share/applications/firefox-dev.desktop
再里面填上
[Desktop Entry]
Name=Firefox Developer Edition
GenericName=Firefox Developer Edition
Exec=/opt/mozilla/firefox-dev-56/firefox
Terminal=false
Icon=/opt/mozilla/firefox-dev-56/icons/updater.png
Type=Application
Categories=Application;Network;X-Developer;
Comment=Firefox Developer Edition Web Browser.
保存退出。

这个时候,我建议你先断开网络连接。防止浏览器启动之后自动升级到最新版本 60 或者更高,而我想要的是 56 这个老版本。

就可以去找开始菜单里面的 Firefox Developer 程序图标了。

或者回到程序的文件夹
cd /opt/mozilla/firefox-dev-56
执行
./firefox
或者后台执行
./firefox &
就可以使用火狐开发者版浏览器了

第一件事情就是,去浏览器里设置禁止自动升级。
点击 Edit 下拉选择 Preferences 之后。
找到 Firefox Developer Edition Updates 选择 Never check for updates (not recommended) 就不升级了。

下载旧插件安装。这里以 scrapbook 为例子。

插件的扩展名是 xpi 所有去找这个插件,就搜索 scrapbook xpi 然后下载它。比如这个
https://github.com/TarekJor/Firefox-52-ESR-legacy-addon/blob/master/xpi/scrapbook-1.5.14-fx.xpi

许多人在 firefox 的插件网站下载下来 xpi 格式插件文件后却不知道如何去安装 firefox 插件,这里简单两步教你如何安装xpi插件。

方法一,按 Ctrl + O,选择要安装的扩展,打开即可。

方法二,把 .xpi 文件拖进 firefox 窗口里,稍后就可以看到 firefox 会询问你是否要安装这个扩展,点击“是”,然后重启浏览器。

先这样吧。都什么乱七八糟的项目啊。天啊。

在 Debian 9 安装 shadowsocks 客户端

发布者:Glory Nong,发布时间:2019年2月13日 下午8:14   [ 更新时间:2019年9月28日 下午8:55,更新者:guo rue ]

我之前在一台 VPS 上安装了 shadowsocks 服务端
http://wiki.guoruei.org/computer/software/linux/install-shadowsocks-on-ubuntu-vps
然后本地客户端用的是树莓派,系统是 raspbian 基于 debian7 改造的。
http://wiki.guoruei.org/computer/software/linux/install-shadowsocks-on-raspberry-pi-at-local

最近那个树莓派坏了。我找到一台运行 debian 9 的电脑重新安装客户端。然后设置开机启动。

不知为何现在 pip 安装的 shadowsocks 已经和原来的配置文件,运行命令,不相容了。用原来的配置写进去,用原来的命令运行,却不成功。所幸我找到了替代,那就是。用 debian 的安装包。

sudo apt install shadowsocks

安装好后。配置文件和之前的一样。

但是由于 debian7 和 debian9 的开机启动机制不一样。所以就不能用原来的配置方法设置开机启动。好烦。

下面是 debian9 基于 systemd 开机启动 shadowsocks 的方法。

编写开机文件
sudo nano /etc/systemd/system/shadowsocks.service

在里面写上配置
[Unit]
Description=Shadowsocks Client Service
After=network.target

[Service]
Type=simple
User=root
ExecStart=/usr/bin/sslocal -c /etc/shadowsocks.json

[Install]
WantedBy=multi-user.target

把 /etc/shadowsocks.json 修改为你的 shadowsocks.json 路径,如:/home/shadowsocks/shadowsocks.json

使文件生效
systemctl enable /etc/systemd/system/shadowsocks.service
这里提示输入 root 用户的密码

然后重启系统就可以了。

Debian KVM 2

发布者:guo rue,发布时间:2017年11月14日 下午1:32   [ 更新时间:2017年11月14日 下午2:16 ]

接上一篇在 debian 安装好 KVM 对网络进行设置了 bridge 之后,虚拟机启动都可以获得一个平等的 IP 地址了。可是母鸡却每次开机的时候无法访问任何网址,查来查去,发现母鸡没有获得 NAMESERVER 地址,系统的 /etc/resolv.conf 文件是空的,可是我明明再在 /etc/network/interfaces 配置文件里添加了 dns-nameservers 8.8.8.8 8.8.4.4 这一行。真烦,这和我预想的不一样,又要想办法解决。

手动的办法,每次开机,在终端里
sudo nano /etc/resolv.conf
然后写上
nameserver 8.8.8.8
保存退出

自动的办法,写一个 Shell 脚本,设置 Debian 启动后运行脚本
进入系统启动脚本目录
cd /etc/init.d/
创建一个脚本
sudo nano addnameserver.sh
写上脚本内容
#!/bin/bash
### BEGIN INIT INFO
# Provides:          test
# Required-Start: $local_fs $remote_fs
# Required-Stop: $local_fs $remote_fs
# Should-Start: $network
# Should-Stop: $network
# Default-Start:        2 3 4 5
# Default-Stop:         0 1 6
# Short-Description: test
# Description: test
### END INIT INFO
#ADD NAMESERVER
echo nameserver 8.8.8.8 >> /etc/resolv.conf
cat /etc/resolv.conf
exit 0
保存退出

设置文件权限为可执行
sudo chmod 755 addnameserver.sh

测试脚本
sudo ./addnameserver.sh
显示
nameserver 8.8.8.8
即代表 NAMESERVER 地址写入成功并且可以读取显示。

设置脚本开机时启动
sudo update-rc.d addnameserver.sh defaults

重启测试
sudo reboot

如果你的脚本没有达成目标,可以设置脚本开机时不启动[可选]
sudo update-rc.d -f addnameserver.sh remove

然后删除脚本文件
sudo rm addnameserver.sh

Debian KVM

发布者:guo rue,发布时间:2017年9月18日 下午10:05   [ 更新时间:2017年9月19日 下午9:53 ]

安装准备

这里是用一台有显示器有键盘的普通PC,通过网线 SSH 登录到一台没有键盘没有显示器的服务器进行安装的。服务器系统为 Debian GNU/Linux 9 (stretch) 64-bit 。

首先从 普通 PC 登录服务器
ssh nong@192.168.2.11
查看你的硬件是否支持虚拟化。
命令:
egrep '(vmx|svm)' /proc/cpuinfo
要有 vmx 或 svm 的标识才行。

查看一下 操作系统 是32位还是64位
file /bin/ls
返回结果中将显示  64bit  或 32bit

安装
sudo apt-get install kvm qemu
sudo apt-get install virtinst python-libvirt virt-viewer virt-manager
sudo apt install qemu-kvm libvirt-clients

查看kvm内核模块是否已加载  
sudo lsmod | grep kvm
若KVM内核没加载执行下面命令加载:
sudo modprobe kvm

添加用户到 kvm
sudo adduser nong libvirt
sudo adduser nong libvirt-qemu
这里 nong 是我的用户名字,你需要换成你的比如 aaa 或者 bbb

如果添加不成功,可能你是老系统,需要执行如下
sudo adduser nong kvm
sudo adduser nong libvirt

然后试试列出全部虚拟机
virsh list --all
看看能不能执行,不能执行就是没有安装好或者用户没有添加成功,没有权限或者权限不对。

网络设置
sudo nano /etc/network/interfaces
文件默认
--------------------------------------
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

source /etc/network/interfaces.d/*

# The loopback network interface
auto lo
iface lo inet loopback
--------------------------------------
修改后的文件
--------------------------------------
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

source /etc/network/interfaces.d/*

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
auto eth0
iface eth0 inet manual

auto br0
iface br0 inet static
        address 192.168.2.11
        netmask 255.255.255.0
        network 192.168.2.0
        broadcast 192.168.2.255
        gateway 192.168.2.1
        bridge_ports eth0
        bridge_stp off
        bridge_fd 0
        bridge_maxwait 0
        dns-nameservers 8.8.8.8 8.8.4.4
------------------------------------------------------
保存退出

重起机器
sudo reboot

测试网络
这个时候 eth0 已经没有具体的 IP 地址。IP地址出在了 br0 的虚拟网上面。我们 ping 一下公网 ip,看看是不是通的。
ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_req=1 ttl=46 time=51.7 ms
64 bytes from 8.8.8.8: icmp_req=2 ttl=46 time=50.8 ms

建立虚拟机

建立文件夹
mkdir /var/www/html/debian
下载安装镜像放在 /var/www/html/debian 目录下面。
cd /var/www/html/debian
wget -c http://192.168.2.31/debian-8.8.0-amd64-netinst.iso

创建 img 镜像文件(快照)
qemu-img create debian8.img 6G
以下是其他发行版的
qemu-img create ubuntuserver.img 12G
qemu-img create centos.img 36G
使用 qemu-img 来创建一个空的镜像文件,可以用 -f 参数来指定镜像文件格式,默认为 raw

下面的命令将会创建 10 GB 大小的空磁盘,并且它是 qcow2 格式的。
qemu-img create -f qcow2 /home/dev/images/alice.img 10G
使用 qcow2 格式的磁盘镜像的好处就是它在创建之初并不会给它分配全部大小磁盘容量(这里是 10 GB),而是随着虚拟机中文件的增加而逐渐增大。因此,它对空间的使用更加有效。

系统软件也有了,这样硬盘也有了,那就开始安装系统到虚拟机的硬盘吧。

以下命令生成一个虚拟机。名字为 debian8 分配一个处理器内核,内存 1024M,硬盘用的是 debian8.img 这个是之前创建好了的,然后光驱的系统软件为 debian-8.8.0-amd64-netinst.iso。 网络为桥接模式,需要提前把路由器的 DHCP 服务打开,以便获得 IP 地址。支持安装期间用 VNC 控制。
sudo virt-install --name debian8 --vcpu=1 --memory 1024 --disk path=/dev/shm/debian8.img,size=4 --cdrom /dev/shm/debian-8.8.0-amd64-netinst.iso --network bridge:br0 --graphics=vnc,listen=0.0.0.0
[sudo] password for nong:
WARNING  Graphics requested but DISPLAY is not set. Not running virt-viewer.
WARNING  No console to launch for the guest, defaulting to --wait -1

Starting install...
Creating domain...                                                                                           |    0 B  00:00:01    
Domain installation still in progress. Waiting for installation to complete.
Domain has shutdown. Continuing.
Domain creation completed.
Restarting guest.

运行完上面的命令之后,提示需要sudo 密码写进去吧。然后就可以用 VNC 程序连接进行继续安装了。我的 服务器 IP 地址为 192.168.2.11 所以我用一个 debian 系统自带的 VNC 程序 Remote Desktop Viewer 选择 VNC 方式链接,填入 IP 地址。连接。接下去,就和一般的安装系统没什么区别了。安装完成之后会经历一个重启。这个时候 VNC 会断开连接。需要 重现填写之前的 IP 地址 192.168.2.11 再次连接。以便登录系统。

登录系统之后,建议第一件事就是切换到 root 账户安装 sudo
su - root
apt install sudo

修改第一个普通用户获得 sudo 权限
visudo
添加以下行列到
root        ALL=(ALL:ALL) ALL
行下面
nong        ALL=(ALL:ALL) ALL

exit

然后你可以选择更新软件,安装 SSH 服务器
sudo apt install openssh-server

设置虚拟机的静态 IP 地址
sudo nano /etc/network/interfaces
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

source /etc/network/interfaces.d/*

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
#allow-hotplug eth0
#iface eth0 inet dhcp
auto eth0
iface eth0 inet static
        gateway 192.168.2.1
        address 192.168.2.111
        netmask 255.255.255.0

这样设置好后就可以重启虚拟机。然后关闭 VNC 程序,回到普通 PC 的命令行终端上执行
sudo virsh list --all
查看所有虚拟机状态
 Id    Name                           State
----------------------------------------------------
 -     debianmini                     running

然后,对于虚拟机操作。

查看虚拟机的详细信息
sudo virsh dominfo debianmini
编辑虚拟机的配置文件
sudo virsh edit debianmini
开机
sudo virsh start debianmini
关机(类似紧急情况直接拔掉电源,不推荐这样的做法,应该去系统里面 sudo poweroff 比较稳妥)
sudo virsh shutdown debianmini
摧毁虚拟机
sudo virsh destroy debianmini


虚拟机克隆
克隆前确认主机已经关闭
sudo virsh list --all
Id    Name                           State
----------------------------------------------------
-     ubuntuserver                   shut off

如果没有关闭的使用下面的命令关闭
sudo virsh shutdown ubuntuserver

查看虚拟机配置文件
sudo ls /etc/libvirt/qemu/
networks  ubuntuserver.xml
获取硬盘文件路径
sudo cat /etc/libvirt/qemu/ubuntuserver.xml |grep 'source file'|grep img

开始克隆
virt-clone -o ubuntuserver -n gitlab -f /var/www/html/ubuntu/gitlab.img

好的,那我现在复制了这几个
virsh list --all
Id    Name                           State
----------------------------------------------------
-     gitlab                         shut off
-     gitlab2                        shut off
-     ubuntuserver                   shut off
-     ubuntuserver2                  shut off

ubuntuserver 作为母盘,所有镜像之母 IP 192.168.2.12
ubuntuserver2 继承母盘的 IP 地址,这个 IP 将被路由器 DMZ 暴露出去
gitlab 作为 gitlab 部署项目测试的机器
gitlab2  从母盘新建的第二个 gitlab 部署项目测试的机器

如何删除虚拟机
先列出所有虚拟机名字
sudo virsh list --all
显示
Id    Name                           State
----------------------------------------------------
-     gitlab                         shut off
-     gitlab2                        shut off
-     ubuntuserver                   shut off
-     ubuntuserver2                  shut off
然后取相应的名字,比如这里要删除 gitlab2 这个虚拟机
sudo virsh undefine gitlab2
然后,去删除对应的 img 文件
rm /var/www/html/ubuntu/gitlab2.img

后记

这篇文章太长了,几个部分是分开在一个月中的不同时间来写的,有时写几分钟,有时写十几分钟,生活所迫,只能挤一挤。我自己已经检查运行一遍了,如果你在阅读和使用的时候,发现问题,欢迎联系我。到时候在做修改了。我的邮箱 nong@guoruei.net

参考。
https://wiki.debian.org/KVM
https://wiki.debian.org/SSH

专供开发人员免费下载和更新的 Red Hat Enterprise Linux(RHEL)

发布者:guo rue,发布时间:2017年6月23日 下午7:50   [ 更新时间:2017年6月23日 下午8:01 ]

长期以来 Red Hat 操作系统只能购买订阅,然后才能使用订阅服务获得系统更新。如果你不是通过官方网站下载并且购买订阅,那么你的系统将是非授权安装,没有任何客服支持,也没有任何可用的系统更新。在产品服务器上运行这样的系统将会导致不可预知的技术风险。 所以如果产品要运行在 Red Hat 系统之上,最好购买商业订阅。

那么开发呢?如果仅仅是开发阶段也要购买商业订阅才能获得更新的话,无疑会造成研发资源压力。现在好了。2016年03月31日 Red Hat 宣布,凡是注册其最新推出的“开发者订阅”的开发人员可以免费下载 Red Hat Enterprise Linux 操作系统。此外,Red Hat 同时宣布在“开发者订阅”中,也可以免费使用它的 JBoss 中间件。如果你想成为一位 Red Hat Enterprise Linux 开发者,你现在就可以从 Red Hat 网站上下载最新版本的 RHEL 。

大多数人可能觉得这不可思议,好吧,关键点是,按照协议,这些免费提供的产品不能用于产品环境,只能用于本地的应用开发环境,如果用在产品环境需要购买付费订阅。

这个免费的 Red Hat 企业版 Linux 开发者套装包括 Red Hat 企业版 Linux 服务器和各种开发工具,Red Hat 会支持10年,包括 PHP、 Python、 Ruby、 OpenJDK 7(1.7)和 OpenJDK 8(1.8)。

“通过该订阅,可以免费下载使用 Red Hat 企业版 Linux 和 Red Hat JBoss 中间件,开发借助这些开发平台和工具,可以很容易地使用我们的技术来启动项目和寻求解决方案,如果部署到产品环境中也可以得到商业支持,而不用担心移植或不兼容问题。” Red Hat 的开发工具和市场总监 Harry Mowersenior 说。

现在就去注册下载你的 Red Hat 企业版 Linux 开发者套装吧!

http://developers.redhat.com/products/rhel/get-started/

参考:

http://www.redhat.com/en/about/press-releases/red-hat-expands-red-hat-developer-program-no-cost-red-hat-enterprise-linux-developer-subscription
https://linux.cn/article-7182-1.html

国瑞学用 emacs 续六

发布者:guo rue,发布时间:2016年3月28日 下午10:20   [ 更新时间:2016年3月28日 下午10:25 ]

模式
模式是在特定的内容类型的环境下 Emacs 特性的表达方法。也就是说,缩进的表现在 C 源代码文件和在 HTML 文件中是不同的,在给您的老板的信中的表现也是不同的。每个缓冲区的主要模式显示在状态行上缓冲区名字的右边的括弧中。

有两种不同的模式类型:主要和次要。每次只有一个主要模式被激活,但它们修改次要模式的解释。例如,在大多数的代码编写中,缩进参照的仅是上一行。在 .txt 文档中按 Tab 键(文本模式已被自动调用),一个制表符被插入并显示为 8 列。

而在这个 XML 文档中,Emacs 缺省地调用 SGML 模式。在这里,按 Tab 键有效果的前提是上一行的开头有空格,在这种情况下,光标被放在上一行第一个不是空格的匹配的那一列,距离由空格字符填充,而不是一个制表符。

缩进表现是次要模式的一部分,它的活动由当前调用的主要模式来修改。模式还可以直接表现为语法突出显示的区别和文本被自动填充的方式的区别。

再谈模式
主要模式通常由 Emacs 根据文件名或(有时)文件内容来正确设置。您可以明确地设置缓冲区的模式,方法是输入 M-x 加有效的模式名。

例如,如果我打开一个叫 bob.txt 的文件,缓冲区会以 text-mode 打开它。为了转入 c-mode,我输入 M-x c-mode。根据消息缓冲区,这实际上为我调用的是 cc-mode 并在状态栏上显示为 C Abbrev)。

列出 Emacs 自动识别的所有主要模式的方法是输入 M-x describe-variable,按 Enter,然后在小缓冲区的提示符后输入 auto-mode-alist。一些我常用的模式包括文本、c 和 SGML,有时还用 LISP。

编译代码
看了模式列表后,您显然可在 Emacs 中做很多事。然而最重要的是,Emacs 是程序员的编辑器。在 Emacs 环境中,您可以编写代码、编译、调试和测试软件,还可以做其它事。在这里,我不准备讲所有的这些主题,但让我们假设我已用 C 语言写了一个典型的 Hello World 之类的程序。

当我输入该程序并把缓冲区存到磁盘上后,我输入 M-x compile,于是,在小缓冲区中出现这样的提示符:Compile command:,后面可能还有缺省值。我输入 gcc -o hello hello.c 并按 Enter。一个编译窗口被打开,它包含如下的文本:
cd /home/nong/
gcc -o hello hello.c

Compilation finished at Sun Mar 17 16:18:55
为了查看我的程序能否运行,我从 Emacs 中运行它:M-! ~/hello。在小缓冲区中,我的输出是:“Hello, World!”

Emacs 和 LISP
Emacs 这个名字有点象 Editor MACroS 的缩写。所以,Emacs 中的另一经常的代码编写体验涉及在 LISP 的 Emacs 版本中设置变量和写宏。LISP 被嘲讽为“Lots of Insane Stupid Parentheses(许多神经病的愚蠢的括弧)”的缩写,但它在很多方面是一门成功的语言,尤其是 Emacs。

Emacs 变量可在命令行中设置(如果您知道它们的名字和适当的值),设置方法是输入 M-x set-variable ,然后在提示符后输入变量名和它的新值。您也可以直接通过求它们的值来设置变量。为此,我建议使用草稿缓冲区。从“LinuxDoc Emacs Beginner HOWTO”中借用一个示例(请参阅参考资料),让我们修改自动填充模式(即词语自动换行)的宽度:
(setq fill-column 20)
输入后,把光标留在行末,输入 C-x C-e 来求表达式的值。在小缓冲区中结果是 20。测试它的方法是使用 M-q(fill-paragraph)命令来重新格式化文本的一个段落。

随着您学习的深入,您还可以编写实现新功能的代码。通过试验找到您喜欢的设置。然后,您可以把它们放在您的 ~/.emacs 定制文件中,以便今后使用。

Emacs 中的连接
电子邮件和 Web 浏览工具已被构建到 Emacs 中。发送新的电子邮件消息的第一步是输入 %%%%IBS%%%% C-x m。当您写完后,用 C-x C-s 保存并发送您的消息。阅读邮件要稍稍复杂些。 参考资料 at the end of the tutorial Web 浏览的实现是通过把 URL 发送到外部的浏览器或直接在 Emacs 中运行象 Lynx 这样的文本模式浏览器。输入 M-x browse-url-lynx-emacs 来调用 Lynx,输入 URL,就可以了。下面运行的示例是在一个终端模式 Emacs 会话中的电子邮件撰写和浏览。

不停地工作,不能玩……
当然,游戏已被构建到 Emacs 中,有“Towers of Hanoi”和“Life through a variant of Tetris”(tm),还有古老的“Adventure”的另一版本,如下面的清单所演示的:
E/W Dirt road
You are on the continuation of a dirt road.  There are more trees on
both sides of you.  The road continues to the east and west.
There is a large boulder here.
>look at boulder
It is just a boulder.  It cannot be moved.
>climb boulder
You can't climb that.
...
甚至还有著名的 Rogerian 心理程序,Eliza,在早上三点,无论您怎样做都无法编译时,它能让您通过难关。输入 M-x doctor。它比任何 900 号码都便宜得多,是吗?

把叉子插入其中……
我们已完成!祝贺您漂亮地完成任务。我在很多年前学用 Emacs 时,我发现它有点……恐怖。我已尽力为您打下一个好的基础,使您掌握这个强大的编辑工具的概念和使用。

使用 Emacs。在其中生活一段时间,学会喜欢它。象所有的复杂程序,您得花些时间才能完全理解它,但这种努力是值得的:您将熟练掌握一个最常见的 UNIX 编程实用程序并学会肯定适应市场的技能。

参考资料
以下是使您更快掌握 Emacs 的一些参考资料:
        Linux 文档计划(Linux Documentation Project)中的 The Emacs Beginner HOWTO 是不错的入门读物。
        The GNU Emacs Manual%%%%IBS%%%% 是该编辑器的最终参考资料,链接来自 GNU Emacs 主页。
        如果您更喜欢 XEmacs,那么您需要访问 XEmacs 主页。
        在 IBM 的 developerWorks 站点,您可以找到各种参考资料,用于扩展您对 Emacs 的使用,例如 Using Regular Expressions。
        还有,在 Emacs 的讨论中如果不讲它在 Linux 文本编辑器范围中的死对头,那么这种讨论是不完全的。请查看 vi intro - the cheat sheet method,自己看看它到底怎样。
        Emacs 的终级的首选的参考资料是永远流行的 Learning GNU Emacs 和 GNU Emacs Pocket Reference,均来自 O'Reilly。请在您喜欢的在线或传统书商那挑选它们。
        Emacs 的授权协议是自由软件基金的 GNU GPL。
        如果您想获得更多关于 Emacs 的历史(和许许多多其它 UNIX 主题),请参见行话文件。

国瑞学用 emacs 续五

发布者:guo rue,发布时间:2016年3月28日 下午10:09   [ 更新时间:2016年3月28日 下午10:11 ]

查找文件
在 Emacs 中,文件并不是在磁盘上编辑。相反,被指定文件的副本被放入缓冲区,所有的编辑在缓冲区中进行;写回磁盘文件是显式操作。当您要把文件装入缓冲区进行编辑时,您“查找”它。输入 C-x C-f 后在小缓冲区中产生如下的缺省提示符:Find file: ~/。按几次 Tab 键,得到目录列表,这样您就可以浏览到想要的文件(如下图所示)。然后按 Enter,把该文件读入缓冲区。

自动保存、保存和另存为
好消息 ― Emacs 确实包含自动保存选项,通过配置该选项可以把您的文件保存到指定的位置。例如,在我的配置中,本教程的自动保存文件的名字是 #Living_In_Emacs.xml#,它位于和原始文件相同的目录。其它配置有不同的命名约定和保存位置(常常是 /var/tmp)。Emacs 自动保存的缺省值是在 30 秒空闲时间或 300 个输入事件后。

在本教程的开头,我介绍了 save-buffer 命令:C-x C-s。把缓冲区内容另存为不同文件名的对应键绑定是 C-x C-w。路径/文件名提示符出现在小缓冲区中,可通过一对 Tab 击键把它展开为目录列表,就象查找文件。

注意,使用 write-file 命令来另存后,缓冲区和新文件名相关联。如果您习惯于保持原文件名不变的编辑器,那么将要费点功夫来适应。

启动时的缓冲区
使用多个缓冲区是很容易的。然而,Emacs 本身是一个文本应用程序,所以有一组命令用于切换缓冲区和查看它们。当 Emacs 不带文件参数启动时,有两个叫草稿(scratch)和消息(messages)的初始缓冲区。为了编辑,您打开的其它缓冲区的命名是根据包含它们内容的文件。

草稿缓冲区的命名是适当的。它被用于临时存储和快速 Emacs LISP 宏的开发和测试。Emacs 退出时,它没被保存,所以别把您在乎的东西留在那。消息缓冲区包含命令和后台活动的“系统级”输出,如下面的摘录所示。
Loading sgml-mode...done
Auto-saving...done
Wrote /home/bilbrey/Documents/IBM/LIE/Living_In_Emacs.xml
Auto-saving...done

Emacs 中的窗口
接下来,考虑 Emacs 中的窗口。第一步,您可以通过输入 C-x 2 来水平分割,从而得到当前缓冲区的两个视图(而 C-x 3 垂直分割它们)。这并不打开新缓冲区,因为那将是数据的独立副本。相反,它是同一缓冲区的窗口。

在可见窗口之间切换的键绑定是 C-x o,它绑定的命令是 other-window。它在可见窗口间循环。在学 Emacs 时,我常用这个命令来切入和切出帮助窗口。当我在写代码时需要经常在模块和头文件间转来转去的时候,它也很有用。

把您的窗口数目减为一的方法是输入 C-x 1,这将最大化当前包含光标的窗口并关闭其它窗口。

使用中的缓冲区
试验缓冲区的方法是先打开多个测试文件。然后使用命令 C-x C-b 来列出所有的缓冲区。您的列表应和这相似:
 MR Buffer           Size  Mode         File
 -- ------           ----  ----         ----
.*  practice1.txt     490  Text ~/practice1.txt
    test2.txt        1  Text ~/test2.txt
    test1.txt        0  Text ~/test1.txt
 *  *scratch*      191  Lisp Interaction 
 *  *Messages*      501  Fundamental
MR 列反映每个缓冲区的“改过(Modified)”和“只读(Read-Only)”状态。Buffer(名)、Size 和 File 就不必解释了(分别是缓冲区、大小和文件),我们将在本教程末尾讲 modes。切换到缓冲区列表窗口(使用 C-x o),然后把光标移到您想打开的新缓冲区的那一行,再按 Enter 来选择它。缓冲区列表在窗口中被换成所选的缓冲区。如果您愿意,您可以最大化该窗口。

另外,有各种与缓冲区菜单有关的命令和相应的键绑定。通过输入 C-h d Buffer-menu- 在窗口中列出它们,然后按 Tab 键来得到命令列表。对我来说最有用的是用于退出的“q”。但是它并不关闭打开的窗口。您需要自己做。

再谈缓冲区
如果您知道您的目的缓冲区的名字(我常常是这种情况),那么缓冲区列表的使用就没必要。先在小缓冲区中输入 C-x b 以得到提示符,然后输入目的缓冲区的名字 ― 或至少输入足够的多,以致于能用 Tab 键来完成。按 Enter,把那个缓冲区在当前窗口中打开。

关闭(kill)当前缓冲区的方法是输入 C-x k。出现在小缓冲区中的第一个提示符确认被关闭的缓冲区的名字。如果该缓冲区的内容没被更改过,按 Enter 来关闭该缓冲区。否则,将有第二个确认,用于丢弃更改过的缓冲区,只能回答“yes”或“no”。


复习:文件、缓冲区和窗口
这一章要掌握的主要概念如下。

    文件是磁盘上的实体。
    缓冲区是文件中的数据的副本,可被 Emacs 编辑。
    窗口是缓冲区的视图。

下表总结了前几屏中出现的命令。
键绑定 操作(命令)
C-x C-f find-file
C-x C-s save-buffer
C-x C-w write-file
C-x 2 split-window-vertically
C-x 3 split-window-horizontally
C-x o other-window
C-x 1 delete-other-windows
C-x C-b list-buffers
C-x b switch-to-buffer
C-x k kill-buffer

国瑞学用 emacs 续四

发布者:guo rue,发布时间:2016年3月28日 下午9:13   [ 更新时间:2016年3月28日 下午9:43 ]

递增搜索,第 1 部分
递增搜索是 Emacs 中我喜欢的特色之一。当您开始输入时,它们马上开始匹配文本。它的好处是您常常不需要输入整个词就可以完成搜索。

标准的向前递增搜索是由 C-s 命令启动的。从光标位置向后搜索是由 C-r(isearch-backward)命令来完成。有各种内部搜索命令可使用;您可以输入以下命令来得到全部描述:
C-h d isearch-forward
突出显示的包括递增匹配:向前匹配用 C-s 和向后匹配用 C-r。还有,当您到达您的目标时,按 Enter 或 C-g 来终止搜索。

递增搜索,第 2 部分
现在试用递增搜索。把光标移到练习文档的开头,再输入 C-s。提示符出现在小缓冲区中 ― I-search:。然后,慢慢地输入您想搜索的词的字母。随着您增加每个字母,突出显示区域在您的缓冲区中行进,显示您已输入部分的第一个匹配。在下面的屏幕片段中,您可以看到第一个匹配在紫红色中,下一个可能的匹配在淡绿色中。

正则表达式搜索
正则表达式搜索也是递增的但使用正则表达式来提供更强大的搜索功能。我不准备在本教程中讲正则表达式,但您可以找到很多不错的印刷的或在线的参考资料。

启动向前正则表达式搜索的方法是输入 ESC C-s(也就是,Esc 键,然后 Ctrl 键加“s”键)。类似地,向后搜索的方法是使用 ESC C-r。

例如,让我们假定由于奇怪的原因我的文本中的某处有 bartok 和 footok。我想找到任一个的最接近的实例,为此我可以只用一次正则表达式搜索而不是搜索两个再记下行号等。

现在,我可能输入
ESC C-r bar\|foo
它先匹配上面的 bartok。然后,随着我加上表达式的“或 foo”部分,该命令从搜索点开始重新检查,发现 footok 才是真正最接近的。现在,我可以用 C-r 或 C-s 来分别向后或向前递增搜索缓冲区中的各种 foo 和 bar。

替换文本
Emacs 中,替换命令有两种基本类型。第一种是无条件替换,它基于字符串或正则表达式规范。没有缺省的键绑定(由此我不得不得出结论它并不被认为是重要的),但它的使用方法是输入 M-X replace-string(或 M-x replace-regexp)。跟在后面的是目标字符串/表达式和替换字符串。替换是无条件的并且仅从光标位置开始向前替换。

第二个命令 query-replace 的绑定键是 M-%(另一个需按 Shift 的击键)。您在小缓冲区中的提示符后输入目标和替换字符串后,每个匹配按顺序被突出显示,您会收到该采取什么操作的提示。按 ? 将显示各种可能的回答的全部列表。最常见的是:“y”表示替换并继续,“n”表示跳过并继续,“q”表示退出,还有 ! 表示无条件替换剩下的全部匹配。

在练习缓冲区中试用这些命令。

搜索和替换总结
下面的表总结了我们已讲过的 Emacs 基本搜索和替换功能。记住,您可以得到任何命令的详细帮助,不管它有没有键绑定,方法是输入 C-h d command-name。
键绑定 操作(命令)
C-s isearch-forward
C-r isearch-backward
<find> search-forward
Esc C-s isearch-forward-regexp
Esc C-r isearch-backward-regexp
n/a replace-string
M-% query-replace

国瑞学用 emacs 续三

发布者:guo rue,发布时间:2016年3月27日 下午10:53   [ 更新时间:2016年3月27日 下午10:55 ]

移动光标
在 GUI 环境中运行 Emacs 意味着您可以使用鼠标或方向键(例如向上和向下的箭头以及 Home 和 End 键)在文档中移动光标。然而,我将回顾 Emacs 自身的移动方式,因为这是唯一保证能用的方法,不管您是在拨号线上的终端,还是通过控制台或 SSH 连接访问一台机器,还是任何其它方法。

它自身的键移动方式还有其它好处,那就是使您的手总放在键盘上,在属于它们的地方,不仅为了效率,也为了人体工学。当我在 GUI 模式中使用工具时,我发现键盘和鼠标间的环境切换使我失去 10% 的效率。

象前面那样启动 Emacs(输入 emacs filename.txt),接着在呈现在您面前的初试窗口中输入几行(或复制这屏)。

Emacs 光标移动 ― 字符
Emacs 有时用字符助记符来帮助您,使您的手指学会这些命令而无需有意识的努力。只要记住 Previous(向上)、Next(向下)、Forward(向前) 和 Back(向后)。每个的第一个字母是您的移动键。

C-f 使光标向前移动一个字符,而 C-b 使光标向后移动一个字符。注意这包括换行。C-n 移到下一行,而 C-p 使光标向上移动一行。可能的话,垂直移动保持列不变。然而,如果下一行或上一行比当前光标所在的列短,光标将自动移到新行的末尾。如果您继续移到更长一行,光标将回到新行中的“原来”那列。

Emacs 光标移动 ― 词、行和句
从词移到词时,Forward 和 Back 仍然指引您,但要用 Meta 键而不是 Ctrl 键。注意词的定义是连续的字母和数字。在词与词之间移动时,标点符号被算作空格。在我们学习它们时,每个命令都试用几次。M-f 使光标向前移动一个词,而 M-b 向后移动一个词。

当我们学习更多行操作时,助记符的帮助不再那么有用:“a”和“e”键分别表示头和尾。C-a 把您带到当前行的第一列而 C-e 把您带到行末。

在一句句移动时,我们至少仍能用同样的字符。输入 M-a 把我们带回当前句子的开头(或前一句,如果光标开始时就在句首)。M-e 以同样的方式相对于句末向前移动。

句子由标点和回车或两个空格来定义。根据文本,结果并不总是真的一句句地移动,但有点象段落。

Emacs 光标移动 ― 屏幕
一次移动一个屏幕是很有用的操作,下面是完成它的命令。C-v 使文本向前滚动一个屏幕而 M-v 则相反。为了方便,有两行重叠,使您更容易记住上下文。另外,输入 C-l(这是小写“L”)可以移动窗口,使当前光标位置处于窗口的中央。

最后,移到缓冲区的开头和末尾的击键如下:M-< 把您带到开头,而 M-> 把您带到末尾。它们确实是 < 和 >,所以您需用 Shift 键。

光标移动注解
键绑定 操作(命令)
C-f forward-char
C-b backward-char
C-n next-line
C-p previous-line
M-f forward-word
M-b backward-word
C-a beginning-of-line
C-e end-of-line
M-a backward-sentence
M-e forward-sentence
C-v scroll-up
M-v scroll-down
C-l re-center

在测试文档中练习这些击键并一直用下去。我发现我必须在一段时间内强迫自己不用光标键和鼠标。通过把我的手指总是放在键盘的中央一行(asdf jkl;)并有意识地使用这些命令,我很快能容易地浏览每个文件的缓冲区。

1-10 of 131