配置inputrc

  我们这里需要的是一种叫做菜单式补全(menu-complete)的功能。通常,默认情况下,这个选项是没有被配置的。为了配置这项功能,并为之进行快捷键绑定,我们需要修改inputrc配置文件,这个文件中保存了Readline的一些键绑定和其它诸如编辑模式的配置选项。像许多其它配置文件一样,inputrc有系统级的配置选项/etc/inputrc和用户级的点文件~/.inputrc。建议建立自己的点文件,而不是直接编辑系统级文件,当然如果整个系统只是你一个人在用的话,你也可以在/etc/inputrc上面直接编辑。但使用点文件的另一个好处告诉你,它是属于你自己的,即使在另外一个不同的发行版上,点文件通常也是可以直接使用的。这可以减轻你在不同系统上的不适。
  好了,打开或者建立你的.inputrc,写下,下面两行:

1
2
"\C-j": menu-complete
"\C-k": menu-complete-backward
Tags: ,,.

  对qsort需要注意几点:

  • qsort中第一个参数是待排序数组的开始地址,既然是数组,各元素就是同类型、同大小的对象,且数组是“一维数组”(即地址是连续的);
  • qsort用以区分对象的依据是第二和第三个参数,分别表示对象个数和每个对象的大小(字节);
  • qsort并不知道每个对象的类型和结构,排序准则由用户在第四个参数(比较函数)中指出,qsort按该比较函数准则的“升序”对数组进行排序;
  • 标准C不支持运算符重载,各对象的交换(因为这是qsort)靠的是逐字节的拷贝(memcpy?)。

  在上面的两片代码中,待排序的对象一个是字符型指针,一个是char (*)[10]型数组。然后,就没有然后了。

Tags: ,,.

动态链接库

  动态库和静态库相似,也是各个目标文件的集合。但相比静态链接的程序,动态链接可执行程序要小得多:这类程序运行时需要外部共享 函数库的支持,因此好像并不完整。除了程序体小之外,动态链接允许程序包指定必须的库,而不必将库装入程序包内。动态链接技术还允许多个运行中的程序共享一个库,这样就不会出现同一代码的多份拷贝共占内存的情况了。由于这些原因,当前多数程序采用动态链接技术。
  在Linux中的扩展名通常为.so。但在链接时,并不会被链接到可执行文件中,而是在执行时(需要时)由操作系统的动态加载模块动态地加载到内存,并链接到可执行文件地址空间的相应位置。
  动态链接库的创建也分为编译和”归档”两个阶段,但不同的是在这两个阶段需要使用一些不同的命令选项。首先,需要将源文件编译成一种成为位置无关码(PIC: Position Independent Code)的目标文件,这种代码可以被加入到内存的任何位置却不需要加载器对其进行重定位,关于这种格式可以参考《链接器与加载器》和《程序员的自我修养–链接装载与库》中较为详尽的描述。接下来需要将这些位置无关码“归档”为.so文件。整个过程只需一个工具即可,即gcc。还是上面的源文件,执行以下命令:

1
2
$ cc -c -fpic plus.c sub.c
$ cc -shared -o libmath.so *.o
Tags: ,.

  find命令可以按照指定的规则对硬盘上的文件进行查找,且可以跨越不同的文件系统。find命令的使用方法:

1
find fold [option]

  下面按照不同的选项介绍find命令。

find -name

  -name是最常用的选项,它指定了需要查找的文件名的模式,模式中可以使用通配符和简单的正则表达式。下面的命令查找Wdir目录下的.cpp文件:

1
2
3
4
5
6
7
8
9
10
11
dutor@dutor-desktop:~$ find Wdir -name "*.cpp"
Wdir/Cpp/Pthread/main.cpp
Wdir/Cpp/STL/sort_list.cpp
Wdir/Cpp/STL/Heap.cpp
Wdir/Cpp/STL/operator.cpp
Wdir/Cpp/STL/bind2nd/main.cpp
Wdir/Cpp/STL/Kth-Max.cpp
Wdir/Cpp/STL/priority_queue.cpp
Wdir/Cpp/ACM/Huffman/main.cpp
Wdir/Cpp/ACM/Bellman-Ford/main.cpp
......

  需要注意的是,如果搜索目录以相对路径形式指定,则搜索结果也以相对路径形式给出;否则,搜索结果以绝对路径形式给出。

