bash相关文件与变量

bash也有点儿太那啥了。。。很多东西不太直觉。

/etc下那些全局文件我就不说了,一般不需要碰。只说用户目录下的。

注意.bash_profile和.bashrc的区别: 

.bash_profile/.bash_login/.profile(按顺序,只执行找到的第一个)仅在login或者指定--login参数时被执行。

.bashrc则仅在invoking subshell时执行。比如直接敲bash时就会执行这个。

但其实很多人不需要根据这两种情况执行不同的命令,所以.profile里经常看到执行.bashrc。

我们平时老说环境变量环境变量的,其实在bash中,环境变量是变量的一种而已。普通的变量用简单的varname=value即可设置(不要加空格!)。export的变量,就是环境变量了,说到底,其与普通变量的不同只是subprocess可以得到环境变量罢了。

unset可以用来清除变量(包括环境变量)。其中还有一些细节就不说了。但是有个东西很邪恶,就是unset名字相对的set,并不是用来设置变量的!!!

set是用来设置options的,就和shopt类似。老潘最最最最爱用的,当然是set -o vi啦。这里还有个陷阱,就是设置option时,减号是“设置”,加号是“取消”。比如set +o vi就是取消vi editing mode进入默认的emacs editing mode。这种弱智设计,是因为-是通用的前缀,当初设计的时候没考虑“取消”这个操作,直接把“设置”用了-,后来想换已经来不及了。。。真弱啊 

 

vi mode in bash

I love vi mode so much that I have to enter vi mode immediately once bash is started.

Add .inputrc to ~ with this line:

set editing-mode vi

(Need support from Readline lib.)

...or

set -o vi

(Utilize the ability of Bash itself.) 

定制Vim

本文仅限Windows平台。无非就是一些个人的使用偏好,以及管理plugin的习惯。

1. 修改_vimrc,添加:

set number
set hlsearch
set enc=utf-8
set laststatus=2
set tabstop=4 shiftwidth=4 smarttab expandtab softtabstop=4 autoindent
set noswapfile

" for plugins: winmanager, taglist
let g:winManagerWindowLayout='FileExplorer|TagList'
nmap <F4> :WMToggle<CR>

" for plugin: mru
let MRU_Max_Entries = 20
let MRU_Add_Menu = 1

nmap <F2> :tabe<SPACE>
nmap <F3> :tabe<SPACE>^R%
nmap <C-Tab> :tabnext<CR>
nmap <C-S-Tab> :tabprev<CR>
nmap <F5> @Q
nmap <F6> @W
nmap <F7> @E
nmap <F8> @R
nmap <F9> @U
nmap <F10> @I
nmap <F11> @O
nmap <F12> @P

language en
source $VIMRUNTIME/delmenu.vim  
source $VIMRUNTIME/menu.vim  

highlight Normal guibg=lightyellow

(要输入^R,在insert模式下,如果是windows就^Q^R, Linux^V^R)

source那两行是在中文Windows下防止菜单乱码的。好像有个办法能防止工具栏提示乱码,懒得查了。

另外Vim对文件的编码还是需要研究一下的。

2. :source上面的_vimrc。下载最新的getscript插件:http://www.vim.org/scripts/script.php?script_id=642,Vimball安装之(用Vim打开getscript.vba,执行:so %)。其实本插件是标准插件,已经内置。这里只是搞个最新的。这个插件需要wget。

3. 重启Vim。编辑$VIM/vimfiles/GetLatest/GetLatestVimScripts.dist,同目录下另存为GetLatestVimScripts.dat,添加更多插件,然后:GLVS。这是我这儿更新后的:

ScriptID SourceID Filename
--------------------------
#294  1 Align.vim
#302  2 AnsiEsc.vim
#122  3 astronaut.vim
#104  4 blockhl.vim
#120  5 decho.vim
# 40  6 DrawIt.tar.gz
#451  7 EasyAccents.vim
#195  8 engspchk.vim
642 8136 GetLatestVimScripts.vim
#489 10 Manpageview.vim
#551 11 Mines.vim
#514 12 mrswin.vim
#670 13 visincr.vim
#628 14 SeeTab.vim
#508 15 ZoomWin.vim
#877 16 gvcolor.vim
1502 8743 vimball.tar.gz
42 9524 bufexplorer.vim
273 7701 taglist.vim
95 754 winmanager.vim
521 9274 mru.vim
2174 8373 repmo.vim

642 8136 :AutoInstall: getscript.vim
1502 8743 :AutoInstall: vimball.vim

注意ScriptID一定要像我这样写,SourceID则要写1。

其中taglist插件需要ctags。

