Bagaimana saya bisa mendefinisikan lipat sintaks vim untuk kode sumber Informix 4GL?

0

Saya menggunakan vim untuk mengedit kode sumber Informix 4GL yang memiliki sintaks semacam ini:

FUNGSI
  UNTUK ...
  ...
  SELESAI UNTUK
AKHIR FUNGSI

Saya ingin melipat fungsi menggunakan za zM dll

Ini bekerja

  : set foldmarker = FUNCTION, END \ FUNCTION
  : atur foldmethod = marker

Namun kata kunci juga bisa dalam huruf kecil dan idealnya saya juga ingin melipat MAIN..END MAIN, jadi spidol tidak dapat melakukan ini.

Saya mencoba

: syn region myFun start = "FUNCTION" end = "END FUNCTION" lipatan transparan
: set foldmethod = sintaks

tapi itu tidak berpengaruh. Saya sudah memiliki file sintaks yang menyoroti warna dan :synmenunjukkan myFuntermasuk dalam definisi sintaks.

Bagaimana cara mengonfigurasi lipatan sintaksis kasus-independen FUNCTION ... END FUNCTION dan MAIN..END MAIN?


Pembaruan: Saya telah mencoba http://www.vim.org/scripts/script.php?script_id=2287 tetapi ada beberapa masalah:

  • Lipatan pada tingkat detail saya tidak ingin ( IF, FOR, WHILE, ...)
  • Ini mengasumsikan ENDpernyataan dimulai pada baris baru (jadi IF a<b call c() END IFlipat ke EOF)
  • Itu dianggap SELECT * FROM table \n FOR UPDATEsebagai awal dari sebuah FORpernyataan

Jadi saya ingin mencoba membuat sesuatu yang lebih sederhana terlebih dahulu.

RedGrittyBrick
sumber
Bahasa apa ini?
digitxp
Informix 4GL. Saya telah menemukan file sintaks untuk itu tetapi melipat lebih dari yang saya inginkan (pernyataan IF), memiliki bug (misalnya ketika "END IF" pada baris yang sama dengan "IF", atau menghitung "SELECT * FROM table FOR UPDATE" sebagai awal dari UNTUK loop) dan tidak melipat FUNGSI! (meskipun file tersebut tampaknya memiliki kode untuk fungsi lipat)
RedGrittyBrick
Apakah kamu sudah mencoba set foldmethod=indent?
romainl
@romainl: Saya belum tetapi saya miliki sekarang. Ini tidak ideal untuk saya tetapi bermanfaat. Terima kasih.
RedGrittyBrick

Jawaban:

1

Saya pikir Anda harus mendefinisikan fungsi lipat Anda sendiri, sehingga Anda akan memiliki lebih banyak kontrol atas apa yang dilipat ketika. Fungsi lipatan berikut terlipat function/ end functiontidak sensitif, dan harus mudah disesuaikan untuk persyaratan lebih lanjut:

function! InformixFold()
  let line      = getline(v:lnum)
  let prev_line = getline(v:lnum-1)

  if match(line, '^\s*function\s*$') >= 0
    return 1
  elseif match(prev_line, '^\s*end\s*function\s*$') >= 0
    return 0
  else
    return "="
endfunction

Kemudian atur foldmethodke exprdan foldexprke fungsi:

set foldmethod=expr
set foldexpr=InformixFold()

Lihat help fold-exprlebih lanjut.

"Tangkapan Layar":

- FUNCTION
|   FOR ...
|   ...
|   END FOR
| END FUNCTION

+ +--  5 lines: FUNCTION------------------------------------------------------
Thor
sumber