Google

星期三, 八月 29, 2007

如何在uC/GUI中实现窗体半透明效果

http://www.gd-emb.com/detail/id-30374.html
 uC/GUI系统中的窗体可以实全透明效果,但是无法实现半透明效果。

  经过一天的实验,经于实现了窗体的半透明效果,与大家分享

  怎么实现半透明效果呢?先考虑原理。

  半透明原理:

  假设LCD是256色的。颜色格式为332(RGB)

  显存中的每一个字节的数据对应一个象素点。

  在数据写入显存之前,读取相应相素点值,然后与新的数据按一定的规则混合之后,再写入相应像素点的显存。

  这样主要问题关键是混合算法。

  混合算法目前在游戏上常用到的算法是AlphaBlend。计算公式如下

  假设一幅图象是A,另一幅透明的图象是B,那么透过B去看A,看上去的图象C就是B和A的混合图象,设B图象的透明度为alpha(取值为0-1,1为完全透明,0为完全不透明),Alpha混合公式如下:

  R(C)=(1-alpha)*R(B)+alpha*R(A)

  G(C)=(1-alpha)*G(B)+alpha*G(A)

  B(C)=(1-alpha)*B(B)+alpha*B(A)

  R(x)、G(x)、B(x)分别指颜色x的RGB分量原色值。从上面的公式可以知道,Alpha其实是一个决定混合透明度的数值。应用Alpha混合技术,可以实现游戏中的许多特效,比如火光、烟雾、阴影、动态光源等半透明效果。

  原理和混合算法都清楚知后,下来考虑在uC/GUI这样的环境下如何实现。

  再考虑一个问题,uC/GUI系统分为好几个层面。简单地可以归结为:

  1、硬件驱动层

  2、基本2D图形库

  3、窗体

  可以想象层次越高,涉及的内容越多,修改的工作量就越大。

  如果想修改最少的代码实现半透明功能,最好在硬件驱动层找切入口。

  分析一下硬件驱动层的坏境

  在硬件驱动层中我找到了一个宏定义

  LCD_WRITE_MEM(Off,data) *((U8*)(DC+(((U32)(Off)))))=(data)

  从文档可以看到该宏定义的功能就是向显存写入像素点的值。

  那就修改这个宏定义吧,把刚才说的算法加入该宏定义,流程如下:

  a、读取相应象素点值

  b、与新的象素点值按照混合算法转换。

  c、将转换结果写入显存对应位置。

  然后进行简单的测试。

  如下

  /设置透明度为0,完全不透明,先执行清屏。

  GUI_SetBkColor(GUI_WHITE);

  GUI_SetColor(GUI_WHITE);

  GUI_Clear();

  /填充一个方框

  GUI_SetColor(GUI_RED);

  GUI_FillRect(0,0,80,30);

  *****这里设置透明度为80透明之后再执行

  GUI_SetColor(GUI_GREEN);

  GUI_FillRect(50,5,200,30);

  这时候观察两个方框叠交的部分和其它部份,可以看到透明效果已经出现了。

  到这个时候可以证明,你的思想和修改是正确的。

  接下来的事情是如何把这个实现效果跟GUI系统完美结合起来。

  uC/GUI代码这么多,如何下手?

  有一个核心数据结构你必须知道。GUI_CONTEXT

