Làm thế nào để làm nổi bật các tập lệnh Bash trong Vim?


76

Trình chỉnh sửa Vim của tôi tự động làm nổi bật các tệp PHP ( vim file.php), tệp HTML ( vim file.html), v.v.

Nhưng khi tôi nhập: vim filevà bên trong nó viết một tập lệnh Bash, nó không làm nổi bật nó.

Làm cách nào để yêu cầu Vim đánh dấu nó dưới dạng tập lệnh Bash?

Tôi bắt đầu nhập #!/bin/bashở đầu tệp, nhưng nó không hoạt động.

Câu trả lời:


86

Bạn có chính xác cung cấp cho shell script một .shphần mở rộng không? Việc lựa chọn cú pháp tự động của Vim gần như hoàn toàn dựa trên việc phát hiện tên tệp (phần mở rộng). Nếu một tệp không có bộ cú pháp (hoặc cú pháp sai), Vim sẽ không tự động thay đổi thành cú pháp đúng chỉ vì bạn bắt đầu nhập tập lệnh bằng một ngôn ngữ nhất định.

Như một giải pháp tạm thời, lệnh :set syn=shsẽ bật tính năng đánh dấu cú pháp shell-script.


4
nhưng hầu hết các tập lệnh không có phần mở rộng .sh? tôi có nên đặt nó dưới dạng phần mở rộng .sh chỉ để làm cho nó hoạt động không? cách đặt tên tập lệnh của bạn là tốt nhất? và bash của nó ... vì vậy nó vẫn còn .sh?
never_had_a_name

3
@ajsie: Tôi không chắc bạn đang sử dụng tập lệnh nào, nhưng hầu hết bashcác tập lệnh tôi gặp thực sự có .shhậu tố. Để thực sự chỉ định bash thay vì chỉ sh, bạn sẽ sử dụng #!/bin/bashdòng shebang trên một .shtệp.
Mark Rushakoff

5
@MarkRushakoff, việc cung cấp cho các tập lệnh bash một .shphần mở rộng trong nhiều trường hợp được coi là hình thức kém. Xem ví dụ về bot factoid được sử dụng bởi mục liên quan của kênh Freenode #bash: lenedge.org/~greybot/meta/.sh
Charles Duffy

4
... để trích dẫn: "Không sử dụng phần mở rộng cho các tập lệnh của bạn. Các tập lệnh xác định các lệnh mới mà bạn có thể chạy và các lệnh thường không được cung cấp các phần mở rộng. Bạn có chạy ls.elfkhông? Ngoài ra: tập lệnh bash không phải là tập lệnh sh (vì vậy đừng sử dụng .sh) và tiện ích mở rộng sẽ chỉ gây đau đầu cho phụ thuộc nếu tập lệnh được viết lại bằng ngôn ngữ khác. Xem talisman.org/~erlkonig/documents/… "
Charles Duffy

3
... phần mở rộng trên các tập lệnh shell được chấp nhận rộng rãi như một Ý tưởng Tốt khi một tập lệnh được dự định có nguồn gốc như một thư viện (giống như một .pyphần mở rộng sử dụng phần mở rộng cho các mô-đun Python nhưng không sử dụng các tập lệnh Python nằm trong PATH) - nhưng trong trường hợp đó phần mở rộng phải phản ánh chính xác trình bao mà tập lệnh có thể được phân tích cú pháp chính xác; .shngụ ý "tương thích với tất cả các trình bao POSIX", điều này thường không chính xác cho một tập lệnh bash .
Charles Duffy

38

