Lightline, Alternatif Vim Statusline selain Vim-Airline

Diterbitkan: 2019/01/26 Diperbaharui: 2019/03/18
Tips Ulasan Vim

بسم الله الرحمن الرحيم

Latar Belakang Masalah

Malam tadi, 2019/01/25, tiba-tiba saja saya merasa Vim (teks editor favorit saya) terasa lambat sekali saat proses startup.

Saya dapat menyadari kejanggalan ini karena reflek saya setiap sehabis menjalankan perintah $ vim nama_file selalu menekan tombol J. Secara bersamaan, cursor line yang terdapat di dalam Vim sama sekali tidak bergerak.

Setelah saya amati, statusline yang dihandle oleh vim-airline mengalami delay saat proses startup ini.

Coba perhatikan perbandingan Vim pada user biasa dan pada user root di bawah ini.

gambar_1

Gambar 1 - Perbandingan startup Vim pada root dan Vim pada user

Sisi kanan adalah Vim pada user biasa, perhatikan delay yang terjadi pada Vim-Airline saat proses startup berlangsung. Bandingkan dengan sisi kiri, yaitu Vim pada root.

User biasa : Statusline terlambat keluar setelah bufferline

User root  : Statusline berbarengan keluar bersama bufferline

Delay yang dialami oleh statusline pada proses startup ini dapat semakin molor apabila file yang dibuka memiliki baris yang panjang dan belum terdapat cache atau ada kondisi lain lagi (belum dapat memastikan).

Karena alasan tersebut saya memutuskan untuk memigrasikan vim-airline dan mencari alternatif statusline yang lain.

Pemecahan Masalah

Setelah mencoba beberapa statusline, pilihan saya jatuh pada itchyny/lightline.

Dan untuk menghandle bufferline, saya menggunakan mengelbrecht/lightline-bufferline.

Berikut ini adalah gambar perbandingan tampilan antara Vim-Airline versus Lightline dan Lightline-Bufferline.

gambar_2

Gambar 2 - Vim-Airline (Kiri), Lightline (Kanan)

gambar_7

Gambar 3 - Startup dengan Vim-Airline

gambar_8

Gambar 4 - Startup dengan Lightline

gambar_5

Gambar 5 - Vim-Airline

gambar_6

Gambar 6 - Lightline

Instalasi

Saya menggunakan plugin manager vim-plug.

Plug 'itchyny/lightline.vim'
Plug 'mengelbrecht/lightline-bufferline'

Konfigurasi

Lightline

Pada konfigurasi lightline ini saya hanya menambahkan:

  1. Colorscheme
  2. Menampilkan git-branch (membutuhkan vim-fugitive)
  3. Menggunakan simbol powerline
  4. Menambahkan konfigurasi buffer dengan menggunakan lightline-bufferline
  5. Mengkostumisasi tabline sebelah kiri (atas)

Tambahkan konfigurasi di bawah pada ~/.vimrc.

let g:lightline = {
\   'colorscheme': 'solarized',
\   'active': {
\     'left':[[ 'mode', 'paste' ],
\             [ 'gitbranch', 'readonly', 'filename', 'modified' ]]
\   },
\   'component': {
\     'lineinfo': ' %3l:%-2v',
\   },
\   'component_function': {
\     'gitbranch': 'fugitive#head',
\   }
\}
let g:lightline.separator = {
\   'left': '', 'right': ''
\}
let g:lightline.subseparator = {
\   'left': '', 'right': ''
\}
let g:lightline.tabline = {
\   'left': [['buffers']],
\   'right': [['close']]
\}
let g:lightline.component_expand = {
\   'buffers': 'lightline#bufferline#buffers'
\}
let g:lightline.component_type = {
\   'buffers': 'tabsel'
\}
[ ! ] Perhatian

Beberapa karakter Powerline mungkin mengalami gagal rendering pada Browser. Namun apabila dicopy-paste ke Terminal, tetap dapat ditampilkan dengan benar.

Apabila tidak berhasil, coba copy-paste secara manual output dari command di bawah ke dalam .vimrc di atas.

$ echo -e "\ue0a1 \ue0b0 \ue0b1 \ue0b2 \ue0b3"

