Java實驗三

1、實驗內容

1. XP基礎

2. XP核心實踐

3. 相關工具

2、實驗步驟

(一)敏捷開發與XP

軟件工程是把系統的、有序的、可量化的方法應用到軟件的開發、運營和維護上的過程。軟件工程包括下列領域:軟件需求分析、軟件設計、軟件構建、軟件測試和軟件維護。 人們在開發、運營、維護軟件的過程當中有不少技術、作法、習慣和思想體系。軟件工程把這些相關的技術和過程統一到一個體系中,叫「軟件開發流程」。軟件開發流程的目的是爲了提升軟件開發、運營、維護的效率,並提升軟件的質量、用戶滿意度、可靠性和軟件的可維護性。 光有各類流程的思想是不夠的,咱們還要有一系列的工具來保證這些思想可以在實踐中有效率地運做。軟件開發很重要的一點不是看你能對多少理論講的頭頭是道,還要看你對相關工具應用的如何,好比Java中單元測試要和JUnit的應用結合起來,建模要和Umbrello或StarUML的應用結合起來。編程學習是一個習而學的過程。 常見的開發流程有:php

  • RUP(Rational Unified Process)
  • PSP(Personal Software Process )
  • TSP(Team Software Process )
  • Agile Process
  • ……

敏捷開發包括不少模式:
圖片描述信息html

其中,極限編程(eXtreme Programming,XP)是 是一種全新而快捷的軟件開發方法。XP團隊使用現場客戶、特殊計劃方法和持續測試來提供快速的反饋和全面的交流:java

  • XP是以開發符合客戶須要的軟件爲目標而產生的一種方法論
  • XP是一種以實踐爲基礎的軟件工程過程和思想
  • XP認爲代碼質量的重要程度超出人們通常所認爲的程度
  • XP特別適合於小型的有責任心的、自覺自勵的團隊開發需求不肯定或者迅速變化的軟件

XP軟件開發是什麼樣的經過 XP準則來表達:linux

  • 溝通 :XP認爲項目成員之間的溝通是項目成功的關鍵,並把溝通看做項目中間協調與合做的主要推進因素。
  • 簡單 :XP假定將來不能可靠地預測,在如今考慮它從經濟上是不明智的,因此不該該過多考慮將來的問題而是應該集中力量解決燃眉之急。
  • 反饋 :XP認爲系統自己及其代碼是報告系統開發進度和狀態的可靠依據。系統開發狀態的反饋能夠做爲一種肯定系統開發進度和決定系統下一步開發方向的手段。
  • 勇氣:表明了XP認爲人是軟件開發中最重要的一個方面的觀點。在一個軟件產品的開發中人的參與貫穿其整個生命週期,是人的勇氣來排除困境,讓團隊把局部的最優拋之腦後,達到更重大的目標。代表了XP對「人讓項目取得成功」的基本信任態度。

一項實踐在XP環境中成功使用的依據經過XP的法則呈現,包括:快速反饋、假設簡單性、遞增更改、提倡更改、優質工做。git

XP軟件開發的基石是XP的活動,包括:編碼、測試、傾聽、設計。程序員

以測試爲核心的開發流程:github

圖片描述信息

(二)編碼標準

      編寫代碼一個重要的認識是「程序大多時候是給人看的」,編程標準使代碼更容易閱讀和理解,甚至能夠保證其中的錯誤更少。編程標準包含:具備說明性的名字、清晰的表達式、直截了當的控制流、可讀的代碼和註釋,以及在追求這些內容時一致地使用某些規則和慣用法的重要性。算法

 

      這個問題在Eclipse中比較容易解決,咱們單擊Eclipse菜單中的source->Format 或用快捷鍵Ctrl+Shift+F就能夠按Eclipse規定的規範縮進,效果以下:express

 

      代碼標準中很重要的一項是如何給包、類、變量、方法等標識符命名,能很好的命名可讓本身的代碼立立刻升一個檔次。Java中的通常的命名規則有:編程

  • 要體現各自的含義
  • 包、類、變量用名詞
  • 方法名用動賓
  • 包名所有小寫,如:io,awt
  • 類名第一個字母要大寫,如:HelloWorldApp
  • 變量名第一個字母要小寫,如:userName
  • 方法名第一個字母要小寫:setName
  • ...

 

