Neovimのステータスラインをlualine.nvimにする

ステータスラインはvimの見た目で一番めを引くところ。
そこをプラグインで管理すると、まったく違う見た目にすることが簡単に。
luaで設定するため、いつものlightlineではなくlualine.nvimに

github.com

インストールはPackerで実施 作成した.config\nvim\lua\plugins.lua

use {
  'nvim-lualine/lualine.nvim',
  requires = { 'kyazdani42/nvim-web-devicons', opt = true }
}

を追記。これはlualineを入れるときにはnvim-web-deviconsも一緒にいれてという設定。

設定ファイルを再読み込みするか、再起動して:PackerInstallを実施したら、2つのプラグインがインストールされる。

lualineの設定は.config\nvim\lua\101-lualine.luaを作成し、まずは公式の基本設定をコピー 次にinit.luaにrequie('101-lualine')の追記も忘れずに。 init.lua

require('001_core')
require('002_keymap')
require('plugins')
require('101-lualine')

101-lualine.lua

require('lualine').setup {
    options = {
        icons_enabled = true,
        theme = 'auto',
        component_separators = { left = '', right = ''},
        section_separators = { left = '', right = ''},
        disabled_filetypes = {},
        always_divide_middle = true,
        globalstatus = false,
    },
    sections = {
        lualine_a = {'mode'},
        lualine_b = {'branch', 'diff', 'diagnostics'},
        lualine_c = {'filename'},
        lualine_x = {'encoding', 'fileformat', 'filetype'},
        lualine_y = {'progress'},
        lualine_z = {'location'}
    },
    inactive_sections = {
        lualine_a = {},
        lualine_b = {},
        lualine_c = {'filename'},
        lualine_x = {'location'},
        lualine_y = {},
        lualine_z = {}
    },
    tabline = {},
    extensions = {}
}

この設定が適用されるとこんな感じ

lualine適用後

ステータスラインのアップ

Neovimのプラグイン管理Packer.nvim

Packer.nvimのインストール

vim-plugやdeinが有名なプラグインマネージャですが、luaオンリーでいくならPacker.nvimしかない。

github.com

色々調べたけど、がっつり設定を書いて、速い環境を構築するならdein よくわからないけど、簡単にやりたいならvim-plug フォルダにプラグインをいれるだけの方法ももちろんある

とりあえず、luaのみで環境構築するなら、これが簡単そうなのでいれてみた。 やり方はまずは公式が正義。 Windows環境でのインストールはPowerShell画面で

git clone https://github.com/wbthomason/packer.nvim "$env:LOCALAPPDATA\nvim-data\site\pack\packer\start\packer.nvim"

このときインストールフォルダが$env:LOCALAPPDATAの設定になっている。 WindowsでXDG_DATA_HOMEの設定をしていても、こんな風に案内しているのも多いので、XDG_DATA_HOMEとLOCALAPPDATAは同じパスにしておくと混乱がない。

続いてPackerの設定を書き込むために、 .config/nvim/lua フォルダに plugins.luaファイルを作成。拡張子はともかくファイル名は自由。 このファイル名をinit.luaに書き込むことだけは忘れないように。

init.lua

require('001_core')
require('002_keymap')
require('plugins')

plugins.lua

vim.cmd [[packadd packer.nvim]]
return require('packer').startup(function()    
   use{ 'wbthomason/packer.nvim', opt = true}
end)

vimを再起動して、:PackerInsallを実行するといきなりpacker.nvimを削除するか?と聞かれる。 これはインストール時の内容がコンフィグには書いてないから。 Packerはコマンドを実行したときだけ動けばいいので、startフォルダに入れず、optフォルダに入れるように設定している。 この記載内容は公式からとってきた。 なので、コマンドを実行すると、
起動時に読み込まれる AppData\Local\nvim-data\site\pack\packer\ start
ではなく、
必要なときに呼び出す AppData\Local\nvim-data\site\pack\packer\ opt
の中にPacker.nvimが配置される。

init.lua を作る

Neovimの設定はinit.vimでも問題なく動くけども、vimscriptではなくluaを使って記載するinit.luaで作成するようになってます。

自分のホーム(windowsではc:\Users[ユーザー名])に.configフォルダを作成し、その中にnvimフォルダ、さらにluaフォルダを作成。

 .config 
 └─nvim
     ├─init.lua
     └─lua(フォルダ)

それからnvimでinit.luaを作成する。

