天天看點

【linux+C】神器 vim + 指針相關客串

前篇回顧

  上篇介紹了linux下C程式設計基本環境配置以及相關工具使用選擇。

  不過10個大牛9個用vim,那麼咱們就來玩vim。linux下玩c就别依靠圖形界面。好吧告别Ide,指令行才是c的王道。

  本篇文章感謝名為孫鶴同學的技術支援 感謝有愛的c大牛們

 指針客串

  因為畢業後就沒玩過c了,都說指針是c的重點。但是指針作為一種位址變量,為什麼不直接操作變量本身呢。文章末尾為大家揭曉

vim的配置檔案

  ~/.vimrc        使用者的預設配置檔案

  ~/.vim/plugin/   使用者的預設腳本檔案的存放目錄

  ~/.vim/ftplugin/ 使用者的預設檔案類型相關腳本檔案的存放目錄

 vim提供的程式設計支援

  文本資訊(行号、檔案名等)

  代碼縮進

  文法高亮

  快速定位

  标記位置

  全文搜尋

  補全

  多檔案編輯

  多視窗編輯

  函數清單

  檔案清單

  函數跳轉

  文法錯誤

  字元集的編碼

  二進制檢視

  等等...

初試vim

  在終端以root啟動 輸入vim指令 顯示vim首頁

【linux+C】神器 vim + 指針相關客串

:r filename 讀入一個檔案内容,并寫入到目前編輯器中

【linux+C】神器 vim + 指針相關客串

按i進入插入模式

【linux+C】神器 vim + 指針相關客串

編輯完後:w儲存

【linux+C】神器 vim + 指針相關客串

編輯完後按esc退出插入模式 進入正常模式

然後輸入:sh進入shell

【linux+C】神器 vim + 指針相關客串

編譯運作

【linux+C】神器 vim + 指針相關客串

文本資訊配置

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,用指針去引用記憶體,往往是在使用堆記憶體,棧是有限的,并且受生存期影響,是以用堆的情況要比用棧更多,有些東西生存期很長,超過一個函數的調用,那麼就需要用堆記憶體。