Gvim的安装、基本使用及vimrc的配置

声明:本文内容是基于csdn博主学习后的笔记内容,如有侵权请联系删帖!

博主:SD.ZHAI       凳子花❀

一、Gvim的安装

下载地址:GVIM官方下载地址  

64位电脑可直接点击下方红框链接即可开始下载安装包。

安装包下载后,全程默认,无脑下一步即可,最后选择安装位置完成安装。

二、基础使用

2.1  工作模式

首先简单介绍一下gvim的三种工作模式:命令模式、插入模式和末位模式。

  1. 命令模式默认模式,打开GVIM即进入该模式,不能进行文本编辑,只能够通过命令行来操作):a在光标后插入、i在行首插入
  2. 插入模式(文本编辑,即在该模式下进行文本编辑):esa键退出插入模式。
  3. 末位模式(配置文件,即在该模式下进行文件的临时配置):或 / 进入末位模式,回车键回到命令模式。

2.2  命令模式常用操作符

以下纪录常用的一些操作符,个人认为记太多用不到反而忘得更快。

dd : 删除本行

dG  : 删除本行至末尾处的所有内容

ndd :删除n行

yy :复制本行内容

yyp : 复制本行内容,并粘贴至下一行

nyyp :: 复制n行内容,并粘贴至下一行

p : 粘贴

u : 撤销

ctrl + r : 取消撤销

gg :移动光标至行首

G : 移动光标至行末

x :删除字符

ddp :上下两行交换命令

0 : 光标移动到行首

$ :光标移动到行尾

2.3  末位模式常用操作指令

:wq  保存退出

:w  保存

:x  保存退出

/ 关键词   查找关键词,并标亮

:nohl  取消高亮

:%s/关键词/替换后的词/g  (%s表示全局,g表示一个一个的替换,gc一次性全部替换)

:ab  name code     简化模块,vimrc中设置,非常nice方便!

:sp  (slipe)分屏横窗口            关闭:ctrl + w

:vsp   分屏竖窗口           

 2.4    可视化操作

块选 :gvim  ctrl + q进入块选,hjkl选择范围,I进入插入模式,输入#来多行注释,esc退出完成多行注释。

列选:小写v

行选:大写V

三、ab命令快速制作verilog模板

模板包括:文件头、常用自定义命令、Module中常用模板(包括模块基本模板、组合时序逻辑模板、计数器、状态机、边沿检测器、同步器、触发器、触发器例化、头文件等)、预编译模板(延时、仿真精度)、TB模板(TB基本模板、产生时钟复位、延时任务、生成波形图文件、产生随机数、取对数、打开文件、断言等)、注释(注释头、段注释、端口注释等)、任务模板(延时任务、任务模板)。

版权声明:本文为博主原创文章,转载请附上原文出处链接和本声明。原文链接

"""""""""""""""""""""""""""""""新文件标题""""""""""""""""""""""""""""""""""""""""""""""""""
 
"按F4自动插入文件头 
map <F4> :call SetTitle() <cr>:11 <cr><end>i

"定义函数SetTitle,自动插入文件头 
func SetTitle() 
  call append(line(".")-1 , "`timescale 1ns/1ps")
  call append(line(".")+0 , "//******************************************************************")
  call append(line(".")+1 , "//") 
  call append(line(".")+2 , "//*@File Name: ".expand("%"))
  if expand("%:e") == "v"
    let tmp1 = "verilog"
  elseif expand("%:e") == "sv"
    let tmp1 = "system verilog"
  elseif expand("%:e") == "c"
    let tmp1 = "C"
  elseif expand("%:e") == "cpp"
    let tmp1 = "C++"
  elseif expand("%:e") == "txt"
    let tmp1 = "plain text"
  else
    let tmp1 = "NONE"
  endif
  call append(line(".")+3 , "//*@File Type: ".expand(tmp1))
  call append(line(".")+4 , "//*@Version  : 0.0")
  call append(line(".")+5 , "//*@Author   : Zehua Dong, SIGS")
  call append(line(".")+6 , "//*@E-mail   : 1285507636@qq.com")
  call append(line(".")+7 , "//*@Date     : ".strftime("%c"))  
  call append(line(".")+8 , "//*@Function :  ")  
  call append(line(".")+9 , "//")
  call append(line(".")+10, "//*@V0.0     : Initial.")  
  call append(line(".")+11, "//")
  call append(line(".")+12, "//******************************************************************") 
  call append(line(".")+13, "")
  call append(line(".")+14, "//")
  call append(line(".")+15, "// Header file")
  call append(line(".")+16, "`include \"common.vh\"")
  call append(line(".")+17, "")
  call append(line(".")+18, "//")
  call append(line(".")+19, "// Module")
  call append(line(".")+20, "")
 
  "新建文件后,自动定位到文件末尾
  autocmd BufNewFile * normal G

