vim 是 vi imporoved 的縮寫,翻譯過來是 vi 編輯器升版。本文主要從如下方面介紹 vim:

  • 安裝 vim
  • 基本用法->用 vim 做最基本的編輯(在 vim 中活下來)
  • 第三方外掛

本文介紹 vim,更多在具體細節,希望幫助大家快速記住一些東西,然後經過反覆實踐形成肌肉記憶,提升效率。本文目標不是研究 vim 的技術細節,研究諸如寫 vimscript 的奇技淫巧。

1 安裝 vim

通過包管理器安裝,快捷方便;但是如果要新增某些功能,則需要從原始碼編譯安裝。

1.1 使用包管理器

CentOS/Rocky Linux/Red Hat

sudo dnf install vim

Ubuntu/Debian

sudo apt install vim

1.2 原始碼安裝

git clone https://github.com/vim/vim.git
cd vim
./configure --with-features=huge --enable-python3interp=yes --prefix=/usr/local --with-python3-config-dir=/usr/lib64/python3.9/config-3.9-x86_64-linux-gnu
make -j8
sudo make install

如果中間有任何修改,需要清理掉中間結果後重新編譯:

make clean distclean
make clean

安裝好後,執行vim --version

vim --version输出 ```bash vim --version VIM - Vi IMproved 9.0 (2022 Jun 28, compiled Nov 28 2022 00:00:00) Included patches: 1-963 Modified by Compiled by Huge version without GUI. Features included (+) or not (-): +acl +file_in_path +mouse_urxvt -tag_any_white +arabic +find_in_path +mouse_xterm -tcl +autocmd +float +multi_byte +termguicolors +autochdir +folding +multi_lang +terminal -autoservername -footer -mzscheme +terminfo -balloon_eval +fork() +netbeans_intg +termresponse +balloon_eval_term +gettext +num64 +textobjects -browse -hangul_input +packages +textprop ++builtin_terms +iconv +path_extra +timers +byte_offset +insert_expand +perl/dyn +title +channel +ipv6 +persistent_undo -toolbar +cindent +job +popupwin +user_commands -clientserver +jumplist +postscript +vartabs -clipboard +keymap +printer +vertsplit +cmdline_compl +lambda +profile +vim9script +cmdline_hist +langmap -python +viminfo +cmdline_info +libcall +python3/dyn +virtualedit +comments +linebreak +quickfix +visual +conceal +lispindent +reltime +visualextra +cryptv +listcmds +rightleft +vreplace +cscope +localmap +ruby/dyn +wildignore +cursorbind +lua/dyn +scrollbind +wildmenu +cursorshape +menu +signs +windows +dialog_con +mksession +smartindent +writebackup +diff +modify_fname +sodium -X11 +digraphs +mouse -sound -xfontset -dnd -mouseshape +spell -xim -ebcdic +mouse_dec +startuptime -xpm +emacs_tags +mouse_gpm +statusline -xsmp +eval -mouse_jsbterm -sun_workshop -xterm_clipboard +ex_extra +mouse_netterm +syntax -xterm_save +extra_search +mouse_sgr +tag_binary -farsi -mouse_sysmouse -tag_old_static system vimrc file: "/etc/vimrc" user vimrc file: "$HOME/.vimrc" 2nd user vimrc file: "~/.vim/vimrc" user exrc file: "$HOME/.exrc" defaults file: "$VIMRUNTIME/defaults.vim" fall-back for $VIM: "/usr/share/vim" Compilation: gcc -c -I. -Iproto -DHAVE_CONFIG_H -O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -DSYS_VIMRC_FILE=/etc/vimrc -D_REENTRANT -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1 Linking: gcc -Wl,--enable-new-dtags -Wl,-z,relro -Wl,--as-needed -Wl,-z,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -Wl,--build-id=sha1 -Wl,-z,relro -Wl,--as-needed -Wl,-z,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -Wl,--build-id=sha1 -specs=/usr/lib/rpm/redhat/redhat-package-notes -L/usr/local/lib -o vim -lm -lselinux -lncurses -lsodium -lacl -lattr -lgpm -Wl,--enable-new-dtags -Wl,-z,relro -Wl,--as-needed -Wl,-z,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -Wl,--build-id=sha1 -Wl,-z,relro -Wl,--as-needed -Wl,-z,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -Wl,--build-id=sha1 -fstack-protector-strong -L/usr/local/lib -L/usr/lib64/perl5/CORE -lperl -lpthread -lresolv -ldl -lm -lcrypt -lutil -lc ```

可以詳細檢視 vim 編譯的詳情。

2 基本使用 -> 在 vim 中活下來

在 linux 伺服器上,有時候不得不面對漆黑的命令列。在 vim 沒有額外設定下,開始使用 vim 就成了必備技能。 有一個關於 vim 的笑話是,stackoverflow 上點選率最高的問題是,如何從 vim 中退出。

2.1 在 vim 中活下來

直觀思考,一個編輯器最重要的功能就是:

  • 開啟/關閉檔案
  • 新增/刪除/修改字元
  • 儲存或者放棄修改
vim path

這個path是檔案或者資料夾,則有不同結果:

  • 檔案 -> vim 普通介面
  • 資料夾 -> 通過上下箭頭(++”↑”++ ++”↓”++)選擇檔案,通過++“Enter”++確認要編輯的檔案

按鍵盤上的++“i”++鍵,進入INSERT mode(插入模式), 此時 vim 就是一個普通的編輯器。

  • 用鍵盤的上(++”↑”++)下(++”↓”++)左(++”←”++)右(++”→”++)或者++“h”++ ++“k”++ ++“l”++ ++“j”++ 鍵來移動游標
  • 用翻頁鍵++“PageUp”++和++“PageDown”++在不同行之間移動
  • 用刪除鍵++“BackSpace”++來刪除前面一行的內容