我正在研究其他的一些插件,尤其是Python的。ptags.py很值得关注啊。不过现在的ctags已经支持n多种语言了。

4. 将down下来但没自动安装的插件(在$VIM/vimfiles/GetLatest下)安装到$VIM/vimfiles下。然后Vim里:helptags $VIM/vimfiles/doc来安装帮助文档。

Vi与Lisp: 从小工到专家,告诉你Vi到底好在哪里

用Vi也有段历史了吧,总是记不住那些命令。但最近在客户这边不知道是怎么了,Vi熟练度暴涨,现在整天玩macro不亦乐乎。大概缘由还是找了个比较全的reference card,双面儿打印好,就放跟前儿,想干什么一定忍住别换别的编辑器,逼着自己用Vi。几个回合下来,我现在在Eclipse里都直按hjkl。。。

说笑。但是现在真是离不开Vi了。在北京的时候分析日志文件就很头痛。有的时候我们过于放任服务器上的应用,结果端下来的日志有几百兆。。。很多编辑器看见这个就趴下了。。。UE倒是还行但毕竟是盗版,不爽。而且我上学的时候就用出过UE的bug,从此基本敬而远之。Eclipse的编辑器也不错,但是要把文件搞到workspace里又嫌麻烦,即使是通过链接的方式。再说Eclipse还是太重了点。剩下能开大文件的也就是基于Scintilla的Scite和Notepad++了。Notepad++的搞笑默认字体我不太能忍。Scite倒是不错但功能又过于简单了。。。

好吧,我知道我事儿多。这不还有Vi呢么。原来不理解为什么,到底为什么要用hjkl这种诡异的方式来移动光标。其实Vi的哲学是把指令用一个字符序列来表示,并且指令可以互相组合。哎?你有没有觉得这个像什么?

我觉得像Lisp:

1. 指令(代码)即字符(数据),字符(数据)即指令(代码)。

2. 至于互相组合的指令,就像高阶函数那样,是一种过程抽象。

这样的好处是什么呢?第一点简单来说,就是由于指令本身也是数据,因此可以被编辑也便于记录;另外由于数据可以被映射为指令,你可以使用创建和操纵数据的方式去创建和操纵指令。第二点稍微高深一些,就是Vi指令体现了一种抽象的思想,其功能是作用在某个抽象层次上。 

有点元编程的味道吧?我先解释第二点。想想看,在Notepad++里,假设你要对一些文件做一组相同的操作,比如你要去掉一些log文件的头部,这个操作要删掉每个文件的前39行,那你就要开始录制macro,用鼠标划上39行,或者用shift+end再加down arrow39行,然后点delete。往好了说,你有个删除当前行的快捷键ctrl+d(Eclipse里就是),那你也得按39次!

Vi呢?四个字符:39dd。什么叫抽象?这就叫抽象!原来我有一朋友讲过一事儿,她回学校看老师,到办公室看见n个老师,挨个叫:黄老师好,张老师好,王老师好。。。然后教数学的老师发话了:教你那点儿数学都忘光了吧?合并同类项:老师们好!

其实就是这么回事儿。Vi之所以神奇就因为它有个normal mode。这种模式下你按键盘输入的不是字符,而是指令。如果说删39行还体现不出差别,那么删1000行呢??用过普通编辑器的人可以想想,要删1000行怎么办:你不得不用鼠标拉滚动条,看看1000到了没有,还要小心不要划多了或者划少了。Vi的指令是可以互相组合的,像39就好像是一个高阶函数一样:39dd是删39行,39iILOVEYOU<Esc>是写39遍我爱你。。。关键是它把39这个特征抽象出来了!

接下来解释第一点。所有这些指令,包括组合指令,都可以表示为字符序列。你可以把这些指令存起来,比如存在Vi的register里,然后想用的时候拿出来用。你还可以根据需要随意修改它们。想想看在Notepad++里你一样可以录macro,但你能修改这个macro么?我相信Notepad++一定有某种内部方式,某种数据结构记录macro,可能很简单也可能很复杂,但whatever你是看不到的你也改不了。这样假设你费了挺大劲录了个删39行的macro,发现下一拨要处理的log文件都要删40行,你咋办?

Vi就方便了。你可以找到存macro的那个register - 你会发现它只存了一个字符序列 - 39dd。然后你把它改成40dd,就行了。

我举的例子简单。如果这个操作除了删几行之外再包括很多其他操作,Vi的优势会更大。用Vi的高手老是说Vi有“禅”(Zen)在里面,呵呵。我不想说那么玄,说白一点,和Lisp一样,Vi就是以极大的灵活性,应对变化。程序,软件,项目,莫不过如此。

分页共1页 1