nvim vim ex ed

vim

先月の亊になるけど、 「Vim」がスクリプト言語を一新 ~約6年ぶりのメジャーバージョンアップv9.0が公開 こんな広報が出てた。これを読むと内部で使ってる言語を一新しましたとな。そうか、それなら試してみるか。

どんなフレーバーが有るか、OpenBSDのportsに尋ねてみたよ。

Flavors:
        gtk3       - build using the Gtk+3 toolkit (default)
        no_x11     - build without X11 support
        lua        - build with Lua support
        perl       - build with Perl support
        python3    - build with Python3 support
        ruby       - build with Ruby support

エディターがrubyとかをサポートするって、どゆ亊? 今一ピンとこない。世の中のみなさんに聞いてみるか。

VimでモダンなRuby開発環境を構築する

Neovimでのフロントエンド開発環境 2021

編集中のスクリプト(Ruby や Python など)をショートカットキーで実行する

debianに入ってるのは、vim.tinyって亊で機能縮小版だ。

この間インストールしたArch Linuxは、最初からnanoに変ってviを指名しといた。で、その本体はどうよってんで調べたら、

AUTHOR
       William Joy.

       Mark Horton added macros to visual mode and was maintaining version 3.

       This version incorporates changes by Gunnar Ritter.

オイラーはビルを知ってるけど、ウィリアムは知らないぞ。まて、 ウィリアム・ジョイ を調べてみたよ。無駄知識がインクリメントされた。

viを指定したら正統派のviがちゃんと入ってくれるArch Linuxは通だな。

make vim

ならば、vim home へ行って、最新のソースを落してこよう。作成仕様は、余計なGUI無し、かつpython3/rubyのサポートって亊にした。

configure --disable-gui --without-x --enable-python3interp=yes --enable-rubyinterp=yes

数分でオレオレvimが出来上がった。

sakae@pen:/tmp$ vim --version
VIM - Vi IMproved 9.0 (2022 Jun 28, compiled Jul 10 2022 05:56:13)
Included patches: 1-48
Compiled by sakae@pen
Huge version without GUI.  Features included (+) or not (-):
 :
+cmdline_info      +libcall           +python3           +virtualedit
 :
   system vimrc file: "$VIM/vimrc"
     user vimrc file: "$HOME/.vimrc"
 2nd user vimrc file: "~/.vim/vimrc"
      user exrc file: "$HOME/.exrc"
       defaults file: "$VIMRUNTIME/defaults.vim"
  fall-back for $VIM: "/home/sakae/MINE/share/vim"
Compilation: gcc -c -I. -Iproto -DHAVE_CONFIG_H -g -O2 -D_REENTRANT -U_FORTIFY_S
OURCE -D_FORTIFY_SOURCE=1
Linking: gcc -L. -Wl,-z,relro -Wl,-z,now -fstack-protector-strong -rdynamic -Wl,
-export-dynamic -L/usr/local/lib -Wl,--as-needed -o vim -lm -ltinfo -lrt -ldl -L
/usr/lib/python3.9/config-3.9-x86_64-linux-gnu -lpython3.9 -lcrypt -lpthread -ld
l -lutil -lm -lm -lruby-2.7 -lm -L/usr/lib

+python3てなってるんで、サポート機能が組込まれたんだな。そして、コンパイル時のスペックも出てる。けど、醜い。

sakae@pen:/tmp$ ldd ~/MINE/bin/vim
        linux-vdso.so.1 (0x00007ffcbf164000)
        libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fccbce53000)
        libtinfo.so.6 => /lib/x86_64-linux-gnu/libtinfo.so.6 (0x00007fccbce24000)
        librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007fccbce19000)
        libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fccbce13000)
        libpython3.9.so.1.0 => /lib/x86_64-linux-gnu/libpython3.9.so.1.0 (0x00007fccbc888000)
        libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fccbc866000)
        libruby-2.7.so.2.7 => /lib/x86_64-linux-gnu/libruby-2.7.so.2.7 (0x00007fccbc505000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fccbc340000)
        /lib64/ld-linux-x86-64.so.2 (0x00007fccbd362000)
        libexpat.so.1 => /lib/x86_64-linux-gnu/libexpat.so.1 (0x00007fccbc311000)
        libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007fccbc2f4000)
        libutil.so.1 => /lib/x86_64-linux-gnu/libutil.so.1 (0x00007fccbc2ef000)
        libgmp.so.10 => /lib/x86_64-linux-gnu/libgmp.so.10 (0x00007fccbc26e000)
        libcrypt.so.1 => /lib/x86_64-linux-gnu/libcrypt.so.1 (0x00007fccbc231000)

