主頁 >  其他 > 主題 3 編輯器(Vim)

主題 3 編輯器(Vim)

2023-07-03 07:42:25 其他

主題 3 編輯器(Vim)

編輯器 (Vim) · the missing semester of your cs education (missing-semester-cn.github.io)

代碼編輯器和和其他的編輯器(比如用來寫文章的編輯器)有一些不同,

因為寫程式和寫文章不同,當你寫程式時,會花大量時間來閱讀你寫的東西,或者來移動游標,做一些小小的修改;而不是像寫文章的時候,從上到下一氣呵成,因此,對于不同的用途,我們會使用不同的編輯器,

1.編輯器選擇

Stack Overflow 的調查顯示,VS Code 是目前最流行的代碼編輯器,而 Vim 則是最流行的基于命令列的編輯器,就算最終你沒有打算長期使用Vim,我們仍然認為學習Vim背后的思想很有價值,

另外,許多工具也覺得 vim 哲學很棒,從而提供了 Vim 模式,例如當前最熱門的 VS Code,支持 Vim 鍵位系結,該插件已經被下載了數百萬次,

2.Vim的思想

Vim 是一個基于模式(Modal)的編輯器,這意味著 Vim 有多個模式,

Modal 這個詞源于 Mode

多模式的思想源于,當你在寫程式的時候會經常做不同的事情,在編程的時候,你會把大量時間花在閱讀/編輯而不是在寫代碼上,

所以 Vim 是一個多模態編輯器:它對于插入文字和操縱文字有不同的模式,

Vim 是可編程的(可以使用 Vimscript 或者像 Python 一樣的其他程式語言),

Vim 的介面本身也是一個程式語言:鍵入操作(以及其助記名) 是命令,這些命令也是可組合的,Vim 避免了使用滑鼠,因為那樣太慢了;Vim 甚至避免用上下左右鍵因為那樣需要太多的手指移動,

這樣的設計思想使得 Vim 成為了一個能跟上你思維速度的編輯器,

3.編輯模式

正常模式:Normal,在檔案中四處移動游標進行修改

插入模式:Insert,插入文本

替換模式:replace,替換文本

可視化模式(一般,行,塊):Visual,Visual Line,Visual Block,選中文本塊

命令列模式:Command Line,用于執行命令


  • Normal 正常模式 & Insert 插入模式

當你開始使用 Vim 時,它會在 Normal 模式下啟動,

在這個模式下,各種鍵位組合擁有在這個模式下的特定意義,其中就有一些按鍵組合來切換到其他的模式,而切換后這些鍵位組合和意義也相應改變,

但你的大部分時間都會在 Insert 和 Normal 模式下,在Normal模式下按下i鍵就可以進入Insert模式,而在Insert模式下按下Esc就可以回到Normal模式,

這里注意一下我們表示按鍵的方式,這個表示方式將會用于筆記以及Vim給你的提示中:

當僅僅是代表i鍵這樣一個按鍵本身時,那么就會直接寫i,但是對于如Ctrl+v這種按鍵組合,就有可能以這么幾種形式來體現:

第一種是一個脫字符號后跟著控制用字符:^v(這里控制用字符指v,也就是組合鍵中的另一個鍵),另一種寫法可能是你最熟悉的:Ctrl-v,而有的地方我們可能會寫成:<c-v>

Vim 有好幾種模式,而 Normal 模式是用來移動游標、閱讀東西,以及在檔案間切換的,

而 Insert 模式是用來輸入的,因此在 Insert 模式下,你的按鍵大多會直接進入 buffer(緩沖區),而在 Normal模式下則不然,它們不會進入 buffer,而是用來進行了一些瀏覽和編輯操作,

  • replace 替換模式

不像插入模式那樣會把字符往后移,替換模式會直接覆寫掉文本,

  • 可視化模式(一般,行,塊)

可視化模式有 Visual 模式,Visual Line 模式,以及一個 Visual Block 模式,

  • 各種模式的切換

你可以按下 <ESC>(退出鍵)從任何其他模式回傳正常模式,在正常模式,鍵入 i 進入插入 模式,R 進入替換模式,v 進入可視(一般)模式,shift+V 進入可視(行)模式,<C-v> (Ctrl-V, 有時也寫作 ^V)進入可視(塊)模式,: 進入命令模式,

image-20230106005400023
  • 映射Esc鍵

從非 Normal 模式切換到 Normal 模式下都是按 Esc 鍵,因此使用 Vim 時要頻繁按 Esc 鍵,但這個鍵在鍵盤的角落里,按起來很不方便,所以很多人會將鍵盤上某個鍵映射成 Esc,通常這個鍵是 Caps Lock ,因為它在鍵盤的中間一行上,

4.基本操作

  • 如何打開Vim程式

