<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>飞扬轻狂&#039;s blog &#187; shell</title>
	<atom:link href="http://blog.fallseir.com/category/shell/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.fallseir.com</link>
	<description>我心飞扬 我意轻狂</description>
	<lastBuildDate>Thu, 06 May 2010 07:13:50 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
<atom:link rel="hub" href="http://pubsubhubbub.appspot.com"/><atom:link rel="hub" href="http://superfeedr.com/hubbub"/><cloud domain='blog.fallseir.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
		<item>
		<title>Ant Helloworld</title>
		<link>http://blog.fallseir.com/2010/03/ant-helloworld/</link>
		<comments>http://blog.fallseir.com/2010/03/ant-helloworld/#comments</comments>
		<pubDate>Wed, 03 Mar 2010 08:21:10 +0000</pubDate>
		<dc:creator>飞扬轻狂</dc:creator>
				<category><![CDATA[shell]]></category>
		<category><![CDATA[笔记]]></category>
		<category><![CDATA[helloworld]]></category>

		<guid isPermaLink="false">http://blog.fallseir.com/?p=216</guid>
		<description><![CDATA[使用Ant快速开始一个Helloworld程序 == 安装ant == 1)、 下载最新版本的ant 2)、 安装ant * 将ant安装包解压到安装目录 本文使用ant版本为 apache-ant-1.8.0 安装位置为 D:\Program Files\apache-ant-1.8.0 * 配置环境变量 添加变量 ANT_HOME = D:\Program Files\apache-ant-1.8.0 更新变量 PATH 在原有值后面添加 ;%ANT_HOME%\bin * 测试 在命令行下输入 ant -v 查看ant版本 == 运行 Helloworld for java == * 编写 Helloworld.java 位置 E:\learn\ant\helloworld\src\oata\Helloworld.java package oata; public class HelloWorld { public static void main(String[] args) { [...]]]></description>
			<content:encoded><![CDATA[<p>使用Ant快速开始一个Helloworld程序</p>
<p>== 安装ant ==<br />
1)、 <a href="http://ant.apache.org/bindownload.cgi">下载</a>最新版本的ant<br />
2)、 安装ant<br />
* 将ant安装包解压到安装目录<br />
本文使用ant版本为 apache-ant-1.8.0<br />
安装位置为 D:\Program Files\apache-ant-1.8.0<br />
* 配置环境变量<br />
添加变量 ANT_HOME = D:\Program Files\apache-ant-1.8.0<br />
更新变量 PATH 在原有值后面添加 ;%ANT_HOME%\bin<br />
* 测试<br />
在命令行下输入 ant -v 查看ant版本<br />
== 运行 Helloworld for java ==<br />
* 编写 Helloworld.java<br />
位置 E:\learn\ant\helloworld\src\oata\Helloworld.java</p>
<pre>
package oata;
public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello World");
    }
}
</pre>
<p>* 编译并运行HelloWorld程序</p>
<pre>
# 创建目标路径
> mkdir \a build\classes
# 编译java源文件
> javac -sourcepath src -d build\classes src\oata\HelloWorld.java
# 执行helloworld程序
> java -cp build\classes oata.HelloWorld
# 构建 jar 文件
## 创建 jar 描述文件
> echo Main-Class: oata.HelloWorld>myManifest
## 打包jar文件
> mkdir build\jar
> jar cvfm build\jar\HelloWorld.jar myManifest -C build\classes .
## 通过jar 文件运行 helloworld 程序
> java -cp build\jar\HelloWorld.jar oata.HelloWorld
</pre>
<p>== 使用 ant 脚本 编译并执行 helloworld 程序 ==<br />
- E:\learn\ant\helloworld\build.xml</p>
<pre class="code">&lt;project&gt;
    &lt;target name="clean"&gt;
        &lt;delete dir="build"/&gt;
    &lt;/target&gt;
    &lt;target name="compile"&gt;
        &lt;mkdir dir="build/classes"/&gt;
        &lt;javac srcdir="src" destdir="build/classes"/&gt;
    &lt;/target&gt;
    &lt;target name="jar"&gt;
        &lt;mkdir dir="build/jar"/&gt;
        &lt;jar destfile="build/jar/HelloWorld.jar" basedir="build/classes"&gt;
            &lt;manifest&gt;
                &lt;attribute name="Main-Class" value="oata.HelloWorld"/&gt;
            &lt;/manifest&gt;
        &lt;/jar&gt;
    &lt;/target&gt;
    &lt;target name="run"&gt;
        &lt;java jar="build/jar/HelloWorld.jar" fork="true"/&gt;
    &lt;/target&gt;
&lt;/project&gt;
</pre>
<p>* 执行Ant脚本</p>
<pre>
# 执行ant脚本，编译打包并运行helloworld程序
> ant compile jar run
# 查看Ant项目中可用的Target
> ant -p
</pre>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;-<br />
== 优化后的Ant脚本 ==</p>
<pre class="code">&lt;project name="HelloWorld" basedir="." default="main"&gt;
    &lt;property name="src.dir"     value="src"/&gt;
    &lt;property name="build.dir"   value="build"/&gt;
    &lt;property name="classes.dir" value="${build.dir}/classes"/&gt;
    &lt;property name="jar.dir"     value="${build.dir}/jar"/&gt;
    &lt;property name="main-class"  value="oata.HelloWorld"/&gt;
    &lt;target name="clean"&gt;
        &lt;delete dir="${build.dir}"/&gt;
    &lt;/target&gt;
    &lt;target name="compile"&gt;
        &lt;mkdir dir="${classes.dir}"/&gt;
        &lt;javac srcdir="${src.dir}" destdir="${classes.dir}"/&gt;
    &lt;/target&gt;
    &lt;target name="jar" depends="compile"&gt;
        &lt;mkdir dir="${jar.dir}"/&gt;
        &lt;jar destfile="${jar.dir}/${ant.project.name}.jar" basedir="${classes.dir}"&gt;
            &lt;manifest&gt;
                &lt;attribute name="Main-Class" value="${main-class}"/&gt;
            &lt;/manifest&gt;
        &lt;/jar&gt;
    &lt;/target&gt;
    &lt;target name="run" depends="jar"&gt;
        &lt;java jar="${jar.dir}/${ant.project.name}.jar" fork="true"/&gt;
    &lt;/target&gt;
    &lt;target name="clean-build" depends="clean,jar"/&gt;
    &lt;target name="main" depends="clean,run"/&gt;
