เป็นกลุ่มใน WSL: ซิงโครไนซ์คลิปบอร์ดระบบหรือไม่ (ตั้งค่าคลิปบอร์ด ^ = ไม่มีชื่อ)


12

ในขณะที่ใช้ WSL / Bash สำหรับ Windows ฉันต้องการที่จะใช้y yy 3yและpวิธีเดียวกับที่พวกเขาทำงานเป็นกลุ่ม แต่การเชื่อมต่อกับคลิปบอร์ดของระบบที่ใช้ร่วมกันโดยแอพทั้งหมดไม่ใช่คลิปบอร์ดภายในของ vim ... ฉันมีความชำนาญในการจัดการคลิปบอร์ด ประวัติศาสตร์

ดูเหมือนว่ากลุ่มมีตัวเลือกในตัวเพื่อซิงโครไนซ์บัฟเฟอร์การคัดลอก / วางกับคลิปบอร์ดของระบบ ... แต่ปัญหาเมื่อเรียกใช้ WSL คือคุณต้องใช้/mnt/c/Windows/System32/clip.exeเพื่อเข้าถึงคลิปบอร์ด ... ดังนั้นแม้ว่าฉันจะต้องการ เพื่อให้สามารถใช้:

set clipboard^=unnamed

ดูเหมือนว่ายังไม่มีการสนับสนุน WSL

ฉันเข้าใจว่า neovim มีตัวเลือกนี้ แต่ฉันไม่ต้องการทดลองใช้ neovim ในตอนนี้ ...

สำหรับตอนนี้สิ่งที่ใกล้เคียงที่สุดสำหรับวิธีแก้ไขปัญหาที่ฉันพบคือ:

nnoremap <silent> <leader>y :call system('/mnt/c/Windows/System32/clip.exe', @0)<CR>
vnoremap <silent> <leader>y :call system('/mnt/c/Windows/System32/clip.exe', @0)<CR>

แต่นี่เป็นทางออกที่น่ากลัวจริงๆในความคิดของฉัน ... มันทำให้กระบวนการคัดลอกสองขั้นตอน ...

แน่นอนว่าฉันสามารถคัดลอกและวางด้วยเมาส์ / shift + ins ได้ แต่ฉันคิดว่าต้องมีวิธีที่จะทำให้การซิงโครไนซ์นี้ทำงานได้อย่างถูกต้องใน Vim


แนะนำโซลูชันนี้superuser.com/a/1439881/711405
ephemerr

สำหรับผู้ที่ใช้ Neovim พบว่าคำถามนี้ดูgithub.com/neovim/neovim/wiki/...
Andrey Kaipov

คำตอบ:


10

ฉันรู้ว่านี่เป็นคำถามที่เก่ามาก แต่ฉันเพิ่งพบทางออกที่ดี หลังจากแห้วมากฉันได้พบวิธีการเหล่านี้เพื่อเข้าถึงคลิปบอร์ดระบบ windows โดยการคัดลอกและวาง

โดยการคัดลอกพร้อมเวอร์ชัน vim> = 8.0.1394 ดังที่ระบุไว้ในคำตอบอื่นhttps://vi.stackexchange.com/a/15190

let s:clip = '/mnt/c/Windows/System32/clip.exe' 
if executable(s:clip)
    augroup WSLYank
        autocmd!
        autocmd TextYankPost * call system('echo '.shellescape(join(v:event.regcontents, "\<CR>")).' | '.s:clip)
    augroup END
end

การวางการแม็พกับคำสั่งรีจีสทรีปลอมคือ "= p หรือ" + p หรืออะไรก็ตาม

map <silent> "=p :r !powershell.exe -Command Get-Clipboard<CR>
map! <silent> <C-r>= :r !powershell.exe -Command Get-Clipboard<CR>

" I thought this will be better :)
noremap "+p :exe 'norm a'.system('/mnt/c/Windows/System32/WindowsPowerShell/v1.0/powershell.exe -Command Get-Clipboard')<CR>

คลิกขวาที่การวางทำงาน แต่ไม่พอใจถ้าคุณไม่ต้องการใช้เมาส์


ใน WSL viฉันได้เพิ่มnnoremap <S-Insert> :r !powershell.exe -Command "& {Get-Clipboard}"<Enter>
Walter A

ขอบคุณสำหรับคำตอบที่เป็นประโยชน์! ฉันสงสัยว่ามันจะเป็นไปได้หรือไม่ที่จะใช้การลงทะเบียนปลอมสำหรับคำสั่ง yank สิ่งที่ต้องการnoremap "+y :exe 'norm a'.system('echo '.shellescape(join(v:event.regcontents, "\<CR>")).' | clip.exe')<CR>(ซึ่งใช้งานไม่ได้ ... )
Tropilio

4

แล้วเรื่องนี้ล่ะ

if system('uname -r') =~ "Microsoft"
  augroup Yank
    autocmd!
    autocmd TextYankPost * :call system('clip.exe ',@")
  augroup END
endif

unameเป็นคำสั่งเทอร์มินัล Linux ซึ่งส่งคืนข้อมูล OS เช่นนั้นจะส่งคืนLinuxสำหรับ WSL ในขณะที่มีการ-rตั้งค่าสถานะคำสั่งจะส่งคืนข้อมูลการเปิดตัวของระบบปฏิบัติการดังนั้นจึงควรมี "Windows"

TextYankPostเป็นเหตุการณ์ที่เป็นกลุ่ม (ดู:h TextYankPostในvim) ซึ่งตรวจจับกิจกรรมดึงข้อความของคุณ

clip.exeเป็นคำสั่งพร้อมรับคำสั่งของของ Windows ใน WSL (ดูCLIP /?ใน Command Prompt) ซึ่งคัดลอกtextหรือผลตอบแทนจากcommandเข้า clipbord ผ่านหรือtext | clip.exe command | clip.exeที่นี่จะถูกดำเนินการจากกลุ่มโดยฟังก์ชั่นที่เป็นกลุ่มclip.exesystem


ใน Neovim หนึ่งสามารถใช้แทนhas('wsl') system('uname -r') =~ "Microsoft"
Justin M. Keyes

2

ฉันได้ทำ PR สำหรับการสนับสนุน WSL เพื่อfakeclipบางเวลาที่ผ่านมา

ดูvimawesomeในการติดตั้ง; help fakeclipสำหรับการใช้งาน


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