endfunc 


""""""""""""""""""""""""""""""""自定义命令"""""""""""""""""""""""""""""""""""

"显示时间,两种方式,可以取消注释都试试效果
":ab xtime <c-r>=strftime("%Y-%m-%d")<cr>
:ab xtime <c-r>=strftime("%Y-%m-%d %H:%M:%S")<cr>

""""""""""""""""""""""""""""""""Module"""""""""""""""""""""""""""""""""""

"模块定义
:ab MBmk module (<enter>clk                  <enter>rst_n            <enter>);<enter><enter>input                           clk                     <enter>input                           rst_n                <enter><enter><enter><enter><enter><enter><enter><enter><enter><enter><enter><enter><enter><enter><enter>endmodule

"组合逻辑
:ab Zuhe always @(*) begin<Enter>if(  )begin<Enter>end<Enter>else begin<Enter>end<Enter>end
     
"时序逻辑
:ab Shixu always @( posedge clk or negedge rst_n ) begin<enter>if( ~rst_n ) begin<enter>end<enter>else begin<enter>end<enter>end      
      
"计数器
:ab MBjsq `define   COUNT_BITS       8<enter><enter>reg    [ `COUNT_BITS-1:0 ] count;<enter><enter>always @( posedge clk or negedge rst_n ) begin<enter>if( ~rst_n ) begin<enter>count <= #`DEL `COUNT_BITS'd0;<enter>end<enter>else if( count ) begin<enter>count <= #`DEL `COUNT_BITS'd0;<enter>end<enter>else begin<enter>count <= #`DEL count + `COUNT_BITS'd1;<enter>end<enter>end
     
"状态机
:ab MBfsm reg       [2:0]   cs;<enter>reg       [2:0]   ns;<enter>parameter [2:0]  IDLE   = 3'b000,<enter>S1     = 3'b001,<enter>S2     = 3'b010,<enter>ERROR  = 3'b100;<enter>always @( posedge clk or negedge rst_n ) begin<enter>if ( !rst_n ) begin<enter>cs <= IDLE;<enter>end<enter>else begin<enter>cs <= ns;<enter>end<enter>end<enter><enter>always @( * ) begin<enter>ns = IDLE;<enter>case ( cs )<enter>IDLE: begin<enter>if (  ) begin<enter>ns = S1;<enter>end<enter>else begin<enter>ns = IDLE;<enter>end<enter>end<enter>S1: begin<enter>if (  ) begin<enter>ns = S2;<enter>end <enter>else begin <enter>ns = S1;<enter>end<enter>end <enter>S2: begin <enter>  if (  ) begin<enter>ns = ERROR; <enter>end <enter>else begin <enter>ns = S2;<enter>end<enter>end<enter>ERROR: begin <enter>  if (  ) begin<enter>ns = IDLE; <enter>end<enter>else begin<enter>ns = ERROR;<enter>end<enter>end <enter>endcase <enter>end<enter><enter>always @( posedge clk or negedge rst_n ) begin <enter>if ( !rst_n ) begin <enter>end<enter>else begin <enter>case ( ns )<enter>endcase <enter>end <enter>end      

"边沿检测器
:ab MBby reg     _en_q;<enter>wire    _en_flag;<enter><enter>always @( posedge clk or negedge rst_n ) begin<enter>if( ~rst_n ) begin<enter>_en_q <= #`DEL 1'b0;<enter>end<enter>else begin<enter>_en_q <= #`DEL _en;<enter>end<enter>end<enter>assign _en_flag = ( ~_en_q ) && ( _en );

"同步器
:ab MBtongbuqi  reg rst_s1;<enter>reg rst_s2;<enter><enter>always @ (posedge clk or negedge rst_n) begin<enter>if (!rst_n) begin<enter>rst_s1 <= 1'b0;<enter>rst_s2 <= 1'b0;<enter>end<enter>else begin<enter>rst_s1 <= 1'b1    ;<enter>rst_s2 <= rst_s1;<enter>end<enter>end

