แมป Ctrl + A และ Ctrl + Shift + A ต่างกันอย่างไร?


92

ในเทอร์มินัลเราไม่สามารถแยกแยะCtrl+ AและCtrl+ Shift+ ได้Aเนื่องจากทั้งคู่ปล่อยรหัสคีย์เดียวกันดังนั้นฉันจึงเห็นว่าทำไม Vim ถึงทำไม่ได้ แต่ gVim ซึ่งเป็นแอปพลิเคชัน X สามารถแยกความแตกต่างCtrl+ AและCtrl+ Shift+ Aได้ มีวิธีใดบ้างที่จะทำแผนที่สองสิ่งนี้แตกต่างกัน?

สำหรับผู้เริ่มต้นฉันต้องการทำสิ่งต่อไปนี้: ให้ "วางจากคลิปบอร์ด" ทำงานเหมือนเทอร์มินัล Gnome ในขณะที่เก็บCtrl+ Vไปที่โหมดภาพ

:nmap <C-S-V> "+gP


3
@vivoconunxino ลิงก์นั้นไม่ได้ระบุถึงการเพิ่มตัวปรับเปลี่ยนการเปลี่ยนแปลงไปยัง ctrl-a
graywh

คำตอบ:


47

Gvim ไม่ทำเพราะ vim ไม่สามารถทำได้ (ภายใต้สถานการณ์ปกติ) ขออภัย แต่นั่นเป็นเพียงวิธีการ


อย่างไรก็ตาม ...

เทอร์มินัลบางตัว (เช่น xterm และ iterm2) สามารถกำหนดค่าให้ส่งลำดับการหลีกเลี่ยงโดยพลการสำหรับการรวมกันของคีย์

