Câu hỏi Làm thế nào để thêm một số chuỗi trong phần đầu của một tập tin mới được tạo tự động trong VIM?


Để được chỉ định, những gì tôi muốn làm là:

  • nếu tôi tạo xxx.php,#!/usr/bin/env php sẽ là dòng đầu tiên của tệp
  • nếu tôi tạo xxx.py,#!/usr/bin/env python sẽ được thêm vào trước.

Làm thế nào tôi có thể tiếp cận điều này?


4
2018-06-25 03:10


gốc




Các câu trả lời:


Sau một số công việc tìm kiếm, tôi tìm thấy một bài đăng trong SO có thể giải quyết vấn đề của tôi bằng cách sử dụng templates.Hope nó rất hữu ích cho các bạn.

Tạo mẫu pythontmp.txt và phptmp.txt trong một số hướng dẫn (ví dụ:~/.vim/templates/) như bên dưới

#!/usr/bin/env python(php)

Thêm cài đặt sau vào .vimrc

autocmd bufnewfile *.py :0r ~/.vim/templates/pythontmp.txt
autocmd bufnewfile *.php :0r ~/.vim/templates/phptmp.txt

9
2018-06-25 07:47



Câu trả lời tự +1 là tốt cho SU (đây cũng là cách đúng để làm điều đó). - msw


Bạn không chắc chắn bạn có thể thiết lập vim để làm điều này không được hỗ trợ. Bạn có thể tạo một kịch bản trợ giúp để làm điều đó cho bạn.

Giả sử một môi trường Linux ... Kịch bản này sẽ kiểm tra phần mở rộng tập tin, và nếu cần thiết tạo ra các tập tin với tiêu đề trước khi gọi vim.

#/bin/bash

type=`expr "\$1" : ".*\.\(.*\)"`   # Check the file extension

case "$type" in
    py) 
    interpreter=python;
    ;;
    php)
    interpreter=php;
    ;;
esac

if test ${interpreter+defined}; then echo "#!/usr/bin/env $interpreter" > $1 && /usr/bin/vim $1;
else /usr/bin/vim $1;
fi

Sau đó, bạn có thể đặt tên cho tập lệnh này để chạy thay cho vim.

alias vim='/path/to/script.sh'

1
2018-06-25 07:02



Bạn cũng có thể điều tra plugin / script vim - Tim Kane
Vâng tôi đang ở đó. ${interpreter+defined} nghĩa là tôi phải xóa +defined và làm cho nó hoạt động. - SpawnST
Đó là một cơ chế (sử dụng mở rộng tham số) để kiểm tra xem biến $ interpreter đã được định nghĩa chưa. Bạn có thể dễ dàng viết $ {interpreter + blah} để có cùng tác dụng. $ {var + word} # nếu var được định nghĩa, sử dụng "word"; nếu không, không có gì - Tim Kane
oh tôi có bạn, cảm ơn :) - SpawnST


Có tồn tại nhiều plugin cung cấp tính năng này. Một số thậm chí cho phép bạn tự động suy ra nhiều thứ khác nhau, hoặc thậm chí parametrize tiêu đề của bạn tùy thuộc vào thư mục mà bạn đang tạo tập tin mới của bạn (mu-template).


1
2018-06-25 09:25



1 có, rất nhiều plugin giúp tạo nội dung tích hợp xung quanh "autocmd" dễ dàng hơn. tất cả đều chạy theo các điều khoản của "mẫu" và "bộ xương". - akira


Tôi thực sự thích cách tiếp cận xác định một hàm vim để thực hiện công việc, theo cách này nó trở nên dễ dàng hơn để làm những việc phức tạp hơn. Ví dụ: nếu văn bản được chèn phụ thuộc vào tên của tệp như thường được thực hiện với C / C ++. C / C ++ của tôi trông giống như sau:

autocmd BufNewFile *.{h,hpp} call <SID>insert_c_gates() 

...

function! s:insert_c_gates()
   let gatename = <SID>get_gate_name()
   execute "normal i#ifndef " . gatename
   execute "normal o#define " . gatename
   execute "normal Go#endif /* " . gatename . " */"
   normal kk
endfunction

Hàm get_get_name () tạo thành tên cổng từ tên của tệp đang được chỉnh sửa và thực sự thay đổi tùy thuộc vào dự án mà tôi đang làm việc vì một số dự án muốn nó được định dạng theo một cách nhất định.


1
2018-06-25 14:05



Tôi cảm thấy giải pháp của bạn là mạnh mẽ hơn mặc dù không hoàn toàn hiểu được chức năng. - SpawnST
Trên thực tế, chơi với :exe+:normal (/:put) khá cồng kềnh để duy trì so sánh với các giải pháp như mu-template (xem code.google.com/p/lh-vim/source/browse/mu-template/trunk/after/…). Việc trích xuất chức năng tạo tiêu đề khá dễ dàng miễn là hỗ trợ Plugin Expander Plugin gọi các hàm viml "bên ngoài". - Luc Hermitte
Vâng, điểm không phải là sự kết hợp bình thường và thực hiện (tôi đã viết nhiều năm trước đây, và đã không thay đổi chúng kể từ) ... nhưng thực tế là bằng cách đặt một cuộc gọi hàm trong đó bạn có quyền truy cập vào tất cả sức mạnh kịch bản của vim thay vào đó chỉ cần chèn một mẫu. Plugins chắc chắn cung cấp một số dễ sử dụng tốt đẹp, nhưng nếu bạn muốn có giải pháp của riêng bạn mà không có một plugin, phương pháp tiếp cận chức năng là một điểm khởi đầu tốt cho tất cả các giải pháp. - Neg_EV
Whats xảy ra trong func của tôi là tôi có một get_gate_name func mà phụ thuộc vào đường dẫn của tập tin tôi xác định tên của nó (tôi giữ các dự án của tôi được tổ chức theo một thư mục dự án theo cách cho phép tôi làm điều này). Sau đó, một khi tôi có tên tôi chèn các cổng (trong một cách rất nguyên thủy) bằng cách sử dụng các lệnh thực thi bình thường. Một lý do khác tôi làm điều này là tôi đã viết một func UpdateGates mà đưa ra một tập tin với các cổng hiện có tôi có thể cập nhật chúng vào những gì tôi muốn (ví dụ, nếu tôi đổi tên một tập tin). Điều này cho phép tôi sử dụng lại các chức năng mà một giải pháp mẫu / plugin có thể không dễ dàng như vậy. - Neg_EV