วิธีการหลีกเลี่ยงสตริงทั้งหมดในคำสั่ง:


13

มาดูกัน. ฉันมีการgvimทำงานและฉันต้องการเปิดไฟล์ที่เคารพautocmds ( ซึ่งออกกฎ--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:บรรทัดเป็นกลุ่มเพื่ออ้างอิงชื่อไฟล์ทั่วโลกโดยไม่ต้องพูดถึงตัวอักษร "แปลก" ทีละตัวหรือไม่


1
ดูเหมือนขึ้นอยู่กับเปลือกสูง gvim --remote-send ':tabe foo\ bar.txt<CR>'ทำงานให้ฉันใน bash และ zsh และราคาก็ดูเหมือนจะมีความสำคัญเช่นกัน ถ้าฉันใช้"ภายในมันไม่ทำงาน แต่'ทำ:gvim --remote-send ":tabe 'foo bar.txt'<CR>"
muru

อืมม ... gvim --remote-send ":tabe 'f s.txt'<CR>"ไม่ได้ทำงานสำหรับฉันหรือเขียนในกลุ่มผมได้:tabe 'f s.txt' E77: Too many files names
Rmano

1
จะไม่gvim --servername $desktop --remote-send "<ESC>:tabe ${file// /\\ }<CR>"ง่ายกว่านี้หรือ
muru

1
จะshellescapeฟังก์ชั่นจะมีประโยชน์หรือไม่
EvergreenTree

1
โปรดทราบว่า:edit(และตัวแปร) ไม่ยอมรับชื่อไฟล์ที่ยกมา อักขระพิเศษทั้งหมดจะต้องได้รับการหลบหนีเป็นรายบุคคล ดังนั้น:edit "foo bar.txt"จะไม่ทำงาน :edit foo\ bar.txtคุณจำเป็นต้อง ที่กล่าวว่าสิ่งที่ชอบ:execute 'tabedit' escape('$file', ' ')อาจจะถูกทาง
tommcdo

คำตอบ:


2

สำหรับข้อมูลทั่วไปและต้องขอบคุณความคิดเห็นทั้งหมดนี่คือสคริปต์ที่ฉันใช้เพื่อให้มีสคริปต์ "เปิดในแท็บบน gvim บนเดสก์ท็อปนี้":

#!/bin/bash -x
#
# this is convoluted because it has to finish in an exec to keep the DM happy
# remember to set StartupNotify=false in the .desktop file
#
desktop=desktop_$(xprop -root -notype  _NET_CURRENT_DESKTOP | perl -pe 's/.*?= (\d+)/$1/')

if ! vim --serverlist | grep -iq $desktop; then #we need to start the server
    if [ $# != 0 ]; then 
        exec gvim 2>/dev/null --servername $desktop "$@"
    else
        exec gvim 2>/dev/null --servername $desktop  #no files 
    fi
fi
# the only case here is if we need to open a tab in an existing server
if [ $# != 0 ]; then  
        # Do not use --remote-tab, see http://vi.stackexchange.com/questions/2066/different-autocmd-behavior-when-using-remote-tab-silent
        # <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
        fileq=${file// /\\ } # quote spaces FIXME add other chars
        exec gvim 2>/dev/null --servername $desktop --remote-send "<ESC>:tabe $fileq <CR><CR>"
fi

0

สิ่งที่ฉันได้จัดการเพื่อส่งไปยัง Vim คือ: ที่ '<C-\\><C-N>:1wincmd<C-q>x20w<CR>' ซึ่งพื้นที่ถูกกำหนดเป็น x20 ซึ่งหมายถึงการแทรก hex $ 20

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