vim的各种快捷键

发布时间 2023-12-02 14:11:56作者: misakivv

一、准备一份用于练习的文件

我这里随便选了个python文件,作为test.py

#!/bin/bash

flag1=0 # 确认用户名是否被注册过的标识
user_table="user_info"
db_name="your_database_name"
db_host="your_database_host"
db_user="your_database_user"
db_password="your_database_password"

echo "欢迎来到注册登录系统!"

# 连接到数据库
connect_db() {
  mysql -h ${db_host} -u ${db_user} -p${db_password} ${db_name} -e "$1"
}

# 创建用户信息表
create_user_table() {
  create_table_query="CREATE TABLE IF NOT EXISTS ${user_table} (username VARCHAR(255), password VARCHAR(255));"
  connect_db "${create_table_query}"
}

# 检查用户名是否已存在
check_existing_username() {
  check_username_query="SELECT COUNT(*) FROM ${user_table} WHERE username = '$1';"
  result=$(connect_db "${check_username_query}")
  if [ ${result} -eq 1 ]; then
    flag1=1
  fi
}

# 登录函数
login() {
  echo "登录"
  login_success=0

  while true
  do
    read -p "请输入你的用户名:" username
    read -p "请输入你的密码:" passwd
    check_login_query="SELECT COUNT(*) FROM ${user_table} WHERE username = '$username' AND password = '$passwd';"
    result=$(connect_db "${check_login_query}")
    if [ ${result} -eq 1 ]; then
      echo "登录成功"
      login_success=1
      break
    else
      echo "用户名或密码错误,请重新输入"
      continue
    fi
  done
}

# 注册函数
register() {
  echo "注册"

  while true
  do
    read -p "请输入你要注册的账号:" username
    check_existing_username ${username}
    if [ ${flag1} -eq 1 ]; then
      echo "用户名已经存在,请换一个用户名!"
      continue
    fi
    break
  done

  while true
  do
    read -p "请输入你注册的密码:" passwd1
    read -p "请再次输入你的密码:" passwd2
    if [ "$passwd1" == "$passwd2" ]; then
      echo "注册成功"
      insert_user_query="INSERT INTO ${user_table} (username, password) VALUES ('$username', '$passwd1');"
      connect_db "${insert_user_query}"
      break
    else
      echo "两次密码输入不一致"
      continue
    fi
  done
}

# 主循环
while true
do
  read -p "请输入你的选择,1为登录,2为注册,q为退出:" select

  if [ ${select} == "1" ]; then
    login
  elif [ ${select} == "2" ]; then
    register
  elif [ ${select} == "q" ]; then
    break
  else
    echo "输入有误"
  fi
done

二、命令模式下的快捷键

用户刚刚启动 vi/vim,便进入了命令模式。

此状态下敲击键盘动作会被Vim识别为命令,而非输入字符。比如我们此时按下i,并不会输入一个字符,i被当作了一个命令。

1、移动光标

  • 上:k/↑
  • 下:j/↓
  • 左:h/←
  • 右:l/→

2、删除文字

  • x:删除光标选中的字符
  • dd:删除光标所在行
  • dw:删除光标所在位置的单词或者文字,包括test.py里面的user_table、确认用户名是否被注册过的标识。中文中包含特殊字符就会删除截止到特殊字符
  • d5j:删除六行(包括光标所在行)
  • dG:删除光标所在位置到文件末尾的所有内容

3、复制粘贴

yy:复制

p:粘贴

4、撤销上一次操作

u

5、恢复上一次撤销的操作

Ctrl+r

6、查找

/

7、替换单个字符

r:选中要替换的字符

然后输入想要替换的内容

8、光标移动到最左边

0

9、光标移动到行尾

$

10、跳转

gg:跳转到文档首行

G:跳转到文档末行

11、翻页

Ctrl+f:向下翻页

Ctrl+b:向上翻页

Ctrl+d:向下滚动半屏

Ctrl+y:向上一行一行翻页

12、删除全文

gg dG

常用方法列表

移动光标的方法

h 或 向左箭头键(←) 光标向左移动一个字符
j 或 向下箭头键(↓) 光标向下移动一个字符
k 或 向上箭头键(↑) 光标向上移动一个字符
l 或 向右箭头键(→) 光标向右移动一个字符
[Ctrl] + [f] 屏幕『向下』移动一页,相当于 [Page Down]按键 (常用)
[Ctrl] + [b] 屏幕『向上』移动一页,相当于 [Page Up] 按键 (常用)
[Ctrl] + [d] 屏幕『向下』移动半页
[Ctrl] + [u] 屏幕『向上』移动半页
+ 光标移动到非空格符的下一行
- 光标移动到非空格符的上一行
n 那个 n 表示『数字』,例如 20 。按下数字后再按空格键,光标会向右移动这一行的 n 个字符。例如 20 则光标会向后面移动 20 个字符距离。
0 或功能键[Home] 这是数字『 0 』:移动到这一行的最前面字符处 (常用)
$ 或功能键[End] 移动到这一行的最后面字符处(常用)
H 光标移动到这个屏幕的最上方那一行的第一个字符
M 光标移动到这个屏幕的中央那一行的第一个字符
L 光标移动到这个屏幕的最下方那一行的第一个字符
G 移动到这个档案的最后一行(常用)
nG n 为数字。移动到这个档案的第 n 行。例如 20G 则会移动到这个档案的第 20 行(可配合 :set nu)
gg 移动到这个档案的第一行,相当于 1G 啊! (常用)
n n 为数字。光标向下移动 n 行(常用)