lddコマンドを使って、外側から観察。

help

CTL-] CTL-O で、各種のサブマニュアルを渡り歩くんだな。何となくtag操作の予感がするぞ。 ああ、最後に、それっぽい亊が説明されてた。

日本語のマニュアルが有るって、人口が多い証拠だな。先人に感謝。

help - Vim日本語ドキュメント

netrw (file tool)

emacsにはdiredというファイラーが有る。じゃvimは? 2020秋 Vim のファイラー系プラグイン比較

わざわざ時期を指定してる所をみると、オレオレ・ファイラーが出て来る競争分野なんでしょうな。余りいさんでもしょうがないので、デフォで提供されてるのを使うのが筋。

vimの標準ファイラnetrwは普通に良さそうな話し

vim標準のNetrwファイラーの使い方

Hack #189: Emacsのプラグインに対応するVimプラグイン ここでも言及されてるな。

マニュアルを見ると、リモートのファイルを編集するってのが主眼。emacs対抗だな。で、ついでにファイラー機能も押し込めてしまいましたとな。

どんな風に実現されてるのかな? らしいファイルを探して、開いてみるか。

sakae@pen:~/MINE/share/vim/vim90$ find . -name 'netrw*'
./autoload/netrw_gitignore.vim
./autoload/netrwFileHandlers.vim
./autoload/netrw.vim
./autoload/netrwSettings.vim
./plugin/netrwPlugin.vim
./syntax/netrw.vim

らしいファイルがあちこちに散在してるな。色々なプラグインもそうなのかな。取り敢えずご対面してみる。

sakae@pen:~/MINE/share/vim/vim90$ vim `find . -name 'netrw*'`
 :
" netrwSettings.vim: makes netrw settings simpler
" Date:         Aug 12, 2021
" Maintainer:   Charles E Campbell <NcampObell@SdrPchip.AorgM-NOSPAM>
" Version:      17      ASTRO-ONLY
+-- 10 lines: Copyright:    Copyright (C) 1999-2007 Charles E. Campbell --------
+--  3 lines: Mat 4:23 (WEB) Jesus went about in all Galilee, teaching in their
+-- 13 lines: Load Once: -------------------------------------------------------
+--217 lines: NetrwSettings: ---------------------------------------------------
+--  2 lines: Modelines: -------------------------------------------------------

なんじゃい、これは? ひょっとしたらemacsのorg-modeみたいに、畳んであるのか。 折り畳み なんだな。

開きたい所にカーソルを移動して、zoすると開く。zcすると畳んでくれる、ってのが基本。全部を一遍に開くには、zR すればいいんだな。上手に使えば、便利そう。

vim-script

Vim script 書法

vim9script こういう宣言をすると、スピードが速くなる(かも知れない)。 でも、古いやつはそのまま残る予感。

Vim9 script でプラグインを作る だから、宣伝に躍起になってます。簡単だよとね。でも、作法があるだろう。オイラーが知りたい亊は、 Hack #34: Vimのディレクトリ構成 に出てたぞ。

with ruby/python

しっかりrubyやpythonを組み込んだけど、libruby-2.7.so.2.7 とかってどうよ。古いのを捨てられなくなるじゃないですか? いかがなものなんでしょ。

それに、rubyとかで記述したコードがBUGってたら、vimが巻き添えを喰らう亊になりそう。別プロセスで動かした方が良いと思うぞ。兎にも角にも、 ifruby - Vim日本語ドキュメント。 若しルビーならじゃなくて、ルビーのインターフェースって意味ね。

取り敢えず、BUGぽいコードを書いてしまった場合の挙動を確認。無限ループのシュミで、少し居眠りするコード。

