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 autocmd
s ( 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 vim
và 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?
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
.
gvim --servername $desktop --remote-send "<ESC>:tabe ${file// /\\ }<CR>"
đơn giản hơn?
shellescape
chức năng hữu ích?
: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.
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>"