有一些公司好比Google公開了本身的編碼標準,能夠做爲學習不錯的參考,你們參考一下範飛龍老師寫的代碼規範&代碼風格,有興趣的能夠嘗試如何在Eclipse中實踐Google Java Style(中文版),也就是說如何作到「按一下快捷鍵Ctrl+Shift+F就可讓本身的代碼符合Google Java Style(中文版)的要求」,完成後單獨寫一篇Blog,有加分的

(三)結對編程

結對編程是XP中的重要實踐。在結對編程模式下,一對程序員肩並肩、平等地、互補地進行開發工做。他們並排坐在一臺電腦前,面對同一個顯示器,使用同一個鍵盤、同一個鼠標一塊兒工做。他們一塊兒分析,一塊兒設計,一塊兒寫測試用例,一塊兒編碼,一塊兒作單元測試,一塊兒作集成測試,一塊兒寫文檔等。 結對編程中有兩個角色:

  • 駕駛員(Driver)是控制鍵盤輸入的人。
  • 領航員(Navigator)起到領航、提醒的做用。

結對編程和兩人合做的重點是:

  • 駕駛員:寫設計文檔,進行編碼和單元測試等XP開發流程。
  • 領航員:審閱駕駛員的文檔、駕駛員對編碼等開發流程的執行;考慮單元測試的覆蓋率;思考是否須要和如何重構;幫助駕駛員解決具體的技術問題。
  • 駕駛員和領航員不斷輪換角色,不要連續工做超過一小時,每工做一小時休息15分鐘。領航員要控制時間。
  • 主動參與。任何一個任務都首先是兩我的的責任,也是全部人的責任。沒有「個人代碼」、「你的代碼」或「他/她的代碼」,只有「咱們的代碼」。
  • 只有水平上的差距,沒有級別上的差別。兩人結對,儘管可能你們的級別資歷不一樣,但無論在分析、設計或編碼上,雙方都擁有平等的決策權利。

 

(四)版本控制

XP的集體全部制意味着每一個人都對全部的代碼負責;這一點,反過來又意味着每一個人均可以更改代碼的任意部分。結對編程對這一實踐貢獻良多:藉由在不一樣的結對中工做,全部的程序員都能看到徹底的代碼。集體全部制的一個主要優點是提高了開發程序的速度,由於一旦代碼中出現錯誤,任何程序員都能修正它。 這意味着代碼要放到一個你們都能方便獲取的地方,咱們叫代碼倉庫。這引出另一個話題叫版本控制(Version Control)。

不管是對於團隊仍是個體,版本控制都提供了不少好處。

  • 版本控制提供項目級的 undo(撤銷) 功能: 沒有什麼事情是終結版本, 任何錯誤必須很容易回滾。 假設你在使用世界上最複雜的文字處理系統。 它具有了全部的能想到的功能,就是沒有支持 DELETE(刪除) 鍵。想象你打字的時候得多麼的謹慎和緩慢吧, 特別是一篇超大的文檔的快臨近末尾的時候, 一個不當心就要重頭再來(試想你選中全部的文字, 不當心按了 DELETE 鍵, 由於沒有撤銷功能,只好從新錄入)。編輯文字和版本控制相同,任什麼時候候都須要回滾,不管是一個小時, 一天, 仍是一週, 這讓你的團隊工做自由快速的工做, 並且對於修正錯誤也很是自信。
  • 版本控制容許多人在同一代碼上工做, 只要遵照必定的控制原則就行。 不再會發生諸如一我的覆蓋了另外一我的編輯的代碼,致使那我的的修改無效這樣的狀況。
  • 版本控制系統保存了過去所做的修改的歷史記錄。若是你遭遇到一些驚訝的代碼,經過版本控制系統能夠很容易找出是誰幹的, 修改了什麼, 修改的時間, 若是幸運的話,還能找出緣由。
  • 版本控制系統還支持在主線上開發的同時發佈多個軟件版本。在軟件發佈的時候也不須要整個團隊的中止工做,不須要凍結代碼。
  • 版本控制也是項目級的時間機器,你能夠選擇任何一個時間, 精確地查看項目在當時的狀況。 這對研究很是有用, 也是重現之前某個有問題的發佈版本的基礎。

流行的版本控制工具備CVS,SVN,Git等。Git是Linus除了Linux操做系統外的另一個重要發明。

