Linux Dev   

1. 配置VIM

首先,安装vim,一般情况下在安装redhat时,默认就安装了vim。你可以用vim -v来查看你的系统是否安装了vim。如果显示了vim版本就表示已经安装了vim,否则你可以通过“从这里开始”–>“系统设置”–>“添加/删除应用程序”,然后选中“编辑器”来更新你的软件。

安装之后就要通过配置.vimrc配置符合自己风格的vim了。接下来就要找到.vimrc,如果你上网查找一些相关的资料时,他们会告诉你:在用户主目录——/home/root/下有一个.vimrc文件,在/etc/目录下也有一个vimrc。

但是,也许你找了很久都没有找到这两个文件,这很正常,因为在刚安装上vim时,在以上两个目录中确实没有这两个文件,换句话说,这两个文件是认为加上去的。要找到你的vimrc,首先用vim打开一个文件,然后在vim中输入指令”:version” ,你会看到”系统vimrc配置文件:”/usr/share/vim/vim74”“,然后将这个文件拷贝到你的主目录下,cp /usr/share/vim/vim74/vimrc_examples /root/ ,将vimrc改名为隐藏文件,mv vimrc .vimrc。接下来打开.vimrc,在里面添加几个条目:

vimrc 统一配置,待试:http://vim.spf13.com/#vimrc

1.1 开发环境配置

vimrc

如果设置 /etc/vimrc 是影响所有用户,如果设置 /root/.vimrc 是影响 root 用户。

如果设置完后,发现功能没有起作用,检查一下系统下是否安装了vim-enhanced包,查询命令为: $rpm –q vim-enhanced

问题一:经常很多代码不对齐,一行行对齐比较麻烦
解决:在命令行模式,按“n==”,注意 n 指的是 行号。

问题二:在vim下粘贴了一大段python代码,但是从某一行开始全部都多后退了一个tab

在vim里,粘贴代码之前最好进入粘贴模式,这样就会关闭自动缩进
set paste
将代码粘贴进去之后再关闭粘贴模式
set nopaste

问题三:如何缩进

缩进单行代码是两个大于号'>>'
回缩就是两个小于号'<<'

:10,100>
第10行至第100行缩进
:20,80<
第20行至第80行反缩进

1 //在这里按下'v'进入选择模式
1
1//光标移动到这里,再按一次大于号'>'缩进一次,按'6>'缩进六次,按'<'回缩。以下同理
function helo{//将光标移动到'{',在按下'%',光标将会移动到匹配的括号

//这里省略1000行

}//光标会移动到这里,再按一次大于号'>'就可以缩进

问题四:跳转到某行

:n         : 跳转到指定行
gg         : 跳转到文件头
Shift+g    : 跳转到文件末尾

1.2 VIM使用

1.2.1 简单替换表达式

:[range]s/from/to/[flags]

range:搜索范围,如果没有指定范围,则作用于但前行。

:1,10s/from/to/ 表示在第1到第10行(包含第1,第10行)之间搜索替换; :10s/from/to/ 表示只在第10行搜索替换; :%s/from/to/ 表示在所有行中搜索替换; 1,$s/from/to/ 同上。

flags 有如下四个选项:

这些选项可以合并使用,如cgi表示不区分大小写,整行替换,替换前询问。

1.2.2 正则表达式

元字符	说明
.	匹配任意字符
[abc]	匹配方括号中的任意一个字符,可用-表示字符范围。如[a-z0-9]匹配小写字母和数字
[^abc]	匹配除方括号中字符之外的任意字符
\d	匹配阿拉伯数字,等同于[0-9]
\D	匹配阿拉伯数字之外的任意字符,等同于[^0-9]
\x	匹配十六进制数字,等同于[0-9A-Fa-f]
\X	匹配十六进制数字之外的任意字符,等同于[^0-9A-Fa-f]
\l	匹配[a-z]
\L	匹配[^a-z]
\u	匹配[A-Z]
\U	匹配[^A-Z]
\w	匹配单词字母,等同于[0-9A-Za-z_]
\W	匹配单词字母之外的任意字符,等同于[^0-9A-Za-z_]
\t	匹配<TAB>字符
\s	匹配空白字符,等同于[\t]
\S	匹配非空白字符,等同于[^\t]

1.2.3 替换变量