Untuk melihat colorscheme dapat menggunakan :h g:lightline.colorscheme.

Berikut ini adalah daftar colorscheme yang tersedia:

Currently, wombat, solarized, powerline, jellybeans, Tomorrow,
Tomorrow_Night, Tomorrow_Night_Blue, Tomorrow_Night_Eighties,
PaperColor, seoul256, landscape, one, darcula, molokai, materia,
material, OldHope, nord, 16color and deus are available.

Lightline-Bufferline

Buat apa kita perlu Lightline-Bufferline ?

Apabila kita hanya menggunakan Lightline saja, maka buffer yang terdapat di pojok kiri atas hanya akan ditampilkan satu buah. Karena ini, kita memerlukan Lightline-Bufferline untuk menampilkan buffer yang terbuka.

Untuk mengaktifkan bufferline (tabline), tambahkan di bawahnya.

set showtabline=2  " Show tabline
set guioptions-=e  " Don't use GUI tabline

Kemudian tambahkan konfigurasi untuk lightline-bufferline, namun ini hanya optional saja, karena secara default tampilan dari lightline-bufferline sudah bagus.

Value yang saya gunakan hampir rata-rata adalah value default kecuali unnamed saya ganti menjadi [NO NAME], defaultnya adalah *.

let g:lightline#bufferline#unnamed = "[NO NAME]"
let g:lightline#bufferline#filename_modifier= ":."
let g:lightline#bufferline#more_buffers = "..."
let g:lightline#bufferline#modified = " +"
let g:lightline#bufferline#read_only = " -"
let g:lightline#bufferline#shorten_path = 1
let g:lightline#bufferline#show_number = 0

Modifikasi

Beberapa modifikasi yang saya lakukan adalah,

Colorscheme

Modifikasi terhadap solarized colorscheme, saya membuat cetak tebal pada mode dan beberapa bagian.

$ vim .vim/plugged/lightline.vim/autoload/lightline/colorscheme/solarized.vim
...
let s:p.normal.left = [ [ s:base03, s:base1, 'bold' ], [ s:base03, s:base00 ] ]
let s:p.normal.right = [ [ s:base03, s:base1, 'bold' ], [ s:base03, s:base00 ] ]
let s:p.inactive.right = [ [ s:base03, s:base00 ], [ s:base0, s:base02 ] ]
let s:p.inactive.left =  [ [ s:base0, s:base02 ], [ s:base0, s:base02 ] ]
let s:p.insert.left = [ [ s:base03, s:yellow, 'bold' ], [ s:base03, s:base00 ] ]
let s:p.replace.left = [ [ s:base03, s:red, 'bold' ], [ s:base03, s:base00 ] ]
let s:p.visual.left = [ [ s:base03, s:green, 'bold' ], [ s:base03, s:base00 ] ]
let s:p.normal.middle = [ [ s:base1, s:base02 ] ]
let s:p.inactive.middle = [ [ s:base01, s:base02 ] ]
let s:p.tabline.left = [ [ s:base03, s:base00, 'bold' ] ]
let s:p.tabline.tabsel = [ [ s:base03, s:base1, 'bold' ] ]
let s:p.tabline.middle = [ [ s:base0, s:base02 ] ]
let s:p.tabline.right = copy(s:p.normal.right)
let s:p.normal.error = [ [ s:base03, s:red, 'bold' ] ]
let s:p.normal.warning = [ [ s:base03, s:yellow, 'bold' ] ]

Tabline

Modifikasi yang saya lakukan adalah merubah dan menambah tabline sebelah kanan atas. Yang sebelumnya hanya menampilkan tanda X, saya rubah menjadi menampilkan BUFFERS dan BANDITHIJO.COM.

Terdapat 3 baris yang saya modifikasi.

$ vim .vim/plugged/lightline.vim/autoload/lightline.vim


Periksa pada line 97.

\   'tabline': {
\     'left': [['tabs']],
\     'right': [['string1'], ['string2']]
\   },

Saya merubah nilai close menjadi string1 dan string2.


Periksa pada line 109.

\     'lineinfo': '%3l:%-2v', 'line': '%l', 'column': '%c', 'string1': '%999X BANDITHIJO.COM ', 'string2': '%999X BUFFERS ', 'winnr': '%{winnr()}'