require('001_core')
require('002_keymap')
require('plugins')

通常init.luaに大量に書き込むんだけど、役割を分けて管理することに。

init.luaは呼び込むファイルの記載。それぞれinit.luaと同じ階層にあるluaフォルダ内にあるファイルを読み込んでという指示。 luaにある3つのファイルを指定してる。

luaフォルダには設定ファイルを作っていく。

こんな状態

├─lua
│      001_core.lua
│      002_keymap.lua
│      plugins.lua

001_core.luaには基本設定

-- 表示
-- -番号表示
vim.opt.number = true
-- -特殊文字表示
vim.opt.list = true
vim.opt.listchars = {tab='>-', trail='*', nbsp='+'}
-- -エラー時の音を画面表示に
vim.opt.visualbell = true
-- -括弧の連携
vim.opt.showmatch = true
vim.opt.matchtime = 1
-- -ヘルプファイル
vim.opt.helplang = 'ja', 'en'
-- -tabバーの表示
vim.opt.showtabline = 2


-- 入力時
-- -インデントをC言語風に
vim.opt.smartindent = true
-- -タブ文字
vim.opt.expandtab = true
vim.opt.tabstop = 4
vim.opt.shiftwidth = 4

-- 検索
-- -大文字無視
vim.opt.ignorecase = true
-- -大文字で検索したら区別をつける
vim.opt.smartcase = true
-- -検索が末尾までいったら先頭から検索
vim.opt.wrapscan = true

-- カーソル移動
-- - 行を跨いでの移動
vim.opt.whichwrap = 'b', 's', 'h', 'l', '<', '>', '[', ']'
-- - 削除時の対象
vim.opt.backspace = 'start', 'eol', 'indent'

-- ファイル環境
-- -フォーマット
vim.opt.fileformats = 'dos', 'unix', 'mac'

-- クリップボード連携
vim.opt.clipboard:append({unnamedeplus = true})

-- マウス有効
vim.opt.mouse = 'a'

002_keymap.luaにはキーマップ関連

-- vim.keymap.set(mode, lhs, rhs, options)

-- set s key to Window moving.
vim.keymap.set('n', 's', '<NOP>')
-- set s+hjkl move to other window
vim.keymap.set('n', 'sj', '<C-w>j')
vim.keymap.set('n', 'sk', '<C-w>k')
vim.keymap.set('n', 'sl', '<C-w>l')
vim.keymap.set('n', 'sh', '<C-w>h')
-- set s+sv separate window
vim.keymap.set('n', 'ss', '<C-w>s')
vim.keymap.set('n', 'sv', '<C-w>v')
-- set s+nptT move tab
vim.keymap.set('n', 'sn', 'gt')
vim.keymap.set('n', 'sp', 'gT')
vim.keymap.set('n', 'st', ':<C-u>tabnew<CR>')
-- set s+qQ kill buffer or close window
vim.keymap.set('n', 'sq', ':<C-u>q<CR>')
vim.keymap.set('n', 'sb', ':<C-u>bd!<CR>')

-- set ESC+ESC Clear Search hilight
vim.keymap.set('n', '<ESC><ESC>', ':<C-u>set nohlsearch!<CR>')

調べていると、luaをつかったkeymapの設定には vim.api.nvim_set_keymap を使うパターンと vim.keymap.set を使うパターンがある。

vim.api.nvim_set_keymapはnvimが0.5のころに作られたものでいまはvim.keymap.setを使うとのこと。 ・参考 [noob] vim.keymap.set vs. vim.api.nvim_set_keymap. Key binding questions. Hydra? : neovim

feat(lua): add vim.keymap · neovim/neovim@6d41f65 · GitHub

plugins.luaにはパッケージ管理を記載していく

これは次の記事に。

Neovimの設定を1から

なんとなく興味本位でNeovimを使ってたけど、一番の違いを理解してなかった。

init.vimからinit.luaになってluaで書くように変わってたのね。

 

いろいろ見ながらやってみたけど、どれもがvimスクリプトからの移行ばかりだったので、1からluaで作成する場合にどうするのか自分のためのメモとして残しておこう。

 

対象は

  • OS:Windows10
  • Vim:Neovim 0.7
  • GUI:goneovim
  • パッケージマネージャ:Packer.nvim

の組み合わせ。

 

Neovimのインストール

Neovimのインストールはwingetを使用。

winget ツールを使用したアプリケーションのインストールと管理 | Microsoft Docs