在正则式中以(和)括起来的正则表达式,在后面使用的时候可以用\1、\2等变量来访问(和)中的内容。

例子

2. 配置ctags

2.1 安装

首先到http://ctags.sourceforge.net/下载ctags-5.8.tar.gz ,注意:有些浏览器(例如IE8)会阻止文件下载,这时只需要解除阻止即可进入下载界面。然后安装ctags.

ctags-5.8.tar.gz

#tar xzvf ctags-5.8.tar.gz
#cd ctags-5.8
#./configure
#make
#make install

注意:如果你在执行./configure时出现错误,那么很有可能就是你的gcc没有安装完全,解决方法——“从这里开始”–>“系统设置”–>“添加/删除应用程序”,然后选择“开发工具”,更新你的gcc编译器。安装完成后就可以使用ctags命令了。

2.2 建立 tags

# ctags -R * 或 # ctag -R // 在需要参加 tag 的目录里面执行。

“-R”表示递归创建,也就包括源代码根目录下的所有子目录下的源程序。”tags”文件中包括这些对象的列表:
l 用#define定义的宏
l 枚举型变量的值
l 函数的定义、原型和声明
l 名字空间(namespace)
l 类型定义(typedefs)
l 变量(包括定义和声明)
l 类(class)、结构(struct)、枚举类型(enum)和联合(union)
l 类、结构和联合中成员变量或函数

注意:运行vim的时候,必须在”tags”文件所在的目录下运行。否则,运行vim的时候还要用”:set tags=”命令设定”tags”文件的路径,这样vim才能找到”tags”文件。

2.3 使用 ctags

VIM用这个”tags”文件来定位上面这些做了标记的对象,下面介绍一下定位这些对象的方法:

1) 用命令行。在运行vim的时候加上”-t”参数,例如:

# vim -t foo_bar
这个命令将打开定义"foo_bar"(变量或函数或其它)的文件,并把光标定位到这一行。

2)在vim编辑器内用”:ta”命令,例如:

":tag  foo_bar"          跳转到某个标签
":tselect /^foo			 查找某个标签,并选择调整,可以用 <Tab> 补齐

3) 标签跳转

3. taglist

3.1 安装 taglist

taglist_45.zip 首先下载 taglist_45.zip,下载地址http://www.vim.org/scripts/script.php?script_id=273 解压文件:unzip -d taglist taglist_45.zip -d 表示要把文件解压到某个目录下。 解压得到两个文件。./taglist/doc/taglist.txt; ./taglist/plugin/taglist.vim 分别复制到各自的目录下:

cp ./taglist/doc/taglist.txt /usr/share/vim/vim74/doc/
cp ./taglist/plugin/taglist.vim /usr/share/vim/vim74/plugin/

3.2 配置 taglist

配置 ~/.vimrc文件。

filetype plugin on 
let Tlist_Ctags_Cmd = '/usr/bin/ctags' "设置ctags命令目录
let Tlist_Show_One_File = 1 "不同时显示多个文件的tag,只显示当前文件的 
let Tlist_Exit_OnlyWindow =  1 "如果taglist窗口是最后一个窗口,则退出vim 
let Tlist_Use_Left_Window = 1 "让taglist窗口在右侧显示
let Tlist_Auto_Open = 1 		"自动打开 taglist

3.3 命令与用法:

在vim中命令模式下使用:
:Tlist // 打开或者关闭当前文件的索引;
:TlistSync // 立即在打开的索引窗口中定位当前的光标所在位置属于哪个函数或者结构定义中。

左右窗口切换:Ctrl +ww

在Taglist窗口按
F1:打开帮助
回车键: 跳到光标所在的标记的定义处(如将光标移到main函数,按回车键)
o: 新建一个窗口,跳到标记定义处
p: 预览标记定义(仍然在taglist窗口)
空格:显示标记的原型(如函数原型)
u:更新标记列表(比如源文件新增了一个函数,并在保存后,可在taglist窗口按u)
s:选择排序字段
d:删除光标所在的taglist文件(如用vi打开了两个文件f1.c,f2.c可以删除f1.c的标记)
x:放大/缩小taglist窗口
+:展开(指标记)
-:折叠
*:全部展开
=:全部折叠
[[:将光标移到前一个文件的起点
]]:将光标移到后一个文件的起点
q:退出taglist窗口
F1:关闭帮助