Saya mengganti 'close': '%999X X' menjadi seperti di atas.


Perhatikan line 120.

\   'component_type': {
\     'tabs': 'tabsel', 'string1': 'raw', 'string2': 'raw',
\   },

Saya mengganti 'close': 'raw' menjadi seperti di atas.


Setelah merubah 3 baris pada file lightline.vim di atas, jangan lupa mengganti nilai 'tabline' pada bagian 'right': yang ada pada ~/.vimrc.

Ubah dari close menjadi string1, dan string2.

let g:lightline.tabline = {
\   'left': [ ['buffers'] ],
\   'right': [ ['string1'], ['string2'] ]
\}

Hasilnya

gambar_7

Gambar 7 - Lightline + Lightline-Bufferline

gambar_8

Gambar 8 - Tampilan saat tidak sibuk

Tambahan Fugitive, Readonly dan Modified

Kita juga dapat menambahkan simbol untuk vim-fugitive dan readonly agar lebih mirip lagi dengan vim-airline.

Perhatikan baik-baik, saya melakukan modifikasi pada beberapa bagian. Bagian yang saya marking kuning adalah bagian-bagian yang saya modifikasi dari konfigurasi sebelumnya (di atas).

let g:lightline = {
\   'colorscheme': 'solarized',
\   'active': {
\     'left':[[ 'mode', 'paste' ],
\             [ 'fugitive', 'readonly', 'filename', 'modified' ]]
\   },
\   'component': {
\     'lineinfo': ' %3l:%-2v',
\   },
\   'component_function': {
\     'fugitive': 'LightlineFugitive',
\     'readonly': 'LightlineReadonly',
\     'modified': 'LightlineModified',
\   }
\}
let g:lightline.separator = {
\   'left': '', 'right': ''
\}
let g:lightline.subseparator = {
\   'left': '', 'right': ''
\}
let g:lightline.tabline = {
\   'left': [['buffers']],
\   'right': [['string1'], ['string2']]
\}
let g:lightline.component_expand = {
\   'buffers': 'lightline#bufferline#buffers'
\}
let g:lightline.component_type = {
\   'buffers': 'tabsel'
\}

function! LightlineModified()
    return &modified ? '●' : ''
endfunction

function! LightlineReadonly()
    return &readonly ? '' : ''
endfunction

function! LightlineFugitive()
    if exists('*fugitive#head')
        let branch = fugitive#head()
        return branch !=# '' ? ' '.branch : ''
    endif
    return ''
endfunction

Pada bagian 'right': [['string1'], ['string2']] juga sudah saya lakukan modifikasi dari yang sebelumnya 'right': [[close]] pada bagian Tabline.

Saya juga melakukan modifikasi terhadap modified indikator yang tadinya + saya ubah agar lebih terlihat jelas menjadi .

Hasilnya, gambar_9

Gambar 9 - Dengan tambahan powerline symbol untuk master dan readonly

Pesan Penulis

Saya memutuskan untuk bermigrasi bukan berarti vim-airline tidak bagus dan berat. Hanya saja, pada kasus saya, saya mengalami “startup delay” yang entah dari mana datangnya tiba-tiba menghampiri Vim saya.

Kesempatan ini saya pergunakan untuk berekplorasi dengan statusline plugin yang lain, selain dari vim-airline yang tersohor. Hehehe.

Sebaik-baik dokumentasi adalah yang ditulis oleh developer pengembang dari masing-masing plugin. Silahkan kunjungin GitHub pages dari masing-masing plugin untuk penjelasan yang lebih kompleks.

Referensi

  1. github.com/itchyny/lightline.vim
    Diakses tanggal: 2019/01/26

  2. github.com/mengelbrecht/lightline-bufferline
    Diakses tanggal: 2019/01/26

Penulis

logo_author

BanditHijo adalah nama pena saya – meminjam istilah keren dari para penulis. Teman-teman menyebut saya sebagai GNU/Linux Enthusiast. Saya memang gemar mengutak-atik sistem operasi ini. Bukan karena hobi tapi karena saya perlu untuk menggunakannya. Hehe.

- Rizqi Nur Assyaufi