Apakah ada cara untuk membagikan riwayat perintah vim?

8

Bisakah saya membagikan riwayat perintah Vim di seluruh instance secara langsung?

Maksud saya apa yang dilakukan orang dalam bash dengan cara ini:

export PROMPT_COMMAND="history -a; history -c; history -r; $PROMPT_COMMAND"

Yaitu, ketika saya menjalankan perintah echo test1dalam satu shell, dan kemudian menekan yang Uplain, saya mengerti echo test1. (Tepatnya, seseorang harus menekan Entersebelumnya Upagar bisa berfungsi.)

Apakah ini mungkin dengan Vim? Awalnya saya pikir menggunakan +clientserveropsi akan berhasil. Tapi itu sepertinya menjadi sesuatu yang lain.

x-yuri
sumber

Jawaban:

13

Riwayat perintah disimpan dalam file viminfo ( :help viminfo). Biasanya itu dibaca saat startup dan ditulis saat keluar, tetapi Anda bisa secara eksplisit bertahan dan menyinkronkan antara instance Vim dengan kombinasi :wviminfodan :rviminfo. Perhatikan bahwa ini akan menyinkronkan seluruh informasi; yaitu juga mendaftarkan konten, tanda, daftar buffer, dll.

Ingo Karkat
sumber
1

Di Vim yang paling dekat yang bisa Anda dapatkan adalah (seperti jawaban Ingo dan komentar Christian disebutkan) adalah:

augroup viminfo
    autocmd!
    autocmd FocusLost   * wviminfo
    autocmd FocusGained * rviminfo
augroup end

Sangat penting untuk menyadari bahwa perintah otomatis Focus*tidak selalu berjalan ketika Anda menggunakan Vim dari terminal, terutama jika Anda menggunakan tmux atau layar. Anda harus menguji ini dulu dengan menggunakan :au FocusLost :echoerr "Focus lost!".

Sejauh yang saya tahu tidak ada solusi yang baik jika autocommand ini tidak bekerja untuk Anda. Menggunakan acara lain (seperti CursorHold) tampaknya bermasalah bagi saya karena masalah waktu yang hampir pasti akan muncul.


Neovim hadir dengan "ShaDa", yang merupakan pengganti sistem viminfo Vim. Salah satu aspek yang lebih baik adalah menggabungkan file dari berbagai instance, dan meskipun tidak secara langsung mendukung sinkronisasi antara beberapa instance ( belum ), ini tampaknya bekerja dengan baik untuk setidaknya satu pengembang Neovim :

augroup shada
  autocmd!
  autocmd CursorHold * rshada | wshada
augroup end

Lihat :help shada-mergingdetail tentang proses penggabungan.

Martin Tournoij
sumber
Catatan: Saya pikir Vim 8 juga memperkenalkan fungsionalitas penggabungan karena menandai waktu perintah yang dimasukkan. Lihat:h viminfo-timestamp
Christian Brabandt
Saya mencobanya di sistem saya sebelum mengirim jawaban ini @ChristianBrabandt, dan sepertinya tidak berfungsi dengan baik. Mungkin saya melakukan sesuatu yang salah.
Martin Tournoij
mungkin bug? akan membutuhkan contoh yang baik yang dapat direproduksi di daftar @ vim-dev
Christian Brabandt