2010-02-02 53 views
10

Mỗi lần sau khi tải một cscope.out trong Vim, tôi cần thay đổi "pwd" của Vim thành cùng thư mục với tệp cscope.out, có thể do đường dẫn tương đối cscope sử dụng khi tạo tệp thẻ. Vì vậy, nếu có một cách để buộc cscope sử dụng đường dẫn tuyệt đối trong tệp thẻ của nó - cscope.out, thì nó sẽ không phân biệt liệu pwd của phiên Vim của bạn có giống với thư mục mà tệp cscope.out ở dưới hay không.Làm thế nào để cho phép cscope sử dụng đường dẫn tuyệt đối trong tệp cscope.out?

Trả lời

11

Khi nhập cscope.out, bạn có thể cung cấp các tiền tố, ví dụ:

:cscope add /path/to/cscope.out /path/to/src/code 

Sau đó tìm kiếm của bạn sẽ bật lên như:

Cscope Tag: foobar 
    # line filename/context/line 
    1  21 /path/to/src/code/foobar_file.c 
1

@Aaron H. là đúng.

Đối với cấu hình của tôi, tôi sử dụng các plugin cscope_maps.vim và sửa đổi những dòng sau:

40  " add any cscope database in current directory 
    41  if filereadable("/usr/project/cscope.out") 
    42   cs add /usr/project/cscope.out /usr/project 
    43  " else add the database pointed to by environment variable 
    44  elseif $CSCOPE_DB != "" 
    45   cs add $CSCOPE_DB 
    46  endif 

đâu "/ usr/dự án" là vị trí của các tập tin cscope.out và đường dẫn tuyệt đối tôi muốn sử dụng.

4

Các cscope tutorial có một cách giải quyết rất đơn giản cho vấn đề này:

11.Try thiết lập các biến môi trường $CSCOPE_DB để trỏ đến một cơ sở dữ liệu cscope bạn tạo ra, vì vậy bạn sẽ không phải lúc nào cần phải khởi động Vim trong cùng thư mục với cơ sở dữ liệu. Điều này đặc biệt hữu ích cho các dự án nơi mã được chia thành nhiều thư mục con. Lưu ý: cho này để làm việc, bạn nên xây dựng cơ sở dữ liệu với tên đường dẫn tuyệt đối: cd vào /, và làm

find /my/project/dir -name '*.c' -o -name '*.h' > /foo/cscope.files 

Sau đó chạy cscope trong cùng thư mục với file cscope.files (hoặc sử dụng 'cscope /foo/cscope.files -i), sau đó thiết lập và xuất biến $ CSCOPE_DB, trỏ nó đến tập tin cscope.out mà kết quả):

cd /foo 
cscope -b 
CSCOPE_DB=/foo/cscope.out; export CSCOPE_DB 

(lệnh cuối cùng ở trên là dành cho Bourne/Korn/Bash shells: Tôi đã quên cách xuất các biến trong shell dựa trên csh, sin ce Tôi tránh chúng như bệnh dịch hạch).

Bây giờ, bạn có thể chạy 'vim -t foo' trong bất kỳ thư mục nào trên máy của bạn và có Vim nhảy ngay đến định nghĩa 'foo'. Tôi có xu hướng viết các kịch bản lệnh shell nhỏ (chỉ định nghĩa và xuất CSCOPE_DB) cho tất cả các dự án khác nhau của tôi, cho phép tôi chuyển đổi giữa chúng với lệnh đơn giản 'source projectA' của .

3

Bạn có thể tạo cscpoe.files bạn sử dụng đường dẫn tuyệt đối đến tập tin của bạn, đây là kịch bản của tôi để tạo ra cơ sở dữ liệu cscope tôi

#!/bin/sh 

find $PWD -name '*.[ch]' -exec echo \"{}\" \; | sort -u > cscope.files 
cscope -bvq 

cscope.files Sau đó chỉ cần vim và có thể: cs thêm cscope.out , mặc dù plugin cscope của tôi thực hiện điều đó một cách tự động. Sau đó, tôi tìm kiếm các tập tin tôi quan tâm và nhảy đến chúng với gf.

+0

cũng chạy 'xuất CSCOPE_DB = $ (pwd)/cscope.out' trên cùng một thư mục mà tập lệnh chạy – Paschalis

10

Bạn có thể yêu cầu vim diễn giải đường dẫn trong cscope.ra tương đối đến vị trí của tệp cscope.out bằng cách đặt tùy chọn cscoperelative. Từ :help csre:

Nếu 'cscoperelative' được thiết lập, sau đó trong sự vắng mặt của một tiền tố cho cscope (tiền tố là lập luận của -P tùy chọn cscope), basename của vị trí cscope.out (thường là thư mục gốc của dự án) sẽ được sử dụng làm tiền tố để tạo đường dẫn tuyệt đối. Mặc định là tắt. Lưu ý: Tùy chọn này chỉ có hiệu lực khi cscope (cscopeprg) được khởi tạo mà không có đường dẫn tiền tố (-P).

Ví dụ

: set csre
: set nocsre

+5

Điều này thực sự là câu trả lời được chấp nhận từ góc nhìn vim + cscope là giải pháp dễ nhất. Cảm ơn bạn vì câu trả lời! – janjust

1

Lưu ý: vì tôi không đủ cao cấp để thêm ý kiến ​​nào: Aaron và Neha của câu trả lời là hữu ích với tôi để tìm hiểu thêm về toàn bộ hệ thống, nhưng câu trả lời tốt nhất và trực tiếp nhất cho câu hỏi hiện đang ở vị trí thứ 3 và là của Shayan.

Người hỏi đã hỏi thêm về cách nhận tên đường dẫn tuyệt đối bằng cscope, không làm việc xung quanh nó bằng cách sử dụng vim (rất có khả năng và mạnh mẽ).

Note2: Có một cách khác để thực hiện một thay đổi duy nhất trong vim và thực hiện giống như những gì Neha đã làm.

:set cscopeprg=cscope -P path_to_relative_base 

Tôi thích Neha tốt hơn, nhưng cách này gần gũi hơn với việc sửa đổi cscope thay vì cài đặt vim, nếu đây là những gì bạn muốn. Và đây là cách duy nhất cho phép bạn di chuyển db cscope đến bất cứ đâu.

Các vấn đề liên quan