เป็นกลุ่ม! ในตำแหน่งเคอร์เซอร์


17

ด้วยเสียงเรียกเข้าถ้าฉันใช้

:r!date

เป็นกลุ่มแทรกวันที่ในบรรทัดถัดไปคล้ายกับ

:r!pwd

ฉันจะแทรกคำสั่งเอาต์พุตภายใต้ตำแหน่งเคอร์เซอร์ได้อย่างไรและไม่มีในบรรทัดใหม่


คำตอบ:


16

ด้วย " :read" Vim จะแทรกผลลัพธ์ลงในบรรทัดใหม่เสมอ การแก้ปัญหานั้นไม่ใช่เรื่องง่าย

คุณอาจจะแทรกผลลัพธ์ของคำสั่งที่ที่ตำแหน่งของเคอร์เซอร์ปัจจุบันเมื่อคุณอยู่ในโหมดแทรกโดยการกดปุ่มจากนั้นพิมพ์ControlR =system('command')Enterน่าเสียดายที่หากเอาต์พุตของคำสั่งมีบรรทัดใหม่ต่อท้าย (ส่วนใหญ่จะ) ที่จะถูกแทรกด้วยดังนั้นบรรทัดของคุณจะแตก

ที่สามารถแก้ไขได้โดยการเพิ่มการsubstitute()เรียกเพื่อตัดการขึ้นบรรทัดใหม่ แต่นั่นทำให้คำสั่งมีปัญหามากกว่าที่ควรจะพิมพ์ด้วยมือ

ทางออกที่ดีที่สุดคือการสร้างการเรียงลำดับของการทำแผนที่ แต่มันก็ซับซ้อนมากขึ้นเนื่องจากวิธีการที่ Vim จัดการกับสิ่งที่เรียกว่า "พิมพ์ล่วงหน้า"; ในขณะที่คุณสามารถทำสิ่งที่ชอบ:

:nmap \e i<c-r>=substitute(system('date'),'[\r\n]*$','','')<cr><esc>

ในกรณีที่คำสั่ง "hard wired" ในการแมปคุณไม่สามารถทำสิ่งต่อไปนี้ได้:

:nmap \e i<c-r>=substitute(system(input('Command: ')),'[\r\n]*$','','')<cr><esc>

ที่ซึ่งคุณพยายามให้ผู้ใช้เรียกใช้คำสั่งเนื่องจาก Vim จะสับสนส่งเสียงบี๊บและเข้าสู่โหมดแทรก

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

function InlineCommand()
    let l:cmd = input('Command: ')
    let l:output = system(l:cmd)
    let l:output = substitute(l:output, '[\r\n]*$', '', '')
    execute 'normal i' . l:output
endfunction

nmap <silent> \e :call InlineCommand()<CR>

โปรดทราบว่าnmapสร้างการแมปที่จะทำงานเมื่อพิมพ์ในโหมดปกติเท่านั้น

อนึ่งหากคุณต้องการแทรกวันที่หรือไดเรกทอรีการทำงานปัจจุบันคำตอบเริ่มต้นที่ฉันให้นั้นเป็นไปได้ เพียงเข้าสู่โหมดการแทรกและประเภทหรือControlR=strftime('%c')EnterControlR=getcwd()Enter


