前篇回顧
上篇介紹了linux下C程式設計基本環境配置以及相關工具使用選擇。
不過10個大牛9個用vim,那麼咱們就來玩vim。linux下玩c就别依靠圖形界面。好吧告别Ide,指令行才是c的王道。
本篇文章感謝名為孫鶴同學的技術支援 感謝有愛的c大牛們
指針客串
因為畢業後就沒玩過c了,都說指針是c的重點。但是指針作為一種位址變量,為什麼不直接操作變量本身呢。文章末尾為大家揭曉
vim的配置檔案
~/.vimrc 使用者的預設配置檔案
~/.vim/plugin/ 使用者的預設腳本檔案的存放目錄
~/.vim/ftplugin/ 使用者的預設檔案類型相關腳本檔案的存放目錄
vim提供的程式設計支援
文本資訊(行号、檔案名等)
代碼縮進
文法高亮
快速定位
标記位置
全文搜尋
補全
多檔案編輯
多視窗編輯
函數清單
檔案清單
函數跳轉
文法錯誤
字元集的編碼
二進制檢視
等等...
初試vim
在終端以root啟動 輸入vim指令 顯示vim首頁

:r filename 讀入一個檔案内容,并寫入到目前編輯器中
按i進入插入模式
編輯完後:w儲存
編輯完後按esc退出插入模式 進入正常模式
然後輸入:sh進入shell
編譯運作
文本資訊配置
set nu(寫入配置檔案.vimrc中) 顯示行号。
ctrl-g(正常模式下使用指令) 顯示檔案資訊和目前行。
statusline.vim(插件) 增加底部狀态欄。
代碼縮進配置
filetype on(寫入配置檔案.vimrc中) 使vim對檔案類型敏感。
autocmd FileType c,cpp,h :setlocal cindent cinoptions=:0,g0,t0(寫入配置檔案.vimrc中) 設定c縮進風格,具體詳情參見:h cinoptions-values。
autocmd FileType c,cpp,h :setlocal et sta sw=4 sts=4 tabstop=4(寫入配置檔案.vimrc中) 設定一次縮進的距離是4個空格。
=(正常模式或者可視模式下使用指令) 按照縮進風格排版代碼。
<(可視模式下使用指令) 向左縮進一級。
>(可視模式下使用指令) 向右縮進一級。
文法高亮
filetype plugin on(寫入配置檔案.vimrc中) 通常安裝的vim中已經加入了各種語言的文法高亮插件,我們隻需要打開檔案類型相關的插件就可以了。
快速定位
gd(正常模式下使用指令) 跳轉到局部變量定義處。
gD(正常模式下使用指令) 跳轉到全局标量定義處。
*(正常模式下使用指令) 搜尋并跳到下一個光标所在的單詞。
g*(正常模式下使用指令) 功能接近*,但是查找的目标不帶\<和\>單詞分界符号。
#(正常模式下使用指令) 搜尋并跳到上一個光标所在的單詞。
g#(正常模式下使用指令) 功能接近#,但是查找的目标不帶\<和\>單詞分界符号。
标記位置
m{a-zA-Z0-9} (正常模式下使用指令) 在目前位置制作一個标記,标記名字可以使用a-z或者A-Z之間的任意字元,例如輸入ma,就是将目前位置标記為a标記。注意a-z為單檔案标記,不可跨檔案使用,而A-Z0-9為全局标記,可以跨檔案使用。
‘{a-zA-Z0-9} (正常模式下使用指令) 跳轉到本檔案的标記上。
:marks [{a-zA-z0-9}] (正常模式下使用指令) 檢視指定标記的内容,不寫标記号則檢視所有。
:delm {a-zA-z0-9} (正常模式下使用指令) 删除一個标記。
全文搜尋
:vimgrep(正常模式下使用指令) 全文搜尋,功能同grep指令,但是支援在vim進行多檔案跳轉定位。
使用方法:vimgrep 正規表達式 檔案。檔案支援通配符,例如*.c代表所有的.c檔案。如果希望遞歸搜尋,可以使用**/*,表示搜尋所有的檔案。
:cl 列舉結果
:cc(正常模式下使用指令) 目前結果
:cn(正常模式下使用指令) 下一個結果
:cp(正常模式下使用指令) 上一個結果
:cw(正常模式下使用指令) 重新打開搜尋結果視窗
多檔案編輯
vim f1 f2 …… fn(在shell下使用指令) 打開多個檔案。
:e 檔案名(正常模式下使用指令) 在vim中打開新檔案。
:ls(正常模式下使用指令) 所有打開檔案清單。
:bn(正常模式下使用指令) 到下一個檔案。
:bp(正常模式下使用指令) 到上一個檔案。
:b# 或 ctrl-6(正常模式下使用指令) 到最近的前一個檔案。
set autowriteall(寫入配置檔案.vimrc中) 如果讨厭每次打開新檔案,vim喋喋不休的要求你儲存,那麼可以設定自動儲存。
多視窗編輯
:sp 檔案名(正常模式下使用指令) 橫向拆分視窗(多行視窗)。
:vsp 檔案名(正常模式下使用指令) 縱向拆分視窗(多列視窗)。
ctrl-w h(正常模式下使用指令) 将光标移動到左一個視窗。
ctrl-w j(正常模式下使用指令) 将光标移動到下一個視窗。
ctrl-w k(正常模式下使用指令) 将光标移動到上一個視窗。
ctrl-w l(正常模式下使用指令) 将光标移動到右一個視窗。
ctrl-w +(正常模式下使用指令) 目前視窗尺寸變大。
ctrl-w -(正常模式下使用指令) 目前視窗尺寸變小。
ctrl-w o(正常模式下使用指令) 隻顯示目前視窗。
函數清單
taglist.vim(插件) 清單插件。
let Tlist_Use_Right_Window = 1(寫入配置檔案.vimrc中) 如果希望清單在右側顯示,則加入這個配置,預設是左側。
:Tlist(正常模式下使用指令) 顯示函數清單。
d(在taglist視窗下使用) 從清單中删除檔案。
+(在taglist視窗下使用) 展開檔案。
-(在taglist視窗下使用) 折疊檔案。
=(在taglist視窗下使用) 折疊所有檔案。
x(在taglist視窗下使用) 顯示或隐藏正常視窗。
檔案清單
NERD_tree.vim(插件) 橫向拆分視窗(多行視窗)。
let NERDTreeWinPos = 'right'(寫入配置檔案.vimrc中) 如果希望檔案樹在右側顯示,則加入這個配置,預設是左側。
:NERDTree(正常模式下使用指令) 顯示檔案清單。
函數跳轉
ctags(軟體,需要另外安裝) 生成多種語言tag檔案的軟體。
Ctags –R *.c(在shell下使用指令) 生成目前路徑所有.c檔案的tag,-R代表遞歸。
:ta 标記 或 [g] ctrl-] 列舉标簽(多個标簽)或者跳轉到标簽(單個标簽)。
ctrl-t 傳回上一級。
:tags 列出标簽棧。
文法錯誤
:make(正常模式下使用指令) 執行外部make指令,并且顯示所有的編譯警告和錯誤,并且可以在vim中定位。
二進制檔案檢視 (鑒于有同學了解出現分歧 将二進制檢視更新為二進制檔案檢視)
:範圍!xxd(正常模式下使用指令) 把指定範圍的部分轉化為二進制檔案閱讀方式。
:範圍!xxd -r(正常模式下使用指令) 把指定範圍的部分轉回字元閱讀方式。
字元集的編碼
let &termencoding=&encoding
set fileencodings=utf-8,gbk,cp936(寫入配置檔案.vimrc中)
加入多種字元編碼支援。
:set fileencoding(正常模式下使用指令) 設定檔案字元編碼。
補充
ctrl-p(插入模式下使用指令) 跳出補全菜單。
ctrl-n(在跳出補全菜單後) 下一個結果。
ctrl-p(在跳出補全菜單後) 上一個結果。
ctrl-y(在跳出補全菜單後) 選擇目前結果。
ctrl-x ctrl-f(插入模式下使用指令) 檔案名補全。
ctrl-x ctrl-i(插入模式下使用指令) 包含的頭檔案。
ctrl-x ctrl-](插入模式下使用指令) ctags(将在下文中介紹)符号補全。
ctrl-x ctrl-o(插入模式下使用指令) omni補全,需要設定omnifunc變量。
vim其他指令 (參考vi(vim)教程)
打開檔案、儲存、關閉檔案:
vi filename //打開filename檔案
:w //儲存檔案
:w vpser.net //儲存至vpser.net檔案
:q //退出編輯器,如果檔案已修改請使用下面的指令
:q! //退出編輯器,且不儲存
:wq //退出編輯器,且儲存檔案
插入文本或行:
a //在目前光标位置的右邊添加文本
i //在目前光标位置的左邊添加文本
A //在目前行的末尾位置添加文本
I //在目前行的開始處添加文本(非空字元的行首)
O //在目前行的上面建立一行
o //在目前行的下面建立一行
R //替換(覆寫)目前光标位置及後面的若幹文本
J //合并光标所在行及下一行為一行(依然在指令模式)
移動光标:
使用上下左右方向鍵
指令模式下:h 向左、j 向下 、k 向上、l 向右。
空格鍵 向右、Backspace 向左、Enter 移動到下一行首、- 移動到上一行首。
删除:
x //删除目前字元
nx //删除從光标開始的n個字元
dd //删除目前行
ndd //向下删除目前行在内的n行
u //撤銷上一步操作
U //撤銷對目前行的所有操作
搜尋:
/vpser //向光标下搜尋vpser字元串
?vpser //向光标上搜尋vpser字元串
n //向下搜尋前一個搜素動作
N //向上搜尋前一個搜尋動作
跳轉:
n+ //向下跳n行
n- //向上跳n行
nG //跳到行号為n的行
G //跳至檔案的底部
設定行号:
:set nu //顯示行号
:set nonu //取消顯示行号
複制:
yy //将目前行複制到緩存區,也可以用 "ayy 複制,"a 為緩沖區,a也可以替換為a到z的任意字母,可以完成多個複制任務。
nyy //将目前行向下n行複制到緩沖區,也可以用 "anyy 複制,"a 為緩沖區,a也可以替換為a到z的任意字母,可以完成多個複制任務。
yw //複制從光标開始到詞尾的字元。
nyw //複制從光标開始的n個單詞。
y^ //複制從光标到行首的内容。
y$ //複制從光标到行尾的内容。
p //粘貼剪切闆裡的内容在光标後,如果使用了前面的自定義緩沖區,建議使用"ap 進行粘貼。
P //粘貼剪切闆裡的内容在光标前,如果使用了前面的自定義緩沖區,建議使用"aP 進行粘貼。
替換:
:s/old/new //用new替換行中首次出現的old
:s/old/new/g //用new替換行中所有的old
:n,m s/old/new/g //用new替換從n到m行裡所有的old
:%s/old/new/g //用new替換目前檔案裡所有的old
編輯其他資源:
:e otherfilename //編輯檔案名為otherfilename的檔案。
修改檔案格式:
:set fileformat=unix //将檔案修改為unix格式,如win下面的文本檔案在linux下會出現^M。
客串答案
c傳遞參數都是值傳遞的,指針的一個作用是為了解決實作類似引用的效果,另外,使用指針可以直接操作記憶體!
孫鶴同學的解釋:
每個線程有固定大小的棧,通常主線程的棧預設一般是8M,用指針去引用記憶體,往往是在使用堆記憶體,棧是有限的,并且受生存期影響,是以用堆的情況要比用棧更多,有些東西生存期很長,超過一個函數的調用,那麼就需要用堆記憶體。