vim文本編輯器

vi簡介

vi:Visual Interface,是一種功能強大的文本編輯器,工作在字符模式下,它可執行輸出、輸出、查找、替換、塊等衆多文本操作,不需要圖形界面,因此執行起來效率會非常高,主要用來編輯純文本文件,常見的編碼有,ASCII,Unicode等等



文本編輯器的種類:

    行編輯器:逐行來對文本進行處理的工具,如sed

    全屏編輯器:佔據整個屏幕進行編輯,如nano,vi


vim工作模式

    輸入模式:在文本文件當中輸入內容

    命令模式:可執行一些編輯命令

    末行模式:vim內置的命令行接口,執行vim的內置命令


vim的使用


打開文件

    vim [OPTIONS] FILE...

    +#:打開文件光標處在第#行

    +:打開文件光標處在最後一行

    +/pattern:打開文件光標處在第一次被pattern所匹配到的行

    -b:二進制方式打開文件

    -d:比較兩個文件的不同之處

    -m:制度方式打開文件



模式轉換

    默認爲命令模式

    命令模式 --> 輸入模式

        -i:在當前光標處輸入

        -a:在當前光標後方輸入

        -o:在當前光標下方新建一行轉爲輸入

        -I:在當前光標所在行的行首輸入

        -A:在當前光標所在行的行尾輸入

        -O:在當前光標上方新建一行轉爲輸入


    鎖定和解鎖:

        ctrl+s:鎖定

        ctrl+q:解鎖

    

    輸入模式 --> 命令模式

       

    

    編輯模式 --> 末行模式

        :

    

    末行模式 --> 編輯模式

        Esc、Esc

        注意:輸入模式需要先轉爲命令模式然後再轉爲末行模式

    

關閉保存文件:

    命令模式

        ZZ:保存並退出

        ZQ:不保存退出

    

    末行模式:

        w:保存文本不退出

        q:不保存退出

        wq:保存並退出

        wq!:強制保存並退出

        x:保存並退出

        w /PATH/TO/SOMEFILE:將文件內容保存至指定文件中

        r /PATH/TO/SOMEFILE:將指定文件的內容讀取至當前文件中

        ! COMMAND:可臨時執行shell命令

        r! COMMAND:將命令的執行結果添加至當前光標下方

    

