พื้นฐานของเคอร์เซอร์หลายตัว


55

ฉันเพิ่งเรียนรู้เกี่ยวกับ multiple-cursorsและดูเหมือนว่าแพคเกจที่มีประโยชน์มาก ฉันอ่านเอกสารเกี่ยวกับrepo ดั้งเดิมแต่คำสั่งยังดูไม่ชัดเจนสำหรับฉัน

จากนั้นผมก็ดูวิดีโอใน Emacs Rocks !, และวิดีโอที่ดีมาก แต่ส่วนใหญ่เน้นสิ่งที่multiple-cursorsมีความสามารถในการทำมากกว่าวิธีการที่จะทำมัน

มี walk-throughs, tutorials หรือตัวอย่างที่แสดงการทำงานขั้นพื้นฐานที่สุดหรือไม่?


4
ฉันสามารถเริ่มทำงานmultiple-cursorsได้อย่างรวดเร็วเพียงแค่อ่านไฟล์ README mc/mark-next-like-thisคำแนะนำของฉันคือการเพียงแค่เรียนรู้ ลองใช้และทำความคุ้นเคยกับสิ่งที่ทำ จากนั้นกลับไปที่ README ทุกครั้งที่คุณมีคำถามที่เริ่มต้นด้วย "ฉันสงสัยว่าเคอร์เซอร์หลายตัวสามารถทำได้ ... " ทั้งหมดที่กล่าวมาฉันคิดว่าเป็นการแนะนำขั้นพื้นฐานมากกว่า Emacs Rocks! วิดีโอจะเป็นประโยชน์สำหรับผู้เริ่มต้น
nispio

เห็นด้วยอย่างสิ้นเชิง! ไม่ชัดเจนอย่างแน่นอนวิธีการใช้งาน ฉันเพิ่งมาส์กบรรทัดแล้วทำ mc / edit-lines กับ KBD ที่ถูกผูกไว้ (ไม่ผ่าน Mx ตามที่ระบุไว้ใน Github) จากนั้นฉันเห็นเคอร์เซอร์หลายตัว แต่พวกเขาก็หายไปหลังจากป้อนข้อความใด ๆ
Dima Fomin

คำตอบ:


19

นอกเหนือจากการใช้ @bastibe อธิบายแล้วฉันใช้เคอร์เซอร์หลายตัวเพื่อเพิ่มหรือลบข้อความจากจุดเริ่มต้น / สิ้นสุดของกลุ่มบรรทัด:

  1. เลื่อนจุดไปยังจุดเริ่มต้นหรือจุดสิ้นสุดของพื้นที่ที่สนใจ
  2. โทรset-rectangular-region-anchor(ผูกกับกุญแจที่คุณชอบฉันคิดว่าคำแนะนำจาก Magnars คือH-spaceถ้าคุณมีไฮเปอร์คีย์)
  3. เลื่อนจุดไปข้างหน้าหรือข้างหลังตามบรรทัด ( C-nและC-p) จนกว่าคุณจะมีเคอร์เซอร์บนทุกบรรทัดที่คุณต้องการแก้ไข
  4. แทรกหรือลบข้อความตามต้องการเลื่อนไปที่ท้ายบรรทัด ( C-e) เพื่อทำการเปลี่ยนแปลง

คุณสามารถใช้forward-word, forward sentenceฯลฯ ที่จะย้ายกลับมาตามเส้นซึ่งจะช่วยให้คุณสามารถแก้ไขคำที่สี่ในแต่ละบรรทัดแม้ว่าข้อความในแต่ละบรรทัดที่ไม่เหมือนกัน

ตัวอย่างเช่นฉันทำงานประเภทนี้ตลอดเวลา:

  • C-u M-!ls / test-dat / pp5 / * fsaRETURN

    สิ่งนี้จะแทรกเนื้อหาของไดเร็กทอรี pp5 ลงในบัฟเฟอร์ ฉันวางจุด!เริ่มต้นของรายชื่อ:

!/test-dat/pp5/ONAB-6-5_Frag#89.fsa
/test-dat/pp5/QCJB-22-5_Frag#90.fsa
/test-dat/pp5/ONGL-1-5_Frag#102.fsa
/test-dat/pp5/ONGL-1-5_Frag#78.fsa
  • เพิ่มเคอร์เซอร์ให้กับทุกบรรทัดด้วยH-space, C-nx 4
  • ทำซ้ำแต่ละบรรทัดด้วย C-k C-y space C-y C-a

!/test-dat/pp5/ONAB-6-5_Frag#89.fsa /test-dat/pp5/ONAB-6-5_Frag#89.fsa
!/test-dat/pp5/QCJB-22-5_Frag#90.fsa /test-dat/pp5/QCJB-22-5_Frag#90.fsa
!/test-dat/pp5/ONGL-1-5_Frag#102.fsa /test-dat/pp5/ONGL-1-5_Frag#102.fsa
!/test-dat/pp5/ONGL-1-5_Frag#78.fsa /test-dat/pp5/ONGL-1-5_Frag#78.fsa
  • ตัดส่วนแรกให้เป็นชื่อตัวแปรด้วยM-dx 3 C-d C-fx3 M-dx3 <-

ONAB-6-5 <-! /test-dat/pp5/ONAB-6-5_Frag#89.fsa
QCJB-22-5 <-! /test-dat/pp5/QCJB-22-5_Frag#90.fsa
ONGL-1-5 <-! /test-dat/pp5/ONGL-1-5_Frag#102.fsa
ONGL-1-5 <-! /test-dat/pp5/ONGL-1-5_Frag#78.fsa
  • จากนั้นตัดชื่อไฟล์จริงในฟังก์ชันเพื่อโหลด: read.file ( C-d" C-e")RETURN

ONAB-6-5 <- read.file("/test-dat/pp5/ONAB-6-5_Frag#89.fsa")
QCJB-22-5 <- read.file("/test-dat/pp5/QCJB-22-5_Frag#90.fsa")
ONGL-1-5 <- read.file("/test-dat/pp5/ONGL-1-5_Frag#102.fsa")
ONGL-1-5 <- read.file("/test-dat/pp5/ONGL-1-5_Frag#78.fsa")

และ voila คุณได้แปลงรายชื่อไฟล์เป็นรหัสเพื่ออ่านรายชื่อนั้น มันยากที่จะอธิบายมากกว่าทำจริง!


3
หากคุณทำสิ่งเดียวกันนี้บ่อยครั้งคุณสามารถปิดมันลงในแมโครแป้นพิมพ์ได้ มาโครคีย์บอร์ดและmultiple-cursorsสามารถสร้างการผสมผสานที่ทรงพลังอย่างแท้จริง
nispio

@nispio เห็นด้วย! บางครั้งฉันทำซ้ำกระบวนการเดียวกันและแมโครจะมีประโยชน์ แม้ว่าบ่อยครั้งมีความแตกต่างเล็กน้อยในระหว่างกระบวนการทำงานที่ต้องมีการเปลี่ยนแปลงเล็กน้อยซึ่งจะทำให้ 'หยุด' แมโคร
ไทเลอร์

1
คุณสามารถอธิบายตำแหน่งที่คุณต้องการให้เคอร์เซอร์ข้ามไปใช้งาน regexp ได้อย่างแม่นยำ ในกรณีดังกล่าวการใช้งานphi-searchอาจแข็งแกร่งกว่าการนำทางด้วยคำสั่งเช่นM-f (x3)
nispio

@ แน่นอนว่ามันขึ้นอยู่กับสถานการณ์ ด้วยชื่อที่มีโครงสร้างอย่างต่อเนื่องทำให้ง่ายต่อการย้ายคำ ฉันไม่ได้ใช้การค้นหาในหลายเคอร์เซอร์เนื่องจากคำสั่งการค้นหา emacs ในตัวนั้นเปราะบางด้วย mc ฉันไม่รู้เรื่องphi-searchนี้ดูดีมาก!
Tyler