Vim 是一個基于命令列的編輯器,我們要打開 Vim,只需要在命令列中鍵入 vim

vim 也可以接收引數,當我們想用它直接編輯特定的檔案時,可以在 vim 后面加上檔案的路徑+檔案名,

[lighthouse@VM-8-17-centos vim]$ ls
poem.md
[lighthouse@VM-8-17-centos vim]$ vim poem.md 

4.1插入文本

Vim 以 Normal 模式啟動,在 normal 模式下按下i鍵,進入 Insert 模式,螢屏左下角將會提示--INSERT--,在插入模式下按下<esc>鍵,可以回傳 Normal 模式,

左下角總會顯示你所在的模式,但 Nomal 模式下是空白的,

4.2命令列

在 Normal 模式按下 : (冒號)將會進入命令列模式,這時你的游標將會跳到螢屏左下方的命令列,這個模式有很多功能,包括打開,保存,關閉檔案,退出 vim,

在命令列模式下:

命令 釋義
:q / :quit 退出(關閉視窗)
:w / :wirite 保存檔案
:wq 保存并退出
:ls 顯示打開的快取
:e {檔案名} 打開對應檔案
:help <特定鍵/特定命令> 打開幫助檔案

注意,這里的特定命令和特定鍵不同,如 :help :w 表示獲取命令 :w 的說明,而 :help w 表示在 Normal 模式下 w 鍵的說明,

4.3buffer, tab, window

Vim 會維護一系列打開的檔案(buffer),稱為快取,

一個 Vim 會話包含一系列標簽頁(tab),每個標簽頁包含一系列視窗(window,分隔面板),每個視窗顯示一個快取(buffer),

跟普通的程式不一樣的是, 快取和視窗不是一一對應的關系;視窗只是視角,一個快取可以在多個視窗打開,甚至在同一個標簽頁內的多個視窗打開,這個功能其實很好用,比如在查看同一個檔案的不同部分的時候,

Vim 默認打開一個標簽頁,這個標簽包含一個視窗,

如何理解并正確使用 Vim 中的 Buffer , Window 和 Tab

Vim Tab Madness. Buffers vs Tabs

5.Vim的介面是一種編程語言

Vim 最重要的設計思想是 Vim 的界面本身是一個程式語言,你可以鍵入命令來對檔案,視窗等進行操作,而不僅僅是編輯字符,

5.1移動命令

Normal 模式下:

  • 基本移動: h j k l (左, 下, 上, 右)

  • 以詞為單位:

    • w (word,向前移動一個單詞)
    • b (beginning of word,向后移動一個單詞)
    • e (end of word,移動到單詞末尾)
  • 以行為單位:

    • 0 (到行首)
    • ^ (到本行第一個非空格字符)
    • $ (到行末)
  • 螢屏: H (Highest,螢屏首行), M (Middle,螢屏中間), L (Lowest,螢屏底部)

  • 翻頁: Ctrl-u (上翻), Ctrl-d (下翻)

  • 檔案: gg (到檔案最開始), G (到檔案最底部)

  • 行數: :{行數}<CR> 或者 {行數}G ({行數}為行數)

  • 雜項: % (找到配對,比如括號或者 /* */ 之類的注釋對)

  • 查找:f{字符}t{字符}F{字符}T{字符}

    • f{字符}/t{字符} :相對于游標,在本行向前查找的第一個匹配的{字符}

    • F{字符}/T{字符} :相對于游標,在本行向后查找的第一個匹配的{字符}

      相對于f/F,t/T 查找的游標不會落在匹配的字符上,而是落在匹配的字符的前一個/后一個字符

    • ,/; 用于導航匹配

  • 搜索:/{正則運算式}n/N 用于導航匹配,Esc+u 撤銷搜索高光顯示

5.2編輯命令