"触发器模板
:ab MBdff module dff #( parameter SIZE = 64 )(<enter>  clk    ,<enter>rst_n  ,<enter>D      ,<enter>Q<enter>);<enter><enter>input                     clk    ;<enter>input                     rst_n  ;<enter>input   [SIZE - 1 : 0]    D      ;<enter>output  [SIZE - 1 : 0]    Q      ;<enter><enter>wire                      clk    ;<enter>wire                      rst_n  ;<enter>wire    [SIZE - 1 : 0]    D      ;<enter>reg     [SIZE - 1 : 0]    Q      ;<enter><enter>always @( posedge clk or negedge rst_n ) begin<enter>if( ~rst_n ) begin<enter>Q <= 'b0;<enter>end<enter>else begin<enter>Q <= D;<enter>end<enter>end<enter><enter>endmodule<enter>

"触发器例化tb_
:ab LHdff dff #(  ) dff_dut1(<enter>.clk  ( clk    ),<enter>.rst_n( rst_n  ),<enter>.D    (  ),<enter>.Q    (  )<enter>);

"共同的头文件
:ab MBc `ifndef COMMON_HEADER <cr>`define COMMON_HEADER<cr><cr>`define CYCLE 10<cr>`define HALF_CYCLE (CYCLE/2)<cr><cr>`define TB_BEGIN $display("=== BEGIN TESTBENCH %m ===\n");<cr>`define TB_END #`CYCLE $display("\n===== END TESTBENCH %m ===");<cr><cr>`endif

"""""""""""""""""""""""""""""""""预编译""""""""""""""""""""""""""""""""""
"延时宏定义
:ab YBYys `define DEL 1

"仿真精度
:ab YBYjd `timescale 1ns/1ps

""""""""""""""""""""""""""""""""Testbench""""""""""""""""""""""""""""""""""

"产生时钟
:ab TBsz initial begin<enter>tb_clk = 0;<enter>end<enter>always #`HALF_CYCLE tb_clk = ~tb_clk;

"产生复位信号
:ab TBfw initial begin<enter>tb_rst_n = 1;<enter>repeat(1) @( posedge tb_clk ) #1;<enter>tb_rst_n = 0;<enter>repeat(1) @( posedge tb_clk ) #1;<enter>tb_rst_n = 1;<enter>end

"延时
:ab TBys repeat( 1 ) @( posedge tb_clk ) #1;

"波形图
:ab TBbxt initial begin<enter>$dumpfile(" .vcd ");<enter>$dumpvars();<enter>end

"随机数
:ab TBsjs   integer   seed;<enter>reg[31:0] num1;<enter>initial begin<enter>if ( !$value$plusargs("seed+%d", seed) ) begin<enter>seed = 0;<enter>end<enter>@(posedge tb_clk);<enter>#1;<enter>num1 = $random(seed);<enter>end

"取对数,用来求位宽
:ab TBds function integer clogb2;<enter>input [31:0] value;<enter>begin<enter>value = value - 1;<enter>for (clogb2 = 0; value > 0; clogb2 = clogb2 + 1) begin<enter>value = value >> 1;<enter>end<enter>end<enter>endfunction 

"打开文件
:ab TBwj integer                     FILE;<enter>  FILE=$fopen(" .txt ", "a+");<enter>$fdisplay(FILE, " = %h", );<enter>$fclose(FILE);

"TB模板
:ab TBmb module _tb();<enter><enter>  reg                 tb_clk                         <enter>reg                 tb_rst_n                <enter><enter>task delay;<enter>input [31:0] num;<enter>begin<enter>repeat(num) @(posedge tb_clk);<enter>#1;<enter>end<enter>endtask<enter><enter>initial begin<enter>tb_clk = 0;<enter>end<enter>always #`HALF_CYCLE tb_clk = ~tb_clk;<enter><enter>initial begin<enter>tb_rst_n = 1;<enter>delay(1);<enter>tb_rst_n = 0;<enter>delay(1);<enter>tb_rst_n = 1;<enter>end<enter><enter>initial begin<enter>$dumpfile(" _tb.vcd ");<enter>$dumpvars();<enter>end<enter><enter>initial begin<enter>`TB_BEGIN<enter>delay(3);<enter><enter>`TB_END<enter>$finish;<enter>end<enter><enter><enter>endmodule

:ab TBb `TB_BEGIN
:ab TBe `TB_END

"断言assert
:ab TBas assert( tb_ ==  ) $strobe("%0d, !!TEST SUCCESS!!", $time);<enter>else $error("tb_ = %0d", tb_);

"TB中initial块
:ab TBin initial begin<CR>`TB_BEGIN<CR><CR>`TB_END<CR>$finish;<CR>end


""""""""""""""""""""""""""""""""注释""""""""""""""""""""""""""""""""""""""""
"注释头
:ab ZSt //*************************************************************<enter><enter>*@File name: <enter><enter>*@File type: <enter><enter>*@Version  : 0.0.1<enter><enter>*@Author   : Zehua Dong, HITWH<enter><enter>*@E-mail   : hitdongzh@163.com<enter><enter>*@Date     : <enter>*@Function : <enter><enter>*************************************************************<enter><enter> Head files<enter>`include "common.v"<enter><enter> Module definition

