vim思想和技巧

這不是一篇vim命令的集合,也不是一篇vim插件的推薦,是在什么插件都不裝的前提下看看運用vim的思想和技巧到底能解決什么,再去思索我需要裝什么插件來做到光靠原生vim做不到的事情

思想

一.點命令

? 1. 點命令可以重復上次修改,上一次修改可以是xdd等在普通模式下的命令,也可以是進入插入模式直至返回普通模式的一系列操作

二.不要自我重復

? 假如你要給當前行以后的15行的末尾都添加分號

  • 方法一: 按A;<Esc>,然后按jA;<Esc>一直重復呢,或許可以達到效果,但是卻已經陷入自我重復了,就像寫很多相似的代碼的時候一樣需要思索一下了
  • 方法二:按A;<Esc>,然后按j.,前面第一點說了,點命令可以重復上一次的修改,這里的上一次修改就是A;<Esc>,所以按j.就可以實現我們想要的效果,這個操作也是理想的編輯模式,即一次按鍵移動j,另一次按鍵操作.

三.一次修改的粒度

  1. 我們很多時候需要撤銷我們輸入的內容,會按u鍵來撤銷
  2. 假如我們這次插入模式輸入的已經有十行了,也許你只想撤銷第十行的內容,這時你按<Esc>u,你會發現十行全部被撤銷了,這就是一次修改的粒度過大了,這和vscode中的不一樣,每次<command-z>只會撤銷一行的內容,所以在vim中我們需要自己控制好上一次修改的粒度,每次思索代碼沒有輸入的時候可以按<Esc>退回到普通模式,可以實現修改粒度的切分

四.只要可能,就用操作符命令,而不是可視模式

  1. import React, { FC, useMemo, useEffect } from 'react'比如你想刪除這里的第一個單詞import,方式一可以用daw實現,方式二用vawd。在其他編輯器的模式下我們通常會選擇方式二,即先選擇區域再做操作,但是vim中可以先選擇操作再選擇范圍選擇方式一的好處就是可以使用.命令,可以繼續刪除下一個單詞,但是使用方式二的可視模式的話,你會發現它只是每次都刪除7個字符,因為第一次的vawd 操作的是import加一個空格
小眾模式

一.操作符待決模式

  1. 你也許知道vim中有四種模式:普通模式,插入模式,可視模式,命令行模式,但還有操作符待決模式
  2. vim中有一條額外的規則,當一個操作符命令被連續調用兩次時,它會作用于當前行
  3. 什么是操作符待決模式,d是刪除的操作符,< 是減少縮進的操作符,可是我們按dd才是刪除一行,<<才是減少縮進一行,其實我們在按下第一個d的時候進入了一個操作符待決模式,只是這個模式是個短暫的存在,直到接收到我們下一個動作命令,才完成整個操作,比如dd,第一個d是是操作符,第二個d時說要刪除整行,所以同理cc就是刪除整行并插入,yy就是復制整行,dap,就是刪除整個段落,gUap就是將整個段落大寫
  4. 可以將操作符和查找動作結合起來使用d/staff<cr>可以刪除從當前光標到staff前面的內容
  5. 可以將操作符待決模式和文本對象結合起來,在操作符待決模式中,i 不再是切換到插入模式并將光標置于字符前,a也不是將光標置于字符后,而是當作文本對象的組成部分。因為aw會刪除當前單詞加一個空格,iw只刪除當前單詞的特性,c命令適合和iw等配合,d命令則適合和aw等配合
  6. 很多命令都是兩個或更多按鍵,比如<C-w> s 會水平切分此窗口,但是<C-w>只是第二個按鍵的前綴,可以當作命名空間,但是他們并不會激活操作符待決模式,因為只有操作符才會激活操作符待決模式

二. 插入-普通模式

