2009-02-28 32 views
80

Tôi đang cố gắng đọc rất nhiều mã c/perl thông qua vim chứa nhiều tên biến chữ cái duy nhất. Nó sẽ là tốt đẹp để có một số lệnh có thể giúp tôi thay đổi tên của một biến cho một cái gì đó có ý nghĩa hơn trong khi tôi đang trong quá trình đọc mã để tôi có thể đọc phần còn lại của nó nhanh hơn.
Có một số lệnh trong vim mà có thể cho phép tôi nhanh chóng làm điều này.Thay đổi tên biến trong Vim

Tôi không nghĩ rằng regexes sẽ làm việc cos
1) tên chữ cái giống nhau có thể có mục đích khác nhau trong khối Phạm vi khác nhau
2) cùng một kết hợp của các chữ cái có thể là một phần của một tên var lớn hơn, hoặc trong một chuỗi hoặc nhận xét .. sẽ không muốn sửa đổi những số

Bất kỳ giải pháp nào đã biết ??

Trả lời

160

Sau đây là cách đổi tên biến số được xác định trong phạm vi hiện tại {}.

Di chuyển con trỏ đến mức sử dụng biến. Nhấn gd. Có nghĩa là - di chuyển con trỏ đến định nghĩa. Bây giờ Bấm [{ - điều này sẽ đưa bạn đến phạm vi bắt đầu. Bấm V - sẽ bật lựa chọn Visual Line. Nhấn % - sẽ chuyển sang đối diện } do đó sẽ chọn toàn bộ phạm vi. Bấm :s/ - bắt đầu lệnh thay thế. <C-R>/ - sẽ chèn mẫu khớp với tên biến (tên bạn đã đặt trước khi nhấn gd). /newname/gc<CR> - sẽ bắt đầu tìm kiếm và thay thế bằng xác nhận trên mỗi trận đấu.

Bây giờ bạn phải ghi lại một macro hoặc thậm chí tốt hơn - ánh xạ một khóa.

Sau đây là các ánh xạ cuối cùng:

" For local replace 
nnoremap gr gd[{V%::s/<C-R>///gc<left><left><left> 

" For global replace 
nnoremap gR gD:%s/<C-R>///gc<left><left><left> 

Đặt này để .vimrc bạn, hoặc chỉ thực thi. Sau khi nhấn gr trên biến cục bộ này sẽ đưa bạn đến :s lệnh mà bạn chỉ cần nhập new_variable_name và nhấn Nhập.

+30

+1 cho việc học nhiều hơn 5 thủ thuật Vim mới mà tôi nên biết trước đây. Cảm ơn –

+0

Thực sự hữu ích, +1 đặc biệt vì nó có thể được "mở rộng" sang các ngôn ngữ khác một cách dễ dàng. –

+6

Lưu ý: gd không hoạt động để định vị biến trong phạm vi ngay lập tức của định nghĩa trong chế độ Javascript trong macvim. Nó đưa tôi đến sử dụng đầu tiên của tên biến trong một số hàm trong tệp: ( Nếu bạn ở trong phạm vi nào đó và muốn chọn phạm vi đó, "va {" - "chọn hình ảnh xung quanh {" - là cách – Srikumar

2

Bạn có thể sử dụng công cụ sửa đổi 'c' trong tìm kiếm toàn cầu và thay thế điều đó sẽ yêu cầu bạn xác nhận cho từng thay thế. Sẽ mất nhiều thời gian hơn nhưng có thể hoạt động đối với tệp mã không humongous:

%s/\$var/\$foo/gc 

Chữ c là viết tắt của xác nhận.

+0

Tôi viết tắt của trường hợp bỏ qua. Bạn muốn c, xác nhận mọi thay đổi. –

+0

Không chắc chắn rằng bạn cần phải thoát khỏi $ foo ... –

+0

oops .. xin lỗi về điều đó .. Cố định câu trả lời – Adnan

8

AFAIK, không có hỗ trợ tái cấu trúc thực tế nào trong VIM. Khi thực hiện một sự đổi tên với ý định của một refactor, tôi thường thực hiện các percautions sau đây.

  1. Giới hạn phạm vi thay đổi sử dụng nhãn hiệu của tôi.
  2. Khi nhập regex, hãy đặt tên bằng \ < và >. Điều này sẽ làm cho nó phù hợp với toàn bộ một từ làm giảm các loại tên gọi không chính xác sẽ xảy ra.
  3. Không thực hiện thay thế nhiều dòng để giảm nguy cơ thay thế xấu
  4. Xem kỹ mã khác nếu đó là bất kỳ điều gì khác ngoài thay đổi nhỏ.

thay đổi cuối cùng của tôi trông giống như sau

:'a,'bs/\<foo\>/bar 

tôi rất thích là sai về có không phải là một công cụ refactoring cho VIM nhưng tôi đã không nhìn thấy nó.

+0

Trong Perl bạn cũng có thể thêm kiểu vào mẫu tìm kiếm. tức là $ cho scalars, @ cho mảng,% cho băm –

+0

@Nathan: thật không may, nó khó hơn một chút trong Perl (5.X), vì sigil của mảng và băm thay đổi với cách sử dụng:% hash -> hash toàn bộ, $ hash {key} -> giá trị duy nhất, @hash {qw/ab /} hash slice. – user55400

0

Trong c, bạn có thể thực hiện một số tiến bộ khi sử dụng cscope. Nó làm cho một nỗ lực hiểu cú pháp, vì vậy sẽ có cơ hội biết khi nào lá thư là một biến.

0

Nếu điều này xảy ra ở nhiều tệp, bạn có thể cân nhắc xem xét sed. Sử dụng tìm kiếm để lấy các tập tin của bạn và xargs cộng với sed cho một thay thế. Giả sử bạn muốn thay thế a bằng a_better_name trong tất cả các tệp phù hợp với * .c, bạn có thể làm

tìm. -name "* .c" | xargs sed -i -e 's/a/a_better_name/g'

Hãy nhớ rằng điều này sẽ thay thế TẤT CẢ các lần xuất hiện của một, vì vậy bạn có thể muốn có một regex mạnh mẽ hơn.

7

Đặt này trong vimrc của bạn

" Function to rename the variable under the cursor 
function! Rnvar() 
    let word_to_replace = expand("<cword>") 
    let replacement = input("new name: ") 
    execute '%s/\(\W\)' . word_to_replace . '\(\W\)/\1' . replacement . '\2/gc' 
endfunction 

Gọi nó với :call Rnvar()

expand("<cword>") được từ dưới con trỏ. Chuỗi tìm kiếm sử dụng % cho phạm vi tệp và các mẫu \(\W\) tìm các ký tự không phải từ ở ranh giới của từ để thay thế và lưu chúng trong các biến \1\2 để được chèn lại vào mẫu thay thế.