typedef struct {
/* Variables in LCD module */
LCD_COLORINDEX_UNION LCD;
LCD_RECT ClipRect;
U8 DrawMode;
U8 SelLayer;
U8 TextStyle;
U8 TransPara;
/* Variables in GL module */
GUI_RECT* pClipRect_HL; /* High level clip rectangle ... Speed
optimization so drawing routines can optimize */
U8 PenSize;
U8 PenShape;
U8 LineStyle;
U8 FillStyle;
/* Variables in GUICHAR module */
const GUI_FONT GUI_UNI_PTR * pAFont;
const GUI_UC_ENC_APILIST * pUC_API; /* Unicode encoding API */
I16P LBorder;
I16P DispPosX, DispPosY;
I16P DrawPosX, DrawPosY;
I16P TextMode, TextAlign;
GUI_COLOR Color, BkColor; /* Required only when changing devices and
for speed opt (caching) */
/* Variables in WM module */
#if GUI_WINSUPPORT
const GUI_RECT* WM__pUserClipRect;
GUI_HWIN hAWin;
int xOff, yOff;

网络美女

星期二, 八月 28, 2007

Python确实挺好用的。

经常听人说这个语言有局限性,那个语言不好,看看下面这位:

最近正在用python写一个通讯的消息库,完成消息的收发,支持tcp,udp,共享内存
等,支持扩展已经完成了80%。单元测试代码占总代码量的50%多了。
使用了自己写的工具,如日志,线程,线程池,定时器,配置文件等等工具。
使用了python的module:
queue, threading, socket, logging, pickle, sys, os, time, re, unittest,
random 等
感觉python写东西很快。

如果写完没问题,比较满意的话,用c++写一个使用STL的,以及一个使用Boost的。


不成熟,肯定有些设计的地方不合理,等完成了,把代码放上来, 欢迎大家批评指
正。

http://bbs.chinaunix.net/thread-967122-1-1.html

http://bbs.chinaunix.net/thread-967122-2-1.html

星期一, 八月 27, 2007

VIM配置文件

一个有用的vimrc文件
http://www.linuxsir.org/bbs/showthread.php?t=67551

set nocompatible
source $VIMRUNTIME/vimrc_example.vim
source $VIMRUNTIME/mswin.vim
behave mswin

set guifont=FixedsysTTF:h14 "如果没有这个字体那就不要加
set tabstop=8
set softtabstop=4
set shiftwidth=4
colorscheme blue "在gvim下可以看到有多少coloscheme

set sw=4 " shiftwidth
set et " expandtab
set wm=8 " wrapmargin
set bs=2 " backspace
set ru " ruler
set ic " ignorecase "忽略大小写 但是输入中有大写的话不忽略
set is " incsearch
set scs " smartcase: override the 'ic' when searching
" if search pattern contains uppercase char
set vb t_vb= " set visual bell and disable screen flash
set backup " enable backup and define the backup file
set backupext=.bak
set hlsearch " hlsearch
" allow backspacing over everything in
" the insert mode
set backspace=indent,eol,start
set dir=e:\tmp\vimswap\vim1,e:\tmp\vimswap\vim2,e:\tmp\vimswap\vim3,e:\tmp\vimswap\vim4
" 设置swap文件的目录上面
set backupdir=e:\tmp\vimswap\vim1,e:\tmp\vimswap\vim2,e:\tmp\vimswap\vim3,e:\tmp\vimswap\vim4
"设置备份文件的目录上面 我不喜欢看到每个目录下都有备份 因为一般备份用不到


set diffexpr=MyDiff()
function MyDiff()
let opt = ''
if &diffopt =~ 'icase' | let opt = opt . '-i ' | endif
if &diffopt =~ 'iwhite' | let opt = opt . '-b ' | endif
silent execute '!d:\tools\Vim\vim62\diff -a ' . opt . '"' .
v:fname_in . '" "' . v:fname_new . '" > "' . v:fname_out . '"'
endfunction

"下面是设置自动folder的 而且是根据写C代码设置的 如果你不喜欢使用folder那么可以省略掉
au BufReadPost *.c,*.cpp syn region myFold start="{" end="}" transparent fold
au BufReadPost *.c,*.cpp syn sync fromstart
au BufReadPost *.c,*.cpp set foldmethod=syntax
set foldlevel=0

vim + cscope/ctags

使用vim + cscope/ctags,就可以实现SourceInsight的功能,以后可以不再用盗版SouceInsight读代码了。
按照vim里cscope的参考手册(在vim中执行":help
cscope"命令),把cscope功能加到.vimrc里后(需要你的vim在编译时选择了"--enable-cscope"选项,否则你需要重新编译vim),配置就算完成了。然后用下面的命令生成代码的符号索引文件:

cscope -Rbkq

这个命令会生成三个文件:cscope.out, cscope.in.out, cscope.po.out。
其中cscope.out是基本的符号索引,后两个文件是使用"-q"选项生成的,可以加快cscope的索引速度。
上面所用到的命令参数,含义如下:

-R: 在生成索引文件时,搜索子目录树中的代码
-b: 只生成索引文件,不进入cscope的界面
-k: 在生成索引文件时,不搜索/usr/include目录
-q: 生成cscope.in.out和cscope.po.out文件,加快cscope的索引速度


接下来,就可以在vim里读代码了。
不过在使用过程中,发现无法找到C++的类、函数定义、调用关系。仔细阅读了cscope的手册后发现,原来cscope在产生索引文件时,只搜索类型为
C, lex和yacc的文件(后缀名为.c, .h, .l,
.y),C++的文件根本没有生成索引。不过按照手册上的说明,cscope支持c++和Java语言的文件。
于是按照cscope手册上提供的方法,先产生一个文件列表,然后让cscope为这个列表中的每个文件都生成索引。
为了方便使用,编写了下面的脚本来更新cscope和ctags的索引文件:

#!/bin/sh

find . -name "*.h" -o -name "*.c" -o -name "*.cc" > cscope.files
cscope -bkq -i cscope.files
ctags -R

这个脚本,首先使用find命令,查找当前目录及子目录中所有后缀名为".h", ".c"和".cc"的文件,并把查找结果重定向到文件cscope.files中。
然后cscope根据cscope.files中的所有文件,生成符号索引文件。
最后一条命令使用ctags命令,生成一个tags文件,在vim中执行":help tags"命令查询它的用法。它可以和cscope一起使用。

目前只能在unix系列操作系统下使用cscope,虽然也有windows版本的cscope,不过还有很多bug。在Linux技术中坚站上看到有作者在win2000上成功运行了gvim
+ cscope,详情可以参阅:
  http://www.chinalinuxpub.com/bbs/showthread.php?t=30185

在vim的网站上,也有人在cygwin中成功运行了vim + cscope,详情请参阅:
  http://vim.sourceforge.net/tips/tip.php?tip_id=338
另外,还有人在windows上安装了XFree86包,然后在Xwindow中运行gvim + cscope。这同样可以在上面的网页中看到。

cscope的主页在:http://cscope.sourceforge.net/

在vim的网站上,有很多和cscope相关的插件,可以去找一下你有没有所感兴趣的。搜索结果在这里:
  点这里
http://www.yuanma.org/data/2006/0908/article_1487.htm


cscope在windows下使用mingw编译的方法

Python写注册表

http://bbs.chinaunix.net/viewthread.php?tid=943195

# 功能:换墙纸
import _winreg

key = _winreg.OpenKey(_winreg.HKEY_CURRENT_USER, "Control Panel\Desktop")

_winreg.SetValueEx(key, "WallPaper", 0, _winreg.REG_SZ, r"G:\Documents and
Settings\ning\Local Settings\Application Data\Microsoft\00.jpg")

Python中类的一些实现办法

http://bbs.chinaunix.net/thread-977343-1-1.html
看来是跟C里实现面象对象的方式差不多啊。

In [1]: def greet(someone, anotherone):
...: print someone, 'say hello to', anotherone
...:

In [2]: class Person(object):
...: def __init__(self, name):
...: self.name=name
...: def __str__(self):
...: return self.name
...:

In [3]: p1 = Person('test1')

In [4]: p2 = Person('test2')

In [5]: greet(p1, p2)
test1 say hello to test2

In [6]: Person.greet = greet

In [7]: p1.greet(p2)
test1 say hello to test2

NFS的共享与使用

Linux中,将A机器上的data1目录share后mount到B机器的data2上
A机:$share -F nfs -o rw /data1
B机:$mount A:/data1 /data2

vi命令提要

vi命令提要

0         行首

$         行尾

i/I        插入(i,当前光标处,I,行首)

a/A      追加(a,当前光标处,A,行尾)

o/O      打开(o,当前行下打开一行,O,当前行­上打开一行)

r/R      替换(r,替换当前光标处字符,R,从光标­处开始替换)

x         删除当前光标处字符

y         复制到register

p         register复制到编辑区

m[a-z][A-Z]定义mark

`[a-z][A-Z]到指定mark

dd        删除一行

/string查找字符串string

n         继续查找

N         上一查找

:$        文件尾

           相同命令G

:0        文件头

           相同命令gg

:1, $s/string1/string2/g全文件查找string1并­替换成string2

:wq!     存盘退出

:q!       强制退出

简单的用法指南

正在完善

此生只为听天籁,坐拥书城看落花。

星期日, 八月 26, 2007

Vim对中文编码的支持

1、支持中文编码的基础

Vim要更好地支持中文编码需要两个特性:+multi_byte和+iconv,可以用|:version|命令检查当前使用的Vim是否支持,否则的话需要重新编译。

2、影响中文编码的设置项

Vim中有几个选项会影响对多字节编码的支持:

* encoding(enc):encoding是Vim的内部使用编码,encoding的设置会影响Vim内部的Buffer、消息文字等。在
Unix环境下,encoding的默认设置等于locale;Windows环境下会和当前代码页相同。在中文Windows环境下encoding的默认设置是cp936(GBK)。
* fileencodings(fenc):Vim在打开文件时会根据fileencodings选项来识别文件编码,fileencodings可以同时设置多个编码,Vim会根据设置的顺序来猜测所打开文件的编码。
* fileencoding(fencs)
:Vim在保存新建文件时会根据fileencoding的设置编码来保存。如果是打开已有文件,Vim会根据打开文件时所识别的编码来保存,除非在保存时重新设置fileencoding。
* termencodings(tenc):在终端环境下使用Vim时,通过termencoding项来告诉Vim终端所使用的编码。

3、Vim中的编码转换

Vim内部使用iconv库进行编码转换,如果这几个选项所设置的编码不一致,Vim就有可能会转换编码。打开已有文件时会从文件编码转换到
encoding所设置的编码;保存文件时会从encoding设置的编码转换到fileencoding对应的编码。经常会看到Vim提示[已转换],这是表明Vim内部作了编码转换。终端环境下使用Vim,会从termencoding设置的编码转换到encoding设置的编码。

可以用|:help encoding-values|列出Vim支持的所有编码。

4、具体应用环境的设置

* 只编辑GBK编码的文件

set fileencodings=cp936
set fileencoding=cp936
set encoding=cp936

* 只编辑UTF-8编码的中文文件

set fileencodings=utf-8
set fileencoding=utf-8
set encoding=cp936 或者 set encoding=utf-8

* 同时支持GBK和UTF-8编码

set fileencodings=ucs-bom,utf-8,cp936
set fileencoding=utf-8
set encoding=cp936 或者 set encoding=utf-8

* 如果在终端环境下使用Vim,需要设置termencoding和终端所使用的编码一致。例如:

set termencoding=cp936 或者 set termencoding=utf-8

Windows记事本编辑UTF-8编码文件时会在文件头上加上三个字节的BOM:EFBBBF。如果fileencodings中设置ucs-bom的目的就是为了能够兼容用记事本编辑的文件,不需要的话可以去掉。Vim在保存UTF-8编码的文件时会去掉BOM。去掉BOM的最大好处是在Unix下能够使用cat
a b>c来正确合并文件,这点经常被忽略。

5、FAQ

1. 为什么在Vim中一次只能删除半个汉字?

因为encoding设置错误,把encoding设置为cp936就可以解决此问题。在Unix环境下Vim会根据locale来设置默认的encoding,如果没有正确设置locale并且没有设置encoding就会一次只能删除半个汉字。
2. VIM为什么不能输入繁体字?

把euc-cn或者GB2312改为cp936就可以了。euc-cn是GB2312的别名,不支持繁体汉字。cp936是GBK的别名,是GB2312的超集,可以支持繁体汉字。
3. VIM为什么提示不能转换?

因为在编译Vim时没有加入iconv选项,重新编译Vim才能解决。
4. 如何打开一个GBK编码的文件并另存为UTf-8编码?

保存文件时运行命令|:set fileencoding=utf-8|就可以了。

vim能完整支援utf-8的文件

在主�上使用 vim 修改程式已�是家常便�了。�常�遇到的困�是�修 utf-8 格式的文件在 vim ���成��。

�初是用 google 找到解�方案的,不�忘�在那�找到的 :P 。�然我不��你,但是我��你!

把方法�下�如下:

其�很��,只是加上一些�定到 .vimrc �定��面。如下:

set encoding=utf-8
set fileencodings=ucs-bom,utf-8,big5,latin1
set fileencoding=big5
set termencoding=big5

重新�� vim �,就可以正常�示及�� utf-8 的文件了。

这篇更好,直接修改vimrc就不用每次修改了。不过是BIG5编码的。

编码不同,不过还是不要忘记原地址:http://blog.nlhs.tyc.edu.tw/post/2/13

标签: ,

vi使用utf-8编码

用VIM,有个文件需要用UTF-8编码,查到点有用的东西。:)Help文件里的,如果Help文件支持查询就好了。;)
http://www.vim.org/htmldoc/mbyte.html

LOCALE

First of all, you must make sure your current locale is set correctly. If
your system has been installed to use the language, it probably works right
away. If not, you can often make it work by setting the $LANG environment
variable in your shell:

setenv LANG ja_JP.EUC

Unfortunately, the name of the locale depends on your system. Japanese might
also be called "ja_JP.EUCjp" or just "ja". To see what is currently used:

:language

To change the locale inside Vim use:

:language ja_JP.EUC

Vim will give an error message if this doesn't work. This is a good way to
experiment and find the locale name you want to use. But it's always better
to set the locale in the shell, so that it is used right from the start.

See |mbyte-locale| for details.


ENCODING

If your locale works properly, Vim will try to set the 'encoding' option
accordingly. If this doesn't work you can overrule its value:

:set encoding=utf-8

See |encoding-values| for a list of acceptable values.

The result is that all the text that is used inside Vim will be in this
encoding. Not only the text in the buffers, but also in registers, variables,
etc. This also means that changing the value of 'encoding' makes the existing
text invalid! The text doesn't change, but it will be displayed wrong.

You can edit files in another encoding than what 'encoding' is set to. Vim
will convert the file when you read it and convert it back when you write it.
See 'fileencoding', 'fileencodings' and |++enc|.

星期四, 八月 23, 2007

一个vimrc文件

位置c:\document and settings\用户名下,一个文件名叫:_vimrc
出处http://www.amix.dk/vim/vimrc.html
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" _
" __ | \
" / | /
" \__ | \
" by Amix - http://amix.dk/
"
" Maintainer: Amir Salihefendic <amix3k at gmail.com>
" Version: 2.7
" Last Change: 12/10/06 00:09:21
"
" Sections:
" ----------------------
" General
" Colors and Fonts
" Fileformats
" VIM userinterface
" Statusline
" Visual
" Moving around and tabs
" General Autocommands
" Parenthesis/bracket expanding
" General Abbrevs
" Editing mappings etc.
" Command-line config
" Buffer realted
" Files and backups
" Folding
" Text options
" Indent
" Spell checking
" Plugin configuration
" Yank ring
" File explorer
" Minibuffer
" Tag list (ctags) - not used
" LaTeX Suite things
" Filetype generic
" Todo
" VIM
" HTML related
" Ruby & PHP section
" Python section
" Cheetah section
" Vim section
" Java section
" JavaScript section
" C mappings
" SML
" Scheme bindings
" Snippets
" Python
" javaScript
" Cope
" MISC
"
" Tip:
" If you find anything that you can't understand than do this:
" help keyword OR helpgrep keywords
" Example:
" Go into command-line mode and type helpgrep nocompatible, ie.
" :helpgrep nocompatible
" then press <leader>c to see the results, or :botright cw
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" General
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"Get out of VI's compatible mode..
set nocompatible

"Sets how many lines of history VIM har to remember
set history=400

"Enable filetype plugin
filetype plugin on
filetype indent on

"Set to auto read when a file is changed from the outside
set autoread

"Have the mouse enabled all the time:
set mouse=a

"Set mapleader
let mapleader = ","
let g:mapleader = ","

"Fast saving
nmap <leader>w :w!<cr>
nmap <leader>f :find<cr>

"Fast reloading of the .vimrc
map <leader>s :source ~/vim_local/vimrc<cr>
"Fast editing of .vimrc
map <leader>e :e! ~/vim_local/vimrc<cr>
"When .vimrc is edited, reload it
autocmd! bufwritepost vimrc source ~/vim_local/vimrc


"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Colors and Fonts
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"Enable syntax hl
syntax enable

"Set font to Monaco 10pt
if MySys() == "mac"
set gfn=Bitstream\ Vera\ Sans\ Mono:h14
set nomacatsui
set termencoding=macroman
elseif MySys() == "linux"
set gfn=Monospace\ 11
endif

if has("gui_running")
set guioptions-=T
let psc_style='cool'
colorscheme ps_color
else
set background=dark
colorscheme zellner
endif

"Some nice mapping to switch syntax (useful if one mixes different
languages in one file)
map <leader>1 :set syntax=cheetah<cr>
map <leader>2 :set syntax=xhtml<cr>
map <leader>3 :set syntax=python<cr>
map <leader>4 :set ft=javascript<cr>
map <leader>$ :syntax sync fromstart<cr>

autocmd BufEnter * :syntax sync fromstart

"Highlight current
if has("gui_running")
set cursorline
hi cursorline guibg=#333333
hi CursorColumn guibg=#333333
endif

"Omni menu colors
hi Pmenu guibg=#333333
hi PmenuSel guibg=#555555 guifg=#ffffff


"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Fileformats
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"Favorite filetypes
set ffs=unix,dos,mac

nmap <leader>fd :se ff=dos<cr>
nmap <leader>fu :se ff=unix<cr>

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" VIM userinterface
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"Set 7 lines to the curors - when moving vertical..
set so=7

"Turn on WiLd menu
set wildmenu

"Always show current position
set ruler

"The commandbar is 2 high
set cmdheight=2

"Show line number
set nu

"Do not redraw, when running macros.. lazyredraw
set lz

"Change buffer - without saving
set hid

"Set backspace
set backspace=eol,start,indent

"Bbackspace and cursor keys wrap to
set whichwrap+=<,>,h,l

"Ignore case when searching
set ignorecase
set incsearch

"Set magic on
set magic

"No sound on errors.
set noerrorbells
set novisualbell
set t_vb=

"show matching bracets
set showmatch

"How many tenths of a second to blink
set mat=2

"Highlight search things
set hlsearch

""""""""""""""""""""""""""""""
" Statusline
""""""""""""""""""""""""""""""
"Always hide the statusline
set laststatus=2

function! CurDir()
let curdir = substitute(getcwd(), '/Users/amir/', "~/", "g")
return curdir
endfunction

"Format the statusline
set statusline=\ %F%m%r%h\ %w\ \ CWD:\ %r%{CurDir()}%h\ \ \ Line:\ %l/%L:%c

""""""""""""""""""""""""""""""
" Visual
""""""""""""""""""""""""""""""
" From an idea by Michael Naumann
function! VisualSearch(direction) range
let l:saved_reg = @"
execute "normal! vgvy"
let l:pattern = escape(@", '\\/.*$^~[]')
let l:pattern = substitute(l:pattern, "\n$", "", "")
if a:direction == 'b'
execute "normal ?" . l:pattern . "^M"
else
execute "normal /" . l:pattern . "^M"
endif
let @/ = l:pattern
let @" = l:saved_reg
endfunction

"Basically you press * or # to search for the current selection !! Really useful
vnoremap <silent> * :call VisualSearch('f')<CR>
vnoremap <silent> # :call VisualSearch('b')<CR>


"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Moving around and tabs
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"Map space to / and c-space to ?
map <space> /
map <c-space> ?

"Smart way to move btw. windows
map <C-j> <C-W>j
map <C-k> <C-W>k
map <C-h> <C-W>h
map <C-l> <C-W>l

"Actually, the tab does not switch buffers, but my arrows
"Bclose function ca be found in "Buffer related" section
map <leader>bd :Bclose<cr>
map <down> <leader>bd
"Use the arrows to something usefull
map <right> :bn<cr>
map <left> :bp<cr>

"Tab configuration
map <leader>tn :tabnew %<cr>
map <leader>te :tabedit
map <leader>tc :tabclose<cr>
map <leader>tm :tabmove
try
set switchbuf=usetab
set stal=2
catch
endtry

"Moving fast to front, back and 2 sides ;)
imap <m-$> <esc>$a
imap <m-0> <esc>0i
imap <D-$> <esc>$a
imap <D-0> <esc>0i


"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" General Autocommands
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"Switch to current dir
map <leader>cd :cd %:p:h<cr>


"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Parenthesis/bracket expanding
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
vnoremap $1 <esc>`>a)<esc>`<i(<esc>
")
vnoremap $2 <esc>`>a]<esc>`<i[<esc>
vnoremap $3 <esc>`>a}<esc>`<i{<esc>
vnoremap $$ <esc>`>a"<esc>`<i"<esc>
vnoremap $q <esc>`>a'<esc>`<i'<esc>
vnoremap $w <esc>`>a"<esc>`<i"<esc>

