ปฏิบัติต่อสัญลักษณ์เป็นคำในโหมด prog


12

มีคำสั่งจำนวนมากใน Emacs ที่ใช้กับ "คำ" ตัวอย่างเช่นforward-word, kill-word, upcase-word, mark-word, transpose-wordsฯลฯ ความหมายของ "คำว่า" ดูเหมือนว่าจะแตกต่างกันเล็กน้อยระหว่างคำสั่ง ตัวอย่างเช่นforward-wordจะหยุดที่ขีดเส้นใต้ภายในคำ (เช่นfoo_bar) แต่mark-wordจะไม่หยุดที่ขีดล่าง

เป็นไปได้หรือไม่ที่จะเปลี่ยนคำจำกัดความของ "คำว่า" เมื่อฉันอยู่ในโหมด prog เพื่อที่ Emacs จะใช้ขอบเขตคำที่เหมาะสมสำหรับไวยากรณ์ของภาษาปัจจุบันหรือไม่

เมื่อฉันอยู่ในc-modeฉันต้องการforward-wordข้ามขีดล่างและเมื่อฉันอยู่ในlisp-modeฉันต้องการforward-wordข้ามทั้งยัติภังค์และขีดล่าง ฯลฯ

คำตอบ:


4

Emacs ควรใช้ " ขอบเขตคำที่เหมาะสมสำหรับไวยากรณ์ของภาษาปัจจุบัน " หากไม่เป็นเช่นนั้นไฟล์บั๊กสำหรับโหมดหลักสำหรับภาษานั้น

แต่บางทีคุณอาจไม่ได้หมายถึงจริงๆคำ บางทีคุณอาจหมายถึงสัญลักษณ์สัญลักษณ์ไม่ใช่ไวยากรณ์คำ Emacs แยกความแตกต่างทั้งสองอย่าง

สำหรับไวยากรณ์สัญลักษณ์ใช้คำสั่งสัญลักษณ์ไม่ใช่คำสั่งคำ: forward-symbolฯลฯจากคำอธิบายของคุณนี่คือสิ่งที่คุณต้องการ

หากคุณรู้สึกว่าคุณต้องการใช้ฟังก์ชั่น word บนสัญลักษณ์คุณสามารถเปลี่ยนหมวดหมู่ไวยากรณ์ของตัวละครเฉพาะ ให้มีรูปแบบ word-constituent syntax แทน symbol-constituent syntax แต่โดยทั่วไปนี่ไม่ใช่สิ่งที่คุณต้องการทำและคุณไม่จำเป็นต้องทำ

ดูคู่มือ Elisp สำหรับข้อมูลเกี่ยวกับไวยากรณ์ของอักขระ และดูคู่มือ Emacs และคู่มือ Elisp สำหรับคำสั่งและฟังก์ชั่นอื่น ๆ ที่ทำงานกับสัญลักษณ์ (ไม่ใช่สัญลักษณ์ Lisp แต่ข้อความที่มีไวยากรณ์สัญลักษณ์ในภาษาใด ๆ )

และโปรดทราบว่าการดำเนินการกับเซ็กส์นั้นมักมีประโยชน์สำหรับการแสดงสัญลักษณ์: C-M-f( forward-sexp), C-M-t( transpose-sexps), ฯลฯ


C-M-fถูกผูกไว้forward-sexpและประพฤติตนไม่เหมือนสิ่งที่คุณอธิบาย คุณพูดถูกว่าสิ่งที่ฉันต้องการคือการนำทางด้วยสัญลักษณ์ แต่ฉันไม่เห็นตัวเลือกนั้น
nispio

@nispio forward sexpเป็นforward-symbolส่วนใหญ่ส่วนใหญ่ด้วยความเก่งกาจที่เพิ่มขึ้นของการจัดฟันที่ตรงกัน คุณควรให้โอกาส
Malabarba