所有編輯完成之後,按++“ESC”++退出插入模式,按++”:”++ ++“w”++ ++“q”++儲存並關閉檔案(++“w”++ for write and ++“q”++ for quit).

到現在你已經學會了 vim,愉快滴用 vim 來提升你的工作效率吧。

3 更好地使用 vim

活下來肯定不是最終的目標,因為一些其他編輯器司空見慣的功能都還沒有涉及到。而且 vim 不可能沒有這些功能:

  • 選擇
  • 複製
  • 貼上
  • 替換
  • 選中多個物件

如果只使用 vim 的基本功能,就像只用一隻手來操作鍵盤。為了更好地使用 vim,這裡需要對 vim 進行一些深入瞭解:

  • 基本操作語法
  • vim 的三種模式
  • 游標移動
  • visual 模式

3.1 基本語法

vim 有多種模式,如:

  • Normal mode 普通模式
  • Insert mode 插入模式
  • Visual mode 視覺模型
  • Terminal mode 命令列模式

為啥一個編輯器有這麼多種模式?還不是為了更好地編輯。

普通模式

普通模式就是把 vim 當成一個只讀的閱讀器,用於瀏覽整個檔案。用 vim 開啟一個檔案,預設就是這個模式。這個模式下不牽涉到對內容的修改,所以可有更多的快捷鍵。

插入模式

插入模式,就涉及到對檔案的編輯了。在普通模式下,按住++“i”++就可以切換到插入模式了。 此時再按快捷鍵,則只是修改編輯的檔案。

視覺模式

命令模式就是在 vim 中輸入命令,實現相關功能。當 vim 在普通模式的時候,輸入++”:“++則進入命令列模式。此模式用於相關命令操作。

命令列模式

在 vim 中執行 shell 命令。

3.2 游標移動

通過鍵盤按鍵(而不是移動滑鼠)來移動 vim 游標,這是 vim 高效的一個原因。

單字元移動

鍵盤的上(++”↑”++)下(++”↓”++)左(++”←”++)右(++”→”++)或者++“h”++ ++“k”++ ++“l”++ ++“j”++鍵可實現游標的字元移動。

++“h”++ ++“k”++ ++“l”++ ++“j”++是什麼鬼?就是鍵盤上右手最熟悉的地方,並不是所有鍵盤都有顯式的方向鍵,如果要使用方向鍵,則可能需要額外按住一些鍵,如++“shift”++。所以就選擇了右手最熟悉的++“h”++ ++“k”++ ++“l”++ ++“j”++來實現。

單詞移動

  • ++“w”++ 向右移動一個單詞,word
  • ++“b”++ 向左移動一個單詞,back

翻頁

  • ++“PageUp”++ -> 往上翻一頁
  • ++ctrl++ + ++“f”++ -> 往前翻一頁 forward
  • ++“PageDown”++ -> 往下翻一頁
  • ++ctrl++ + ++“b”++ -> 往後翻一頁 back

行滾動

  • ++ctrl++ + ++“e”++ -> 整體往上滾動一行
  • ++ctrl++ + ++“y”++ -> 整體往下滾動一行

行位置調整

  • ++“z”++ ++“t”++ 游標位於頂部 t -> top
  • ++“z”++ ++“z”++ 游標位於中間 z -> 可能就是方便
  • ++“z”++ ++“b”++ 游標位於底部 b -> bottom

3.3 刪除行

  • ++“d”++ ++“d”++: 剪下掉當前行
  • ++“p”++: 貼上到游標下一行

4 vim 設定

主要目標是提升熟練程度。和一般的工具一樣,vim 支援兩種設定方式:

  • 使用設定命令進行設定
  • 使用設定檔進行設定

檢視vim --version就可以看到設定檔的位置,如檔案展示~/.vimrc擁有最高權限。單然,它的權限還是低於設定命令。這個也符合通常使用習慣,有什麼臨時修改就用命令來實現,而通過設定檔的方式,則可以實現永久修改。我的~/.vimrc設定如下:

set encoding=utf-8
set number # turn off via: set nonumber
syntax on
set autoindent
set tabstop=4
set expandtab
set wrap
set linebreak
set showmatch
set ruler
set background=dark
colorscheme iceberg
set list
set listchars=tab:>-

上面的每一條命令都可以 用++”:”++ + 命令來實現,如: set number則開啟行號,: set nonumber則關閉行號。

5 vim 第三方外掛

5.1 原生包管理器

vim 的強大之處在於它擁有豐富的外掛。在 vim8 之前,vim 第三方外掛方式沒有一個正式的官方實現。從 vim8 開始,vim 自己就帶有一個外掛管理器。從這裡取得更多的資訊。

原生包管理的方式就是將整個包資料夾放到某個固定資料夾中:

  • ~/.vim/pack/xxx/start/yyy
  • ~/.vim/pack/xxx/opt/yyy

其中放到start資料夾中的包會被自動載入,但是放到opt中的包需要通過packadd :yyy的方式載入。而且放到start資料夾中的包沒有辦法撤銷載入。

5.2 常用外掛

YouCompleteMe

這是一個自動補全的外掛

mkdir -p ~/.vim/pack/plugins/start
cd ~/.vim/pack/plugins/start
git clone https://github.com/ycm-core/YouCompleteMe.git
cd YouCompleteMe
git submodule update --recursive --init
python3 ./install.py --all --verbose

nerdtree

這個用於 vim 的檔案管理。

總結

本文介紹了 vim 的使用。包括 vim 的安裝,vim 的最基本使用,以及一些常用快捷鍵的記憶方式。