實驗樓上線個人代碼庫功能,爲你們提供實驗環境內置的公開的git服務。學習的課程會自動建立一個公開的代碼倉庫,命名爲shiyanlou_cs[課程ID],好比本課程的代碼庫命名shiyanlou_cs212,爲啓動實驗時會在環境中自動執行git pull,獲取課程倉庫最新代碼,存放在/home/shiyanlou/Code目錄。git push操做須要手動完成,請務必在中止實驗前push所有修改,不然代碼就丟了。

 

好比個人專屬用戶名是pianogirl,則個人代碼庫連接爲:http://git.shiyanlou.com/pianogirl, 《Java 程序設計》課程的代碼倉庫連接爲:http://git.shiyanlou.com/pianogirl/shiyanlou_cs212,該課程實驗環境中代碼路徑爲:/home/shiyanlou/Code/shiyanlou_cs212.

使用方法以下:

  1. 若是對Git不熟悉,推薦先學習Git課程
  2. 開始實驗時,若是您已經有了該課程的代碼倉庫則會自動同步(git pull)到實驗環境中/home/shiyanlou/Code目錄,若是尚未建立過則會自動建立並同步
  3. 進入到實驗環境中修改代碼,完成後須要依次執行下述命令便可提交:
$ cd /home/shiyanlou/Code/shiyanlou_cs212 # 修改代碼文件 # 添加修改文件 $ git add 全部修改的文件 # 提交到環境中本地代碼倉庫 $ git commit -m '本次修改的描述' # push到git.shiyanlou.com,無需輸入密碼 $ git push 

克隆其餘用戶代碼倉庫只須要知道對方的倉庫連接,咱們鼓勵在別人代碼基礎上修改:

$ git clone http://git.shiyanlou.com/[對方的專屬用戶名]/[課程代碼倉庫名] 

咱們給一個HelloWorld的例子: 首先進入Code目錄,你會發現有了shiyanlou_cs212目錄,進入shiyanlou_cs212,以下圖所示:

建立HelloWorld目錄,以下圖所示:

建立並編輯HelloWorld.java文件,以下圖所示:

注意一點,往代碼庫提交的代碼必定編譯、運行、測試都沒有問題的代碼,咱們上面測試代碼沒有問題了,就能夠提交了:

如圖:咱們能夠先用git status查看一下代碼狀態,顯示有未跟蹤的代碼,並建議用git add <file>...添加,咱們使用git add HelloWorld.* 把要提交的文件的信息添加到索引庫中。當咱們使用git commit時,git將依據索引庫中的內容來進行文件的提交。這只是在本地操做,關閉實驗環境,會刪除代碼的,若是想把代碼保存到遠程託管服務器中,須要使用git push實驗完成前,必定不要忘了使用git push,不然就是至關於你在Word中編輯了半天文件最後卻沒有保存。 咱們能夠修改HelloWorld.java,以下圖所示:

編譯、運行、測試沒有問題後進行提交,這兒使用的是git commit -a

咱們能夠經過git log查看代碼提交記錄:

 

有個問題是HelloWorld.class是不該該保存在代碼庫中的,咱們只要有HelloWorld.java就好了,這怎麼辦?經過搜索引擎解決一下。

固然,Git不是隻有程序員纔用到,全部須要"Undo"的場合,版本控制都能幫助你。參考一下Git for Non-Programmers(中文版)。

更進一步的學習,參考Git使用、工具、原理、進階的幾個連接

(五)重構

咱們先看看重構的概念:

重構(Refactor),就是在不改變軟件外部行爲的基礎上,改變軟件內部的結構,使其更加易於閱讀、易於維護和易於變動 。

重構中一個很是關鍵的前提就是「不改變軟件外部行爲」,它保證了咱們在重構原有系統的同時,不會爲原系統帶來新的BUG,以確保重構的安全。如何保證不改變軟件外部行爲?重構後的代碼要能經過單元測試。如何使其更加易於閱讀、易於維護和易於變動 設計模式給出了重構的目標。

重構重要嗎?你看看Eclipse菜單中有個refactor菜單就知道了,重構幾乎是現代IDE的標配了:

咱們在編碼標準中說「給標識符命名」是程序員一項重要技能,之前沒有這個意識,如今知道了怎麼辦?沒問題,上圖中重構的第一項功能就是Rename,能夠給類、包、方法、變量更名字。 例如這有個ABC類:

這個類,類名,方法名和方法的參數名都有問題,沒有註釋的話是沒法理解代碼的。咱們可使用Eclipse中的重構功能來更名。修改方法是,用鼠標單擊要改的名字,選擇Eclipse中菜單中的Refactor->Rename...

 