"Map auto complete of (, ", ', [
inoremap $1 ()<esc>:let leavechar=")"<cr>i
inoremap $2 []<esc>:let leavechar="]"<cr>i
inoremap $4 {<esc>o}<esc>:let leavechar="}"<cr>O
inoremap $3 {}<esc>:let leavechar="}"<cr>i
inoremap $q ''<esc>:let leavechar="'"<cr>i
inoremap $w ""<esc>:let leavechar='"'<cr>i
au BufNewFile,BufRead *.\(vim\)\@! inoremap " ""<esc>:let leavechar='"'<cr>i
au BufNewFile,BufRead *.\(txt\)\@! inoremap ' ''<esc>:let leavechar="'"<cr>i

imap <m-l> <esc>:exec "normal f" . leavechar<cr>a
imap <d-l> <esc>:exec "normal f" . leavechar<cr>a


"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" General Abbrevs
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"My information
iab xdate <c-r>=strftime("%d/%m/%y %H:%M:%S")<cr>
iab xname Amir Salihefendic


"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Editing mappings etc.
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"Remap VIM 0
map 0 ^

"Move a line of text using control
nmap <M-j> mz:m+<cr>`z
nmap <M-k> mz:m-2<cr>`z
vmap <M-j> :m'>+<cr>`<my`>mzgv`yo`z
vmap <M-k> :m'<-2<cr>`>my`<mzgv`yo`z

if MySys() == "mac"
nmap <D-j> <M-j>
nmap <D-k> <M-k>
vmap <D-j> <M-j>
vmap <D-k> <M-k>
endif

func! DeleteTrailingWS()
exe "normal mz"
%s/\s\+$//ge
exe "normal `z"
endfunc
autocmd BufWrite *.py :call DeleteTrailingWS()

set completeopt=menu

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Command-line config
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
func! Cwd()
let cwd = getcwd()
return "e " . cwd
endfunc

func! DeleteTillSlash()
let g:cmd = getcmdline()
if MySys() == "linux" || MySys() == "mac"
let g:cmd_edited = substitute(g:cmd, "\\(.*\[/\]\\).*", "\\1", "")
else
let g:cmd_edited = substitute(g:cmd, "\\(.*\[\\\\]\\).*", "\\1", "")
endif
if g:cmd == g:cmd_edited
if MySys() == "linux" || MySys() == "mac"
let g:cmd_edited = substitute(g:cmd, "\\(.*\[/\]\\).*/", "\\1", "")
else
let g:cmd_edited = substitute(g:cmd,
"\\(.*\[\\\\\]\\).*\[\\\\\]", "\\1", "")
endif
endif
return g:cmd_edited
endfunc

func! CurrentFileDir(cmd)
return a:cmd . " " . expand("%:p:h") . "/"
endfunc

"Smart mappings on the command line
cno $h e ~/
cno $d e ~/Desktop/
cno $j e ./

