2015-08-08 14 views
10

Có thể hiển thị các khối #ifdef hiện tại trong Emacs (ví dụ ở chế độ dòng) không?Hiển thị các khối #ifdef kèm theo trong Emacs

Ví dụ:

#ifdef A 
... | #cursor position num. 1 
#ifdef !B & C 
... 
#else /* !B & C */ 
foo(); | #cursor position num. 2 
#endif /* !B & C */ 
#endif /* A */ 

Nó sẽ hiển thị A phù hợp chế độ, nếu tôi đặt con trỏ ở vị trí 1 và hiển thị A & !(!B & C) ở vị trí 2. Tôi đã sử dụng chế độ ẩn-if-def. Nhưng đôi khi tôi cần phải làm việc với tất cả các khối #ifdef.

+0

Không phải là câu trả lời, nhưng thật hữu ích khi thực hiện 'C-c C-u' để nhảy tới' # ifdef' gần nhất. Sau đó, bạn có thể sử dụng 'C-u C- ' để trở về vị trí hiện tại của bạn. –

Trả lời

3

Tôi đã không luôn thành công với WhichFunction, nhưng nó sẽ hoạt động tốt với mã C/C++. Tùy chỉnh này sẽ thêm một hàm mới vào lược đồ nhận dạng sẽ cho bạn biết khi bạn đang ở trong một khối #ifdef.

(require 'which-func) 
(which-function-mode 1) 
(defun name-of-current-conditional() 
    "rather inelegant coding, but it works" 
    (interactive) 
    (let (outer) 
    (condition-case nil 
     (dotimes (myv 10) 
      (save-excursion 
      (c-up-conditional (1+ myv)) 
      (setq outer (buffer-substring-no-properties 
           (line-beginning-position) 
           (line-end-position))))) 
     (error nil)) 
    outer)) 
(setq which-func-functions '(name-of-current-conditional)) 
+0

Cảm ơn bạn đã làm việc của bạn, nhưng tôi nghĩ rằng nó là hữu ích chỉ trong trường hợp sử dụng ifdef 's đơn giản. Nó cho thấy "ifdef A" khi tôi ở dưới "else". Tôi muốn xem "ifdef! A" hoặc "ifndef A" trong trường hợp này. Nó cũng không xử lý phức tạp "ifdefs". Tôi có rất nhiều ifdef lồng nhau trong dự án của tôi. Có lẽ gần như không thể có tính năng như thế. – folq

+0

@folq - Phải, bạn muốn mã để thực hiện logic boolean thực tế trên các mệnh đề khi bạn diễu hành. Bạn có thể sử dụng mã của tôi để bắt đầu kết hợp với nhau, nhưng đó là một nhiệm vụ lớn hơn tôi muốn tiếp tục. –

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