Dừng lại ở đầu một từ trên `Forward-word`


17

Tôi thường sử dụng nhiều cách gọi forward-wordtheo sau bởi một từ duy nhất backward-wordđể di chuyển điểm đến đầu của một từ trên một dòng. Tôi đoán rằng tôi chưa bao giờ quen với cách forward-wordkhác với vim wvà thậm chí sau nhiều năm sử dụng Emacs, tôi không thể quen với sự khác biệt.

Có chức năng nào tôi có thể sử dụng thay vì chức năng forward-wordđó không nhảy qua các từ mà chỉ dừng lại ở đầu từ? Có chiến lược nào khác để chuyển từ đầu của một từ khi di chuyển về phía trước mà không liên quan đến việc thực hiện nhiều lần forward-charkhông?


Bạn có thể (tại một số điểm) có thể quan tâm đến việc viết từ / đoạn tiến / lùi của riêng bạn và các hàm kill-word liên quan. Sau đây là ba liên kết đến một số chức năng tùy chỉnh mà tôi sử dụng hàng ngày - hành vi gần giống với các trình xử lý văn bản nhất định mà tôi đã sử dụng trong nhiều năm qua: stackoverflow.com/a/20456861/2112361 | stackoverflow.com/q/18675201/2112361 | superuser.com/a/685604/206164
luật

Câu trả lời:


24

Các miscgói (vận chuyển với emacs) có tích hợp chức năng forward-to-word, mà làm những gì tôi nghĩ rằng bạn muốn:

forward-to-word is an interactive compiled Lisp function in `misc.el'.

It is bound to M-f.

(forward-to-word ARG)

Move forward until encountering the beginning of a word.
With argument, do this that many times.

Để sử dụng nó, trước tiên hãy thêm (require 'misc)vào tập tin cấu hình của bạn.


Cảm ơn, điều này rất hữu ích. Thật không may, điều này không còn dừng lại ở phần cuối của một từ, mặc dù.
rekado

1
Đúng, nhưng vim cũng không w. Theo như tôi có thể thấy, có một ánh xạ vim-to-emacs gần như hoàn hảo: w= forward-to-word; e= forward-word; b= backward-word; ge= backward-to-word. Nhưng tôi không phải là người dùng vim chuyên gia, nên có lẽ tôi còn thiếu một chút tinh tế.
không dùng nữa

Heh, bạn thực sự đúng. Tôi đoán bất cứ khi nào tôi đang ở trong vim w, ebchỉ làm mờ đi và tôi chỉ di chuyển xung quanh. Kỳ dị. Tôi chắc chắn wdừng lại ở cả hai điểm! Vì vậy, tôi sẽ chấp nhận câu trả lời của bạn, vì nó hoàn toàn phù hợp với câu hỏi của tôi :)
rekado

4

Bạn có thể liên kết các chức năng dưới đây M-fvà liên kết ban đầu forward-wordvới M-F. Hàm này chỉ đơn giản là lấy argvà chuyển nó vào forward-wordhàm. Vì vậy, các đối số phổ quát sẽ hoạt động tốt như với hàm ban đầu.

(defun modi/forward-word-begin (arg)
  "Move forward a word and end up with the point being at the beginning of the
next word.  Move point forward ARG words (backward if ARG is negative).
If ARG is omitted or nil, move point forward one word."
  (interactive "p")
  (forward-word arg)
  (forward-word 1)
  (backward-word 1))

Lời cảnh báo mặc dù chức năng trên có thể không phải lúc nào cũng làm đúng ; nó phụ thuộc rất nhiều vào việc điểm đó đã bắt đầu từ hay chưa.


Đây là một cách khác để thực hiện ở trên, nơi ranh giới từ không theo bảng cú pháp mà hoàn toàn tách biệt khoảng trắng:

(defun modi/forward-word-begin (arg)
  "Move forward ARG (defaults to 1) number of words.
Here 'words' are defined as characters separated by whitespace."
  (interactive "p")
  (dotimes (_ arg)
    (forward-whitespace 1)))

Tín dụng đi đến @glucas cho ý tưởng này.


1

Sau một quá trình tìm kiếm dài và đau đớn cho các chức năng 'tiến / lùi' hoàn hảo, tôi đã tìm thấy những điều sau đây mà bây giờ tôi rất hạnh phúc:

(progn
  (defun boundary ()
    (and      (= (char-syntax (char-after))  ?w)
         (not (= (char-syntax (char-before)) ?w))))
  (defun my-forward-word ()
    (interactive) 
    (while (progn (forward-char)  (not (boundary)))))
  (defun my-backward-word ()
    (interactive) 
    (while (progn (backward-char) (not (boundary)))))
  (global-set-key [M-right] 'my-forward-word)
  (global-set-key [M-left]  'my-backward-word)
  )

0

Nếu bạn sẵn sàng sử dụng evil, wở trạng thái bình thường bị ràng buộc evil-forward-word-begin, đó là chức năng theo kiểu Vim mà bạn theo đuổi.


Tôi đã từng sử dụng evilmột thời gian dài trước đây, nhưng sau một thời gian tôi sử dụng god-modevà các ràng buộc Emacs thường xuyên thay thế.
rekado

0

Tôi thường sử dụng nhiều cách gọi từ chuyển tiếp theo sau là một từ lùi đơn để di chuyển điểm đến đầu của một từ trên một dòng.

Như bạn đã đề cập, mẹo là đi hai từ về phía trước, sau đó một từ lùi lại.

Sau đây nên thực hiện các mẹo và nên tôn trọng các chế độ khác như chế độ từ phụ.

(define-key global-map (kbd  "M-f")
  (lambda ()
    (interactive)
    (forward-word)
    (forward-word)
    (backward-word)))

Đây là phiên bản thô sơ của /emacs//a/4272/508 không bao gồm một số trường hợp, nhưng dễ hiểu hơ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.