在 Normal 模式下:

  1. 按下i,進入insert模式

  2. 按下 o 鍵,可以在游標下面開(open)新的一行,同時切入 Insert 模式,

  3. 按下 O鍵,在游標上面開新的一行,同時切入 Insert 模式

  4. d{移動命令},命令可以配合移動命令來選擇洗掉范圍

    • dw 洗掉詞
    • d0 洗掉到行首
    • d3l 向右洗掉3個字符
    • de 從當前位置開始洗掉到詞末
  5. c{移動命令},和上面命令相似,不同的是它洗掉后會進入insert模式(c代表change)

    • cw 洗掉詞,并進入insert模式
    • c$ 洗掉到行尾,并進入到insert模式

    c 和 d 這兩個命令很像,它們都會接受一個操作范圍作為引數,然后按照操作的范圍進行洗掉或者更改,不同在于c命令會進入insert模式,d命令不會

  6. 如果按下某個編輯鍵兩次,它將作用于當前行

    • dd 洗掉當前行
    • cc 洗掉當前行,并進入insert模式
  7. x 洗掉一個字符(等于dl

  8. r 替換一個字符

  9. u 撤銷操作,最早可以回到你打開的狀態

  10. ctrl+r 重做操作

  11. y 賦值(yank,提取,拉拽),y 也接收一個操作范圍作為引數

    • yy 復制當前行
    • yw 復制單詞
  12. p 粘貼

5.3選擇命令

Visual 模式下可以使用大多數 Normal 模式下的移動命令移動游標,它會自動選中移動范圍的文本,然后可以對其進行操作,其中最常用的就是復制(y)這段文本,復制完后會自動退回普通模式,

  1. 普通 Visual 模式(normal 模式下按 v 進入)

  2. Visual Line 模式(normal 模式下按 V 進入),它的操作以行為單位,一次可以選擇一行文字,

  3. Visual Block 模式(normal 模式下按 ctrl+v 進入),它可以選擇矩形的文字塊,其他與上述模式類似,

5.4計數

數字可以和移動、編輯、選擇命令結合,

例如:4j:表示執行j命令4次,游標向下移動4行;5w:執行w命令5次,游標向前移動5個單詞,或者在普通visual模式下,按10e,就可以向右選中單詞10次;

還可以和編輯命令結合,例如:7dw,表示執行dw命令7次,向右洗掉7個單詞,

5.5修飾語

你可以用修飾語改變“名詞”的意義,修飾語有 i,表示“內部”或者“在內“(inside),和 a, 表示”周圍“(around),

  • ci( 洗掉當前括號()之內的內容;di(洗掉包括()在內的內容
  • ci[ 改變當前方括號[]之內的內容;di[洗掉包括[]在內的內容
  • da' 洗掉一個單引號字串, 包括周圍的單引號

6.演示

這里有一個存在bug的代碼fizz_buzz,使用vim來快速修改它:

fizz_buzz是一個輸出1到n的練習,當數字能被3整除時,輸出fizz;當數字能被5整除時,輸出buzz;當數字同時能被3和5整除時,輸出fizzbuzz;如果這些條件都不滿足,就直接輸出數字,

例如:1,2,fizz,4,buzz,...

def fizz_buzz(limit):
    for i in range(limit):
        if i % 3 == 0:
            print('fizz')
        if i % 5 == 0:
            print('fizz')
        if i % 3 and i % 5:
            print(i)

def main():
    fizz_buzz(10)

問題和解決操作:

問題一:主函式沒有被呼叫:

  • G 跳到檔案尾

  • o 向下打開一個新行

  • 輸入 “if name …”

    image-20230702203107323

問題二:fizz_buzz命令應該從 0 而不是 1 開始

  • 搜索 /range

  • ww 向前移動兩個詞

  • i 插入文字 1,

  • ea 在 limit 后插入 +1(a表示append)

    image-20230702203546012

問題三:在 5 的整數倍的時候列印 “fizz”

  • 搜索/fizz,按n搜索下一個,一直到第三個"fizz“

  • 鍵入ci' ,再將“fizz”改為“buzz”

    image-20230702204143984

問題四:在 15 的整數倍的時候在換行列印了 “fizz” 和 “buzz”

  • 在第四行,鍵入$i 插入文字到行尾,然后加入內容 , end=''

    image-20230702205352245
  • 想要對下兩行如法炮制,先鍵入jj跳到下兩行,然后鍵入. (在vim中按下.會重復之間的編輯命令)

    image-20230702205518880
  • jjo 在 if 打開一行

  • 加入 “else: print()”

問題五:采用了硬編碼的引數 10 而沒有從命令控制行讀取引數

  • gg回到檔案頭,O 向上打開新行,然后鍵入內容“import sys”,然后回到normal模式

    image-20230702210151378
  • 鍵入/10,跳到10文字處,然后鍵入ci( 命令,添加內容: int(sys.argv[1])

    image-20230702210132892

7.自定義Vim

Vim 由一個位于 ~/.vimrc 的文本組態檔(包含 Vim 腳本命令),

在這兒下載我們的設定,將它保存成 ~/.vimrc

Vim 能夠被重度自定義,你可以參考其他人的在 GitHub 上共享的設定檔案如:Anish, Jon (uses neovim), Jose,

8.擴展Vim

9.其他程式的Vim模式

10.Vim 進階

11.拓展資料

12.課后練習

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/556504.html

標籤:其他

上一篇:【筆試實戰】LeetCode題單刷題-編程基礎 0 到 1【一】

下一篇:返回列表

標籤雲
其他(162001) Python(38266) JavaScript(25520) Java(18286) C(15238) 區塊鏈(8275) C#(7972) AI(7469) 爪哇(7425) MySQL(7281) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5876) 数组(5741) R(5409) Linux(5347) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4609) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2438) ASP.NET(2404) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) .NET技术(1985) HtmlCss(1983) 功能(1967) Web開發(1951) C++(1942) python-3.x(1918) 弹簧靴(1913) xml(1889) PostgreSQL(1882) .NETCore(1863) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 主題 3 編輯器(Vim)

    # 主題 3 編輯器(Vim) [編輯器 (Vim) · the missing semester of your cs education (missing-semester-cn.github.io)](https://missing-semester-cn.github.io/2020/edi ......

    uj5u.com 2023-07-03 07:42:25 more
  • 【筆試實戰】LeetCode題單刷題-編程基礎 0 到 1【一】

    摘要: 博客推行版本更新,成果積累制度,已經寫過的博客還會再次更新,不斷地琢磨,高質量高數量都是要追求的,工匠精神是學習必不可少的精神。因此,大家有何建議歡迎在評論區踴躍發言,你們的支持是我最大的動力,你們敢投,我就敢肝 ......

    uj5u.com 2023-07-03 07:42:13 more
  • MBR初認識

    1.什么是MBR 說實話,我一直都不喜歡在一大堆內容一開始就拋出一長條概念,這很勸退,但現在記錄一下是很有必要的,否則后續忘記就難理解了。 簡單來講,MBR記錄著硬碟各個磁區的大小和位置資訊,就像人口普查一樣,對整個硬碟的分布了熟于心。它是開機后訪問硬碟時要讀取的第一個扇區,不難理解,畢竟要知道自己 ......

    uj5u.com 2023-07-03 07:42:06 more
  • 最優化問題簡介及優秀教材《凸優化》介紹

    前言 最優化廣泛應用于科學與工程計算、資料科學、機器學習、人工智能、影像和信號處理、金融和經濟、管理科學等眾多領域。 最優化問題可以歸納為如下定義: 最優化問題一般很難求解,除了一些特例。目前已經發展成熟的,能夠有效求解的最優化問題可以歸為以下三類: 最小二乘問題 least-squares pro ......

    uj5u.com 2023-07-03 07:41:38 more
  • 【筆試實戰】LeetCode題單刷題-編程基礎 0 到 1【一】

    摘要: 博客推行版本更新,成果積累制度,已經寫過的博客還會再次更新,不斷地琢磨,高質量高數量都是要追求的,工匠精神是學習必不可少的精神。因此,大家有何建議歡迎在評論區踴躍發言,你們的支持是我最大的動力,你們敢投,我就敢肝 ......

    uj5u.com 2023-07-03 07:41:08 more
  • 主題 3 編輯器(Vim)

    # 主題 3 編輯器(Vim) [編輯器 (Vim) · the missing semester of your cs education (missing-semester-cn.github.io)](https://missing-semester-cn.github.io/2020/edi ......

    uj5u.com 2023-07-03 07:40:39 more
  • MBR初認識

    1.什么是MBR 說實話,我一直都不喜歡在一大堆內容一開始就拋出一長條概念,這很勸退,但現在記錄一下是很有必要的,否則后續忘記就難理解了。 簡單來講,MBR記錄著硬碟各個磁區的大小和位置資訊,就像人口普查一樣,對整個硬碟的分布了熟于心。它是開機后訪問硬碟時要讀取的第一個扇區,不難理解,畢竟要知道自己 ......

    uj5u.com 2023-07-03 07:39:44 more
  • 【專案報告】編程技術刷題報告【編號:刷題01號】

    摘要: 博客推行版本更新,成果積累制度,已經寫過的博客還會再次更新,不斷地琢磨,高質量高數量都是要追求的,工匠精神是學習必不可少的精神。因此,大家有何建議歡迎在評論區踴躍發言,你們的支持是我最大的動力,你們敢投,我就敢肝 ......

    uj5u.com 2023-07-03 07:39:22 more
  • AtCoder Beginner Contest 308

    > 這幾天在收拾東西搬家,先附上代碼,晚點補上題解 > 感覺這次FG都寫不太明白 ## [A - New Scheme (abc308 A)](https://atcoder.jp/contests/abc308/tasks/abc308_a) ### 題目大意 給定八個數,問是否滿足以下要求: - ......

    uj5u.com 2023-07-02 07:53:58 more
  • C++ 核心指南之資源管理(下)—— 智能指標最佳實踐

    > C++ 核心指南(C++ Core Guidelines)是由 Bjarne Stroustrup、Herb Sutter 等頂尖 C+ 專家創建的一份 C++ 指南、規則及最佳實踐。旨在幫助大家正確、高效地使用“現代 C++”。 > > 這份指南側重于介面、資源管理、記憶體管理、并發等 High ......

    uj5u.com 2023-07-02 07:53:53 more