wingetは11にも10にもインストールされている。ないならMicrosoftStoreから入れればいい。

Microsoft Apps このアプリインストーラーってのがwingetのこと。

 

wingetを使うのはPowerShellから。

winget search neovim

と入力すると。

名前   ID            バージョン ソース
---------------------------------------
Neovim Neovim.Neovim 0.7.0      winget

 

と表示されるので

winget install Neovim.Neovim

でインストールは完了

 

WIngetを使用した場合にPATHがおかしかった

c:¥Program Files¥neovim\bin と表記されたせいでうまくPATHが通ってない。(¥は全角表記)

ユーザーのPathに正しくいれても上記のが優先されておかしい状態に。

しょうがないので、scoopを使う

#scoop bucket add versions

#scoop install neovim-nightly goneovim-nightly

でインストールを実施

環境設定

NeovimはmacLinuxで使用するとXDG Base Directoryを利用して設定ファイル関係がまとめられるのに、Windowsでは~/AppData/Local/nvim/ と決められてる。

ここに設定ファイルとかいろいろ置けばいいんだろうけど、設定ファイルは~/.configにまとめたいので環境変数を設定する。

設定するのは4つ

  • neovimのpath。なぜかwingetでinstallしてもpathが追加されてなかったので、"C:\Program Files\Neovim\bin"をpathに追加
  • XDG_CONFIG_HOME ここに設定ファイルを置く ~/.config/nvim
  • XDG_DATA_HOIME プラグイン関係はここ ~/Appdata/Local/nvim-data
    プラグインがこのフォルダを指定するのが多いから、ここにしておく
  • XDG_CACHE_HOME 一時ファイルの置き場はここ ~/AppData/Local/Temp/neovim

$env:HOME=$env:HOMEDRIVE + $env:HOMEPATH
$env:XDG_CONFIG_HOME="$env:HOME\.config"
New-Item $env:XDG_CONFIG_HOME -ItemType Directory

$env:XDG_CACHE_HOME="$env:TEMP\neovim\"
New-Item $env:XDG_CACHE_HOME -ItemType Directory

$env:XDG_DATA_HOME="$env:\LOCALAPPDATA"
New-Item $env:XDG_DATA_HOME -ItemType Directory 

#環境変数を登録
[Environment]::SetEnvironmentVariable('XDG_CONFIG_HOME',$Env:XDG_CONFIG_HOME,'User')
[Environment]::SetEnvironmentVariable('XDG_CACHE_HOME',$Env:XDG_CACHE_HOME,'User')
[Environment]::SetEnvironmentVariable('XDG_DATA_HOME',$Env:XDG_DATA_HOME,'User')

 

GUIのインストール

前回の記事にはまだ追記してなかったけど、いいのを見つけた

github.com

見た目は文句なし!あとはwindowsでもXDG_CONFIG_HOMEを見てほしい。

サイズが44MBあるけど、バイナリ1個とヘルプファイルのみ。neovimへのpathが通っていれば、ダブルクリックするだけでOK

これは、透過とボーダーレスの設定をしたのみ。日本語入力も問題がない。

 

これでNeovimをWindowsで使う準備ができた。

次はinit.luaを1から設定した内容について記載。

NeovimのGUI比較・Windows版

(2020/6/22 nvyとgoneovimを追記しました) (2023/6/10 Neovideの最新版をチェック)

Neovimは基本ターミナルでの活用が基本で、GUIはオプションといったイメージがあります。そうは言ってもドラッグ&ドロップやりたいし、GUIの利点も享受したいのです。

そこで、NeovimのGUI環境がどうなってるのか調べてみました。

まずは、リスト。

github.com

いっとき見ない内に増えすぎじゃね?

この中から、余分な機能がない、シンプルな画面構成であること、Windowsで使えること、コンパイルを自分でやらなくてもバイナリが用意されていることを基準に現状みてみた。

neovim-qt

github.com

neovim のGUIといったらまずこれ。
最近は同梱されてるので、何も考えずに使える。
というか、他のを検証している間、これがあることに気づいてなかった。
使ってみて、一番問題がなさそう。

nvui

github.com

Neovimに移行しようかと思ったGUI
とにかくいろんな点においてクール。
でも日本語入力で、変換中の文字が表示されない。これから検討していくとのことで、これからに期待。 2023/06/10 追記  長期間更新がない

neovide

github.com

