Use Vim as the SQL Editor


使用 vim 作为 sql 编辑器

本文介绍如何将 vim 打造为优秀的 sql 编辑器。本文内容仅涉及对 sql 编辑的基本配置,要获取完整的体验请参考vim 专栏

代码检查、格式化与代码补全

代码检查与格式化只需安装coc.nvim以及coc-sql插件即可。

coc.nvim的安装与配置可以参考另一篇文章

参考链接文章中的自定义补全源一节自定义 sql 关键字补全文件。可参考以下内容。

function! coc#source#sql#init() abort
	return {
				\'triggerCharacters': [''],
				\'filetypes' : ['sql'],
				\}
endfunction

function! coc#source#sql#complete(opt, cb) abort
	let items = ['ADD','ADD CONSTRAINT','ALL','ALTER','ALTER COLUMN','ALTER TABLE','AND','ANY','AS','ASC','BACKUP DATABASE','BETWEEN','CASE','CHECK','COLUMN','CONSTRAINT','CREATE','CREATE DATABASE','CREATE INDEX','CREATE OR REPLACE VIEW','CREATE TABLE','CREATE PROCEDURE','CREATE UNIQUE INDEX','CREATE VIEW','DATABASE','DEFAULT','DELETE','DESC','DISTINCT','DROP','DROP COLUMN','DROP CONSTRAINT','DROP DATABASE','DROP DEFAULT','DROP INDEX','DROP TABLE','DROP VIEW','EXEC','EXISTS','FOREIGN KEY','FROM','FULL OUTER JOIN','GROUP BY','HAVING','IN','INDEX','INNER JOIN','INSERT INTO','INSERT INTO SELECT','IS NULL','IS NOT NULL','JOIN','LEFT JOIN','LIKE','LIMIT','NOT','NOT NULL','OR','ORDER BY','OUTER JOIN','PRIMARY KEY','PROCEDURE','RIGHT JOIN','ROWNUM','SELECT','SELECT DISTINCT','SELECT INTO','SELECT TOP','SET','TABLE','TOP','TRUNCATE TABLE','UNION','UNION ALL','UNIQUE','UPDATE','VALUES','VIEW','WHERE','USE']
	call a:cb(items)
endfunction

参考另一篇文章完成自定义 snippets。

至此,三项功能全部配置完成。

错误修复

neovim/vim 对 sql 的一个内置插件将Ctrl+c配置为补全快捷键,这导致使用Ctrl+c进入普通模式时严重卡顿。进行如下配置修复该错误。

let g:omni_sql_no_default_maps = 1

执行数据库指令

vim-sql-workbench大概是目前唯一比较好用的插件,但配置起来可能比较麻烦。本文介绍另一种方式,主要思路是将要执行的代码提取出来然后在命令行中执行命令。

首先需要安装asynctasks.vim插件。

然后在配置中加入以下内容,如此便可以在可视模式下通过Ctrl+s将选中的内容输出到外部的 tmp 文件中。

" save content in virtual block
function! Get_visual_selection()
    " get the position of left start visual selection
    let [line_start, column_start] = getpos("'<")[1:2]
    " get the position of right end visual selection
    let [line_end, column_end] = getpos("'>")[1:2]
    " catch them all
    let lines = getline(line_start, line_end)
    if len(lines) == 0
        return ''
    endif
    " edge cases and cleanup.
    let lines[-1] = lines[-1][: column_end - 2]
    let lines[0] = lines[0][column_start - 1:]
    return join(lines, "\n")
endfunction

function Save_visually_selected_text_to_file()
    let selected_text = Get_visual_selection()
    call writefile(split(selected_text, "\n"), "tmp")
endfunction

vnoremap <C-s> :<c-u>call Save_visually_selected_text_to_file()<cr>

然后为 asynctasks.vim 添加全局配置(:AsyncTaskEdit!)。

[sql]
command=sh /home/niuiic/.config/nvim/tasks.sh sql $(?user) $(?password)
cwd=<VIM_FILEDIR>
output=terminal

tasks.sh 的位置需要修改。

然后编写tasks.sh

if [[ $1 == "sql" ]]; then
    if [[ -f "./tmp" ]]; then
        mysql -h localhost -u $2 -p$3 <./tmp
        rm ./tmp
    else
        echo "no input file."
    fi
fi

至此完成全部配置。执行命令时,只需要在可视模式下选取要执行的命令,然后按Ctrl+s保存,然后执行:AsyncTask sql,输入用户名和密码,即可执行命令并在自动弹出的 terminal 窗口中查看结果。

总结

编辑能力上可以完胜 vscode,但是在执行 sql 命令上并不如 vscode 中的一些插件。


文章作者: niuiic
版权声明: 本博客所有文章除特別声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 niuiic !
评论
  目录