22

โดยทั่วไปฉันมีสองกรณีการใช้งานบ่อยสำหรับmultiple-cursors:

  • แทนที่สตริงบางส่วน ทำเครื่องหมายอินสแตนซ์หนึ่งของสตริงจากนั้นใช้mc/mark-next-like-thisและmc/mark-previous-like-thisเพื่อทำเครื่องหมายอินสแตนซ์เพิ่มเติมของมัน จากนั้นฉันจะกดC-wเพื่อลบทุกอินสแตนซ์ทันทีและเขียนสตริงใหม่แทน ฉันใช้สิ่งนี้มักจะเปลี่ยนชื่อตัวแปรในรหัส
  • แก้ไขหลายสถานที่พร้อมกัน ทำเครื่องหมายว่าหลาย ๆ สตริงของสตริงเหมือนก่อน แต่ยกเลิกการเลือก (แต่ไม่ใช่เคอร์เซอร์) ทันทีที่ใช้C-gหรือวางเครื่องหมายและจุดในคอลัมน์เดียวกันของบรรทัดที่แตกต่างกันและใช้mc/edit-linesเพื่อให้ได้หนึ่งเคอร์เซอร์ต่อบรรทัด ตอนนี้คุณสามารถใช้คำสั่งแก้ไขปกติที่ทำงานกับเคอร์เซอร์เหล่านี้ทุกอัน

expand-regionกรณีใช้งานครั้งแรกเป็นประโยชน์อย่างยิ่งกับ ฉันได้er/expand-regionผูกไว้กับC-jและmc/mark-next-like-thisและmc/mark-previous-like-thisไปและC-> C-<ด้วยสิ่งนี้ฉันสามารถเลือกจุดที่เปิดอยู่ได้อย่างง่ายดายและทำเครื่องหมายการเกิดขึ้นครั้งต่อไป / ก่อนหน้าของคำนั้นทันที

กรณีการใช้งานที่สองแทนที่มาโครการใช้งานส่วนใหญ่สำหรับฉัน แทนที่จะบันทึกมาโครจากนั้นนำไปใช้ในหลาย ๆ แห่งฉันจะวางเคอร์เซอร์ไว้ที่ทุกที่และทำการดำเนินการในทุกที่ในคราวเดียว


ขอบคุณ @bastibe การผูกใด ๆ ที่คุณหรือmultiple-cursors แนะนำเช่นmark-next-like-this& mark-previous-like-this?
Amelio Vazquez-Reina

@ user815423426 ตามที่ระบุไว้ในโพสต์ที่ผมใช้C->และC-<สำหรับและmark-next-like-this mark-previous-like-this
bastibe

ทำไมไม่ใช้มาตรฐาน M-% เพื่อค้นหาและแทนที่ ?
Dima Fomin

6

multiple-cursorsฉันต้องการที่จะเพิ่มความพิเศษบางอย่างที่ผมบางครั้งใช้กับ

ฉันพบว่าสิ่งต่อไปนี้มีประโยชน์:

IY-go-to-ถ่าน

บางครั้งคุณพบว่าตัวเองต้องการย้ายไปยังตัวถัดไป#หรือตัวถัดไป,หรือตัวคั่นบางตัว สิ่งนี้มีประโยชน์อย่างยิ่งเมื่อคุณต้องการเลื่อนจำนวนคำที่แตกต่างกันสำหรับแต่ละเคอร์เซอร์ มันมีฟังก์ชั่นiy-go-to-charและiy-go-to-char-backwardซึ่งคุณสามารถผูกและใช้งานได้ดี

ขยายภูมิภาค

สิ่งนี้มีประโยชน์มากสำหรับเหตุผลที่คล้ายกันiyเมื่อคุณมีเส้นที่แตกต่างกันเล็กน้อยในแต่ละเคอร์เซอร์และคุณอาจต้องการเลือกสตริงที่ยกมาใต้จุดหรือคล้ายกัน