重構完的效果以下:

功能不變,代碼水平立立刻了一個檔次,體會到命名的威力了吧?

學過C語言的學生學Java時常犯的毛病是不會封裝,該用類的地方都用告終構體。好比要定義一個類Student,會出現這樣的代碼:

Eclipse中菜單中的Refactor->Encapsulate Field...,以下圖:

注意分析一下重構先後的代碼變化:

一樣能夠封裝idage兩個成員變量,結果以下:

上面第33行仍是有問題的,每次打印學生信息都這麼寫代碼違反了DRY原則,形成代碼重複,正常的重構可使用Eclipse中的Extract Method...,以下圖:

因爲Java中全部的類都有個專門的toString方法,咱們使用Eclipse中Source->Generate toString()... 給Student類產生一個toString方法

修改main的代碼,結果以下:

 

你們想想,這樣重構後有什麼好處?重構有什麼問題嗎?

咱們要修改軟件,萬變不離其宗,無非就是四種動機:

  • 增長新功能;
  • 原有功能有BUG;
  • 改善原有程序的結構;
  • 優化原有系統的性能 。

第一種和第二種動機,都是源於客戶的功能需求,而第四種是源於客戶的非功能需求。軟件的外部質量,其衡量的標準就是客戶對軟件功能需求與非功能需求的滿意度。它涉及到一個企業、一個軟件的信譽度與生命力,所以爲全部軟件企業所高度重視。要提升軟件內部質量,毫無疑問就是軟件修改的第三個動機:改善原有程序的結構。它的價值是隱性的,並不體如今某一次或兩次開發中,而是逐漸體如今往後長期維護的軟件過程當中。 高質量的軟件,能夠保證開發人員(即便是新手)可以輕易看懂軟件代碼,可以保證往後的每一次軟件維護均可以輕易地完成(不論軟件經歷了多少次變動,維護了多少年),可以保證往後的每一次需求變動都可以輕易地進行(而不是傷筋動骨地大動)。要作到這幾點其實並不容易,它須要咱們持續不斷地對系統內部質量進行優化與改進。這,就是系統重構的價值。 下面一個重要問題是哪些地方須要重構?有臭味道(Bad Smell)的代碼。 什麼是臭味道?想象一下你打開冰箱門,出來一股臭味道你就知道冰箱裏有東西腐壞了,要清除了。代碼同樣有臭味道:

臭味行列中首當其衝的就是Duplicated Code(重複的代碼)。若是你在一個以上的地點看到相同的程序結構,那麼當可確定:設法將它們合而爲一,程序會變得更好。

  • 最單純的Duplicated Code就是[同一個class內的兩個方法含有相同表達式(expression)]。這時候你須要作的就是採用Extract Method提煉出重複的代碼,而後讓這兩個地點都調用被提煉出來的那一段代碼。
  • 另外一種常見狀況就是[兩個互爲兄弟(sibling)的subclasses內含有相同表達式]。要避免這種狀況,只須要對兩個classes都使用Extract Method,而後再對被提煉出的代碼使用Pull Up Method,將它推入superclass內。
  • 若是代碼之間只是相似,並不是徹底相同,那麼就得運用Extract Method將類似部分和差別部分割開,構成單獨一個方法。而後你可能發現或許能夠運用Form Template Method得到一個Template Method設計模式。
  • 若是有些方法以不一樣的算法作相同的事,你能夠擇定其中較清晰的一個,並使用Substitute Algorithm將其它方法的算法替換掉。
  • 若是兩個絕不相關的classes內出現Duplicaded Code,你應該考慮對其中一個使用Extract Class,將重複代碼提煉到一個獨立class中,而後在另外一個class內使用這個新class。可是,重複代碼所在的方法也可能的確只應該屬於某個class,另外一個class只能調用它,抑或這個方法可能屬於第三個class,而另兩個classes應該引用這第三個class。你必須決定這個方法放在哪兒最合適,並確保它被安置後就不會再在其它任何地方出現。

其餘Bad Smell與相應的重構手法以下表所示:

圖片描述信息

Eclipse中Refactor菜單中的重構手法的應用時機以下圖所示:

圖片描述信息

更完整的手法能夠參考《重構》做者Martin Fowler的博客。Eclipse中基本手法的使用你們能夠參考任何人均可以重構來進行學習實踐。

