なんでディレクトリに #vim しないの?
Windows版gVimでConsolas+メイリオを使う
はじめに
Windows版gVim1のフォントに、英数字にはConsolas、日本語などその他の文字にはメイリオを使いたい。しかし、Windows版gVimのフォント(guifont
, guifontwide
)にはプロポーショナルフォントを指定することができないため、プロポーショナルフォントであるメイリオを指定することができない。メイリオの代わりにMeiryoKeを使えば目的は達成できるが、フォントファイルの改変にはライセンス上の問題がある。
そこで、MeiryoKeは使わず、gVim側でどうにかすることにした。
結論
FEAT_PROPORTIONAL_FONTS
を有効にしてgVimをビルドすればよい。フォントが等幅かどうかのチェックが行われなくなる。
手順
Kaoriya版のgvim.exe
を置き換える形にする。そのため、あらかじめKaoriya版(g)Vimは使えているものとする。
ビルド環境はVisual Studioがインストールされていてnmake
, rc
等にパスが通っていればよい。この記事ではVisual Studio 2019の"x64 Native Tools Command Prompt for VS 2019"を使っている。
パスやパッチのあて方は環境に合わせて適宜読み替えてほしい。
vimのソースコードを入手
Kaoriya版パッチをあてるために少し前のバージョンに戻す。現在リリースされているKaoriya版ビルドは8.1.1048 (b45125
)なので、そのコミットをチェックアウトする。
d:\work>git clone https://github.com/vim/vim.git
d:\work>cd vim
d:\work\vim>git checkout b45125
Kaoriya版vim相当にする
パッチはKaoriya版のpatch
フォルダに入っている*.diff
を使わせていただく。今回はGit for Windows (msys2)のpatch
を使用した。パッチのうち0001-rich_icon.diff
は適用できなかったのでスキップした。
$ cd /d/work/vim
$ patch -p 1 < /d/work/vim81-kaoriya-win64/patch/0000-kaoriya_marks.diff
:
:
このままビルドしても起動できないので、vim
を使って必要なファイルを更新する2。
d:\work\vim>cd src
d:\work\vim\src>d:\work\vim81-kaoriya-win64\vim.exe -u NONE -i NONE -X -S create_cmdidxs.vim
ビルド
基本的にvim-jpの説明の通りだが、nmake
時にDEFINES=-DFEAT_PROPORTIONAL_FONTS
を指定する。
なお、8.1.1048時点ではICONV=yes
がデフォルト、MBYTE
は常時有効になったため廃止されているので、これらは指定しなくてよいはずだ。
今回はとりあえずConsolas+メイリオさえできればよかったので、LuaやPythonなどは指定していない。
d:\work\vim\src>nmake -f Make_mvc.mak GUI=yes IME=yes DEBUG=no DEFINES=-DFEAT_PROPORTIONAL_FONTS
src
フォルダにgvim.exe
が生成されるので、これをKaoriya版gvim.exe
と差し替える。
また、Kaoriya版のswitches\catalog\utf-8.vim
をswitches\enabled\utf-8.vim
に移動する。
gvimrc
.gvimrc
などgVimが読み込む設定ファイルに以下のように記述する(renderoptions
を設定しない場合は表示上のゴミが発生したりベースラインより下が欠けたりするが、設定するとフォントによってはベースラインの位置が上にずれてしまう)。
"set renderoptions=type:directxset ambiwidth=double
set guifont=Consolas:h14
set guifontwide=メイリオ:h14
さいごに
この方法が通用するのは、メイリオのような非ASCII文字が実際には等幅となっているフォントのみであるので、すべてのフォントについてこの方法で正しく描画できるとは限らない。とはいえたいていの日本語フォントは等幅であると思われる。
Consolas+メイリオ以外のサンプル
ミンニアム (メイリオ日本語部分と同じデザイナーによる明朝体風フォント)
学校や職場で宗教弾圧を受けているvimmerにおすすめのzshrc
vim is GOD
僕の学校の人間の9割以上がGUIのemacsを使っています。というのも、最初にそれでプログラムを教わるのでそのまま使っているひとが多いのです。
せっかくターミナルが使えるのだから、せめてCUIのemacsを使えばいいのに...
ほとんどの人間がemacs使いなのでvimmerは肩身が狭い思いをしています。
「vim?開いてもいきなり入力できないんでしょ?」「IDEがあるから...」「nanoだろやっぱ(第三勢力)」「は?メモ帳だろ?」そんな声が聞こえてきます。
ぶっちゃけ否定できません。エディタなんて一つ覚えておけば十分だし、わざわざ慣れない他のエディタを体験してよさを探したりなんて現実的ではありません(特にvimとemacsは)。僕もemacsのよさもあるのかなと触ってみようとしたことがありますが、3分持ちませんでした。
結局、人間は争うことを止めることはできないのかも知れません。悲しいですね。
自衛
しかし、学校の規則でもコーディングルールでもないのに少数派だというだけでvimmerが弾圧されている事態は看過できません。
せめて自分の環境だけでも、vimmerのプライドを保ち宗教弾圧と戦いたいものです。
zshrcに以下の設定を追加しましょう。
# vim ~/.zshrc
alias emacs='(){echo "
■■ ■■
■■■■ ■■■■ ■■■■■■■ ■■■■■■ ■■■■■■■■■
■■■■ ■■■■ ■■■■■■■■■■ ■■■■■■■■■■ ■■■■■■■■■■■
■■■■■■ ■■■■■■ ■■■■■ ■■■■■■ ■■■ ■■■■■■
■■■■ ■■ ■■■■ ■■■■ ■■■ ■■■
■■■■ ■■■ ■■■■ ■■■ ■■■
■■■ ■■■ ■■■ ■■■ ■■■■
■■■ ■■■ ■■ ■■ ■■■■ ■■■■ ■■ ■■■■■■ ■■■ ■■■ ■■■ ■■■ ■■■
■■■ ■■ ■■ ■■ ■■■■■■■ ■■■■■■■ ■■ ■■■■■■■■■ ■■■ ■■■ ■■■ ■■■ ■■■
■■■ ■■■ ■■ ■■■■■■ ■■■■ ■■■■■■■■■ ■■ ■■■■ ■■■ ■■■ ■■■ ■■■ ■■■ ■■■
■■ ■■■ ■■ ■■■■ ■■■■■ ■■■ ■■ ■■■ ■■■ ■■■ ■■■ ■■■ ■■
■■■ ■■ ■■ ■■■ ■■■ ■■■ ■■ ■■ ■■■ ■■■ ■■■ ■■■ ■■
■■■ ■■■ ■■ ■■ ■■■ ■■■ ■■ ■■■ ■■■ ■■■■■■■ ■■■ ■■■ ■■■ ■■
■■ ■■■ ■■ ■■ ■■■ ■■■ ■■ ■■■■■ ■■■ ■■■■■■■ ■■■ ■■■ ■■■ ■■■
■■■ ■■ ■■ ■■ ■■■ ■■■ ■■ ■■■■■■ ■■■ ■■■ ■■■ ■■■ ■■■ ■■■
■■■ ■■■ ■■ ■■ ■■■ ■■■ ■■ ■■■■■ ■■■ ■■■ ■■■ ■■■ ■■■ ■■■
■■ ■■■ ■■ ■■ ■■■ ■■■ ■■ ■■■■ ■■■ ■■■ ■■■ ■■■ ■■■ ■■■
■■■ ■■ ■■ ■■ ■■■ ■■■ ■■ ■■ ■■■ ■■■ ■■■ ■■■ ■■■ ■■■
■■■ ■■■ ■■ ■■ ■■■ ■■■ ■■ ■■■ ■■■■ ■■■ ■■■■ ■■■■ ■■■ ■■■
■■ ■■■ ■■ ■■ ■■■ ■■■ ■■ ■ ■■ ■■■■ ■■■ ■■■■ ■■■■ ■■■ ■■■■
■■■■■ ■■ ■■ ■■■ ■■■ ■■ ■■■■ ■■■ ■■■■■■ ■■■■■■ ■■■■■ ■■■■■■ ■■■ ■■■■■
■■■■ ■■ ■■ ■■■ ■■■ ■■ ■■■■■■■■■ ■■■■■■■■■■■ ■■■■■■■■■■ ■■■■■■■■■■■
■■■ ■■ ■■ ■■■ ■■■ ■■ ■■■■■■ ■■■■■■■ ■■■■■■ ■■■■■■■■■
" && sleep 1 && if [[ "$@" =~ - ]]; then vim $2; else vim $@; fi}'
vim is GOD.(本音)
# emacs -nw .zshrc
みたいなオプションとか引数があったら、エラーが起こる(vimに無いオプションだから)から結構困りました。
: (なにもしないコマンド)を使ってみたりしたんですが、今度はファイルに対応できなくなったり...
結局、引数に" -"(半角スペース+-)が含まれていたらオプションだと見なして、二番目の引数だけをとることにしました。(ガバガバ)
シェルスクリプトに軽く起こすとこんな感じ。
#vim is GOD と表示(AA略echo"vim is GOD"&&#よく見えるように1秒待機sleep 1 &&#もし、引数にオプションが含まれていたら、if[["$@"=~ - ]];then#2番目の引数だけ実行
vim $2;else#そうでないなら全体を実行
vim $@;fi
aliasだから軽く一行で書きましたが、もっと厳密に書くこともできます。
動かすとこんな感じ。
綺麗に起動しましたね。(vimが)
最後に
意外とzshrcとかaliasとかって柔軟に動くんですね。感動しました。
ジョークスクリプトのつもりでさっさと書いて出そうと思っていたので、思いがけず勉強になりました。
まさか無いとは思いますが、他の記事とネタかぶりしてたらperlワンライナーと組み合わせた複雑なやつも書いてみようかなと思います。
よいこの皆さんはemacs派の友達のzshrcにこれをこっそり書いてはいけませんよ。
参考
Androidでもvimを使いたい - DroidVimの設定あれこれ
ポメラ!お前はポメラになるのだ!
「ポメラほしい。でもUSキーじゃないしじゃあUSキーのネットブックほしい。ぶっちゃけCUIでいい。いっそポメラの代替品ならVimだけ動けばいい。」みたいなことを最近言っていたんですが、少し冷静になりまして、状態もよくわからん中古のネットブック買って、バッテリーがうんちゃらとか変態レイアウトがうんちゃらとか言うくらいだったら、root取れる中華タブとキーボード買うほうがマシよねって気がついたんです。ホラちょうどここにカスタマイズしようとして放っておいたFire7もあるんですよ。ここはちょっと一念発起して、昔チェックだけはして「スマホじゃ無理だな」…と放っておいたDroidVimと、bluetoothキーボードの組み合わせで持ち歩けるVimを作ってしまおうという魂胆なんです。
「俺の答えはこれや」と叫びvimrcを投げつける
新しい端末でvimを使うならまず使い込んだ自分のvimrcを放り込むところから始まるんですが、幸いDroidVimは課金すればbusybox、gitが使えるのでさっさと課金して自分のvimrcをpullします。公式のドキュメントでは「どっか.vimrc
をうまいこと置いてシンボリックリンクで」とのことですが、もちろん.vim
ディレクトリまるごとシンボリックリンクでも問題なかったです。.vim
の実ファイル群置く場所は、まぁAndroidだし/storage/emulate/0/
下でいいんじゃないですかね?ここならDroidVimの環境変数$INTERNAL_STORAGE
に入っているので何かのっぴきならないことがあってもそんなに困らないでしょう。
もちろん外部ツールに依存しない前提ですが、殆どのvimscriptは問題なく動きました。プラグインマネージャのvim-plug
も問題無しでした。環境に依存するものもあるのでvimrc
にちょっとした仕掛けをしておくほうが良さそうなので変数を仕掛けておきます。
letg:isDroid= split(&runtimepath,',')[0]=~? 'droidvim' ? v:true :v:false
変数をbool値としてしか使うつもりがないのでv:true
を使っていますが、そのへんはどうすればいいのか分かっていません。さておき、DroidVimで弾きたい設定がある場合はこれを使って行きます…弾きたいのは…
~/.vim/plugin/**/*.vim
今まで自分で書いたスクリプトはとりあえずplugin
に放り込んでおけばガンガン読んでくれるので安心していたんですけど、ここに放り込むとファイル単位でスクリプトを弾くのがとても面倒なので工夫せざるを得なくなりました。netrw
を使っている手前、ディレクトリ構造で処理しようとするとディレクトリに潜る手順が増えるのが煩わしいし、そもそもplugin
ディレクトリ配下にある*.vim
は何でも読む以上ディレクトリツリーも使えません。しょうがない、オミットするためのスクリプトを書いて乗り切りました。
scriptencoding utf-8letg:excludePlugin={}letg:excludePlugin.droid =[]" ここDroidVimで弾くスクリプトのファイル名 (以下同様)letg:excludePlugin.win=[]letg:excludePlugin.unix =[]" プラグインの読み込みletg:myPlug= glob($VIMFILES.'/myplug/*.vim',0,1)let currentTerm =''ifg:isDroid==1let currentTerm ='droid'elseif has('win32')let currentTerm ='win'elseif has('unix')let currentTerm ='unix'endiffor pick ing:excludePlugin[currentTerm]let rgx = pick.'$'callfilter(g:myPlug,'v:val !~# rgx')endforforscripting:myPlug
execute('source '.script)endfor
スクリプト中の$VIMFILES
の中身は先のg:isDroid
でも使っていたsplit(&runtimepath, ',')[0]
です。
I・M・E! I・M・E!
日本語入力がある限り日本人のvimmerは永遠にIMEの設定をする運命なのですが、当然のごとくAndroid+H/Wキーボードの環境でも襲ってきますというか、PCベースの環境より更に悪化していると言って差し支えないでしょう。とりあえず「Google日本語入力」を使っているので色々と試しましたが、公式ドキュメントに倣うのが一番無難でそれ以上快適にはならなさそうでした。但し、g:imcontrol_insert
を設定すると入力モードが半角の「単語ベース」の入力になる上、そもそもGoogle日本語入力経由の入力がかなりガタつくのでちょっと使い物にならないなという感じです。日本語入力のために2ストローク使うのはシャクですが「IMEショートカット→入力切替」の手順を踏むのがいいのかなと思います。それとも:TFAMod
で仕込んだり出来るんですかねこれ…
余談
そもそもFire7でDroidVimを使うにあたって、そんじょそこらのH/Wキーボードを買うとCAPS⇔ctrlのスワップが出来なくて1ちっとも快適になりません。実際買ったのはそんじょそこらのやつなので、なんとかせんとならんのですが…Fire7君は立派に戦って文鎮となりました。現環境は中古で買ったQua tabです。Google Playがマトモに入っているならroot取らなくてもH/Wキーボードのレイアウトが変更できるのでまぁ及第点です。IMEでクッソガクガクするのはもしかしたら単純にQua Tabのパワー不足が原因かもしれないですが…
それが必要じゃない人生であれば幸せなんですがまぁ、無理っすね20年前にはもう入れ替えてたし…ある程度のクラスのキーボードはハードウェアでスワップできるようになっててほしいんですけどね。今使ってるLenovoくんも入れ替えはOS側に頼ってるし… ↩
とりあえずこれだけ使えればVimでなんとかなる
はじめに
Vimってターミナル上で動かせるし、キーボードで完結できるし、いいですよね。Vimを使い始めて4ヶ月ほど。まだまだ使いこなせていないですが、そんな私でもとりあえずVimで困ることはほとんどなくなってきました。
そこで、今私がよく使っている操作を整理してみました。ここに書いた操作が使いこなせればVimmerとしての一歩を踏み出したレベルにはなっているはず。
これからVimを始めてみようという方の参考になれば幸いです。
あくまで「これだけ使えればなんとかなる」レベルの操作ですので、より詳しく知りたい方は最後にある参考記事をご参照ください。
ちなみにここに書いたのは(今のところ)「素のVim」の操作のみです。プラグインは入っていません。もしかしたら今後追記していくかもしれません。
よく使うVimの操作
移動系
l
でカーソル右移動h
でカーソル左移動j
でカーソル下移動k
でカーソル上移動Ctrl + f
で1ページ下に移動Ctrl + b
で1ページ上に移動G
で最終行に移動gg
で最初の行に移動$
でカーソル行の最後の文字に移動^
でカーソル行の最初の文字に移動0
でカーソル行の最初に移動28G
で28行目に移動w
で次の単語に移動b
で前の単語に移動
挿入系
i
でカーソル位置からインサートモードa
でカーソルの右からインサートモードo
でカーソルの下に1行追加してインサートモードO
でカーソルの上に1行追加してインサートモード
選択系
v
でビジュアルモードCtrl + v
で矩形選択モード- ビジュアルモード/矩形選択モードでカーソル移動で移動範囲を選択
ヤンク(コピー)・ペースト系
y
でビジュアルモード/矩形選択モードで選択した範囲をヤンクyy
でカーソル行1行をヤンク:3,10y
で3行目から10行目までをヤンクp
でカーソルの右にペースト(行をペーストする場合はカーソル行の下にペースト)
削除系
x
で1文字切り取りdd
で1行切り取り:15,30d
で15行目から30行目までを切り取り
検索系
*
でカーソル位置の単語を検索(ハイライト表示):noh
でハイライト解除(.vimrc
にnmap <Esc><Esc> :nohlsearch<CR><Esc>
を追記して、ESC
連打でハイライト解除)/hoge
でhoge
を検索/^f
でfから始まる行を検索(つまり/
での検索には正規表現が使える)n
で検索対象の次へ移動N
で検索対象の前へ移動
置換系
:%s/foo/bar/g
でfoo
をbar
に一斉置換
バッファ・ウィンドウ系
:w
で保存:wq
で保存してウィンドウを閉じる:q
でウィンドウを閉じる:q!
で保存せずにウィンドウを閉じる:vs
で画面を左右に分割:sp
で画面を上下に分割:ls
で現在開いているバッファを確認:b2
でバッファ番号2を表示する
その他
ESC
でノーマルモードu
でアンドゥCtrl + r
でリドゥ
おわりに
Vimの操作はまだまだあります。何度も繰り返し操作することで自然と覚えていきますので、最初のうちは根気強く使っていきましょう。
とりあえずこれだけ使えればVimでなんとかなるはず。
参考
Vim を使い始めようと思ったからチートシートを作ってみた
Vim チートシート
起動
コマンド | 動作 |
---|---|
vim {path/file} | vim を実行(指定ファイルを開く) |
終了
キー入力 | 動作 |
---|---|
:q[uit] | 終了 |
:q! | 終了(編集破棄) |
ファイル操作
キー入力 | 動作 |
---|---|
:e[dit] {path/file} | ファイルを開く(相対ファイルパスを入力。[TAB]で補完入力) |
:e[dit] {path} | ファイルエクスプローラを指定パスでオープン([TAB]で補完入力) |
:e. | ファイルエクスプローラをカレントディレクトリでオープン |
:E[xplore] | アクティブなバッファのディレクトリでファイルエクスプローラをオープン |
:S[explore] | :E の水平分割版 |
:Vexplore | :E の垂直分割版 |
:find | ファイルを検索して開く 検索先は path に予め設定しておく src配下なら :set path+=src/** |
:sav[eas] {path/file} | ファイル名を付けて保存 |
:w[rite] | ファイルの上書き保存 |
モード切替
ノーマルモード
キー入力 | 動作 |
---|---|
[ESC] [CTRL] + ] | ノーマルモード |
インサートモード開始
キー入力 | 動作 |
---|---|
i | カーソル位置から |
a | カーソル位置の後ろから |
I | 行頭から |
A | 行末から |
o | カーソル行の下に新規行 |
O | カーソル行の上に新規行 |
C | カーソル位置から行末を削除 |
s | カーソル位置を1文字削除 |
S | カーソル行で新規行 |
置換モード開始
キー入力 | 動作 |
---|---|
R [INS] | 置換モード |
ビジュアルモード開始
※ トグルでノーマルモードと切り替わる
キー入力 | 動作 |
---|---|
v | 文字指向 |
V | 行指向 |
[CTRL] + v | ブロック指向 |
ビジュアルモード中
キー入力 | 動作 |
---|---|
gv | 直前の選択範囲を再選択 |
o | 選択範囲の始点と終点をトグルで移動 |
カーソル移動
キー入力 | 動作 |
---|---|
h | 左 |
j | 下 |
k | 上 |
l | 右 |
w b | 単語の先頭(区切り文字まで) |
W B | 単語の先頭(区切り文字を除く) |
e | 単語の末尾(区切り文字まで) |
E | 単語の末尾(区切り文字を除く) |
gg | ファイルの先頭行 |
G | ファイルの末尾行 |
H | 画面の先頭行 |
M | 画面の中央行 |
L | 画面の末尾行 |
0 | 行頭 |
^ | 行頭(非空白文字) |
$ | 行末 |
gm | 行の中央 |
g_ | 行末(非空白文字) |
% | 対の括弧 |
:{number} | number行 |
'' | ジャンプ前の位置 |
'. | 直前に変更があった位置 |
'^ | 直前に挿入があった位置 |
m{a-zA-Z} | 現在位置をマーク |
'{a-zA-Z} | マークした位置 |
ノーマルモード中の編集
キー入力 | 動作 |
---|---|
x | 1文字カット |
dd | 1行カット |
. | 直前の変更を繰り返す |
yy | 1行コピー |
p | ペースト(カーソル位置の後) |
P | ペースト(カーソル位置の前) |
u | アンドゥ |
[CTRL] + r | リドゥ |
インサートモード中の編集
キー入力 | 動作 |
---|---|
[CTRL] + h | 直前の1文字削除 |
[CTRL] + w | 直前の1単語削除 |
[CTRL] + u | 行頭まで削除 |
[CTRL] + r{number} | ペースト |
検索
行内1文字検索
キー入力 | 動作 |
---|---|
f{char} | 前方検索 |
t{char} | 前方検索(1文字前) |
F{char} | 後方検索 |
T{char} | 後方検索(1文字後) |
; | 次を検索 |
, | 前を検索 |
ファイル内文字列検索
キー入力 | 動作 |
---|---|
/{pattern} | ファイル内で前方検索 |
?{pattern} | ファイル内で後方検索 |
* | カーソル位置の単語を前方検索 |
# | カーソル位置の単語を後方検索 |
n | 次を検索 |
N | 前を検索 |
置換
文字列置換
キー入力 | 動作 |
---|---|
:[%]s/{pattern}/{string} | 置換(%なし=前方, %あり=全て) |
1文字(上書き)
キー入力 | 動作 |
---|---|
r{char} | 1文字上書き(置換モード) |
gr{char} | 1文字上書き(仮想置換モード) |
インデント
準備
:set shiftwidth=4 softtabstop=4 expandtab
キー入力 | 動作 |
---|---|
> | インデントを下げる |
< | インデントを上げる |
= | 自動インデント |
ウインドウ
キー入力 | 動作 |
---|---|
[CTRL] + w, s | 水平分割 |
[CTRL] + w, v | 垂直分割 |
[CTRL] + w, c | アクティブウインドウを閉じる |
[CTRL] + w, o | アクティブウインドウだけ残す |
[CTRL] + w, T | アクティブウインドウを新規タブに移動 |
gt | 次のタブに切替 |
gT | 前のタブに切替 |
参考
- 僕がサクラエディタからVimに乗り換えるまで (https://blog.jnito.com/entry/20120101/1325420213)
- 実践Vim 思考のスピードで編集しよう! (https://www.amazon.co.jp/dp/B00HWLJI3U/)
- Vim Cheat Sheet (https://vim.rtorr.com/lang/ja)
vimをgolangに対応させる
golangを始めるにあたってvimに色々プラグインを追加
vim-go
vim上でgoの様々なコマンドを実行するためのプラグイン
https://github.com/fatih/vim-go
色々プラグインを追加する気だったのですが、vim-goを入れたら一通り必要なものが揃ったので他に書くことがない。。。
令和になったのでワイのinit.vim晒す
Vim歴3年のCassinと申します。
最近は init.vim 書くのが自分にとって時間の無駄だという考えに至ったので VSCodeを使っています。
今回紹介するコードはここにあります。Unix系の環境で vim-airlineのフォント, vim-plugそして neovimがインストールされていれば ~/.config/nvim
にそのまま git clone
して頂ければ
ほぼエラーなしで使用できると思います。
参照先がわからない様々なサイトのコードにお世話になっております。ありがとうございます。
対応している言語
Haskell, C++11, Ruby, Rust, LaTeX, TOML, Markdown, Python3, Rust, Dart
ディレクトリ構造
~/.config/nvim
├── init.vim
└── init
├── color
│ └── color.init.vim
├── main
│ ├── main.init.vim
│ ├── nnormap.init.vim
│ └── othermap.init.vim
└── plugin
├── plugin_install.init.vim
└── plugin_settings.init.vim
各設定ファイル
scriptencoding utf-8
runtime init/main/main.init.vim
runtime init/main/nnormap.init.vim
runtime init/main/othermap.init.vim
runtime init/plugin/plugin_install.init.vim
runtime init/plugin/plugin_settings.init.vim
runtime init/color/color.init.vim
scriptencoding utf-8
syntax on" 179 : 黄色" 51 : 水色 (少し明るい)" 45 : 水色" 6 : 水色 (少し暗い)" 24 : 水色 (より暗い)" 255 : 白色" 240 : 灰色" color scheme 拡張 " one darkauColorScheme * hi Normal ctermbg=none
auColorScheme * hi LineNr ctermbg=none ctermfg=240 cterm=italic " 行番号
auColorScheme * hi StatusLine ctermbg=none " アクティブなステータスライン
auColorScheme * hi StatusLineNC ctermbg=none " 非アクティブなステータスライン
auColorScheme * hi Comment ctermfg=243 cterm=italic " コメントアウト
auColorScheme * hi Statement ctermfg=45auColorScheme * hi DiffAdd ctermbg=24 " 追加行
auColorScheme * hi Identifier ctermfg=45 "cterm=boldauColorScheme * hi Haskell01 ctermfg=179 " 黄色
auColorScheme * hi Haskell02 ctermfg=45 " 水色
auColorScheme * hi Haskell03 ctermfg=255 " 白
" スペルチェックau Colorscheme * hi SpellBad ctermfg=46 cterm=none
" キャメルケースチェックauColorScheme * hi SpellCap ctermfg=46 cterm=boldset background=lightcolo onedark
"colo tomorrow"colo hybrid
augroup filetypedetect
auBufRead,BufNewFile *.hs :call ColHaskell()
augroup END
" Haskell 用のシンタックスハイライトfunction! ColHaskell()auBufWinEnter * letw:m3 = matchadd("Haskell02",'(')auWinEnter * letw:m3 = matchadd("Haskell02",'(')auBufWinEnter * letw:m3 = matchadd("Haskell02",')')auWinEnter * letw:m3 = matchadd("Haskell02",')')auBufWinEnter * letw:m3 = matchadd("Haskell02",'$')auWinEnter * letw:m3 = matchadd("Haskell02",'$')endfunction" 行末スペース、行末タブの表示" highlight TrailingSpaces ctermbg=red guibg=#FF0000" highlight TrailingSpaces ctermbg=blue guibg=#FF0000
highlight TrailingSpaces ctermbg=50 " or 46(緑) or 240(灰色)
highlight Tabs ctermbg=black guibg=8 " guibg=#000000auBufNewFile,BufRead * call matchadd('TrailingSpaces',' \{-1,}$')auBufNewFile,BufRead * call matchadd('Tabs','\t')" 全角スペースの表示
highlight ZenkakuSpace cterm=underline ctermbg=BLUE
auBufWinEnter * letw:m3 = matchadd("ZenkakuSpace",' ')auWinEnter * letw:m3 = matchadd("ZenkakuSpace",' ')
scriptencoding utf-8set fenc=utf-8set nobackup
setnoswapfileset autoread
set tabstop=2 shiftwidth=2 expandtab
setnumber"set scrolloff=5set scrolloff=10filetype plugin indent on"set laststatus=2"tex ギリシャ文字可視化無効letg:tex_conceal=''" 英語と日本語のスペルチェック z= で修正候補setspellset spelllang=en,cjk
hiclear SpellBad
""hi SpellBad cterm=underlinehiclear SpellCap
""hi SpellCap cterm=underline,bold" remove trailing whitespace" autocmd BufWritePre * :%s/\s\+$//ge
scriptencoding utf-8" move middle of the current line
nnoremap sm:<C-u>call cursor(0,strlen(getline("."))/2)<CR>" modes short cut
nnoremap s<space>:<C-u>terminal<cr>" 日本語
nnoremap あ a
nnoremap い i" split windows
nnoremap s <Nop>
nnoremap sj <C-w>j
nnoremap sk <C-w>k
nnoremap sl<C-w>l
nnoremap sh<C-w>h
nnoremap sJ <C-w>J
nnoremap sK <C-w>K
nnoremap sL <C-w>L
nnoremap sH <C-w>H
nnoremap sn gt
nnoremap sp gT
nnoremap sr<C-w>r
nnoremap s=<C-w>=
nnoremap sw<C-w>w
nnoremap so<C-w>_<C-w>|
nnoremap sO <C-w>=
nnoremap sN:<C-u>bn<CR>
nnoremap sP :<C-u>bp<CR>
nnoremap st:<C-u>tabnew<CR>
nnoremap sT :<C-u>Unite tab<CR>
nnoremap ss :<C-u>sp<CR>
nnoremap sv:<C-u>vs<CR>
nnoremap sq :<C-u>q<CR>
nnoremap sQ :<C-u>bd<CR>
nnoremap sb:<C-u>Unite buffer_tab -buffer-name=file<CR>
nnoremap sB :<C-u>Unite buffer -buffer-name=file<CR>
scriptencoding utf-8" nerdtree
map <C-n>:NERDTreeToggle<CR>" insert mode
inoremap <silent><C-f><right>
inoremap <silent><C-b><left>" 括弧補完
inoremap (()<left>" 上の例外処理: の後に続けて)を押したとき
inoremap <expr>) strpart(getline('.'),col('.')-1,1)==")" ? "\<Right>":")"" 括弧補完
inoremap [[]<left>" 上の例外処理: の後に続けて)を押したとき
inoremap <expr>] strpart(getline('.'),col('.')-1,1)=="]" ? "\<Right>":"]"" quotation補完
inoremap " ""<left>
inoremap ' ''<left>
augroup FolowFile
autocmd!
autocmd BufRead,BufNewFile *.c inoremap {<enter>{}<left><cr><cr><up><tab>
autocmd BufRead,BufNewFile *.dart inoremap {<enter>{}<left><cr><cr><up><tab>
autocmd BufRead,BufNewFile *.cpp inoremap {<enter>{}<left><cr><cr><up><tab>
autocmd BufRead,BufNewFile *.rs inoremap {<enter>{}<left><cr><cr><up><tab>
autocmd BufRead,BufNewFile *.go inoremap {<enter>{}<left><cr><cr><up><tab>
augroup END
" terminal mode
tnoremap <silent><esc><C-\><C-n>
scriptencoding utf-8" update plugins ->" :PlugInstall" :UpdateRemotePluginscall plug#begin()
Plug 'SirVer/ultisnips'
Plug 'honza/vim-snippets'
Plug 'kana/vim-submode' " resize split windows
" differences
Plug 'brooth/Far.vim'" git
Plug 'tpope/vim-fugitive'" indent guides
Plug 'Yggdroot/indentLine'" colorlise status line" Plug 'itchyny/lightline.vim'" Plug 'Cassin01/neoline.vim'
Plug 'vim-airline/vim-airline'
Plug 'vim-airline/vim-airline-themes'" syntastic
Plug 'vim-syntastic/syntastic'" pathogen for syntastic
Plug 'tpope/vim-pathogen'" haskell
Plug 'eagletmt/neco-ghc' " completion
Plug 'neovimhaskell/haskell-vim' " syntax
Plug 'dag/vim2hs' " syntax, indent
" python3
Plug 'davidhalter/jedi-vim' " completion
" c++
Plug 'octol/vim-cpp-enhanced-highlight' " syntax highlight
Plug 'justmao945/vim-clang' " completion
" Ruby
Plug 'vim-ruby/vim-ruby'" Rust
Plug 'rust-lang/rust.vim' " completion
" Dart
Plug 'dart-lang/dart-vim-plugin'" toml
Plug 'cespare/vim-toml'"markdown"Plug 'godlygeek/tabular'"Plug 'plasticboy/vim-markdown'" :Unite colorscheme -auto-preview
Plug 'Shougo/unite.vim'
Plug 'ujihisa/unite-colorscheme'" colorschemes
Plug 'altercation/vim-colors-solarized' " solarized
Plug 'croaker/mustang-vim' " mustang
Plug 'jeffreyiacono/vim-colors-wombat' " wombat
Plug 'nanotech/jellybeans.vim' " jellybeans
Plug 'vim-scripts/Lucius' " lucius
Plug 'vim-scripts/Zenburn' " zenburn
Plug 'mrkn/mrkn256.vim' " mrkn256
Plug 'jpo/vim-railscasts-theme' " railscasts
Plug 'therubymug/vim-pyte' " pyte
Plug 'tomasr/molokai' " molokai
Plug 'chriskempson/vim-tomorrow-theme' " tomorrow night
Plug 'vim-scripts/twilight' " twilight
Plug 'w0ng/vim-hybrid' " hybrid
Plug 'freeo/vim-kalisi' " kalisi
Plug 'morhetz/gruvbox' " gruvbox
Plug 'toupeira/vim-desertink' " desertink
Plug 'sjl/badwolf' " badwolf
Plug 'itchyny/landscape.vim' " landscape
Plug 'joshdick/onedark.vim' " onedark in atom
Plug 'gosukiwi/vim-atom-dark' " atom-dark
Plug 'liuchengxu/space-vim-dark' " space-vim-dark-> recommended 'hi Comment cterm=italic'
Plug 'kristijanhusak/vim-hybrid-material' "hybrid_material
Plug 'drewtempelmeyer/palenight.vim' " palenight
" others
Plug 'scrooloose/nerdtree'
Plug 'Shougo/deoplete.nvim' " auto completion
call plug#end()
scriptencoding utf-8" indent-guides"let g:indent_guides_enable_on_vim_startup=1 " enable indent-guides let g:indent_guides_guide_size =1letg:indent_guides_start_level=1letg:indent_guides_auto_colors=0 " enable auto colorsletg:indent_guides_exclude_filetypes=['help','nerdtree']
autocmd VimEnter,Colorscheme * :hi IndentGuidesOdd ctermbg=237
autocmd VimEnter,Colorscheme * :hi IndentGuidesEven ctermbg=237" indentLineletg:indentLine_enabled=0 " disable by default
letg:indentLine_char='⎸'" fugitive.vimset statusline+=%{FugitiveStatusline()}" syntasicset statusline+=%#warningmsg#
set statusline+=%{SyntasticStatuslineFlag()}set statusline+=%*
letg:syntastic_always_populate_loc_list=1letg:syntastic_auto_loc_list=1letg:syntastic_check_on_open=1letg:syntastic_check_on_wq=0letg:syntastic_mode_map={ \'mode':'passive', \'active_filetypes':['c','cpp','python3'] \}letg:syntastic_cpp_compiler='clang++'letg:syntastic_cpp_compiler_options=' -std=c++11 -stdlib=libc++'" submodecall submode#enter_with('bufmove','n','','s>','<C-w>>')call submode#enter_with('bufmove','n','','s<','<C-w><')call submode#enter_with('bufmove','n','','s+','<C-w>+')call submode#enter_with('bufmove','n','','s-','<C-w>-')call submode#map('bufmove','n','','>','<C-w>>')call submode#map('bufmove','n','','<','<C-w><')call submode#map('bufmove','n','','+','<C-w>+')call submode#map('bufmove','n','','-','<C-w>-')" lightline" let g:lightline = {" \ 'colorscheme': 'onedark'," \ }" vim-airlineset laststatus=2letg:airline_powerline_fonts=1letg:airline#extensions#tabline#enabled =1letg:airline#extensions#tabline#buffer_idx_mode =1letg:airline#extensions#whitespace#mixed_indent_algo =1"let g:airline_theme = 'tomorrow'if!exists('g:airline_symbols')letg:airline_symbols={}endif" unicode symbolsletg:airline_left_sep='»'letg:airline_left_sep='▶'letg:airline_right_sep='«'letg:airline_right_sep='◀'letg:airline_symbols.crypt ='🔒'letg:airline_symbols.linenr ='☰'letg:airline_symbols.linenr ='␊'letg:airline_symbols.linenr =''letg:airline_symbols.linenr ='¶'letg:airline_symbols.maxlinenr =''letg:airline_symbols.maxlinenr ='㏑'letg:airline_symbols.branch ='⎇'letg:airline_symbols.paste ='ρ'letg:airline_symbols.paste ='Þ'letg:airline_symbols.paste ='∥'letg:airline_symbols.spell='Ꞩ'letg:airline_symbols.notexists ='∄'letg:airline_symbols.whitespace ='Ξ'" powerline symbolsletg:airline_left_sep=''letg:airline_left_alt_sep=''letg:airline_right_sep=''letg:airline_right_alt_sep=''letg:airline_symbols.branch =''letg:airline_symbols.readonly =''letg:airline_symbols.linenr ='☰'letg:airline_symbols.maxlinenr =''"vim-clangletg:clang_c_options='-std=gnu11'letg:clang_cpp_options='-std=c++11 -stdlib=libc++' " c++11用
" disable auto completion for vim-clangletg:clang_auto=0" deoplate" let g:deoplete#enable_at_startup = 1"------------------------------------------" -- colorschemes --"------------------------------------------
Vim patchダイジェスト [2019/04]
Vimのリリースされたpatchの平成最後の説明です。patchの内容を確認し、必要であれば動作確認をおこなったうえで書いています。英語を忠実に訳すよりは、Vimを使っている人が理解しやすい文章になるように心がけています。
新機能、大幅な仕様変更には、が付いています。
(8.1.1100~ 8.1.1240)
- 8.1.1237:
ソースコードで使用している変数名
compl
がC++の予約済みキーワードのためコンパイルエラーになるのを修正しました。 - 8.1.1231:
安全であると判断した場合はスワップファイルを自動的に削除するようにしました。
- 8.1.1230:
Windows: vim.exe と gvim.exe の共通部分を vim.dll で共有できるようにしました。ビルド時に
VIMDLL=yes
を指定すると有効になります。(デフォルトはno
) (関連patch: 8.1.1066, 8.1.1239) - 8.1.1228:
tagfunc()
を追加しました。指定した関数でタグジャンプ時に使われるタグリストの生成の制御がおこなえます。 - 8.1.1226:
helpテキストの
{not in Vi}
は邪魔なので、すべてのViオプションのリストを作成しました。(:h vi-features
) ※まだ作業途中です。 - 8.1.1224:
Windows:
'guifont'
にW
を追加しました。font weightが指定できます。 - 8.1.1221:
:filter
の対応コマンドに:marks
を追加しました。 - 8.1.1218:
タブローカルディレクトリ機能を追加しました。
:tcd
と:tchdir
で設定します。情報はgetcwd()
で取得可能です。 - 8.1.1215:
make clean
が生成したsrc/po
ファイルを削除していないのを修正しました。(関連patch: 8.1.1213) - 8.1.1210:
user_commands機能を常に有効にしました。user_commands関連機能のソースコードを新規ファイル usercmd.c に集約しました。(関連patch: 8.1.1211)
- 8.1.1205:
BufReadPre
がトリガーするとカーソルが移動することがあるのを修正しました。 - 8.1.1201:
:command
の出力結果が見づらいので各項目の表示カラム幅を調整しました。(関連patch: 8.1.1204) - 8.1.1198: Vim終了後に端末エミュレータがbracketed paste modeになってしまうことがあるのを修正しました。
- 8.1.1196: 並列ビルドが失敗することがあるのを修正しました。
- 8.1.1195:
Vim scriptのデバック機能関連のソースコードを新規ファイル debugger.c に集約しました。
- runtimeファイル更新: Todo更新。helpファイル更新。他。
- 8.1.1189: インサートモードを抜けた時にステータスラインの
-- INSERT --
表示が残ったままになることがある件を修正しました。 - 8.1.1188:
scriptversion 3以降ではVim定義済み変数(
:h v:
)のアクセスにv:
プレフィックスが必須になりました。(関連patch: 8.1.1190) - 8.1.1177:
拡張子
.ts
のファイルタイプをxmlからTypeScriptに変更しました。 - 8.1.1174: if_ruby:Ruby 1.8でビルドできない件を修正しました。
- 8.1.1159:
Windows:インストーラーはインストール/アンインストールのサイレントモード時に
$VIM/_vimrc
を削除しないようにしました。 - 8.1.1158: Jsonでエンコードされた文字列が時々最後のNULが欠けていることがあるのを修正しました。。
- 8.1.1157:
Unicode 12.0.0に対応しました。
- 8.1.1156: 認識可能なUnicode emojiを追加しました。
- 8.1.1149: msgfmtコマンドが古いとdesktopファイルのビルドに失敗する件を修正しました。(関連patch: 8.1.1150, 8.1.1154)
- 8.1.1146: Windows: コンソール版でterminalウィンドウの色がおかしかったのを修正しました。
- 8.1.1140:
winnr()
の引数{arg}にカレントウィンドウ基準の相対位置を指定できるようにしました。例:'1j'
で1つ下のウィンドウ番号を、'2l'
で右2つ目のウィンドウ番号を返します。 - 8.1.1138:
CompleteChanged
を追加しました。インサートモードの補完ポップアップメニューが変更された時にトリガーされます。 - runtimeファイル更新: Todo更新。helpファイル更新。他。
- 8.1.1125: VimがlibvtermへCSIハンドラを渡していなかったために、libvtermがウィンドウ位置レポートを扱えていなかった件を修正しました。(関連patch: 8.1.1127, 8.1.1128, 8.1.1131, 8.1.1132, 8.1.1141)
- 8.1.1123:
complete()
の第2引数{matches}に指定する補完項目リストの辞書のエントリーにequal
を追加しました。この値が非ゼロの項目は常に補完候補として表示されます。 - 8.1.1122:
str2list()
とlist2str()
を追加しました。文字列から文字コードのリスト変換、および逆変換がおこなえます。 - 8.1.1120:
readdir()
を追加しました。既存の関数glob()
より複雑なことがおこなえます。(関連patch: 8.1.1186) - 8.1.1119:
Windows: ARM64をサポートしました。
- 8.1.1116:
:scriptversion
を追加しました。Vim scriptバージョンが 2以上の場合は、.
による文字列連結がエラーになります。(関連patch: 8.1.1114) - 8.1.1114:
文字列の連結用に
..
演算子と..=
演算子を追加しました。AST(抽象構文木)化できるようにするための変更です。(関連URI: vim-jp/issue/1225) - 8.1.1113:
:autocmd
に++once
引数を追加しました。指定時は1回実行されるとコマンドが削除されます。また、"nested" の別名として++nested
を追加しました。 - 8.1.1111:
isinf()
を追加しました。正の無限大、負の無限大かどうかを返します。 - 8.1.1110:
'listchars'
が設定されていると、スペース上の文字合成の表示が間違っている件を修正しました。(関連patch: 8.1.1078) - runtimeファイル更新: Todo更新。helpファイル更新。他。
- 8.1.1103:
Windows: 常にwide Windows APIを使用するようにしました。
- 8.1.1100: ファイルの最後に改行のないタグファイルが動作しなくなった件を修正しました。(関連patch: 8.1.1094)
凡例
表記 | 意味 |
---|---|
![]() | 新機能、大幅な仕様変更 |
![]() | Vim開発者向けの追加、変更 |
'hoge' | オプション (:h options 参照) |
:hoge | Exコマンド (:h :index 参照) |
hoge() | 組み込み関数 (:h functions 参照) |
v:hoge | Vim定義済変数 (:h v: 参照) |
+hoge | feature (:h +feature-list 参照) |
方針
こちらを参照。
vimで折畳み(folding)まとめ
はじめに
普段Vimを使っていて,コーディング中にみたくない部分を隠す方法を考えていたのですが,コメントで折畳
というありがたい言葉をいただきました.
自分の備忘録を兼ねて,まとめます.
折畳とは
IDEなどでよくある{}や[]などをまとめて隠すもの
で,+
や-
でその状態が表現される(のをよく見る).
Vimでもできるということを全く知らなかった.
折畳チートシート
折畳に関するコマンドはz
から始まる.
参考はこちらのページおよびvim上で:h fold
をして表示されたページとする.
折畳に関するコマンド一覧は以下である.
コマンドの動作について,特に指定しない場合はすべてカーソル行とする.
コマンド | 動作 |
---|---|
zf | 折畳作成 |
zd | 折畳削除 |
zD | 折畳を全て削除 |
zE | ページ全体の折畳みを全て削除 |
visual + zf | 選択範囲を折畳 |
2 + zF | 2行折畳 |
2,5 fo | 2行から5行を折畳 |
zo | 折畳を削除せず開く |
zO | 折畳みを全て削除せず開く |
zc | 開いている折畳を閉じる |
zC | 開いている折畳を全て閉じる |
za | 折畳の状態を切り替える |
zA | 全ての折畳の状態を切り替える |
zv | カーソル行を表示 |
zx | 折畳のUndo |
zX | 折畳のRedo |
zm | ページ内の折畳を一段階閉じる |
zM | ページ内の折畳を全段階閉じる |
zr | ページ内の折畳を一段階開く |
zR | ページ内の折畳を全段階開く |
2,5 foldo | 2行から5行の折畳を開く |
2,5 foldc | 2行から5行の折畳を閉じる |
zn | ファイル全体の折畳を開く |
zN | ファイル全体の折畳を閉じる |
zi | ファイル全体の折畳の状態を反転 |
zj | 上の折畳に移動 |
zk | 下の折畳に移動 |
Vimで折畳みを使う方法
最も簡単なのは,zf
コマンドで折畳を作成し,zd
コマンドで折畳を削除する.
とりあえずVisual + zf
で選択範囲を折畳してくれるというのも覚えておいた方が良さそうだ.
おわりに
実際に自分ではまだ使っておらず,これから使おうと思っているところですので,何かあれば教えていただけると幸いです.
また,まだVim初心者ですので,他にも便利なものがあれば教えてくれると幸いです.
Vim/Neovim の terminal mode の中で Vim/Neovim を実行するときに便利そうなやつを作った
つくった
画像は https://ghlinkcard.com/から生成
参考: みんなにOSSを見てもらいたい人の為に、GitHubリポジトリのOGP的画像を自動生成してくれるサービスを作った
どういうやつ?
Vim/Neovim の terminal mode で Vim/Neovim を実行すると Vim/Neovim が入れ子に起動してしまう
これを回避するには Neovim の場合は mhinz/neovim-remoteを使うとよい
Vim8 の場合でも clientserver 機能や terminal-api を利用すればよい
参考(clientserver): Vim の :terminal の中から外の Vim を操る方法
参考(clientserver): :h clientserver
参考(terminal-api): :terminal に関する小さい Tips
参考(terminal-api): :h terminal-api
しかしいずれにせよ、vim/nvim の中と外で実行するコマンドを切り替えねばならんというのは面倒である
なので、自身が vim/nvim の中なのか外なのかをよしなに判断して上記の回避策を実行してくれるツールを作成した
先行研究もあったが、Vim8 のみ対応のようだったので Neovim にも対応する形で実装してみた
参考: Vim in Vim しない :terminal
どうやってつかう?
あとは alias vim=vimalter
みたいな感じで shell の alias 登録すれば、どこでもとりあえず vim
って実行すればいい感じに vim/nvim が開く
なにをしている?
vimalter
コマンドを実行しているのは vim なのか nvim なのか shell なのか
vim/nvim は terminal mode のとき、いくつか環境変数を追加してくれているので、それを利用した
環境変数 VIMRUNTIME
に runtimepath を入れてくれているようなので(ex. VIMRUNTIME=/usr/share/nvim/runtime
)一つ上のディレクトリ(ex. /usr/share/nvim
) の部分が nvim
なのか vim
なのかで判定した
もしかすると自前で vim/nvim を build してたりするとここに vim
or nvim
が入っておらず、上手く動かないかもしれない
neovim の場合
単純に引数を nvr
コマンドに食わせて実行すればよい
vim の場合
vim は少し複雑で :term
する前に call remote_startserver('hogehoge')
を叩いているかどうかで挙動を変える必要があるremote_startserver()
は +clientserver
オプションを付けて build された vim でしか実行できない関数で、引数に指定された名前(例では hogehoge
)で vim サーバを起動するコマンドである
これが実行されていれば terminal mode では 環境変数 VIM_SERVERNAME
に hogehoge
と入っているので vim --servername $VIM_SERVERNAME --remote
file_name というコマンドを実行すれば親の vim で file_name
を開いてくれる
call remote_startserver('hogehoge')
されていない場合は環境変数 VIM_SERVERNAME
は空なので他の方法を考える必要がある
今回は terminal-api を利用した
terminal-api の詳細は先に挙げた参考資料に任せるとして、とにかく echo -e \x1b]51;[\"drop\",\"file_name\"]\x07
と terminal mode で実行すれば親の vim で file_name
に指定したファイルを開いてくれる
vim の実行ファイルを探索する
/usr/bin/vim
が vim だといつから錯覚していた?
はい、debian 系(というか update-alternatives
を使用している場合などは大抵) /usr/bin/vim
とはただのシンボリックリンクである
実態はどこにいるかは辿ってみないと分からないので雑に vim
に引数を食わせるわけにはいかない
ちゃんと現在 terminal mode で実行中の vim の実 path を辿ってやる必要がある
方法は愚直に PPID を辿って vim
または vim.basic
(debian で apt
で入れた vim の実行ファイル名はこれになる) という文字列が実行ファイル名になっているものを探すapt
でインストールされた vim の実行ファイル名は他にも vim.tiny
とかもあるが、vim.tiny
は terminal mode が使用できないので除外した
他にも実行ファイル名のパターンがあれば Issue か PR をください...!
この実装をする際 shirou/gopsutilが非常に便利だった
-tab
option
Vim の --remote
オプションは親でファイルを開く際、ファイルをウィンドウ分割して開く、という挙動となっており、個人的には --remote-tab
の挙動のほうが好みだったので -tab
オプションで制御できるようにした
弊害として、vim 側のオプションを渡す際は --
を付ける必要があるが、まあ大抵こういうコマンドはそうなってるのでいいかな、と(適当)
vim --remote-tab
だと、既存に空ファイルのウィンドウがあればそのウィンドウでファイルを開き、それ以外の場合は新規に tab を作成してそこでファイルを開く、という挙動をする
このとき困るのは terminal-api
での実装で、現状 drop
コマンド(つまり挙動としては --remote
と同じ)しか雑にファイルを開くときには使えないので --remote-tab
を真似ることはできないcall
コマンドというユーザ定義関数を呼ぶコマンドもあるにはあるが、Tapi_
で始まるユーザ定義関数しか呼べない、という制限があるため現状は未実装ということにしている
今後の予定として Tapi_
関数群を提供する Vim plugin を書いて、この挙動を実装する方針である
VsVimでINSERTモード中にカーソル移動できるようにする
Visual Studio上でVimで操作できるアドオン「VsVim」でINSERTモード中にカーソル移動できる方法の紹介です
C:\Users\ユーザー名\_vimrc
%userprofile直下に新しく_vimrc設定ファイルを作成する
inoremap <C-j><Down>
inoremap <C-k><Up>
inoremap <C-h><Left>
inoremap <C-l><Right>
_vimrcにカーソル設定を記述。Ctrl+ノーマルモードの移動キーにしています。
Ctrlが効かない場合
Visual Studioのキーバインド設定が優先されるので、解除します。
メインメニューのツール➞オプションから左メニューの環境ー➞キーボードから割り当てを設定します。
下のショートカットキー(P)の下の欄でショートカットキーを入力すると現在使用されているショートカットが出力されます。
削除したいショートカットを以下の文字列を含むコマンドを表示の下の欄で検索し、該当するものを削除すればキーバインド設定を解除できます。
参考
https://qiita.com/Shaula/items/0264fe6fb436f2525702
https://qiita.com/zimathon/items/d02e587466dbdc90c9d3
https://qiita.com/suin/items/aec243abfda17bfac013
https://qiita.com/motty93/items/12dc20a7a5385a17063f#_reference-ffd76f09cd5abe767a16
VSCodeVimで行表示値の切り替えをショートカット化したい時のTips
TL;DR
- 行表示切替の設定をショートカット登録(VSCodeVim)
- 「Settings Cycler」を使用して、拡張機能内の設定を切り替える
行表示の設定とは
vimの場合
setnumber " 行頭からの絶対値で表示
set relativenumber " 現在行からみた相対値で表示
VSCodeの場合
設定 > Editor: Line Numbers を切り替え
- on / off ... 行番号の表示 / 非表示(絶対値)
- relative ... カーソル位置までの相対値
- interval ... 10行ごとに表示(絶対値)
表示切替の方法
ショートカットで設定を切り替えたいんだけどどうすれば...
- 拡張機能から「Settings Cycler」をインストール
- keybindings.jsonに以下の設定を追加
//number/relativenumberの切り替え{"key":"f3","command":"settings.cycle","when":"editorTextFocus","args":{"id":"relativeLineNumbers","values":[{"editor.lineNumbers":"on"},{"editor.lineNumbers":"relative"}]}}
これでF3キーで切り替えができるようになります
[忘備録]laravel5.5 データベースjoin 結合
laravelを用いて初めてデータベースの結合をしてみると、想像以上に簡単だったので、忘備録として残しておこうと思う。
前提
データベースにlaravelデフォルトの users
に加え、 id
, uesr_id
, text
カラムを含む posts
テーブルを用意する。
postsテーブルを作成する際はマイグレーションファイルで user_id
カラムを次のように設定する。
$table->integer('user_id')->unsigned();
$table->foreign('user_id')->references('id')->on('users');
流れ
①モデル設定
②コントローラーから使う
①モデル設定
今回はユーザーが複数のpostを持つというで、以下のような関係になります。
user has many posts
posts belongs to user
この点を踏まえて、 User.php
, Post.php
に以下のコードを追記。
publicfunctionposts(){return$this->hasMany('App\Post');}
publicfunctionuser(){return$this->belongsTo('App\User');}
これで準備は整いました。
②コントローラーから使う
今回はコントローラーで確認用 unction join()
という関数を作ります。
functionjoin(){#postsテーブルのuser_idが1のレコードを全て取得$user=User::find(1);$posts=$user->posts;#postテーブルのデータを全て取得$posts=Post::all();#上記で取得した「postsテーブルのuser_idが1のレコード」をひとつずつ表示foreach($postsas$post){echo$post."<br/>";}#上記で取得した「postテーブルのデータ」から結合されたユーザーの名前をひとつずつ表示する。foreach($postsas$post){echo$post->user->name."<br/>";}}
これで、適当にルート設定をし、うまく表示されていることを確認することができました。
おかしな部分がある場合、指摘していただけるとありがたいです。
coc.nvimをWSLにインストールする手順メモ
概要
PC(Windows10)上のWSL(Ubuntu 18.04)にcoc.nvimを入れたときのインストール手順を書き留めておく。
参考にしたwebページ
Vimの補完プラグインであるcoc.nvimが強すぎる。
coc.nvim公式のwiki
環境
環境 | バージョン等 |
---|---|
OS | Ubuntu 18.04 @ Windows 10 64bit (Pro) |
shell | zsh 5.4.2 (x86_64-ubuntu-linux-gnu) |
coc.nvimに必要なソフトウエアの一覧
ソフトウエア名 | バージョン |
---|---|
vim | >= 8.1 |
nodejs | >= 8.0 |
yarn | 指定なし (vimプラグインでcocのextentionを 管理する場合は不要) |
vimではなくneovim(>=0.3.1)でも動作するが、今回はvimで試したので、
その手順のみ記載する
インストール手順
apt-getでvimを取得すると、バージョン8.0が降ってくるため、ソースからビルドする必要がある。基本的にはここの手順に従えばいい。
$ git clone https://github.com/vim/vim.git
$ cd vim/src
$ make
$ sudo make install
nodejsをインストールする際、coc.nvimトップに記載されているコマンド(パイプの後がsh)を実行するとスクリプトエラーが出たため、bashで実行したらうまくいった。また、bashのみだとPermissionエラーが出るため、sudoで実行。
curl -sL install-node.now.sh/lts | sudo bash
yarnのインストールはsudoいらなかった(~/にインストールされるため?)
curl --compressed-o--L https://yarnpkg.com/install.sh | bash
筆者はdein.vimでプラグインの管理をしているので、.vimrcに以下の記述を追加して、:call dein#install()すると、coc.nvimが入ってくる。
:call dein#add('neoclide/coc.nvim',{'merge':0,'build':'./install.sh nightly'})
extensionのインストール(任意)
必要ならばextenionをインストールする。coc.nvimが正しくインストールされていれば、以下のコマンドを実行するだけでよい。extentionはcoc.nvimトップの下のほうに記載がある。pythonなどの言語補完以外にも、highlightなどもあるとのこと。
:CocInstall <extentionの名前>
おわりに
試しにインストールして触ってみた感じ、かなり使いやすい感触。dein.vimと組み合わせれば、プラグイン管理には困らないと思うなぁ。。。
筆者は以下のように分けていこうと考えています。
- vim全体の環境(Unite, Filerなど)の管理はdein.vim
- プログラミング関連の管理(snippet,補完機能など)はcoc.nvim
句読点を「、。」→「,.」と変換する .vimrc
普段,句読点を「,.」を標準としています.
でも,世の中の多くの文章は「、。」で,コピペしたときにいちいち変換するのが面倒だったので,.vimrc
に設定を書きました.
設定
こんな感じです.
" convert punctuation marks
nnoremap <Leader>cp:%s/、/,/g<CR> \| :%s/。/./g<CR>
vnoremap <Leader>cp:s/、/,/g<CR> \| gv \| :s/。/./g<CR>
変換例
ノーマルモードで<Leader>cp
と打つとバッファ全体について変換します.
私わたくしはその人を常に先生と呼んでいた。
だからここでもただ先生と書くだけで本名は打ち明けない。
これは世間を憚はばかる遠慮というよりも、その方が私にとって自然だからである。
私はその人の記憶を呼び起すごとに、すぐ「先生」といいたくなる。
筆を執とっても心持は同じ事である。
よそよそしい頭文字かしらもじなどはとても使う気にならない。
↓
私わたくしはその人を常に先生と呼んでいた.
だからここでもただ先生と書くだけで本名は打ち明けない.
これは世間を憚はばかる遠慮というよりも,その方が私にとって自然だからである.
私はその人の記憶を呼び起すごとに,すぐ「先生」といいたくなる.
筆を執とっても心持は同じ事である.
よそよそしい頭文字かしらもじなどはとても使う気にならない.
ビジュアルモードで行選択して<Leader>cp
と打つと,選択範囲だけ変換します.
私わたくしはその人を常に先生と呼んでいた。
だからここでもただ先生と書くだけで本名は打ち明けない。
これは世間を憚はばかる遠慮というよりも、その方が私にとって自然だからである。
私はその人の記憶を呼び起すごとに、すぐ「先生」といいたくなる。
筆を執とっても心持は同じ事である。
よそよそしい頭文字かしらもじなどはとても使う気にならない。
↓
私わたくしはその人を常に先生と呼んでいた。
だからここでもただ先生と書くだけで本名は打ち明けない.
これは世間を憚はばかる遠慮というよりも,その方が私にとって自然だからである.
私はその人の記憶を呼び起すごとに、すぐ「先生」といいたくなる。
筆を執とっても心持は同じ事である。
よそよそしい頭文字かしらもじなどはとても使う気にならない。
Windows+gVim+pipenvでPython開発ことはじめ
はじめに
Windows+gVim+pipenv環境ではじめてPythonを開発するので、その時に行ったことをまとめました。
gvim上でオムニ補完と静的コード解析ができるまでがゴールです。
ChocolateyGetインストール
管理者権限のpowershellで下記実行
Set-ExecutionPolicy RemoteSigned
install-packageprovider ChocolateyGet
gitインストール
管理者権限のpowershellで下記実行
install-package git -providerName ChocolateyGet
Pythonインストール
管理者権限のpowershellで下記実行
install-package python -providerName ChocolateyGet
pipenvのインストール
pip install --upgrade pip
pip install pipenv
gvimインストール
kaoriya本家からgvimをダウンロードし解凍する。
https://www.kaoriya.net/software/vim/
$VIM(gvim.exeのあるフォルダ)をPATHに追加する
管理者権限で下記powershell実行
(例)kaoriya-vimをCドライブ直下に解凍した場合
$SystemPath = [System.Environment]::GetEnvironmentVariable("Path", "Machine")
$SystemPath += ";c:\vim81-kaoriya-win64"
[System.Environment]::SetEnvironmentVariable("Path", $SystemPath, "Machine")
gvimプラグインのインストール
下記プラグインを導入する。
https://github.com/davidhalter/jedi-vim
https://github.com/w0rp/ale
※$VIMはgvim.exeのあるフォルダ
※プラグインマネージャを利用している場合はそっちで導入
cd $VIM/plugins
git clone --recursive https://github.com/davidhalter/jedi-vim.git
git clone https://github.com/w0rp/ale.git
pythonファイルを開いたときのオムニ補完をjediに設定するようvimrcに追記
autocmd FileType python setlocal omnifunc=jedi#completions
gvim用のpipenvを作成し、flake8をインストールする
※$VIMはgvim.exeのあるフォルダパス
cd $VIM
mkdir gvim_pipenv
cd gvim_pipenv
$env:PIPENV_VENV_IN_PROJECT = 1
pipenv --three
pipenv install flake8
gvim用のpipenvをgvimから使えるようvimrcに追記する
let $PATH = $PATH .";". $VIM ."\\gvim_pipenv\\.venv\\Scripts"
プロジェクト作成
mkdir newproject
cd newproject
pipenv --three
プロジェクトに必要なライブラリをインストール
pipenv install hogehoge(必要なライブラリ)
pipenvの仮想環境に入る
pipenv shell
(以後の操作はこの仮想環境内で行う)
gvim起動
※pipenv仮想環境内で実行
gvim main.py
実行
※pipenv仮想環境内で実行
python main.py
豆知識
WindowsはPythonにPATHを通さなくてもPythonランチャーからPythonやモジュールの実行が可能。しかし、pipenvをpythonランチャーから起動すると何故かエラーがでるのでPATHを通してpipenvを実行する必要がある。ChocolateyGetからインストールすると自動でPATHが通る。
補完をするモジュールjediはjedi-vimの中にサブモジュールとして含まれているので別途インストールする必要はない
python-language-serverとvim-lspを用いても補完が可能だが、jedi-vimと違いpython-language-serverをシステムにインストールする必要があり、プロジェクトにインストールしたライブラリに対しての補完が効かない(なにかやり方はあるかもしれない)
pythonファイルをgvimで開いたときにそのpythonファイルが含まれるpipenv仮想環境に自動で入ってくれるプラグインvim-pipenvがあるが、Windowsには未対応である模様
Atom,Vimいい感じの設定【自分用】
バージョン
- Atom 1.36.1
- Vim 8.0
Atom設定
背景
- UI Theme = One Dark
- Syntac Theme = Monokai
パッケージ
- advanced-open-file(Atom内でファイル開く)
- atom-beauty(自動インデント整理)
- atom-clock(エディタ内に時計)
- autoclose-html(htmlで自動閉じタグ)
- autocomplete-paths(パスの補完)
- emmet(html,css入力を簡単に)
- file-icons(超見やすい)
- git-plus(git機能の拡張)
- highlight-selected(同じ文字をハイライト表示)
- linter(自動構文チェック)
- linter-erb
- linter-ruby
- linter-ui-default
- minimap(コード全体見れる)
- open-recent(前回使用したファイルを見れる)
- pigments(色を視覚的に)
- platformio-ide-terminal(Atom内でターミナル開ける)
- project-manager(プロジェクトの管理)
- rails-snippets(Railsの補完的な)
- show-ideographic-space(全角スペースを感知)
- tabs-to-space(tab,space置換)
- todo-show(todoリスト)
- tool-bar(ツールバー)
vim設定
"文字色ON
syntax on"256色使うset t_Co=256"molokai大好きcolorscheme molokai
"行番号setnumber"自動インデントの幅set shiftwidth=4"背景色hi Normal ctermbg=none
hi Normal ctermfg=grey
hi Visual ctermbg=236"カーソルつけるset cursorline
"カーソルのラインはいらないhiclear CursorLine
"カーソルの色hi LineNr ctermfg=239hi CursorLineNr ctermfg=grey
"コメントの色hi Comment ctermfg=darkgrey
GNU GLOBAL(gtags)を使ってみた。
GNU Global(gtags)とは
複数のソースファイルから関数や、変数の定義元/参照元を検索、移動することができるツール
https://www.gnu.org/software/global/global.html
セットアップ
環境
ubuntu18.04
amd64
ダウンロード
下記リンクから、自分の環境に合うものを選択。
https://launchpad.net/ubuntu/bionic/+package/global
ダウンロードリンクが出てくるページに飛ぶので、それをダウンロード
インストール
ダウンロードしたdebファイルからインストール
$ cd Downloads
$ apt install global_6.6.2-1_amd64.deb
vimプラグインとして入れる
$ ~/.vim/plugin
$ cp /usr/share/vim/addons/plugin/gtags.vim ~/.vim/plugin
準備
検索用のデータベースを作成する。
検索をかけたいプロジェクトルートに移動して、globalを実行するだけでOK。
$ cd proj/
$ gtags
vimから使う
コマンドモードで:Gtags 関数名
で定義元にジャンプできる。
使い方の詳細は下記を参照
https://www.gnu.org/software/global/globaldoc_toc.html#Vim-editor
vimの設定を少しカスタマイズ
Gtagsで検索結果が複数ヒットすると、QuickFixリストで一覧表示してくれる。
Quickfixリストを使った操作を簡単にするために、とりあえず次の設定を.vimrcに追加した。
QuickFixリストにジャンプするキーバインドを追加
nnoremap [o :copen<CR>
QuickFixリストからファイルがオープンされたら、それをタブで開くようにする設定
set switchbuf+=usetab,newtab
【Vim初心者】Vimを整えたいんだが、何からすればええんや?
Vimを触ってみたい
VSCodeにVim拡張を入れて触ってたんやけど、Vimそのものを触りたくなったんや
けど、Vimの設定、何からすればええのか分からへん...。知ってるのは操作だけや。
っていう自分メモ。
# 環境
OS : Manjaro Linux
Linuxカーネル : 4.19.24-1-MANJARO
$ vim --version
VIM - Vi IMproved 8.1 (2018 May 18, compiled Mar 29 2019 20:08:59)
Included patches: 1-1073
Compiled by Arch Linux
まずはパッケージマネージャを用意しよう
dein.vim使ってパッケージ管理するのおすすめ
— でみ (@Sw_Saturn) 2019年4月11日
NeoBundleが今まで使われとったらしいが、今はdein.vimが主流らしいわ。
なんや、早いらしいで。
(いつも教えてくれてありがとう。)
丁寧にまとめてくれている記事があるので、それを参考に。
dein.vimのインストール自体にハマってしまったメモ
・こんな感じのが出てくるからしっかりとコピーしてvimrcの末尾に貼っておく。
vimrcってvimの設定ファイルのことらしいで。ホームディレクトリにあるらしいから書き込んで保存やな。
(install.shが個人の環境に合わせたディレクトリパスに書き換えたvimrcの設定を吐き出すみたい。すごいね。)
$ vim ~/.vimrc
プラグインを入れる時は、NeoBundle から dein.vim に乗り換えたら爆速だった話に書かれているように、TOMLっていう設定ファイルに書き込むようにするらしい。高速起動のため、今後のためにもやってみようと思いましたが、初心者には難しい...。少し勉強してから書き直すことにします。
特に、プラグインリストの TOML 化は高速起動のために必須です。
ですので、ここでは、vimrcに直接書き込むことにします。
最初はカラースキームを設定しよう
よっしゃ!なんでも見た目から入るんが正解や!かっこよくしたるで!!
(今回はVSCodeでも使ってるayuを選びました。)
パッケージマネージャでGitHubのリポジトリ名を打ち込むだけで、後は勝手にやってくれるらしいわ
こんな感じにvimrcに書き込んでみるで
...省略
" Add or remove your plugins here like this:"call dein#add('Shougo/neosnippet.vim')"call dein#add('Shougo/neosnippet-snippets')call dein#add('ayu-theme/ayu-vim')
...省略
"End dein Scripts-------------------------"-----------------------------------------" ColorScheme"-----------------------------------------set termguicolors " enable true colors support
"let ayucolor="light" " for light version of theme"let ayucolor="mirage" " for mirage version of themelet ayucolor="dark" " fordark version of theme
colorscheme ayu
できた!
ええ感じや!light、mirage、darkの3種類あるけど、darkが一番やで!
(オタクブラック好きやからな...。)
ここからが本番。設定はとりあえず、コピペしよう
一体、どんな設定項目があるんかも知らへん。そんな人にはこの記事や。
何も考えず~/.vimrcにこれを書くんだ! 〜vim初心者によるvim初心者のためのvim入門〜
まずはvimの先駆者たちから設定を拝借しましょう。
最初は意味がわからなくても大丈夫です。そのうち自己流にカスタマイズしたくなってくる時がきます。
感謝しかあらへん。コピペさせてもらうで!
(~/.gvimrcに関しては、GVim用の設定なので、関係なさそうです。)
行番号が出てきたり、検索の操作も表示もわかりやすくなったで!
(ちなみに、タブはスペース4個分にしてほしい派です。そこだけ変えました。)
もう少しいじってみたい
ほな、次はこれや。Vimプラグインまでの内容で、書いとらへんもんを追記していくで。
【詳解】モテたいVimmer必見 快適にコーディングするためのvimrc解説
自分が欲しい機能
VSCodeでVimを使ってるけど、欲しい機能があるんや。
とりあえず、こいつらや。
ESCと半角切り替えしないとカーソル移動できないのが手間
fcitxを使ってるんやけど、説明してくれてる記事読んでもちゃんとできへんかったから保留。
現在の行からの移動距離がわかるようにしたい
'set relativenumber' で Vim のカーソルの縦移動とかを改善する
これは、行番号の絶対位置から相対位置の表示にするオプションがあるらしいわ。
F3で切り替えられるようにも設定しておいたで。
現在のモードがわかりやすくしたい
【詳解】モテたいVimmer必見 快適にコーディングするためのvimrc解説
lightline.vimっていうプラグインがこれやわ!
lightline.vimはVimのステータスラインをかっこよくしてくれたり、編集してるファイルの詳細情報を表示してくれたりします。
lightline.vimはインストールするだけで使えますが、カスタマイズすると編集しているファイルのファイルパスを表示したり、Gitのブランチ名表示できたりします。
インストールはdein.vimでの方法に変えて、設定は記事に書いてあるやつコピペさせていただきました。
" インストールcall dein#add('itchyny/lightline.vim')
あー!これ、Vim使ってる人の画面で見たことあるやつや!!
なんやVimmerの仲間入りした感じするわ!
Vimいじりが楽しくなってきたので、試したものを少しずつ書き留めて置こうと思います。
最終のvimrc置いておきます。