Làm cách nào để xóa dòng hiện tại trong Emacs?


122

Emacs tương đương với vi's là ddgì? Tôi muốn xóa dòng hiện tại. Đã thử CTRL+ knhưng nó chỉ xóa khỏi vị trí hiện tại.

Câu trả lời:


212
C-a # Go to beginning of line
C-k # Kill line from current point

Ngoài ra còn có

C-S-backspace   # Ctrl-Shift-Backspace

mà gọi M-x kill-whole-line.

Nếu bạn muốn thiết lập một ràng buộc khóa chung khác, bạn phải đặt nó vào ~ / .emacs:

(global-set-key "\C-cd" 'kill-whole-line)     # Sets `C-c d` to `M-x kill-whole-line`

Nếu bạn muốn xóa một số dòng toàn bộ, bạn có thể đặt trước lệnh bằng một số:

C-u 5 C-S-backspace    # deletes 5 whole lines
M-5 C-S-backspace      # deletes 5 whole lines

C-u C-S-backspace      # delete 4 whole lines. C-u without a number defaults to 4

C-u -5 C-S-backspace   # deletes previous 5 whole lines
M--5 C-S-backspace     # deletes previous 5 whole lines

Đôi khi tôi cũng thấy C-x zhữu ích:

C-S-backspace         # delete 1 whole line
C-x z                 # repeat last command
z                     # repeat last command again. 
                      # Press z as many times as you wish. 
                      # Any other key acts normally, and ends the repeat command.

Những công việc này. Có cách nào để làm điều này bằng cách sử dụng một lệnh không? Tôi có phải tạo ràng buộc khóa tùy chỉnh để thực hiện việc này không?
Manoj Govindan

14
Không biết C-x z, điều đó thực sự tuyệt. Và câu trả lời tốt đẹp và chính xác btw.
slu

2
Ngoài ra còn C-k C-kcó loại hoạt động giống như d$ S-jtrong vim, nhưng điều này có thể xóa các dòng chuyển tiếp khá độc đáo.
Theo Belaire

Tại sao không có một không gian trong C-cd?
Elliot Gorokhovsky

@ RenéG: Không gian là tùy chọn.
unutbu

11

Trong trường hợp bạn không muốn ngắt dòng (sẽ đưa nó vào khay nhớ tạm của hệ điều hành và hủy vòng lặp) nhưng chỉ cần xóa nó:

(defun delete-current-line ()
  "Delete (not kill) the current line."
  (interactive)
  (save-excursion
    (delete-region
     (progn (forward-visible-line 0) (point))
     (progn (forward-visible-line 1) (point)))))

3

Một phương pháp khác để xóa dòng mà không đặt nó vào vòng kết thúc:

(defun delete-current-line ()
  "Deletes the current line"
  (interactive)
  (delete-region
   (line-beginning-position)
   (line-end-position)))

Điều này sẽ để lại điểm ở đầu dòng trống. Để loại bỏ điều này, bạn có thể muốn thêm một cái gì đó giống như (delete-blank-lines)vào cuối hàm, như trong ví dụ này, có lẽ ít trực quan hơn một chút:

(defun delete-current-line ()
 "Deletes the current line"
 (interactive)
 (forward-line 0)
 (delete-char (- (line-end-position) (point)))
 (delete-blank-lines))

1

Cách nhanh nhất / đơn giản nhất để xóa (xóa) một dòng đầy đủ, từ bất kỳ điểm nào trên dòng, mà không cần chọn bất kỳ thứ gì, là:

C-w  ; kill-region

Nó rất linh hoạt trong việc xóa bất cứ thứ gì được chọn hoặc một dòng theo mặc định nếu không có gì được chọn.

Với câu hỏi, bạn có thể cũng quan tâm đến việc sao chép "yank" của Vim, yy(mặc dù theo cách nói của Emacs, "yank" là "đặt" của Vim, p). Đây là:

M-w  ; kill-ring-save

Đẹp và phù hợp, và khá dễ nhớ. Thậm chí hơi giống với Vim's i_CTRL-W.

Khi bạn đã đặt một thứ gì đó vào vòng cấm với một trong hai cách trên, bạn có thể muốn "giật" (dán) nó:

M-y  ; yank-pop

(Lưu ý rằng CS-backspace có thể không hoạt động trong Emacs đầu cuối.)


1

Thay vì có khóa riêng biệt để xóa dòng hoặc phải gọi đối số tiền tố. Bạn có thể sử dụng điểm mấu chốt-thông minh-kill-line sẽ "giết đến cuối dòng và giết cả dòng trong lần gọi tiếp theo". Nhưng nếu bạn muốn deletethay vì kill, bạn có thể sử dụng mã bên dưới.

Đối với hoạt động trỏ đến chuỗi (giết / xóa), tôi khuyên bạn nên sử dụng zop-to-char

(defun aza-delete-line ()
  "Delete from current position to end of line without pushing to `kill-ring'."
  (interactive)
  (delete-region (point) (line-end-position)))

(defun aza-delete-whole-line ()
  "Delete whole line without pushing to kill-ring."
  (interactive)
  (delete-region (line-beginning-position) (line-end-position)))

(defun crux-smart-delete-line ()
  "Kill to the end of the line and kill whole line on the next call."
  (interactive)
  (let ((orig-point (point)))
    (move-end-of-line 1)
    (if (= orig-point (point))
        (aza-delete-whole-line)
      (goto-char orig-point)
      (aza-delete-line))))

nguồn

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.