文本的搜索与替换

/word 向光标之下寻找一个名称为 word 的字符串。 (常用)
?word 向光标之上寻找一个字符串名称为 word 的字符串。
n 这个 n 是英文按键。代表重复前一个搜寻的动作。
N 这个 N 是英文按键。与 n 刚好相反,为『反向』进行前一个搜寻动作。
:n1,n2s/word1/word2/g n1 与 n2 为数字。在第 n1 与 n2 行之间寻找 word1 这个字符串,并将该字符串取代为 word2 (常用)
:1,$s/word1/word2/g 或 :%s/word1/word2/g 从第一行到最后一行寻找 word1 字符串,并将该字符串取代为 word2 !(常用)
:1,$s/word1/word2/gc 或 :%s/word1/word2/gc 从第一行到最后一行寻找 word1 字符串,并将该字符串取代为 word2 !且在取代前显示提示字符给用户确认 (confirm) 是否需要取代!(常用)

删除/剪切、复制与粘贴

x, X 在一行字当中,x 为向后删除一个字符 (相当于 [del] 按键), X 为向前删除一个字符(相当于 [backspace] 亦即是退格键) (常用)
nx n 为数字,连续向后删除 n 个字符。举例来说,我要连续删除 10 个字符, 『10x』。
dd 删除/剪切光标所在的那一整行(常用)
ndd n 为数字。删除/剪切光标所在的向下 n 行,例如 20dd 则是删除 20 行 (常用)
d1G 删除光标所在到第一行的所有数据
dG 删除光标所在到最后一行的所有数据
d$ 删除游标所在处,到该行的最后一个字符
d0 那个是数字的 0 ,删除光标所在处,到该行的最前面一个字符
yy 复制游标所在的那一行(常用)
nyy n 为数字。复制光标所在的向下 n 行,例如 20yy 则是复制 20 行(常用)
y1G 复制游标所在行到第一行的所有数据
yG 复制游标所在行到最后一行的所有数据
y0 复制光标所在的那个字符到该行行首的所有数据
y$ 复制光标所在的那个字符到该行行尾的所有数据
p, P p 为将已复制的数据在光标下一行贴上,P 则为贴在光标上一行! 举例来说,我目前光标在第 20 行,且已经复制了 10 行数据。则按下 p 后, 那 10 行数据会贴在原本的 20 行之后,亦即由 21 行开始贴。但如果是按下 P 呢? 那么原本的第 20 行会被推到变成 30 行。 (常用)
J 将光标所在行与下一行的数据结合成同一行
c 重复删除多个数据,例如向下删除 10 行,[ 10c ]
u 复原前一个动作。(常用)
[Ctrl]+r 重做上一个动作。(常用)
. 重复前一个动作。 如果你想要重复删除、重复贴上等等动作,按下小数点『.』就好了! (常用)

三、输入模式下的快捷键

在命令模式按下 i 就进入到了输入模式

1、自动补全

Ctrl+p/Ctrl+n

2、复制

Ctrl+e:逐字复制光标下一行的内容

Ctrl+y:逐字复制光标上一行的内容

3、定位行首和行尾

Home:定位到光标行首

End:定位到光标行尾

4、复制剪贴板的内容

shift+insert

5、删除光标前后的内容

删除光标之前的内容:Backspace

删除光标之后的内容:Delete

四、末行模式下的快捷键

在命令模式按下:(英文冒号)就进入到了末行模式

1、暂时给文档设置行号

:set nu

2、删除包含某关键字的行

:g/关键字/d

3、删除全文

G
:1,.d

4、末行模式下的储存、离开等指令

:w 将编辑的数据写入硬盘中(常用)
:w! 若文件属性为『只读』时,强制写入该文件。不过,到底能不能写入, 还是跟你对该文件的权限有关
:q 离开 vi (常用)
:q! 若曾修改过文件,又不想储存,使用 ! 为强制离开不储存。
:wq 储存后离开,若为 :wq! 则为强制储存后离开 (常用)
ZZ 这是大写的 Z 喔!如果修改过,保存当前文件,然后退出!效果等同于(保存并退出)
:x 效果等同于(保存并退出)
:X 大写的X,用于加密文件
ZQ 不保存,强制退出。效果等同于:q!
:w [filename] 将编辑的数据储存成另一个文件(类似文件另存为)
:r [filename] 在编辑的数据中,读入另一个文件的数据。亦即将 『filename』 这个文件内容加到光标所在行后面
:n1,n2 w [filename] 将 n1 到 n2 的内容储存成 filename 这个文件。
:! command 暂时离开 vi 到bash命令行下执行 command 的显示结果!例如 『:! ls /home』即可在 vi 当中察看 /home 底下以 ls 输出的文件信息!

五、vim中文帮助文档

VIM 中文帮助: 总览最常用的命令 (sourceforge.net)
img