VIM中自动切换输入法
使用vim的时候经常需要在不同的“模式”切换。其中最经常的就是在普通模式和插入模式间切换。我们在插入模式中通常输入中文,于是按 Esc
切换到普通模式时,输入法往往没有切换到英文模式,这种体验很糟糕。
其实你的输入法框架如果是FCITX或fcitx5,可以将vim设置成退出插入模式输入法自动切换成英文,再次进入插入模式,自动把输入法切换成上次的模式。
以下是设置代码,将代码复制到主目录的 .vimrc
中保存即可
" 以下设置离开插入模式时自动关闭中文输入法(输入法框架为fcitx或fcitx5)进入插入模式切换回上一次插入模式时的输入法
if exists('g:fcitx_auto')
finish
endif
let g:fcitx_auto = 1
let s:r_status = 1
let s:f_status = system("fcitx-remote")
let s:cmd = s:f_status == 1 || s:f_status == 2 ? "fcitx-remote" : "fcitx5-remote"
function s:fcitx2en() "离开插入模式,自动改变输入法为英文,同时记录输入法状态
let l:lang = system(s:cmd)
if l:lang == 2
call system(printf("%s -c", s:cmd))
let s:r_status = 2
else
let s:r_status = 1
endif
endfunction
function s:fcitx2back() "进入插入模式的时候,切换回上一次插入模式时的输入法
if s:r_status == 1
call system(printf("%s -c", s:cmd))
else
call system(printf("%s -o", s:cmd))
endif
endfunction
autocmd InsertLeave * call <SID>fcitx2en()
autocmd InsertEnter * call <SID>fcitx2back()
"以上设置离开插入模式自动关闭中文输入法,进入插入模式切换回上一次插入模式时的输入法
参考https://www.cnblogs.com/shengou/p/16884173.html
进入普通模式:Esc
光标相对移动命令
j
:移动到下一行相同列
k
:移动到上一行相同列
w
:移动到下一((20220826172744-r47tw64 “词组”))的首字符
ge
:移动到上一((20220826172744-r47tw64 “词组”))的尾字符
$
:移动到行尾字符
0
:移动到行首字符
h
:移动到前一字符
l
:移动到后一字符
e
:移动到((20220826172744-r47tw64 “词组”))的尾字符(若光标已在尾字符,则移动到下一词组的尾字符)
b
:移动到((20220826172744-r47tw64 “词组”))的首字符(若光标已在首字符,则移到到上一词组的首字符)
^
:移动到行首第一个非空字符
单字符搜索移动命令
f+字符
:向右搜索“字符”并把光标移到“字符”处
F+字符
:向左搜索“字符”并把光标移到“字符”处
t+字符
:向右搜索“字符”并把光标移到“字符”左侧
T+字符
:向左搜索“字符”并把光标移到“字符”右侧
计数操作:在操作命令前添加数字n
表示重复执行n
次相应操作。
5j
:移动到光标下面第5行(光标向下移动5行)
5k
:移动到光标上面第5行(光标向上移动5行)
5h
:光标向左移动5个字符。
5l
:光标向右移动5个字符。
5w
:光标向后移动5个词组并定位在词组首字符
5e
:执行e
5次。
5b
:执行b
5次
绝对定位命令
gg
:光标移动到文档第一行行首。
100gg
:光标移动到文档第100行行首。
G
:光标移动到文档最后一行行首。
删除字符:d
、x
- 将当前光标到光标移动命令到达的位置的内容删除,并将内容暂存在临时寄存器中。
x
:删除光标处字符,与dl
相同。
dw
:删除光标处到下一个((20220826172744-r47tw64 “词组”))起始字符前的所有字符。
de
:删除光标片到((20220826172744-r47tw64 “词组”))末尾的所有字符。(不包括空格)
d$
:删除光标处到行尾的所有字符。(删除光标处字符)
d0
:删除光标处到行首的所有字符。(保留光标处字符)
dd
:删除光标所在的行
dj
:删除光标所在的行及下一行
dk
:删除光标所在的行及上一行
dl
:删除光标处字符
dh
:删除光标前字符
计数操作:
5x
:执行x
5次(即删除光标所在处字符及后面4个字符,共5个字符)
d5w
或5dw
:执行dw
5次
d5e
或5de
:执行de
5次
d5h
或5dh
:删除光标左侧5个字符(保留光标处字符)
d5l
或5dl
:删除光标处及右侧4个字符,共5个字符。
5dd
或d5d
:执行dd
5次(即删除光标所在的行及下面的4行,共5行)
5dj
或d5j
:删除光标所在的行及下面5行,共6行)
5dk
或d5k
:删除光标所在的行及上面5行,共6行)
口诀:光标所至,操作所至,
J
:删除换行符(将两行合成一行)
5J
:删除5个换行符(将光标所在行和下面的五行合成一行)
撤消命令:u
、U
u
:撤消一次操作
U
:撤消本行所做的所有操作(按2次则重复所有操作)
计数操作:
5u
:撤消5次操作
重做命令:Ctrl+r
复制命令:y
- 将当前光标到光标移动命令到达的位置的内容暂存在临时寄存器中。
yw
:复制光标处到下一个((20220826172744-r47tw64 “词组”))起始字符前的所有字符。
ye
:复制光标片到((20220826172744-r47tw64 “词组”))末尾的所有字符。(不包括空格)
y$
:复制光标处到行尾的所有字符。(包括光标处字符)
y0
:复制光标处到行首的所有字符。(不包括光标处字符)
yy
:复制光标所在的行
yj
:复制光标所在的行及下一行
yk
:复制光标所在的行及上一行
yl
:复制光标处字符
yh
:复制光标前字符
粘贴命令
p
:将临时寄存器中的内容粘贴在光标处右侧(下面)。
P
:将临时寄存器中的内容粘贴在光标处左侧(上面)。
计数操作
5p
:将刚删除的内容置入在光标处后面5次
修改命令
r
:修改光标处字符。
剪切板(寄存器)操作
VIM有多个剪切板(寄存器),无论是复制的,删除的文本都暂存在剪切板中。
-
显示剪切板:
:reg
显示如右图所示。
Type
(类型):l
表示行;c
表示字符或词组。Name
(名称):剪切板名称(必须以"
开头,后面可以是一个英文字母或数字及一些符号。)Content
(内容):剪切板中暂存的内容。 -
特殊的剪切板:
-
""
:暂存最近复制或删除的文本,此剪切板中的内容储存或粘贴时直接操作 -
":
:暂存最近输入的命令行命令 -
"/
:暂存最近搜索的文本 -
"-
:暂存最近删除的单字符 -
"+
:与外部联系,暂存外部最近复制的文本,将VIM中的文本存入此剪切板可以在外部粘贴。-
查看是否支持外部剪切板:
:ver
显示如下图:
clipborad
前若是+
则支持,若是-
则不支持。 -
若不支持则安装vim-gtk或vim-gnome:
sudo apt install vim-gtk3
-
-
"*
:与外部联系,暂存外部最近复制的文本,但将VIM中的文本存入此剪切板不能在外部粘贴。
-
-
使用剪切板
-
将文本存入特定名称的剪切板
格式:名称+操作
-
要将一行复制存入名称为
"3
的剪切板输入:"3yy
-
要将某词组删除并存入名称为
"x
的剪切板:"xdw
-
要将某字符删除并存入名称为
"a
的剪切板:"ax
说明:若名称为大写英语字母则在相应小写字母为名称的剪切板尾部添加文本。且将
""
剪切板中的内容修改与相应剪切板一致操作理解:
"ax
:在"a
剪切板中存入被删除字符。(若被删除字符是k
,则无论"a
剪切板中有无内容,其内容都修改为k
。同时""
剪切板中的内容修改为k
)"Ax
:在"a
剪切板中内容尾部添加被删除字符。(若"a
剪切板中已有内容k
,此时删除字符是s
,则"a
剪切板中内容变为ks
。同时""
剪切板中的内容修改为ks
-
-
粘贴剪切板中的文本:
-
粘贴在光标的右侧(下面):名称+
p
要将名称为
"2
的剪切板中的文本粘贴在光标的右侧(下面):"2p
-
粘贴在光标的左侧(上面):名称+
P
-
名称为
""
的剪切板中的文本直接用p
或P
粘贴。
-
-
搜索命令:/、?
/
:从上到下搜索
?
:从下到上搜索
n
:正序搜索下一个
N
:倒序搜索下一个
注意:
输入/
或?
后,光标将移到文档最下方的状态行中,输入搜索字符,按Enter
键搜索。
配对括号搜索:%
- 将光标移动到括号处,如:(、[、{、)、]、}
- 输入命令:
%
ZZ
:保存并退出
((20220826164415-jwux1ie ‘01-普通模式’))
进入插入模式:i
、I
、a
、A
、o
、O
、s
、c
-
i
:在光标所在位置左侧插入字符。 -
I
:在光标所在行的行首插入字符。 -
a
:在光标所在位置右侧插入字符。 -
A
:在光标所在行的行尾插入字符。 -
o
:在光标所在行下面插入一行。 -
O
:在光标所在行上面插入一行。 -
s
:删除光标处的字符。 -
c
:删除相应字符。cc
:删除光标所在行,进入插入模式ce
或cw
:删除光标处到词组末尾的字符,进入插入模式cj
:删除光标处行及下一行,进入插入模式ck
:删除光标处行及上一行,进入插入模式ch
:删除光标处前一个字符,进入插入模式cl
:删除光标处一个字符,进入插入模式c$
:删除光标处到行尾的所有字符,进入插入模式c0
:删除光标前到行首的所有字符,进入插入模式
进入替换模式:R
替换模式中可以逐个字符修改替换,此模式下不能用hjklwe$0移动光标也不能用绝对定位命令(因这些都是字符),但可以用箭头键移动光标。