Làm cách nào để xóa một khối lớn văn bản mà không đếm các dòng?


91

Trong vim, tôi thường cần xóa, hoặc kéo / đặt các khối văn bản lớn.

Tôi có thể đếm các dòng văn bản và nhập một cái gì đó như 50ddđể xóa 50 dòng.

Nhưng đó là một chút đau đớn. Làm thế nào tôi có thể xóa khối văn bản lớn này mà không cần phải biết trước có bao nhiêu dòng để xóa?


4
Làm thế nào để bạn biết nơi kết thúc là? Nếu bạn có thể mô tả kết thúc, bạn có thể xóa đến điểm đó. Nếu bạn có thể mô tả làm thế nào bạn có thể moveđến cuối cùng. Sau đó xóa đến cuối không khác gì di chuyển đến cuối.
Martin York

@Loki, di chuyển đến cuối thường chỉ bằng cách sử dụng trang xuống và các phím mũi tên cho đến khi tôi đến đó. Nó có thể là dòng trống đầu tiên hoặc thứ mười, nó có thể là dấu ngoặc đóng đầu tiên. Điểm mấu chốt là, nó thay đổi khá nhiều.

2
đồng thời kiểm tra câu trả lời này: stackoverflow.com/a/16407391/164835
Kent

Câu trả lời:


111

Đi đến dòng bắt đầu của khối của bạn và nhập ma(đánh dấu "a", mặc dù bạn tất nhiên có thể sử dụng các chữ cái khác nhau và thậm chí nhiều chữ cái cho các dấu khác nhau với điều kiện bạn có thể giữ thẳng trong đầu những gì mỗi chữ cái là một dấu) .

Sau đó đi đến dòng cuối cùng và nhập d'a(xóa để đánh dấu "a") hoặc y'a(yank để đánh dấu "a") (a) .

Điều đó sẽ xóa / kéo tất cả các dòng từ hiện tại đến đánh dấu (bao gồm).

Sau đó, bạn có thể dán nó vào một nơi khác bằng các lệnh dán thông thường, chẳng hạn như phoặc P.

Nó cũng tương thích với, vicũng như vimtrong trường hợp môi trường của bạn không được may mắn sau này.


(a) Tôi cũng sử dụng điều này để lưu vị trí của mình trong tệp nếu tôi phải đi tìm nơi khác để tìm một cái gì đó như, ví dụ, sao chép định nghĩa của hàm tôi muốn gọi.

Tôi chỉ đơn giản đánh dấu dòng hiện tại theo cùng một cách ma, sau đó đi lang thang để tìm bất cứ thứ gì bạn đang tìm kiếm.

Sau đó, khi tôi đã tìm thấy nó và sao chép nó vào một thanh ghi, tôi chỉ cần nhập 'ađể quay lại đánh dấu "a", dòng tôi đã lưu trước đó, nơi tôi có thể dán nó.


9
Cũng có thể sử dụng chế độ trực quan cho việc này, phải không?
jmc

3
Đó là một cách, jmc, nhưng tôi không chắc vi tiêu chuẩn có chế độ trực quan.

5
Vì tôi đã chuyển từ lựa chọn trực quan sang đánh dấu và số dòng tương đối khoảng một năm trước, tôi thấy rằng các lệnh chuyển động vi nhanh hơn và hiệu quả hơn sau đó là lựa chọn trực quan. Mặc dù sau này dễ hơn mỗi lần tôi nhấn vphím, tôi tự hỏi mình có thực sự cần nó hay có cách chuyển động nào tốt hơn không?
Sukima

1
Vâng, theo cách tương tự, thật thú vị, @Sukima, rằng tôi cảm thấy hiệu quả hơn khi tôi sử dụng chuột ít hơn, ngay cả trong GUI. Tôi thấy mình nhanh hơn nếu tôi có thể ở trên bàn phím.

3
Nếu bạn đã từng chỉnh sửa một cái gì đó với các dòng thực sự dài, phiên bản backtick của điều này cũng có thể rất hữu ích (trong đó đề cập đến vị trí trong dòng, thay vì toàn bộ dòng).
msouth 20/2/2015

