วิธีการรักษาขีดล่างเป็นส่วนหนึ่งของคำ?


34

ฉันใช้evilโหมดEmacs +

เมื่อฉันวางตำแหน่งเคอร์เซอร์บนe(ในสถานะปกติ) ในก้อนของข้อความเช่นabc_def_ghi, ciw(คำภายในการเปลี่ยนแปลง) การเปลี่ยนแปลงเพียงส่วนหนึ่งของสตริงในขณะที่กลุ่มจะเปลี่ยนทั้งหมดdefabc_def_ghi

ฉันevilจะบังคับให้ปฏิบัติกับขีดเส้นใต้ตามที่ Vim ทำ (เช่นเป็นส่วนหนึ่งของคำ) ได้อย่างไร?

คำตอบ:


26

วิธีแก้ปัญหาที่ง่ายที่สุด: ใช้ciWเพื่อเลือกคำที่คั่นด้วยช่องว่าง

ปัญหาที่ใหญ่กว่าจะทำอย่างไรกับค่าของ_ตัวละครในตารางไวยากรณ์ ปัญหาคือ_โดยค่าเริ่มต้นองค์ประกอบสัญลักษณ์ในตารางไวยากรณ์และคุณต้องการที่จะถือเป็นองค์ประกอบคำ

หากคุณใช้ emacs 24.4 คุณสามารถลองเปิดใช้งานsuperword-modeได้ ฉันไม่ได้ลองด้วยตัวเองดังนั้นไมล์สะสมของคุณอาจแตกต่างกันไป

อีกทางเลือกหนึ่งคือการปรับเปลี่ยนตารางไวยากรณ์ด้วยตัวเองและบอก Emacs ที่คุณต้องการให้มันปฏิบัติต่อ_ตัวละครในรูปแบบของคำเช่น:

(modify-syntax-entry ?_ "w")

หลังจากที่คุณทำอย่างนั้นciwทำงานได้ตามที่คุณต้องการให้ดังกล่าวว่าจะเลือกทั้งหมดมากกว่าแค่abc_def_ghidef

อย่างไรก็ตามการทำเช่นนี้อาจเกินความสามารถโดยเฉพาะอย่างยิ่งหากคุณต้องการ_ให้นับเป็นส่วนหนึ่งของคำสำหรับวัตถุข้อความ คุณสามารถให้คำแนะนำevil-inner-wordดังนี้:

(defadvice evil-inner-word (around underscore-as-word activate)
  (let ((table (copy-syntax-table (syntax-table))))
    (modify-syntax-entry ?_ "w" table)
    (with-syntax-table table
      ad-do-it)))

ตอนนี้_ยังคงเป็นองค์ประกอบที่เป็นสัญลักษณ์สำหรับทุกอย่างยกเว้นวัตถุข้อความคำภายในดังนั้นciwจะทำสิ่งที่คุณต้องการโดยไม่ต้องสัมผัสการทำงานของสิ่งอื่นใด

คุณสามารถอ่านเพิ่มเติมเกี่ยวกับการปรับเปลี่ยนตารางไวยากรณ์ในโหนด EmacsWiki


งานนี้มีเสน่ห์เหมือนกัน ที่จะปรับเปลี่ยนการเคลื่อนไหวทั้งหมด ( w, awฯลฯ ) คุณสามารถทำเช่นเดียวกันกับฟังก์ชั่นดังต่อไปนี้มากเกินไป: evil-forward-word-begin, evil-forward-word-end, evil-backward-word-begin, evil-backward-word-end, ,evil-a-word evil-inner-wordหมายเหตุ: คุณต้องเปลี่ยนunderscore-as-wordเป็นค่าที่ไม่ซ้ำกัน (โดยพล)
sitaktif

(modify-syntax-entry ?_ "w")ไม่ทำงานสำหรับฉันด้วยเหตุผลบางอย่าง การทำแบบโต้ตอบไม่ได้ผลเช่นกัน มีความคิดใดที่ทำให้ฉันสามารถแก้ไขข้อบกพร่องนี้ได้หรือ ฉันใช้ Spacemacs ในกรณีที่เกี่ยวข้อง
Helder S Ribeiro