4. cscope

4.1 安装

4.1.1 包安装

yum install cscope.x86_64

4.1.2 源码安装:

这个源里应该有了,如果没有请到其官网 http://sourceforge.net/projects/cscope/files/

cscope-15.8b.tar.gz

#tar xzvf cscope-15.8b.tar.gz
#cd cscope-15.8b
#./configure
#make
#make install

4.2 配置

将以下内容添加到~/.vimrc中,vim会自动加载当前目录下的符号索引cscope.out,可以使用ctrl+t、ctrl+]等

" cscope setting

if has("cscope")
   set csprg=/usr/bin/cscope              "指定用来执行 cscope 的命令
   set csto=1                             "先搜索tags标签文件,再搜索cscope数据库
   set cst                                "使用|:cstag|(:cs find g),而不是缺省的:tag
   set nocsverb                           "不显示添加数据库是否成功
   " add any database in current directory
   if filereadable("cscope.out")
      cs add cscope.out                   "添加cscope数据库
   endif
   set csverb                             "显示添加成功与否
endif

nmap <C-@>s :cs find s <C-R>=expand("<cword>")<CR><CR>
nmap <C-@>g :cs find g <C-R>=expand("<cword>")<CR><CR>
nmap <C-@>c :cs find c <C-R>=expand("<cword>")<CR><CR>
nmap <C-@>t :cs find t <C-R>=expand("<cword>")<CR><CR>
nmap <C-@>e :cs find e <C-R>=expand("<cword>")<CR><CR>
nmap <C-@>f :cs find f <C-R>=expand("<cfile>")<CR><CR>
nmap <C-@>i :cs find i ^<C-R>=expand("<cfile>")<CR>$<CR>
nmap <C-@>d :cs find d <C-R>=expand("<cword>")<CR><CR>

添加cscope符号索引数据库后,可以调用”cscope find”命令进行查找,vim支持8种cscope的查询功能。如在代码中查找调用work()函数的函数,可以在vim命令状态下输入”:cs find c work”,回车即可。还可以进行字符串查找,它会对双引号或单引号括起来的内容查找。还可以输入一个正则表达式,这类似于egrep程序的功能。

:cs help (vim command下查询)

C-@ + 
s: 查找C语言符号,即查找函数名、宏、枚举值等出现的地方
g: 查找函数、宏、枚举等定义的位置,类似ctags所提供的功能
d: 查找本函数调用的函数
c: 查找调用本函数的函数
t: 查找指定的字符串
e: 查找egrep模式,相当于egrep功能,但查找速度快多了
f: 查找并打开文件,类似vim的find功能
i: 查找包含本文件的文件

4.2 使用

使用下面的命令生成代码的符号索引文件:
$ 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的索引速度
-i: 如果保存文件列表的文件名不是cscope.files时,需要加此选项告诉cscope到哪儿去找源文件列表。可以使用"-",表示由标准输入获得文件列表。
-I dir: 在-I选项指出的目录中查找头文件
-u: 扫描所有文件,重新生成交叉索引文件
-C: 在搜索时忽略大小写
-P path: 在以相对路径表示的文件前加上的path,这样,你不用切换到你数据库文件所在的目录也可以使用它了。

在缺省情况下,cscope在生成数据库后就会进入它自己的查询界面,一般不用这个界面,所以使用了”-b”选项。如果已经进入了这个界面,按CTRL-D退出。

接下来可以在vim里浏览代码了
$ vim main.c
在vim里命令状态下添加符号索引库
: cscope add cscope.out
然后可以查看相应的函数定义或文件,ctrl+t返回。
: cscope find g print
: cscope find f cstest.h

5. tmux

tmux是一个优秀的终端复用软件,即使非正常掉线,也能保证当前的任务运行,这一点对于 远程SSH访问特别有用,网络不好的情况下仍然能保证工作现场不丢失!此外,tmux完全使用键盘 控制窗口,实现窗口的切换功能。 简单地说,tmux对于我主要有两个功能(这应该也是tmux的主要功能): split窗口。可以在一个terminal下打开多个终端,也可以对当前屏幕进行各种split,即可以 同时打开多个显示范围更小的终端。 在使用SSH的环境下,避免网络不稳定,导致工作现场的丢失。想象以下场景, 你在执行一条命令的过程中,由于网络不稳定,SSH连接断开了。这个时候,你就不知道之前 的那条命令是否执行成功。如果此时你打开了很多文件,进入了较深层次的目录,由于网络 不稳定,SSH连接断开。重新连接以后,你又不得不重新打开那些文件,进入那个深层次的 目录。如果使用了tmux,重新连接以后,就可以直接回到原来的工作环境,不但提高了工作 效率,还降低了风险,增加了安全性。

