通过映射到 autocmd 自动完成 python Shebang(在非 .py 文件中)

Autocomplete a python Shebang (in a non .py file) by mapping to an autocmd

我正在学习 Vim 并且我已经成功地设置了我的 .vimrc 文件,这样每当我创建一个新的 python .py 文件时,适当的 shebang 和 header 是 auto-generated。耶我!

但是,在构建终端管道时,我并不总是喜欢为我通过管道传输的程序包含 .py 扩展名。因此,shebang 不会 auto-generate。伤心!

无需重复我为 autocmd 编写的内容(因为我就是这样学习的,所以我花了很多时间来编写),我可以在 INSERT 模式下映射一个像 "pyhead" 这样的字符串,或者创建一个宏当我选择不使用 .py 扩展名时,绑定到 autocmd 以轻松实现我的 shebangbang?我觉得好像一个简单的映射到一个已经存在的命令应该防止混乱的 .vimrc。我已将我的 autocmd 放在一个 augroup 中,如下所示:

    augroup Shebang
        autocmd BufNewFile *.py 0put =\"#!/usr/bin/env python\<nl>...
                                     ...# -*-coding: utf-8 -*-\
                                     ...<nl>\<nl>\"
                                     ...|put ='#'.expand('%:t')
                                     ...|put =\"#<My_NAME>\"
                                     ...|put ='#LAST UPDATED: '.strftime('%m-%d-%Y')\|$ 
    augroup end

为清楚起见,autocmd 都在一行中,但我包括了三个点以表示继续(这样您就不需要滚动)。如果这是一个愚蠢的请求,并且有一个简单的答案,请谴责。谢谢!

您可以将长 :put 命令提取到 函数 中,然后 :call:autocmd.

function! InsertPythonShebang()
    0put =...
endfunction

autocmd BufNewFile *.py call InsertPythonShebang()

然后您可以在映射中重用该函数:

nnoremap <Leader>py :call InsertPythonShebang()<CR>

或自定义命令:

command! -bar PyBang call InsertPythonShebang()

您关于对插入特殊关键字做出反应的建议也是可能的,但我不会提供解决方案,因为我认为它是 un-idiomatic,并且实施会更加复杂(尤其是如果您想要重用 :put,而不仅仅是生成的文本)。另请注意,有几个 snippets 插件 提供类似的功能(但再次为您的 :autocmd 重复使用相同的字符串将是一个挑战)。

我建议在空缓冲区上设置 python 文件类型时触发。无论如何,为了有语法高亮,你需要:setf python。 (built-in 文件类型检测需要 .py 文件扩展名或现有的 shebang 行才能工作。Catch-22。)

autocmd FileType python if line('$') == 1 && empty(getline(1)) | call InsertPythonShebang() | endif