一個完整的重構流程包括:

  1. 從版本控制系統代碼庫中Check out code
  2. 讀懂代碼(包括測試代碼)
  3. 發現bad smell
  4. Refactoring
  5. 運行全部的Unit Tests
  6. 往代碼庫中Check in code

咱們結合Git給出一個比較完整的例子。

(六)實踐項目

1. 以結對編程的方式編寫一個軟件,Blog中要給出結對同窗的Blog網址,能夠拍照展示結對編程狀況,能夠參考一下其餘學校的做業

隊友blog網址:http://home.cnblogs.com/u/christyalaa/

2.代碼  

      基本計算器



3.GUI界面

//面板容器類file name:CalculatorPanelClass.java
package Game.Calculator;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class CalculatorPanelClass extends JPanel
{
private JLabel display;
private JPanel panel;
private double result;
private String lastCommand;
private boolean start;

public CalculatorPanelClass()
{
setLayout(new BorderLayout());
result = 0;
lastCommand = "=";
start = true;;

display = new JLabel("0",SwingConstants.RIGHT);
display.setForeground(Color.black); //設置前景顏色

display.setBorder(BorderFactory.createCompoundBorder(
BorderFactory.createLineBorder(Color.black),
BorderFactory.createEmptyBorder(5,5,5,5)));

add(display, BorderLayout.NORTH);
ActionListener insert = new InsertAction();
ActionListener command = new CommandAction();

panel = new JPanel();
panel.setLayout(new GridLayout(4,4));//計算器按鈕

addButton("7",insert);
addButton("8",insert);
addButton("9",insert);
addButton("/",command);
addButton("4",insert);
addButton("5",insert);
addButton("6",insert);
addButton("*",command);
addButton("1",insert);
addButton("2",insert);
addButton("3",insert);
addButton("-",command);
addButton("0",insert);
addButton(".",insert);
addButton("=",command);
addButton("+",command);
add(panel,BorderLayout.CENTER);
}
//在面板容器中添加按鈕組件
private void addButton(String label,ActionListener listener)
{
JButton button = new JButton(label);
button.addActionListener(listener);
panel.add(button);
}
//處理單擊數字按鈕事件的監聽器類
private class InsertAction implements ActionListener
{
public void actionPerformed(ActionEvent event)
{
String input = event.getActionCommand();
if (start)
{
display.setText("");
start = false;
}
display.setText(display.getText() + input);
}
}
//處理單擊命令按鈕事件的監聽器類
private class CommandAction implements ActionListener
{
public void actionPerformed(ActionEvent evt)
{
String command = evt.getActionCommand();
if(start)
{
lastCommand = command;
}
else
{
calculate(Double.parseDouble(display.getText()));
lastCommand = command;
start = true;
}
}

}
public void calculate(double x)
{
if (lastCommand.equals("+"))
{
result += x;
}else if (lastCommand.equals("-"))
{
result -= x;
}else if (lastCommand.equals("*"))
{
result *= x;
}else if (lastCommand.equals("/"))
{
result /= x;
}else if (lastCommand.equals("="))
{
result = x;
}
display.setText("" +result);
}
}

 

//定義外層窗口類CalculatorFrameClass
//file name:CalculatorFrameClass.java
package Game.Calculator;
import java.awt.*;

import javax.swing.*;
public class CalculatorFrameClass extends JFrame//外層窗口類
{
public CalculatorFrameClass()
{
setTitle("Calculator");
Container contentPane = getContentPane();
CalculatorPanelClass panel = new CalculatorPanelClass();
contentPane.add(panel);
setSize(400,400);
setVisible(true);
setResizable(false);
}
}

 

//測試類TestCalculatorClass.java
package Game.Calculator;
import javax.swing.*;
public class TestCalculatorClass
{
public static void main(String[] args)
{
CalculatorFrameClass frame = new CalculatorFrameClass();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

}
}

 

 

4.實驗報告中統計本身的PSP(Personal Software Process)時間

步驟 耗時 百分比
需求分析  半天  20%
設計  半天  20%
代碼實現  一天  40%
測試  半天  20%
分析總結  

3、實驗中遇到的問題

1.vim的使用

(1)保存及其餘方法

第一級