puts 'sleeping 15s'
sleep 15
puts 'wakeup now'

rubyを外部コマンドとして実行。途中でCtl-Cした。

:!ruby test.rb
 :
sakae@pen:/tmp$ vim test.rb

sleeping 15s
^CTraceback (most recent call last):
        1: from test.rb:2:in `<main>'
test.rb:2:in `sleep': Interrupt

Command terminated

Interrupt: Press ENTER or type command to continue

この挙動は頷ける。じゃ、rubyをvimの内部言語として実行してみるか。ようするに、 vimが一時的にrubyに変身だ。こうなってしまうとCtl-Cでは止らない。暴走の挙動だ。まあ、言い掛かりだな。

:rubyf ./test.rb
sleeping 15s

でも、ちゃんと時間が経過すると

sleeping 15s
wakeup now
LoadError: cannot load such file -- test.rb
Press ENTER or type command to continue

ちゃんと実行されたにも拘わらず、ファイルが見付かりませんでしたって、どゆ亊? 気を取り直して、vimscriptの代わりをrubyにつとめて貰おう。

:ruby puts Vim::Buffer.current.line

puts 'wakeup now'

Press ENTER or type command to continue

カーソルを3行目に置いて、実行。ちゃんと、バッファーのカーソルがあるデータを取得出来た。まあ、これでvimをrubyから操れる亊が理解出来たけど、使い道はなさそうだ。

neovim

じゃ、vimに見きりを付けて、最近のトレンドneovimに行ってみるか。

Neovim is a project that seeks to aggressively refactor Vim in order to:

 * Simplify maintenance and encourage contributions.
 * Split the work between multiple developers.
 * Enable advanced external UIs without modifications to the core.
 * Improve extensibility with a new plugin architecture.

vimが独自の言語を使うのに対して、nvimは外部の言語に頼るとな。で選んだのはLua言語。それのJIT版とな。慧眼ですよ。

LuaJIT Support
==============

Some Neovim plugins now require LuaJIT. Those plugins won't work on
architectures that have no LuaJIT support.

Performance: x86/x64 ここに、普通のLuaとJITの比較が出てた。うのみには出来無いかもしれないけど、素晴しいパフォーマンス。遅いと評判のpythonも、そのJIT版であるpypyを出すのも納得です。

python vs. pypy

Are the PyPy 3 programs faster?

Is PyPy Really Faster Than Python? Here Are 5 Benchmarks

そんな亊より、入れてみろ。

hyperextensible Vim-based text editor

ソースを取ってきて入れてもいいんだけど、4半期毎にアップデートされるFreeBSDのパッケージに望みを託して、pkg install neovimしてみた。

[sakae@fb ~]$ nvim --version
NVIM v0.7.2
Build type: Release
LuaJIT 2.1.0-beta3
Compilation: /usr/bin/cc -O2 -pipe -DLIBICONV_PLUG -fstack-protector-strong -fno-strict-aliasing -DNVIM_TS_HAS_SET_MATCH_LIMIT -DNVIM_TS_HAS_SET_ALLOCATOR -O2 -pipe -DLIBICONV_PLUG -fstack-protector-strong -fno-strict-aliasing -Wall -Wextra -pedantic -Wno-unused-parameter -Wstrict-prototypes -std=gnu99 -Wshadow -Wconversion -Wdouble-promotion -Wmissing-noreturn -Wmissing-format-attribute -Wmissing-prototypes -Wimplicit-fallthrough -Wno-c11-extensions -Wvla -fstack-protector-strong -fno-common -fdiagnostics-color=always -DINCLUDE_GENERATED_DECLARATIONS -D_GNU_SOURCE -DNVIM_MSGPACK_HAS_FLOAT32 -DNVIM_UNIBI_HAS_VAR_FROM -DMIN_LOG_LEVEL=3 -I/wrkdirs/usr/ports/editors/neovim/work/.build/config -I/wrkdirs/usr/ports/editors/neovim/work/neovim-0.7.2/src -I/usr/local/include -I/usr/include -I/wrkdirs/usr/ports/editors/neovim/work/.build/src/nvim/auto -I/wrkdirs/usr/ports/editors/neovim/work/.build/include
Compiled by root@130i386-quarterly-job-02

