Как выделить скрипты Bash в Vim?

Мой редактор Vim автоматически выделяет файлы PHP (vim file.php), HTML-файлы (vim file.html) и так далее.

Но когда я печатаю: vim file и внутри него пишут скрипт Bash, он не выделяет его.

Как я могу сказать Vim выделить его как скрипт Bash?

Я начинаю печатать #!/bin/bash вверху файла, но это не заставляет его работать.

13 ответов

Решение

Вы правильно даете сценарий оболочки .sh расширение? Автоматический выбор синтаксиса Vim почти полностью основан на определении имени (расширения) файла. Если файл не имеет установленного синтаксиса (или имеет неправильный синтаксис), Vim не будет автоматически переходить на правильный синтаксис только потому, что вы начали вводить скрипт на заданном языке.

В качестве временного решения проблемы команда :set syn=sh включит подсветку синтаксиса shell-скрипта.

Ответы пока верны, что вы можете использовать расширение (например, .sh) или линия Шебанга (например, #!/bin/bash) определить тип файла. Если у вас нет ни одного из них, вы все равно можете указать тип файла вручную с помощью комментария моделин в верхней или нижней части вашего файла.

Например, если вы хотите идентифицировать скрипт без расширения в качестве скрипта оболочки, вы можете добавить этот комментарий в начало вашего файла:

# vim: set filetype=sh :

или же

# vim: filetype=sh

Это скажет vim рассматривать файл как скрипт оболочки. (Вы можете также установить другие вещи в моделине. В типе vim :help modeline для получения дополнительной информации.)

На самом деле подсветка синтаксиса - это особенность vim, а не vi. Попробуйте использовать команду vim, а затем выполните

:syntax on,

Я пришел к этому ответу в поисках конкретно, как выделить bash синтаксис, а не оболочка POSIX. Просто делаю set ft=sh (или эквивалент) приведет к выделению файла для оболочки POSIX, что оставляет много синтаксиса, действительного в bash выделено красным. Чтобы получить подсветку bash:

" Set a variable on the buffer that tells the sh syntax highlighter
" that this is bash:
let b:is_bash = 1
" Set the filetype to sh
set ft=sh

Обратите внимание, что если ваш ft уже sh тебе еще нужно set команда; в противном случае let не вступает в силу немедленно.

Вы можете сделать это глобальным значением по умолчанию, сделав переменную глобальной, т.е. let g:is_bash = 1,

:help ft-sh-syntax это страница руководства, которую я должен был найти; это объясняет это, и как вызвать выделение других разновидностей оболочки.

Vim также может обнаруживать типы файлов, проверяя их содержимое (например, если первая строка содержит bash shebang), вот цитата из filetype.txt файл справки:

Если ваш тип файла может быть обнаружен только путем проверки содержимого файла

Создайте свой пользовательский каталог времени выполнения. Обычно вы используете первый элемент параметра runtimepath. Пример для Unix:

:!mkdir ~/.vim

Создайте файл сценария vim для этого. Пример:

if did_filetype()   " filetype already set..
    finish      " ..don't do these checks
endif
if getline(1) =~ '^#!.*\<mine\>'
    setfiletype mine
elseif getline(1) =~? '\<drawing\>'
    setfiletype drawing
endif

Смотрите $VIMRUNTIME/scripts.vim для большего количества примеров. Запишите этот файл как "scripts.vim" в пользовательский каталог времени выполнения. Например, для Unix:

:w ~/.vim/scripts.vim

Обнаружение будет работать сразу, нет необходимости перезапускать Vim.

Ваш scripts.vim загружается до проверки по умолчанию для типов файлов, что означает, что ваши правила переопределяют правила по умолчанию в $VIMRUNTIME/scripts.vim.

Vim может обнаружить по верхнему комментарию

попробуйте эту строку вверху файла

#!/bin/sh

Для тех, у кого есть вариант этого вопроса, то есть как включить подсветку синтаксиса в файлах bash без .sh расширение автоматически при открытии...

Добавить filetype on в твоем .vimrc. Это позволяет определять тип файла, также учитывая его содержимое. Например, сценарии bash будут установлены наshтип файла. Однако, набрав#! не будет запускать определение типа файла для нового файла, созданного с помощью vim, и вам нужно будет использовать set ft=shв таком случае. Для получения дополнительной информации введите:h filetype в vim.

Как упоминалось в комментариях, вам нужно будет использовать это вместе с syntax enable для включения выделения.

Или вы могли бы использовать :filetype detect. Из документа:

Используйте это, если вы начали с пустого файла и напечатанного текста, который позволяет определить тип файла. Например, когда вы ввели это в сценарий оболочки: "#!/ Bin/csh".

Как только вы добавите Shebang вверху файла, сохраните его и перезагрузите его (например, :w|e) и синтаксическая раскраска

См. Также Vim с непоследовательной подсветкой синтаксиса bash-файлов, также может помочь принятый ответ.

Чтобы включить/выключить подсветку синтаксиса, пока вы находитесь в редакторе.

Включать

      :syntax on

Выключать

      :syntax off

Запустите это, чтобы всегда включать подсветку синтаксиса при открытии vim.

      echo ":syntax on" >> ~/.vimrc

vim уже распознает многие типы файлов по умолчанию. Большинство из них работают с расширениями файлов, но в подобном случае vim также проанализирует содержимое файла, чтобы угадать правильный тип.

vim устанавливает тип файла для определенных имен файлов, таких как .bashrc, .tcshrcи т. д. автоматически. Но файл с .sh расширение будет распознаваться как csh, ksh или bash скрипт. Чтобы определить, что это за скрипт, vim читает первую строку файла, чтобы посмотреть на #! линия.

Если первая строка содержит слово bash, файл определяется как скрипт bash. Обычно вы видите #!/bin/bash если сценарий предназначен для непосредственного выполнения, но для файла конфигурации оболочки с использованием простого # bash будет работать так же.

Если вы хотите посмотреть на детали, это реализовано в $VIMRUNTIME/filetype.vim,

Вероятно, самый простой способ получить подсветку синтаксиса для нового файла, это просто перезагрузить его после написания строки shebang. Просто :w:e запишет файл, перезагрузит его и интерпретирует строку shebang, которую вы только что написали, чтобы предоставить вам соответствующую подсветку синтаксиса.

Если вы уже знаете тип файла до открытия скрипта или если вы создаете новый скрипт без распространенного расширения, вы можете передать его в vim в командной строке следующим образом:

vim -c 'setfiletype sh' path/to/script
vim -c 'setfiletype python' path/to/script

Когда вы создаете новый файл, в игру вступает только обнаружение имени файла; обнаружение контента (#!/bin/bash) не применяется, если вы набираете его после создания нового буфера.

Разумная вещь состоит в том, чтобы просто сделать :set ft=bash в первый раз, и при следующем редактировании #!/bin/bash установит правильный тип файла автоматически.

Другие вопросы по тегам