Skip to content

ztoiax/nvim

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

88 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

nvim

nvim对比vim

  • 即使是最新的 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的优缺点:追求功能,但缺乏稳定性

配置

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

一共有80 个插件 avatar

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

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

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

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

常用命令

" 查看map
:map

" 查看command
:command

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

-d 对比文件内容(diff)

  • 可以代替 vimdiff
# 在比较文件差异的同时能够编辑文件
nvim -d file file1
# 只需要查看文件差异而不希望修改文件
nvim -Rd file file1
  • 如果在nvim里并打开了file
" 水平比较
:vertical diffsplit file1
" 垂直比较
:diffsplit file1

-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.socket
  • client

    # 打开文件
    nvim --server /tmp/nvim.socket --remote file
    
    # 执行命令
    nvim --server /tmp/nvim.socket --remote-send ':echo "hello world"<cr>'
  • 也可以设置环境变量。每次打开nvim都会开启socket。但由于socket文件同名,这样只能开启一个nvim

    export NVIM_LISTEN_ADDRESS="/tmp/nvim.socket"
  • neovide的启动socket的参数

    neovide -- --listen /tmp/nvim.socket
  • 安装
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

编辑远程文件

nvim scp://user@host//etc/fstab

在配置文件下加入

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

还有几十个插件,有机会我会一并整理出来

tips(技巧)

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

qucikfix和grep、vimgrep、vimgrepadd、cexpr、make|cdo、cfdo

  • quickfix 通过一个特殊的缓冲区(quickfix window)显示错误或匹配项的列表。每个条目都包含文件名、行号和描述信息,用户可以通过快捷命令跳转到具体的错误位置。

  • 以下的vimgrep命令可以替换为grep命令,grep命令只是外部的linux命令。

    • 两者都可以导入到quickfix里面
    quickfix命令 描述
    :copen 打开quickfix
    :cclose 关闭quickfix
    :cwindow 在一个新窗口打开quickfix
    :cnext 跳转到下一个结果
    :cprev 跳转到上一个结果
    :cfirst 跳转到第一个结果
    :clast 跳转到最后一个结果
    :cfdo 对quickfix中的每个文件执行指定的命令
    :cdo 对quickfix中的每个行执行指定的命令
    :ldo 对quickfix中的有效行执行指定的命令
  • vimgrep命令和:copen打开qucikfix

    " 在当前buffer下,匹配dmenu的文本
    :vimgrep dmenu %
    " 或者使用vim,vim是vimgrep的简写
    :vim dmenu %
    " 使用quickfix打开匹配结果
    :copen
    
    " 在.mybin目录下,匹配dmenu的文本
    :vimgrep dmenu .mybin/**
    " 使用quickfix打开匹配结果
    :copen
    
    " 在.mybin目录下,后缀为.sh的文件下,匹配dmenu的文本
    :vimgrep dmenu .mybin/*.sh
    " 使用quickfix打开匹配结果
    :copen
  • vimgrepadd命令追加结果到quickfix

    " 在当前buffer下,匹配dmenu的文本
    :vimgrep dmenu %
    " 在当前buffer下,追加匹配map的文本
    :vimgrepadd map %
    " 使用quickfix打开匹配结果
    :copen
  • cfdocdo

    • cfdo性能更好一点
    • 如果你不想保存修改,可以不加 | update
    " 匹配dmenu
    :vimgrep dmenu %
    " 打开quickfix 
    :copen
    " 替换dmenu为replacement
    :cfdo %s/dmenu/replacement/g
    " 替换dmenu为replacement
    :cdo %s/dmenu/replacement/g
    
    " 删除
    :cdo delete | update
    " 删除
    :cfdo g/dmenu/d | update
    
    " 进入normal后执行dd命令
    :cdo normal dd
    
    " 进入normal后执行@a宏命令
    :cdo normal @a
    
    " !执行外部命令
    :cdo !echo %
  • cexpr:执行外部命令

    " 调用外部命令grep,并将结果导入到quickfix里面
    :cexpr system('grep -n "dmenu" *')
    " 打开quickfix 
    :copen
    
    " 调用外部命令find,并将结果导入到quickfix里面
    :cexpr system('find . -name *.lua') 
    " 打开quickfix 
    :copen

location和lgrep、lvimgrep、lmake、ldo、lfdo

  • Quickfix List 是全局的,适用于整个 Neovim 会话。它包含所有文件的错误或匹配项。

  • location 是局部的,与特定的窗口(buffer)关联。它只包含当前窗口相关的内容。

  • 两者用法差不多

共享远程服务uff器的剪切板

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

# typst
paru -S tinymist

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 compose-language-service
sudo npm i -g diagnostic-languageserver
sudo npm install -g ansible-language-server
pip3 install cmake-language-server
pip install nginx-language-server
paru -S diagnostic-languageserver

# rust
pacman -S rust-analyzer

# go
sudo pacman -S gopls

# sql
sudo npm i -g sql-language-server
paru -S go-sqls-git
# or
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

lint

paru -S sonarlint
paru -S luacheck
# python
paru -S python-ruff
paru -S shellcheck
pip install cmakelint
paru -S ansible-lint
paru -S sqlfluff
# markdown
paru -S vale
# json、yaml
paru -S cfn-lint

formatter

# 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

# toml
paru -S taplo

# xml
paru -S lemminx

# nix
paru -S nil-git

# 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

nvim gui

nvim ide 发行版

其他编辑器

online tool

About

my nvim config

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published