cno $q <C-\>eDeleteTillSlash()<cr>

cno $c e <C-\>eCurrentFileDir("e")<cr>

cno $tc <C-\>eCurrentFileDir("tabnew")<cr>
cno $th tabnew ~/
cno $td tabnew ~/Desktop/

"Bash like
cnoremap <C-A> <Home>
cnoremap <C-E> <End>
cnoremap <C-K> <C-U>


"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Buffer realted
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"Fast open a buffer by search for a name
map <c-q> :sb

"Open a dummy buffer for paste
map <leader>q :e ~/buffer<cr>

"Restore cursor to file position in previous editing session
set viminfo='10,\"100,:20,%,n~/.viminfo
au BufReadPost * if line("'\"") > 0|if line("'\"") <=
line("$")|exe("norm '\"")|else|exe "norm $"|endif|endif

" Buffer - reverse everything ... :)
map <F9> ggVGg?

" Don't close window, when deleting a buffer
command! Bclose call <SID>BufcloseCloseIt()

function! <SID>BufcloseCloseIt()
let l:currentBufNum = bufnr("%")
let l:alternateBufNum = bufnr("#")

if buflisted(l:alternateBufNum)
buffer #
else
bnext
endif

if bufnr("%") == l:currentBufNum
new
endif

if buflisted(l:currentBufNum)
execute("bdelete! ".l:currentBufNum)
endif
endfunction


"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Files and backups
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"Turn backup off
set nobackup
set nowb
set noswapfile


"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Folding
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"Enable folding, I find it very useful
set nofen
set fdl=0


"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Text options
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
set expandtab
set shiftwidth=2

map <leader>t2 :set shiftwidth=2<cr>
map <leader>t4 :set shiftwidth=4<cr>
au FileType html,python,vim,javascript setl shiftwidth=2
au FileType html,python,vim,javascript setl tabstop=2
au FileType java setl shiftwidth=4
au FileType java setl tabstop=4

set smarttab
set lbr
set tw=500

""""""""""""""""""""""""""""""
" Indent
""""""""""""""""""""""""""""""
"Auto indent
set ai

"Smart indet
set si

"C-style indeting
set cindent

"Wrap lines
set wrap


