linux_mint_21 vim配置:剪贴板支持和输入法自动切换
一、vim的剪贴板支持
有的vim版本不支持系统剪切板,也就是说在vim编辑器外面复制的内容,不能够粘贴到vim中;在vim中通过yy、d、c复制剪切的内容也不能粘贴在vim编辑器外面。
这实在是有点奇怪,特别是对windows用户来来说。本来写东西就是复制粘贴,一个文本编辑器复制粘贴都做不到,那搞毛线啊~
我们可以通过在终端输入命令来查看vim是否支持系统剪切板:
vim --version | grep clipboard
终端会输出两行内容:需要关注是“clipboard”和“xterm_clipboard”前面的符号。如下图所示,两个条目前面都是+号(如下图所示),则vim支持系统剪切板,否则不支持。
既然有的vim版本支持剪切板,有的版本不支持,那么是不是自己选择一个版本的源码自己编译安装就行了?折腾了一下,还是不行。
简单说(不一定正确):图形界面的vim,即gvim,一般都支持系统剪切板;而没有图形用户界面的vim,很多不支持系统剪切板。
既然如此,下载一个gvim就行了:
sudo aptitude install vim-gtk
vim-gtk即一个发行版的gui vim。执行这条命令,本质是下载了一个gvim,但是同时也让vim能支持系统系统剪切板。
换一句话说,安装一个gvim,多花了几十M的空间而已,不想用gvim,当它没被安装就好了。这种方式最简单直接。
二、 输入法的切换
(环境:mint21,vim8.2,输入法框架fcitx)
使用vim的时候经常需要在不同的“模式”切换。有的说vim只有两种模式,普通模式和插入模式,这是简单的说法;其实vim的模式有七八种。
其中最经常的就是在普通模式和插入模式间切换。当我们在插入模式切换到普通模式后,想通过按键k移动光标到上一行,如果当前是输入法是中文,我们需要按两次按键,即k+enter(或者shift+k),如果是英文输入状态下我们按下k,光标直接就移动了。所以,能不设置成这样:vim从插入模式切换到普通模式后,输入法同时自动切换到英文。
网上有很多解决办法,大多不管用。不管用的原因是我们的系统有差别,我们的的输入法和vim的版本……也可能不同。
想要达成在vim中自动切换输入法关键在于两点:
(1):识别出vim中模式的转变。
(2)根据(1)识别出来的结果调用软件切换输入法。
vim自己会实时记录自己当前的模式,所以(1)很容易实现。关键在于第二点。
我用的输入法框架是fcitx(不是fcitx5).在fcitx框架中,有一个方法可以查看和改变输入法。
$ fcitx-remote
1 # 执行fcitx-remote,能够获取当前的输入法,当前的输入法是1
$ fcitx-remote -o
$ fcitx-remote
2 # fcitx-remote -o ,将输入法改变成2
$ fcitx-remote -c
$ fcitx-remote
1 # citx-remote -c ,将输入法改变为1
fcitx-remote是输入法框架fcitx下的一个程序,在目录(/etc/)下可以找到。不带参数调用它,返回当前输入法(1或者2);带参数-c调用,将输入法改为1(英文);带参数-o,将输入法该为2(中文).附带说一句,如果输入法框架是fcitx5,这这个程序名字是fcitx5-remote,也在这个目录。
所以将下面的语句复制到"~ ./.vimrc"中理论上就能实现当:从插入模式切换到普通模式,输入法设置为英文。
1 if exists('s:loaded')
2 finish
3 endif
4 let s:loaded = 1
5 let s:f_status = system("fcitx-remote")
6 let s:cmd = s:f_status == 1 || s:f_status == 2 ? "fcitx-remote" : "fcitx5-remote"
7
8 func! s:fcitx2en()
9 let l:lang = system(s:cmd)
10 if l:lang == 2
11 call system(printf("%s -c", s:cmd))
12 endif
13 endf
14
15 autocmd InsertLeave * call <SID>fcitx2en()
实际上第一次使用这个脚本的时候,脚本只能在第一次切换到普通模式时自动切换输入法,而且还让我接下来不能通过shift按键切换输入法(输入法处于半卡死的状态)。
许多人在做类似的尝试也碰到过类似的问题。
如果代码很长,我可能会怀疑代码有问题,但是上面的代码很短,很简单,能够看出并没有问题。那问题出在哪里?
我不知道问题出现在哪里,但是最终通过简单的输入法设置,解决了问题。
打开输入法设置,将上面的红色方框中的快捷键设置为自己切换输入法时常用的按键。我习惯用两个shift进行输入法切换,所以就设置成上图这个样子。
至于设置完后,为什么代码能够成功切换输入法,我也不是很明白。
再说一句题外话:方框中的“切换激活/非激活输入法”这句话我倒现在也不明白什么意思~我开始以为是“切换输入法”的意思,现在我认为是“让输入法在激活和非激活两种状态之间切换”,即切换的不是输入法,而是输入法的激活状态。
这种机器翻译的汉语,理解起来是真的费劲。
前面的代码只是实现了从insert模式进入到normal模式后自动切换成英文的功能。类似的功能有一个需求没那么大的,那就是:进入insert模式的时候,将输入法自动切换回到上一次退出insert模式的输入状态。
比如我们:(1)在insert模式中以中文状态进行编辑;(2)然后切换到normal模式移动光标;(3)再切换回到insert模式,希望输入法能自动回到(1)中的输入法状态。前面的代码只是实现了(1)--->(2)的输入法自动切换;但是不能做到(2)--->(3)的自动切换。
查考下面:
1 https://github.com/lilydjwg/fcitx.vim/blob/fcitx5/plugin/fcitx.vim
然后稍微修改一下:
1 if exists('g:fcitx_auto')
2 finish
3 endif
4 let g:fcitx_auto = 1
5
6 let s:r_status = 1
7 let s:f_status = system("fcitx-remote")
8
9 "输入法框架是fcitx启用下句,不确定是fcitx还是fcitx5,启用下下句。
10 let s:cmd = s:f_status
11 "let s:cmd = s:f_status == 1 || s:f_status == 2 ? "fcitx-remote" : "fcitx5-remote"
12
13
14 function s:fcitx2en() "离开插入模式,自动改变输入法为英文,同时记录输入法状态
15 let l:lang = system(s:cmd)
16 if l:lang == 2
17 call system(printf("%s -c", s:cmd))
18 let s:r_status = 2
19 else
20 let s:r_status = 1
21 endif
22 endfunction
23
24 function s:fcitx2back() "进入插入模式的时候,切换回上一次插入模式时的输入法
25 if s:r_status == 1
26 call system("fcitx-remote -c")
27 else
28 call system("fcitx-remote -o")
29 endif
30 endfunction
31
32 autocmd InsertLeave * call <SID>fcitx2en()
33 autocmd InsertChange * call <SID>fcitx2back()
linux_mint_21 vim配置:剪贴板支持和输入法自动切换的更多相关文章
- Vim配置IDE开发环境
我的vim IDE界面: 1.安装Vim和Vim基本插件首先安装好Vim和Vim的基本插件.这些使用apt-get安装即可:lingd@ubuntu:~/arm$sudo apt-get instal ...
- 转载:Vim 配置入门
转载:Vim 配置入门 原文地址:http://www.ruanyifeng.com/blog/2018/09/vimrc.html 作者: 阮一峰 Vim 是最重要的编辑器之一,主要有下面几个优点. ...
- spring集成mybatis配置多个数据源,通过aop自动切换
spring集成mybatis,配置多个数据源并自动切换. spring-mybatis.xml如下: <?xml version="1.0" encoding=" ...
- WIN10环境下点击通知栏图标时自动切换输入法导致图标位置变动
这个问题由来已久,每当点击系统右下角任务栏中的按钮时,原本是搜狗输入法就会自动变成“US [ 中文(简体,中国) ]”,图标会自动错位,导致响应的是其他功能. 假设上图是正常的环境,此时我点击电池图标 ...
- Linux --- vim 安装、支持python3的配置、插件自动补全YCM的安装配置及全过程错误总结
1.git(用来下载vim和相关插件) sudo apt-get install git 2,cmake(用来编译clang-llvm) sudo apt-get install build-esse ...
- vim配置 高亮+自动缩进+行号+折叠+优化
一:修改 .vimrc即可 二: set nocompatible " 关闭 vi 兼容模式syntax on " 自动语法高亮colorscheme molokai " ...
- 使用webpack从0搭建多入口网站脚手架,可复用导航栏/底部通栏/侧边栏,根据页面文件自动更改配置,支持ES6/Less
之前只知道webpack很强大,但是一直没有深入学习过,这次从头看了一下教程,然后从0开始搭建了一个多入口网站的开发脚手架,期间遇到过很多问题,所以有心整理一下,希望能给大家一点帮助. 多HTML网站 ...
- VS Code - Vim 插件自动切换输入法
前言: 在使用 Linux 的过程中,vim 是一个不错的编辑器,以至于多数人将其用成了习惯,在没有 vim 的环境下还是习惯用 vim 的快捷键来编辑文本.所以便有开发者们为众多的 IDE 和文本编 ...
- 在 Visual Studio 等编辑器/IDE中自动切换输入法,不需要手动的有没有?
使用Visual Studio写代码,经常遇到的一个问题就是切换中文输入法麻烦,输入完注释//,要切换到中文,输入完引号,要输入中文,然后还需要切换回来,有没有? 有时候中文输入法忽然失效有没有?明明 ...
- Env:VIM配置
注:文章来自于http://www.cnblogs.com/ma6174/archive/2011/12/10/2283393.html 花了很长时间整理的,感觉用起来很方便,共享一下. 我的vim配 ...
随机推荐
- MySQL MHA信息的收集【Filebeat+logstash+MySQL】
一.项目背景 随着集团MHA集群的日渐增长,MHA管理平台话越来越迫切.而MHA平台的建设第一步就是将这些成百上千套的MHA集群信息收集起来,便于查询和管理. MHA主要信息如下: (1)基础配置信息 ...
- Go语言基础: JSON序列化
JSON 是一种轻量级的数据交换格式.简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言. 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率. 首先得熟悉结构体: pack ...
- 重复delete 对象指针后的 异常调用栈怪异 解析
Release版VC6 MFC程序 程序正常退出时得到一个如下异常调用栈: 0:000> kb # ChildEBP RetAddr Args to Child WARNING: Frame I ...
- devops-5:从0开始构建一条完成的CI CD流水线
从0开始构建一条完成的CI CD流水线 前文中已经讲述了静态.动态增加agent节点,以动态的k8s cloud为例,下面就以Maven构建Java程序为例,开始构建出一条完整的CI CD流水线. 实 ...
- Python 使用列表一部分(切片)
使用列表的一部分(切片) 处理列表的部分元素 切片 指定第一个元素的索引和最后一个元素索引加1 列表名[索引:索引+1] 索引加1:列表中第索引个元素 (左包括右不包括) 未指定索引 列表名[:] 提 ...
- vscode使用git推送代码
下载vscode https://code.visualstudio.com/ 点击应用管理 搜素Chinese (Simplified) Language Pack for Visual Studi ...
- 【Vue2】编程式路由导航
在Vue Router中,除了使用 创建 a 标签来定义导航链接之外,还可以使用Vue Router通过编写代码来实现导航. 他提供的三个实例方法:router.push.router.replace ...
- 2023-01-03:超过5名学生的课。编写一个SQL查询来报告 至少有5个学生 的所有班级,返回结果不限顺序。请问sql语句如何写? +---------+ | class | +-----
2023-01-03:超过5名学生的课.编写一个SQL查询来报告 至少有5个学生 的所有班级,返回结果不限顺序.请问sql语句如何写? ±--------+ | class | ±--------+ ...
- 2022-07-10:以下go语言代码输出什么?A:A,B;B:A,C:A,fatal error;D:fatal error... func main() { var m sync.Mute
2022-07-10:以下go语言代码输出什么?A:A,B:B:A,C:A,fatal error:D:fatal error- func main() { var m sync.Mutex fmt. ...
- 2022-04-22:给你一个大小为 m x n 的矩阵 board 表示甲板,其中,每个单元格可以是一艘战舰 ‘X‘ 或者是一个空位 ‘.‘ ,返回在甲板 board 上放置的 战舰 的数量。 战舰
2022-04-22:给你一个大小为 m x n 的矩阵 board 表示甲板,其中,每个单元格可以是一艘战舰 'X' 或者是一个空位 '.' ,返回在甲板 board 上放置的 战舰 的数量. 战舰 ...