當你安裝好一個編輯器後,你必定會想在其中輸入點什麼東西,而後看看這個編輯器是什麼樣子。但vim不是這樣的,按照下面的命令操做:

  • 啓 動Vim後,vim在 Normal 模式下。
  • 讓咱們進入 Insert 模式,請按下鍵 i 。(陳皓注:你會看到vim左下角有一個–insert–字樣,表示,你能夠以插入的方式輸入了)
  • 此時,你能夠輸入文本了,就像你用「記事本」同樣。
  • 若是你想返回 Normal 模式,請按 ESC 鍵。

如今,知道如何在 Insert 和 Normal 模式下切換了。下面是一些命令:

  • i → Insert 模式,按 ESC 回到 Normal 模式.
  • x → 刪當前光標所在的一個字符。
  • :wq → 存盤 + 退出 (:w 存盤, :q 退出)   (陳皓注::w 後能夠跟文件名)
  • dd → 刪除當前行,並把刪除的行存到剪貼板裏
  • p → 粘貼剪貼板

推薦:

  • hjkl (強例推薦使用其移動光標,但沒必要需) →你也可使用光標鍵 (←↓↑→). 注: j 就像下箭頭。
  • :help <command> → 顯示相關命令的幫助。你也能夠就輸入 :help 而不跟命令。(陳皓注:退出幫助須要輸入:q)

你能在vim倖存下來只須要上述的那5個命令,你就能夠編輯文本了,你必定要把這些命令練成一種下意識的狀態。因而你就能夠開始進階到第二級了。

當是,在你進入第二級時,須要再說一下 Normal 模式。在通常的編輯器下,當你須要copy一段文字的時候,你須要使用 Ctrl 鍵,好比:Ctrl-C。也就是說,Ctrl鍵就好像功能鍵同樣,當你按下了功能鍵Ctrl後,C就不在是C了,並且就是一個命令或是一個快鍵鍵了,在VIM的Normal模式下,全部的鍵就是功能鍵了。這個你須要知道。

標記:

  • 下面的文字中,若是是 Ctrl-λ我會寫成 <C-λ>.
  • 以 : 開始的命令你須要輸入 <enter>回車,例如 — 若是我寫成 :q 也就是說你要輸入 :q<enter>.

第二級

上面的那些命令只能讓你存活下來,如今是時候學習一些更多的命令了,下面是個人建議:(陳皓注:全部的命令都須要在Normal模式下使用,若是你不知道如今在什麼樣的模式,你就狂按幾回ESC鍵)

  1. 各類插入模式
    • a → 在光標後插入
    • o → 在當前行後插入一個新行
    • O → 在當前行前插入一個新行
    • cw → 替換從光標所在位置後到一個單詞結尾的字符
  2. 簡單的移動光標
    • 0 → 數字零,到行頭
    • ^ → 到本行第一個不是blank字符的位置(所謂blank字符就是空格,tab,換行,回車等)
    • $ → 到本行行尾
    • g_ → 到本行最後一個不是blank字符的位置。
    • /pattern → 搜索 pattern 的字符串(陳皓注:若是搜索出多個匹配,可按n鍵到下一個)
  3. 拷貝/粘貼 (陳皓注:p/P均可以,p是表示在當前位置以後,P表示在當前位置以前)
    • P → 粘貼
    • yy → 拷貝當前行當行於 ddP
  4. Undo/Redo
    • u → undo
    • <C-r> → redo
  5. 打開/保存/退出/改變文件(Buffer)
    • :e <path/to/file> → 打開一個文件
    • :w → 存盤
    • :saveas <path/to/file> → 另存爲 <path/to/file>
    • :x, ZZ 或 :wq → 保存並退出 (:x 表示僅在須要時保存,ZZ不須要輸入冒號並回車)
    • :q! → 退出不保存 :qa! 強行退出全部的正在編輯的文件,就算別的文件有更改。
    • :bn 和 :bp → 你能夠同時打開不少文件,使用這兩個命令來切換下一個或上一個文件。(陳皓注:我喜歡使用:n到下一個文件)

花點時間熟悉一下上面的命令,一旦你掌握他們了,你就幾乎能夠幹其它編輯器都能幹的事了。可是到如今爲止,你仍是以爲使用vim仍是有點笨拙,不過不要緊,你能夠進階到第三級了。

(2)建立文件時注意的問題

在學會vim的使用方法後發現仍找不到文件,如圖

才知道建立時命名錯誤。

4、實驗總結

一開始不懂vim使用,浪費了好多時間。之後要作好準備工做。

相關文章
相關標籤/搜索