มันจะเป็นไปได้ที่จะโยงคำสั่งเพื่อแก้ปัญหานี้หรือไม่ : r! date | : - | J หรือ i \ n \ n ^ [-:.! date \ n -JJ
Alexx Roche

4

หากคุณต้องการให้อยู่ในบรรทัดปัจจุบันคุณลองใช้ แต่โปรดทราบว่าเนื้อหาเก่าของบรรทัดจะถูกลบ:

:.!date

หากคุณต้องการตำแหน่งเคอร์เซอร์ที่แน่นอนคุณสามารถ:

:let a=system("date") | let b=substitute(a,"[\r\n]*$","","g") | exec 'normal i'.b

เรื่องสั้นสั้น ๆ : คุณต้องแทนที่สาเหตุที่คุณต้องการกำจัด ^ @ (ตัวละครโมฆะ) ซึ่งคุณสามารถแทนที่ด้วย. s / \% x00 // g นี่เป็นเวอร์ชั่นที่สั้นกว่าโดยมีท่อน้อยกว่า:

:exec 'normal i'.substitute(system("date"),"[\n]*$","","")

และคุณยังสามารถตั้งค่าแท็กหากคุณต้องการแทนที่ในจุดต่าง ๆ ในบรรทัดเดียวกัน:

รับบรรทัดนี้ 1:

1 Date: <datehere> and also <datehere>

ดำเนินการ:

:let a=system("date") | exec ".s/<datehere>/".a."/g" | .s/\%x00//g

หลังจากเปลี่ยน:

1 Date: jue ago 9 02:34:52 ART 2012 and also jue ago 9 02:34:52 ART 2012

ทดสอบในกลุ่ม 7.2


1

คุณสามารถเพิ่มสิ่งนี้ลงใน. vimrc ของคุณ:

" Insert the date in YYYY-MM-DD format inline just before cursor position (normal mode)
nnoremap <Leader>di me:r !date +\%F<CR>A <Esc>0D`ePJx
  • me ทำเครื่องหมายตำแหน่งปัจจุบัน
  • :r !date +\%F<CR>ทำให้วันในบรรทัดถัดไปในรูปแบบ YYYY-MM-DD (คุณสามารถเปลี่ยนได้ แต่คุณต้องการเพียงแค่หลบหนีแต่ละ%ด้วย\)
  • A <Esc> ผนวกช่องว่างต่อท้ายผลลัพธ์วันที่
  • 0Dลบวันที่`eนำคุณกลับไปที่ตำแหน่งที่ทำเครื่องหมายไว้แล้วPJxวางวันที่ไว้ก่อนที่เคอร์เซอร์จะรวมเส้น (เพื่อกำจัดสิ่งที่ว่างด้านล่าง) และฆ่าพื้นที่ต่อท้าย ปรับเปลี่ยนการทำแผนที่ตามที่เห็นสมควร

หากคุณต้องการที่จะทำจากโหมดแทรกฉันอ่านอัญมณีวันนี้ที่https://vimways.org/2018/the-mapping-business/

inoremap <C-g><C-t> <C-r>=strftime("%F")<CR>

คุณสามารถปรับเปลี่ยนวันที่ออกให้เหมาะกับความต้องการของคุณ ( man dateสามารถช่วยในเรื่องนี้)


0

ในโหมดปกติ (โหมด escape / bleep) วางใน

:exec 'normal i'.system("date \| tr '\n' ' '")

เพื่อแทรกวันที่ที่ตำแหน่งปัจจุบัน หากคุณคัดลอกบรรทัดนั้นพร้อมกับ carriage-return จากนั้น Shift + Insert จะกลายเป็นคำสั่ง DateTime-Here ของคุณ

นอกจากนี้คุณสามารถผูก F12 กับคำสั่งด้วย

:inoremap <F12> <C-r>=system("date \| tr '\n' ' '")<CR>

จากนั้นคุณสามารถแทรกวันที่ด้วย Function-key-12 ในขณะที่โหมดแทรกทำงานอยู่ ฉันใช้

:inoremap DHRE <C-r>=system("date \| tr '\n' ' '")<CR>

(ฉันเปลี่ยนจาก DHERE หลังจากพบการวาง ADHERE ที่ถูกเรียก) เพราะฉันใช้ F12 สำหรับสิ่งอื่น ๆ อยู่แล้ว

ฉันใช้

grep -iE "dhere" /usr/share/dict/words

เพื่อตรวจสอบการชนที่เห็นได้ชัดด้วยคำที่มีอยู่ซึ่งแนะนำว่าคุณค่อนข้างปลอดภัยที่จะใช้:

:inoremap PWD <C-r>=system("pwd \| tr '\n' ' '")<CR>

(เว้นแต่คุณจะเขียนเอกสารบางอย่าง)

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