&lt;/project&gt;
</pre>
<p>参考:<a href="http://ant.apache.org/manual/tutorial-HelloWorldWithAnt.html">Hello World with Ant</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fallseir.com/2010/03/ant-helloworld/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>笔记:安装FreeBSD &amp; 应用</title>
		<link>http://blog.fallseir.com/2009/06/freebsd_install/</link>
		<comments>http://blog.fallseir.com/2009/06/freebsd_install/#comments</comments>
		<pubDate>Tue, 02 Jun 2009 13:13:29 +0000</pubDate>
		<dc:creator>飞扬轻狂</dc:creator>
				<category><![CDATA[shell]]></category>
		<category><![CDATA[笔记]]></category>

		<guid isPermaLink="false">http://blog.fallseir.com/?p=144</guid>
		<description><![CDATA[freebsd 7.2 根据提示进行安装 并选择最小安装 在进行系统配置时 * 关闭ssh外的所有服务 * 配置ip地址 配置时区 * 添加普通用户用来远程连接ssh,设置组为 wheel 这样可以使用su访问root * 设置管理员密码 开启用户的su权限，使用su命令的用户必须存在与wheel组中 # pw groupmod wheel -m username 检查用户是否正确的添加到组中 # pw groupshow wheel mount cdrom 映射光驱 # ll /dev/acd* > acd0t01 # cd /cdrom # touch CDROM-NOT-mounted-mcd.txt # mount -t cd9660 /dev/acd0t01 /cdrom - python 安装python # cd /cdrom/packages # [...]]]></description>
			<content:encoded><![CDATA[<p>freebsd 7.2<br />
根据提示进行安装 并选择最小安装<br />
在进行系统配置时<br />
* 关闭ssh外的所有服务<br />
* 配置ip地址 配置时区<br />
* 添加普通用户用来远程连接ssh,设置组为 wheel 这样可以使用su访问root<br />
* 设置管理员密码</p>
<p>开启用户的su权限，使用su命令的用户必须存在与wheel组中<br />
# pw groupmod wheel -m username<br />
检查用户是否正确的添加到组中<br />
# pw groupshow wheel</p>
<p>mount cdrom  映射光驱<br />
# ll /dev/acd*<br />
> acd0t01<br />
# cd /cdrom<br />
# touch   CDROM-NOT-mounted-mcd.txt<br />
# mount -t cd9660 /dev/acd0t01 /cdrom</p>
<p>- python<br />
安装python<br />
# cd /cdrom/packages<br />
# pkg_add -p/home/app/python25 /cdrom/packages/python/python25-2.5.4_1.tbz<br />
映射命令<br />
# ln -s /home/app/python25/bin/python /usr/local/bin/python<br />
&#8211; require<br />
bsddb           databases/py-bsddb<br />
gdbm            databases/py-gdbm<br />
sqlite3         databases/py-sqlite3<br />
tkinter         x11-toolkits/py-tkinter</p>
<p># pkg_add -p/home/app/sqlite3 /cdrom/packages/databases/sqlite3-3.6.11.tbz<br />
映射错误的链接库<br />
# ln -s /home/app/sqlite3/lib/libsqlite3.so.8 /usr/local/lib/libsqlite3.so.8<br />
# cd /usr/local/lib/<br />
# ln -s libsqlite3.so.8 libsqlite3.so<br />
映射命令<br />
# ln -s /home/app/sqlite3/bin/sqlite3 /usr/local/bin/sqlite3</p>
<p>- emacs 安装emacs编辑器<br />
# pkg_add -p/home/app/emacs /cdrom/packages/editors/emacs-22.3.tbz<br />
# ln -s /home/app/emacs/bin/emacs /usr/local/bin/emacs</p>
<p>解除绑定的光驱<br />
#umount   /cdrom</p>
<p>注：通过pkg_add 自动获取安装包<br />
# pkg_add -r python<br />
-r 选项将导致pkg程序自动从配置的packages网络镜像获取指定应用最新的安装包</p>
<p>[:p] &#8211;飞扬.轻狂 [fallseir.lee]</p>
<p>http://fallseir.livejournal.com</p>
<p>http://feed.feedsky.com/fallseir</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fallseir.com/2009/06/freebsd_install/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>使用mysqldump进行单表备份</title>
		<link>http://blog.fallseir.com/2008/10/mysqldump_tables/</link>
		<comments>http://blog.fallseir.com/2008/10/mysqldump_tables/#comments</comments>
		<pubDate>Fri, 10 Oct 2008 09:17:39 +0000</pubDate>
		<dc:creator>飞扬轻狂</dc:creator>
				<category><![CDATA[code]]></category>
		<category><![CDATA[shell]]></category>
		<category><![CDATA[笔记]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[mysqldump]]></category>
		<category><![CDATA[X shell]]></category>
		<category><![CDATA[数据备份]]></category>

		<guid isPermaLink="false">http://blog.fallseir.com/?p=99</guid>
		<description><![CDATA[写了一个shell脚本 对数据库中每个表进行备份 这样可以方便的在表中进行筛选 bak_db_table.sh &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; # bak_db_table.sh db db_host db_user db_passwd > log.txt # by fallseir at 20081010 if [ $1 ] # 如果没有参数 then echo database $1; else echo 'backup database tables to gzip files sh bak_db_table.sh db [db_host] [db_user] [db_passwd] '; exit; fi # 参数赋值 [ $1 ] &#038;&#038; db=$1 [ $2 ] [...]]]></description>
			<content:encoded><![CDATA[<p>写了一个shell脚本 对数据库中每个表进行备份 这样可以方便的在表中进行筛选</p>
<p>bak_db_table.sh<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;</p>
<pre>
# bak_db_table.sh db db_host db_user db_passwd > log.txt
# by fallseir at 20081010

if [ $1 ] # 如果没有参数
then
echo database $1;
else
echo 'backup database tables to gzip files
sh bak_db_table.sh db [db_host] [db_user] [db_passwd]
'; exit;
fi

# 参数赋值
[ $1 ] &#038;&#038; db=$1
[ $2 ] &#038;&#038; dbh=$2
[ $3 ] &#038;&#038; dbu=$3
[ $4 ] &#038;&#038; dbp=$4

# 配置数据库参数
[ $dbh ] &#038;&#038; dbh="-h"$dbh
[ $dbu ] &#038;&#038; dbu="-u"$dbu
[ $dbp ] &#038;&#038; dbp="-p"$dbp

#如果不存在 以db命名的目录 则创建
[ -a $db ] || mkdir $db; echo "mkdir $db"

# 获取数据库中的表列表
echo 'list=(`echo "show tables;"|mysql -h$dbh -u$dbu -p$dbp $db`)'
list=(`echo "show tables;"|mysql $dbh $dbu $dbp $db`)
# 获取表个数
tbcount=$((${#list[@]}-2))
if [ $tbcount= -2 ] # 如果表不存在 或数据库连接失败
then
  echo empty tables in $db or connent failed! ; exit 1;
fi
echo table count: $tbcount

# 对每个表进行备份 并压缩
# 使用gzip -d $file 进行解压
# 使用 mysql $database < $bakfile 进行恢复
for (( i = 1 ; i < ($tbcount+1) ; i ++ ))
do
  table=${list[$i]}
  echo back table $table
  mysqldump $dbh $dbu $dbp $db $table | gzip -c > $db/177.6.db.$db.$table.gz
# $? 前一命令的返回值, 0 为成功 1为失败 但mysqldump没有遵守这个约定
  echo back table $table $?
  sleep 10
done
</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.fallseir.com/2008/10/mysqldump_tables/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>shell 中使用数组 array</title>
		<link>http://blog.fallseir.com/2008/10/array_in_shell/</link>
		<comments>http://blog.fallseir.com/2008/10/array_in_shell/#comments</comments>
		<pubDate>Fri, 10 Oct 2008 07:17:15 +0000</pubDate>
		<dc:creator>飞扬轻狂</dc:creator>
				<category><![CDATA[shell]]></category>
		<category><![CDATA[笔记]]></category>
		<category><![CDATA[array]]></category>
		<category><![CDATA[数组]]></category>

		<guid isPermaLink="false">http://blog.fallseir.com/?p=94</guid>
		<description><![CDATA[发现shell中的数组使用方法 fallseir &#8212; http://blog.fallseir.com/2008/10/array_in_shell/ $ arr=(123 34 3 5) $ echo $arr // 默认获取第一个元素 > 123 $ echo ${arr[1]} // 通过下标访问 > 34 $ echo ${arr[@]} // 访问整个数组 ，@或者* 获取整个数组 > 123 34 3 5 $ echo ${#arr[@]} // 获取数组的长度（最大下标） ，#获取长度 数组中是最后一个下标 > 3 $ echo ${#arr[3]} // 获取字符串长度 > 1 $ echo ${arr[@]:1:2} // [...]]]></description>
			<content:encoded><![CDATA[<p>发现shell中的数组使用方法<br />
fallseir &#8212; http://blog.fallseir.com/2008/10/array_in_shell/ </p>
<p>$ arr=(123 34 3 5)<br />
$ echo $arr // 默认获取第一个元素<br />
> 123<br />
$ echo ${arr[1]} // 通过下标访问<br />
> 34<br />
$ echo ${arr[@]}     // 访问整个数组 ，@或者* 获取整个数组<br />
> 123 34 3 5<br />
$ echo ${#arr[@]}   // 获取数组的长度（最大下标） ，#获取长度 数组中是最后一个下标<br />
> 3<br />
$ echo ${#arr[3]}   // 获取字符串长度<br />
> 1<br />
$ echo ${arr[@]:1:2} // 切片方式获取一部分数组内容<br />
> 34 3<br />
$ echo ${arr[@]:2} // 从第二个元素开始<br />
> 3 5<br />
$ echo ${arr[@]::2} // 到第二个元素<br />
> 123 34</p>
<p>参考 http://www.tech-recipes.com/rx/642/bash-shell-script-accessing-array-variables/</p>
<p>array 的模拟操作<br />
&#8211; http://www.tech-recipes.com/rx/911/queue-and-stack-using-array/<br />
push:<br />
array=(”${array[@]}” $new_element)</p>
<p>pop:<br />
array=(${array[@]:0:$((${#array[@]}-1))})</p>
<p>shift:<br />
array=(${array[@]:1})</p>
<p>unshift<br />
array=($new_element “${array[@]}”)</p>
<p>function del_array {<br />
local i<br />
for (( i = 0 ; i < ${#array[@]} ; i++ ))<br />
do<br />
if [ "$1" = "${array[$i]}&#8221; ] ;then<br />
break<br />
fi<br />
done<br />
del_array_index $i<br />
}</p>
<p>function del_array_index {<br />
array=(${array[@]:0:$1} ${array[@]:$(($1 + 1))})<br />
}</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fallseir.com/2008/10/array_in_shell/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>收集：vi 命令常见问题解答</title>
		<link>http://blog.fallseir.com/2007/07/%e6%94%b6%e9%9b%86%ef%bc%9avi-%e5%91%bd%e4%bb%a4%e5%b8%b8%e8%a7%81%e9%97%ae%e9%a2%98%e8%a7%a3%e7%ad%94/</link>
		<comments>http://blog.fallseir.com/2007/07/%e6%94%b6%e9%9b%86%ef%bc%9avi-%e5%91%bd%e4%bb%a4%e5%b8%b8%e8%a7%81%e9%97%ae%e9%a2%98%e8%a7%a3%e7%ad%94/#comments</comments>
		<pubDate>Thu, 05 Jul 2007 07:52:49 +0000</pubDate>
		<dc:creator>飞扬轻狂</dc:creator>
				<category><![CDATA[shell]]></category>
		<category><![CDATA[收集]]></category>

		<guid isPermaLink="false">http://blog.fallseir.com/2007/07/%e6%94%b6%e9%9b%86%ef%bc%9avi-%e5%91%bd%e4%bb%a4%e5%b8%b8%e8%a7%81%e9%97%ae%e9%a2%98%e8%a7%a3%e7%ad%94/</guid>
		<description><![CDATA[收集一篇学习使用vi的faq 【快速参考】 6.0 &#8211; 依字母顺序的vi快速参考 &#8230; 是指有些东西需要在命令之前或之后指明.这通常是说光标的移动键 (h,j,k,l,w,b等等)或者是指行号. # (这里#代表一个数字) 执行n次后面的命令&#8230; : 进入ex模式 ) 下一句 ( 上一句 } 下一段 { 上一段 ]] 下一节 [[ 上一节 0 行的开头 $ 行的末尾 ^ 行的第一个非空白字符 + 下一行的开头 - 上一行的开头 (空格) 下一个字符 (回车) 下一行 / 向前搜索 ? 向后搜索 % 查找当前小(中,大)括号的匹配字符 , 逆向重复上一个f,F,t或T操作 &#59; 重复上一个f,F,t或T操作 . 重复上一个操作 ` 转到标记处 ' 转到标记所在行的开头 [...]]]></description>
			<content:encoded><![CDATA[<p>收集一篇学习<a href="http://www.chinaunix.net/jh/24/15787.html">使用vi的faq </a><br />
【快速参考】<br />
6.0 &#8211; 依字母顺序的vi快速参考<br />
&#8230; 是指有些东西需要在命令之前或之后指明.这通常是说光标的移动键<br />
(h,j,k,l,w,b等等)或者是指行号.<br />
# (这里#代表一个数字) 执行n次后面的命令&#8230;<br />
: 进入ex模式<br />
) 下一句<br />
( 上一句<br />
} 下一段<br />
{ 上一段<br />
]] 下一节<br />
[[ 上一节<br />
0 行的开头<br />
$ 行的末尾<br />
^ 行的第一个非空白字符<br />
+ 下一行的开头<br />
- 上一行的开头<br />
(空格) 下一个字符<br />
(回车) 下一行<br />
/ 向前搜索<br />
? 向后搜索<br />
% 查找当前小(中,大)括号的匹配字符<br />
, 逆向重复上一个f,F,t或T操作<br />
&#59; 重复上一个f,F,t或T操作<br />
. 重复上一个操作<br />
` 转到标记处<br />
' 转到标记所在行的开头<br />
`` 查找前回到上一个做标记的地方<br />
'' 查找前回到上一个做标记所在行的开头<br />
~ 切换字符的大小写<br />
&quot; 保存到寄存器中<br />
!! 重复上一次SHELL命令<br />
! 把后面的文本送给命令, 取代输出(例如, !}fmt把当前的段落<br />
送给命令fmt处理,然后用fmt返回的东西替换输出.)<br />
>> 右移当前段落一个移动宽度(shiftwidth)<br />
&lt;&lt; 左移当前段落一个移动宽度(shiftwidth)<br />
>% 从当前到匹配小(中,大)括号之间的文本右移<br />
&lt;% 从当前到匹配小(中,大)括号之间的文本左移<br />
(似乎漏了一个符号|, 移动到某一列----译注)<br />
a 在当前位置之后添加<br />
A 在当前行的末尾添加<br />
^a 没有使用<br />
b 上一个单词的开头<br />
B 上一个单词的开头,忽略标点符号<br />
^b 上移一屏<br />
c 覆盖...<br />
C 覆盖到行末尾<br />
^c 终止插入模式,在命令模式没有用<br />
d 删除...<br />
D 删除到行末尾<br />
^d 下移半屏，如果在插入模式下则移到上一个移动宽度（ShiftTab)处<br />
e 单词的末尾<br />
E 单词的末尾,忽略标点符号<br />
^e 屏幕下卷一行<br />
f 查找...<br />
F 向后查找...<br />
^f 下移一屏<br />
g 未用<br />
G ...跳至[缺省是到文件末尾]<br />
^g 显示状态栏<br />
h 左移<br />
H 屏幕上的第一行<br />
^h 在插入模式下是退格,命令模式下是左移<br />
i 在当前的位置前面插入<br />
I 在本行的第一个非空白字符前面插入<br />
^i 插入模式下是制表键,命令模式下未用<br />
j 下移<br />
J 把下一行合并到本行<br />
^j 命令模式下是下移,插入模式下是建一个新行<br />
k 上移<br />
K 未用<br />
^k 未用<br />
l 右移<br />
L 屏幕中的最后一行<br />
^l 重绘屏幕<br />
m 把当前位置标记到寄存器中<br />
M 屏幕的中间行<br />
^m 回车<br />
n 重复上次查找<br />
N 逆向重复上次查找<br />
^n 命令模式下是下移<br />
o 在当前行的下面建一个新行<br />
O 在当前行的上面建一个新行<br />
^o 未用<br />
p 在当前行的下面粘贴<br />
(译注&#8211;应为在当前位置的后面粘贴)<br />
P 在当前行的上面粘贴<br />
(译注&#8211;应为在当前位置的前面粘贴)<br />
^p 命令模式下是上移<br />
q 未用<br />
Q 退出并且启动ex<br />
^q 未用<br />
r 覆盖当前的字符<br />
R 在插入模式下一直覆盖字符<br />
^r 在命令模式下面重绘屏幕<br />
s 替换<br />
S 替换整行<br />
t 到&#8230;<br />
T 向后到&#8230;<br />
^t 移到下一个移动宽度(shifttab)处<br />
u 撤消上一次操作<br />
U 撤消对本行的所有修改<br />
^u 上移半屏<br />
v 未用<br />
V 未用<br />
^v 未用<br />
w 下一个单词的开头<br />
W 下一个单词的开头,忽略标点符号<br />
^w 命令模式下未用,在插入模式下是到上一个单词的开头处<br />
x 删除当前字符<br />
X 删除前一个字符<br />
^x 未用<br />
y 复制&#8230;<br />
Y 复制整行<br />
^y 屏幕上卷一行<br />
z 重新配置当前行周围的屏幕<br />
ZZ 保存之后退出<br />
^z 未用<br />
(译注&#8211;在命令模式下,^z执行了UNIX暂停操作) </p>
<p>6.1 &#8211; 命令模式的输入选项(:命令)<br />
(注: 这不是一个规范的列表,, 我只是列出了一些最重要的命令)<br />
:r &lt;文件> 把&lt;文件>读入到当前文档<br />
:r !&lt;命令> 把&lt;命令>的输出插入到当前文本中<br />
:nr &lt;文件> 把&lt;文件>插入到第n行<br />
:!&lt;命令> 运行&lt;命令>,然后返回<br />
:sh 转到SHELL<br />
:so &lt;文件> 读取&lt;文件>,再执行文件里面的命令<br />
(译注&#8211;文件中的命令应该都是一些ex命令)<br />
 <img src='http://blog.fallseir.com/wp-includes/images/smilies/icon_mad.gif' alt=':x' class='wp-smiley' />  保存之后退出<br />
:wq 保存之后退出<br />
:l1,l2w &lt;文件>把第l1和第l2行之间的文本写到&lt;文件>中去,如果没有指定&lt;文件>,<br />
vi就假定是当前文件,如果没有指定l1,l2,就假定是整个文件(就成了:w)<br />
:w >> &lt;文件> 添加到&lt;文件>末尾. 也可以使用行号<br />
:w! 覆盖当前文件<br />
:q 退出<br />
:q! 不存盘就退出<br />
:e &lt;文件> 不离开vi编辑&lt;文件><br />
:e! 重新编辑当前文件,忽略所有的修改<br />
:n 编辑下一个文件<br />
:e +n &lt;文件> 从第n行开始编辑&lt;文件>,如果超过了末尾,就从末尾开始编辑<br />
:e# 编辑替换文件(如果使用了命令:e&lt;文件>,替换文件就指的是原始文件)<br />
:args 显示所有要编辑的文件<br />
:rew 重新回到第一个编辑的文档<br />
:map m n 创建一个宏(使 m 做 n)<br />
:map! m n 创建一个插入模式的宏(使 m 做 n)<br />
:unmap m 删除宏m<br />
:unmap! m 删除插入模式的宏m<br />
:ab &lt;1> &lt;2> 缩写,敲&lt;1>的时候用&lt;2>取代<br />
:unab &lt;1> 取消缩写&lt;1><br />
:set &lt;选项> 设置&lt;选项>&#8230; </p>
<p>原文<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br />
<a href="http://www.chinaunix.net/jh/24/15787.html">vi 命令常见问题解答</a><br />
作者：译者Elale</p>
<p> [vi-faq中文版] </p>
<p>0.0 &#8211; 引言 &#8212; 我怎样用这个FAQ </p>
<p>这个文档分为了几个部分.首先,第0节和第1节介绍了什么是vi&#59;第2节则收录了很多新<br />
学者的问题,一些对vi没有很多经验的人也经常问这些问题.这里面包括诸如“命令模式和插入<br />
模式之间的区别”,以及“我怎样拷贝和粘贴”之类的问题.第3节是面向vi的中级用户的,它从<br />
问题“我如何查找和替换”开始,逐步深入,直到对vi里面的宏（Macro）的用法讨论为止.第3<br />
节还包括了一个vi的快速参考,有一个规范的vi命令列表.再下面,是一个有关“:set”命令的<br />
列表,包含了所有能定制vi环境的变量,这些变量也可以在.exrc文件中定义. </p>
<p>我们已经在一个运行SunOS和UCB版本vi的机器上验证了快速参考.除了SunOS带的vi外,<br />
每个命令都可以在系统V和UCB版本vi运行,但是我个人并没有验证这一点. </p>
<p>除非我们在文档中指明,缺省我们假定你处在命令模式下. </p>
<p>我们还尝试保留尽可能多的术语,因为在原始的vi文档中使用了这些术语,尽管我可能<br />
忘了它的本来含义. </p>
<p>0.1 &#8211; 索引 </p>
<p>第一个文件： </p>
<p>0.0 &#8211; 引言 &#8212; 我怎样用这个FAQ？<br />
0.1 &#8211; 索引<br />
0.2 &#8211; 我可以散发这个FAQ吗？<br />
0.3 &#8211; 你能为这个FAQ做什么？ </p>
<p>1.0 &#8211; 什么是vi?<br />
1.1 &#8211; 关于vi有什么重大的交易吗? 为什么大家都用它? 更进一步说,为什么我要用它?<br />
1.2 &#8211; 噢! 这听起来不错! 有没有理由不用vi?<br />
1.3 &#8211; vi能在多少不同的操作系统下面运行?<br />
1.4 &#8211; 好吧, 你说服了我. 我决定开始使用vi. 我该从哪儿开始?<br />
1.5 &#8211; vi有其他一些可用的变种吗? </p>
<p>2.0 &#8211; vi入门<br />
2.1 &#8211; 有什么游戏帮助我们学习vi吗?<br />
2.2 &#8211; 命令模式和插入模式有什么区别?<br />
2.3 &#8211; 等等,我的键盘没有&lt;Esc>键,我该怎么办?<br />
2.4 &#8211; 那些~s是什么东西?<br />
2.5 &#8211; 我无法习惯用 hjkl, 你有什么建议吗?<br />
2.6 &#8211; 我如何才能不存盘就退出?<br />
2.7 &#8211; 我怎样插入一个文件?<br />
2.8 &#8211; 我怎样查找文本?<br />
2.9 &#8211; 我怎样搜索一个控制序列?<br />
2.10 &#8211; 我怎样重新格式化文本?<br />
2.11 &#8211; 我怎样复制文本?<br />
2.12 &#8211; 啊! 我刚才敲了一个dG,然后我的论文就没有了! 我该怎么办?<br />
(或者,我刚才犯了个错误,我该怎么办?)<br />
2.13 &#8211; 我正在写我的论文,被告知我必须将每一节都放在不同的文件里,我该怎么办?<br />
2.14 &#8211; 所有的:命令都是怎样处理的? </p>
<p>3.0 &#8211; 怎样查找和替换?<br />
3.1 &#8211; 我怎样在vi中运行一个程序?<br />
3.2 &#8211; 啊! 我正在写我的论文, 系统崩溃了! 怎么办?<br />
3.3 &#8211; 有没有使vi对程序员更友好的窍门?<br />
3.4 &#8211; 宏 &#8212; 我怎样写宏?<br />
3.5 &#8211; 我怎样将一个功能键定义成一个宏?<br />
3.6 &#8211; 有没有办法缩写文本?<br />
3.7 &#8211; 我怎样在当前文档中做拼写检查?<br />
3.8 &#8211; 我手头有一个硬拷贝的终端, 我还能用vi吗?<br />
3.9 &#8211; 好了,是不是处在开放模式下的原因呀?! 但是我现在没有用硬拷贝终端,它还是在<br />
开放模式呀? </p>
<p>第二个文件: </p>
<p>4.0 &#8211; vi档案的在线帮助在哪儿?<br />
5.0 &#8211; 好玩的vi诀窍,无聊的宏<br />
5.1 &#8211; 好玩的vi诀窍<br />
5.2 &#8211; 好玩的宏<br />
6.0 &#8211; 依字母顺序的vi快速参考<br />
6.1 &#8211; 命令模式的输入选项(:命令)<br />
6.2 &#8211; 设置选项(set)<br />
7.0 &#8211; 建立 .exrc文件<br />
7.1 &#8211; .exrc文件的样本<br />
8.0 &#8211; vi的漏洞<br />
9.0 &#8211; 术语表<br />
10.0 &#8211; 关于vi的参考书目 </p>
<p>0.2 &#8211; 我可以散发这个FAQ吗？ </p>
<p>可以!只要你没有对它做任何修改,或者用它来赚钱. </p>
<p>0.3 &#8211; 你能为这个FAQ做什么？<br />
首先, 把你发现的错误告诉我. 如果你有什么建议我们也很欢迎. 你认为还不清楚的地方<br />
告诉我们,我们同样欢迎.<br />
还有, 使用vi! (Spread the word) 我很抱歉我无法将所有对这个FAQ有贡献的人都列出<br />
来, 因为许许多多的人都给过我建议和帮助,如果我将他们都列出来的话,那么恐怕这张贡献<br />
者的清单将和这个文档本身一样长了. </p>
<p>1.0 &#8211; 什么是vi?<br />
vi是个可视化的编辑器(vi就意味着可视化&#8211;VIsual). 那么,什么是可视化的编辑器呢？<br />
(相对于非可视化的编辑器来说）?可视化的编辑器就是可以让你在编辑文本的时候看到它们.<br />
今天,这听起来似乎非常普通,反之,非可视化的编辑器似乎很奇怪. 非可视化的编辑器的例子<br />
可以举出不少:如ed, sed和edlin(直到相当近的一段时间内,它是DOS自带的最后一个编辑器)<br />
等.<br />
vi是威廉.侨伊写的,作为BSD UNIX的一部分. 后来AT&amp;T也开始用vi, 于是标准UNIX也开始<br />
用vi了. </p>
<p>1.1 &#8211; 关于vi有什么重大的交易吗? 为什么大家都用它? 更进一步说,为什么我要用它?<br />
vi是UNIX下面的缺省编辑器, 因此几乎近来所有的UNIX都捆绑了vi(近来是指1984年左右).<br />
这意味着无论何时你跨平台使用某种UNIX,你都知道在你指尖下面有一个强力的编辑器.为什么<br />
不是别的呢? vi是个强大的编辑器.同样,一旦你了解了vi,你就能很快的编辑你的文件,因为它<br />
非常能节省你的敲键次数. 由于它在插入和命令两种情况下使用不同的模式,它比大多数的不<br />
基于这种模式的编辑器要快. 而且,vi非常小(我机器上面的版本只有200K).还有,vi几乎能做<br />
任何事,只要你知道如何使它做你想做的事. </p>
<p>1.2 &#8211; 噢! 这听起来不错! 有没有理由不用vi?<br />
有. 有一个非常好的理由: vi稍微有些难学, 如果你开始学的话,vi又慢又让人痛苦,<br />
当然,一旦你学会了, vi就快多了. 但是学习的过程很慢. 有人曾经问我, 如果vi是个比较<br />
易学的编辑器, 它是否直观(intuitive)呢? 我一般这样回答:&quot;是的,我们有些人是这样认为.<br />
但是大多数人认为我们疯了.&quot; </p>
<p>1.3 &#8211; vi能在多少不同的操作系统下面运行?<br />
UNIX. 就是它. 尽管如此,还是有很多vi的变种运行在不同的操作系统上. 我就在以下一些<br />
操作系统上用过vi: UNIX, DOS, OS/2, MAC SYSTEM 7.(后面有一个有关细节的列表) </p>
<p>1.4 &#8211; 好吧, 你说服了我. 我决定开始使用vi. 我该从哪儿开始?<br />
好吧, 狡猾的家伙. 关于vi有很多很好的书:大多数讲UNIX的书至少有一章给了vi,而且<br />
有不少是专门讲vi的书.我没有什么偏爱. 所以你最好是问问你们那儿的vi高手们他们是从<br />
哪儿学来的. 还有,到处试. 用vi打开一个不重要的文档(你的论文不象是个学vi的好实验品),<br />
然后再到处试. 我无法想象有人学习vi却不花相当多的时间去到处试试. 记住:如果你有些<br />
地方不明白了, 只要敲两次&lt;Esc>键,你就又回到命令模式下了.<br />
我要提到的一点是,我想在这里提比较合适,就是如果要成为系统管理员或者其他对UNIX配置<br />
做什么修改的话,最好是学学ed或者ex,因为有些版本的UNIX没有把vi放在根分区里面,这样你<br />
就可能无计可施了. ed是个不错的选择. </p>
<p>1.5 &#8211; vi有其他一些可用的变种吗?<br />
只能列出一部分:STvi (STevie), elvis, vile, vim, 和nvi, xvi.<br />
elvis适用于:Amiga, DOS, OS/2, Unix, VMS, Atari.<br />
STevie适用于: Atari ST, DOS, Unix, Mac System 7.<br />
Mac System 7可以在很多info-mac的镜象站点获取,在/info-mac/text下.<br />
(例如ftp.hawaii.edu)<br />
nvi是将和BSD 4.4捆绑在一起的vi.<br />
vim适用于: Amiga, DOS, Mac System 7, Unix.<br />
Amiga, DOS,和源码可以在以下站点换取:ftp.fu-berlin.de /misc/editors/vim<br />
Mac System 7可以在很多info-mac的镜象站点获取,在/info-mac/text下.<br />
(例如ftp.hawaii.edu)<br />
vile适用于: DOS, OS/2, Unix, VMS.<br />
xvi适用于: DOS, Unix.<br />
vi的变种之间很有很多差异.很多都改进了vi,大多数都可以使用在这个文档<br />
种列出的命令,但是有一些不同的地方.更进一步的细节,你可以参考这些变种<br />
附带的相应的文档. </p>
<p>2.0 &#8211; vi入门<br />
对vi的初学者来说,有些基本的提示.第一,任何时候,手头都要有一份命令摘要.<br />
我们将在后面给出一个快速参考/命令摘要. 第二, 找一本vi方面的比较好的书.<br />
这个文档不是学vi的最佳途径(最起码现在还不是),我不敢保证这个文档能教会一个<br />
对vi一无所知的人, 而很多书已经做到了这一点. 但是,我们这里还是给出了不少<br />
提示. 对选择书籍来说,有一个标准的原则:买之前一定要仔细阅读. 要了解这本书<br />
对你是否有意义.确信它能在你练习vi的时候有用. 和其他的书做个比较 &#8212; 不管怎样,<br />
vi可能让你感到非常莫名其妙, 而且你要确信这么一点:是书让你糊涂,而不是<br />
你低估了学vi的难度.<br />
还有, 找一些诸如&quot;学vi&quot;(vilearn),&quot;vi向导&quot;(vitutor)之类的软件来帮助你掌握<br />
vi的基本知识. </p>
<p>2.1 &#8211; 有什么游戏帮助我们学习vi吗?<br />
这似乎很无聊, 但是事实上UNIX系统里面有不少游戏可以帮助你学习使用vi.这些帮助<br />
主要是一些基本知识. 虽然我还不知道有哪个游戏可以帮你学习vi的所有命令, 但我<br />
确实知道有一些可以帮助你学习使用 hjkl来移动光标. NetHack,一个类Rogue的游戏,<br />
就对这非常有帮助. 而且它是一个很大的游戏,能玩很长一段时间. 我没有贬低其他游戏<br />
的意思,这些游戏是: rogue, moria, omega, worm, snake. </p>
<p>2.2 &#8211; 命令模式和插入模式有什么区别?<br />
vi将命令模式和插入模式区分开来,这经常被认为是vi的一个大问题,但往往这也被认为是<br />
vi的优势所在. 理解其中的区别是掌握vi的关键.vi启动时,开始处于命令模式&#59;在这种模式<br />
下,我们可以在文件中到处移动,改变文本的某个特定区域, 剪切, 复制和粘贴文本,还有更<br />
多. 插入模式是指用户可以真正插入文本.换句话说,命令模式是用来在文件中移动,而插入<br />
模式是用来在文件中键入文本.<br />
有些命令,例如: a, i, c, C, O, o和其他一些可以从命令模式切换到插入模式.<br />
&lt;Esc>键或者^C(CRTL+C)可以脱离插入模式而返回到命令模式.<br />
你要适应这种差别. 它使得vi区别于其他的编辑器. 它也使你能在你的手不离开标准<br />
键盘做很多事情. </p>
<p>2.3 &#8211; 等等,我的键盘没有&lt;Esc>键,我该怎么办?<br />
试试敲 ^[(CTRL+[). 如果你的键盘有一个&lt;Meta>键,再试试它.如果还不行,再试试^3. </p>
<p>2.4 - 那些~s是什么东西?<br />
它们仅仅是用来让你知道你的文档末尾在哪儿.实际上它们并不在你的文档里面,所以<br />
你用不着担心它们. </p>
<p>2.5 - 我无法习惯用 hjkl, 你有什么建议吗?<br />
首先,如果你的终端设置正确而且你连接的也没有问题的话,你可以使用箭头键.但是,<br />
如果你认为你要经常使用vi,那么最好是习惯使用 hjkl,因为它们敲起来更快. 而且,<br />
有时候连接出问题了,使得ESC序列都可能丢失了.(这样你可能就无法使用箭头键了--译注) </p>
<p>2.6 - 我如何才能不存盘就退出?<br />
:q!可以做到这一点. 如果vi看起来冻住了,确信你没有错敲了个 ^S. 敲^Q可以解开^S. </p>
<p>2.7 - 我怎样插入一个文件?<br />
:r &lt;文件名><br />
例如,要插入文件/etc/motd, 可以敲 :r /etc/motd.<br />
这将把文件插入到光标处.如果你在r前面指定了一个数字,那么这条命令将把文件插入<br />
到那个位置. </p>
<p>2.8 - 我怎样查找文本?<br />
/&lt;文本>将向前查找, ?&lt;文本>将向后查找. ??或者//将重复上次查找. 在UNIX下,这已经<br />
是个可爱的标准用法了. 而且, 在vi中, n将查找文本下一次的出现位置. N重复上次查找,<br />
不过逆转了查找的方向. 在查找中可以使用规范式. </p>
<p>2.9 - 我怎样搜索一个控制序列?<br />
/^V^&lt;序列><br />
^V会告诉vi照字面理解下一个字符,不要把它看作是一条命令. </p>
<p>2.10 - 我怎样重新格式化文本?<br />
如果你的计算机有一个名叫fmt的程序, 你要做的仅仅是在命令模式下面敲!}fmt(记住,<br />
不要在前面加:). 这可以重新格式化你的文件,从光标所在的位置一直到当前段落的结尾.<br />
如果你的机器里面没有fmt这个程序, 你就得去找个类似的软件了(我记得在公共域里面有<br />
不少这样的程序,但是我对此了解不多) </p>
<p>2.11 - 我怎样复制文本?<br />
这有点复杂.把这节拿出来,多看几遍&#59;还有,一定要多做实验.<br />
&quot;&lt;字母>yy可以把一行文本拷贝到寄存器中(这里的寄存器是vi的术语,指可以存放剪切和<br />
拷贝下来的东西的地方), &lt;字母>里面的字母必须是a到z之间的一个. &quot;&lt;字母>dd可以把一行<br />
剪切下来放到寄存器里面. 你可以在yy或者dd前面用数字指明要拷贝或者剪切的行数.如果<br />
&lt;字母>中的字母是大写的话,意味着把文本插入到寄存器中已有的文本之前.<br />
&quot;&lt;字母>p把文本插入到光标之后,&quot;&lt;字母>P把文本插入到光标之前.如果寄存器中含有某<br />
一行的开头或结尾,这一行将会被放到另一合适的行上. Y是yy的快捷方式. 还有, y$, yH,<br />
yM,等等,都是可以用的.d命令也是一样的.如果要快速的剪切和粘贴, 你就无须指定寄存器<br />
了.如果这样的话,你就不能往寄存器里面添加文本了.而且只要有一个删除命令的话,寄存器<br />
中的东西就没有了(包括x命令).<br />
举例来说,如果要移动上一段的话,你可以把光标移到段落的开头,敲&quot;a13dd,再把光标移到<br />
你想要放文本的地方,敲&quot;ap,就可以把那段文本放到光标所在的行后面.<br />
现在,大概你想要剪切和粘贴文本到不是行末尾的区域去.我们来看如何做到这一点:我们<br />
可以使用 m&lt;字母> 命令来标记一个区域,这个字母可以和剪切/粘贴寄存器的字母相同,因为<br />
它们是保存在内存中的不同位置. 然后,敲&quot;&lt;寄存器>`&lt;字母>[yy或者dd], 这里的寄存器就是<br />
要保存文本的那个寄存器,&lt;字母>是用来标记的,yy和dd是你的操作. </p>
<p>2.12 &#8211; 啊! 我刚才敲了一个dG,然后我的论文就没有了! 我该怎么办?<br />
(或者,我刚才犯了个错误,我该怎么办?)<br />
u可以撤消你刚才的操作.U可以撤消你对当前行的修改(当然,一行对于一篇论文来说当然<br />
很不够了). :e!可以不保存修改而重新把你的文件调进来. 还有,你删除的文本都保存在从<br />
0到9编号的寄存器里.所以,&quot;&lt;n>p就可以把上第n次的删除文本粘贴出来.你可以按如下的<br />
方法迅速地查看所有删除的文本. 先试一个,不对的话,敲u,再试下一个.(为加速这个过程,<br />
这时vi中的.命令和通常的用法不一样了.它不是重复上次操作,而是试下一个寄存器,这样<br />
你要做的无非就是: &quot;1p u . u .,直到你撤消了你想撤消的删除操作) </p>
<p>2.13 &#8211; 我正在写我的论文,被告知我必须将每一节都放在不同的文件里,我该怎么办?<br />
:[m],[n]w &lt;文件名>可以将从第m行到第n行之间的文本保存到&lt;文件名>所指定的文件中.<br />
这种行序号方法几乎在所有的:命令下都可以使用. 如果你用命令:[m],[n] w >>&lt;文件名>,<br />
这些文本将添加到文件的后面. </p>
<p>2.14 &#8211; 所有的:命令都是怎样处理的?<br />
:后面的命令都是从ex编辑器里面过来的. 这就给vi加入了很多灵活性,也使vi功能更强<br />
大. 例如, 有很多的方法可以用来查找和替换,它们有很多的类似地方(事实上,它们在某种<br />
意义上说都是一样的) </p>
<p>3.0 &#8211; 怎样查找和替换?<br />
有很多方法. 最简单的是:<br />
:s/old/new/g, 但是,这仅对当前行起作用&#8230;, 所以,我们用<br />
:%s/old/new/g, 更一般的,我们还可以用<br />
:[范围]s/old/new/[cg],这里,[范围]是任意的行范围,包括行号,$(文件末尾),.(当前行),<br />
%(当前文件),或者两个行号之间加个破折号(或者可以这样: .,+5,这表示下面5行).[cgi]是<br />
c,g,i中间的一个或者什么也没有.c告诉vi每次替换的时候要给提示,g是说对所有一行中出现<br />
的地方都做替换.i则是指在查找时不区分大小写.如果最后一个斜杠(/)后面没有东西的话,那<br />
么vi只替换在行中第一次匹配的地方.<br />
我比较喜欢这样做:<br />
:g/foobar/s/bar/baz/g, 这个命令首先搜寻foobar,然后把它变成foobaz. 它没有改变<br />
jailbars, 而其他的一些命令可能会改变jailbars. 这是我的方法,但是可能比较难记.<br />
当然,你还可以在查找的的时候使用正规式,以及在替换文本的时候使用其他一些命令.如果<br />
你在正规式里用\(和\)来剥离一个序列的话,你会发现你可以做很多好玩的事情.<br />
例如:<br />
:g/\(foo\)\(bar\)/s/\2/\1baz/g 将foobar替换成foobaz<br />
还有一些特殊的序列:<br />
&amp; 所有查找时匹配到的东西<br />
\[1-9] 1到9号用\(和\)括起来的东西<br />
\u 下一个字符将被变成大写.<br />
\U 以后的字符都变成大写,直到遇到\e或\E<br />
\l 下一个字符将被变成小写.<br />
\L 以后的字符都变成大写,直到遇到\e或\E<br />
\[Ee] 更改大小写的选择区域的终点 </p>
<p>3.1 &#8211; 我怎样在vi中运行一个程序?<br />
:!命令 可以在vi中运行程序. :sh会启动一个交互式的外壳(SHELL).在这个外壳<br />
里面, 如果你愿意,你还可以再次运行vi. 当你在编辑Makefiles和配置文件来编译<br />
某个程序的时候,这可能比较有用. 这比:e优越之处在于它无须保存文件,而且如果<br />
你退出外壳的时候,vi还回到原来的地方.(当然,我还是建议你先保存一下文件) </p>
<p>3.2 &#8211; 啊! 我正在写我的论文, 系统崩溃了! 怎么办?<br />
不要怕! 你会收到一封电子邮件,里面就是你的论文.敲入vi -r &lt;文件名><br />
(这个文件名就是系统崩溃时你正在编辑的文件)你就可以恢复出你的论文来.只敲<br />
vi -r将把所有可能恢复的文件都列出来. </p>
<p>3.3 &#8211; 有没有使vi对程序员更友好的窍门?<br />
:set ai可以让vi自动对齐.<br />
:set sw=#,#是移动的宽度(shiftwidth),或者说TAB键的宽度(tabwidth)&#59;你可以<br />
用&lt;&lt;或者>>命令来左移或右移某一行. 还有, 你可以使用 &lt;%或>%来将{,(或[等符号<br />
括起来的文本都左移或右移&#59;这时候,你必须把光标放在这些符号({,(或[)上面.<br />
:set sm会在你敲},]或)显示出对应匹配的{,[或(来.<br />
:set lisp会对lisp编程有些帮助. ()被移到s表达式(s-expressions)外面,如果<br />
原子(atoms)没有停止则{}将被移走. </p>
<p>3.4 - 宏 -- 我怎样写宏?<br />
:map &lt;lhs> &lt;rhs>, 其中&lt;lhs>最多10个字符,&lt;rhs>最多100个字符. 以后,如果<br />
你敲了&lt;lhs>,vi就会用&lt;rhs>来取代它.所有的宏都是在命令模式下开始的,但是可以<br />
在你想在的模式下终止. 记住,在你想用的控制字符前面加上^V.<br />
:unmap &lt;lhs>将删除这个宏. :map！&lt;lhs> &lt;rhs> 使得&lt;lhs>将&lt;rhs>插入到文档<br />
中去. </p>
<p>3.5 - 我怎样将一个功能键定义成一个宏?<br />
如果&lt;lhs>是#n,n是0-9之间的一个数,那么这个宏就映射成某一个功能键了.(你<br />
可以试一下F1-F10之间的键--译者) </p>
<p>3.6 - 有没有办法缩写文本?<br />
当然了. 这可是vi呀,它能做任何事情!<br />
:ab email ellidz@midway.uchicago.edu 可以在你敲完email后,把那个没有缩写<br />
的文本插入到文件中. :una email取消缩写. </p>
<p>3.7 - 我怎样在当前文档中做拼写检查?<br />
这儿有一个宏可以做到这一点. 这些应该放在你的.exrc文件中(后面我们将对.exrc<br />
进一步讨论). 它是一个相当简单的宏. 它仅仅是调用ispell来处理当前文件.当然,你<br />
的系统里面一定得有ispell这个程序. 使用它的时候,只需要敲个V键就行了(因为vi并<br />
没有用V,所以V是一个比较合适的键) </p>
<p>map V :w^M:!ispell % ^M:e!^M^M </p>
<p>第二个^M使你在拼写检查完之后无须敲回车就可以到vi中.<br />
(译注, 在我的系统里,没有ispell,只有spell,我用它替换了ispell,工作的不错&#59;还有,<br />
^M不是两个字符,而是一个字符,通过^V^M敲进去的&#59;另外,我个人认为第二个^M还是不要<br />
的好,因为直接回到vi后你就无法看到拼写检查的结果了) </p>
<p>3.8 - 我手头有一个硬拷贝的终端, 我还能用vi吗?<br />
好了,好了. 我并认为有人会真的问这个问题.这个问题太偏了,我们大可不必理<br />
它.(而且,它回答了一个非常普通的问题)<br />
vi启动的时候处于一种特殊的模式下面,叫做&quot;开放模式&quot;&#59; 在这种状态下,事情或多或少<br />
的有些不同. 删除的字符在你面前显示成一些',vi会认为你的终端窗口只有一行. ^r<br />
可以把当前行重新输出. z则把当前行周围的窗口重画一遍. </p>
<p>3.9 - 好了,是不是处在开放模式下的原因呀?! 但是我现在没有用硬拷贝终端,它还是在开放<br />
模式呀?<br />
这儿的问题就是vi没有认出你用的终端的类型. 于是它假定你有的是个最烂的终端,<br />
所以它决定依然处在开放模式下.这似乎没什么用处.因为没有多少人喜欢开放模式,但是开放<br />
模式还是需要知道你的终端的一些最起码的信息的.<br />
现在,我们来看如何解决这个问题.我们有可能把它分成几种特殊的情形,但是,一般情况下,<br />
这并没有用处. 如果你直到你的终端的类型, 你可以在UNIX提示符下面设置终端类型(在CSH<br />
及其变种下面,使用命令setenv TERM &lt;终端类型>&#59;在SH及其变种下面,使用命令TERM=&lt;终端类型>&#59;<br />
export TERM)<br />
最好你能把上面的命令写在.profile文件或者.cshrc文件里面,这样你一登录它就自动地给<br />
你设置好了.(当然,你应该知道如何使用ed,或者你能在UNIX提示符下面设置好终端类型以便能<br />
使用vi, 这样你才有可能去编辑这些文件)<br />
如果你确实不知道你地终端类型,试一试vt100.现在大多数地终端或者终端仿真器都能仿真<br />
vt100. 如果这还不能生效的话,你只好去找个高手来帮你了. </p>
<p>4.0 - vi档案的在线帮助在哪儿?<br />
有一个vi的FAQ,其中列出了vi档案的所有在线文件. 同时它还列出了这些文档<br />
的镜象站点. 最主要的一个地址是alf.uib.no,但是这些文档在很多很多地地方<br />
都保存着. vi-archive faq把它们都给列出来了.你在下载这些文件之前一定要<br />
核对一下这个FAQ.因为很有可能有一个站点比去挪威的站点更近更快些.<br />
一个镜象站点是cs.uwp.edu/pub/vi, 另一个是monu6.cc.monash.edu.au/pub/Vi,<br />
这些站点上有很多有关vi的文件,还有一些vi的变种版本&#59;当然,UCB版本的vi是<br />
肯定有的, 还有许多的宏. </p>
<p>5.0 - 好玩的vi诀窍,好玩的宏<br />
这一节主要讲述一些无聊的诀窍和一些无聊的宏.事实上,任何vi的诀窍和宏我们<br />
都欢迎,只要它们不是过分冗长. 如果有人向我建议而我也认为确实值得加的话,<br />
我会考虑加进去的. </p>
<p>5.1 - 好玩的vi诀窍<br />
xp 删除光标下的字符,再把粘贴到后面去.换句话说,它交换了当前两个字符<br />
的位置.<br />
ddp 和xp类似,不过是交换两行的位置.<br />
uu 撤消和重复上次所做的修改.(这可以使你不改变什么东西就可以到你上次所<br />
做的修改处) </p>
<p>5.2 - 好玩的宏<br />
和垂直上方的字符交换位置<br />
map * kxjphxkP </p>
<p>折行<br />
map g $80|F r<br />
(译注,我对这条宏表示疑问!) </p>
<p>改变大多数单词的大小写<br />
map v ywmno:s/./\~/g<br />
(译注,这条好象也不大对!) </p>
<p>在当前的单词周围加上`和'<br />
map *` i`'<br />
在当前的单词周围加上'和'<br />
map *' i''<br />
在当前的单词周围加上&quot;和&quot;<br />
map *&quot; i&quot;&quot;<br />
(这几条也太无聊了吧--译注)<br />
在当前的单词周围加上``和``<br />
map! `` `'<br />
(咦,好象又有问题?--译注) </p>
<p>从光标处把当前行分开,在下一行开头加上一个>号(例如,引用USENET).如果加上了单词的折行<br />
功能那么最后一个单词可能被折在第一行.<br />
map g may0O`ay$:s/./ /g<br />
(不对吧--译注) </p>
<p>插入一个字符<br />
map g i$^[r </p>
<p>6.0 - 依字母顺序的vi快速参考<br />
... 是指有些东西需要在命令之前或之后指明.这通常是说光标的移动键<br />
(h,j,k,l,w,b等等)或者是指行号.<br />
# (这里#代表一个数字) 执行n次后面的命令...<br />
: 进入ex模式<br />
) 下一句<br />
( 上一句<br />
} 下一段<br />
{ 上一段<br />
]] 下一节<br />
[[ 上一节<br />
0 行的开头<br />
$ 行的末尾<br />
^ 行的第一个非空白字符<br />
+ 下一行的开头<br />
- 上一行的开头<br />
(空格) 下一个字符<br />
(回车) 下一行<br />
/ 向前搜索<br />
? 向后搜索<br />
% 查找当前小(中,大)括号的匹配字符<br />
, 逆向重复上一个f,F,t或T操作<br />
&#59; 重复上一个f,F,t或T操作<br />
. 重复上一个操作<br />
` 转到标记处<br />
' 转到标记所在行的开头<br />
`` 查找前回到上一个做标记的地方<br />
'' 查找前回到上一个做标记所在行的开头<br />
~ 切换字符的大小写<br />
&quot; 保存到寄存器中<br />
!! 重复上一次SHELL命令<br />
! 把后面的文本送给命令, 取代输出(例如, !}fmt把当前的段落<br />
送给命令fmt处理,然后用fmt返回的东西替换输出.)<br />
>> 右移当前段落一个移动宽度(shiftwidth)<br />
&lt;&lt; 左移当前段落一个移动宽度(shiftwidth)<br />
>% 从当前到匹配小(中,大)括号之间的文本右移<br />
&lt;% 从当前到匹配小(中,大)括号之间的文本左移<br />
(似乎漏了一个符号|, 移动到某一列----译注)<br />
a 在当前位置之后添加<br />
A 在当前行的末尾添加<br />
^a 没有使用<br />
b 上一个单词的开头<br />
B 上一个单词的开头,忽略标点符号<br />
^b 上移一屏<br />
c 覆盖...<br />
C 覆盖到行末尾<br />
^c 终止插入模式,在命令模式没有用<br />
d 删除...<br />
D 删除到行末尾<br />
^d 下移半屏，如果在插入模式下则移到上一个移动宽度（ShiftTab)处<br />
e 单词的末尾<br />
E 单词的末尾,忽略标点符号<br />
^e 屏幕下卷一行<br />
f 查找...<br />
F 向后查找...<br />
^f 下移一屏<br />
g 未用<br />
G ...跳至[缺省是到文件末尾]<br />
^g 显示状态栏<br />
h 左移<br />
H 屏幕上的第一行<br />
^h 在插入模式下是退格,命令模式下是左移<br />
i 在当前的位置前面插入<br />
I 在本行的第一个非空白字符前面插入<br />
^i 插入模式下是制表键,命令模式下未用<br />
j 下移<br />
J 把下一行合并到本行<br />
^j 命令模式下是下移,插入模式下是建一个新行<br />
k 上移<br />
K 未用<br />
^k 未用<br />
l 右移<br />
L 屏幕中的最后一行<br />
^l 重绘屏幕<br />
m 把当前位置标记到寄存器中<br />
M 屏幕的中间行<br />
^m 回车<br />
n 重复上次查找<br />
N 逆向重复上次查找<br />
^n 命令模式下是下移<br />
o 在当前行的下面建一个新行<br />
O 在当前行的上面建一个新行<br />
^o 未用<br />
p 在当前行的下面粘贴<br />
(译注&#8211;应为在当前位置的后面粘贴)<br />
P 在当前行的上面粘贴<br />
(译注&#8211;应为在当前位置的前面粘贴)<br />
^p 命令模式下是上移<br />
q 未用<br />
Q 退出并且启动ex<br />
^q 未用<br />
r 覆盖当前的字符<br />
R 在插入模式下一直覆盖字符<br />
^r 在命令模式下面重绘屏幕<br />
s 替换<br />
S 替换整行<br />
t 到&#8230;<br />
T 向后到&#8230;<br />
^t 移到下一个移动宽度(shifttab)处<br />
u 撤消上一次操作<br />
U 撤消对本行的所有修改<br />
^u 上移半屏<br />
v 未用<br />
V 未用<br />
^v 未用<br />
w 下一个单词的开头<br />
W 下一个单词的开头,忽略标点符号<br />
^w 命令模式下未用,在插入模式下是到上一个单词的开头处<br />
x 删除当前字符<br />
X 删除前一个字符<br />
^x 未用<br />
y 复制&#8230;<br />
Y 复制整行<br />
^y 屏幕上卷一行<br />
z 重新配置当前行周围的屏幕<br />
ZZ 保存之后退出<br />
^z 未用<br />
(译注&#8211;在命令模式下,^z执行了UNIX暂停操作) </p>
<p>6.1 &#8211; 命令模式的输入选项(:命令)<br />
(注: 这不是一个规范的列表,, 我只是列出了一些最重要的命令)<br />
:r &lt;文件> 把&lt;文件>读入到当前文档<br />
:r !&lt;命令> 把&lt;命令>的输出插入到当前文本中<br />
:nr &lt;文件> 把&lt;文件>插入到第n行<br />
:!&lt;命令> 运行&lt;命令>,然后返回<br />
:sh 转到SHELL<br />
:so &lt;文件> 读取&lt;文件>,再执行文件里面的命令<br />
(译注&#8211;文件中的命令应该都是一些ex命令)<br />
 <img src='http://blog.fallseir.com/wp-includes/images/smilies/icon_mad.gif' alt=':x' class='wp-smiley' />  保存之后退出<br />
:wq 保存之后退出<br />
:l1,l2w &lt;文件>把第l1和第l2行之间的文本写到&lt;文件>中去,如果没有指定&lt;文件>,<br />
vi就假定是当前文件,如果没有指定l1,l2,就假定是整个文件(就成了:w)<br />
:w >> &lt;文件> 添加到&lt;文件>末尾. 也可以使用行号<br />
:w! 覆盖当前文件<br />
:q 退出<br />
:q! 不存盘就退出<br />
:e &lt;文件> 不离开vi编辑&lt;文件><br />
:e! 重新编辑当前文件,忽略所有的修改<br />
:n 编辑下一个文件<br />
:e +n &lt;文件> 从第n行开始编辑&lt;文件>,如果超过了末尾,就从末尾开始编辑<br />
:e# 编辑替换文件(如果使用了命令:e&lt;文件>,替换文件就指的是原始文件)<br />
:args 显示所有要编辑的文件<br />
:rew 重新回到第一个编辑的文档<br />
:map m n 创建一个宏(使 m 做 n)<br />
:map! m n 创建一个插入模式的宏(使 m 做 n)<br />
:unmap m 删除宏m<br />
:unmap! m 删除插入模式的宏m<br />
:ab &lt;1> &lt;2> 缩写,敲&lt;1>的时候用&lt;2>取代<br />
:unab &lt;1> 取消缩写&lt;1><br />
:set &lt;选项> 设置&lt;选项>&#8230; </p>
<p>6.2 &#8211; 设置选项(set)<br />
可以使用括号中的缩写形式. 语法:<br />
:set &lt;选项> &lt;参数> (如果需要参数的话)<br />
也可以在一行中指定多个选项<br />
:set &lt;选项>? 显示出当前这个选项的参数值<br />
:set all 则显示所有的选项值<br />
对那些无须参数的选项来说,使用:set no&lt;选项>就可以把它给关了 </p>
<p>选项: 缺省值: 含义:<br />
autoindent (ai) noai 使新行自动缩进,和上(下)行的位置对齐<br />
autoprint (ap) ap 每条命令之后都显示出修改之处<br />
autowrite (aw) noaw 在:n,:!命令之前都自动保存文件<br />
beautify (bf) nobf 在输入的时候忽略所有的控制字符<br />
(除了制表键(tab),换行(newline),进纸(formfeed))<br />
directory= (dir=) /tmp 存放缓冲区的目录名<br />
edcompatible noedcompatible 在替换的时候使用类ed的用法<br />
errorbells (eb) errorbells 出错的时候响铃<br />
exrc (ex) noexrc 允许在主目录(home)外面之外放.exrc文件<br />
hardtabs= (ht=) 8 设置硬制表的边界<br />
ignore case (ic) noic 正规式里忽略大小写<br />
lisp nolisp 打开lisp模式<br />
list nolist 显示所有的制表键和行的结尾<br />
magic magic 可以使用更多的正规表达式<br />
mesg mesg 允许向终端发送消息<br />
number (nu) nonumber 显示行号<br />
open open 允许开放和可视化<br />
optimize (opt) optimize 优化吞吐量,打印时不发回车<br />
paragraphs= (para=) IPLPPPQPPLIbp 设置{ &amp; }的分界符<br />
prompt prompt 命令模式下的输入给出:的提示符<br />
readonly (ro) noro 除非用!号否则不准保存文件<br />
redraw noredraw 当编辑的时候重绘屏幕<br />
remap remap 允许宏指向其他的宏<br />
report= 5 如果影响的行数>这个数的话就报告<br />
scroll 1/2 window 下卷屏幕时滚动屏幕的数目,<br />
同样这也是z命令输出的行数(z 输出2倍滚屏的大小)<br />
sections= SHNHH HU 定义节的末尾(当使用命令[[ 和 ]] 时)<br />
shell= (sh=) /bin/sh 缺省的SHELL,如果设置了环境变量SHELL的话,就使用变量<br />
shiftwidth= (sw=) 8 当使用移动(shift)命令时移动的字符数<br />
showmatch (sm) nosm 显示{, }, (, ), [, 或者 ] 的匹配情况<br />
showmode noshowmode 显示你处在什么模式下面<br />
slowopen (slow) 插入之后不要立刻更新显示<br />
tabstop= (ts=) 8 设置制表停止位(tabstop)的长度<br />
taglength= (tl=) 0 重要标记的字符个数(0表示所有的字符)<br />
tags= tag, /usr/lib/tags 定义包含标记的文件路径<br />
term= 设置终端类型<br />
terse noterse 显示简短的错误信息<br />
timeout (to) timeout 一秒钟后键盘映射超时<br />
ttytype= 设置终端类型<br />
warn warn 显示&quot;No write since last change&quot;信息<br />
window= (w=) 可视模式下窗口的行数<br />
wrapmargin= (wm=) 0 右边距,大于0的话最右边的单词将折行,留出n个空白位置<br />
wrapscan (ws) ws 查找到文件尾后再重头开始<br />
writeany (wa) nowa 可以保存到任意一个文件去 </p>
<p>(译注&#8211;这些选项在各种vi版本中都基本上大同小异,以SunOS带的vi为例,它没有这里列出来的open选项,<br />
scroll的参数值也不同,还多出来一些选项,如flash,modelines,novice,tagstack等等) </p>
<p>7.0 &#8211; 建立 .exrc文件<br />
所有命令输入模式下的命令(即 :命令)都可以在.exrc文件中使用,在.exrc中的命令在启动vi的时候自动<br />
加载.尤其是源命令(so),缩写(ab)和宏定义都可以用.在.exrc中不允许有空行.以&quot;开头的一行vi将把它当成<br />
注释. </p>
<p>7.1 &#8211; .exrc文件的样本<br />
以下的.exrc文件是一个实际的例子, 我自己的. 因此,它就没有有些人想象的那样设置很多的选项.即便<br />
如此,它还是给出一些基本的概念,而且它也相当易懂. </p>
<p>首先,记住你无须在命令前面加:号,因为它是缺省就添加了的. </p>
<p>&quot;译注&#8211;以下是.exrc文件中的内容,为真实起见,而且事实上也相当浅显,我没有翻译其中的注释<br />
&quot; set wordwrap 9 characters from the right<br />
set wm=9<br />
&quot; show matching parenthesis. When },), or ] is hit, show the opening<br />
&quot; {,(, or [ that matches it.<br />
set sm<br />
&quot; set the shell to be /usr/local/bin/tcsh<br />
set sh=/usr/local/bin/tcsh<br />
&quot; a few abbreviations<br />
&quot; this makes -l automatically become -Larry, and zidlle to be my<br />
&quot; name and email address.<br />
ab zidlle E. Larry Lidz - ellidz@midway.uchicago.edu<br />
ab -l -Larry<br />
&quot; uppercase V will run ispell -x (-x tells it not to save backups) on current<br />
&quot; file<br />
map V :w<br />
&quot; K will center the line... (this doesn't work on SunOS -- ??)<br />
map K :s/^[ ]*//<br />
&quot; v will reformat the current paragraph<br />
map v {0!}fmt<br />
&quot; q runs a program to lock my terminal<br />
map q :!lock2<br />
&quot; Splits a line in two at current cursor location, puts a > at the<br />
&quot;beginning of the line &#8211; useful for Usenet/email<br />
map g may0O`ay$:s/./ /g </p>
<p>8.0 &#8211; vi的bug<br />
我很想说vi中没有bug,但很不幸,它不是这样的. 这些bug都是初始版本vi中的,<br />
它其他的一些变种就不一定有.<br />
例如 _宏有时就运行的有问题. </p>
<p>9.0 &#8211; 术语表<br />
如果有人提议说某个术语他不明白,我们将更新这个术语表.如果你有什么建议,<br />
请一定要告诉我. </p>
<p>命令模式 command mode </p>
<p>命令模式是说我们在此模式下面可以向vi发命令(包括光标移动,编辑命令等等) </p>
<p>ed<br />
UNIX里面一个非可视化的编辑器 </p>
<p>&lt;Esc><br />
escape键. 键盘上标记为escape(ESC)的一个键.有时候^[可以起到相同的作用.<br />
如果没有escape键,你可以试试Meta键<br />
ex<br />
UNIX下的一个编辑器.所有vi中的:命令都是送给它处理的 </p>
<p>插入模式 insert mode<br />
插入模式是指我们可以在此模式下面键入文本. </p>
<p>宏 macro<br />
宏是一些键的组合起来的快捷方式.例如,某个宏允许我们只敲一个键就可以执行<br />
好几个不同的命令. </p>
<p>开放模式 open mode<br />
开始模式是说vi启动的时候不能确定你的终端类型,或者它肯定你的是一个硬的或<br />
电子管的终端 </p>
<p>正规表达式 regular expressions (RegEx)<br />
正规表达式,通常缩写为&quot;RegEx&quot;,是一些关键字的集合,它允许用户在查找的时候有更大的<br />
控制力度. RegEx是在UNIX下面用的,但是在很多程序中也用到了它. </p>
<p>sed<br />
流-行式的编辑器.它没有界面,所有命令都是通过命令行的形式给出的. </p>
<p>vi<br />
就是这个FAQ讨论的编辑器 </p>
<p>10.0 &#8211; 关于vi的参考书目<br />
The ULTIMATE GUIDE to the VI and EX Text Editors<br />
Hewlett Packard Company (authors)<br />
The Benjamin/Cummings Publishing Company, Inc.<br />
ISBN 0-8053-4460-8 </p>
<p>A PRACTICAL GUIDE TO THE UNIX SYSTEM<br />
Mark G. Sobell<br />
Benjamin Cummings Publisher </p>
<p>LEARNING THE VI EDITOR<br />
Linda Lamb<br />
O&#8217;Reilly &amp; Associates<br />
ISBN 0-937175-67-6<br />
原文链接：http://bbs.chinaunix.net/viewthread.php?tid=15787<br />
转载请注明作者名及原文出处</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fallseir.com/2007/07/%e6%94%b6%e9%9b%86%ef%bc%9avi-%e5%91%bd%e4%bb%a4%e5%b8%b8%e8%a7%81%e9%97%ae%e9%a2%98%e8%a7%a3%e7%ad%94/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>收集:vi 常用技巧</title>
		<link>http://blog.fallseir.com/2007/07/%e6%94%b6%e9%9b%86vi-%e5%b8%b8%e7%94%a8%e6%8a%80%e5%b7%a7/</link>
		<comments>http://blog.fallseir.com/2007/07/%e6%94%b6%e9%9b%86vi-%e5%b8%b8%e7%94%a8%e6%8a%80%e5%b7%a7/#comments</comments>
		<pubDate>Thu, 05 Jul 2007 07:30:07 +0000</pubDate>
		<dc:creator>飞扬轻狂</dc:creator>
				<category><![CDATA[shell]]></category>
		<category><![CDATA[收集]]></category>

		<guid isPermaLink="false">http://blog.fallseir.com/2007/07/%e6%94%b6%e9%9b%86vi-%e5%b8%b8%e7%94%a8%e6%8a%80%e5%b7%a7/</guid>
		<description><![CDATA[【:( 很不幸没有找到原始的地址，只好做二手的二手了 】 vi 常用技巧 作者:未知 时间:2005-09-13 22:03 出处:Blog.ChinaUnix.net 本文旨在更有条理有归纳性地介绍VI的一些最常用命令和一些高级的应用。 一:基本命令介绍： 1) 光标命令 k,j,h,l&#8212;上下左右光标移动命令，虽然你可以在Linux中使用键盘右边的四个光标键， 但是记住这四个命令还有非常有用的，也就是右手在键盘上放置的位置部分 nG &#8212;-n为行数，该命令立即使光标跳到指定行。 Ctrl+G&#8212;&#8211;光标所在位置的行数和列数报告 w,b&#8212;&#8212;使光标向前或向后跳过一个单词 2) 编辑命令 i,a,r &#8212;&#8212;-在光标的前,后,上方插入字符命令(i=insert,a=append,r=replace) cw,dw&#8212;&#8212; 改变(置换)/删除光标所在处的单词的命令 (c=change,d=delete) x,d$,dd &#8212;&#8211;删除一个字符，光标所在处到行尾的所有字符，和整行的命令 3) 查找命令 /string, ?string&#8212;&#8211;从光标所在处向后/向前查找相应的字符串的命令 4)拷贝复制命令 yy,p &#8212;&#8211;拷贝一行到剪贴板/取出剪贴板中内容的命令 进入vi（在系统提示符下面输入以下指令）: vi 　　　　　　　 进入vi而不读入任何文件 二:常见问题及应用技巧 1) 在一个新文件中读/etc/passwd中的内容，取出用户名部分 vi file :r /etc/passwd 在打开的文件file中光标所在处读入/etc/passwd :%s/:.*//g 删除/etc/passwd中用户名后面的从冒号开始直到行尾的所有部分 :3r /etc/passwd 这是在指定的行号后面读入文件内容 另外一种方法删掉文件中所有的空行及以#开始的注释行 #cat squid.conf.default [...]]]></description>
			<content:encoded><![CDATA[<p>【:( 很不幸没有找到原始的地址，只好做二手的二手了 <img src='http://blog.fallseir.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  】<br />
<a href="http://www.chinaitpower.com/2005September/2005-09-13/200136.html">vi 常用技巧</a><br />
作者:未知 时间:2005-09-13 22:03 出处:Blog.ChinaUnix.net </p>
<p>本文旨在更有条理有归纳性地介绍VI的一些最常用命令和一些高级的应用。</p>
<p>一:基本命令介绍： </p>
<p>      1) 光标命令<br />
      k,j,h,l&#8212;上下左右光标移动命令，虽然你可以在Linux中使用键盘右边的四个光标键，<br />
      但是记住这四个命令还有非常有用的，也就是右手在键盘上放置的位置部分<br />
      nG &#8212;-n为行数，该命令立即使光标跳到指定行。<br />
      Ctrl+G&#8212;&#8211;光标所在位置的行数和列数报告<br />
      w,b&#8212;&#8212;使光标向前或向后跳过一个单词 </p>
<p>      2) 编辑命令<br />
      i,a,r &#8212;&#8212;-在光标的前,后,上方插入字符命令(i=insert,a=append,r=replace)<br />
      cw,dw&#8212;&#8212; 改变(置换)/删除光标所在处的单词的命令 (c=change,d=delete)<br />
      x,d$,dd &#8212;&#8211;删除一个字符，光标所在处到行尾的所有字符，和整行的命令 </p>
<p>      3) 查找命令<br />
      /string, ?string&#8212;&#8211;从光标所在处向后/向前查找相应的字符串的命令 </p>
<p>      4)拷贝复制命令<br />
      yy,p &#8212;&#8211;拷贝一行到剪贴板/取出剪贴板中内容的命令  </p>
<p>      进入vi（在系统提示符下面输入以下指令）:<br />
     vi     　　　　　　　               进入vi而不读入任何文件</p>
<p>二:常见问题及应用技巧 </p>
<p>      1) 在一个新文件中读/etc/passwd中的内容，取出用户名部分<br />
      vi file<br />
      :r /etc/passwd 在打开的文件file中光标所在处读入/etc/passwd<br />
      :%s/:.*//g 删除/etc/passwd中用户名后面的从冒号开始直到行尾的所有部分<br />
      :3r /etc/passwd 这是在指定的行号后面读入文件内容 </p>
<p>      另外一种方法删掉文件中所有的空行及以#开始的注释行<br />
      #cat squid.conf.default | grep -v &#8216;^$&#8217; | grep -v &#8216;^#&#8217; </p>
<p>      2) 在打开一个文件编辑后才知道登录的用户对该文件没有写权，不能存盘<br />
      vi file<br />
      :w /tmp/1 既然没法存盘，不想放弃所做的所有修改，先临时存到/tmp/1<br />
      :20,59w /tmp/1 或者仅仅把第20到59行之间的内容存盘成文件/tmp/1 </p>
<p>      3) 用VI编辑一个文件，但需要删除大段大段的内容<br />
      vi file<br />
      Ctrl+G 把光标移到需要删除的行的处按ctrl+G显示行号，再到结尾处再按Ctrl+G.<br />
      :23,1045d 假定两次行号为23和1045，则把这几间的内容全删除 </p>
<p>      也可以在开始和结束两行中用ma,mb命令标记后用:&#8217;a,&#8217;bd删除. </p>
<p>      4) 在整个文件或某几行中在行首或行尾加一些字符串<br />
      vi file<br />
      :3,$s/^/some string / 在文件的第一行至最后一行的行首前插入some string<br />
      :%s/$/ some string/g 在整个文件每一行的行尾添加 some string </p>
<p>      :%s/string1/string2/g 在整个文件中替换string1成string2<br />
      :3,7s/string1/string2/ 仅替换文件中的第三到七行中的string1成string2 </p>
<p>      Note: s为substitute,%表示所有行,g表示global </p>
<p>      5) 同时编辑两个文件,在两个文件中拷贝剪贴文本<br />
      vi file1 file2<br />
      yy 同时打开两个文件,在文件1的光标所在处拷贝所在行<br />
      :n 切换到文件2 (n=next)<br />
      p 在文件2的光标所在处粘贴所拷贝的行<br />
      :N 切换回文件1 </p>
<p>      6) 替换文件中的路径 </p>
<p>      :%s#/usr/bin#/bin#g 把文件中所有路径/usr/bin换成/bin<br />
      或者用<br />
      :%s/\/usr\/bin/\/bin/g 在&#8217;/'前用\符号指出&#8217;/'是真的单个字符&#8217;/&#8217;</p>
<p>     vi filename                      进入vi并读入指定名称的文件（新、旧文件均可）。<br />
      vi +n filename　　　　             进入vi并且由文件的第几行开始。<br />
      vi +filename 　　　　              进入vi并且由文件的最后一行开始。<br />
      vi + /word filename 　             进入vi并且由文件的word这个字开始。<br />
      vi filename(s) 　　　               进入vi并且将各指定文件列入名单内，第一个文件先读入。<br />
      vedit　　　　　　　　              进入vi并且在输入方式时会在状态行显示“INSERT MODE&#8221;。 </p>
<p>编辑数个文件（利用vi filename(s))进入vi后）<br />
     :args 　　　　　　　　显示编辑名单中的各个文件名<br />
     :n　　　　　　　　　　读入编辑名单中的下一个文件<br />
     :rew　　　　　　　　　读入编辑名单中的第一个文件<br />
     :e#　　　　　　　　　 读入编辑名单内的前一个文件<br />
     :e file 　　　　　　　读入另一个文件进vi(此文件可不在编辑名单内）,若原文件经修改还没有存档，则应先以: w 存档。<br />
     :e! file　　　　　　　强迫读入另一个文件进入vi，原文件不作存档动作。 </p>
<p> 存储及退出vi<br />
     :w filename　　　　　 存入指定文件，但未退出vi（若未指定文件名则为当前工作的文件名）。<br />
     :wq 或者 或者zz　　 存文件，并且退出vi.<br />
     :q　　　　　　　　　　不作任何修改并退出vi。<br />
     :q!　　　　　　　　　 放弃任何修改并退出vi。<br />
     :!command　　　　　　 暂时退出vi并执行shell指令，执行完毕后再回到vi。<br />
     :sh　　　　　　　　　 暂时退出vi到系统下，结束时按Ctrl + d则回到vi。</p>
<p>加数据指令<br />
     i　　　　　　　　　　 在关标位置开始插入字符，结束时候按ESC键。<br />
     I　　　　　　　　　　 在光标所在行的最前面开始加字，结束时按ESC键。<br />
     a　　　　　　　　　　 在光标位置后开始加字，结束时按ESC键。<br />
     A　　　　　　　　　　 在光标所在行的最后面开始加字，结束时按ESC键。<br />
     o　　　　　　　　　　 在光标下加一空白行并开始加字，结束时按ESC键。<br />
     O　　　　　　　　　　 在光标上加一空白行并开始加字，结束时按ESC键。<br />
     !command　　　　　　　执行shell指令，并把结果加在光标所在行的下一行。</p>
<p>删除指令<br />
     nx　　　　　　　　　　删除由光标位置起始的n个字符（含光标位置，按一个x表示删除光标所在的字符）<br />
     nX 　　　　　　　　　 删除由光标位置起始的n个字符（不含光标位置）。<br />
     ndw　　　　　　　　　 删除光标位置其实的n个字符组（word)。<br />
     d0 　　　　　　　　　 将行的开始到光标位置的字符全部删除。<br />
     d$ 或D 　　　　　　　 将光标位置起始到行尾的字符全部删除。<br />
     ndd 　　　　　　　　　将光标位置起始的n行（整行）删除（dd表示删除光标所在行）。<br />
     :start,endd　　　　　 删除文件的第start到end行。</p>
<p>关标移动<br />
     0 　　　　　　　　　　移到一行的开始<br />
     $ 　　　　　　　　　　移到一行的最后<br />
     [　　　　　　　　　　 移到文件开始位置<br />
     ]　　　　　　　　　　 移到文件结束位置<br />
     nh　　　　　　　　　　往左移n位<br />
     nl或者spacebar 　　　 往右移n位<br />
     nk　　　　　　　　　　向上移n行<br />
     n+　　　　　　　　　　向上移n行，光标在该行的起始<br />
     ni 　　　　　　　　　 向下移n行<br />
     n-　　　　　　　　　　向下移n行，光标在该行的起始<br />
     H　　　　　　　　　　 移到屏幕的左上角<br />
     M　　　　　　　　　　 移到屏幕的中间行开头<br />
     L　　　　　　　　　　 移到屏幕的最后一行<br />
     G　　　　　　　　　　 移到文件的最后一行<br />
     nG或者:n　　　　　　　移到文件的第n行<br />
     nw　　　　　　　　　　右移n个字组，标点符号属于字组<br />
     nW　　　　　　　　　  右移n个字组，标点符号不属于字组<br />
     nb　　　　　　　　　　左移n个字组，标点符号属于字组<br />
     nB　　　　　　　　　 左移n个字组，标点符号不属于字组<br />
     Ctrl + u　　　　　　　屏幕上卷半个菜单<br />
     Ctrl + d 　　　　　　 屏幕下卷半个菜单<br />
     Ctrl + b 　　　　　　 屏幕上卷一个菜单<br />
     Ctrl + F 　　　　　　 屏幕下卷一个菜单</p>
<p>修改指令<br />
     r　　　　　　　　　　 修改光标文件的字符<br />
     R　　　　　　　　　　 从光标位置开始修改，结束时按ESC键<br />
     new　　　　　　　　　 更改n组字符，结束时按ESC键<br />
     ncc　　　　　　　　　 从光标所在位置开始更改n行，结束时按ESC键</p>
<p>重排各行长度<br />
     i　　　　　　　　　　 并按Enter将该行由光标所在处断开，并进入insert方式<br />
     J 　　　　　　　　　　把下一行的数据连接到本行之后</p>
<p>寻找指令<br />
     /text　　　　　　　　 从光标位置往下找字串text<br />
     ?text　　　　　　　　 从光标位置往上找字串text<br />
     n　　　　　　　　　　 继续找下一个字串（在输入上面的寻找指令之后使用）</p>
<p>寻找并且取代指令<br />
     :getxt1/s/ /text2/options 　　将各行的text1替换为text2<br />
                                          option=g表示文件中所有的text1均被取代，若未输入任何option,则只有各行中的第一个出现的text1被取代<br />
　　　　　　　　　　　　　   option=go 在屏幕显示各取代的行<br />
　　　　　　　　　　　　　　option=gc 在每个字串取代之前要求确认　</p>
<p>     Start,endgtext1/s/ / text2/options 　同上，只寻找并取代第start~end行。<br />
     或:Start,ends/text1/text2/options</p>
<p>复制及移动文件</p>
<p>     :first,last co dest 　　　　　将first 到last行的数据复制到目标行(dest）下面<br />
     :Start,end　m dest　　　　　　将start 到 end行的数据移动到目标行（dest)下。　　　<br />
     :r filename　　　　　　　　　 将指定文件的内容读入光标所在行下。<br />
     nY 　　　　　　　　　　　　　 将光标所在位置开始的n行数据暂存<br />
     p　　　　　　　　　　　　　　 复制暂存数据在光标的下一行<br />
     P　　　　　　　　　　　　　　 复制暂存数据在光标的上一行</p>
<p>其他命令<br />
     .　　　　　　　　　　　　　　 重复前一指令<br />
     u　　　　　　　　　　　　　　 取消前一指令<br />
     Ctrl + l　　　　　　　　　　　刷新屏幕显示<br />
     :set number　　　　　　　　　 显示文件的行号，但不会存文件<br />
     :set nonumber　　　　　　　　 解除行号显示<br />
     :set ai　　　　　　　　　　　 设置每行起始位置（以光标当前位置为起始）<br />
     :set noai　　　　　　　　　　 取消行起始位置设定<br />
     :f 或&lt;Ctrl> + g　　　　　　　 告诉用户有关现行编辑文件的数据。 </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fallseir.com/2007/07/%e6%94%b6%e9%9b%86vi-%e5%b8%b8%e7%94%a8%e6%8a%80%e5%b7%a7/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>笔记:通过shell 方式获取多个有规则的表中的数据</title>
		<link>http://blog.fallseir.com/2007/06/%e7%ac%94%e8%ae%b0%e9%80%9a%e8%bf%87shell-%e6%96%b9%e5%bc%8f%e8%8e%b7%e5%8f%96%e5%a4%9a%e4%b8%aa%e6%9c%89%e8%a7%84%e5%88%99%e7%9a%84%e8%a1%a8%e4%b8%ad%e7%9a%84%e6%95%b0%e6%8d%ae/</link>
		<comments>http://blog.fallseir.com/2007/06/%e7%ac%94%e8%ae%b0%e9%80%9a%e8%bf%87shell-%e6%96%b9%e5%bc%8f%e8%8e%b7%e5%8f%96%e5%a4%9a%e4%b8%aa%e6%9c%89%e8%a7%84%e5%88%99%e7%9a%84%e8%a1%a8%e4%b8%ad%e7%9a%84%e6%95%b0%e6%8d%ae/#comments</comments>
		<pubDate>Thu, 07 Jun 2007 08:20:11 +0000</pubDate>
		<dc:creator>飞扬轻狂</dc:creator>
				<category><![CDATA[shell]]></category>
		<category><![CDATA[笔记]]></category>

		<guid isPermaLink="false">http://blog.fallseir.com/2007/06/%e7%ac%94%e8%ae%b0%e9%80%9a%e8%bf%87shell-%e6%96%b9%e5%bc%8f%e8%8e%b7%e5%8f%96%e5%a4%9a%e4%b8%aa%e6%9c%89%e8%a7%84%e5%88%99%e7%9a%84%e8%a1%a8%e4%b8%ad%e7%9a%84%e6%95%b0%e6%8d%ae/</guid>
		<description><![CDATA[通过shell 方式获取多个有规则的表中的数据 -by fallseir $ sh out_list.sh > list.txt &#038; # 执行操作并将列表保存到list.txt中 $ vim out_list.sh for i in 0 1 2 3 4 5 6 7 8 9 a b c d e f; do for j in 0 1 2 3 4 5 6 7 8 9 a b c d e f; do [...]]]></description>
			<content:encoded><![CDATA[<p>通过shell 方式获取多个有规则的表中的数据<br />
-by <a href="http://blog.fallseir.com">fallseir</a></p>
<pre>
$ sh out_list.sh > list.txt &#038; # 执行操作并将列表保存到list.txt中
$ vim out_list.sh
for i in 0 1 2 3 4 5 6 7 8 9 a b c d e f;
    do
      for j in 0 1 2 3 4 5 6 7 8 9 a b c d e f;
        do
          echo "select distinct link
                from articles_part_"$i$j        | mysql -u[user] -p[pwd] -D[database] -h[host];
        done;
   done
</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.fallseir.com/2007/06/%e7%ac%94%e8%ae%b0%e9%80%9a%e8%bf%87shell-%e6%96%b9%e5%bc%8f%e8%8e%b7%e5%8f%96%e5%a4%9a%e4%b8%aa%e6%9c%89%e8%a7%84%e5%88%99%e7%9a%84%e8%a1%a8%e4%b8%ad%e7%9a%84%e6%95%b0%e6%8d%ae/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>doc:没有UI，shell中一样听你的！！</title>
		<link>http://blog.fallseir.com/2006/06/doc%e6%b2%a1%e6%9c%89ui%ef%bc%8cshell%e4%b8%ad%e4%b8%80%e6%a0%b7%e5%90%ac%e4%bd%a0%e7%9a%84%ef%bc%81%ef%bc%81/</link>
		<comments>http://blog.fallseir.com/2006/06/doc%e6%b2%a1%e6%9c%89ui%ef%bc%8cshell%e4%b8%ad%e4%b8%80%e6%a0%b7%e5%90%ac%e4%bd%a0%e7%9a%84%ef%bc%81%ef%bc%81/#comments</comments>
		<pubDate>Tue, 20 Jun 2006 09:20:54 +0000</pubDate>
		<dc:creator>飞扬轻狂</dc:creator>
				<category><![CDATA[shell]]></category>

		<guid isPermaLink="false">http://blog.fallseir.com/2006/06/doc%e6%b2%a1%e6%9c%89ui%ef%bc%8cshell%e4%b8%ad%e4%b8%80%e6%a0%b7%e5%90%ac%e4%bd%a0%e7%9a%84%ef%bc%81%ef%bc%81/</guid>
		<description><![CDATA[写了一篇shell中管理进程的东东 到这里可以提提意见 http://fallseir.livejournal.com/58926.html  ps #打印运行的进程列表 kill #杀掉指定的进程 awk #操作字符数据 $$ #当前进程的PID 在shell中 定时kill到超时的子进程 ## # 将满足条件的子进程kill掉 ## function kill_subs() 。。。 ## # 将满足条件的子进程kill掉 ## function kill_subs() 。。。 # 在后台进行100个数量的wget任务 。。。 wait; # 等待所有自进程结束 exec 3]]></description>
			<content:encoded><![CDATA[<div><strong>写了一篇shell中管理进程的东东 到这里可以提提意见</strong></div>
<div><a href="http://fallseir.livejournal.com/58926.html">http://fallseir.livejournal.com/58926.html</a> </div>
<div><strong>ps #打印运行的进程列表</strong></div>
<div><strong>kill #杀掉指定的进程</strong></div>
<div><strong>awk #操作字符数据</strong></div>
<div><strong>$$ #当前进程的PID</strong></div>
<div>在shell中 定时kill到超时的子进程</p>
<div>##</div>
<div># 将满足条件的子进程kill掉</div>
<div>##</div>
<div>function kill_subs() 。。。</div>
<div>
<div>##</div>
<div># 将满足条件的子进程kill掉</div>
<div>##</div>
<div>function kill_subs() 。。。</div>
<div># 在后台进行100个数量的wget任务<br />
。。。</div>
<div>wait; # 等待所有自进程结束<br />
exec 3
</div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.fallseir.com/2006/06/doc%e6%b2%a1%e6%9c%89ui%ef%bc%8cshell%e4%b8%ad%e4%b8%80%e6%a0%b7%e5%90%ac%e4%bd%a0%e7%9a%84%ef%bc%81%ef%bc%81/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
