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: .

  介绍一个新命令,保准你从未听说过,但它实现的操作你应该一直都在使用,这个命令就是mkcd。其实它不是一个命令,而是一个shell函数:

1
2
3
4
5
6
7
8
9
10
11
# mkcd: mkdir, then cd
mkcd()
{
    if [ $# = "1" ]
    then
        mkdir -p "$1"
        cd "$1"
    else
        echo "Usage: mkcd folder"
    fi
}

  很简单,相信你一看就知道它能做什么了。

Tags: ,.

  Esc是Vim爱好者使用非常频繁的一个按键。但,你不觉得它离你的左手有点远吗?我已经有很长时间没有使用这个键了,取而代之的是组合键Ctrl + [。但,Ctrl + [ 是不是有些麻烦呢?CapsLock,你常用到吗?我几乎不用。相反,CapsLock键就待在Tab键下面,一不留神就会按下,这在Vim下经常会导致一些莫名奇怪的现象。那我们就把它挪走吧!怎么挪?把它和Esc交换啊,但这里不是硬件的交换,你不用把Esc和CapsLock键抠下来交换,而只需要让OS把这两个键的映射对换一下即可。使用命令xmodmap可以完成此操作,xmodmap的具体用法,参考manpage。为了完成CapsLock和Esc的映射交换,你需要建立文件~/.Xmodmap:

remove Lock = Caps_Lock
keysym Escape = Caps_Lock
keysym Caps_Lock = Escape
add Lock = Caps_Lock

然后,执行

xmodmap ~/.Xmodmap # 使映射生效
Tags: ,.

  如果Linux用的比较多的话,你一定遇到过下面的场景。在终端启动了一个任务,这个比较耗时(比如cp, make, apt-get, wget),而此时你又需要在终端下做其它工作。你该如何是好?Ctrl + Alt + F1至F5,再开一个终端?gnome-terminator里面再开一个Tab?再启动一个rxvt?再做一次ssh连接?噢,当然,你还可以Ctrl + C,把那个耗时的进程杀掉。但这都不是一个好的解决之道,相对于使用screen来说。

screen的工作原理

  使用screen,你可以在同一个终端,同一个virtual terminator,同一个ssh中同时进行多个工作。它的大致工作原理是:当前shell中启动screen,此时screen是当前shell的一个子进程,而你现在处于screen的一个会话(session)的一个window中。这个window对应着一个shell进程(比如bash),当你陷入上面的场景时,screen可以让你再开一个(或多个)window,这个window又会对应一个新的shell进程。当然,这些window都在screen的大力监管之下,你可以在这些window之间自由切换。下面两图可能更能说清真象。

Tags: ,.

  在形如struct structName varName;的语句中,struct是必须的吗?这是一个显而易见的语法问题,但却容易被忽略,尤其容易被C+C++的同志们忽略。
  在标准C中,struct关键字是必须的:

1
2
3
4
5
6
7
8
9
10
struct structName {
    int n;
};
//~ typedef struct structName structName;
int
main()
{
    struct structName n;
    return 0;
}

若没有前置的struct关键字,上面的代码就不能通过编译。我的gcc会提示”structName” undeclared, parse error before ‘n’的错误。为了方便,通常会使用typedef struct structName structName;语句来为struct structName定义类型别名。
  但是,在C++中,一般情况下,struct/class关键字就不是必须的。但是,在有些情况下struct/class关键字又是必须的,因为这时的名字structName有歧义性。这是因为,C/C++语言允许用户自定义类型和函数同名。

Tags: ,.

  听XiaFei同学讲课,得知queque<T>没有clear()成员函数,甚觉诧异,察知确凿。非但queue,其它容器适配器,如stack, priority_queque之流,亦无此clear,于此谨记。

Tags: .