"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Spell checking
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
map <leader>sn ]s
map <leader>sp [s
map <leader>sa zg
map <leader>s? z=


"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Plugin configuration
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
""""""""""""""""""""""""""""""
" Vim Grep
""""""""""""""""""""""""""""""
let Grep_Skip_Dirs = 'RCS CVS SCCS .svn'
let Grep_Cygwin_Find = 1

""""""""""""""""""""""""""""""
" Yank Ring
""""""""""""""""""""""""""""""
map <leader>y :YRShow<cr>

""""""""""""""""""""""""""""""
" File explorer
""""""""""""""""""""""""""""""
"Split vertically
let g:explVertical=1

"Window size
let g:explWinSize=35

let g:explSplitLeft=1
let g:explSplitBelow=1

"Hide some files
let g:explHideFiles='^\.,.*\.class$,.*\.swp$,.*\.pyc$,.*\.swo$,\.DS_Store$'

"Hide the help thing..
let g:explDetailedHelp=0


""""""""""""""""""""""""""""""
" Minibuffer
""""""""""""""""""""""""""""""
let g:miniBufExplModSelTarget = 1
let g:miniBufExplorerMoreThanOne = 2
let g:miniBufExplModSelTarget = 0
let g:miniBufExplUseSingleClick = 1
let g:miniBufExplMapWindowNavVim = 1
let g:miniBufExplVSplit = 25
let g:miniBufExplSplitBelow=1

let g:bufExplorerSortBy = "name"

autocmd BufRead,BufNew :call UMiniBufExplorer


""""""""""""""""""""""""""""""
" Tag list (ctags) - not used
""""""""""""""""""""""""""""""
"let Tlist_Ctags_Cmd = "/sw/bin/ctags-exuberant"
"let Tlist_Sort_Type = "name"
"let Tlist_Show_Menu = 1
"map <leader>t :Tlist<cr>


""""""""""""""""""""""""""""""
" LaTeX Suite things
""""""""""""""""""""""""""""""
set grepprg=grep\ -nH\ $*
let g:Tex_DefaultTargetFormat="pdf"
let g:Tex_ViewRule_pdf='xpdf'

"Bindings
autocmd FileType tex map <silent><leader><space> :w!<cr> :silent!
call Tex_RunLaTeX()<cr>

"Auto complete some things ;)
autocmd FileType tex inoremap $i \indent
autocmd FileType tex inoremap $* \cdot
autocmd FileType tex inoremap $i \item
autocmd FileType tex inoremap $m \[<cr>\]<esc>O


"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Filetype generic
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Todo
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
au BufNewFile,BufRead *.todo so ~/vim_local/syntax/amido.vim

""""""""""""""""""""""""""""""
" VIM
""""""""""""""""""""""""""""""
autocmd FileType vim map <buffer> <leader><space> :w!<cr>:source %<cr>


""""""""""""""""""""""""""""""
" HTML related
""""""""""""""""""""""""""""""
" HTML entities - used by xml edit plugin
let xml_use_xhtml = 1
"let xml_no_auto_nesting = 1

"To HTML
let html_use_css = 1
let html_number_lines = 0
let use_xhtml = 1


""""""""""""""""""""""""""""""
" Ruby & PHP section
""""""""""""""""""""""""""""""
autocmd FileType ruby map <buffer> <leader><space> :w!<cr>:!ruby %<cr>
autocmd FileType php compiler php
autocmd FileType php map <buffer> <leader><space> <leader>cd:w<cr>:make %<cr>


""""""""""""""""""""""""""""""
" Python section
""""""""""""""""""""""""""""""
"Run the current buffer in python - ie. on leader+space
au FileType python so ~/vim_local/syntax/python.vim
autocmd FileType python map <buffer> <leader><space> :w!<cr>:!python %<cr>
autocmd FileType python so ~/vim_local/plugin/python_fold.vim

"Set some bindings up for 'compile' of python
autocmd FileType python set makeprg=python\ -c\ \"import\
py_compile,sys;\ sys.stderr=sys.stdout;\ py_compile.compile(r'%')\"
autocmd FileType python set efm=%C\ %.%#,%A\ \ File\ \"%f\"\\,\
line\ %l%.%#,%Z%[%^\ ]%\\@=%m

"Python iMaps
au FileType python set cindent
au FileType python inoremap <buffer> $r return
au FileType python inoremap <buffer> $s self
au FileType python inoremap <buffer> $c ##<cr>#<space><cr>#<esc>kla
au FileType python inoremap <buffer> $i import
au FileType python inoremap <buffer> $p print
au FileType python inoremap <buffer> $d """<cr>"""<esc>O

"Run in the Python interpreter
function! Python_Eval_VSplit() range
let src = tempname()
let dst = tempname()
execute ": " . a:firstline . "," . a:lastline . "w " . src
execute ":!python " . src . " > " . dst
execute ":pedit! " . dst
endfunction
au FileType python vmap <F7> :call Python_Eval_VSplit()<cr>

""""""""""""""""""""""""""""""
" Cheetah section
"""""""""""""""""""""""""""""""
autocmd FileType cheetah set ft=xml
autocmd FileType cheetah set syntax=cheetah

"""""""""""""""""""""""""""""""
" Vim section
"""""""""""""""""""""""""""""""
autocmd FileType vim set nofen

"""""""""""""""""""""""""""""""
" Java section
"""""""""""""""""""""""""""""""
au FileType java inoremap <buffer> <C-t> System.out.println();<esc>hi

"Java comments
autocmd FileType java source ~/vim_local/macros/jcommenter.vim
autocmd FileType java let b:jcommenter_class_author='Amir
Salihefendic (amix@amix.dk)'
autocmd FileType java let b:jcommenter_file_author='Amir
Salihefendic (amix@amix.dk)'
autocmd FileType java map <buffer> <F2> :call JCommentWriter()<cr>

"Abbr'z
autocmd FileType java inoremap <buffer> $pr private
autocmd FileType java inoremap <buffer> $r return
autocmd FileType java inoremap <buffer> $pu public
autocmd FileType java inoremap <buffer> $i import
autocmd FileType java inoremap <buffer> $b boolean
autocmd FileType java inoremap <buffer> $v void
autocmd FileType java inoremap <buffer> $s String

"Folding
function! JavaFold()
setl foldmethod=syntax
setl foldlevelstart=1
syn region foldBraces start=/{/ end=/}/ transparent fold keepend extend
syn match foldImports /\(\n\?import.\+;\n\)\+/ transparent fold

function! FoldText()
return substitute(getline(v:foldstart), '{.*', '{...}', '')
endfunction
setl foldtext=FoldText()
endfunction
au FileType java call JavaFold()
au FileType java setl fen

au BufEnter *.sablecc,*.scc set ft=sablecc

""""""""""""""""""""""""""""""
" JavaScript section
"""""""""""""""""""""""""""""""
au FileType javascript so ~/vim_local/syntax/javascript.vim
function! JavaScriptFold()
setl foldmethod=syntax
setl foldlevelstart=1
syn region foldBraces start=/{/ end=/}/ transparent fold keepend extend

function! FoldText()
return substitute(getline(v:foldstart), '{.*', '{...}', '')
endfunction
setl foldtext=FoldText()
endfunction
au FileType javascript call JavaScriptFold()
au FileType javascript setl fen

au FileType javascript imap <c-t> console.log();<esc>hi
au FileType javascript imap <c-a> alert();<esc>hi
au FileType javascript setl nocindent
au FileType javascript inoremap <buffer> $r return

au FileType javascript inoremap <buffer> $d //<cr>//<cr>//<esc>ka<space>
au FileType javascript inoremap <buffer> $c /**<cr><space><cr>**/<esc>ka


""""""""""""""""""""""""""""""
" HTML
"""""""""""""""""""""""""""""""
au FileType html,cheetah set ft=xml
au FileType html,cheetah set syntax=html


""""""""""""""""""""""""""""""
" C mappings
"""""""""""""""""""""""""""""""
autocmd FileType c map <buffer> <leader><space> :w<cr>:!gcc %<cr>


"""""""""""""""""""""""""""""""
" SML
"""""""""""""""""""""""""""""""
autocmd FileType sml map <silent> <buffer> <leader><space>
<leader>cd:w<cr>:!sml %<cr>


""""""""""""""""""""""""""""""
" Scheme bidings
""""""""""""""""""""""""""""""
autocmd BufNewFile,BufRead *.scm map <buffer> <leader><space>
<leader>cd:w<cr>:!petite %<cr>
autocmd BufNewFile,BufRead *.scm inoremap <buffer> <C-t>
(pretty-print )<esc>i
autocmd BufNewFile,BufRead *.scm vnoremap <C-t>
<esc>`>a)<esc>`<i(pretty-print <esc>


""""""""""""""""""""""""""""""
" SVN section
"""""""""""""""""""""""""""""""
map <F8> :new<CR>:read !svn diff<CR>:set syntax=diff buftype=nofile<CR>gg


""""""""""""""""""""""""""""""
" Snippets
"""""""""""""""""""""""""""""""
"You can use <c-j> to goto the next <++> - it is pretty smart ;)

"""""""""""""""""""""""""""""""
" Python
"""""""""""""""""""""""""""""""
autocmd FileType python inorea <buffer> cfun
<c-r>=IMAP_PutTextWithMovement("def <++>(<++>):\n<++>\nreturn
<++>")<cr>
autocmd FileType python inorea <buffer> cclass
<c-r>=IMAP_PutTextWithMovement("class <++>:\n<++>")<cr>
autocmd FileType python inorea <buffer> cfor
<c-r>=IMAP_PutTextWithMovement("for <++> in <++>:\n<++>")<cr>
autocmd FileType python inorea <buffer> cif
<c-r>=IMAP_PutTextWithMovement("if <++>:\n<++>")<cr>
autocmd FileType python inorea <buffer> cifelse
<c-r>=IMAP_PutTextWithMovement("if <++>:\n<++>\nelse:\n<++>")<cr>


"""""""""""""""""""""""""""""""
" JavaScript
"""""""""""""""""""""""""""""""
autocmd FileType cheetah,html,javascript inorea <buffer> cfun
<c-r>=IMAP_PutTextWithMovement("function <++>(<++>) {\n<++>;\nreturn
<++>;\n}")<cr>
autocmd filetype cheetah,html,javascript inorea <buffer> cfor
<c-r>=IMAP_PutTextWithMovement("for(<++>; <++>; <++>)
{\n<++>;\n}")<cr>
autocmd FileType cheetah,html,javascript inorea <buffer> cif
<c-r>=IMAP_PutTextWithMovement("if(<++>) {\n<++>;\n}")<cr>
autocmd FileType cheetah,html,javascript inorea <buffer> cifelse
<c-r>=IMAP_PutTextWithMovement("if(<++>) {\n<++>;\n}\nelse
{\n<++>;\n}")<cr>


"""""""""""""""""""""""""""""""
" HTML
"""""""""""""""""""""""""""""""
autocmd FileType cheetah,html inorea <buffer> cahref
<c-r>=IMAP_PutTextWithMovement('<a href="<++>"><++></a>')<cr>
autocmd FileType cheetah,html inorea <buffer> cbold
<c-r>=IMAP_PutTextWithMovement('<b><++></b>')<cr>
autocmd FileType cheetah,html inorea <buffer> cimg
<c-r>=IMAP_PutTextWithMovement('<img src="<++>" alt="<++>" />')<cr>
autocmd FileType cheetah,html inorea <buffer> cpara
<c-r>=IMAP_PutTextWithMovement('<p><++></p>')<cr>
autocmd FileType cheetah,html inorea <buffer> ctag
<c-r>=IMAP_PutTextWithMovement('<<++>><++></<++>>')<cr>
autocmd FileType cheetah,html inorea <buffer> ctag1
<c-r>=IMAP_PutTextWithMovement("<<++>><cr><++><cr></<++>>")<cr>


"""""""""""""""""""""""""""""""
" Java
"""""""""""""""""""""""""""""""
autocmd FileType java inorea <buffer> cfun
<c-r>=IMAP_PutTextWithMovement("public<++> <++>(<++>) {\n<++>;\nreturn
<++>;\n}")<cr>
autocmd FileType java inorea <buffer> cfunpr
<c-r>=IMAP_PutTextWithMovement("private<++> <++>(<++>)
{\n<++>;\nreturn <++>;\n}")<cr>
autocmd FileType java inorea <buffer> cfor
<c-r>=IMAP_PutTextWithMovement("for(<++>; <++>; <++>)
{\n<++>;\n}")<cr>
autocmd FileType java inorea <buffer> cif
<c-r>=IMAP_PutTextWithMovement("if(<++>) {\n<++>;\n}")<cr>
autocmd FileType java inorea <buffer> cifelse
<c-r>=IMAP_PutTextWithMovement("if(<++>) {\n<++>;\n}\nelse
{\n<++>;\n}")<cr>
autocmd FileType java inorea <buffer> cclass
<c-r>=IMAP_PutTextWithMovement("class <++> <++> {\n<++>\n}")<cr>
autocmd FileType java inorea <buffer> cmain
<c-r>=IMAP_PutTextWithMovement("public static void main(String[] argv)
{\n<++>\n}")<cr>


"Presse c-q insted of space (or other key) to complete the snippet
imap <C-q> <C-]>


"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Cope
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"For Cope
map <silent> <leader><cr> :noh<cr>

"Orginal for all
map <leader>n :cn<cr>
map <leader>p :cp<cr>
map <leader>c :botright cw 10<cr>
map <c-u> <c-l><c-j>:q<cr>:botright cw 10<cr>


"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" MISC
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"Remove the Windows ^M
noremap <Leader>m mmHmt:%s/<C-V><cr>//ge<cr>'tzt'm

"Paste toggle - when pasting something in, don't indent.
set pastetoggle=<F3>

"Remove indenting on empty lines
map <F2> :%s/\s*$//g<cr>:noh<cr>''

"Super paste
inoremap <C-v> <esc>:set paste<cr>mui<C-R>+<esc>mv'uV'v=:set nopaste<cr>

"A function that inserts links & anchors on a TOhtml export.
" Notice:
" Syntax used is:
" Link
" Anchor
function! SmartTOHtml()
TOhtml
try
%s/&amp;quot;\s\+\*&gt; \(.\+\)</" <a href="#\1" style="color: cyan">\1<\/a></g
%s/&quot;\(-\|\s\)\+\*&gt; \(.\+\)</" \ \ <a href="#\2"
style="color: cyan;">\2<\/a></g
%s/&quot;\s\+=&gt; \(.\+\)</" <a name="\1" style="color: #fff">\1<\/a></g
catch
endtry
exe ":write!"
exe ":bd"
endfunction

标签: ,

星期三, 八月 22, 2007

深入Python

学习Python,为创建自己的语言打下坚实的基础!

http://man.chinaunix.net/develop/python/diveinto_python/toc.html

这本书不错,Dive in Python.以前看过一段Python,感觉还可以,但是没有想像那么完
美。还是特别喜欢C/C++,犹其是C++,是不是一开始就上了C++的贼船,想下比较难?

Emacs 中文化指南

值得一看的Emacs中文化文章。Emacs和VI都要学,越是用着不舒服,越要学。

http://man.chinaunix.net/newsoft/Emac/book.html


3.2 中文设置
3.2.1 通用配置
这一部分是所有系统都要设置的

(set-language-environment 'Chinese-GB)
(set-keyboard-coding-system 'euc-cn)
(set-clipboard-coding-system 'euc-cn)
(set-terminal-coding-system 'euc-cn)
(set-buffer-file-coding-system 'euc-cn)
(set-selection-coding-system 'euc-cn)
(modify-coding-system-alist 'process "*" 'euc-cn)
(setq default-process-coding-system
'(euc-cn . euc-cn))
(setq-default pathname-coding-system 'euc-cn)

3.3 Emacs输入法
Emacs自带多种输入法, 当然不止一种语言了, 但它自带的中文输入 法实在是
太......, 想必不会有谁去用它的中文输入法来输入汉字吧, 不过 还是有几种比较好
的输入法像自然码等, 我从fcitx和xcin的源码包中转换出 几种输入法, 有五笔, 注
音, 双拼等, 下面说一下使用方法, 可以从

http://sourceforge.net/projects/zhdotemacs/ 下载到emacsim.tar.bz2

安装及使用方法, 参见安装包中的INSTALL文件

安装输入法

$tar -xvjf emacsim.tar.bz2
$cd emacsim
$cp -R gb big5 ${emacs-install-dir}/share/emacs/${emacs-version}/leim

配置输入法, 拿gb/pingyin.el为例, 把下面的代码加入到文件
${emacs-install-dir}/share/emacs/${emacs-version}/leim/leim-list.el中

(register-input-method
"chinese-pinyin-gb" "Chinese-CNS" 'quail-use-package
"拼音" "汉字输入∷【拼音】∷"
"gb/pinyin")

输入法的使用, 按照上面的例子, 使用 `M-x set-input-method RET
chinese-pinyin-gb RET' 就可以使用了

高质量C++/C编程指南

http://man.chinaunix.net/develop/c&c++/c/c.htm

林锐出品,值得一读

============================
此生只为听天籁,坐拥书城看落花
欧兰辉

Emacs快速指南

您正在阅读 Emacs 快速指南(Emacs tutorial)。请见页尾有关复制条件。

Copyright (c) 1985, 1996, 1998, 2001, 2002 Free Software Foundation.



Emacs 命令通常包含有 CONTROL 键(有时候以 CTRL 或 CTL 来标示)或是

META 键(有时候以 EDIT 或 ALT 来标示)。为了避免每一次都要写出其全名,

我们将会使用下述的缩写:



C-<chr> 表示当键入字符 <chr> 时 按住 CONTROL 键。 因此,C-f 就是:按

住 CONTROL 键再键入 f 。



M-<chr> 表示当键入字符 <chr> 时 按住 META 或 EDIT 或 ALT 键。 如果没

有 META 、 EDIT 或 ALT 键时,则可以用 「按一下 ESC 键然后放开,

再键入 <chr> 的步骤」 来作为替代。我们以 <ESC> 来表示 ESC 键。



重要备忘录:要退出 Emacs 会话(session),键入 C-x C-c (两个字符)。

位在左侧边界的「>>」字符是让您可以试著使用的命令的提示。举例来说:

<<Blank lines inserted around following line by help-with-tutorial>>

[Middle of page left blank for didactic purposes. Text continues below]



>> 现在键入 C-v (View next screen)以移到下个屏幕。(试试看,键入字符

v 时,按住 CONTROL 键)



从现在开始,您应该在每次阅读完目前的屏幕时做一次这个动作。



要注意的是,当您从一个屏幕移到另一个时,中间会有两行重复;这样做是为了

提供一些连续性,让您可以接续地阅读文字。



您需要知道的第一件事是如何在文字中移动。您已经知道了可以 C-v 来向前移

动一个屏幕。要向后移动一个屏幕,则键入 M-v (按住 META 键,然后键入 v

,或是如果您没有 META 、 EDIT 或 ALT 键时键入 <ESC>v)。



>> 试著键入 M-v 然后 C-v ,连续个几次。



【现在您可以 C-v 命令移到后面「翻译」一节,以取得关於本文的翻译相关事

项;然后以 M-v 命令回到这里。】





* 摘要(SUMMARY)

-----------------



以下的命令在浏览屏幕时相当有用:【我们现在以「屏幕」来表示「显示文件内

容的区域」,因为目前是处在 Emacs 中的单窗格(window)显示状态,如果是

在多窗格的状态下,这里所介绍的命令则作用在「工作中的窗格」。有关於窗格

的介绍,请见窗格(windows)一节。】



C-v 向前移动一个屏幕/窗格

M-v 向后移动一个屏幕/窗格



C-l 清除屏幕/窗格,再重新显示所有文字,光标所在位置会显示

於屏幕/窗格的中央。(是 CONTROL-L 而不是 CONTROL-1)



>> 找出光标的位置,并注意其附近的文字为何。然后键入 C-l 。再次找出光标

的位置,确认一下相同的文字现在也位在其附近。



如果您的终端机有 PageUp 与 PageDn 键的话,您也可以使用它们来以屏幕为单

位地移动,但是使用 C-v 和 M-v 会比较有效率。





* 基本的光标控制(BASIC CURSOR CONTROL)

----------------------------------------



屏幕到屏幕的移动是很有用,但是您如何移动到位於屏幕内文字中的特定位置呢?



有几种方式可以进行。您可以使用方向键,但是将您的手放在标准的〔键盘〕位

置,并且使用命令 C-p 、 C-b 、 C-f 和 C-n 将比较有效率。这些字符和四个

方向键〔的功能〕是同等的,如下所示:



前一行 C-p

:

:

向后移 C-b .... 目前光标位置 .... 向前移 C-f

:

:

后一行 C-n



>> 以 C-n 或 C-p 将光标移到图形的中央。键入 C-l 会看到整个图形显示在萤

幕的中央。



您会发现用字母所代表的意义来记忆它们很容易: P 表示 previous 、 N 表示

next 、 B 表示 backward 、而 F 则表示 forward 。您将「总是」用到这些游

标移动命令。



>> 按几次 C-n 把光标往下移动到这行。



>> 按几次 C-f 往前移到这行,然后再以 C-p 往回移动。看看当光标在本行中

央时,C-p 的动作是怎样。



每一个文字行都以一个 Newline 字符作为结束,它是用来与下一行作为分别。

在您文件中的最后一行应该要有一个 Newline 来作为结束(但是 Emacs 并不一

定需要它来编辑文件)。



>> 试著在一行开始的地方键入 C-b 。结果应该会移动到前一行的最后面。这是

因为它往回移动时越过了 Newline 字符。



C-f 也可以和 C-b 一样地越过 Newline 字符。【Newline 字符是「不可见

(invisible)字符」,在编辑器中一般看不到它,这里只是告诉您:在行首再

往前走,那么光标会跑到上一行(如果有的话);在行尾再往回走,那么光标会

跑到下一行(如果有的话)。「越过 Newline 字符」会让光标跑到另外一行。】



>> 多按几次 C-b ,自己感觉一下光标在哪。然后按几次 C-f 回到这行的尾巴。

再按一次 C-f 就可以移到下一行了。



当您移动光标穿越屏幕的上方或下方时,在边界外的文字会移位进入屏幕内。这

称为「卷动」。它让 Emacs 可以将光标移动到文字中的任意特定位置,同时

(光标)不会跑出屏幕外。



>> 试著以 C-n 将光标越过屏幕下方,然后看看发生了什么事。



如果一个字符一个字符地移动太慢的话,您可以一个字一个字地移动。M-f

(META-f) 往前移动一个字,M-b 则往回移动一个字。【对中文来说,则是移动

到下一个或上一个标点符号的所在。】



>> 键入一些 M-f 和 M-b。



当您在一个字的中间时,M-f 会移动到这个字的尾巴。当您在字与字间的空白时,

M-f 会移动到下一个字的尾巴。M-b 的效果相似,只是方向不同。



>> 按几次 M-f 和 M-b,中间夹杂一些 C-f 和 C-b,这样子您就可以观察 M-f

和 M-b 在各种「位在字间或字符间」的不同位置,所表现出来的行为。



请注意 C-f 、 C-b 和 M-f 、 M-b 两对之间的相似性。「经常」的状况是:

META 字符是用来作为与「以语言定义出的单位(字、句子、段落)」有关的操

作,而 CONTROL 字符则是作用在「与您所编辑无关的『基本』单位(字符或行

等)」上。



这个相似性在「行与句子」之间也同样适用: C-a 和 C-e 会将光标移动到「一

行」的 开始和结尾处,而M-a 和 M-e 则将光标移动到「一句」的 开始和结尾

处。



>> 试著按两次 C-a,再按两次 C-e。试著按两次 M-a,再按两次 M-e。



看一下为什么重复的 C-a 命令会没有作用,而重复的 M-a 命令则继续移动到下

一个句子。虽然这并不能说是完全类比,但是其中每个命令的行为看起来都十分

自然。



光标在文字中的位置也可以称作「点位(point)」。简单来说就是:光标表现

出屏幕中「点位」所在的文字位置。



这里是一些简单「光标移动(cursor-moving)操作」的整理,其中也包括了

「字和句」的移动命令:



C-f 往前移动一个字符

C-b 往回移动一个字符



M-f 往前移动一个字【中文是移动到下一个标点符号】

M-b 往回移动一个字【中文是移动到上一个标点符号】



C-n 移动到下一行(往下移)

C-p 移动到上一行(往上移)



C-a 移动到行首

C-e 移动到行尾



M-a 移回句首

M-e 移到句尾



>> 练习几次这些命令。这些都是最常使用到的命令。



还有两个重要的光标动作(cursor-motion)命令,M-<(META Less-than),移

动到文字的最开始,以及M->(META Greater-than),移动到文字的最后。



在大部份的终端机,「<」是在 comma 上方,所以您必须要使用 shift 键来键

入。在这些终端机上,您必须使用 shift 键来键入 M-< ;没有使用 shift 键,

您就变成键入 M-comma 了。



>> 现在试一下 M-< ,移到本快速指南的最开始。然后再重复地使用 C-v 回到

这里。



>> 现在试一下 M-> ,移到本快速指南的最后。然后再重复地使用 M-v 回到这

里。



如果您的终端机有方向键的话,您也可以用方向键移动光标。我们有三个理由建

议您学习 C-b 、 C-f 、 C-n 、 和 C-p :一、任何的终端机都能使用。二、

一旦您使用 Emacs 相当熟练了,您会发现键入这些 CONTROL 字符,比起使用方

向键快多了(因为您不需要将手移开打字区)。三、一旦您使用这些 CONTROL

字符命令成为习惯,您也可以很容易地学会其它高级的光标动作命令。



大部份的 Emacs 命令接受数字参数;对大部份的命令而言,它的作用是指定重

复次数。您要指定一个命令的重复次数的作法是:先键入 C-u,然后在您键入指

令前,键入代表重复次数的数位。如果您有一个 META(或 EDIT 或 ALT)键,

那么您还有另外一个替代作法来输入数字参数:按住 META 键时打入这数字。我

们建议您学习 C-u 的方法,因为它在任何终端机都可以使用。此一数字参数也

称作为「字首参数」,因为您在这参数所作用到的命令前键入它。



举例来说, C-u 8 C-f 向前移动 8 个字符。



>> 试著以一个数字参数来使用 C-n 或 C-p,只一个命令就将光标移动到这行的

附近。



大部份的命令使用数字参数来作为其重复次数,但是其中有些命令则是作为其它

用途。有几个命令(目前您尚未学到)将它作为旗标 -- 以一个字首参数的型态

出现,而不管其值为何,它们让这命令做些不一样的事。



C-v 和 M-v 则是另一类的例外。当给定一个参数时,它们卷动「所指定的数量

的行(以行为单位)」,而不是以「屏幕」为单位卷动。举例来说,C-u 8 C-v

将显示屏幕卷动 8 行。



>> 现在试著键入 C-u 8 C-v。



这命令应该已经将屏幕向上移了 8 行。若您想将它再次地向下卷动,您可以在

执行 M-v 时给定一个参数。



如果您正在使用 X 窗口系统,在 Emacs 窗口左手侧应该有一个称为「卷动轴」

的长方型区域。您可以用滑鼠在卷动轴按一下来卷动文字。



>> 试著在「卷动轴内反白区域上」压一下中间钮。这应该会将文字卷动到「由

您所按一下滑鼠的地方」所决定的位置。



>> 当按住中间时,试著将滑鼠上下移动。您会看到文字随著您移动滑鼠而上下

移动。





* 当 EMACS 发呆时(WHEN EMACS IS HUNG)

---------------------------------------



如果 Emacs 停止回应您的命令,您可以键入 C-g 来安全地停止它。您也可以使

用 C-g 来停止执行过久的命令。



您也可以使用 C-g 来取消数字参数或您不想要完成的命令。



>> 键入 C-u 100 以设定一个 100 的数字参数,然后键入 C-g 。现在键入 C-f

。它应该只会移动一个字符,因为您已经以 C-g 取消了参数。



如果您已经不小心地键入一个 <ESC>,您可以 C-g 来取消它。





* 无效化的命令(DISABLED COMMANDS)

-----------------------------------



有一些 Emacs 命令被「无效化」了,因此初学者不会意外地使用到它们。



如果您键入了某一个无效化的命令,Emacs 会显示一个消息,说明这个命令是什

么,并且询问您是否想要继续,然后执行这命令。



如果您真的想要试一下这个命令,那么在当 Emacs 询问您时,请键入空白。一

般来说,如果您不想要执行这个无效化的命令,请以『n』来回答它。



>> 键入 C-x C-l (这是个无效化的命令)然后键入 n 来回答问题。





* 窗格(WINDOWS)

-----------------



Emacs 可以有数个窗格,每一个显示它自己的文字。我们在稍后会解释如何使用

多重窗格。现在我们想要解释如何除去多余的窗格,然后回到基本的单窗格编辑。

它很简单:



C-x 1 One window (即,除去其它所有的窗格)。



那是个 CONTROL-x 后面跟著数字 1 。C-x 1 将含有光标的窗格扩大到整个屏幕。

它将所有其它的窗格除去。



>> 移动光标到本行并且键入 C-u 0 C-l。



>> 键入 CONTROL-h k CONTROL-f 。看看这个窗格在当一个新的窗格出现(以显

示有关 CONTROL-f 命令的 文档时),它是如何缩小的。



>> 键入 C-x 1 以使文档列表窗格消失。



这个命令并不像您先前所学过的命令那般,它包括了两个字符。它是以字符

CONTROL-x 作为开始。有一整个系列的命令是以 CONTROL-x 作为开始;它们之

中有许多是与「窗格、文件、暂存区以及相关事物」有关的。这些命令有 2 、3

或 4 个字符长。





* 插入与删除(INSERTING AND DELETING)

--------------------------------------



如果您想要插入文字,把它键入就是了。您可以看到的字符,像是 A 、 7 、 *

等,被 Emacs 视为文字并且可以直接插入。键入 <Return> (carriage-return

键)以插入一个 Newline 字符。



您可以键入 <Delback> 以删除您最后键入的字符。<Delback> 是一个键盘键 --

就是您通常在 Emacs 外,使用来「删除您最后键入字符」的同一个。一般来说

是个在 <Return> 上方数行的大键,通常标示为『Delete』、『Del』或

『Backspace』。



如果在那里有个标示为『Backspace』的大键,那么那一个就是您使用来作为

<Delback> 的键了。某个地方可能也会有另一个标示为『Delete』的键,但那个

并不是 <Delback> 。



更一般地说, <Delback> 将位於目前光标位置前一个字符加以删除。



>> 现在做 -- 键入一些字符,然后键入几次 <Delback> 来删除它们。不要担心

这个文件会被更动;您不会影响到原来的快速指南。(您现在看到的)这一

个是您的个人拷贝。



当一行文字变得比「在窗格中的一行」长时,这一行文字会「接续」到第二行窗

格行。这时一个反斜线「\」(或如果您使用窗口化的显示,则是一个小小弯弯

的箭头)会位在其右边界以指出此行接续著。



>> 插入文字,一直到您达到右边界,然后再继续插入。您会看到一个接续行出

现。



>> 使用 <Delback> 删除一些文字,直到此行再次成为一个窗格行。接续行消失

了。



您可以像删除其它字符一样地删除 Newline 字符。将位在两行中的 Newline 字

元删除会让它们合并成为一行。如果合并的结果使这一行太长,以致无法符合窗

格的宽度,它会以一个接续行来显示。



>> 移动光标到本行的开头并键入 <Delback> 。这会将本行与其前一行结合为一

行。



>> 键入 <Return> 以重新插入您刚才删除的 Newline 字符。



记得大部份的 Emacs 命令都可以给予一个重复计数(repeat count);这也包

括了文字字符。重复一个文字字符会将它插入数次。



>> 现在就试一下 -- 键入 C-u 8 * 以插入 ********。



您现在已经学到了「键入个什么东西进 Emacs 以及修正错误」的大部份基本方

法。您也可以「以字或行为单位」地删除。这里有份关於「删除操作」的摘要:



<Delback> 删除光标所在的 前一个字符

C-d 删除光标所在的 后一个字符



M-<Delback> 删除光标所在的 前一个字

M-d 删除光标所在的 后一个字



C-k 删除从光标所在到「行尾」间的字符

M-k 删除从光标所在到「句尾」间的字符



注意「<Delback> 和 C-d」还有「M-<Delback> 和 M-d」是平行地自 C-f 和M-f

扩充出来的(嗯,<Delback> 并不是控制字符,但是没什么好担心的)。 C-k

和 M-k 在某种程度上与 C-e 和 M-e 一样,如果把「一行」和「一句」作为类

比的话。



您也可以只以一种方法来删除缓冲区内的任何部份,先移动到您想要删除的部份

的一端,然后键入 C-@ 或 C-SPC (任一个即可)。(SPC 指的是 Space Bar

)再移到那部份的另一端,接著键入 C-w 。这样就会把介於这两个位置间的所

有文字删除。



>> 移动光标到上一段开头的「您」字。

>> 键入 C-SPC 。 Emacs 应该会在屏幕的下方显示一个「Mark set」消息。

>> 移动光标到第二行中的「端」字。

>> 键入 C-w 。这样会把从「您」开始到刚好「端」之前的文字删除。



要注意的是「杀掉(killing)」和「删除(deleting)」的不同在於被杀掉的

可以拉回,而被删除的则不能。【有点难以理解,您可以这么想:一、「被杀掉

的」尚存尸骨,而「被删除的」则尸骨无存了!可见得对电脑资料来说,「删除」

比「杀掉」严重多了。二、实际上,就算被删除了,我们还是有技术可以把它救

回来,尤其是文字资料,前提是删除后不能进行实体记忆体的格式化动作。但这

对於一般使用者而言是不可能的,因此就不考虑这情形了。】重新插入被杀掉的

文字称为「拉回(yanking)」。一般而言,可以移除掉很多文字的命令会把那

些文字储存起来(它们设定成您可以将文字拉回),而那些只是删除一个字符或

者只是除去空白行或空白的命令,则不会储存这些被删除的文字(因此您不能将

那文字拉回)。



>> 移动光标到一非空白行的开始。然后键入 C-k 杀掉在那一行上的文字。

>> 第二次键入 C-k。您将会看到它杀掉跟在那一行后面的 Newline 字符。



请注意单独的 C-k 会把一行的内容杀掉,而第二个 C-k 则会杀掉那一行本身,

并且使得所有其它的行向上移动。 C-k 以很特别的方式来处理数字参数,它会

杀掉很多行以及它们的内容,这不仅仅是重复而已, C-u 2 C-k 会把两行以及

它们的 Newline 字符杀掉;如果只是键入 C-k 两次并不会这样。



将被杀掉的文字恢复的动作称为「拉回(yanking)」。(把它想像成您把别人

从您身上夺去的东西猛力地拉回来)您可以在您删除文字的地方拉回,也可以在

文字的其它地方拉回。您可以拉回数次同样的文字,以制作它的数份拷贝。



拉回的命令为 C-y。它会在目前光标的位置重新插入最后杀掉的文字。



>> 试试看;键入 C-y 将文字拉回。



如果您连续地做了数次 C-k,所有被杀掉的文字都会被储存在一起,因此做一次

C-y 就会把所有这些行都拉回来。



>> 现在做一下,键入 C-k 数次。



现在要恢复那些杀掉的文字:



>> 键入 C-y。然后把光标往下移动个几行,再一次键入 C-y。您现在知道如何

复制某些文字了。



如果您有一些文字想要拉回来,但是后来您又杀了某些东西,那么该怎么做呢?

C-y 会把最近杀掉的拉回来,但是先前的文字并没有消失,您可以用 M-y 来回

到它。当您已经使用 C-y 把最近杀掉的拉回来之后,再键入 M-y 来把这些拉回

来的文字替换为先前所杀掉的。一次又一次地键入 M-y 会把先前再先前所杀掉

的文字带回来。当您到了您想找的文字时,您不需要做任何事来保存它,只要继

续您的编辑,把这些已拉回的文字留在那里就好。



如果您 M-y 做了很多次,您可能会回到起始点,也就是最近杀掉的。



>> 杀掉一行,到处绕绕,再杀掉另一行。然后用 C-y 将第二次杀掉的那行带回

来。然后再用 M-y,它将会被第一次杀掉的那行取代。再做几次 M-y 看看您

会得到什么。不间断地做,直到第二个杀掉行回来,再做个几次。如果您想

的话,您可以试著给 M-y 正的或是负的参数。





* 取消动作(UNDO)

------------------



如果您对文字做了一些改变,后来觉得它是个错误,您可以 Undo 命令取消这一

个改变,C-x u。



通常 C-x u 会把一个命令所造成的改变取消掉;如果您在一行中重复了许多次

C-x u ,每一个重复都会取消额外的命令。



但是有两个例外:

一、没有改变文字的命令不算(这包括了光标移动的命令还有卷轴命令);

二、自行键入的字符以一群一群 -- 每群最多 20 个 -- 来进行处理。(这是为

了减少您在取消「插入文字动作」所必须键入 C-x u 的次数)



>> 以 C-k 将这一行杀掉,然后键入 C-x u 后它会再次出现。



C-_ 是另一个取消命令;它的作用就和 C-x u 一样,但是在一行中它比较容易

键入许多次。 C-_ 的缺点是在某些键盘中不太清楚如何键入它,这也是为什么我

们同时提供 C-x u 的原因。在某些终端机,您可以按住 CONTROL 再键入 / ,

来键入 C-_ 。



一个数字参数对 C-_ 或 C-x u 来说,是作为重复的次数。





* 文件(FILE)

--------------



为了使您编辑的文字永久保存,您必须把它放到一个文件中。不然,当您退出

Emacs 后,它就会随之消失。为了把您的文字放在文件中,您必须在您键入这些

文字前「找(find)」文件。(这也称之为「拜访(visiting)」文件)



找一个文件表示您可以在 Emacs 中看到文件的内容。从许多方面来看,它就像

是您直接编辑那个文件一样。然而,直到您「储存」这个文件之前,您使用

Emacs 编辑所做出的改变并不会保存下来。这就是为什么当您不想要时,您可以

避免留下修改到一半的文件在系统中。即使当您储存了,Emacs 也会把原本的文

件以一个不同的名称保留下来,若您稍后觉得您的改变是一个错误的话,就可以

使用它。



在靠近屏幕的下方,您可以看到由破折号开始与结束的一行 -- 通常是以「--:--

TUTORIAL.cn」或其它类似的东西作为开始。这是屏幕的一部分,通常用来表示

您正在拜访的文件。现在,您正在拜访的文件叫做「TUTORIAL.cn」,它是您个

人的拷贝。当您以 Emacs 找出一个文件时,那个文件的名字就会出现在那个地

方。



关於寻找文件的命令中,有一个很特别的是,您必须说出这个您想要的文件名称。

我们说这个命令「从终端机中读进了一个参数」。(在这个例子中,这参数就是

文件的名称)当您键入这个命令后,



C-x C-f 找一个文件



Emacs 会要您键入文件名。您所键入的文件名会出现在屏幕的底行。在被用来作

为这种形式的输入时,底行被称为小缓冲区(minibuffer)。您可以使用正常的

Emacs 编辑命令来编辑这个文件名。



当您正在键入文件名时(或是任何的小缓冲区输入时),您可以用 C-g 这个命

令来取消它。



>> 键入 C-x C-f,然后键入 C-g。这会取消小缓冲区,并且也会取消使用这个

小缓冲区的 C-x C-f 命令。因此您没有找任何文件。



当您已经键入了这个文件名,请键入 <Return> 来结束它。然后 C-x C-f 命令

就会开始运作,并且找到您所选择的文件。小缓冲区在当 C-x C-f 命令结束时

就会消失。



过了一会儿,文件的内容就会出现在屏幕,然后您就可以编辑它的内容。当您想

要您的改变永久保存时,键入这个命令:



C-x C-s 储存这个文件



这会把在 Emacs 中的文字复制到文件中。当您第一次做这个动作时,Emacs 会

将原始的文件重新命名成一个新的名字,这样它才不会消失。新的名字通常会加

入「~」到原始文件的名字后面。



当储存结束时,Emacs 会把写入文件的名字列出来。您应该经常地进行储存,这

样子如果系统崩溃时,您就不会损失太多工作。



>> 键入 C-x C-s 以储存本快速指南的您的拷贝。这会把

「Wrote ...TUTORIAL.cn」这个消息显示在屏幕的下方。



注意:在某些系统中,键入 C-x C-s 将会把屏幕冻结,您将看不到从 Emacs 来

的任何输出。这表示操作系统一个称为「流程控制」的「功能」将 C-s 命令拦

截住,并且不让它传到 Emacs。要取消屏幕的冻结,请键入 C-q。然后到 Emacs

使用手册中看看对於「渐进式搜寻的同时进入(Spontaneous Entry to

Incremental Search)」这个主题,以取得处理这个「功能」的建议。



您可以找出一个已经存在的文件,然后观看它或编辑它。您也可以找一个还没有

存在过的文件。这是以 Emacs 建立一个文件的方法:找这个文件,就从零开始,

然后开始插入文字到这个文件中。当您要求「储存」这个文件,Emacs 会真的建

立一个文件,并把您所插入的文字摆到文件中。从那时候开始,您就可以当自己

是在编辑一个已经存在的文件了。





* 缓冲区(BUFFER)

------------------



如果您以 C-x C-f「找」第二个文件,第一个文件仍然存在 Emacs 内。要切换

回它,您可以 C-x C-f 再找它一次。依此方式,您可以在 Emacs 内开启不少文

件。



>> 以键入 C-x C-f foo <Return> 的方式建立一个名为「foo」的文件。然后插

入一些文字,编辑它,然后再以 C-x C-s 储存「foo」。最后,键入 C-x

C-f TUTORIAL.cn <Return> 回到本快速指南。



Emacs 储存每个文件的文字在一个称为「缓冲区(buffer)」的物件中。找一个

文件会在 Emacs 内部建立一个缓冲区。想要看目前存在您的 Emacs 的工作中缓

冲区列表,键入



C-x C-b 列出缓冲区



>> 现在就试一下 C-x C-b



看看每一个缓冲区是如何命名的,它也可能同时拥有一个「储存其内容的文件」

的名称。您在一个 Emacs 窗格所见到的「任何」文字都是某个缓冲区的一部份。



>> 键入 C-x 1 以退出缓冲列表



当您有数个缓冲区时,在任何时候其中只有一个是「目前作用的」。而那个就是

您在编辑的缓冲区。如果您想要编辑另一个缓冲区,那么您必须「切换」到它。

如果您想要切换到连接到某个文件的缓冲区,您可以用 C-x C-f 再次拜访那个

文件。但是有个比较简单的方式:使用 C-x b ;在这个命令中,您必须键入缓

冲区的名称。



>> 键入 C-x b foo <Return> 以回到含有文件「foo」的文字的缓冲区。然后建

入 C-x b TUTORIAL <Return> 以回到本快速指南。



就大部份的情况来说,缓冲区的名称与文件的名称是相同的(除去了文件名中的

目录部份)。然而并不总是如此。您以 C-x C-b 所制作出的缓冲区列表总是会

显示给您每一个缓冲区的名称。



您在一个 Emacs 窗格中所见到的「任何」文字总是某个缓冲区的一部份。有一

些缓冲区并没有连接到文件。举例来说,命名为「*Buffer List*」的缓冲区并

没有任何文件。它是包含有您以 C-x C-b 命令所制作出来的缓冲区列表的缓冲

区。命名为「*Messages*」的缓冲区也没有连接到任何文件;它在您的 Emacs

会话中包含出现在底行的消息。



>> 键入 C-x b *Messages* <Return> 来看看消息的缓冲区。然后键入 C-x b

TUTORIAL <Return> 回到本快速指南。



如果您对文件中的文字做了修改,然后找另一文件,这个动作并不会储存第一个

文件。它的修改仍