มาดูกัน. ฉันมีการgvim
ทำงานและฉันต้องการเปิดไฟล์ที่เคารพautocmd
s ( ซึ่งออกกฎ--remote-tab
)
ตอนนี้ฉันรู้ว่าฉันสามารถทำได้ (โดยทั่วไปมีการปรับแต่ง):
gvim --remote-send ":tabe my_file<CR>"
ซึ่งใช้งานได้ แต่ถ้าไฟล์มีช่องว่างหรือตัวอักษรแปลก ๆ ฉันต้องทำดังนี้:
gvim --remote-send ":tabe my\\ file<CR>"
(double \\
เป็นเพราะหนึ่งในนั้นถูกกินโดยเชลล์สิ่งนี้เทียบเท่ากับการพิมพ์ด้วยตนเอง
`:tabe my\ file`
ในvim
และมันใช้งานได้) ตอนนี้ฉันสามารถหาวิธีสร้างสตริงนั้นในเชลล์หรืออะไรก็ได้ แต่ฉันหวังว่าฉันจะ "อ้างคำสั่งทั่วโลก" สตริงในคำสั่ง ": tabe" เช่น
gvim --remote-send ":tabe 'my file'<CR>"
หรือ
gvim --remote-send ":tabe \"my file\"<CR>"
--- นี่เทียบเท่ากับการเขียนโดยตรงในบรรทัดคำสั่ง vim :tabe "my file"
; ดูเหมือนว่ามันจะไม่ทำงาน ฉันสามารถอ้างอิงช่องว่างทั้งหมดในสตริงด้วยเชลล์ได้อย่างชัดเจน
# <ESC> because the gvim instance can be in a mode different from normal
# the double CR: do not ask.
# the argument MUST be a full path
file="$(readlink -f "$@")"
fileq="$(echo "$file" | awk '{gsub(/ /,"\\\ ")}1')" # quote spaces FIXME add other chars
exec gvim 2>/dev/null --servername $desktop --remote-send "<ESC>:tabe $fileq <CR><CR>"
แต่ใช้งานได้สำหรับช่องว่างเท่านั้นไม่ใช่ตัวอักษรพิเศษอื่น ๆ เช่นแท็บและ"
(หรือการขึ้นบรรทัดใหม่ แต่ถ้าคุณมีการขึ้นบรรทัดใหม่ในชื่อไฟล์ของคุณคุณสมควรได้รับ!)
คำถาม :
เป็นอิสระบนเชลล์เฉพาะซึ่งฉันจะจัดการหลัง :-) มีวิธีเมื่อพิมพ์โดยตรงในtabe:
บรรทัดเป็นกลุ่มเพื่ออ้างอิงชื่อไฟล์ทั่วโลกโดยไม่ต้องพูดถึงตัวอักษร "แปลก" ทีละตัวหรือไม่
gvim --remote-send ":tabe 'f s.txt'<CR>"
ไม่ได้ทำงานสำหรับฉันหรือเขียนในกลุ่มผมได้:tabe 'f s.txt'
E77: Too many files names
gvim --servername $desktop --remote-send "<ESC>:tabe ${file// /\\ }<CR>"
ง่ายกว่านี้หรือ
shellescape
ฟังก์ชั่นจะมีประโยชน์หรือไม่
:edit
(และตัวแปร) ไม่ยอมรับชื่อไฟล์ที่ยกมา อักขระพิเศษทั้งหมดจะต้องได้รับการหลบหนีเป็นรายบุคคล ดังนั้น:edit "foo bar.txt"
จะไม่ทำงาน :edit foo\ bar.txt
คุณจำเป็นต้อง ที่กล่าวว่าสิ่งที่ชอบ:execute 'tabedit' escape('$file', ' ')
อาจจะถูกทาง
gvim --remote-send ':tabe foo\ bar.txt<CR>'
ทำงานให้ฉันใน bash และ zsh และราคาก็ดูเหมือนจะมีความสำคัญเช่นกัน ถ้าฉันใช้"
ภายในมันไม่ทำงาน แต่'
ทำ:gvim --remote-send ":tabe 'foo bar.txt'<CR>"