Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我可以在Vim的同一个文件中同时使用Python和SQL语法高亮显示吗?_Vim_Syntax Highlighting - Fatal编程技术网

我可以在Vim的同一个文件中同时使用Python和SQL语法高亮显示吗?

我可以在Vim的同一个文件中同时使用Python和SQL语法高亮显示吗?,vim,syntax-highlighting,Vim,Syntax Highlighting,我在Python程序中使用多行字符串进行SQL查询 有没有一种方法可以告诉Vim在它们内部应用不同的突出显示规则,可以使用--SQL标记?您可以在文件上尝试以下选项: setfiletype=python.sql 它为您的文件提供了这两种文件类型,并且应该应用这两种语法高亮显示 如果它适用于您,您可以将以下行添加到.vimrc以将其应用于您编辑的每个it python文件: autocmd BufRead,BufNewFile*.py setfiletype=python.sql 然而,它并没有

我在Python程序中使用多行字符串进行SQL查询


有没有一种方法可以告诉Vim在它们内部应用不同的突出显示规则,可以使用
--SQL
标记?

您可以在文件上尝试以下选项:
setfiletype=python.sql

它为您的文件提供了这两种文件类型,并且应该应用这两种语法高亮显示

如果它适用于您,您可以将以下行添加到
.vimrc
以将其应用于您编辑的每个it python文件:

autocmd BufRead,BufNewFile*.py setfiletype=python.sql

然而,它并没有真正处理两个突出显示组之间的冲突…因此它可以或不可以在您的情况下工作

您还可以创建一个函数来快速切换打开缓冲区的文件类型:

function! ToggleFiletype()
  if &filetype=="sql"
    set filetype=python
  endif

  if &filetype=="python"
    set filetype=sql
  endif
endfunction

map <F11> <Esc>:call ToggleFiletype()<cr>
函数!ToggleFiletype()
如果&filetype==“sql”
设置filetype=python
恩迪夫
if&filetype==“python”
设置filetype=sql
恩迪夫
端功能
映射:调用ToggleFiletype()

我复制粘贴更改自:

现在,每个多行三重单引号字符串都会获得sql语法。三重双引号字符串仍然是普通字符串。我已经修改了sqlpostgres.vim,为SQL提供了绿色的细微差别来区分这两种语言,在256色的墨水池方案中,它看起来很甜美


同样相关:

我知道有一个公认的答案,但仍然有另一种方法:

如果存在(“b:当前语法”)
完成
恩迪夫
“在顶层加载Python语法
runtime!syntax/python.vim
“需要让syntax/sql.vim做点什么
unlet b:当前_语法
“加载SQL语法
语法包括@SQL syntax/SQL.vim
“需要在此处添加keepend
syn区域蟒蛇串匹配组=蟒蛇串
\start=+[uU]\=\z(['“]\)+end=“\z1”skip=“\124;\\ z1”
\contains=pythonEscape,@Spell keepend
syn region pythonRawString匹配组=pythonquettes
\start=+[uU]\=[rR]\z(['“]\)+end=“\z1”skip=“\124;\\ z1”
\contains=@Spell keepend
syn region SQLEmbedded contains=@SQL containedin=pythonString,pythonRawString contained
\开始=+\v(更改|开始|调用|注释|提交|连接|创建|删除|删除|结束|解释|导出|授予|导入|插入|加载|锁定|合并|刷新|重命名|替换|撤销|回滚|选择|设置|截断|卸载|取消|更新|)+
\结束=++
让b:current_syntax=“pysql”

这样,突出显示从给定的SQL关键字之一开始,并在第一个
处停止
可以在下一个SQL关键字时重新启动,或者在python字符串末尾停止(请参见
keepend
)。

相反,它将SQL语法应用于python代码,并且字符串是简单的。
function! TextEnableCodeSnip(filetype,start,end,textSnipHl) abort
  let ft=toupper(a:filetype)
  let group='textGroup'.ft
  if exists('b:current_syntax')
    let s:current_syntax=b:current_syntax
    " Remove current syntax definition, as some syntax files (e.g. cpp.vim)
    " do nothing if b:current_syntax is defined.
    unlet b:current_syntax
  endif
  execute 'syntax include @'.group.' syntax/'.a:filetype.'.vim'
  try
    execute 'syntax include @'.group.' after/syntax/'.a:filetype.'.vim'
  catch
  endtry
  if exists('s:current_syntax')
    let b:current_syntax=s:current_syntax
  else
    unlet b:current_syntax
  endif
  execute 'syntax region textSnip'.ft.'
  \ matchgroup='.a:textSnipHl.'
  \ start="'.a:start.'" end="'.a:end.'"
  \ contains=@'.group
endfunction

au FileType python call TextEnableCodeSnip('sqlpostgres', "'''", "'''", 'SpecialComment')