Як виділити сценарії Bash у Vim?


76

Мій редактор Vim автоматично виділяє файли PHP ( vim file.php), файли HTML ( vim file.html) тощо.

Але коли я набираю: vim fileі всередині нього пишу сценарій Bash, це не виділяє його.

Як я можу сказати Vim виділити його як сценарій Bash?

Я починаю друкувати #!/bin/bashвгорі файлу, але це не змушує це працювати.

Відповіді:


86

Чи правильно ви надаєте сценарію оболонки .shрозширення? Автоматичний вибір синтаксису Vim майже повністю заснований на виявленні імені файлу (розширення). Якщо файл не має синтаксису (або неправильний синтаксис), Vim автоматично не зміниться на правильний синтаксис лише тому, що ви почали вводити скрипт на певній мові.

Як тимчасове рішення, команда :set syn=shувімкне підсвічування синтаксису сценарію оболонки.


4
але більшість сценаріїв не мають розширення .sh? чи варто розміщувати його як розширення .sh, щоб воно працювало? чи найкраща практика називати свої сценарії? і його баш ... так все ще .sh?
never_had_a_name

3
@ajsie: Я не впевнений, які сценарії ви використовуєте, але більшість bashсценаріїв, з якими я стикаюся, справді мають .shсуфікс. Щоб дійсно вказати bash на відміну від just sh, ви використовуєте #!/bin/bashрядок shebang у .shфайлі.
Mark Rushakoff,

5
@MarkRushakoff, .shрозширення сценаріїв bash у багатьох колах вважається поганою формою. Див., Наприклад, фактоїдний бот, використаний відповідним записом каналу Freenode #bash: wooledge.org/~greybot/meta/.sh
Чарльз Даффі

4
... цитувати: "Не використовуйте розширення для своїх скриптів. Сценарії визначають нові команди, які ви можете запускати, і командам, як правило, не надаються розширення. Ви запускаєте ls.elf? Також: скрипти bash не є сценаріями sh (тому не використання .sh) і розширення спричинить головний біль залежностей, лише якщо сценарій буде переписаний іншою мовою. Див. talisman.org/~erlkonig/documents/… "
Чарльз Даффі

3
... розширення сценаріїв оболонки загальноприйняті як гарна ідея, коли скрипт призначений для джерела як бібліотека (подібно до того, як використовується .pyрозширення для модулів Python, але не сценарії Python, розташовані в PATH) - але в цьому випадку розширення має правильно відображати, якою оболонкою може бути правильно проаналізований сценарій; .shозначає "сумісний з усіма оболонками POSIX", що, як правило, не є точним для сценарію bash .
Чарльз Даффі

38

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

Наприклад, якщо ви хочете ідентифікувати сценарій без розширення як сценарій оболонки, ви можете додати цей коментар у верхній частині файлу:

# vim: set filetype=sh :

або

# vim: filetype=sh

Це допоможе vim розглядати файл як сценарій оболонки. (Ви також можете встановити в моделі інші речі. Для :help modelineотримання додаткової інформації введіть тип vim .)


Цікаво, що в моєму середовищі фінал :змушує цю модель працювати, тоді як без фіналу :ця модель не реєструється. Довідкова документація показує форму моделі, яка не закінчується :.
orluke

Це цікаво. Довідкова документація (with :help modeline) містить дві відмінності: (1) Версія з фіналом :"сумісна з деякими версіями Vi", та (2) без фіналу :ви не використовуєте setключове слово. Оскільки після моделі можна додати будь-який текст, фінал :працює з setключовим словом або без нього .
bryant

2
Якщо режимні здається , не мають ніякого ефекту, спробуйте set modelineв ~/.vimrcсм цієї відповіді
Тін

2
Як я зазначав у іншій відповіді, яка наводить це на думку, shсхоже, виділяється оболонка POSIX, а не bash. Примітно, що він позначає дійсний синтаксис bash як помилки, що досить дратує.
Танатос

23

Насправді виділення синтаксису є особливістю vim not vi. Спробуйте скористатися командою vim, а потім виконайте

:syntax on.


1
Для мене також. Ви можете додати рядок "синтаксис" до вашого файлу .vimrc.
teu

4
Це було рішення для мене на Mac OS X 10.10.3. Додав файл .vimrc до мого домашнього каталогу, використовуючи vim ~/.vimrcта додаючи syntax onдо файлу, а потім закриваючи за допомогою:x
James Owers

18

Я прийшов до цієї відповіді, шукаючи, як саме виділити 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це сторінка керівництва, яку мені довелося знайти; це пояснює це, і як викликати виділення інших ароматів оболонки.


Деякі версії shпідсвітки синтаксису навіть позначають дійсний код posix sh як недійсний (наприклад $(subshell)) - це також виправляє. Дякую.
Махмуд Аль-Кудсі

15

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.


1
Я спробував помістити це у .vimrc та .vim / scripts.vim, але жоден з них не працював. Це працює, лише якщо я вручну вводжу команди після запуску vim. Що я роблю не так?
Едді

@Eddy Можливо , вам потрібно set modelineв ~/.vimrcсм ця відповідь
Тіно

9

vim може виявити за верхнім коментарем

спробуйте цей рядок у верхній частині файлу

#!/bin/sh

1
Ви пропустили кореневий каталог '/' між '!' та "b".
h9uest

1
схоже, це було виправлено. Це найкраща відповідь ІМХО.
лакостенікодер,


1

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

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

Як зазначалося в коментарях, вам потрібно буде використовувати це разом із, syntax enableщоб увімкнути підсвічування.

Або ви могли б використовувати :filetype detect. З документа:

Використовуйте це, якщо ви починали з порожнього файлу та набраного тексту, що дозволяє виявити тип файлу. Наприклад, коли ви ввели це у сценарії оболонки: "#! / Bin / csh".


1
Команда filetype onне встановлена, і вам також потрібно syntax enableувімкнути підсвічування.
Д. Бен Нобле

0

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

ВІМ встановлює тип файлу для імен конкретних файлів , як .bashrc, .tcshrcавтоматично і т.д .. Але файл із .shрозширенням буде розпізнаватися як скрипт csh, ksh або bash. Щоб визначити, що це за сценарій, vim читає перший рядок файлу, щоб переглянути #! лінія.

Якщо перший рядок містить слово bash, файл ідентифікується як скрипт bash. Зазвичай ви бачите, #!/bin/bashчи призначений сценарій для безпосереднього виконання, але для файлу конфігурації оболонки також # bashбуде працювати простий .

Якщо ви хочете ознайомитися з деталями, це реалізовано в $VIMRUNTIME/filetype.vim.


Ет, насправді я хотів розмістити це десь у іншому місці. Але, мабуть, відповідь підходить і тут :-)
raimue

0

Напевно, найпростіший спосіб отримати підсвічування синтаксису в новому файлі - це просто перезавантажити його після написання рядка shebang. Простий :w :eзапише файл, перезавантажить його та інтерпретує щойно написаний вами рядок shebang, щоб надати вам відповідне підсвічування синтаксису.


0

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

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

-1

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

Розумна річ - це просто зробити :set ft=bashперший раз, і наступного разу, коли ви його відредагуєте, #!/bin/bashавтоматично встановить правильний тип файлу.


1
Біля мене ft=bashпотрібно читати ft=sh. Також мені потрібно було set modelineв , ~/.vimrcщоб зробити його роботу, побачити цю відповідь
Тіно
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.