Skip to content

ztoiax/nvim

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

78 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

nvim

why nvim

即使是最新的 vim8.2 也还在用 select 系统调用 ,而 nvim 已经用 epoll

avatar

以下统计是 nvim 和 vim 的系统调用测试:

先打开 nvim 和 vim , 然后通过 strace 查看它们的系统调用

sudo strace -p $(pgrep -of nvim) 2>&1 | tee /tmp/nvim.log
sudo strace -p $(pgrep -of vim) 2>&1 | tee /tmp/vim.log

分别在 vim 和 nvim 简单的操作后关闭,通过 awk 进行统计

awk -F '(' '{print $1}'  /tmp/nvim.log | sort | uniq -c | sort -n
awk -F '(' '{print $1}'  /tmp/vim.log | sort | uniq -c | sort -n
  • 左为 nvim
  • 右为 vim avatar

可以用 nvim -d 代替 vimdiff

  • 编辑远程文件
nvim scp://user@host//etc/fstab

在 vim 配置文件加入

command! Ecentos :e scp://root@192.168.100.208//
command! Esuse :e scp://root@192.168.100.71//

常用命令

" 查看map
:map

" 查看command
:command

" 查看autocmd
:autocmd
  • 加密文件
# 打开文件需要密码。第一次打开可以设置密码。只支持vim,不支持nvim
vim -x <filename>

-V参数debug

  • 默认
" 查看mapped key
:verbose map s
v  s             S
        Last set from Lua
n  s             ys
        Last set from Lua
  • 'nvim -V1',显示更详细的日志
:verbose map s
v  s             S
        Last set from ~/.config/nvim/vim/_editor.lua
n  s             ys
        Last set from ~/.config/nvim/vim/_editor.lua
  • 设置调试信息为20,并保存为vimlog文件
nvim -V20vimlog

socket通信(需要neovim 0.7)

  • server
nvim --listen /tmp/nvim.pipe
  • client
# 打开文件
nvim --server /tmp/nvim.pipe --remote file

# 执行命令
nvim --server /tmp/nvim.pipe --remote-send ':echo "hello world"<cr>'
  • 安装
pip3 install neovim-remote
  • 查看server的path
echo v:servername
  • export环境变量,指定server的path
export NVIM_LISTEN_ADDRESS="/tmp/nvimsocket"

# 或者:nvr指定path
nvr --servername /tmp/nvimsocket
  • 基本操作
# 打开文件
nvr file file1

# 查看变量bufname
nvr --remote-expr 'bufname("")'

# 输入指定字符
nvr --remote-send 'iabc<esc>'

# 执行命令
nvr -cc terminal
nvr -c terminal

配置

  • 在学 linux 等开源软件的过程中,了解 vim 的操作到安装各种高效率插件.花费了大量的时间,打造成现在的配置.

  • 早期参考最多是 Thinkvim

  • 现在已经根据自己的需求, 自定义化了

一共有80 个插件 avatar

  • 可以在 vim 打开 htop glance 等终端命令,进行监控 avatar

  • 快速打开最近使用过的文件 avatar avatar

  • ag插件(类似 grep)预览包含linux(我这里输入的是linux)的文件,选择文件后在 vim 里打开 avatar

使用lazygit,对git进行快速管理 avatar


  • 以上几个插件是比较直观,使用比较多的
  • 还有几十个插件,有机会我会一并整理出来

tips(技巧)

查找中文: 按下 / 输入 [^\x00-\xffk]

共享远程服务器的剪切板

vim.loop异步消息循环(libuv)

local M = {}

function M.convertFile()
	-- 当前buf的文件名不包含扩展名
	local shortname = vim.fn.expand("%:t:r")
	-- 当前buf的文件名
	local fullname = vim.api.nvim_buf_get_name(0)

	-- 通过loop.spawn使用pandoc将mardown文件转换为html
	handle = vim.loop.spawn("pandoc", {
		args = {
			fullname,
			"--to=html5",
			"-o",
			string.format("%s.html", shortname),
			"-s",
			"--highlight-style",
			"tango",
			"-c",
			"--css=pandoc.css",
		},
	}, function()
		print("DOCUMENT CONVERSION COMPLETE")
		handle:close()
	end)
end

return M
  • Grep
local M = {}
local results = {}

-- 处理文本的函数。读取到数据时,把数据插入到results表中
local function onread(err, data)
	if err then
		print("ERROR: ", err)
		-- TODO handle err
	end
	if data then
		table.insert(results, data)
	end
end

function M.asyncGrep(term)
	local stdout = vim.loop.new_pipe(false)
	local stderr = vim.loop.new_pipe(false)
	local function setQF()
	    -- 以 Quickfix 列表的形式展示出来
		vim.fn.setqflist({}, "r", { title = "Search Results", lines = results })
		vim.api.nvim_command("cwindow")

		-- 清空results
		local count = #results
		for i = 0, count do
			results[i] = nil
		end
	end
	handle = vim.loop.spawn(
		"rg",
		{
			args = { term, "--vimgrep", "--smart-case" },
			stdio = { nil, stdout, stderr },
		},
		-- 回调函数
		vim.schedule_wrap(function()
			stdout:read_stop()
			stderr:read_stop()
			stdout:close()
			stderr:close()
			handle:close()
			setQF()
		end)
	)
	vim.loop.read_start(stdout, onread)
	vim.loop.read_start(stderr, onread)
end

return M
" 设置Grep命令
command! -nargs=+ -complete=dir -bar Grep lua require'tools'.asyncGrep(<q-args>)

