linux Vim打造python编辑器
1. 安装vim8.2+
- 查看vim版本(我使用的9.0版本):
1 2 3 4 5 | vim -version -- VIM - Vi IMproved 9.0 (2022 Jun 28, compiled Nov 22 2022 17:34:53) -- Garbage after option argument: "-version" -- More info with: "vim -h" |
- 查看是否支持python3,前边没有'+'的重新安装vim
vim打开任意文件输入:version
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | VIM - Vi IMproved 9.0 (2022 Jun 28, compiled Nov 22 2022 17:34:53) Included patches: 1-916 Compiled by root@kali Huge version without GUI. Features included (+) or not (-): +acl -clientserver + diff +folding +langmap +mouse_dec +num64 +reltime +syntax +title +wildmenu +arabic -clipboard +digraphs -footer +libcall -mouse_gpm +packages +rightleft +tag_binary -toolbar +windows +autocmd +cmdline_compl -dnd +fork() +linebreak -mouse_jsbterm +path_extra -ruby -tag_old_static +user_commands +writebackup +autochdir +cmdline_hist -ebcdic -gettext +lispindent +mouse_netterm -perl +scrollbind -tag_any_white +vartabs -X11 -autoservername +cmdline_info +emacs_tags -hangul_input +listcmds +mouse_sgr +persistent_undo +signs -tcl +vertsplit -xfontset -balloon_eval +comments + eval +iconv +localmap -mouse_sysmouse +popupwin +smartindent +termguicolors +vim9script -xim +balloon_eval_term +conceal +ex_extra +insert_expand -lua +mouse_urxvt +postscript -sodium +terminal +viminfo -xpm -browse +cryptv +extra_search +ipv6 +menu +mouse_xterm +printer -sound +terminfo +virtualedit -xsmp ++builtin_terms +cscope -farsi +job +mksession +multi_byte +profile +spell +termresponse +visual -xterm_clipboard +byte_offset +cursorbind +file_in_path +jumplist +modify_fname +multi_lang -python +startuptime +textobjects +visualextra -xterm_save +channel +cursorshape +find_in_path +keymap +mouse -mzscheme +python3 +statusline +textprop +vreplace +cindent +dialog_con +float +lambda -mouseshape +netbeans_intg +quickfix -sun_workshop +timers +wildignore system vimrc file : "$VIM/vimrc" user vimrc file : "$HOME/.vimrc" 2nd user vimrc file : "~/.vim/vimrc" user exrc file : "$HOME/.exrc" defaults file : "$VIMRUNTIME/defaults.vim" fall-back for $VIM: "/usr/local/vim/share/vim" Compilation: gcc -c -I. -Iproto -DHAVE_CONFIG_H -g -O2 -D_REENTRANT -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1 Linking: gcc -L /usr/local/lib -Wl,--as-needed -o vim -lm -ltinfo -lrt -ldl -L /usr/lib/python3 .10 /config-3 .10-x86_64-linux-gnu -lpython3.10 -lcrypt -lpthread -ldl -lutil -lm -lm |
- 编译安装vim
解压后进入vim-master执行(./configure --help可查看参数):
1 2 3 4 5 | 1. . /configure --prefix= /usr/local/vim/ -- enable -python3interp # 如果这一步出错,需要根据出错原因安装指定库 # make clean --清除之前编译的可执行文件及配置文件 # make distclean --如果make出错时执行,调整后再重新make 2. make && make install 3. ln -s /usr/local/vim/bin/vim /usr/bin/vim |
2. node安装
- 下载
将下载的包在/usr/local下解压并创建链接:
1 2 | ln -s /usr/local/node/bin/node /usr/local/bin # 引入node ln -s /usr/local/node/bin/npm /usr/local/bin # 引入npm |
- 查看版本
1 | node --version |
- 注意
这里的安装包在解压后需要查看/usr/local/node/bin/下是否为软链接,不是的话需要删掉原来的npm,npx,corepack手动创建软链接:
cd /usr/local/node/bin
rm npm,npx,corepack # 删除原来的三个文件
ln -s ../lib/node_modules/corepack/dist/corepack.js /home/node/bin/corepack
ln -s ../lib/node_modules/npm/bin/npm-cli.js /home/node/bin/npm
ln -s ../lib/node_modules/npm/bin/npx-cli.js /home/node/bin/npx
3. 配置~/.vimrc文件
- 修改.vimrc文件(没有的手动创建),查看文件换行符:set ff?,linux下如果结果是dos,则需要设置成unix,:set ff=unix,本来才用defx作为目录插件,但是发现在一些机器配置过程中会有问题,所以改用coc-explorer.
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 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 | "-----------------------------------------------" " 基础设置 " "-----------------------------------------------" set modelines=0 " 禁用模式行(安全措施) syntax on " 语法高亮 filetype on " 开启文件类型检测 set encoding=utf-8 " 编码设置 set number " 显示行号 set relativenumber " 显示相对行号 set smartindent " 智能缩进 set autoindent " 自动对齐 set smarttab set tabstop=4 " tab缩进 set shiftwidth=4 " 设定自动缩进为4个字符 set expandtab " 用space替代tab的输入 set splitright " 设置左右分割窗口时,新窗口出现在右侧 set splitbelow " 设置水平分割窗口时,新窗口出现在底部 set nobackup " 不需要备份 set noswapfile " 禁止生成临时文件 set autoread " 文件自动检测外部更改 set nocompatible " 去除 vi 一致性 set ambiwidth=double " 解决中文标点显示的问题 set nowrap " 不自动折行 set mouse=a " 使用鼠标 set mousehide " 输入时隐藏光标 set sm! " 高亮显示匹配括号 set hlsearch " 高亮查找匹配 set cursorline " 高亮显示当前行 set termguicolors " 启用终端真色 set showmatch " 显示匹配 set ruler " 显示标尺,在右下角显示光标位置 set novisualbell " 不要闪烁 set showcmd " 显示输入的命令 " 设置光标样式 let &t_SI = "\<Esc>]50;CursorShape=1\x7" let &t_SR = "\<Esc>]50;CursorShape=2\x7" let &t_EI = "\<Esc>]50;CursorShape=0\x7" set completeopt=longest,menu " 自动补全配置让Vim补全菜单行为跟IDE一致 set backspace=indent,eol,start " 允许用退格键删除字符 let g:markdown_fenced_languages =[ 'c' , 'cpp' , 'python' , 'javascript' ] set guifont=SimSun-ExtB:h14 " 设置字体和字体大小 " 禁止显示滚动条 set guioptions-=l set guioptions-=L set guioptions-=r set guioptions-=R " 禁止显示菜单和工具条 set guioptions-=m set guioptions-=T "-----------------------------------------------" " 自定义功能 " "-----------------------------------------------" " 格式化json格式-------------------- command ! JsonFormat :execute '%!python -m json.tool' \ | :execute '%!python -c "import re,sys;chr=__builtins__.__dict__.get(\"unichr\", chr);sys.stdout.write(re.sub(r\"\\u[0-9a-f]{4}\", lambda x: chr(int(\"0x\" + x.group(0)[2:], 16)), sys.stdin.read()))"' \ | :%s/ \+$ //ge \ | : set ft=javascript \ | :1 map <F4> <Esc>:JsonFormat<CR> " 快捷键绑定------------------------- let mapleader='\' noremap <TAB>w <C-w>w " 使用方向键切换buffer noremap <Leader><left> :bp<CR> noremap <Leader><right> :bn<CR> " 使用 \ + s 保存 noremap <Leader>s :w<CR> "-----------------------------------------------" " 插件安装 " "-----------------------------------------------" call plug #begin('~/.vim/plugged') " if has( 'nvim' ) " Plug 'Shougo/defx.nvim' , { 'do' : ':UpdateRemotePlugins' } " else " Plug 'Shougo/defx.nvim' " Plug 'roxma/nvim-yarp' " Plug 'roxma/vim-hug-neovim-rpc' " endif Plug 'Yggdroot/indentLine' Plug 'morhetz/gruvbox' Plug 'joshdick/onedark.vim' Plug 'vim-airline/vim-airline' Plug 'mhinz/vim-startify' Plug 'ryanoasis/vim-devicons' " Plug 'kristijanhusak/defx-icons' Plug 'sbdchd/neoformat' Plug 'beautify-web/js-beautify' Plug 'preservim/nerdcommenter' Plug 'mattn/emmet-vim' Plug 'skywind3000/asyncrun.vim' Plug 'neoclide/coc.nvim' , { 'branch' : 'release' } Plug 'Yggdroot/LeaderF' , { 'do' : ':LeaderfInstallCExtension' } call plug #end() "-----------------------------------------------" " 插件设置 " "-----------------------------------------------" "----------asyncrun------------- let g:asyncrun_open=10 let g:asyncrun_save=1 noremap <silent> <F5> :call CompileRun()<CR> func! CompileRun() exec "w" if &filetype == 'c' exec ':AsyncRun -mode=term -pos=hide gcc "$(VIM_FILEPATH)" -o "$(VIM_FILEDIR)/$(VIM_FILENOEXT)"' exec ":AsyncRun -mode=term -pos=bottom -rows=10 -focus=0 $(VIM_FILEDIR)/$(VIM_FILENOEXT)" elseif &filetype == 'cpp' exec ':AsyncRun -pos=hide g++ -O3 "$(VIM_FILEPATH)" -o "$(VIM_FILEDIR)/$(VIM_FILENOEXT)" -lpthread' exec ":AsyncRun -mode=term -pos=bottom -rows=10 -focus=0 $(VIM_FILEDIR)/$(VIM_FILENOEXT)" elseif &filetype == 'python' exec ":AsyncRun -mode=term -pos=bottom -rows=10 -focus=0 python3 $(VIM_FILEPATH)" elseif &filetype == 'html' exec ":! %" elseif &filetype == 'go' exec ":AsyncRun -mode=term -pos=hid go build $(VIM_FILEDIR)/$(VIM_FILENOEXT)" exec ":AsyncRun -mode=term -pos=bottom -rows=10 -focus=0 go run $(VIM_FILEPATH)" elseif &filetype == 'javascript' exec ":AsyncRun -mode=term -pos=bottom -rows=10 -focus=0 node $(VIM_FILEPATH)" endif endfunc "----------Startify------------- noremap <Leader>bh :Startify<CR> "-----------neoformat----------- let g:neoformat_try_node_exe = 1 "保存时自动格式化代码 "这个自动命令里面用到的事件是BufWritePre,这个事件会在保存_任何_字符到文件之前触发。 augroup fmt autocmd! autocmd BufWritePre * :Neoformat augroup END "------------indentLine---------- "解决markdown文件*号隐藏问题 let g:markdown_syntax_conceal=0 let g:vim_json_conceal=0 "---------- set theme ------------ set vb t_vb= set background=dark "colorscheme gruvbox colorscheme onedark "----------airline------------ let g:airline #extensions#tabline#enabled = 1 let g:airline #extensions#tabline#left_sep = '>' let g:airline #extensions#tabline#left_alt_sep = '*' let g:airline #extensions#tabline#formatter = 'unique_tail' let g:airline #extensions#tabline#buffer_nr_show = 1 "显示buffer编号 let g:airline #extensions#tabline#buffer_nr_format = '%s:' let g:airline #extensions#battery#enabled = 1 let g:airline_left_sep = '>' let g:airline_left_alt_sep = '*' let g:airline_theme= 'onedark' " let g:airline #extensions#tabline#overflow_marker = '… ' " let airline #extensions#tabline#current_first = 1 "-----------defx---------------- " 使用 F3/<Leader>+f+t 切换显示文件浏览,使用 ;a 查找到当前文件位置 " let g:maplocalleader= ';' " nnoremap <silent> <F3> " \ :<C-u>Defx -resume -toggle -buffer-name=tab`tabpagenr()`<CR> " " nnoremap <silent> <Leader>ft " \ :<C-u>Defx -resume -toggle -buffer-name=tab`tabpagenr()`<CR> " " nnoremap <silent> <LocalLeader>a " \ :<C-u>Defx -resume -buffer-name=tab`tabpagenr()` -search=` expand ( '%:p' )`<CR> " " " 初始化 " call defx #custom#option('_', {'columns': 'indent:git:icons:filename','winwidth': 28,'split': 'vertical','direction': 'topleft','listed': 1,'toggle': 1,'resume': 1,'show_ignored_files': 0,'root_marker': '[in]:'}) " " call defx #custom#column('indent', {'indent': ' ',}) " " " 快捷键绑定 " autocmd FileType defx call s:defx_my_settings() " function ! s:defx_my_settings() abort " " Define mappings " nnoremap <silent><buffer>< expr > <CR> " \ defx #do_action('multi', ['drop']) " nnoremap <silent><buffer>< expr > c " \ defx #do_action('copy') " nnoremap <silent><buffer>< expr > m " \ defx #do_action('move') " nnoremap <silent><buffer>< expr > p " \ defx #do_action('paste') " nnoremap <silent><buffer>< expr > l " \ defx #is_directory() ? " \ defx #do_action('open_tree', 'toggle') : " \ defx #do_action('multi', ['drop']) " nnoremap <silent><buffer>< expr > E " \ defx #do_action('open', 'vsplit') " nnoremap <silent><buffer>< expr > D " \ defx #do_action('new_directory') " nnoremap <silent><buffer>< expr > F " \ defx #do_action('new_file') " noremap <silent><buffer>< expr > r " \ defx #do_action('rename') " nnoremap <silent><buffer>< expr > d " \ defx #do_action('remove') " noremap <silent><buffer>< expr > B " \ defx #is_directory() ? " \ defx #do_action('cd', ['..']) : " \ defx #do_action('close_tree') " nnoremap <silent><buffer>< expr > q " \ defx #do_action('quit') " nnoremap <silent><buffer>< expr > . " \ defx #do_action('toggle_ignored_files') " endfunction nnoremap <F3> <Cmd>CocCommand explorer<CR> "-----------defx-icons(defaults)--------------- " let g:defx_icons_enable_syntax_highlight = 1 " let g:defx_icons_column_length = 1 " let g:defx_icons_directory_icon = '' " let g:defx_icons_mark_icon = '*' " let g:defx_icons_copy_icon = '' " let g:defx_icons_link_icon = '' " let g:defx_icons_move_icon = '' " let g:defx_icons_parent_icon = '' " let g:defx_icons_default_icon = '' " let g:defx_icons_directory_symlink_icon = '' " let g:defx_icons_root_opened_tree_icon = '' " let g:defx_icons_nested_opened_tree_icon = '' " let g:defx_icons_nested_closed_tree_icon = '' "-----------注释------- "" Create default mappings let g:NERDCreateDefaultMappings = 1 " Add spaces after comment delimiters by default let g:NERDSpaceDelims = 1 " Use compact syntax for prettified multi-line comments let g:NERDCompactSexyComs = 1 " Align line-wise comment delimiters flush left instead of following code indentation let g:NERDDefaultAlign = 'left' " Set a language to use its alternate delimiters by default let g:NERDAltDelims_java = 1 " Add your own custom formats or override the defaults let g:NERDCustomDelimiters = { 'c' : { 'left' : '/**' , 'right' : '*/' } } " Allow commenting and inverting empty lines (useful when commenting a region) let g:NERDCommentEmptyLines = 1 " Enable trimming of trailing whitespace when uncommenting let g:NERDTrimTrailingWhitespace = 1 " Enable NERDCommenterToggle to check all selected lines is commented or not let g:NERDToggleCheckAllLines = 1 " 快捷键 : " <leader>ci "---------------emmet-vim---------- let g:user_emmet_install_global = 0 autocmd FileType html,css EmmetInstall let g:user_emmet_leader_key= '<C-e>' "-------------coc-nvim------------- let g:coc_global_extensions = [ 'coc-json' , 'coc-vimlsp' , 'coc-pyright' , 'coc-explorer' , 'coc-sql' ] "----------LeaderF---------------- let g:Lf_HideHelp = 1 " popup mode let g:Lf_WindowPosition = 'popup' let g:Lf_PreviewInPopup = 1 " 快捷键绑定 let g:Lf_ShortcutF = "<leader>ff" let g:Lf_ShortcutB = "<leader>fb" " 排除搜索的文件夹和文件 let g:Lf_WildIgnore = { 'dir' : [ '.svn' , '.git' , '.hg' , 'venv' , '.vscode' , '.SpaceVim.d' ], 'file' : [ '*.sw?' , '~$*' , '*.bak' , '*.exe' , '*.o' , '*.so' , '*.py[co]' ]} |
- 自动补全html标签可在.vimrc上添加下边配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | " html自动补全 autocmd BufNewFile * setlocal filetype=html function ! InsertHtmlTag() let pat = '\c<\w\+\s*\(\s\+\w\+\s*=\s*[' '#$;,()."a-z0-9]\+\)*\s*>' normal! a> let save_cursor = getpos( '.' ) let result = matchstr(getline(save_cursor[1]), pat) if (search(pat, 'b' , save_cursor[1])) normal! lyiwf> normal! a</ normal! p normal! a> endif :call cursor(save_cursor[1], save_cursor[2], save_cursor[3]) endfunction inoremap > <ESC>:call InsertHtmlTag()<CR>a<CR><Esc>O |
- 安装插件管理工具vim-plug
在root目录下创建.vim文件夹,进入然后再创建autoload文件夹,然后执行(速度慢可直接下载plug.vim放到对应目录下即可):
1 2 | curl -fLo ~/.vim /autoload/plug .vim --create- dirs \ https: //raw .githubusercontent.com /junegunn/vim-plug/master/plug .vim |
- 插件安装
-
- 状态栏美化 vim-airline
- 缩进线插件 indentLine
- 代码格式化插件 neoformat
- 异步运行插件 asyncrun.vim
- 代码补全插件 coc.nvim
- 模糊查找 LeaderF
- 颜色主题 onedark.vim
vim打开任意文件执行:PlugInstall下载相应插件(速度慢直接下载,解压后放在~/.vim/plugged/*)
- 字体设置
1 2 | : set guifont # 查看当前字体 : set guifont=* # 显示支持的所有字体,可以自己调节字体大小和样式后选择并在vimrc文件中配置 |
4.icons乱码问题
如果你在配置中使用了特殊的icon但是显示有乱码,linux下可以执行文件,可能等待时间比较长,执行结束后会生成一个install.sh文件,执行此文件即可安装字体.
5.目录操作说明
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 | ? 显示帮助 * 选中文件或文件夹 l 打开文件夹或文件 o 关闭文件夹或打开文件夹 e 打开文件或目录 E 多文件显示 t 打开文件或目录并将当前文件夹或文件作为父目录 yp 复制绝对路径到剪切板 yn 复制文件名到剪切板 yy 复制文件 ya 追加复制的文件 p 粘贴文件 y<space> 清除文件复制 dd 剪切文件 da 追加剪切文件 d<space> 清除文件剪切 df 删除文件或目录到回收站 dF 永久删除文件或目录 a 添加新文件 A 添加新目录 r 重名文件或目录 q 退出资源管理器 gf 切换到文件根目录 gb 切换到缓冲器根目录 [[ 转到上一个源 ]] 转到下一个源 |
6.windows下gvim
gvim9.0下载安装好后,将上边plug.vim放在gvim安装目录中的autoload下,插件放在autoload同级目录下的plugs中(没有的新建这个目录),.vimrc改名为_vimrc,放在C:\Users\Administrator\下即可.
7.效果展示
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!