5.1 安装

sudo apt-get install tmux 安装完成后输入命令tmux即可打开软件,界面十分简单,类似一个下方带有状态栏的终端控制台; 不出意外,这时候你会跟我第一次一样,觉得tmux没什么牛逼的。根据tmux的定义,在开启了tmux服务器后,会首先创建一个会话,而这个会话则会首先创建一个 窗口,其中仅包含一个面板;也就是说,这里看到的所谓终端控制台应该称作tmux的一个面板, 虽然其使用方法与终端控制台完全相同。 tmux使用C/S模型构建,主要包括以下单元模块:

5.2常用按键

按住Ctrl+b 然后按箭头可以调整窗口大小

这里需要说明一点的是,tmux的任何指令,都包含一个前缀,也就是说,你按了前缀(一组按键, 默认是Ctrl+b)以后,系统才知道你接下来的指令是发送给tmux的。

5.3 配置

我们先来看一下几个配置。tmux的配置文件是 ~/.tmux.conf,这个文件可能不存在,你可以自己新建。下面开始配置,首先,有没有 觉得tmux的前缀按起来太不方便了,ctrl与b键隔得太远,很多人把它映射成C+a,也就 是在配置文件(~/.tmux.conf)中加入下面这条语句:

#设置前缀为Ctrl + a
set -g prefix C-a
与此同时,取消默认的前缀按键:
#解除Ctrl+b 与前缀的对应关系
unbind C-b

配置完以后,重启tmux起效,或者先按C+b,然后输入:,进入命令行模式, 在命令行模式下输入: source-file ~/.tmux.conf 你也可以跟我一样,在配置文件中加入下面这句话,以后改了只需要按前缀+r了。

#将r 设置为加载配置文件,并显示"reloaded!"信息
bind r source-file ~/.tmux.conf \; display "Reloaded!"

关于前缀,很多人都喜欢改成Ctrl+a,不过我个人更喜欢Ctrl+x,如果你是vim用户,你一定懂 的。还有就是面板的切换很不方便,需要先按前缀,再按方向键,还记得vim里面怎么切换各个 面板的吗?tmux也可以,因为它支持映射。把前缀映射改成Ctrl+x,再加入如下几条语句, 现在切换窗口就和vim一摸一样了,顿时觉得亲切了很多。

#up
bind-key k select-pane -U
#down
bind-key j select-pane -D
#left
bind-key h select-pane -L
#right
bind-key l select-pane -R

上面的最后一条语句会更改C-x l的功能,我挺喜欢这个功能的,因为我们很时候都是在两个窗 口或这两个面板中切换,所以我又加入如下语句

#select last window
bind-key C-l select-window -l

现在我的l键可不能随便按了,Ctrl+x l是切换面板,Ctrl+x Ctrl+l切换窗口,Ctrl+l清屏。 复制模式copy-mode 前缀 [ 进入复制模式 按 space 开始复制,移动光标选择复制区域 按 Enter 复制并退出copy-mode。 将光标移动到指定位置,按 PREIFX ] 粘贴 如果把tmux比作vim的话,那么我们大部分时间都是处于编辑模式,我们复制的时候可不可以像 vim一样移动呢?只需要在配置文件(~/.tmux.conf)中加入如下行即可。

#copy-mode 将快捷键设置为vi 模式
setw -g mode-keys vi

5.4 会话

Seesion 可以有效地分离工作环境。我有一个“工作” session 和一个“娱乐” session;在“工作”中,我打开所有日常开发需要的内容,而在“娱乐”中,我只打开当前开源的 gem 或者在家 hack 的一些东西。

终端运行 tmux attach 返回会话

tmux new -s session_name
创建一个叫做 session_name 的 tmux session

tmux attach -t session_name
重新开启叫做 session_name 的 tmux session

tmux switch -t session_name
转换到叫做 session_name 的 tmux session

