Saya mencoba menulis fungsi Lua untuk Neovim yang, dengan bantuan beberapa perintah Bash, memeriksa apakah suatu proses sedang berjalan; jika sedang berjalan, tutup, dan jika tidak, jalankan instance baru.

Inilah yang berhasil saya tulis sejauh ini:

isrunning = vim.cmd([[!pgrep -u $UID -x livereload > /dev/null && echo "true" || echo "false"]])
print(isrunning)

if isrunning == "true" then
  print('Closing Livereload...')
  vim.cmd('!killall livereload')
else
  print('Opening Livereload...')
  vim.cmd('!cd build; livereload &; firefox http://localhost:35729/"%<.html"')
end

Masalahnya adalah bahwa meskipun livereload sudah berjalan dan nilai isrunning adalah "true", bagian pertama dari pernyataan if tidak pernah berjalan, hanya setelah else. Apa yang perlu saya ubah untuk memperbaikinya?


Update: Berikut adalah output dari :luafile %, ketika kode di atas dijalankan di Neovim 0.5.0:

:!pgrep -u $UID -x livereload > /dev/null && echo "true" || echo "false"
true

:!cd build; livereload &; firefox http://localhost:35729/"livereload.html"

opening...

Itu membuat saya berpikir bahwa baris kedua, true, harus merupakan output dari perintah print(isrunning). Setelah berdiskusi di bagian komentar, saya menyadari bahwa ini bukan masalahnya.

Ini hasilnya ketika saya mengubah perintah print menjadi print("Answer: " .. isrunning .. "Length: " .. isrunning:len())

:!pgrep -u $UID -x livereload > /dev/null && echo "true" || echo "false"
true

Answer: Length: 0
:!cd build; livereload &; firefox http://localhost:35729/"livereload.html"

opening...

Jadi, Neovim dengan benar menunjukkan output !pgrep -u $UID -x livereload > /dev/null && echo "true" || echo "false", tetapi output tersebut tampaknya tidak disimpan dalam variabel isrunning.

0
user247824 8 Mei 2021, 15:30

2 jawaban

Jawaban Terbaik

Saya akhirnya menemukan solusi, yang ada dua:

  1. Menggunakan kombinasi io.popen dan pegangan file, seperti yang tertulis di jawaban ini untuk pertanyaan lain. Ini memungkinkan nilai echo untuk dibaca dari Lua.
  2. Menggunakan echo -n untuk menekan karakter baris baru, seperti yang disebutkan oleh Piglet dalam jawaban di sini.

Dengan perubahan ini, inilah kode terakhir:

handle = io.popen([[pgrep -u $UID -x livereload > /dev/null && echo -n "true" || echo -n "false"]])
isrunning = handle:read("*a")
handle:close()

if isrunning == "true" then
  print('closing...')
  vim.cmd('!killall livereload')
else
  print('opening...')
  vim.cmd('!cd build; livereload &; firefox http://localhost:35729/"%<.html"')
end
0
user247824 12 Mei 2021, 19:13

Jika isrunning adalah "true" Anda akan memasukkan cabang if, tetapi jelas bukan itu masalahnya.

echo menambahkan baris baru tambahan sehingga isrunning lebih cenderung menjadi "true\n" yang tentu saja tidak sama dengan "true".

Gunakan echo -n untuk menekan baris baru yang tertinggal atau periksa vs nilai yang benar atau gunakan string.find atau string.match sebagai ganti ==

Dari manual bash:

echo echo [-neE] [arg …] Keluarkan argumen, dipisahkan oleh spasi, diakhiri dengan baris baru. Status pengembalian adalah 0 kecuali terjadi kesalahan penulisan. Jika -n ditentukan, baris baru di belakangnya adalah ditekan...

3
Piglet 8 Mei 2021, 14:32