"段注释
:ab ZSk /<enter>*Function Description:<enter>*  <enter>*  <enter>///

"端口注释
:ab ZSdk   //===========================================================<enter>* Input and output ports<enter>* Internal signals<enter>===========================================================

"分割注释
:ab ZS //*******************************<enter><enter>*******************************


""""""""""""""""""""""""""""""""任务""""""""""""""""""""""""""""""""""""""""

"延时任务
:ab RWys task delay;<enter>input [31:0] num;<enter>begin<enter>repeat(num) @(posedge tb_clk);<enter>#1;<enter>end<enter>endtask

"任务模板
:ab RWmb task ;<enter>input [ :0] <enter>begin<enter>end<enter>endtask

使用模板可以减少不必要的重复,大量缩短时间!

四、vimrc配置

此处给出搬移作者的vimrc配置

"设置背景主题
"colo Candy

set nocompatible

" Vim with all enhancements
source $VIMRUNTIME/vimrc_example.vim

" Remap a few keys for Windows behavior
source $VIMRUNTIME/mswin.vim

set expandtab
"set tabstop=4
set guifont=Courier_New:h14
"set guifont=DejaVu\ Sans\ Mono\:h14 

"colorscheme    eighties                         "主题设置

" Set window size
winpos 100 100
set lines=25 columns=80

" Use the internal diff if available.
" Otherwise use the special 'diffexpr' for Windows.
if &diffopt !~# 'internal'
  set diffexpr=MyDiff()
endif
function MyDiff()
  let opt = '-a --binary '
  if &diffopt =~ 'icase' | let opt = opt . '-i ' | endif
  if &diffopt =~ 'iwhite' | let opt = opt . '-b ' | endif
  let arg1 = v:fname_in
  if arg1 =~ ' ' | let arg1 = '"' . arg1 . '"' | endif
  let arg1 = substitute(arg1, '!', '\!', 'g')
  let arg2 = v:fname_new
  if arg2 =~ ' ' | let arg2 = '"' . arg2 . '"' | endif
  let arg2 = substitute(arg2, '!', '\!', 'g')
  let arg3 = v:fname_out
  if arg3 =~ ' ' | let arg3 = '"' . arg3 . '"' | endif
  let arg3 = substitute(arg3, '!', '\!', 'g')
  if $VIMRUNTIME =~ ' '
    if &sh =~ '\<cmd'
      if empty(&shellxquote)
        let l:shxq_sav = ''
        set shellxquote&
      endif
      let cmd = '"' . $VIMRUNTIME . '\diff"'
    else
      let cmd = substitute($VIMRUNTIME, ' ', '" ', '') . '\diff"'
    endif
  else
    let cmd = $VIMRUNTIME . '\diff'
  endif
  let cmd = substitute(cmd, '!', '\!', 'g')
  silent execute '!' . cmd . ' ' . opt . arg1 . ' ' . arg2 . ' > ' . arg3
  if exists('l:shxq_sav')
    let &shellxquote=l:shxq_sav
  endif
endfunction

"自动全屏
"autocmd GUIEnter * simalt ~x

"设置编码"
set fileencodings=utf-8,ucs-bom,gb18030,gbk,gb2312,cp936
set termencoding=utf-8
set encoding=utf-8
source $VIMRUNTIME/delmenu.vim 
source $VIMRUNTIME/menu.vim

"显示行号"
set nu
set number

"突出显示当前行"
"set cursorline
"set cul          "cursorline的缩写形式"

"突出显示当前列"
"set cursorcolumn
"set cuc          "cursorcolumn的缩写形式"

"启用鼠标"
set mouse=a
set selection=exclusive
set selectmode=mouse,key

"显示括号匹配"
set showmatch

"设置缩进"
"设置Tab长度为2空格"
set tabstop=2
"设置自动缩进长度为2空格"
set shiftwidth=2
"继承前一行的缩进方式,适用于多行注释"
set autoindent

"设置粘贴模式"
"显示空格和tab键在Vim中通过鼠标右键粘贴时会在行首多出许多缩进和空格,通过set paste可以在插入模式下粘贴内容时不会有任何格式变形、胡乱缩进等问题。"
set paste

"vimrc显示空格和tab键"
"Vim编辑器中默认不显示文件中的tab和空格符,通过下面的配置可以获得以下的显示效果,方便定位输入错误。"
set listchars=tab:>-,trail:-

"设置当文件被改动时自动载入 
set autoread
 
"quickfix模式
autocmd FileType c,cpp map <buffer> <leader><space> :w<cr>:make<cr>

"代码补全  
set completeopt=preview,menu 

"自动保存
set autowrite

"设置上下文行数
set so=1

" 语法高亮
set syntax=on

"与windows共享剪贴板
set clipboard+=unnamed

"取消自动备份及产生swp文件
set noundofile
set nobackup
set nowb
set noswapfile


"为C程序提供自动缩进
set smartindent

"启动的时候不显示那个援助索马里儿童的提示
set shortmess=atI

"忽略大小写
"set ic(ignorecase 的缩写) 忽略大小写
"set noic(noignorecase 的缩写) 不忽略大小写 

"状态行显示的内容
"set statusline=%F%m%r%h%w\ [FORMAT=%{&ff}]\ [TYPE=%Y]\ [POS=%l,%v][%p%%]\ %{strftime(\"%d/%m/%y\ -\ %H:%M\")}  
set statusline=\ [POS=%l,%v][%p%%]\ %{strftime(\"20%y/%m/%d\ -\ %H:%M\")}  
"打开文件类型检测, 加了这句才可以用智能补全
set completeopt=longest,menu

vim的配置

" 设置字体
set guifont=Courier\ New\ 14
" 设置启动时窗口大小
set lines=50 columns=130
" 设置启动时窗口位置
winpos 70 50
" 设置语法高亮
syntax on
syntax enable

" 设置快捷键
" 设置F11为全屏快捷键
nnoremap <F11> :set lines=9999 columns=9999<Bar>winpos 0 0<CR>
" 设置F12为小窗口快捷键
nnoremap <F12> :set lines=50 columns=130<Bar>winpos 70 50<CR>
" 设置F9为编辑快捷键,有些文件可能怕被修改:'modifiable' is off,可以通过这个快捷键快速设置为可修改
nnoremap <F9> :set ma<CR>

" 窗口设置
" 设置文本宽度(textwidth),文本宽度指定了文本中每行的最大字符数
set tw=10000
" 启用标尺(ruler),标尺是一个位于 Vim 窗口底部的状态行,它通常用于显示当前光标位置、行号和列号等信息
set ruler
" 启用状态栏(status line)中显示当前命令
set showcmd
" 启用状态栏中显示当前编辑模式
set showmode

" 设置临时文件
set noswapfile
set nobackup
set nowritebackup
set noundofile

" 显示相对行号
set rnu 
" 显示行号
set nu
" 启用高亮搜索功能
set hlsearch
" 设置高亮当前行和列
set cuc
set cul

" 缩进
" 配置 Tab 键的缩进行为
" autocmd FileType make set noexpandtab
" 配置 Tab 键的缩进行为
" set expandtab
" 启用智能缩进
set smartindent
" 启用自动缩进功能,使 Vim 在新行中自动匹配上一行的缩进级别
set autoindent
" 设置软制表符的宽度为 4 个空格,用于控制在编辑中使用 Tab 键时插入的空格数量
set softtabstop=4
" 设置制表符(Tab)的宽度为 4 个空格,控制在编辑中使用 Tab 键时插入的空格数量
set tabstop=4
" 设置缩进时使用的空格数为 4 个空格,影响代码的缩进级别
set shiftwidth=4

" 启用 Vim 的文件类型检测、插件支持和自动缩进功能
filetype plugin indent on
" 切换到名为 "desert" 的颜色主题
colorscheme desert 
" 禁用兼容模式
set nocompatible
" 配置 Vim 中的回退(backspace)键行为
set backspace=indent,eol,start

" 启用 Vim 中的换行(line break)功能,当你启用这个选项时,Vim 将根据单词边界来换行,而不会在单词中断的地方进行换行,这有助于提高文本的可读性
set linebreak
" 启用文本自动换行功能,当文本行过长时,它将自动折行显示。
set wrap
" 启用匹配字符高亮显示
set showmatch
" 添加 "kspell" 补全选项,这表示 Vim 在进行单词补全时将使用拼写检查功能
set complete+=kspell
" 启用折叠(folding)功能,折叠允许你折叠代码块或文本段落,以便更轻松地浏览和编辑大型文件
set foldenable
" 设置垂直滚动时的上下边距为 4 行
set scrolloff=4
" 设置状态栏的显示级别为 2
set laststatus=2,这将在底部显示状态栏,其中包括文件名、文件类型等信息
" 启用增量搜索功能
set incsearch
" 设置 Vim 命令历史记录的最大行数为 1000 行
set history=1000
" 启用自动读取功能,这意味着如果在编辑一个文件时,该文件在外部被修改了(比如被其他程序修改了),Vim 会自动重新读取文件以更新编辑器中的内容,以防止冲突
set autoread
" 启用智能菜单功能,当你在命令行中使用通配符(如 :e *.txt)时,Vim 会在命令行下方显示一个菜单,列出匹配的文件名,以帮助你选择文件
set wildmenu

" 将crtl+C按键映射为插入注释行
map ^C i//------------------------------------------------------------------------------------------------------------------^M//^M<ESC>0Di//------------------------------------------------------------------------------------------------------------------<ESC>ka

" 根据文件扩展名自动设置文件类型为 Verilog
au BufNewFile,BufRead *.v,*.vh set filetype=verilog
" 根据文件扩展名自动设置文件类型为 python
au BufNewFile,BufRead *.py set filetype=python
" 根据文件扩展名自动设置文件类型为 logtalk
au BufNewFile,BufRead *.txt,*.log,README set filetype=logtalk

" 使用了 <M-i> 键(Alt+i)来执行相应的操作
" 映射定义了在普通模式下按下 Alt+i 时的操作,即插入注释
nnoremap <M-i> :normal! I//<Esc>
" 映射定义了在可视模式下按下 Alt+i 时的操作,即插入注释
vnoremap <M-i> :s/^/\/\//<CR>
" 使用了 <M-o> 键(Alt+o)来执行相应的操作
" 映射定义了在普通模式下按下 Alt+o 时的操作 ,即取消注释
nnoremap <M-o> :normal! ^xx<Esc>
" 映射定义了在可视模式下按下 Alt+o 时的操作 ,即取消注释
vnoremap <M-o> :s/^\/\///<CR>
" 映射定义了在插入模式下按下 Alt+i 时的操作,即插入注释
inoremap <M-i> :<Esc>I//<Esc>
" 映射定义了在插入模式下按下 Alt+o 时的操作 ,即取消注释
inoremap <M-o> :<Esc>^xx<Esc>

" 在插入模式下输入一个左括号 ( 后,自动插入右括号 ) 并将光标移到括号中间
inoremap ( ()<Left>
" 在插入模式下输入一个左方括号 [ 后,自动插入右方括号 ] 并将光标移到方括号中间
inoremap [ []<Left>
" 在插入模式下输入一个左大括号 { 后,自动插入右大括号 } 并将光标移到大括号中间
inoremap { {}<Left>
" 在插入模式下输入一个左引号 " 后,自动插入右引号 " 并将光标移到引号中间
inoremap " ""<Left>

" 在输入 bg 后,自动将其替换为 begin,并在下一行插入 end
inoremap bg begin<Enter>end<Esc>k$a


 

  • 22
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值