1
นี่อธิบายถึงปัญหาของฉัน เห็นได้ชัดว่าคุณต้องอ้างถึงตารางไวยากรณ์เป้าหมายอย่างชัดเจน ในกรณีของฉันฉันใช้(modify-syntax-entry ?_ "w" rust-mode-syntax-table)แล้วก็ใช้งานได้
Helder S Ribeiro

ลักษณะพิเศษที่ไม่ได้ตั้งใจของการแก้ไขรายการไวยากรณ์คืออะไร
luntain

FTR: ไม่ได้ส่งผลกระทบต่อการเคลื่อนไหวในsuperword-mode evil-modeดังนั้นจึงไม่ใช่องค์ประกอบในการแก้ไขตารางไวยากรณ์
Hi-Angel

28

ตัวอย่างต่อไปนี้จะทำให้ Evil ปฏิบัติกับสัญลักษณ์ Emacs เป็นคำ

(with-eval-after-load 'evil
    (defalias #'forward-evil-word #'forward-evil-symbol)
    ;; make evil-search-word look for symbol rather than word boundaries
    (setq-default evil-symbol-word-search t))

สิ่งนี้มีข้อดีที่เปลี่ยนแปลงไปตามภาษา:

foo-bar

เป็นหนึ่งในสัญลักษณ์lisp-modeแต่สองสัญลักษณ์ (คั่นด้วย-) c-modeใน


14

spacemacs คำถามที่พบบ่อยข้อเสนอวิธีการแก้ปัญหาเฉพาะภาษาต่อไปนี้:

;; For python
(add-hook 'python-mode-hook #'(lambda () (modify-syntax-entry ?_ "w")))
;; For ruby
(add-hook 'ruby-mode-hook #'(lambda () (modify-syntax-entry ?_ "w")))
;; For Javascript
(add-hook 'js2-mode-hook #'(lambda () (modify-syntax-entry ?_ "w")))

มันยังทำงานใน emacs ปกติ ด้วยความชั่วร้ายที่จะทำงานร่วมกับคำสั่งคำทั้งหมดที่เกี่ยวข้องกับ ( w, e, *, #ฯลฯ )

โดยทั่วไปสิ่งนี้จะทำสำหรับโหมดหลักทั้งหมด:

(add-hook 'after-change-major-mode-hook
          (lambda ()
            (modify-syntax-entry ?_ "w")))

2
ใช้'prog-mode-hookตัวเลือกเพื่อครอบคลุมทุกภาษาหรือไม่
BallpointBen

2

แนะนำ Emacs 24 superword-modeซึ่งเป็นโหมดย่อยที่ใช้เครื่องหมายขีดล่างเป็นส่วนหนึ่งของคำ evil-modeเคารพการตั้งค่านี้

นี่คือเอกสาร:

(superword-mode &optional ARG)

สลับการเคลื่อนไหวและแก้ไข superword (โหมด Superword) ด้วยอาร์กิวเมนต์นำหน้าARGให้เปิดใช้งานโหมด Superword หากARGเป็นค่าบวกและปิดใช้งานเป็นอย่างอื่น หากถูกเรียกจาก Lisp ให้เปิดใช้งานโหมดหากARGไม่ได้ระบุหรือไม่มี

โหมด Superword เป็นโหมดย่อยของบัฟเฟอร์ การเปิดใช้งานจะเปลี่ยนคำจำกัดความของคำว่าอักขระสัญลักษณ์จะถือว่าเป็นส่วนหนึ่งของคำ: เช่น, ในsuperword-mode, "this_is_a_symbol"นับเป็นหนึ่งคำ


หากคุณกำลังใช้evil-modeงานขออภัยมีข้อผิดพลาดเมื่อsuperword-modeเปิดใช้งาน มันทำให้เกิดพฤติกรรมที่ผิดปกติบางอย่างเมื่อevil-forward-word-beginมีการเรียก: github.com/emacs-evil/evil/issues/721
modulitos

0

ฉันชอบพฤติกรรมนี้มากเพราะฉันอาจต้องการแก้ไขส่วนหนึ่งของคำศัพท์และรักษาส่วนอื่นไว้ให้เหมือนเดิม ถ้าผมต้องการที่จะไปมากกว่าทั้งคำฉันมักจะสามารถใช้E, WหรือBที่สายพันธุ์ที่เป็นตัวพิมพ์ใหญ่ นี่ทำให้ฉันควบคุมได้ละเอียดยิ่งขึ้น

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