Features: +acl +iconv +tui
See ":help feature-compile"

   system vimrc file: "$VIM/sysinit.vim"
  fall-back for $VIM: "/usr/local/share/nvim"

Run :checkhealth for more info

健康チェックを要求されたのでやってみた。nvimを起動して、コマンド投入。

:checkhealth

下記は結果の一部。

nvim: health#nvim#check
========================================================================
## Configuration
  - WARNING: Missing user config file: /usr/home/sakae/.config/nvim/init.vim
    - ADVICE:
      - :help init.vim

provider: health#provider#check
========================================================================
## Ruby provider (optional)
  - INFO: Ruby: ruby 3.0.4p208 (2022-04-12 revision 3fa771dded) [i386-freebsd13]
  - WARNING: `neovim-ruby-host` not found.
    - ADVICE:
      - Run `gem install neovim` to ensure the neovim RubyGem is installed.
      - Run `gem environment` to ensure the gem bin directory is in $PATH.
      - If you are using rvm/rbenv/chruby, try "rehashing".
      - See :help g:ruby_host_prog for non-standard gem installations.
      - You may disable this provider (and warning) by adding `let g:                 loaded_ruby_provider = 0` to your init.vim

診断結果とその対処方法が案内された。初心者にはなかなかの親切設計。vimを入れるかnvimを入れるか迷ったら、nvimを推しますね。随所で補完も利きますし。

nvimは言語系を抱えこまない設計。こうでなくちゃ。まあ、vi系でrubyとかpythonとかが使えるようになっても、何も嬉しい亊が無いんで、どうでもいいことだけど。その代わりluaJITが頑張ってプラグインをサポートしてるんで、それで十分。

emacsはemacs-lispが下支えで動いていて、nvimはluaJITが縁の下の力持ちって覚えておけばいいんだな。

w3m + vim で、(手動)スクレイピング

info ed してたら、面白い用例が出てたので、それをvimに適用してみる。 editorと言ったらemacsでしょと、間口を狭めていないで、広く知見を求めてみると、いいことあるよって実例だ。ああ、edってのはvimとかの元祖ね。

今迄WEBに掲載されてるソースコードを取出して、それを実行する場合、

firefoxで開く
該当するソースをマウスでなそってから、Ctl-c してコピー
cat >sample しといて、貼り付け。最後にCtl-d して完了

という手順をとってた。コードが長大だったり、コードが崩れると用をなさないhaslell言語とかpython言語は、特に注意が必要。見栄えもコードの一部ですってpython語は、こういう理由もあって、好きになれないのよ。

それから、常用してるfirefoxもappleやPayPayから嫌われる今日この頃ですからってのもあるな。生物多用性は賛同するくせに、特定ブラウザーを排除する論理はいただけないぞ。

と言う亊で、それを乗り越える必要が有るな。例えば、前回やったtkinterの例だ。

https://daeudaeu.com/tkinter-calculator/#sample

ここに掲載されてるコードを手動でスクレイピングしてみる。

sakae@pen:/tmp/t$ vim
:r ! w3m -dump https://daeudaeu.com/tkinter-calculator
/import
ma
/main
j
:'a,.w smpl.py
:q!

ちょっとやってる亊を解説。vimを起動して、rで読込み。読込みデータは、shell経由でw3mを使った-dump結果。URLに#とか入っているとvimが文句を言うので注意。

次に、取り込みたいソースの頭出し。普通pythonはimportから始まるよね。そこら辺は適当に画面を手動スキャンして決めてくれ。で、ソースの先頭に、maでマークを付ける。この場合のマークは、a にしたんだけど、a-z のうちの好きな一文字が使える。

次は、ソースの終りを検索。たいがいはmainとかの文字列で検索すればいいと思う。で、コードの最後が見付かったら、jで次の行にカーソルを移動。最初に付けたマークから、今居るカーソル行(.)までを、適当な名前で書出し。

'a は、マークの位置を参照(行番号に変換)するって意味だ。

一つのURLに複数のソースが掲載されてる場合も、この応用で出来るぞ。

