0%

macOS下vim的调整和优化2022

新年伊始,
在因为手术和家里的事情荒废了差不多一年后,
开始准备尝试写点东西了.

首先我对vim进行了一些调整和优化
为了避免之前笔记丢失的情况,直接记在blog里方便查找

输入

首先是在mac上的输入的问题

vim中输入法的切换

因为vim拥有多种模式,而在normal和insert模式下切换的时候,
normal模式并不会自动改变输入法,导致移动的键盘输入也会被识别为拼音,
在这种情况下,如果使用中文写作,就会需要频繁的切换输入法,
每次进入和退出insert模式都需要敲一次Ctrl+Space,

这个问题其实我以前在Linux下面是尝试用fcitx-switch解决的,
不过在mac下一直没有解决.

这次终于找到了一个好的解决办法.
参考 macOS下vim 中文输入法切换问题和两种解决方案

尝试后两种方式都可以使用,
不过第一种方法我使用的repo是 'rlue/vim-barbaric'

vimrc的配置里面需要加上

1
2
let g:barbaric_ime = 'macos'
let g:barbaric_default = 1

不过在使用<esc>来退出输入模式的时候,需要连按两次,因此我使用<ctrl-c>来进行退出
尝试了一会后我使用的是vim-barbaric加xkbswitch的方式

另外我将输入法里中文的标点换成了半角符号,
这样虽然不是很好看,但是保持了中英文混合输入时标点的一致,
不过mac的简体输入法依然会将 ` 转换为·

1
注: 这段文字的markdown代码要使用<code>`</code>才能正确显示`

HHKB中Fn的键位

我使用的键盘是hhkb,有一个问题就是Fn键位离有点远,但是在vim中我设置的键位又经常用到F1~F5这些快捷键,如果不改键的话,每次都要去最右边点击
而hhkb默认的跳线只能将左边的commandFn切换,所以我使用了Karabiner进行改键,
在simple modification里面直接将right_command替换为Fn即可

另外不知道是不是跳线的问题还是默认键盘键位的设置问题,我需要将left_controlcapslock互换,才能在HHKB上正常切换输入法.

终端

vim 8.1增加了终端,方便运行终端命令
我还写了一个方便使用的插件,simpleterm,在执行简单的终端命令时很好用

终端的色彩问题

不过vim内置的终端有个问题就是默认的颜色很难识别,特别是dark blue,
因此我们需要修改下默认颜色,
这里我使用了iTerm里的Pastel的色彩配置,
不想动手一个个从iTerm里复制的话可以用如下代码,
直接放到vimrc里即可

1
2
3
let g:terminal_ansi_colors = 
\['#616161', '#f08978', '#c3f884', '#fefdc8', '#afd4fa', '#f295f7', '#d0d1fa', '#f1f1f1'
\,'#8e8e8e', '#f7c6bf', '#ddfbc0', '#fefdd9', '#c8e2fc', '#f5b5f9', '#e5e6fc', '#fffeff']

终端我使用的是zsh,theme 是 sobolevn/sobole-zsh-theme

vim的首页

一直以来,进入vim都需要我们主动打开文件或者打开一个session
(session一般翻译成会话,我觉得译的有点问题,但也没有找到更好的翻译,
可以看成是编辑器里多个文档的编辑进度和状态),
这次我终于想起是不是像vscode一样,有类似浏览器首页的东西方便使用,

找到了这个 vim-startify,用起来还不错,
不过session我用的还是我以前使用的tpope/vim-obsession,
因为都是使用的vim的session格式,这个插件可以正常读取,所以可以直接使用

注:我的session配置如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
Plug 'tpope/vim-obsession'

set ssop=blank,curdir,help,resize,tabpages,winpos,winsize

let _p = expand('~/.vim/session')
if !isdirectory(_p)
call mkdir(_p, 'p')
endif


fun! s:save_session(ses)
if a:ses != ''
exe 'Obsession ~/.vim/session/' . a:ses
else
Obsession ~/.vim/session/default.vim
endif
endfun

fun! s:load_session(ses)
if a:ses != ''
exe 'so ~/.vim/session/' . a:ses
else
so ~/.vim/session/default.vim
endif
endfun

fun! s:restart()
execute 'wa'
call system('gvim -c "Load"')
quitall
endfun

com! -nargs=? -complete=customlist,ListSess Save call s:save_session(<q-args>)
com! -nargs=? -complete=customlist,ListSess Load call s:load_session(<q-args>)
com! -nargs=0 Restart :call s:restart()

func! ListSess(A,L,P)
let _ls = split(globpath('~/.vim/session/', '*'), "\n")
let _ls = map(_ls, "fnamemodify(v:val, ':t')")
return _ls
endfun

cabbrev save Save
cabbrev load Load
cabbrev restart Restart

简而言之,:Save保存当前session,:Load加载session

文件的查找

一直以来我使用Ctrl-P来查找文件,rking/ag.vim来查找文件内的内容,
不过ag其实并不好用,只不过比更不好用的grep强而已
fzf我安装了但是没怎么用过,不过因为我认为他是查找文件名的,直到今天我看到一篇文章介绍fzf的,才发现fzf的好用
Improving Vim Workflow With fzf

也就是fzf的作者开发的fzf.vim其实已经支持了ag/rg的功能,并且支持实时预览,
实时预览还使用了vim8.2的popup window的新特性,

作为一个vim插件作者和重度使用者,这个新特性我期待了十年以上,
看到的时候还是要惊叹,真是太酷了!

使用也很简单,用:Ag就可以调出这个窗口(注意要删掉rking/ag.vim)

配置也很简单,我用<Ctrl-k>来唤出实时查找的窗口:

1
2
3
4
5
Plug 'junegunn/fzf', { 'do': { -> fzf#install() } }
Plug 'junegunn/fzf.vim'

" popup window for search word and preview real time
noremap <c-k> :Ag<CR>

vimrc的分享

我的vimrc
不过有些地方还是很久以前写的
另外这个配置实际上是一个插件的写法,还是写的太过复杂了,
需要慢慢将它简化了再做分享