Vim不一致语法突出显示bash文件

时间:2011-09-16 21:05:45

标签: vim syntax-highlighting vim-syntax-highlighting

当我用vim打开一些bash脚本文件时,它有时会将它们标识为conf个文件,这没关系,我可以通过将文件类型设置为sh:setf sh来纠正它。 / p>

那太好了,除了我注意到这并不完全解决问题:

Two files side-by-side with different highlighting

请注意,shopt在左侧正确突出显示,但未在右侧突出显示,我手动将文件类型设置为sh

这意味着当vim将文件标识为bashsh时,它会将文件类型设置为sh,但会执行一些额外的步骤,当我执行时我不会执行这些操作手动设置文件类型。

任何人都知道这可能是什么,以及我如何解决它?

4 个答案:

答案 0 :(得分:29)

默认情况下,vim已识别出多种文件类型。他们中的大多数都是通过文件扩展名工作的,但在这种情况下,vim还会分析文件内容以猜测正确的类型。

vim会自动为.bashrc.tcshrc等特定文件名设置文件类型。但是具有.sh扩展名的文件将被识别为csh,ksh或bash脚本。要确定这是什么类型的脚本,vim会读取文件的第一行来查看#!线。

如果第一行包含单词bash,则该文件被标识为bash脚本。通常您会看到#!/bin/bash如果要直接执行脚本,对于其他一些shell配置文件,您应该使用文件扩展名.bash

vim的帮助也在:help ft-bash-syntax解释了这一点。您还可以在.vimrc中使用let g:is_bash=1来生成bash语法,突出显示所有filetype=sh文件的默认值。如果您想查看详细信息,请在$VIMRUNTIME/filetype.vim

中实施

答案 1 :(得分:7)

事实证明,syntax/sh.vim包含针对 Korn Bash sh 的特定突出显示,您只需要告诉它你正在使用。这分别由b:is_kornshellb:is_bashb:is_sh完成。

根据具体情况,我将使用以下内容:

ftdetect / bash.vim:

au BufRead,BufNewFile *bash* let g:is_bash=1
au BufRead,BufNewFile *bash* setf sh

的Modeline:

# vim:let g:is_bash=1:set filetype=sh:

密钥映射

nmap <silent> <leader>b :let g:is_bash=1<cr> :setf sh<cr> 

答案 2 :(得分:3)

尝试查看有效的语法设置

:windo echo b:current_syntax

(我希望第一个窗口说bash,第二个窗口说sh ......?)

还尝试使用synatx同步:

:windo syn sync fromstart
:windo syn sync minlines=300

一般

:he syn-sync

了解更多信息


PS。

远景,但其他一些突出显示可能会干扰:

:windo se @/=''
:match none
:2match none
:3match none

答案 3 :(得分:3)

与Peter Coulton的解决方案类似,并在“filetype”Vim帮助的“new-filetype”部分中记录和替代,~/.vim/filetype.vim文件可能包含以下代码:

if exists("did_load_filetypes")
  finish
endif

augroup filetypedetect
  au! BufRead,BufNewFile *bash* let b:is_bash = 1 | setfiletype sh
augroup END

这种方法具有以下含义:

  1. ~/.vim/filetype.vim目录下的每种文件类型都有一个~/.vim/ftdetect个文件而不是一个。
  2. b:is_bash变量设置为缓冲区的本地变量,而不是全局变量,将其称为g:is_bash