なお、先にw3mでURLを開いている場合。Sコマンドで、今の見栄えをファイルの落そう。そして、それをvimで開けばよい。

ed

ネットをうろうろしてたら、Solarsの管理者トレーニングを受けた人の談話が出てた。曰く、emacsはインストールしないと使えないですけど、viなら最初から入っていますんで、どんな時でも使えますよ、とな。更に続けて、viが使えない亊も有るんで、最後の手段として、原始的なedを使えるようになっておきましょう。極めて真っ当な話だな。訓練訓練。

今回は折角なんで、nvimを使って、観光してみる。arch上で実行する。まずはtagファイルの作成だな。今回はctagsでtagsを作る。んだけど、ctagsコマンドが無くてctags.emacsがあった。

それで作成。んが、mainを取り零している。しょうがないので純正のctagsを入れた。そしたら、mainをちゃんと認識した。

-rw-r--r-- 1 sakae sakae  5980 Jul 14 07:32 tags   ;; by cags.emacs
-rw-r--r-- 1 sakae sakae 14417 Jul 14 07:45 tags   ;; by ctags

こんなに差があるって、なんかおかしいな。まあ、純正品を使っておけって亊。

[sakae@arch ed]$ nvim -R *.[ch]

-Rを指定してread onlyモードにした。そして全部を読み込んだ。

:args
[buf.c] ed.h    glbl.c  io.c    main.c  re.c    sub.c   undo.c

どんなやつが読み込まれたか確認。括弧内が今見えてるやつ。移動は :next :prev だ。

:ls
  1  h=  "buf.c"                        line 1
  2 #h=  "ed.h"                         line 1
  3 %a=  "glbl.c"                       line 1
  4      "io.c"                         line 0
  5      "main.c"                       line 0
  6      "re.c"                         line 0
  7      "sub.c"                        line 0
  8      "undo.c"                       line 0

こんな:lsなんてコマンドもある。細かい亊は、 バッファリスト を参照。emacsの C-x C-b 相当だな。そして、バッファー番号を元に :buffer 6 とかやって、飛んでいける。

で、次はtagを作ったご利益に浸る。基本は、

:tag mTAB

とかだ。mで始まるタグ名をTABで補完。どんなのが有るか眺められるので便利。TABを続けて押せば、補完候補が順番に選ばれる。

後は、単語にカーソルを合わせて、Ctl-] で飛んでいく。戻りは、Ctl-o だ。

プログラムの中を移動する (tag)

[sakae@arch ed]$ nvim -p *.[ch]

こんな風に開くとGUIっぽく、上部にファイル名前のタブがつく。まあ、それっぽいって亊です。詳細は、 tabpage - Vim日本語ドキュメント

vimacs

emacs使いは、お遊びで viper-mode なんてやる亊がある。じゃ、vimの人がemacsの振りをしたい時はどうする?

Vimacs : Vim-Improved eMACS: Emacs emulation for Vim

Vimacs - viでEmacsをエミュレート

What is Vimacs? (github)

quickrun.el

vimのプラグインでquickrunってのが、あちこちで紹介されてる。さっとコードを作って、それを直ぐに実行出来る、便利なやつだ。 当然、emacsにも同様なものが用意されてる。

Emacsで開発中のプログラムの実行をチョー簡単にするquickrunがメチャガチャパワーアップしてた件!

quickrun.el

ルービック・キューブのexample.pyを走らせる。python無いぞと言われたので、リンクを作っておいた。

  :
loading phase2_edgemerge table...
Server socket created
Server now listening...

Time out quickrun-process-python(running over 10 second)

quickrun-shellするとshell経由になり、タイムアウトはしなくなる。また、 quickrun-with-arg すると、mini-bufferから引数を渡す亊が出来る。便利だ脳は、人を馬鹿にさせるぞ。スマホの使いすぎに注意しましょう。ああ、オイラーはスマホなんて持っていないから、関係ないか。

(define-key global-map (kbd "C-c r") 'quickrun)
(defvar quickrun-timeout-seconds 30)

を登録した。まあ、C-c C-c で、強制終了出来るから、もっと長めでもいい鴨。


This year's Index

Home