我很难弄清楚这一点。
当我在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
学习Vimscript的更多帮助困难的方式:
- 基本映射
- 模态映射
- 严格映射
- 缓冲区本地选项和映射
- 自动命令
- 自动命令组