vim使用雜記

junwind發表於2021-03-11
vi  visual interface
vim  vi improved

vim +12 inittab   開啟inittab檔案,游標就處於第12行
vim + inittab  開啟檔案,游標處於最後一行
vim +/pattern /etc/inittab   開啟檔案,定位至第一次被pattern匹配到的行的行首;


vim模式:
    命令模式 ,預設進來的模式
    輸入模式
    尾行模式

    命令模式-->輸入模式下:
        i  insert 在當前游標所在字元的前面,轉為輸入模式
        a  append 在當前游標所在字元的後面,轉為輸入模式
        o  在當前游標所在行的下方,新建一行,並轉為輸入模式

        I:在當前游標所在行的行首,轉為輸入模式
        A:在當前游標所在行的行尾,轉為輸入模式
        O:在當前游標所在行的上方,新建一行,並轉為輸入模式


    輸入模式--》命令模式 
        ESC ...

    --》末行模式, 先得切到命令模式下,然後 shift + :10d       刪除第10行
        :10,20d    刪除第10行到第20:set nu     顯示行號

        執行shell命令
            : ! ls /etc 


    末行模式---》命令模式  
        ESC ...


    關閉檔案:
        在末行模式下關閉檔案
            :q   直接退出
            :wq  儲存並退出    :x
            :q!  強制退出
            :w   僅儲存
            :w!  強制儲存

        在命令模式下關閉檔案
            ZZ  儲存退出

    移動游標:在命令模式下 
        逐字元移動
            上下左右方向鍵即可,  數字 + 方向鍵 = 移動多少個字元   hljk

        以單詞為單位移動:
            w :移至下一個單詞的詞首
            e :跳至當前或下一個單詞的詞尾
            b :跳至當前或前一個單詞的詞首
            #w/e/b  : 一次跳#個單詞

        行內跳轉:
            0鍵:跳到行首  絕對行首
            ^鍵:行首的第一個非空白字元
            $鍵:絕對行尾

        行間跳轉:
            #G :跳轉至第#行
            G :最後一行


    在末行模式也可以實現跳轉:
        直接給出行號,回車即可   :10


    翻屏操作:
        ctrl+f :向下翻一屏
        ctrl+b :向上翻一屏

        ctrl+d :向下翻半屏
        ctrl+u :向上翻半屏


命令模式下的指令:
    刪除單個字元  
        x   刪除游標所在處的單個字元  
        #x  刪除游標所在處及向後的共#個字元

    刪除命令 d :
        d命令跟跳轉命令組合使用
             #d跳轉符 : 刪除跳轉符範圍的#個     #dw , #de , #db

        dd:刪除當前游標所在行
        #dd : 刪除包括當前游標所在行在內的#行


    末行模式下:
        startline,endlined

        . 當前行
        $ 最後一行
        +# 向下的#行
        $-2


    貼上命令:p
        p:小寫,如果刪除或複製為整行內容,則貼上至游標所在行的下方;
            如果複製或刪除的內容為非整行,則貼上至游標所在字元的後面;

        P:大寫,如果刪除或複製為整行內容,則貼上至游標所在行的上方;
            如果複製或刪除的內容為非整行,則貼上至游標所在字元的前面;

    複製命令 : y    yank    用法同d
        yy
        3yy
        :1,100y
        y$
        y0


先刪除內容,再轉換為輸入模式:c
    c用法同d命令

    cc
    c$

替換: replace

    r character
    6 r character


    R :替換模式   esc退出


撤銷編輯操作:
undo   u
u:撤銷前一次的編輯操作
    連續u命令可撤銷此前的n次編輯操作

#u :直接撤銷最近#次編輯操作

恢復撤銷:反撤銷
ctrl+r

重複前一次編輯操作
    .   

視覺化模式:
    v : 按字元選取
    V :按矩形塊選取
        選取後,可做其它操作


查詢替換:編輯模式下即可
    /pattern    從游標行向下查詢
    ?pattern    從游標行向上查詢
    n/N


查詢並替換:類似sed
在末行模式下使用s命令
    :addr1,addr2s@pattern@string@gi

    :.,$-1s/he/HE/g

    1,$  ===  %  表示全文

練習:將/etc/yum.repos.d/server.repo檔案中的ftp://instructor.example.com/pub替換為http://172.16.0.1/yum
%s/ftp:\/\/instructor\.example\.com\/pub/http:\/\/172.16.0.1\/yum/g
%s@ftp://instructor\.example\.com/pub@http://172.16.0.1/yum@g

檔案內容如下:
# repos on instructor for classroom use

# Main rhel5 server
[base]
name=Instructor Server Repository
baseurl=ftp://172.16.0.1/pub/Server
gpgcheck=0

# This one is needed for xen packages
[VT]
name=Instructor VT Repository
baseurl=ftp://172.16.0.1/pub/VT
gpgcheck=0

# This one is needed for clustering packages
[Cluster]
name=Instructor Cluster Repository
baseurl=ftp://172.16.0.1/pub/Cluster
gpgcheck=0

# This one is needed for cluster storage (GFS, iSCSI target, etc...) packages
[ClusterStorage]
name=Instructor ClusterStorage Repository
baseurl=ftp://172.16.0.1/pub/ClusterStorage
gpgcheck=0


使用vim編輯多個檔案:

    vim可以跨檔案操作 如開啟一個檔案複製,關閉;開啟另一個檔案貼上是可以的;


    vim file1 file2 ...
        預設開啟是第一個檔案,
        在末行模式下切換檔案:
            :next  切換至下一個檔案
            :prev  切換至上一個檔案
            切換時,要注意編輯了檔案後,提示儲存;才能切換
            :last  切換至最後一個檔案
            :first  切換至第一個檔案

    退出:
        :qa  全部退出


分屏顯示一個檔案:
     ctrl+w,s : 水平拆分
    ctrl+w,v :垂直拆分

在視窗間切換游標:
        ctrl+w, 上下左右箭頭切換

退出視窗:q  , qa


分視窗顯示多個檔案:
vim -o rc.sysinit inittab     水平分隔
vim -O rc.sysinit inittab     垂直分隔

切換跟上面一樣


將當前檔案中的部分內容,另存為一個檔案:
    末行模式下,使用w命令
    :w
    :addr1,addr2w /path/to/somewhere

將另外一個檔案的內容,填充在當前檔案中:
    :r /path/to/somewhere


跟shell互動:
:! command


顯示行號:
    :set number   簡寫   :set nu    
    :set nonu   取消顯示行號

    想永久生效,需要修改配置檔案

忽略大小寫:
    :set ignorecase     :set ic
    :set noignorecase    :set noic

設定自動縮排:
    :set autoindent    :set ai
    :set noai

查詢到文字高亮顯示:
    :set hlsearch
    :set nohlsearch

語法高亮:
    :syntax on
    :syntax off


vim的配置檔案:
全域性:/etc/vimrc
個人:~/.vimrc   沒有可以手動建立

.file.swp  vim未正常儲存退出的檔案就會保留這個。再次開啟檔案,會提示出問題
vim -r file    恢復   再手動刪除.file.swp



指令碼練習:新增10個使用者user1~user10,密碼同使用者名稱;但要求只有使用者不存在的情況下才能新增;
#!/bin/bash
#
for i in {1..10}; do
    if id user$i &> /dev/null; then
        echo "user$i exists."
    else
        useradd user$i
        echo user$i | passwd --stdin user$i &> /dev/null
        echo "Add user user$i finished."
    fi
done
---------------------------------------------------------
#!/bin/bash
#
for i in {1..10}; do
    if id user$i &> /dev/null; then
        userdel -r user$i
        echo "Delete user$i finished."
    else
        echo "user$i not exists."
    fi
done

擴充:接受一個引數;
    add:新增使用者user1..user10
    del: 刪除使用者user1..user10
    其它;退出
#!/bin/bash
#
if [ $# -lt 1 ]; then
        echo "Usage: adminuser.sh ARG"
        exit 7
fi

if [ $1 == '--add' ]; then
        for i in {1..10}; do
                if id user$i &> /dev/null; then
                        echo "user$i exists."
                else
                        useradd user$i
                        echo user$i | passwd --stdin user$i &> /dev/null
                        echo "Add user$i finished."
                fi
        done
elif [ $1 == '--del' ]; then
        for i in {1..10}; do
                if id user$i &> /dev/null; then
                        userdel -r user$i
                        echo "Delete user$i finished."
                else
                        echo "No user$i."
                fi
        done
else
        echo "Unknown ARG"
        exit 8
fi


擴充:期望給什麼使用者就新增,刪除什麼使用者,如下
adminusers.sh --add user1,user2,hello,hi,user3
#!/bin/bash
#
if [ $# -lt 2 ]; then
    echo "Usage: adminuser2.sh ARG1 ARG2."
    exit 11
fi

if [ $1 == '--add' ]; then
    for i in `echo $2 | sed 's/,/ /g'`; do
        if id $i &> /dev/null; then
            echo "$i exists."
        else
            useradd $i
            echo $i | passwd --stdin $i &> /dev/null
            echo "Add $i finished."
        fi
    done
elif [ $1 == '--del' ]; then
    for i in `echo $2 | sed 's/,/ /g'`; do
        if id $i &> /dev/null; then
            userdel -r $i
            echo "Delete $i finished."
        else
            echo "$i not exists."
        fi
    done
elif [ $1 == '--help' ]; then
    echo "Usage: adminuser2.sh --add USER1,USER2,... | --del USER1,USER2,... | --help"
else
    echo "Unknown options."
    exit 12
fi
擴充套件:-v選項,顯示整個執行過程?


組合測試條件:
    -a  與關係
    -o  或關係
    !   非關係


    大於1,小於等於3if [ $# -gt 1 -a $# -le 3 ]
        if [ $# -gt 1 ] && [ $# -le 3 ]


    #!/bin/bash
    #
    if [ $1 == 'q' -o $1 == 'quit' -o $1 == 'Q' -o $1 == 'Quit' ]; then
        echo "Quiting..."
        exit 0
    else
        echo "Unknown Argument."
        exit 1
    fi

    擴充套件:如果使用者給的不是這幾個字串,就新增使用者,否則退出?
    [ ! \( $1 == 'q' -a $1 == 'quit' -a $1 == 'Q' -a $1 == 'Quit' \) ]

本作品採用《CC 協議》,轉載必須註明作者和本文連結
六月的風