Các câu trả lời cho đến nay đều đúng rằng bạn có thể sử dụng phần mở rộng (like .sh) hoặc một dòng shebang (giống như #!/bin/bash) để xác định loại tệp. Nếu bạn không có một trong số đó, bạn vẫn có thể chỉ định loại tệp theo cách thủ công bằng cách sử dụng nhận xét mô hình ở đầu hoặc cuối tệp của bạn.

Ví dụ: nếu bạn muốn xác định một tập lệnh không có phần mở rộng là tập lệnh shell, bạn có thể thêm nhận xét này vào đầu tệp của mình:

# vim: set filetype=sh :

hoặc là

# vim: filetype=sh

Điều đó sẽ yêu cầu vim coi tệp như một tập lệnh shell. (Bạn cũng có thể đặt những thứ khác trong modeline. Nhập vim :help modelineđể biết thêm thông tin.)


Thật thú vị, trong môi trường của tôi, cuối cùng :làm cho mô hình này hoạt động, trong khi không có cuối cùng :, mô hình này không đăng ký. Tài liệu trợ giúp hiển thị một dạng mô hình không kết thúc :.
orluke

Điều đó thật thú vị. Tài liệu trợ giúp (có :help modeline) cho biết hai điểm khác biệt: (1) Phiên bản có cuối cùng :"tương thích với một số phiên bản của Vi", và (2) không có cuối cùng thì :bạn không sử dụng settừ khóa. Vì bạn có thể đặt bất kỳ văn bản nào sau mô hình, nên cuối cùng sẽ :hoạt động có hoặc không có settừ khóa.
bryant

2
Nếu mô hình dường như không có tác dụng, hãy thử set modelinetham gia ~/.vimrc, xem câu trả lời này
Tino

2
Như tôi đã lưu ý trong câu trả lời khác gợi ý điều này, shdường như làm nổi bật trình bao POSIX, không phải bash. Đáng chú ý, nó gắn cờ cú ​​pháp bash hợp lệ là lỗi, điều này khá khó chịu.
Thanatos

23

Trên thực tế, làm nổi bật cú pháp là một tính năng của vim không phải vi. Hãy thử sử dụng lệnh vim và sau đó thực hiện

:syntax on.


1
Cho tôi nữa. Bạn có thể thêm dòng "cú pháp trên" vào tệp .vimrc của mình.
teu

4
Đây là giải pháp cho tôi trên Mac OS X 10.10.3. Thêm một tập tin vimrc vào thư mục nhà của tôi sử dụng vim ~/.vimrcvà thêm syntax onvào tập tin sau đó đóng cửa với:x
James Owers

18

Tôi đã đi đến câu trả lời này để tìm kiếm cụ thể cách làm nổi bật bashcú pháp, không phải trình bao POSIX. Chỉ cần thực hiện một set ft=sh(hoặc tương đương) sẽ dẫn đến việc tệp được đánh dấu cho trình bao POSIX, điều này để lại rất nhiều cú pháp hợp lệ được bashđánh dấu bằng màu đỏ. Để có được điểm nổi bật 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

Lưu ý rằng nếu bạn ftđã có sh, bạn vẫn cần setlệnh; nếu letkhông thì không có hiệu lực ngay lập tức.

Bạn có thể đặt điều này làm mặc định chung bằng cách đặt biến toàn cục, tức là let g:is_bash = 1,.

:help ft-sh-syntaxlà trang hướng dẫn sử dụng mà tôi phải tìm; nó giải thích điều này và cách kích hoạt sự nổi bật của các hương vị khác của vỏ.


Một số phiên bản của công cụ shđánh dấu cú pháp thậm chí còn đánh dấu mã sh posix hợp lệ là không hợp lệ (ví dụ $(subshell)) - điều này cũng khắc phục điều đó. Cảm ơn.
Mahmoud Al-Qudsi

15

Vim cũng có thể phát hiện các loại tệp bằng cách kiểm tra nội dung của chúng (chẳng hạn như nếu dòng đầu tiên có chứa bash shebang), đây là trích dẫn từ filetype.txttệp trợ giúp:

Nếu loại tệp của bạn chỉ có thể được phát hiện bằng cách kiểm tra nội dung của tệp

Tạo thư mục thời gian chạy người dùng của bạn. Thông thường bạn sẽ sử dụng mục đầu tiên của tùy chọn 'runtimepath'. Ví dụ cho Unix:

:!mkdir ~/.vim

Tạo một tệp kịch bản vim để thực hiện việc này. Thí dụ:

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

Xem $ VIMRUNTIME / scripts.vim để biết thêm ví dụ. Viết tệp này dưới dạng "scripts.vim" trong thư mục thời gian chạy người dùng của bạn. Ví dụ, đối với Unix:

:w ~/.vim/scripts.vim

Việc phát hiện sẽ hoạt động ngay lập tức, không cần phải khởi động lại Vim.

Scripts.vim của bạn được tải trước khi kiểm tra mặc định cho các loại tệp, có nghĩa là các quy tắc của bạn ghi đè các quy tắc mặc định trong $ VIMRUNTIME / scripts.vim.


1
Tôi đã thử đặt cả hai tệp này vào .vimrc và .vim / scripts.vim, nhưng cả hai đều không hoạt động. Nó chỉ hoạt động nếu tôi nhập các lệnh theo cách thủ công khi tôi đã bắt đầu vim. Tôi đang làm gì sai?
Eddy

@Eddy Có lẽ bạn cần set modelinetham gia ~/.vimrc, hãy xem câu trả lời này
Tino

9

vim có thể phát hiện bằng bình luận trên cùng

hãy thử dòng này ở đầu tệp

#!/bin/sh

1
Bạn đã bỏ lỡ thư mục gốc '/' giữa '!' và B'.
h9uest

1
có vẻ như điều này đã được sửa. Đây là câu trả lời tốt nhất IMHO.
lacostenycoder 27/02/19


1

Đối với những người có một biến thể của câu hỏi này, tức là làm thế nào để bật đánh dấu cú pháp trên các tệp bash mà không có .shphần mở rộng tự động khi mở ...

Thêm filetype onvào của bạn .vimrc. Điều này cho phép phát hiện loại tệp bằng cách xem xét nội dung của tệp. Ví dụ: các tập lệnh bash sẽ được đặt thành shloại tệp. Tuy nhiên, gõ lệnh #!sẽ không kích hoạt tính năng phát hiện loại tệp trên tệp mới được tạo bằng vim và bạn sẽ cần sử dụng set ft=shtrong trường hợp đó. Để biết thêm thông tin , hãy nhập :h filetypevim.

Như đã đề cập trong phần nhận xét, bạn sẽ cần sử dụng điều này trong cách gợi syntax enableý để bật highlight.

Hoặc bạn có thể sử dụng :filetype detect. Từ tài liệu:

Sử dụng tùy chọn này nếu bạn bắt đầu với một tệp trống và văn bản được nhập để có thể phát hiện loại tệp. Ví dụ: khi bạn nhập mã này trong tập lệnh shell: "#! / Bin / csh".


1
Lệnh này filetype on, không cần đặt và bạn cũng cần syntax enablebật tính năng đánh dấu.
D. Ben Knoble

0

vim đã nhận ra nhiều loại tệp theo mặc định. Hầu hết chúng hoạt động bằng phần mở rộng tệp, nhưng trong trường hợp như thế này, vim cũng sẽ phân tích nội dung của tệp để đoán đúng loại.

vim đặt tệp cho tên tập tin cụ thể như .bashrc, .tcshrcvv tự động. Nhưng một tệp có .shphần mở rộng sẽ được nhận dạng là tập lệnh csh, ksh hoặc bash. Để xác định chính xác đây là loại tập lệnh nào, vim đọc dòng đầu tiên của tệp để xem dấu #! hàng.

Nếu dòng đầu tiên chứa từ bash, tệp được xác định là tập lệnh bash. Thông thường, bạn sẽ thấy #!/bin/bashnếu tập lệnh được thực thi trực tiếp, nhưng đối với một tệp cấu hình shell sử dụng một tệp đơn giản # bashcũng sẽ hoạt động.

Nếu bạn muốn xem chi tiết, điều này được thực hiện trong $VIMRUNTIME/filetype.vim.


Uhm, thực ra tôi muốn đăng cái này ở một nơi khác. Nhưng tôi đoán câu trả lời cũng phù hợp ở đây :-)
raimue

0

Có lẽ cách dễ nhất để có được đánh dấu cú pháp trên một tệp mới, là chỉ cần tải lại nó sau khi viết dòng shebang. Đơn giản :w :esẽ viết ra tệp, tải lại và diễn giải dòng shebang bạn vừa viết để cung cấp cho bạn cách tô sáng cú pháp thích hợp.


0

Nếu bạn đã biết loại tệp trước khi mở tập lệnh hoặc nếu bạn đang tạo một tập lệnh mới không có phần mở rộng phổ biến, bạn có thể chuyển nó vào vim trên dòng lệnh như sau:

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

-1

Khi bạn tạo một tệp mới, chỉ phát hiện tên tệp mới có tác dụng; phát hiện nội dung ( #!/bin/bash) không áp dụng nếu bạn nhập nó sau khi tạo bộ đệm mới.

Điều hợp lý là chỉ thực hiện :set ft=bashlần đầu tiên, và lần sau khi bạn chỉnh sửa nó, nó #!/bin/bashsẽ tự động đặt loại tệp phù hợp.


1
Ở bên tôi ft=bashcần đọc ft=sh. Ngoài ra tôi cần thiết set modelinetrong ~/.vimrcđể làm cho nó làm việc, thấy câu trả lời này
Tino
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.