tmux list-sessions
列出现有的所有 session

tmux kill-sessions -t session_name

tmux detach (prefix + d)
离开当前开启的 session

5.5 窗口

Tmux 有一个含有标签的界面,但是它命名这些标签为 “Windows”。为了保持有序,我重新命名了所有我使用的 windows;如果我正在编写一个 gem,我会使用这个 gem 的名字来命名 window。客户端的应用程序也一样。这样,我就能通过名字而不是运行的程序找到相应的 window。

tmux new-window (perfix + c)
创建一个新的 window

tmux select-window -t :0-9 (perfix + 0-9)
根据索引转到该 window

tmux rename-window (perfix + ,)
重命名当前 window

5.6 Panes

Panes 让我的开发时间从平淡变为棒极了,任何我想做的事情,我可以在一个终端中完成。

tmux split-window (perfix + “)
将 window 垂直划分为两个 pane

tmux split-window -h (perfix + %)
将 window 水平划分为两个 pane

tmux swap-pane -[UDLR] (perfix + { or })
在指定的方向交换 pane

tmux select-pane -[UDLR]
在指定的方向选择下一个 pane

tmux select-pane -t :.+
选择按数字顺序的下一个 pane

5.7 快速启动tmux

如果觉得每次都要打开tmux,然后在打开几个窗口和面板很麻烦,那么下面这个脚本你一定会 喜欢。参考这里 #!/bin/sh #

cmd=$(which tmux) # tmux path
session=codefun   # session name

if [ -z $cmd ]; then
  echo "You need to install tmux."
  exit 1
fi

$cmd has -t $session

if [ $? != 0 ]; then
  $cmd new -d -n vim -s $session "vim"
  $cmd splitw -v -p 20 -t $session "pry"
  $cmd neww -n mutt -t $session "mutt"
  $cmd neww -n irssi -t $session "irssi"
  $cmd neww -n cmus -t $session "cmus"
  $cmd neww -n zsh -t $session "zsh"
  $cmd splitw -h -p 50 -t $session "zsh"
  $cmd selectw -t $session:5
fi

$cmd att -t $session

exit 0

6. Python Dev

6.1 Spyder

Spyder 相对来说比较小众,但称得上一个强大的交互式 Python 语言开发环境,同样提供高级的代码编辑、交互测试、调试等特性,通常各个 Linux发行版都会内置有它的安装包。

6.2 vim + 各种插件

turning-vim-into-a-modern-python-ide.pdf

7. 附录

7.1 中文编码

vim编码方面的基础知识:

1. 存在3个变量

encoding—-该选项使用于缓冲的文本(你正在编辑的文件),寄存器,Vim 脚本文件等等。你可以把 ‘encoding’ 选项当作是对 Vim 内部运行机制的设定。 fileencoding—-该选项是vim写入文件时采用的编码类型。 termencoding—-该选项代表输出到客户终端(Term)采用的编码类型。

2.此3个变量的默认值

encoding—-与系统当前locale相同,所以编辑文件的时候要考虑当前locale,否则要设置的东西就比较多了。 fileencoding—-vim打开文件时自动辨认其编码,fileencoding就为辨认的值。为空则保存文件时采用encoding的编码,如果没有修改encoding,那值就是系统当前locale了。 termencoding—-默认空值,也就是输出到终端不进行编码转换。 由此可见,编辑不同编码文件需要注意的地方不仅仅是这3个变量,还有系统当前locale和、文件本身编码以及自动编码识别、客户运行vim的终端所使用的编码类型3个关键点,这3个关键点影响着3个变量的设定。 如果有人问:为什么我用vim打开中文文档的时候出现乱码? 答案是不确定的,原因上面已经讲了,不搞清楚这3个关键点和这3个变量的设定值,出现乱码是正常的,倒是不出现乱码那反倒是凑巧的。

再来看一下常见情况下这三个关键点的值以及在这种情况下这3个变量的值:

最后来看看处理中文文档最典型的几种情况和设置方式:

备注
最后看到ubuntu中文站上一个完美解决的方法:在.vimrc加两句设置 “设定文件编码类型,彻底解决中文编码问题 let &termencoding=&encoding set fileencodings=utf-8,gbk,ucs-bom,cp936 加上发现没有作用,那就是vim的哪个包没有安装,试试把包安完全一些。

7.2 参考资料