アニメーションカーソルのデモ画面にひかれる人もいるんじゃないかなというSimpleGUI。RUST製ということで、速いんじゃないかと勝手に思い込んで試してみた。
やっぱり日本語が厳しい。Isuueみたら、その辺よく分からないから教えてほしいと書いてあった。ほんとは自分でも書いて、プルリク出すのをやってみたいよなぁ。
2023/06/10 追記  インストールパッケージができてた。

Neovide - Neovide

 インストールは非常に楽だけど、インライン入力ができない状態。これは解決してない模様。かっこいいのは変わりない。

neoray

github.com

これのいいところはexeファイル一つだけ。go製。アニメーションカーソルはないみたい。そして日本語のインライン入力ができない点は同じ。 2023/06/10追記  1年近く更新してないな

nvy

github.com

C++で書かれたシンプルなバイナリ。日本語IMEにはきっちり対応しているし、なによりすごいのは142kbというすごい小ささ。 画面をかっこよく飾ることはできないけど、GUIで使うのに必要な機能はきちんと揃ってる。

goneovim

github.com

なんでこれを記載してなかったのかがわからないぐらい大本命だった。 バイナリサイズは結構大きいけど、以下のメリットがある。

  • 透過対応
  • タイトルバーも一体化
  • IME問題なし
  • その他の追加機能もたっぷり
  • XDG_CONFIG_HOMEも対応
  • scoopで安定版もnightlyもインストール可能
    透過設定済み。lualineとalpha-nvimプラグイン適用中

 まとめると。

名称 言語 メリット 現状 SKK
neovim-qt Qt 最初から同梱 なんら問題がない もちろんいける
nvui C++, Qt ほんとカッケー IME関係の表示が厳しい 使える
neovide RUST アニメーションカーソルのデモは一見の価値あり これもIME厳しい 問題なし
Neoray Go バイナリ1個だけ IMEの表示は厳しい 大丈夫!
nvy C++ 最小クラスで必要十分 IMEもばっちり SKKもOK
goneovim Go カッコいい! IME無問題 そろそろIMEでいいかな

結論!neovimではSKK使っておけば日本語の問題回避できて、問題なし!

クールなGUIを使いたい人にはSKK使おう!ということで、 github.com

 結論変更

goneovimを使えば、neovim快適に使えるし、カッコよくできるよ!

Nvuiの困った点

Nvuiの設定を色々やっていたけど、困った点が

  1. 日本語の変換時に候補が表示されない。これはSKKeltonとか使えばいいのかもしれないけど、ちょっと不便。

  2. カーソルのアニメーション設定をしていると、カーソルの表示位置がずれてくる。Isuueにも出ていたけど、アニメーションをOFFにしたら解決するというのは、このGUIのカッコよさを失うだけじゃないだろか。

コマンドを入力するPopup画面の設定とか、楽しみにしてたけど、ちょっと解決方法が見つかるまで待機。

別のGUIにいってみよう。

NeoVimのGUI nvui のインストール

NeoVimは基本ターミナル上で使うようになってる。 それだと寂しいので、いろんな環境で使えるようGUIの開発も色々と。

その中で今回選んだのはこちら

github.com

なにがいいかというととにかくかっこいい。

起動時のgif画像撮ってみたけど、カーソルがヌルっと移動する気持ちよさが全然再現できてない。 f:id:homaju:20220227113514g:plain

さらに画面透過。ターミナルアプリは基本だろうけど、タイトルバーまで色々と設定できるきもちよさ!

f:id:homaju:20220227111631g:plain
透過の設定

vimのコマンドから画面設定を変更できるようになっている。

つまりvimrcに書けばいけるってこと(かも?) タイトルバーを表示しない「Frameless」モードにして気づいたけど、タイトルバーの表示内容も色々と設定ができる。 これは本当にカッコよくて、面白い。

インストールも圧縮ファイルを解凍するだけ

f:id:homaju:20220227112413p:plain
githubのサイト
サイトを開いたら、最新版のリリースのリンクをクリック(赤く囲んだところ)

開いたら「nvui-win64.zip」ファイルをダウンロード

f:id:homaju:20220227112620p:plain
zipの場所

ダウンロードして、解凍して、作成されたフォルダの中になるbinフォルダの中にあるnvui.exeを実行するだけ。

もちろんnvimにパスが通っている必要がある。

見た目だけで心躍るようなGUIが見つかったのが非常に嬉しい。