@Malabarba ผมเห็นด้วยอย่างยิ่งว่าจะใกล้เคียงกับของforward-sexp forward-symbolสำหรับผู้เริ่มต้นคุณสามารถกระโดดข้ามฟังก์ชั่นทั้งหมดได้อย่างสับสนและเชื่อมโยงคุณหลายร้อยบรรทัดจากจุดเริ่มต้น นอกจากนี้ยังกระโดดข้ามรายการอาร์กิวเมนต์ ฯลฯ และลองนี้: กำหนดรหัสเสียงกระเพื่อมต่อไปนี้(global-set-key [remap list-buffers] 'ibuffer)วางเคอร์เซอร์ของคุณในช่วงกลางของคำremapและเรียกใช้forward-sexpไม่กี่ครั้ง มันก่อให้เกิดข้อผิดพลาด]เมื่อถึงปิด ไม่เป็นไรขอบคุณ.
nispio

@nispio ฉันมักจะใช้การรวมกันของ sexp และการนำทางคำ ด้วยวิธีนี้ฉันสามารถหลีกเลี่ยงปัญหาเหล่านี้ได้ในขณะที่มีความสามารถรอบด้านทั้งสอง แต่มันเป็นเรื่องของการตั้งค่า ;-) ถ้าคุณรู้ว่าคุณจะไม่พลาดนำทางคำsuperword-modeอาจจะเป็นผู้ชายของคุณ
Malabarba

ขออภัยฉันไม่ควรแนะนำC-M-fและC-M-tดำเนินการกับสัญลักษณ์ ฉันจะแก้ไขเพื่อแก้ไขการแสดงผลนั้น แต่คุณสามารถผูกติดforward-symbolกับคีย์ใด ๆ ที่คุณชอบได้หากคุณพบว่ามันมีประโยชน์เป็นพิเศษ ไม่มีtranspose-symbolsแต่คุณสามารถเขียนได้อีกครั้งถ้าคุณคิดว่ามันมีประโยชน์
ดึง

11

ลองดูที่และsuperword-mode subword-modeขีดถือว่า Superword เป็นส่วนหนึ่งของคำแทนเขตแดนดังนั้นจะถือว่าเป็นคำเดียวfoo_bar
Subword ทำหน้าที่ตรงกันข้าม แต่สำหรับ camelCase ดังนั้นfooBarถือว่าเป็นสองคำแทนที่จะเป็นหนึ่งคำ

มันเสียงเหมือนพฤติกรรมที่คุณต้องการสำหรับการใช้งานcc-modesuperword-mode

(add-hook 'c-mode-common-hook 'superword-mode)

ฉันขอแนะนำให้อ่านมากกว่าแหล่งที่มาสำหรับsubword-modeแม้ว่าทั้งสองโหมดจะไม่ทำสิ่งที่คุณต้องการพวกเขาควรจะแสดงวิธีการเปลี่ยนพฤติกรรมการตรวจจับคำ

การอภิปรายอีกต่อไปในemacsreduxและergomacs


เป็นไปได้ไหมที่จะทำให้การsuperword-modeเล่นเป็นไปด้วยดีparedit? ตัวอย่างเช่นparedit-forward-kill-wordไม่ลบทั้งคำ (ที่มีขีดล่าง) เมื่อsuperword-modeเปิดใช้งาน
Renan Ranelli

มันเปลี่ยนนิยามของคำและpareditเคารพมันดังนั้นฉันคิดว่ามันกำลังทำในสิ่งที่ถูกถาม
dgtized

สิ่งที่เป็นที่ paredit ไม่เคารพ ไม่ได้ฆ่าคำเดียวกันที่กำหนดโดยparedit-forward-kill-word superword-mode
Renan Ranelli

โอ้ฉันอ่านผิด อืมมม ลองดูparedit-forward-kill-wordและดูเหมือนว่ามันกำลังทำอยู่ ดังนั้นอาจจะสามารถสลับออกได้ แต่อาจไม่
dgtized

3

หากฉันเข้าใจคำถามของคุณคุณสามารถแก้ไขตารางไวยากรณ์ภาษาเช่นสำหรับ c ++:

(modify-syntax-entry ?_ "w" c++-mode-syntax-table)

M-x apropos จากนั้นค้นหาตารางไวยากรณ์ควรช่วยคุณเช่นกัน

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