Tệp có độ dài 0 từ new: term buffer: vim -c “w! tập tin"
Tôi có một tệp mk.outchứa mã ANSI, có thể được xóa bằng cách mở nó trong Vim và phát hành:
:term cat % " Interpret codes in new buffer
:only " Close source buffer `mk.out`
:w! mk.out " Overwrite `mk.out` with cleaned up text
Điều này hoạt động tốt, nhưng vấn đề phát sinh khi tôi cố gắng tự động hóa điều này:
vim -c ":term cat %" -c ":only" -c ":w! mk.out" mk.out
Tôi bối rối bởi thực tế là điều này dẫn đến một bộ đệm trống cho mã được làm sạch và cho mk.out. Tuy nhiên, nếu tôi xóa lệnh để ghi đè mk.out, bộ đệm mới vẫn chứa văn bản đã được làm sạch và tôi có thể đưa ra lệnh ghi đè theo cách thủ công.
Tôi cũng đã thử ghi đè lên một tệp khácmk.cln ( clnlà để xóa ). Ngược lại với việc trên, bộ đệm mới cho các văn bản sạch sẽ không một cách bí ẩn trở thành rỗng (tốt), nhưng các tập tin văn bản mk.clnlà vẫn trống:
vim -c ":term cat %" -c ":only" -c ":w! mk.cln" mk.out
Điều này không phụ thuộc vào việc "tiếng nổ" !có trong lệnh ghi hay không. Như mong đợi, mk.outkhông bị quấy rầy. Để loại trừ các vấn đề từ việc nhắc ghi đè mk.cln, tôi đã đảm bảo rằng điều đó mk.clnkhông tồn tại trước đó.
Đối với :termbộ đệm mới, điều gì sẽ khiến :writelệnh ghi một tệp trống khi được gửi qua -ccông tắc của Vim , nhưng không phải khi được phát hành tương tác?
Các chi tiết ngữ cảnh khác
Việc ghi tệp mới từ tệp hiện có hoạt động, nhưng mã ANSI không được làm sạch:
vim -c ":w! mk.cln" mk.out
Tôi nhận ra rằng tôi cần :wq, nhưng tôi chỉ đang cố gắng gỡ rối vào lúc này.
Phiên bản Vim
VIM - Vi IMproved 8.2 (2019 Dec 12, compiled Mar 30 2020 21:51:17)
Included patches: 1-486
Modified by <[email protected]>
Compiled by <[email protected]>
Huge version with GTK3 GUI. Features included (+) or not (-):
+acl -farsi -mouse_sysmouse -tag_old_static
+arabic +file_in_path +mouse_urxvt -tag_any_white
+autocmd +find_in_path +mouse_xterm -tcl
+autochdir +float +multi_byte +termguicolors
-autoservername +folding +multi_lang +terminal
+balloon_eval -footer -mzscheme +terminfo
+balloon_eval_term +fork() +netbeans_intg +termresponse
+browse +gettext +num64 +textobjects
++builtin_terms -hangul_input +packages +textprop
+byte_offset +iconv +path_extra +timers
+channel +insert_expand +perl/dyn +title
+cindent +job +persistent_undo +toolbar
+clientserver +jumplist +popupwin +user_commands
+clipboard +keymap +postscript +vartabs
+cmdline_compl +lambda +printer +vertsplit
+cmdline_hist +langmap +profile +virtualedit
+cmdline_info +libcall +python/dyn +visual
+comments +linebreak +python3/dyn +visualextra
+conceal +lispindent +quickfix +viminfo
+cryptv +listcmds +reltime +vreplace
+cscope +localmap +rightleft +wildignore
+cursorbind +lua/dyn +ruby/dyn +wildmenu
+cursorshape +menu +scrollbind +windows
+dialog_con_gui +mksession +signs +writebackup
+diff +modify_fname +smartindent +X11
+digraphs +mouse +sound -xfontset
+dnd +mouseshape +spell +xim
-ebcdic +mouse_dec +startuptime +xpm
+emacs_tags -mouse_gpm +statusline +xsmp_interact
+eval -mouse_jsbterm -sun_workshop +xterm_clipboard
+ex_extra +mouse_netterm +syntax -xterm_save
+extra_search +mouse_sgr +tag_binary
system vimrc file: "/etc/vimrc"
user vimrc file: "$HOME/.vimrc" 2nd user vimrc file: "~/.vim/vimrc" user exrc file: "$HOME/.exrc"
system gvimrc file: "/etc/gvimrc"
user gvimrc file: "$HOME/.gvimrc" 2nd user gvimrc file: "~/.vim/gvimrc" defaults file: "$VIMRUNTIME/defaults.vim"
system menu file: "$VIMRUNTIME/menu.vim" fall-back for $VIM: "/etc"
f-b for $VIMRUNTIME: "/usr/share/vim/vim82"
Compilation: gcc -c -I. -Iproto -DHAVE_CONFIG_H -DFEAT_GUI_GTK -I/usr/include/gtk-3.0 -I/usr/include/pango-1.0 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/cairo -I/usr/include/pixman-1 -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/uuid -I/usr/include/harfbuzz -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/gio-unix-2.0/ -I/usr/include/atk-1.0 -I/usr/include/at-spi2-atk/2.0 -I/usr/include/at-spi-2.0 -I/usr/include/dbus-1.0 -I/usr/lib/dbus-1.0/include -D_REENTRANT -ggdb -O2 -pipe -Wall -Werror=format-security -fstack-protector-strong --param=ssp-buffer-size=4 -fdebug-prefix-map=/usr/src/ports/vim/vim-8.2.0486-1.x86_64/build=/usr/src/debug/vim-8.2.0486-1 -fdebug-prefix-map=/usr/src/ports/vim/vim-8.2.0486-1.x86_64/src/vim-8.2.0486=/usr/src/debug/vim-8.2.0486-1 -fstack-protector-strong -D_REENTRANT -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1
Linking: gcc -L. -fstack-protector-strong -L/usr/local/lib -Wl,--as-needed -o vim.exe -lgtk-3 -lgdk-3 -lpangocairo-1.0 -lpango-1.0 -latk-1.0 -lcairo-gobject -lcairo -lgdk_pixbuf-2.0 -lgio-2.0 -lgobject-2.0 -lglib-2.0 -lintl -lSM -lICE -lXpm -lXt -lX11 -lXdmcp -lSM -lICE -lm -lncursesw -lcanberra -liconv -lacl -lattr -lintl -Wl,--enable-auto-import -Wl,--export-all-symbols -Wl,--enable-auto-image-base -fstack-protector-strong -L/usr/lib/perl5/5.30/x86_64-cygwin-threads/CORE -lperl -lpthread -ldl -lcrypt
Trả lời
Đối với bộ đệm mới của: term, điều gì sẽ gây ra lệnh: write để ghi một tệp trống khi được gửi qua công tắc -c của Vim, nhưng không phải khi được phát hành tương tác?
Bạn có thể cần đợi các bản cập nhật đang chờ xử lý. Nếu vậy, bạn cần term_wait().
Hãy thử lệnh shell này:
vim -Nu NONE -i NONE -U NONE +'term cat %' +'call term_wait(bufnr("")) | bw! # | w! mk.out | qa!' mk.out
Nếu nó không hoạt động, hãy cố gắng tăng thời gian chờ đợi:
vim -Nu NONE -i NONE -U NONE +'term cat %' +'call term_wait(bufnr(""), 100) | bw! # | w! mk.out | qa!' mk.out
^^^
wait 100ms instead of 10
Xem : h term_wait () .
Nếu term_waitkhông hoạt động, ít nhất là trường hợp của OP đã thành công bằng cách thay thế call term_wait(bufnr(""), xxx )bằng sleep xxx m, trong đó xxx là thời gian chờ tính bằng mili giây (500 hoạt động đối với OP). Lệnh cuối cùng sau đó có thể được rút ngắn thành
`vim -Nu NONE -i NONE -U NONE +':term cat mk.out' +'sleep 500 m | silent! w! mk.out | qa'`.