一.Vim編輯器
1.Vim的六種模式
2.Vim三種常用模式的使用方式,以及三者的切換。打開Vim即默認進入普通模式,按i進入插入模式,按esc從插入模式退出普通模式,再按:進入命令行模式。
普通模式下游標的移動
按鍵 | 說明 |
h | 左 |
l | 右(小寫L) |
j | 下 |
k | 上 |
w | 移動到下一個單詞 |
b | 移動到上一個單詞 |
普通模式進入插入模式的方式
命令???????? 說明
i??????? 在當前光標處進行編輯
I??????? 在行首插入
A?????? 在行末插入
a?????? 在光標后插入編輯
o?????? 在當前行后插入一個新行
O????? 在當前行前插入一個新行
cw??? 替換從光標所在位置后到一個單詞結尾的字符
命令行模式退出的方式:
命令 | 說明 |
:q! | 強制退出,不保存 |
:q | 退出 |
:wq! | 強制保存并退出 |
:w <文件路徑> | 另存為 |
:saveas 文件路徑 | 另存為 |
:x | 保存并退出 |
:wq | 保存并退出 |
普通模式下退出vim
普通模式下輸入Shift+zz即可保存退出vim
?
3.Vim在普通模式下的刪除
命令 | 說明 |
x | 刪除游標所在的字符 |
X | 刪除游標所在前一個字符 |
Delete | 同x |
dd | 刪除整行(其實是剪切,后邊可以使用p粘貼) |
dw | 刪除一個單詞(不適用中文) |
d$或D | 刪除至行尾 |
d^ | 刪除至行首 |
dG | 刪除到文檔結尾處 |
d1G | 刪至文檔首部 |
?
4.普通模式下命令的重復執行(1)按.可執行上次命令,可以按多次。(2)數字倍命令:例如8dd,表示刪除8行。
5.普通模式下游標的快速跳轉(1)以行為單位跳轉(2)在一行內,單詞單詞之間,或者字母字母之間的跳轉
1.行間跳轉(ctrl+o可以回到光標上次所在位置)
命令 | 說明 |
nG(n Shift+g) | 游標移動到第 n 行(如果默認沒有顯示行號,請先進入命令模式,輸入:set nu以顯示行號) |
gg | 游標移動到到第一行 |
G(Shift+g) | 到最后一行 |
2.行內跳轉
普通模式下使用下列命令在行內按照單詞為單位進行跳轉
命令 | 說明 |
w | 到下一個單詞的開頭 |
e | 到下一個單詞的結尾 |
b | 到前一個單詞的開頭 |
ge | 到前一個單詞的結尾 |
0或^ | 到行頭 |
$ | 到行尾 |
f<字母> | 向后搜索<字母>并跳轉到第一個匹配的位置(非常實用) |
F<字母> | 向前搜索<字母>并跳轉到第一個匹配的位置 |
t<字母> | 向后搜索<字母>并跳轉到第一個匹配位置之前的一個字母(不常用) |
T<字母> | 向前搜索<字母>并跳轉到第一個匹配位置之后的一個字母(不常用) |
7.普通模式下的復制和粘貼,剪切和粘貼
- 普通模式中使用y復制
- 普通模式中,yy復制游標所在的整行(3yy表示復制3行)
- 普通模式中,y^?復制至行首,或y0。不含光標所在處字符。
- 普通模式中,y$?復制至行尾。含光所在處字符。
- 普通模式中,yw?復制一個單詞。
- 普通模式中,y2w?復制兩個單詞。
- 普通模式中,yG?復制至文本末。
- 普通模式中,y1G?復制至文本開頭。
- 普通模式中使用p粘貼
- 普通模式中,p(小寫)代表粘貼至光標后(下一行)
- 普通模式中,P(大寫)代表粘貼至光標前(上一行)
?
dd
刪除命令就是剪切,你每次dd
刪除文檔內容后,便可以使用p
來粘貼
8.普通模式下替換和撤銷
命令 | 說明 |
---|---|
r +<待替換字母> | 將游標所在字母替換為指定字母 |
R | 連續替換,直到按下Esc |
cc | 替換整行,即刪除游標所在行,并進入插入模式 |
cw | 替換一個單詞,即刪除一個單詞,并進入插入模式 |
C (大寫) | 替換游標以后至行末 |
~ | 反轉游標所在字母大小寫 |
u {n} | 撤銷一次或n次操作 |
U (大寫) | 撤銷當前行的所有修改 |
Ctrl+r | redo,即撤銷undo(撤銷本身)的操作 |
9.(普通)縮進,(命令行)shiftwidth,(命令行)文本居中靠右靠左調整 ? ?
- 普通模式下輸入>>?整行將向右縮進(適用格式化代碼)
- 普通模式下輸入<<?整行向左回退
- 普通模式下輸入:進入命令行模式下對shiftwidth值進行設置可以控制縮進和回退的字符數
在命令行模式下,set shiftwidth?可以得出現在時縮進幾格,set shiftwidth=12表示自定義縮進12格
ce文本該行居中 ? ri文本該行居右 ? ?le居左
10.普通模式下快速查找
/字符串,回車 向下查找
?字符串,回車 向上查找
n 下一個出現關鍵字的地方
N 上一個出現關鍵字的地方
?
?
- 普通模式下輸入\*向上尋找游標所在處的單詞
- 普通模式下輸入\#同上,#是向后(下)找
- 普通模式下輸入g\*同\*?,但部分符合該單詞即可
- 普通模式下輸入g\#同\#?,但部分符合該單詞即可
?
11.多文件編輯
?
1.使用vim編輯多個文件
?
編輯多個文件有兩種形式,一種是在進入vim前使用的參數就是多個文件。另一種就是進入vim后再編輯其他的文件。 同時創建兩個新文件并編輯
?
$ vim 1.txt 2.txt
?
默認進入1.txt文件的編輯界面
?
- 命令行模式下輸入:n編輯2.txt文件,可以加!即:n!強制切換,之前一個文件的輸入沒有保存,僅僅切換到另一個文件
- 命令行模式下輸入:N編輯1.txt文件,可以加!即:N!強制切換,之前文件內的輸入沒有保存,僅僅是切換到另一個文件
?
2.進入vim后打開新文件
?
- 命令行模式下輸入:e 3.txt?打開新文件3.txt
- 命令行模式下輸入:e#?回到前一個文件
- 命令行模式下輸入:ls可以列出以前編輯過的文檔
- 命令行模式下輸入:b 2.txt(或者編號)可以直接進入文件2.txt編輯
- 命令行模式下輸入:bd 2.txt(或者編號)可以刪除以前編輯過的列表中的文件項目
- 命令行模式下輸入:e! 4.txt,新打開文件4.txt,放棄正在編輯的文件
- 命令行模式下輸入:f?顯示正在編輯的文件名
- 命令行模式下輸入:f new.txt,改變正在編輯的文件名字為new.txt
?
3.恢復文件
?
如果因為斷電等原因造成文檔沒有保存,可以采用恢復方式,vim -r進入文檔后,輸入:ewcover 1.txt來恢復
?
$ vim -r 1.txt
12.可視模式
- 在普通模式下輸入
v
(小寫),進入字符選擇模式,就可以移動光標,光標走過的地方就會選取。再次按下v會后就會取消選取。 - 在普通模式下輸入
Shift+v
(小寫),進入行選擇模式,按下V之后就會把整行選取,您可以上下移動光標選更多的行,同樣,再按一次Shift+v
就可以取消選取。 - 在普通模式下輸入?
Ctrl+v
(小寫),這是區域選擇模式,可以進行矩形區域選擇,再按一次Ctrl+v
取消選取。 - 在普通模式下輸入
d
刪除選取區域內容 - 在普通模式下輸入
y
復制選取區域內容
13.視窗操作
在命令行模式下輸入:new
?打開一個新的vim視窗,并進入視窗編輯一個新文件。分別在不同視窗的命令行模式下輸入:q!
退出多視窗編輯。
- 命令行模式下輸入:sp 1.txt?打開新的橫向視窗來編輯1.txt
- 命令行模式下輸入:vsp 2.txt?打開新的縱向視窗來編輯1.txt
- 普通模式下Ctrl-w s?將當前窗口分割成兩個水平的窗口
- 普通模式下Ctrl-w v?將當前窗口分割成兩個垂直的窗口
- 普通模式下Ctrl-w q?即 :q 結束分割出來的視窗。如果在新視窗中有輸入需要使用強制符!即:q!
- 普通模式下Ctrl-w o?打開一個視窗并且隱藏之前的所有視窗
- 普通模式下Ctrl-w j?移至下面視窗
- 普通模式下Ctrl-w k?移至上面視窗
- 普通模式下Ctrl-w h?移至左邊視窗
- 普通模式下Ctrl-w l?移至右邊視窗
- 普通模式下Ctrl-w J?將當前視窗移至下面
- 普通模式下Ctrl-w K?將當前視窗移至上面
- 普通模式下Ctrl-w H?將當前視窗移至左邊
- 普通模式下Ctrl-w L?將當前視窗移至右邊
- 普通模式下Ctrl-w -?減小視窗的高度
- 普通模式下Ctrl-w +?增加視窗的高度
14.文檔加密
vim -x file1?
15.在vim命令行模式狀態下執行外部命令
?在命令行模式中輸入!可以執行外部的shell命令
?
:!ls 用于顯示當前目錄的內容
:!rm FILENAME用于刪除名為 FILENAME 的文件
:w FILENAME可將當前 VIM 中正在編輯的文件另存為 FILENAME 文件
16.vim中的查看幫助
- 普通模式下按
F1
打開vim
自己預設的幫助文檔 - 命令行模式下輸入
:h shiftwidth
?打開名為shiftwidth
的幫助文件
17.Vim的功能設定
1.vim的功能設定(目前不要動這個文件,不知道怎么改)
可以在編輯文件的時候進行功能設定,如命令行模式下輸入:set nu
(顯示行數),設定值退出vim后不會保存。要永久保存配置需要修改vim配置文件。 vim的配置文件~/.vimrc
,可以打開文件進行修改,不過務必小心不要影響vim正常使用
2.獲取目前的設定
- 命令行模式下輸入
:set
或者:se
顯示所有修改過的配置 - 命令行模式下輸入
:set all
?顯示所有的設定值 - 命令行模式下輸入
:set option?
?顯示option的設定值 - 命令行模式下輸入
:set nooption
?取消當期設定值
3.set功能的說明
- 命令行模式下輸入
:set autoindent(ai)
?設置自動縮進 - 命令行模式下輸入
:set autowrite(aw)
?設置自動存檔,默認未打開 - 命令行模式下輸入
:set background=dark
或light
,設置背景風格 - 命令行模式下輸入
:set backup(bk)
?設置自動備份,默認未打開 - 命令行模式下輸入
: set cindent(cin)
?設置C語言風格縮進
18.補充?
set nu 顯示行號
:set ai 自動縮行
:set ts=4 設置一個 TAB 鍵等于幾個空格
移動光標
[[ 轉到上一個位于第一列的"{"
]] 轉到下一個位于第一列的"{"
{ 轉到上一個空行
} 轉到下一個空行
gd 轉到當前光標所指的局部變量的定義
二.gcc編譯器
?
1.gcc 支持編譯的一些源文件后綴名
后綴 | 源文件 |
.c | C語言源文件 |
.C .cc .cxx | C++源文件 |
.m | Object-C源文件 |
.i | 經過預處理后的C源文件 |
.ii | 經過預處理后的C++源文件 |
.s .S | 匯編語言源文件 |
.h | 預處理文件(頭文件) |
.o | 目標文件 |
.a | 存檔文件 |
?gcc 編譯程序的流程
?
預處理:gcc –E hello.c –o hello.i;gcc –E調用cpp
編 譯:gcc –S hello.i –o hello.s;gcc –S調用ccl
匯 編:gcc –c hello.s –o hello.o;gcc -c 調用as
鏈 接:gcc hello.o –o hello ;gcc -o 調用ld
編譯過程比較難記,我們簡化一下,前三步,GCC的參數連起來是“ESc”,相應輸入的文件的后綴是“iso”,這樣記憶起來就容易多了
注意:
- Linux的可執行文件,只需向其分配x(可執行)權限即可?sudo chmod u+x excutefile
- 作為Linux程序員,我們可以讓gcc在編譯的任何階段結束,以便檢查或使用該階段的輸出(這個很重要)
?2.體驗:用gcc編譯一個經典的hello
先使用Gvim編輯C語言代碼,保存為hello.c
gcc 文件名 -o 名字(隨便取的代替前者的名字,因為前者是C語言源文件) ?編譯
./名字(剛剛隨便取的名字) ?執行
3.gcc的細分三步
$ gcc -E hello.c -o hello.i
首先gcc會調用預處理程序cpp,展開在源程序中定義的宏(上例:#include <stdio.h>)
hello.i這是一個經過預處理器處理之后的C源文件
gcc的-E參數可以讓gcc在預處理結束后停止編譯過程。
$ gcc -c hello.i -o hello.o
第二步,將hello.i編譯為目標代碼,gcc默認將.i文件看成是預處理后的C語言源代碼,因此它會直接跳過預處理,開始編譯過程。
o文件它已經是二進制文件了
Tips:
- 請記住,gcc預處理源文件的時候(第一步),不會進行語法錯誤的檢查
- 語法檢查會在第二步進行,比如花括號不匹配、行末尾沒有分號、關鍵字錯誤......
gcc hello.o -o hello
第三步,gcc連接器將目標文件鏈接為一個可執行文件,一個大致的編譯流程結束
?4.有函數調用的gcc
現在很多軟件都是采用的模塊化開發,通常一個程序都是有很多個源文件組成,相應的就形成了多個編譯單元。gcc能夠很好的處理這些編譯單元,最終形成一個可執行程序
?
三.調試器gdb
1.gdb的功能
- 啟動程序,可以按照用戶自定義的要求隨心所欲的運行程序。
- 可讓被調試的程序在用戶所指定的調試的斷點處停住 (斷點可以是條件表達式)。
- 當程序停住時,可以檢查此時程序中所發生的事。
- 動態地改變程序的執行環境。
啟動gdb的方法有以下幾種:
- gdb <program> program也就是執行文件,一般在當前目錄下。
- gdb <program> core 用gdb同時調試一個運行程序和core文件,core是程序非法執行后,core dump后產生的文件。
- gdb <program> <PID> 如果程序是一個服務程序,那么可以指定這個服務程序運行時的進程ID。gdb會自動attach上去,并調試它。program應該在PATH環境變量中搜索得到。 gdb啟動時,可以加上一些gdb的啟動開關,詳細的開關可以用gdb -help查看。下面只列舉一些比較常用的參數: -symbols <file> -s <file> 從指定文件中讀取符號表。 -se file 從指定文件中讀取符號表信息,并把它用在可執行文件中。 -core <file> -c <file> 調試時core dump的core文件。 -directory <directory> -d <directory> 加入一個源文件的搜索路徑。默認搜索路徑是環境變量中PATH所定義的路徑。
先使用gcc -g gdb.h -o testgdb生成可使用gdb調試的testgdb文件
gdb testgdb 開啟gdb調試器
(gdb) l 鍵入 l命令相當于list命令,從第一行開始列出源碼:
?(gdb) break 16 <-------------------- 設置斷點,在源程序第16行處。
?(gdb) break func <-------------------- 設置斷點,在函數func()入口處。
?(gdb) info break <-------------------- 查看斷點信息。
?(gdb) r <--------------------- 運行程序,run命令簡寫
?(gdb) n <--------------------- 單條語句執行,next命令簡寫。
?(gdb) c???? <--------------------- 繼續運行程序,continue命令簡寫。
?(gdb) p I??? <--------------------- 打印變量i的值,print命令簡寫。
?(gdb) bt???? <--------------------- 查看函數堆棧。
?(gdb) finish <--------------------- 退出函數。
?(gdb) q???? <--------------------- 退出gdb。
gdb programm(啟動GDB)
b 設斷點(要會設4種斷點:行斷點、函數斷點、條件斷點、臨時斷點)
run 開始運行程序
bt 打印函數調用堆棧
p 查看變量值
c 從當前斷點繼續運行到下一個斷點
n 單步運行
s 單步運行
quit 退出GDB
- display 跟蹤變量值的改變
- until 跳出循環
- finish 跳出函數
- help 幫助
四.文件管理器Makefile
1.Makefile的作用:
一個工程中的源文件不計其數,按其類型、功能、模塊分別放在若干個目錄中。makefile定義了一系列的規則來指定,哪些文件需要先編譯,哪些文件需要后編譯,哪些文件需要重新編譯,甚至進行更復雜的功能操作(因為makefile就像一個shell腳本一樣,可以執行操作系統的命令)。
makefile帶來的好處就是——“自動化編譯”,一但寫好,只需要一個make命令,整個工程完全編譯,極大的提高了軟件的開發效率。make是一個命令工具,是一個及時makefile中命令的工具程序。
make工具最主要也是最基本的功能就是根據makefile文件中描述的源程序至今的相互關系來完成自動編譯、維護多個源文件工程。而makefile文件需要按某種語法進行編寫,文件中需要說明如何編譯各個源文件并鏈接生成可執行文件,要求定義源文件之間的依賴關系。
2.Makefile的使用:
首先vim Makefile
Makefile的內容,一般寫法:
test(目標文件): prog.o code.o(依賴文件列表)
tab(至少一個tab的位置) gcc prog.o code.o -o test(命令)
.......
例:
test: prog.o code.o
(這里是按tab鍵) ? ? ? ?gcc prog.o code.o -o test
prog.o: prog.c code.h
??????? gcc -c prog.c -o prog.o
code.o: code.c code.h
??????? gcc -c code.c -o code.o
clean:
??????? rm -f *.o test
$ make
執行./test
查看結果
?make clean
就會去執行rm -f *.o test
這條命令,完成 clean 操作。
3.帶宏的Makefile
Makefile還可以定義和使用宏(也稱做變量),從而使其更加自動化,更加靈活,在Makefile中定義宏的格式為:
?macroname = macrotext
使用宏的格式為:
?$(macroname)
?
?
?
?
問題:
1.在實驗時使用>>也并沒有看出來它可以格式化代碼,只看到向右移動了很多格。