VIM 运行 打开 .sql 文件时的命令

VIM run command when opening .sql files

我很难弄明白这一点。

当我在 VIM 中打开 sql 文件时,我正在尝试 运行 以下命令。

 :%!sqlformat --reindent --keywords upper --identifiers upper -

我知道这可能很简单,我想太多了,但一直在我的 _vimrc 文件中尝试以下的各种变体,但没有成功

autocmd FileType sql call SqlFormatter()
augroup end

  function SqlFormatter()
    set noai
    set mappings map ,pt  :%!sqlformat --reindent --keywords upper --identifiers upper -<CR>
 endfunction

编辑: 当我 运行 这个里面 VIM 没有任何反应

:call SqlFormatter()

当我 运行 我可以在列表中看到 SqlFormatter() 函数 :函数

目前我的 _vimrc 文件中的函数看起来像,但我仍然没有运气

autocmd FileType sql call SqlFormatter()
augroup end
function SqlFormatter()
set noai
" set mappings...
map ,pt  :%!sqlformat --reindent --keywords upper --identifiers lower -
endfunction

让我们把它分解成组件。首先映射:

map ,pt :%!sqlformat --reindent --keywords upper --identifiers upper -<cr>

映射的一般规则是提供模式并在可能的情况下使用 noremap。所以这变成了:

nnoremap ,pt :%!sqlformat --reindent --keywords upper --identifiers upper -<cr>

接下来我们需要了解缓冲区局部映射。您的映射是全局的,这意味着一旦您打开一个 'filetype'sql 的缓冲区,那么此映射将在任何缓冲区中工作。这不太可能不是您想要的。通过使用 <buffer> 选项,我们可以为这个缓冲区设置这个映射。

您正在使用 FileType autocmd 事件触发 sql 文件类型的映射。这是清理过的:

augroup SqlStuff
    autocmd!
    autocmd FileType sql call SqlFormatter()
augroup end

function SqlFormatter()
    set noautoindent
    nnoremap <buffer> ,pt :%!sqlformat --reindent --keywords upper --identifiers upper -<cr>
endfunction

此外,您可能希望避免一起使用 autocmd & 函数,只需将设置和映射都添加到 ~/.vim/after/ftplugin/sql.vim

set noautoindent
nnoremap <buffer> ,pt :%!sqlformat --reindent --keywords upper --identifiers upper -<cr>

注意:我还没有测试过这个映射,所以如果 sqlformat 有问题,那也需要修复

如需更多帮助,请参阅:

:h :map-commands
:h :map-local
:h :autocmd
:h :augroup
:h FileType
:h after-directory

来自 Learning Vimscript the Hard Way 的更多帮助: