Làm thế nào để thoát toàn bộ một chuỗi trong một lệnh:?


13

Hãy xem nào. Tôi có một hoạt gvimđộng và tôi muốn mở một tập tin, tôn trọng autocmds ( quy định ra--remote-tab ).

Bây giờ tôi biết tôi có thể làm (về cơ bản, với một số điều chỉnh):

gvim --remote-send ":tabe my_file<CR>" 

mà hoạt động. Nhưng nếu một tập tin có khoảng trắng hoặc ký tự lạ trong đó, tôi phải làm như sau:

gvim --remote-send ":tabe my\\ file<CR>"

(gấp đôi \\là do một trong số chúng bị ăn vỏ; điều này tương đương với kiểu thủ công

`:tabe my\ file` 

trong vimvà nó hoạt động). Bây giờ, tôi có thể tìm cách tạo chuỗi đó trong trình bao hoặc bất cứ điều gì, nhưng tôi hy vọng tôi có thể "trích dẫn toàn cầu" chuỗi trong lệnh ": tabe", như

 gvim --remote-send ":tabe 'my file'<CR>"

hoặc là

 gvim --remote-send ":tabe \"my file\"<CR>"

--- điều này tương đương với việc viết trực tiếp trong dòng lệnh vim :tabe "my file"; có vẻ như nó không hoạt động Tôi có thể trích dẫn rõ ràng tất cả không gian trong chuỗi bằng shell, làm một cái gì đó như

# <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>"

nhưng nó chỉ hoạt động cho các không gian chứ không phải các ký tự đặc biệt khác như các tab và "(cũng không phải dòng mới, nhưng nếu bạn có dòng mới trong tên tệp của mình thì bạn xứng đáng với nó!).

Câu hỏi :

Độc lập trên shell cụ thể, mà tôi sẽ xử lý sau :-), có cách nào khi gõ trực tiếptabe: dòng vim để trích dẫn toàn bộ tên tệp mà không cần trích dẫn từng ký tự "lạ" không?


1
Có vẻ phụ thuộc rất nhiều vỏ. gvim --remote-send ':tabe foo\ bar.txt<CR>'làm việc cho tôi trên bash và zsh. Và các trích dẫn dường như cũng quan trọng. Nếu tôi sử dụng "nội bộ, nó không hoạt động, nhưng 'đã làm:gvim --remote-send ":tabe 'foo bar.txt'<CR>"
muru

Hmmm ... gvim --remote-send ":tabe 'f s.txt'<CR>"không làm việc cho tôi, cũng không viết bằng :tabe 'f s.txt'vim, tôi hiểu E77: Too many files names.
Rmano

1
Sẽ không gvim --servername $desktop --remote-send "<ESC>:tabe ${file// /\\ }<CR>"đơn giản hơn?
muru

1
Sẽ shellescapechức năng hữu ích?
EvergreenTree

1
Hãy nhớ rằng :edit(và các biến thể của nó) không chấp nhận tên tệp được trích dẫn. Tất cả các nhân vật đặc biệt cần phải được trốn thoát cá nhân. Vì vậy, :edit "foo bar.txt"sẽ không làm việc; bạn cần :edit foo\ bar.txt. Điều đó nói rằng, một cái gì đó như :execute 'tabedit' escape('$file', ' ')có thể đang đi đúng hướng.
tommcdo

Câu trả lời:


2

Để biết thông tin chung và nhờ tất cả các ý kiến, đây là tập lệnh tôi sử dụng để có tập lệnh "mở trong tab trên gvim trên màn hình này":

#!/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

Những gì tôi đã quản lý để gửi cho Vim là: '<C-\\><C-N>:1wincmd<C-q>x20w<CR>' Nơi không gian được xác định là x20 có nghĩa là chèn hex $ 20.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.