65

Trong Vim, sử dụng chế độ dòng trực quan :

  1. Đặt con trỏ của bạn trên dòng trên cùng của khối văn bản / mã để xóa
  2. Báo chí V(Đó là chữ "V": Shift+ v)
  3. Di chuyển con trỏ của bạn xuống dưới cùng của khối văn bản / mã để xóa
  4. nhấn d

Để xóa các khối văn bản lớn, điều này được ưu tiên hơn chế độ hình ảnh đơn giản vì bạn không cần phải lo lắng về việc con trỏ đang ở cột nào.


3
Trong bước 3. bạn có thể di chuyển nhanh hơn bằng cách sử dụng chuyển động của đối tượng. Ví dụ có thể sử dụng }để chọn toàn bộ đoạn văn hoặc )cho câu. Có nhiều hơn nữa, bạn có thể đọc về chúng trong:h object-motions
mxlian

2
Ngoài ra, tìm kiếm một chuỗi con với /something<CR>là một phương pháp rất hiệu quả để đi đến cuối khối lựa chọn của bạn
mxlian

1
Đây là phương pháp ưa thích của tôi. Tuy nhiên, thay vào đó mà không phải nhấn liên tục jđể di chuyển con trỏ xuống (bước 3), bạn có thể nhập số dòng theo sau Gđể chọn cho đến dòng đó. Ví dụ:V150Gd
Ranhiru Jude Cooray


39

Bạn có thể dễ dàng xóa khối lớn văn bản biết cấu trúc của nó.