1.有時候會在插入模式的情況下想使用普通模式的命令,可以不需要按<Esc>, <C-o> 切換到插入-普通模式,當在插入模式時,想要運行一個普通模式命令,然后馬上繼續輸入的時候可以用這個命令。比如想滾動一下屏幕,讓當前行顯示在窗口正中,以更好地閱讀,然后繼續插入,可以按<C-o>zz。再比如在當前行操作完畢,想到下方10行的地方進行操作,可以按<C-o>10j

三. 選擇模式

1.可視模式下,當選中一段文本后,再按<C-g>可以切換到選擇模式,再輸入任意可見字符,如p,這個選中的文本將會被刪除,并顯示你輸入的字符p,并切換到插入模式,但是在可視模式下,會將這些字符當作命令,p會被認為是粘貼

技巧

一.和shell進行切換

  1. <C-z>可以讓vim掛起,進入到shell中,fg可以從shell返回到vim

二.退出了插入模式在文檔中移動,然后又想快速回到退出的地方繼續編輯,用gi命令

三.位置標記

? 1. 可以在退出這次修改的時候用m{letter}設置一個標記,這個{letter}需要是大寫,作為全局標記,如果是小寫則是局部緩沖區的標記,設置大寫字母的話下次再次打開vim的時候可以用``{letter}`快速的回到上次的文件,這是我用來回到前一天沒寫完的代碼的地方最快的方式

四.將下/上個查找所在的行居中

noremap <Leader>n nzz 
noremap <Leader>N Nzz

五.自動填充當前文件所在的目錄地址

  1. cnoremap <expr> %% getcmdtype( ) == ':' ? expand('%:h').'/' : '%%'把這個加入到vimrc中可以用%%就能自動填充當前文件所在的目錄地址

  2. cnoremap表示在命令行模式下進行映射

  3. <expr>表示將映射命令的右邊參數當作一個表達式來對待

  4. 當我們輸入%% 將會得到表達式getcmdtype( ) == ':' ? expand('%:h').'/' : '%%'運算的結果

  5. 這個表達式通過getcmdtype()獲取當前命令行模式的類型,:表示是命令行模式,expand()函數對通配符進行擴展,其中傳入的參數為%:h,即獲取當前緩沖區的地址并去掉文件名

  6. 這個映射本身就是在命令行模式下的映射,不需要getcmdtype() 再去判斷是不是命令行模式,所以親測如下命令也可以生效,cnoremap <expr> %% expand('%:h').'/'

六.命令行搜索歷史命令

  1. 可以讓手指不離開本位行(hjkl所在的行),但是同樣可以根據已輸入的字符當作過濾條件查找已輸入過的命令,<Up>會篩選,<C-p>不會,如輸入set high會根據已經輸入的進行篩選
cnoremap <C-p> <Up>
cnoremap <C-n> <Down>

七.取消上下左右鍵的作用,強迫自己不使用上下左右鍵

noremap <Up> <Nop>
noremap <Down> <Nop>
noremap <Left> <Nop>
noremap <Right> <Nop>

八.實際行和屏幕行

  1. 當開啟很多分屏后,會出現實際行和屏幕行,即文件中的一行會被顯示為屏幕上的若干行
  2. jk會根據實際行向下或向上移動,而gjgk則是按屏幕行向下或向上移
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 官網 中文版本 好的網站 Content-type: text/htmlBASH Section: User ...
    不排版閱讀 4,435評論 0 5
  • dpkg 學習 安裝mysql apt-get install mysql-server-5.6 apt-get ...
    sharonji閱讀 450評論 0 0
  • Vim幾句話介紹Vim是Unix系統上的文本編輯軟件(你該不會不知道什么是文本編輯軟件吧!),在windows上也...
    何必遠方閱讀 3,194評論 0 3
  • 自我總結篇: 對文件的操作技巧: vim文件一個有三種狀態:命令(瀏覽/輸入命令轉變末行模式),文本(添加/編輯/...
    小知大知閱讀 814評論 0 0
  • vim 選擇文本,刪除,復制,粘貼 文本的選擇,對于編輯器來說,是很基本的東西,也經常被用到,總結如下: v 從...
    壹首簡單的歌閱讀 889評論 0 7