Cách nhận xét một khối mã Python trong Vim


186

Tôi đã tự hỏi nếu có bất kỳ ánh xạ khóa nào trong Vim để cho phép tôi thụt dòng một số mã nhất định (liệu các dòng đó đã được chọn trong chế độ trực quan hay n dòng trên / dưới vị trí con trỏ hiện tại).

Vì vậy, về cơ bản một cái gì đó chuyển đổi sau đây

def my_fun(x, y):
    return x + y

đến

#def my_fun(x, y):
#    return x + y

Tôi ổn với việc sử dụng một trong hai #hoặc """để bình luận các dòng liên quan. Lý tưởng nhất, tôi cũng muốn cùng một sơ đồ bàn phím để bỏ ghi chú các dòng nếu các dòng đã cho đã được nhận xét.


Không cần phải phát minh lại bánh xe, có một plugin: tVer cho bạn, hỗ trợ (un) mã nhận xét cho nhiều ngôn ngữ.
Meow

Câu trả lời:


410

Bước 1: Chuyển đến cột đầu tiên của dòng đầu tiên bạn muốn nhận xét.

Trạng thái ban đầu

Bước 2: Nhấn: Ctrl+ vvà chọn các dòng bạn muốn nhận xét:

Chọn dòng

Bước 3: Shift - I#space(Nhập chế độ Chèn ở bên trái, nhập ký tự để chèn. Lựa chọn sẽ biến mất, nhưng tất cả các dòng trong đó sẽ được sửa đổi sau Bước 4.)

Bình luận

Bước 4: Esc

<Esc>


4
Bình luận các dòng theo cách này hoạt động tuyệt vời. Có một số cách để bỏ ghi chú những dòng này? Shift-I # <ESC>đã không làm việc (có thể tôi đang làm sai).
Rishabh Manocha

41
@ rishabh-manocha: sử dụng khối trực quan (Ctrl-V) để chọn tất cả # đã thêm và nhập x để xóa chúng.
theosp

3
Bạn phải nhớ rằng Shift-I có nghĩa là "chèn vào chỗ trống đầu tiên trong dòng", vì vậy nó không thể được sử dụng để xóa. Thực hiện lựa chọn trực quan bằng Ctrl-V đánh dấu các ký tự cần sửa đổi, sau đó "x" xóa một ký tự trong vùng đã chọn, cuối cùng xóa các ký tự '#'. Xem ": h I" và ": h CTRL-V" trong vim để biết thêm thông tin.
Tin Man

5
@Samaursa Ctrl-V có thể không hoạt động trên Windows. Thay vào đó hãy thử Ctrl-Q.
AZ.

1
Để xóa 2 ký tự (nếu bạn đã chèn '#'), hãy xác định con trỏ ở dòng trên cùng bạn muốn sửa đổi, nhấn ctrl-v để vào chế độ khối trực quan, nhấn j (hoặc mũi tên xuống) để tô sáng tất cả các dòng cần sửa đổi, nhấn l (hoặc mũi tên phải) để tô sáng chiều rộng 2 char (nhấn một lần trên mỗi cột để tô sáng), sau đó nhấn d để xóa văn bản được tô sáng.
suy nghĩ


49

Bạn có thể thêm ánh xạ sau vào .vimrc của bạn

vnoremap <silent> # :s/^/#/<cr>:noh<cr>
vnoremap <silent> -# :s/^#//<cr>:noh<cr>

Làm nổi bật khối của bạn với:

Shift+v

# để bình luận các dòng của bạn từ cột đầu tiên.

-# để uncomment cùng một cách.


5
Đơn giản là rực rỡ! Cảm ơn bạn!
I159

1
@architectonic nó không có hiệu ứng trừ khi bạn ở chế độ trực quan và '#' không bị ràng buộc trong chế độ trực quan vimdoc.sourceforge.net/htmldoc/visual.html#visual-operators
cdated

1
Tôi đã sửa đổi một chút: Ctrl + k cho nhận xét "vnoremap <im lặng> <Ck>: s # ^ # \ ## <cr>: noh <cr>"> Ctrl + u để không ghi chú: "vnoremap <im lặng> <Cu >: s # ^ \ ### <cr>: noh <cr> "
Pradip Das

1
@JonathanHartley bạn không phải sử dụng '/' trong trường hợp này '#' là dấu phân cách. Vì vậy: s / ^ / # / và: s / ^ # // là những sự thay thế tương đương. Vì vậy, thay thế đầu dòng bằng '#' và thay thế '#' ở cột đầu tiên bằng ''. <cr>: noh <cr> chỉ xóa chuỗi tìm kiếm để không có gì nổi bật khi bạn hoàn thành.
cdated

1
@JonathanHartley Thành thật tôi nghĩ rằng tôi chỉ theo một mô hình mà không nghĩ về nó. Bây giờ tôi ngạc nhiên # vs / không đến sớm hơn. Thay đổi câu trả lời dựa trên ý nghĩa thông thường. Cảm ơn!
cdated

26

Làm nổi bật khối của bạn với: ShiftV

Nhận xét khối được chọn với: :norm i#(chữ thường i)

Để bỏ ghi chú, tô sáng lại khối của bạn và bỏ ghi chú với: :norm ^x

Các :normlệnh thực hiện một hành động cho mỗi dòng được chọn. Nhận xét sẽ chèn một #ở đầu mỗi dòng và không ghi chú sẽ xóa điều đó #.