สิ่งที่กำหนดเอง

สิ่งเหล่านี้เป็นสิ่งที่เพิ่งเกิดขึ้นในการตั้งค่าของฉัน แต่ฉันพบว่ามีประโยชน์ อาจไม่ได้เขียนโดยฉัน

ให้ใส่
ฉันได้รับอันนี้จาก Magnars เพื่อตอบสนองต่อคำขอวางสตริงที่แตกต่างกันภายใต้เคอร์เซอร์ รหัสนั้นง่าย แต่ผูกพันกับบางสิ่งและการใช้เคอร์เซอร์หลาย ๆ ตัวเป็นวิธีที่สะดวกในการแทรกสิ่งต่าง ๆ เล็กน้อยในแต่ละสถานที่

(defun prompt-for-insert ()
  (interactive)
  (insert (read-string "Insert: ")))

หมายเลขเพิ่มที่จุด
นี่อาจมาจาก SO หรือ emacswiki ไม่แน่ใจว่าอันไหน มันค่อนข้างมีประโยชน์ในตัวมันเองและเมื่อใช้ร่วมกับmc/insert-numbers

(defun my-increment-number-decimal (&optional arg)
  "Increment the number forward from point by 'arg'."
  (interactive "p*")
  (save-excursion
    (save-match-data
      (let (inc-by field-width answer)
        (setq inc-by (if arg arg 1))
        (skip-chars-backward "0123456789")
        (when (re-search-forward "[0-9]+" nil t)
          (setq field-width (- (match-end 0) (match-beginning 0)))
          (setq answer (+ (string-to-number (match-string 0) 10) inc-by))
          (when (< answer 0)
            (setq answer (+ (expt 10 field-width) answer)))
          (replace-match (format (concat "%0" (int-to-string field-width) "d")
                                 answer)))))))

eval-and-replace
นี่คือสุดยอดพลังและเปิดใช้งานบิต 'n' บิตที่มีประโยชน์จริงๆ มันประเมินสิ่งที่ sexp อยู่หลังเคอร์เซอร์และแทรกผลลัพธ์ของการประเมิน
รวมเข้ากับmultiple-cursors-numbersเช่นใส่พลังของสองหรือชุดที่0 1 2 0 1 2 0 1 2ข้ามแต่ละบรรทัดหรือบางสิ่งบางอย่าง (ฉันทำทั้งสองอย่างนี้เป็นประโยชน์) หรือใช้กับs.elเพื่อเขียน java config ที่น่าเบื่อกับสิ่งที่เป็นค่าเริ่มต้น คุณเขียนกันออกCONFIG_VALUE_VARIABLEแล้วเปลี่ยนที่เป็นโดยการเรียกใช้CONFIG_VALUE_VARIABLE = "configValueVariable"s-camel-case

(defun eval-and-replace ()
  (interactive)
  (let ((value (eval (preceding-sexp))))
    (kill-sexp -1)
    (insert (format "%s" value))))

iy-go-to-char มีประโยชน์อย่างยิ่ง สิ่งที่ฉันกำลังมองหา
เฮ็น Hartmann

1
  1. ไปที่จุดสิ้นสุด * ของสิ่งที่คุณต้องการเลือก
  2. กดC-S-bหรือM-S-bเพื่อเลือกข้างหลังจนกว่าคุณจะได้รับส่วนที่เลือก คุณสามารถใช้ลูกศรซ้ายเลื่อนได้เช่นกัน
  3. จากนั้นกดC->(กด Shift หากปุ่ม>อยู่ด้านบนของแป้นคีย์บอร์ด) จนกว่าคุณจะเลือกมากกว่าหนึ่งรายการ

* สิ่งสำคัญคือต้องเลือกถอยหลังหรือการเลือกแรกจะวางเคอร์เซอร์ในตำแหน่งที่ไม่ถูกต้อง

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