ตัวอย่างเช่นเพิ่มต่อไปนี้เพื่อ.Xresourcesสำหรับ xterm ส่งสำหรับ<Esc>[65;5u CtrlShiftAจากนั้นคุณสามารถ map <C-S-a>ว่าในกลุ่มที่จะ (65 คือค่า Unicode ทศนิยมสำหรับ shift-a และ 5 เป็นบิตสำหรับตัวปรับ ctrl u ในกรณีนี้ย่อมาจาก "unicode")

! .Xresources
XTerm*vt100.translations: #override Ctrl ~Meta Shift <Key>a: string(0x1b) string("[65;5u")

iTerm และ [u] rxvt ยังสามารถกำหนดค่าให้ทำสิ่งนี้ได้ (ไม่มีตัวอย่าง)

ข้อมูลเพิ่มเติม: http://www.leonerd.org.uk/hacks/fixterms/


การแมปหลายคีย์ให้ดูที่เอกสารนี้ : \nคีย์รายการเฉพาะกิจที่มี ใช้แบ็กสแลชเพื่อแบ่งบรรทัด เช่นในการแมป <kbd> CSB </kbd> และ <kbd> CSF </kbd> ให้ใช้สิ่งนี้:XTerm*vt100.translations: #override Ctrl ~Meta Shift <Key>a: string(0x1b) string("[65;5u") \n Ctrl ~Meta Shift <Key>b: string(0x1b) string("[66;5u") \n Ctrl ~Meta Shift <Key>f: string(0x1b) string("[70;5u")
cfi

เพื่อความสมบูรณ์อาจเพิ่มคำตอบว่าจะแมปสิ่งนี้ใน vi ได้อย่างไร? เช่นmap <ESC>[66;5u :echo "ctrl-shift-b received"<CR>เพื่อแมป ctrl-shift-b เพื่อพิมพ์ข้อความในบรรทัดสถานะ ใน AskUbuntu มีคำถามที่คล้ายกันและฉันได้สรุปสิ่งนี้แล้ว
cfi

สิ่งที่เราต้องการคือข้อกำหนดเทอร์มินัลใหม่! xterm-256color(ล่าสุด) ประสบกับข้อ จำกัด มากมาย
Jérôme Pouiller

@Jezz ข้อ จำกัด อยู่ที่ termcap เองไม่ใช่ไฟล์ termcap สำหรับxterm-256color.
graywh

@graywh แน่นอนว่าคุณสมบัติใหม่ของ termcap นั้นจำเป็น
Jérôme Pouiller

9

เป็นแหลมออกแล้วไม่มีวิธีที่จะทำแผนที่ที่แตกต่างจาก<C-S-A><C-A>

อย่างไรก็ตามการใช้เครื่องมือเช่นautokey(สำหรับ linux & windows) หรือautohotkey(สำหรับ windows) คุณสามารถทำการแมปใหม่<C-S-A>เพื่อส่งจังหวะคีย์อื่นสำหรับแอปพลิเคชันเฉพาะได้

เช่นในระบบของฉันฉันมีการตั้งค่านี้ในautokey:

$ cat ~/.config/autokey/data/gnome-terminal/ctrlshifta-gnome-terminal.py
#ctrl+shift+a sends '<S-F1>a'
keyboard.send_keys("<shift>+<f1>a") # Note that `f` in `f1` needs to be in lower case.

กำหนดคุณสมบัติเหล่านี้:

  1. แป้นพิมพ์ลัดเป็น ctrl+shift+a
  2. คลาสหน้าต่าง: gnome-terminal-server.Gnome-terminal

จากนั้นคุณ~/.vimrcสามารถสร้างแผนที่<S-F1>aเพื่อทำอะไรก็ได้ที่คุณต้องการ


หมายเหตุ:

  1. ฉันได้ใช้เป็นชนิดของคีย์ผู้นำสำหรับการตรวจสอบ<S-F1> <C-S>นี่เป็นเพราะเทอร์มินัลของฉันไม่ยอมรับคีย์<F13>- <F37>ฯลฯ หากแอปพลิเคชันของคุณรองรับgvimขอแนะนำให้ใช้คีย์เหล่านั้น( ฉันคิดว่า)
  2. ฉันส่วนใหญ่vimในgnome-terminal. ผมจึงใช้window class = gnome-terminal-server.Gnome-terminalเป็นตัวกรอง ปรับเปลี่ยนให้ใช้ได้ตามgvimต้องการ autokeyรองรับปุ่มสำหรับจับคุณสมบัติของหน้าต่างอื่น ๆ เช่นคลาส / หัวเรื่อง

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

1
พระเจ้าด่า autokey! ฉันทำทุกอย่างที่ทำได้ แต่ไม่สามารถติดตั้งบน Ubuntu 16.04 ได้
yukashima huksay

apt install autokey-gtkเหรอ?
anishsane

1
ก่อนติดตั้งซอฟต์แวร์เพิ่มเติมคุณอาจตรวจสอบว่าตัวจัดการหน้าต่างของคุณจัดการสิ่งนี้โดยตรงหรือไม่ ตัวอย่างเช่นใน i3 .config ของฉันมีสิ่งนี้: bindsym --release Control+Shift+h exec --no-startup-id xdotool key --clearmodifiers comma w m hซึ่งกด,wmhเมื่อฉันกด<C-S-h>แล้วกลุ่มก็รู้วิธีจัดการ,wmh
MatrixManAtYrService

^^ นี่ก็ดีเหมือนกัน อย่างไรก็ตามฉันต้องการ จำกัด การแปลคีย์เฉพาะ gnome-terminal หรือ gvim ไม่ใช่แอปอื่น ๆ แอปพลิเคชันอื่น ๆ ควรได้รับต่อ<C-S-H>เมื่อฉันกดปุ่มนั้น
anishsane


3

ขณะนี้ NeoVim นำเสนอฟังก์ชันนี้สำหรับทั้งเทอร์มินัลและไคลเอนต์ gui ดู: h nvim-features-new


3
ไม่มากเว้นแต่คุณจะเปิดใช้งานรหัส CSI ในเทอร์มินัลของคุณ ปุ่ม Ctrl-Shift สายพันธุ์ที่ Neovim ไม่สนับสนุนออกจากกล่องที่มีตัวละครส่วนใหญ่ที่ไม่สามารถพิมพ์ (ตัวอย่างที่แสดงไว้ที่neovim.org/doc/user/vim_diff.html#nvim-features-new ) อย่างไรก็ตามเมตาคอร์ด (รวมทั้ง<m-s-...>สายพันธุ์) ทำส่วนใหญ่ทำงานสมบูรณ์ออกจากกล่อง
Justin M. Keyes

เอกสารนั้นระบุว่าALT (|META|) chords always work (even in the |TUI|). Map |<M-| with any key: <M-1>, <M-BS>, <M-Del>, <M-Ins>, <M-/>, <M-\>, <M-Space>, <M-Enter>, etc. Case-sensitive: <M-a> and <M-A> are two different keycodes.มีเส้นแบ่งก่อนส่วน "พิจารณาตัวพิมพ์เล็กและใหญ่:" ทำให้ไม่ชัดเจน ขอบคุณสำหรับการแก้ไข @ JustinM.Keyes นอกจากนี้ vim 8.1 ดูเหมือนจะแยกความแตกต่างระหว่าง<M-a>และ<M-A>ด้วย
Adam Katz

@ justin-M-คีย์ส<c-s-l>มีความโดดเด่นอย่างสมบูรณ์แบบจาก<c-l>ในKonsoleโดยไม่ต้องยุ่งยากใด ๆ เพิ่มเติม
Slava

3

เนื่องจากวิธีการจัดการการป้อนข้อมูลแป้นพิมพ์ภายในจึงไม่สามารถทำได้โดยทั่วไปในปัจจุบันแม้ใน GVIM คีย์ผสมบางอย่างเช่นCtrl+ ที่ไม่ใช่ตัวอักษรไม่สามารถแมปได้และไม่สามารถแยกแยะCtrlตัวอักษรCtrl+ กับตัวอักษร+ Shift(เว้นแต่เทอร์มินัลของคุณจะส่งรหัสtermcap ที่แตกต่างออกไปซึ่งส่วนใหญ่ไม่ทำ) ในโหมดแทรกหรือบรรทัดคำสั่งให้ลองพิมพ์คีย์ผสม หากไม่มีอะไรเกิดขึ้น / ถูกแทรกคุณจะไม่สามารถใช้คีย์ผสมนั้นได้ นอกจากนี้ยังใช้กับ<Tab>/ <C-I>, <CR>/ <C-M>/ <Esc>/ <C-[>ฯลฯ (ข้อยกเว้นเท่านั้นคือ<BS>/ <C-H>.) นี่คือจุดเจ็บปวดที่ทราบและหัวข้อของการอภิปรายต่างๆใน vim_dev และ #vim IRC channel

บางคน (คนสำคัญที่สุด Paul LeoNerd Evans) ต้องการแก้ไขปัญหานั้น (แม้กระทั่งคอนโซล Vim ในเทอร์มินัลที่รองรับสิ่งนี้) และได้เสนอข้อเสนอต่างๆ cp http://groups.google.com/group/vim_dev/browse_thread/thread/626e83fa4588b32a/bfbcb22f37a8a1f8

แต่ ณ วันนี้ยังไม่มีแพทช์หรืออาสาสมัครออกมาแม้ว่าหลายคนแสดงความปรารถนาที่จะมีสิ่งนี้ในการเปิดตัว Vim ในอนาคต


1

ตามที่คุณระบุไว้คุณจะได้รับรหัสคีย์เดียวกัน ดังนั้นวิธีเดียวที่จะแยกแยะได้คือตรวจสอบสถานะของShiftคีย์ในฟังก์ชันการจัดการเหตุการณ์ของคุณ แน่นอนว่าหากคุณมีความล่าช้ามากกว่า 0.5 วินาทีระหว่างการกดปุ่มและการประมวลผลคุณจะพลาดเพลงฮิต


1
ฉันเดาว่าประเด็นของคำถามของฉันคือเนื่องจาก gvim สามารถสร้างความแตกต่างได้ (แม้ว่า vim ธรรมดาจะไม่สามารถทำได้) มีส่วนขยายเฉพาะ gvim ที่ฉันสามารถพึ่งพาเพื่อแยกความแตกต่างของ Ctrl + Shift + V vs Ctrl + V .
Kohsuke Kawaguchi

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