หยุดที่จุดเริ่มต้นของคำว่า "ไปข้างหน้าคำ"


17

ฉันมักจะใช้การเรียกหลายครั้งforward-wordตามด้วยซิงเกิ้ลbackward-wordเพื่อย้ายจุดไปยังจุดเริ่มต้นของคำในบรรทัด ฉันเดาว่าฉันไม่เคยชินกับวิธีที่forward-wordแตกต่างจากเสียงเรียกเข้าwและแม้กระทั่งหลังจากใช้ Emacs มาหลายปีฉันก็ไม่ชินกับความแตกต่าง

มีฟังก์ชั่นที่ฉันสามารถใช้แทนforward-wordสิ่งที่ไม่ข้ามคำ แต่หยุดที่จุดเริ่มต้นของคำด้วยหรือไม่ มีกลยุทธ์อื่น ๆ ที่จะย้ายไปจุดเริ่มต้นของคำเมื่อจุดก้าวไปข้างหน้าที่ไม่เกี่ยวข้องกับการดำเนินการซ้ำแล้วซ้ำอีกforward-char?


คุณอาจสนใจเขียนคำล่วงหน้า / ถอยหลัง / ย่อหน้าและฟังก์ชั่น kill-word ที่เกี่ยวข้อง ต่อไปนี้เป็นลิงค์สามลิงค์ไปยังฟังก์ชั่นที่กำหนดเองที่ฉันใช้เป็นประจำทุกวันพฤติกรรมดังกล่าวมีลักษณะคล้ายกับโปรแกรมประมวลผลคำบางคำที่ฉันใช้ในช่วงหลายปีที่ผ่านมา: stackoverflow.com/a/20456861/2112489 | stackoverflow.com/q/18675201/2112489 | superuser.com/a/685604/206164
ฏหมาย

คำตอบ:


24

miscแพคเกจ (มาพร้อมกับ emacs) มีฟังก์ชั่นforward-to-wordซึ่งทำในสิ่งที่ผมคิดว่าที่คุณต้องการ:

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.

หากต้องการใช้งานให้เพิ่ม(require 'misc)ไฟล์ config ของคุณก่อน


ขอบคุณสิ่งนี้มีประโยชน์ แต่น่าเสียดายที่นี้ไม่ได้นอกจากนี้ยังหยุดอยู่ที่ท้ายของคำแม้ว่า
rekado

1
จริง wแต่ไม่ไม่เป็นกลุ่มของ เท่าที่ฉันเห็นมีการทำแผนที่ vim-to-emacs เกือบสมบูรณ์แบบ: w= forward-to-word; e= forward-word; b= backward-word; ge= backward-to-word. แต่ฉันไม่ใช่ผู้ใช้ที่เป็นผู้เชี่ยวชาญดังนั้นอาจจะมีความละเอียดอ่อนบางอย่างที่ฉันพลาดไป
เลิกใช้

เฮ้คุณจริงแล้วใช่ไหม ผมคิดว่าเมื่อใดก็ตามที่ผมอยู่ในกลุ่มw, eและbเพียงแค่เบลอออกไปและฉันเพิ่งย้ายไปรอบ ๆ แปลก. ฉันแน่ใจว่าwหยุดที่จุดทั้งสอง! ดังนั้นฉันจะยอมรับคำตอบของคุณเพราะมันตรงพอดีกับคำถามของฉัน :)
rekado

4

คุณสามารถผูกด้านล่างนี้ฟังก์ชั่นM-fและผูกเดิมเพื่อforward-word M-Fฟังก์ชั่นนี้ใช้เพียงargและส่งผ่านไปยังforward-wordฟังก์ชั่น ดังนั้นข้อโต้แย้งสากลจะทำงานได้ดีเช่นเดียวกับฟังก์ชั่นดั้งเดิม

(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))

คำเตือนว่าที่ฟังก์ชั่นดังกล่าวข้างต้นอาจจะไม่เสมอทำสิ่งที่ถูก ; มันขึ้นอยู่กับว่าจุดนั้นอยู่ที่จุดเริ่มต้นของคำหรือไม่


นี่เป็นอีกวิธีในการใช้งานด้านบนโดยที่ขอบเขตของคำไม่เป็นไปตามตารางไวยากรณ์ แต่เป็นการแยกช่องว่างอย่างเคร่งครัด:

(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)))

เครดิตไปที่@glucasสำหรับแนวคิดนี้


1

หลังจากการค้นหาที่ยาวนานและเจ็บปวดสำหรับฟังก์ชั่น 'ส่งต่อ / ถอยหลัง' ที่สมบูรณ์แบบฉันพบสิ่งต่อไปนี้ซึ่งตอนนี้ฉันมีความสุขมาก:

(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

หากคุณยินดีที่จะใช้evil, wในสภาวะปกติที่ถูกผูกไว้evil-forward-word-beginซึ่งเป็นฟังก์ชั่นที่เป็นกลุ่มสไตล์คุณหลังจาก


ฉันเคยใช้evilมานานแล้ว แต่เมื่อไม่นานมานี้ฉันใช้god-modeEmacs ปกติแทน
rekado

0

ฉันมักจะใช้การร้องขอหลายคำของ forward-word แล้วตามด้วย backward-word เดียวเพื่อย้ายจุดไปยังจุดเริ่มต้นของคำในบรรทัด

ในขณะที่คุณพูดถึงเคล็ดลับคือการไปข้างหน้าสองคำแล้วถอยหลังหนึ่งคำ

ต่อไปนี้ควรทำเคล็ดลับและควรเคารพโหมดอื่น ๆ เช่นโหมดย่อย

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

นี่เป็น/emacs//a/4272/508เวอร์ชันพื้นฐานซึ่งไม่ครอบคลุมในบางกรณี แต่ง่ายต่อการเข้าใจ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.