Với Vim cập nhật và cấu hình đơn giản, chọn các dòng trong chế độ trực quan (với Shift+v) và sau đó :norm i#chỉ sử dụng thay đổi dòng được chọn đầu tiên. Điều này hoạt động để tôi nhận xét các dòng 389 đến 391::389,391norm i #
mmell

22

Tôi thường quét một khối trực quan ( <C-V>), sau đó tìm kiếm và thay thế ký tự đầu tiên bằng:

:'<,'>s/^/#

(Vào chế độ lệnh với một khối trực quan được chọn tự động đặt '<,'> trên dòng lệnh) Sau đó tôi có thể bỏ ghi chú khối bằng cách quét ra cùng một khối trực quan và:

:'<,'>s/^#//


9

Tôi có các dòng sau trong .vimrc:

" comment line, selection with Ctrl-N,Ctrl-N
au BufEnter *.py nnoremap  <C-N><C-N>    mn:s/^\(\s*\)#*\(.*\)/\1#\2/ge<CR>:noh<CR>`n
au BufEnter *.py inoremap  <C-N><C-N>    <C-O>mn<C-O>:s/^\(\s*\)#*\(.*\)/\1#\2/ge<CR><C-O>:noh<CR><C-O>`n
au BufEnter *.py vnoremap  <C-N><C-N>    mn:s/^\(\s*\)#*\(.*\)/\1#\2/ge<CR>:noh<CR>gv`n

" uncomment line, selection with Ctrl-N,N
au BufEnter *.py nnoremap  <C-N>n     mn:s/^\(\s*\)#\([^ ]\)/\1\2/ge<CR>:s/^#$//ge<CR>:noh<CR>`n
au BufEnter *.py inoremap  <C-N>n     <C-O>mn<C-O>:s/^\(\s*\)#\([^ ]\)/\1\2/ge<CR><C-O>:s/^#$//ge<CR><C-O>:noh<CR><C-O>`n
au BufEnter *.py vnoremap  <C-N>n     mn:s/^\(\s*\)#\([^ ]\)/\1\2/ge<CR>gv:s/#\n/\r/ge<CR>:noh<CR>gv`n

Các phím tắt duy trì vị trí con trỏ và nhận xét của bạn miễn là chúng bắt đầu bằng #(có khoảng trắng sau #). Ví dụ:

# variable x
x = 0

Sau khi bình luận:

# variable x
#x = 0

Sau khi không chú ý:

# variable x
x = 0

Đẹp, nhưng tôi nghĩ rằng bạn sẽ tốt hơn khi sử dụng s/^/#/regrec đơn giản hơn . Tôi thích char bình luận xuất hiện ở đầu dòng ... nhưng quan trọng hơn nhiều, 'bình luận bình luận' thực sự khá quan trọng. Tôi cũng sẽ bỏ qua au BufEnter *.py, vì các #bình luận đủ chung để các lệnh được sử dụng trong tất cả các bộ đệm theo mặc định.
travc

5

Thành thật mà nói tôi sử dụng một plugin tcomment cho liên kết đó . Nó có thể xử lý hầu hết mọi cú pháp. Nó xác định các chuyển động đẹp, sử dụng nó với một số trình so khớp khối văn bản dành riêng cho python làm cho nó trở thành một công cụ mạnh mẽ.


5

NERDcommenter là một plugin tuyệt vời để bình luận tự động phát hiện một số kiểu tệp và các ký tự nhận xét được liên kết của chúng. Rất dễ cài đặt bằng Pathogen .

Nhận xét với <leader>cc. Không hài lòng với <leader>cu. Và chuyển đổi ý kiến ​​với <leader>c<space>.

(Khóa mặc định <leader>trong vim là \)


3

Có rất nhiều plugin bình luận cho vim - một số trong đó là đa ngôn ngữ - không chỉ là python. Nếu bạn sử dụng trình quản lý plugin như Vundle thì bạn có thể tìm kiếm chúng (khi bạn đã cài đặt Vundle) bằng cách sử dụng:

:PluginSearch comment

Và bạn sẽ nhận được một cửa sổ kết quả. Ngoài ra, bạn chỉ có thể tìm kiếm tập lệnh vim cho các plugin nhận xét .


3

Không có plugin hoặc ánh xạ cần thiết. Hãy thử lệnh "Norm" tích hợp, thực thi bất cứ thứ gì bạn muốn trên mỗi dòng được chọn.

Thêm # Nhận xét

1. shift V to visually select lines
2. :norm i#

Xóa # Bình luận

1. visually select region as before
2. :norm x

Hoặc nếu bình luận của bạn được thụt lề, bạn có thể làm :norm ^x

Lưu ý rằng đây chỉ là các lệnh vim thông thường được đặt trước ": Norm" để thực thi chúng trên mỗi dòng.

Câu trả lời chi tiết hơn cho việc sử dụng lệnh "Norm" trong một trong những câu trả lời ở đây

Cách nhanh chóng để bình luận / dòng chú thích trong Vim là gì?


1

Một plugin trọng lượng rất tối thiểu : vim-bình luận.

gccđể bình luận một dòng
gcgcđể uncomment. kiểm tra trang plugin để biết thêm.

v+k/jlàm nổi bật khối sau đó gccđể bình luận khối đó.


0

CtrlK để bình luận (Chế độ trực quan):

vnoremap <silent> <C-k> :s#^#\##<cr>:noh<cr>

CtrlU cho uncomment (Chế độ trực quan):

vnoremap <silent> <C-u> :s#^\###<cr>:noh<cr>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.