Nếu đó là đoạn văn, hãy sử dụng: d{(ví dụ: bạn có thể thêm tiền tố với số lượng đoạn văn)

Nếu đó là khối mã trong ngoặc đơn, hãy sử dụng: d%

Nếu văn bản xuất hiện cho đến cuối tệp, sử dụng: dG

Nếu bạn biết cách kết thúc, hãy sử dụng: d/và nhập văn bản kết thúc theo sau Enter(bạn cũng có thể sử dụng biểu thức chính quy, vì vậy khả năng là vô tận).

Hoặc sử dụng chế độ trực quan ( V) và sử dụng các phím chuyển động để nhanh chóng chọn văn bản (ví dụ {:) và xóa nó ( d).

Hoặc như Lie Ryan đề xuất, sử dụng d/search-string/eđể xóa văn bản từ con trỏ hiện tại đến chuỗi tìm kiếm.

Xem: :help d:help motionđể biết thêm.


2
Ngoài ra còn có d/search-string/ethể xóa từ con trỏ hiện tại đến cuối chuỗi tìm kiếm bao gồm cả chuỗi tìm kiếm và c/search-queryđể vào chế độ chèn sau khi xóa. Sử dụng d/với set incsearchlà một sự kết hợp gọn gàng vì nó cho phép bạn tương tác tìm hiểu xem bạn có đang hoạt động trên phạm vi văn bản phù hợp hay không và giúp bạn biết khi nào nên dừng truy vấn tìm kiếm để tránh nhập nhiều hơn mức cần thiết.
Lie Ryan

4
Tôi cũng tìm thấy dvới a(bên ngoài), hoặc i(bên trong) và một công cụ xác định đối tượng rất hữu ích. Các đối tượng như wđối với văn bản, pcho đoạn văn, (hoặc bcho (...), [cho [...], {hoặc Bcho {...}, vv tài liệu cho thị giác-vận hành .
Shahbaz

22

Bạn có thể sử dụng chuyển động và / hoặc các đối tượng văn bản. Chẳng hạn, bạn có thể xóa mọi thứ từ con trỏ đến dòng trống tiếp theo d}. Nếu con trỏ ở trong một đoạn, đoạn đó có thể bị xóa bằng diphoặc dap. Nếu con trỏ nằm trong thẻ HTML, bạn có thể xóa nó bằng dithoặc dat.

Những câu thần chú hay cho những điều này là " d elete i nside" và " d elete a round" (đoạn / tag / ngoặc đơn).


11

tôi thường làm

:<start>,<end>d

sẽ xóa mọi dòng giữa các số dòng bắt đầu và kết thúc được cung cấp (bao gồm các dòng đã cho).

Lưu ý rằng cả hai startendcó thể là số dòng, mẫu hoặc độ lệch tuyệt đối từ vị trí khác.

Ngoài ra, hãy xem nhận xét của doubleDown về việc xem tài liệu về phạm vi của Vim , nó có một số mẹo hữu ích.

Thí dụ:

Giả sử bạn có tệp sau:

1. The quick brown
2. fox jumps
3. over the
4. lazy dog.

Sau đó, bằng cách sử dụng các lệnh :2,3dhoặc :/fox/,/over/dhoặc :/quick/+1,/lazy/-1hoặc :+1,+2dnếu bạn đang ở trên dòng đầu tiên hoặc :-1,.dnếu bạn đang ở trên dòng thứ ba, bạn kết thúc với:

1. The quick brown
4. lazy dog.

Nhưng điều này có nghĩa là bạn vẫn cần phải đếm các dòng? Hay tôi đã hiểu nhầm câu trả lời của bạn?
Martin Tournoij

7
Bạn không cần phải đếm số dòng, nhưng bạn cần phải biết số dòng.
jmc

Đầu tiên làm :set ruler, sau đó đi đến đầu & cuối của văn bản để tìm startendsố dòng, sau đó làm:<start>,<end>d
roblogic

1
Bạn cũng có thể sử dụng số dòng tương đối:+12,+24d
rpattabi 22/03/2015

2
Trên thực tế, bạn có thể sử dụng một cặp số dòng, một cặp mẫu hoặc cặp hỗn hợp cho <start><end>cho việc này. Để tham khảo, xem :h [range]. Vì vậy, nó thực sự linh hoạt hơn một chút so với bạn nghĩ.
doubleDown

5

Nếu đó là các khối được phân tách (ví dụ: thẻ mã hoặc thẻ XML / HTML) mà bạn đang xử lý, bạn có thể định vị con trỏ ở đầu khối và sử dụng chế độ trực quan cùng với %để nhanh chóng chọn toàn bộ khối mã rồi nhấn dđể xóa chúng.


5
Ngoài ra, bạn có thể sử dụng dapđể xóa một đoạn văn, da(, da{, da[, để xóa khối delimeted bằng dấu ngoặc đơn, dấu ngoặc, hoặc dấu ngoặc vuông. Đối với html dat, có một thẻ xóa da'da"xóa các chuỗi. Ngoài ra còn có dip, di(biến thể, vv, mà sẽ xóa tất cả mọi thứ bên trong delimiters, nhưng để lại delimiters nguyên vẹn. Ngoài ra, bạn có thể sử dụng vap(resp vip) để chọn tất cả đoạn (resp bên trong). (Và vì vậy, có va(vi(.) Hơn nữa có capcip(hoặc ca(ci() để xóa và chuyển sang chế độ chèn (nghĩa là "thay đổi"). Và yapđể yank
jmc

Tôi nghĩ rằng một số ràng buộc @jmc được mô tả trong bình luận trước đó của anh ấy là từ plugin Surround.vim của Tim Pope. Đây là một plugin tuyệt vời mà tôi khuyên bạn nên cài đặt, nhưng điều đó có nghĩa là các ràng buộc này không phải là một phần của cài đặt vim mặc định.
Haegin

5

Ngoài tất cả các lời khuyên tốt khác tôi đang thêm d+ Shift+ Lđể xóa mọi thứ từ vị trí con trỏ hiện tại đến dòng hiển thị cuối cùng trên màn hình. Lặp lại lệnh sẽ giúp bạn xuống tương đối nhanh.


5

Các numbers.vim plugin là rất hữu ích cho việc này. Đó là một cách nâng cao để đi trước mỗi dòng với một số dòng. Giống như 'number''relativenumber', cả hai roled thành một!

Nó được bật theo mặc định sau khi cài đặt, bạn cũng muốn thêm set numbervào vimrc của mình nếu bạn chưa có nó, vì nó hoạt động theo những cách lạ nếu bạn không có nó.

chế độ bình thường, nó trông tương tự như :set relativenumber:

  3 call plug#begin('~/.vim/plugged')
  2 
  1 Plug 'myusuf3/numbers.vim'
7   set number█
  1 
  2 " Add indentation 'guidelines' (:IndentLinesToggle or <F11>)
  3 Plug 'Yggdroot/indentLine'

Nó hiển thị cho bạn số dòng tương đối, ngoại trừ dòng có con trỏ bật, nơi nó hiển thị số dòng tuyệt đối (7 trong trường hợp này).

Nếu sau đó chúng ta chuyển sang chế độ chèn , nó sẽ hoạt động như thể numberđược đặt bằng cách luôn hiển thị số dòng tuyệt đối:

  4 call plug#begin('~/.vim/plugged')
  5 
  6 Plug 'myusuf3/numbers.vim'
  7 set number█
  8   
  9 " Add indentation 'guidelines' (:IndentLinesToggle or <F11>)
 10 Plug 'Yggdroot/indentLine'

Có một số tùy chọn khác và một vài lệnh (kiểm tra trang chủ), nhưng mặc định sẽ hoạt động với hầu hết mọi người.


Lúc đầu, tôi nghĩ câu trả lời này hơi lạc đề nhưng sau đó tôi đã cài đặt plugin và tôi phải nói rằng đó là một công cụ thay đổi trò chơi đối với tôi. Tôi đã từng trao đổi bằng tay và bước tinh thần thêm có nghĩa là tôi ngại sử dụng những chuyển động đó. Cảm ơn bạn!
Sukima

1
Điều này nghe có vẻ giống như điều mà một Autocmd Chèn / ChènLeave tự động chuyển đổi để đánh số dòng tương đối có thể làm. Tui bỏ lỡ điều gì vậy?
Ben

Tôi đến RẤT muộn buổi tiệc nhưng @Ben nói đúng, đây chỉ là một vài dòng tự động. Ví dụ, trong vimrc của tôi, tôi có set number, set relativenumbersau đó autocmd InsertEnter * :set norelativenumberautocmd InsertLeave * :set relativenumber
B Lớp

4

Một cách tiếp cận khác là nếu bạn đang cố xóa một mẫu cụ thể, bạn có thể chỉ cần gõ d/delimEnter.


2

Bạn có thể sử dụng quy trình nhập thông thường dcộng với chuyển động (như đã được giải thích trong các câu trả lời khác). Plugin EasyMotion, cung cấp các chuyển động mới mà bạn có thể sử dụng có thể giải quyết vấn đề của bạn một cách nhanh chóng và dễ dàng.

Giả sử bạn muốn xóa từ vị trí con trỏ hiện tại đến cuối của bất kỳ từ nào trên màn hình, các phím chuyển động sẽ <Leader><Leader>egiống như echuyển động thông thường ). Sau đó nhập (các) chữ cái được tô sáng xuất hiện ở cuối từ được đề cập. Ngoài ra còn có một chuyển động dòng để bạn có thể xóa dòng hiện tại xuống dòng đang đề cập đến <Leader><Leader>j.

Tôi có <Leader>chìa khóa của tôi được đặt thành ,. Vì vậy, lệnh đầy đủ là d<Leader><Leader>e{chữ cái được tô sáng}.

Từ :help easymotion:

EasyMotion cung cấp một cách đơn giản hơn nhiều để sử dụng một số chuyển động trong vim. Nó loại <number>bỏ <number>w hoặc <number>f {char}bằng cách làm nổi bật tất cả các lựa chọn có thể và cho phép bạn nhấn một phím để nhảy trực tiếp đến mục tiêu.

Khi một trong các chuyển động có sẵn được kích hoạt, tất cả văn bản hiển thị trước hoặc sau con trỏ bị mờ dần và các mục tiêu chuyển động được tô sáng.

Biên tập:

Kho lưu trữ github của EasyMotion có tại https://github.com/Lokaltog/vim-easymotion .

Reddit này về những người sử dụng Easymotion có thể là một niềm vui đọc.


1

Có một giải pháp đơn giản có thể giải quyết vấn đề của bạn.

Đặt con trỏ ở đầu khối văn bản bạn muốn xóa và thực hiện d50gg.

Điều này sẽ xóa tất cả các dòng từ vị trí hiện tại của bạn đến dòng thứ 50 của văn bản của bạn.

eq: nếu con trỏ của bạn ở dòng 46 , d50ggsẽ xóa 4 dòng.


1
Tôi khuyên bạn nên sử dụng Gthay vì gg vì nó cũng hoạt động trong vi và tất nhiên :set numberluôn hữu ích cho việc tìm số dòng mà bạn muốn đến là dòng nào.
Random832

Toàn bộ vấn đề của câu hỏi này là bạn không biết bạn muốn xóa bao nhiêu dòng.
200_success 20/2/2015

200_success, bạn không cần phải biết có bao nhiêu dòng bạn muốn xóa với câu trả lời tôi đã đăng. Tất cả bạn phải biết là "mà dòng nào bạn muốn loại bỏ"
Geee

1

Sử dụng chế độ trực quan với đánh dấu đường.

  1. Đặt con trỏ của bạn trên dòng trên cùng của khối văn bản / mã để xóa
  2. Nhấn Shift+v
  3. Di chuyển con trỏ của bạn xuống dưới cùng của khối văn bản / mã để xóa
  4. nhấn d

Tôi thích phương pháp này để xóa các khối mã bởi vì nó xóa toàn bộ các dòng so với việc sử dụng chế độ trực quan trong đó bạn phải định vị con trỏ ở cột bên phải để xóa những gì bạn muốn.


3
Về cơ bản, bạn lặp lại câu trả lời bằng @ 200_success.
Martin Schröder

1

Tôi không muốn có relativenumbermọi lúc, vì vậy tôi đã định cấu hình Vim của mình để chỉ bật khi tôi ở Chế độ trực quan:

" Entering Visual mode
nnoremap <silent>     v :set relativenumber cursorcolumn<CR>v
nnoremap <silent> <C-q> :set relativenumber cursorcolumn<CR><C-q>
nnoremap <silent>    gv :set relativenumber cursorcolumn<CR>gv
nnoremap <silent>     V :set relativenumber<CR>V

" When finished
augroup ClearCursorColumnAndLine
    autocmd!
    autocmd CursorHold * set norelativenumber nocursorcolumn nocursorline
augroup END

Điều này làm cho nhiệm vụ của bạn dễ dàng:

V49jd

bởi vì sau khi đánh Vbạn có thể thấy vạch đích cách bao xa.

Điều này có thể gây khó chịu trong thời gian dài (văn bản dịch chuyển sang phải và trái khi bật / tắt tính năng tương đối), nhưng cho đến nay tôi khá thích nó.


1
Tôi nghĩ bạn sử dụng v<Esc>d50j?
Martin Tournoij

Cảm ơn, tôi thực sự đã viết nó không chính xác. Trên thực tế tôi bắt đầu với Vnếu tôi biết tôi sẽ thực hiện một hoạt động theo dòng, và sau đó tôi có thể rời khỏi dcho đến cuối cùng, để tự tin hơn.
joeytwiddle

Câu trả lời của tôi dường như là một xấp xỉ của người nghèo về plugin số.vim được cung cấp trong một câu trả lời khác. ;-)
joeytwiddle

1

Điều gì làm việc tuyệt vời cho tôi với vi:

  1. :set number để xem số dòng cho đến khi tôi muốn xóa;

    +1289 idle 
    +1289 idle 
    +1290 # <- I want to delete until here
    +1291 if [[ ! -z "$SFIN" ]]
    
  2. Quay trở lại dòng nơi bắt đầu xóa

  3. Đã sử dụng xóa từ dòng hiện tại, trong chế độ bình thường> d1290G
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.