การพูดคุยเป็นกลุ่มจากภายนอก


12

ฉันสามารถเปลี่ยนตัวแปรในอินสแตนซ์ของ vim จากเชลล์อื่น (โดยไม่ต้องส่งคีย์ผ่าน tmux) ได้หรือไม่?

ฉันถามเพราะฉันต้องการใช้ตัวเลือกการคอมไพล์ _cmd, success_cmd และ failure_cmd ของ Latexmk เพื่อแสดงสถานะการรวบรวมบนสถานะ

บางทีฉันอาจได้เป็นกลุ่มมองหาการดำรงอยู่หรือไม่มีอยู่ของไฟล์บางอย่าง (ใช้ไฟล์เป็นตัวแปรบูลีน)? แต่มันดูสกปรกไปหน่อย หวังว่าจะมีวิธีที่ดีกว่า

คำตอบ:


19

หากคุณเปิดใช้งานเซสชัน Vim แรกด้วยอาร์กิวเมนต์--servername VIM:

$ vim --servername VIM

แล้วคุณสามารถส่งคำสั่งใด ๆ จากเปลือกอื่น ๆ --remote-sendที่มีการโต้แย้ง

ตัวอย่างเช่นถ้าคุณใช้ statusline ของคุณเพื่อแสดงค่าของตัวแปรบางตัวg:myvarและคุณมีบรรทัดต่อไปนี้ใน vimrc ของคุณ:

let g:myvar = "foo"
set stl+=%{g:myvar}

จากนั้นคุณสามารถเปลี่ยนค่า ( :let g:myvar = "bar") จากเชลล์อื่น:

$ vim --remote-send ':let g:myvar = "bar"<cr>'

สถานะควรสะท้อนการเปลี่ยนแปลงของมูลค่า


ตามความคิดเห็นล่าสุดของคุณบอกว่าถ้าอินสแตนซ์ Vim ของคุณไม่ได้อยู่ในโหมดปกติคำสั่งก่อนหน้านี้จะไม่ทำงานอย่างที่คาดไว้ อาจจะง่ายกว่า แต่นี่เป็นวิธีแก้ปัญหาที่เป็นไปได้ 2 แบบ:

1) เพิ่มคีย์<esc>ให้อยู่ในโหมดปกติ
2) ใช้อาร์กิวเมนต์--remote-exprแทน--remote-sendการประเมินนิพจน์และเขียนฟังก์ชันตัวช่วยเล็ก ๆ ซึ่งโค้ดจะกำหนดค่าใหม่ให้กับตัวแปรของคุณ

วิธีแก้ปัญหาแรก:

$ vim --remote-send '<esc>:let g:myvar = "bar"<cr>'

ทางออกที่สอง:

กำหนดฟังก์ชั่นต่อไปนี้ใน vimrc ของคุณ:

function! Myfunc(value)
    let g:myvar = a:value
endfunction

จากนั้นในเปลือกของคุณ:

$ vim --remote-expr 'Myfunc("bar")'

ขอบคุณ! ฉันเห็นว่าไม่มีฟีเจอร์นี้ที่คอมไพล์ดังนั้นฉันจะคอมไพล์ใหม่ หวังว่ามันจะเหมือนกันใน neovim
Toothrot

3
@ ลอเรนซ์ฉันอาจจะผิด แต่ฉันคิดว่า neovim ไม่ได้ใช้+clientserverคุณสมบัติ ( github.com/tpope/vim-dispatch/issues/163#issuecomment-175383047 ) หากเป็นกรณีนี้ปลั๊กอินนี้อาจช่วยคุณได้: github.com/mhinz/neovim-remote
user9433424

ดูเหมือนว่าสิ่งนี้มีผลเช่นเดียวกับการส่งคีย์ด้วย tmux และขึ้นอยู่กับการรู้ว่าโหมดใดที่ vim server อยู่ (ตัวอย่างถือว่าโหมดปกติ) โดยหลักการแล้วฉันต้องการตั้งค่าตัวแปรโดยตรง
Toothrot
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.