当我用vim打开一些bash脚本文件时,它有时会将它们标识为conf
个文件,这没关系,我可以通过将文件类型设置为sh
并:setf sh
来纠正它。 / p>
那太好了,除了我注意到这并不完全解决问题:
请注意,shopt
在左侧正确突出显示,但未在右侧突出显示,我手动将文件类型设置为sh
。
这意味着当vim将文件标识为bash
或sh
时,它会将文件类型设置为sh
,但会执行一些额外的步骤,当我执行时我不会执行这些操作手动设置文件类型。
任何人都知道这可能是什么,以及我如何解决它?
答案 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_kornshell
,b:is_bash
和b:is_sh
完成。
根据具体情况,我将使用以下内容:
au BufRead,BufNewFile *bash* let g:is_bash=1
au BufRead,BufNewFile *bash* setf sh
# 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
了解更多信息
远景,但其他一些突出显示可能会干扰:
: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
这种方法具有以下含义:
~/.vim/filetype.vim
目录下的每种文件类型都有一个~/.vim/ftdetect
个文件而不是一个。b:is_bash
变量设置为缓冲区的本地变量,而不是全局变量,将其称为g:is_bash
。