Auto generate lại tags file cho vim bằng ctags
vim
20
ctags
2
Git
54
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 hơn 1 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 hơn 1 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
49 8
Tôi xin tổng hợp các cách dùng git stash tôi hay sử dụng Lưu lại thay đổi Git stash được sử dụng khi muốn lưu lại các thay đổi chưa commit, thườ...
BB viết 3 năm trước
49 8
White
4 4
_Có thể bạn biết rồi]_ Cách sử dụng ctags để làm việc hiệu quả hơn trên VIM editor. Hôm nay nhân dịp cài lại hệ điều hành, cần phải tạo lại bộ ta...
Hiền Vương viết gần 3 năm trước
4 4
{{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á!