Tags: ,.

  我的台式机,以前用的键盘一直是PS/2接口的,前些天换了个USB口的。一直没发现问题,知道昨天想进Windows办点私事儿,才发觉在Grub里面,无法用键盘选择操作系统,只能进入默认的Linux。
  起初怀疑是操作系统的驱动问题,但马上就排除了,因为Grub引导阶段,OS还没有降生呢!
  接下来就是Grub了,但大名鼎鼎的Grub怎会不支持USB键盘呢。
  最后需要考虑的就是BIOS了,键盘鼠标之类的简单硬件都由它来控制。进入BIOS,果然后USB Keyboard的使能选项,选择Enable,重启,问题解决了。
  记住,还有个BIOS。

Tags: .

  Linux/Unix中有两种链接,硬链接和软链接,均由ln命令来创建。

软链接

  软链接使用ln命令的-s选项创建:

1
ln -s source target #创建source文件的软链接target

  软链接类似于Windows中的快捷方式,内部保存的是源文件的路径,路径可以是相对路径,也可以是绝对路径:

1
2
3
4
5
6
dutor@dutor-desktop:~$ ln -s gvim.tgz gvim
dutor@dutor-desktop:~$ ln -s /home/dutor/gvim.tgz gvim2
dutor@dutor-desktop:~$ ll gvim* # alias ll='ls -l'
lrwxrwxrwx 1 dutor dutor    8 2010-07-01 20:32 gvim -> gvim.tgz
lrwxrwxrwx 1 dutor dutor   20 2010-07-01 20:33 gvim2 -> /home/dutor/gvim.tgz
-rw-r--r-- 1 dutor dutor 8.5M 2010-06-29 23:06 gvim.tgz

  软链接应用十分广泛。

Tags: ,.

  代码中编辑一些配对符号内的内容是十分普遍的,这些配对符号包括:”, “”, (), {}, [], <>等等。Vim提供了一些命令来方便的编辑这些符号所包含的内容,将光标定位于某符号(如(或者)):

  • ci: 例如,ci(,或者ci),将会修改()之间的文本;
  • di: 剪切配对符号之间文本;
  • yi: 复制;
  • ca: 同ci,但修改内容包括配对符号本身;
  • da: 同di,但剪切内容包括配对符号本身;
  • ya: 同yi,但复制内容包括配对符号本身。
Tags: .

  ls == list,根据不同的选项,列举指定目录或文件的相关信息,是Unix/Linux下最常用的命令之一,cd到某一目录下后执行的第一个命令。

ls

  不带参数的ls列举当前目录下有哪些文件和目录,ls Folder列举Folder目录中的文件和子目录,ls File显示File文件的信息(默认为文件名)。

1
2
3
4
5
6
7
8
9
dutor@dutor-desktop:~$ cd Wdir/
/home/dutor/Wdir
dutor@dutor-desktop:~/Wdir$ ls
APUE  ASM  Cpp  LaTeX  PHP  Python  QT  Shell
dutor@dutor-desktop:~/Wdir$ ls Cpp/
ACM     main    main.cpp  Makefile    Pthread  symtab         tags    test.s
Curses  main.c  main.s    Playaround  STL      SystemProgram  test.c  TutManual
dutor@dutor-desktop:~/Wdir$ ls Cpp/Makefile
Cpp/Makefile
Tags: .

  上一篇[命令技巧]mkcd中,mkcd函数里面使用到了mkdir的-p选项。mkdir的-p选项允许你一次性创建多层次的目录,而不是一次只创建单独的目录。例如,我们要在当前目录创建目录Projects/a/src,使用命令

1
mkdir -p Project/a/src

而不是

1
2
3
4
5
mkdir Project
cd Project
mkdir a
cd a
mkdir src
Tags: .

  我的.vimrc,贴出来给大家瞧瞧。有一些不太优雅的,或者个人色彩太强的,或者晦涩的,或者基于特定插件的部分已经被滤掉了。需要注意的是,对于gVim(Windows或者Linux/Unix),我把菜单栏和工具栏都隐藏了,不习惯的话把相关行注释即可。
  下面是一些键映射,仅供参考。

" escape for <ESC>
imap jj <esc>
" ' for `
map ' `
" save the file
" map <leader>w :w<cr>
map ,w :w<cr>
" quit
map ,q :q<cr>
" save and quit
map ,z ZZ
" yank from current line to the EOF
map ,yy "+yG
" paste from clipboard
map ,p "+p
" do substitution globally
map ,s :%s/
" do substitution in current line
map zs :s/
" roll up half screen
"map <tab> <C-u>
" roll down half screen
"map <space> <C-d>
" open the Calendar
map <F4> :Calendar<cr>
" open the NERDTree
map <F10> :NERDTree<cr>
" insert a \n
map ,<cr> i<cr><esc>
" Edit .vimrc
map ,,, :tabnew $HOME/.vimrc<cr>
Tags: .