Plugin

# 查看nvim每个require的启动时间
nvim --startuptime /tmp/nvim-startuptime

UI 相关

通过浮动终端打开 htop glance

" floaterm variable
let g:floaterm_height = 0.9
let g:floaterm_width = 0.9
let g:floaterm_position = 'center'

function! OpenAnimatedHtop() abort
  " Open a htop in terminal
  new term://htop
  " Send window to bottom and start with small height
  wincmd J | resize 1
  " Animate height to 66%
  call animate#window_percent_height(0.66)
endfunction
command! Htop call OpenAnimatedHtop()

"绑定快捷键为<leader>th
nnoremap <leader>th :Htop<CR>

avatar

File manager(文件管理器)

LeaderF打开 MRU(最近打开过的文件):

avatar

"快捷键为<leader>fm
nmap <Leader>fm :<C-U><C-R>=printf("Leaderf --regexMode mru %s", "")<CR><CR>

通过 floaterm 插件打开 ranger 文件管理器:

command! Ranger FloatermNew ranger
nmap <Leader>fr :Ranger<CR>

avatar

ohter iterm:

Search 搜索

leaderf 正则表达式搜索当前文件:

nmap <Leader>f/ :<C-U><C-R>=printf("Leaderf --regexMode line %s", "")<CR><CR>

avatar

leaderf 在当前文件搜索光标所在的单词:

nmap <Leader>f. :<C-U><C-R>=printf("Leaderf rg --current-buffer -e %s ", expand("<cword>"))<CR><CR>

avatar

leaderf 在当前文件搜索光标所在的单词:

nmap <Leader>fa :<C-U><C-R>=printf("Leaderf rg -e %s ", expand("<cword>"))<CR><CR>

avatar

ag(类似 grep)插件配合fzf插件对当前目录下的所有文件search and open: avatar

tags 跳转

leaderf 跳转 tags

"自动生成tags
let g:Lf_GtagsAutoGenerate = 1
let g:Lf_Gtagslabel = 'native-pygments'

" 跳转函数声明和调用
nmap <Leader>fe :<C-U><C-R>=printf("Leaderf  gtags -r %s --auto-jump"word, expand("<cword>"))<CR><CR>

" 跳转至函数定义
nmap <Leader>fd :<C-U><C-R>=printf("Leaderf  gtags -d %s --auto-jump", expand("<cword>"))<CR><CR>

avatar

any-jump跳转 tags avatar

lib

# 安装nvim-oxi
cargo add nvim-oxi

git

通过 floaterm 插件打开 lazygit 一个 git tui:

avatar

安装lsp:

sudo npm i -g pyright
# or pylsp
pip install python-lsp-server

# html,css,json,js,ts
sudo npm i -g vscode-langservers-extracted

# markdown
paru -S marksman-bin

sudo npm i -g typescript typescript-language-server
sudo npm i -g yaml-language-server
sudo npm i -g bash-language-server
sudo npm i -g vim-language-server
sudo npm i -g dockerfile-language-server-nodejs
sudo npm i -g diagnostic-languageserver
sudo npm install -g ansible-language-server
pip3 install cmake-language-server

# rust
pacman -S rust-analyzer

# go
sudo pacman -S gopls
go install github.com/sqls-server/sqls@latest

# java
paru -S jdtls

# lua-language-server
pacman -S lua-language-server

# 手动编译(失败)
# install ninja
sudo pacman -S ninja
git clone https://github.com/sumneko/lua-language-server
cd lua-language-server
git submodule update --init --recursive

cd 3rd/luamake
./compile/install.sh
cd ../..
./3rd/luamake/luamake rebuild

markdown插件需要安装软件

# markdown转思维导图
sudo npm install -g @mermaid-js/mermaid-cli
pacman -S plantuml
pacman -S d2
# python
pip install autopep8

# lua
pacman -S stylua

# js ts json html css yaml xml
pacman -S prettier
paru -S prettierd

# nginx
paru -S nginxbeautifier

# shell
pacman -S shfmt

# c/cpp
paru -S clang-format-static-bin

# go
paru -S gofumpt

# docker
go install github.com/jessfraz/dockfmt@latest

# markdwon
go install github.com/shurcooL/markdownfmt@latest

# sql
go install github.com/jackc/sqlfmt@latest
pip install debugpy

编程语言相关的配置

部分代码运行SnipRun

vmap <F6> :SnipRun<CR>

avatar

调试

# 使用插件floaterm, 定义终端打开后要执行的命令
command! Pudb FloatermNew python -m pudb %

# 按F5调试当前文件
au FileType python nmap  <F5> :Pudb<CR>
au FileType python imap  <F5> <ESC>:Pudb<CR>

avatar

  • 按F7使用mypy, 对当前文件, 进行静态类型检查
au FileType python nmap <F7> :!mypy %:p<CR>
au FileType python imap <F7> <ESC>:!mypy %:p<CR>
# 安装最新版neovim
bob install nightly
bob install 0.8.1

# 查看安装的版本
bob ls

# 使用nightly版本
bob use nightly

nvim with python

from pynvim import attach
# 连接socket
nvim = attach('socket', path='/tmp/nvimsocket')

# 打开文件
nvim.vars['file_to_edit1'] = '/home/tz/.zshrc'

# 执行命令
nvim.command('exe "edit " . g:file_to_edit1')

# 输入
nvim.input('')

reference

other vim ui

online tool

About

my nvim config

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published