Auto generate lại tags file cho vim bằng ctags
vim
22
ctags
2
Git
56
White

khoinv viết ngày 15/11/2016

[có thể bạn biết thừa]
Ctags là gì + Cách cài đặt Ctags thì các bạn có thể xem ở bài Sử dụng ctags với vim của bạn @hienvd.
Minh xin được tóm tắt lại: vim và 1 số editor thường support sẵn tag, việc bạn cần làm là tạo tag file để editor có thể reference vào đó và đọc. Ctags là 1 chương trình tạo ra tag file.

Việc tạo tags file theo như link trên, thì đã có thể có được tag file cho dự án ban đầu, nhưng mỗi khi dự án có thêm source mới thì việc chúng ta lại cần phải gõ lại câu lệnh tạo tag file này => hơi bất tiện.

Cách giải quyết:

  1. Trigger generate tags file when saving file in vim
  2. Trigger generate tags file in git hook

1 Trigger generate ctags when saving file in vim

Bạn có thể dùng Plugin bên dưới để làm việc này
https://github.com/soramugi/auto-ctags.vim
và khai báo trong .vimrc như sau

  set tags+=.git/tags
  let g:auto_ctags_directory_list = ['.git', '.svn']
  let g:auto_ctags = 1
  let g:auto_ctags_tags_args = '--tag-relative --recurse --sort=yes'

Việc tạo lại tag file này sẽ được thực hiện tự động khi bạn ghi content vào 1 file bất kì trong project.
Problem: Vậy khi bạn vừa checkout sang branch khác, hoặc pull code về thì tag file của bạn chửa được update ngay?
Solution: ( 1 trong 2 cách sau)

  • Mở file cái, làm ngay lệnh :w của vim :))
  • Dùng git hook(mình sẽ trình bày ở phần 2)

2 Trigger generate tag file in git hook

Khi bạn muốn tự động 1 task nào đó được thực hiện sau hoặc trước các lệnh commit, checkout, pull ... Để thực hiện việc đó ta dùng git hook

ví dụ trong trường hợp này, bạn muốn tự động tạo tags file sau khi thực hiện git checkout thì bạn sẽ thêm code dưới vào trong file .git/hooks/post-checkout

#!/bin/sh
/usr/bin/ctags --tag-relative --recurse --sort=yes  --append=no -f .git/tags

Bạn có thể làm tương tự với các file .git/hooks/[post-commit, post-merge,..]
Để tránh code bị lặp lại ở các file giống nhau thì bạn có thẻ tạo 1 file là .git/hooks/ctags với contents như dưới

#!/bin/sh
/usr/bin/ctags --tag-relative --recurse --sort=yes  --append=no -f .git/tags

Sau đấy thì có thể tạo content của các file .git/hooks/[post-commit, post-merge,...] như bên dưới

./ctags >/dev/null 2>&1 &

Như vậy là bạn đã có thể hooks việc tạo ctags sau khi thực hiện commit, merge, pull... rồi

Problem: Vấn đề là với mỗi dự án bạn lại phải copy các file hooks trên vào dự án tương ứng
Solution: Share git hooks giữa các dự án

  • Từ bản git 2.9 thì có thể dùng core.hooksPath để làm việc này
  • Với các version khác thì có thể dùng init.templatedir để làm việc này ( Chú ý: với dự án đã có, đẻ apply templatedir mới vào bạn cần gõ lệnh git init trong thư mục project đó lần đầu tiên) Các bạn có thể tham khảo thêm ở đây http://tbaggery.com/2011/08/08/effortless-ctags-with-git.html

Discussion: Vậy là chúng ta biết rằng, cần phải tạo file tags để vim( or các editor khác đọc), chúng ta có thể làm thêm gì được ở đây:

  • Dự án include 1 cái core ở ngoài thư mục git quản lý, bạn hoàn toàn có generate 1 file tags cho phần code đó, và sau đó mỗi khi tạo lại ctag bạn sẽ include file đó vào.
  • Với trường hợp class name lúc khai báo và lúc dùng khác nhau, ví dụ bạn khai báo là
class TestController{
}

Nhưng khi xử dụng bạn lại dùng theo kiểu

$test = new TestCtl();

Khi đó bạn có thể dùng regex để thay đổi file tags sau khi được generate bởi ctags như sau

s/Controller/Ctl/g

3 Other ways

Có cách nào để auto update tags file khi có sự thay đổi không?
Có thể dùng 1 tool khác như gulp để watch xem có sự thay đổi của file không? nếu có thì tạo auto generate lại tags file

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

khoinv

6 bài viết.
28 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
7 5
Hôm nay vô tình đọc được bài của anh @huytd về (Link) Theo chuỗi cảm hứng mình cũng xin chia sẻ về bài toán (Link) Cách giải đơn giản python s...
khoinv viết 2 năm trước
7 5
White
1 0
Link tổng hợp các Awesome Repository https://github.com/sindresorhus/awesome content khoinv 21112016
khoinv viết gần 2 năm trước
1 0
White
1 1
Cách gán kiểu cho dữ liệu Json Kiến thức: JSON.stringify(obj) sẽ tự động gọi obj.toJSON JSON.parse(obj) có thêm thêm vào hàm obj.parse Dưới là i...
khoinv viết hơn 1 năm trước
1 1
Bài viết liên quan
White
14 12
Một vài thủ thuật vim mới biết, ghi lại cho khỏi quên Căn lề các cột dữ liệu Để căn lề ấn phím esc (để sang command mode) :%column t Chọn th...
studybot viết hơn 3 năm trước
14 12
White
2 0
Hôm nay group review một cái tài liệu về version control với mấy đồng nghiệp, một người bạn bảo: Cái đó có gì đâu mà ông viết có vẻ khó khăn vậy,...
Long Nguyễn Xuân viết 29 ngày trước
2 0
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
6 bài viết.
28 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!