光標跳轉:

    字符間跳轉:

        h:左

        j:下

        k:上

        l:右

        #COMMAND:跳轉#個字符

    

    單詞間跳轉:

        w:跳轉至下個單詞的詞首

        e:跳轉至下個單詞的詞尾

        b:跳轉至上個單詞的詞首

        #COMMAND:跳轉#個單詞

    

    行尾行首跳轉:

        ^:非空白字符行首

        0:絕對行首

        $:跳轉至行尾

        

    當前頁面跳轉

        H:頁首

        M:頁中

        L:頁尾

    

    行間跳轉:

        #G:跳轉至第#行

        G:跳轉至尾行

        gg:跳轉至首行

    

    句間跳轉:以.爲分隔

        ):跳轉下一句

        (:跳轉上一句

    

    段落跳轉:以空行爲分隔符

        }:跳轉至下一段落

        {:上一段落



翻屏操作:

    Ctrl+d:向文件尾部翻半屏

    Ctrl+f:向文件尾部翻一屏

    Ctrl+u:向文件首部翻半屏

    Ctrl+b:向文件首部翻一屏

    Enter:逐行向後翻


命令模式操作:

    字符編輯:

        x:刪除光標處的字符

        #x:刪除光標以右的#個字符

        xp:當前光標所在處的字符與光標後的字符做交換

        ~:轉換大小寫

    

    替換命令:

        r:替換光標所在處的字符

        R:開啓替換模式

    

    刪除命令:

        d:刪除,可結合光標跳轉字符,實現範圍刪除

        d^:刪除當前光標所在行以左的所有字符

        d$:刪除當前光標所在行以右的所有字符

        dw:刪除當前光標所在處下一個單詞

        de:刪除當前光標所在處的下一個單詞

        db:刪除當前光標所在處的上個單詞

        dd:刪除光標所在處的一整行

        #dd:刪除光標所在行開始向下#行

        D:等於d$

    

    複製命令:

        y:複製,可結合光標跳轉字符

        y$:複製光標所在行以右的所有字符

        y^:複製光標所在行以左的所有字符

        yw:複製光標所在處下個單詞

        ye:複製光標所在處下個單詞

        yb:複製光標所在處上個單詞

        y0:複製光標所在行以左的所有字符,包含空白字符

        yy:複製當前光標所在行

        #yy:複製光標所在行向下#行

        Y:複製光標所在行

    

    粘貼命令:

        p:緩衝區中的內容如果爲整行,則粘貼在當前光標所在行的下方;否則,粘貼至當前光標所在處的後方

        P:緩衝區中的內容如果爲整行,則粘貼在當前光標所在行的上方;否則,粘貼至當前光標所在處的前方

    

    改變命令:

        c:編輯模式 --> 輸入命令,實現刪除操作

        c$:刪除光標所在處以右的所有字符並轉爲輸入模式

        c^:刪除光標所在處以左的所有字符並轉爲輸入模式

        c0:刪除光標所在處以左的所有字符並轉爲輸入模式,包含空白字符

        cw:刪除光標所在處下一個單詞並轉爲輸入模式

        ce:刪除光標所在處下一個單詞並轉爲輸入模式

        cb:刪除光標所在處上一個單詞並轉爲輸入模式

        cc:刪除光標所在行並轉爲輸入模式

        #cc:刪除當前光標所在行向下#行並轉爲輸入模式

        C:刪除當前光標至行尾並轉爲輸入模式

    

    一次性複製粘貼多次內容:

        100i zhai Esc:zhai可粘貼100次

    


可視化模式:

    v:按字符選定

    V:按行選定

    可結合編輯命令:d,c,p,y

    Ctrl+v:面向塊


撤銷操作:

    u:撤銷前一次操作

    #u:撤銷前#次操作

    U:撤銷光標所在行所有此行的更改操作

    .:重複前一次操作

    n.:重複前n次操作



末行模式:

    地址定界

        :start_line,end_line

        #:指定的單個行

        #,#:從左側的#行開始,到右側之間的所有行

        #,+n:從左側的#行開始向後加n行

        .:當前行

        $:最後一行

        $-1:表示倒數第二行

        %:表示全文,相當於1,$

        /pat1/,/pat2/:第一次被pat1所匹配到的行到第一次被pat2所匹配到的行結束,之間的所有內容

        #,/pat/:從指定的行開始到被第一次被pat匹配到的行結束,之間的所有內容

        /pat/,#:從第一次被pat匹配到的行開始到第#行結束,之間的所有內容

    

    後面可跟編輯命令:

        d:刪除

        y:複製

        w /PATH/TO/FILE:將範圍內的行保存至指定文件中

        r /PATH/TO/FILE:將指定文件的內容插入指定的所有行處

    

    查找:

        /PATTERN:從當前光標所在處向文件尾部查找

        ?PATTERN:從當前光標所在處向文件首部查找

        n:光標跳轉至下一個被查找到的內容

        N:與n相反


vim寄存器:

    有26個命名寄存器和1個無命名寄存器,存放至不同剪切板中

    a,b,...,z用"寄存器表示,存放在數字和命令之間

    如:3"ayy表示複製3行達到a寄存器中

    "ap:表示將a寄存器中的內容粘貼


編輯二進制文件:

    vim -b BINFILE

    擴展命令模式下,利用xxd命令轉換爲可讀的十六進制

    :%!xxd

    編輯二進制文件

    擴展命令模式下,利用xxd命令轉換回二進制

    :%!xxd –r

    

    


多文件模式:

    vim FILE1 FILE2 FILE3 ...

    :next 下一個文件

    :prev 上一個文件

    :last 最後一個文件

    :first 第一個文件

    :wall 保存所有

    :qall 不保存退出所有

    :wqall 保存所有並退出



使用多窗口:

    多文件分割

        vim -o|O FILE1 FILE2 FILE3 ...

        -o:水平分割

        -O:垂直分割

        在窗口間切換:Ctrl+w,左右箭頭

    

    單個文件:

        Ctrl+w,s:水平分割

        Ctrl+w,v:垂直分割

        Ctrl+w,q:取消相鄰窗口

        Ctrl+w,o:取消全部窗口

        :qall 退出所有

    


定義vim工作特性:

    配置文件:永久有效

        全局:/etc/vimrc

        用戶:~/.vimrc

    

    擴展模式:當前vim進程有效

        (1)行號

            顯示行號:set number可簡寫爲set nu

            取消行號:set nonumber可簡寫爲set nonu

        (2)括號成對匹配

            匹配:set showmatch可簡寫爲set sm

            取消匹配:set noshowmatch可簡寫爲set nosm

        (3)自動縮進

            縮進:set ai

            取消:set noai

        (4)高亮搜索

            啓用:set hlsearch

            禁用:set nohlsearch

        (5)語法高亮

            啓用:syntax on

            禁用:syntax off

        (6)忽略字符大小寫

            啓用:set ic

            禁用:set noic

        (7)文件格式

            啓用:fileformat=unix

            禁用:fileformat=dos

    

vim內置幫助

    :help

    vimtutor


練習:

1.複製/etc/profile至/tmp/目錄,用查找替換命令刪除/tmp/profile文件中的行首的空白字符

 

47 HOSTNAME=`/bin/hostname 2>/dev/null`
 48 HISTSIZE=1000
 49 if [ "$HISTCONTROL" = "ignorespace" ] ; then
 50 export HISTCONTROL=ignoreboth
 51 else
 52 export HISTCONTROL=ignoredups
 53 fi
 54 
 55 export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE HISTCONTROL
 56     
 57 # By default, we want umask to get set. This sets it for login shell
 58 # Current threshold for system reserved uid/gids is 200
 59 # You could check uidgid reservation validity in
 60 # /usr/share/doc/setup-*/uidgid file
 61 if [ $UID -gt 199 ] && [ "`id -gn`" = "`id -un`" ]; then
 62 umask 002   
 63 else            
 64 umask 022   
 65 fi  
 66 
 67 for i in /etc/profile.d/*.sh ; do
 68 if [ -r "$i" ]; then
 69 if [ "${-#*i}" != "$-" ]; then
 70 . "$i" 
 71 else    
 72 . "$i" >/dev/null 2>&1
 73 fi      
 74 fi  
 75 done
 76     
 77 unset i
 78 unset -f pathmunge
:%s@^[[:space:]]\+@@


2.複製/etc/rc.d/init.d/functions文件至/tmp目錄,用查找替換命令爲/tmp/functions的每行開頭爲空白字符的行的行首添加一個#號

949 #       [ -z "$key" ] && plymouth --hide-splash
950 #       /sbin/cryptsetup $params ${key:+-d $key} create "$dst" "$src" <&1 2>/dev/null && success || failure
951 #       rc=$?
952 #       [ -z "$key" ] && plymouth --show-splash
953 #   fi
954 #   if [ $rc -ne 0 ]; then
955 #       ret=1
956 #       continue
957 #   fi
958 #   if [ -b "/dev/mapper/$dst" ]; then
959 #       if [ "$makeswap" = "yes" ]; then
960 #       mkswap "/dev/mapper/$dst" 2>/dev/null >/dev/null
961 #       fi
962 #       if [ "$mke2fs" = "yes" ]; then
963 #       if mke2fs "/dev/mapper/$dst" 2>/dev/null >/dev/null \
964 #           && mdir=$(mktemp -d /tmp/mountXXXXXX); then
965 #           mount "/dev/mapper/$dst" "$mdir" && chmod 1777 "$mdir"
966 #           umount "$mdir"
967 #           rmdir "$mdir"
968 #       fi
969 #       fi
970 #   fi
971 #    done < /etc/crypttab
972 #    return $ret
973 }
974 
975 # A sed expression to filter out the files that is_ignored_file recognizes
976 __sed_discard_ignored_files='/\(~\|\.bak\|\.orig\|\.rpmnew\|\.rpmorig\|\.rpmsave\)$/d'
977 
978 #if we have privileges lets log to kmsg, otherwise to stderr
979 if strstr "$(cat /proc/cmdline)" "rc.debug"; then
980 #        [ -w /dev/kmsg ] && exec 30>/dev/kmsg && BASH_XTRACEFD=30
981 #        set -x
982 fi
:%s@^[[:space:]]\+@#&@


3.如何設置tab縮進爲4個字符?

在末行模式輸入 set ts=4即可

4.複製/etc/rc.d/init.d/functions文件至/tmp目錄;替換/tmp/functions文件中的/etc/sysconfig/init爲/var/log

wKioL1e1Q3-zeK0rAABrZT4etPg311.png


5.刪除/tmp/functions文件中所有以#開頭,且#後面至少有一個空白字符的行的行首的#號

wKiom1e1Q5aAFGpfAAClMfEKiSk920.png

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章