Quantcast
Browsing Latest Articles All 4224 Live
Mark channel Not-Safe-For-Work? (0 votes)
Are you the publisher? or about this channel.
No ratings yet.
Articles:

ブラウザのテキスト入力をVim化

こんにちわ
ゴリラです

仕事に限らず、普段はブラウザでテキストを入力することも多々あると思います。
ぼくは、その度にVimのキーバインドを使えたらなと思ったことがこれまで何度もありました。

そこで、wasaviというChromeの拡張を教えてもらいました。
試してみた結果とても良かったので紹介します。

Chromeはこちらからインストールできます。

どんな感じ?

こんな感じです。
wasavi.gif

使い方

デフォルトはCTRL-EnterでViに切り替わります。
:wで入力が反映され、:wqで反映してViを終了します。

他にもオプションなどを設定できます。

設定

いくつかのexコマンドが使用できます。
image.png

デフォルトはtextareaのみ対象になっていますが、input系も入れておくと便利です。
image.png

Vimに切り替えるキーをいくつか設定できます。デフォルトはCTRL-Enterです。
image.png

さいごに

日本語入力の削除の挙動が若干変ですが、とても便利なのでVimmerの方はぜひ試して見ください
ぼくはQOLが上りまくりです

自分が必要だと思ったvimコマンド集(随時編集予定)

自分が必要だと思ったvimコマンド集(随時編集予定)

カーソル移動

コマンド内容
0行頭移動
$行末移動
%対応する括弧に移動
V行単位の選択をするビジュアルモードに入る
Ctrl-v矩形選択をするビジュアルモードに入る
Cカーソル位置から行末まで削除して, インサートモードに入る
Dカーソル位置から行末まで削除
I行頭からインサートモードに入る
A行末からインサートモードに入る
>>インデントを追加
<<インデントを削除
=選択行のインデント修正
Ctrl-aカーソル行上で, カーソル以降の最初に出現した数字をインクリメント
Ctrl-xカーソル行上で, カーソル以降の最初に出現した数字をデクリメント
r[文字]カーソル上の文字を[文字]に置換

コマンド内容
ciwカーソル位置にある単語を1つ削除して, インサートモードに入る
ci"カーソル位置にあるダブルクォートを1つ削除して, インサートモードに入る
ci(カーソル位置にある丸括弧を1つ削除して, インサートモードに入る
citHTMLタグの内部を削除して、インサートモードに入る
yiwカーソル上の単語をコピー

選択

コマンド内容
viwカーソル上の単語を選択。
vi"ダブルクォーテーションの内部を選択。
vitHTMLタグの内部を選択。

Office365でvimxlsが動かない(アドインに入れたのに認識しない)

あとで清書します。

ファイル→オプション→トラストセンター→トラストセンターの設定(T)...→信頼できる場所→新しい場所の追加(A)...→パス(P)にvimxlsのファイルがあるフォルダのパスを入力→OK→OK→OK→念のためにExcelを起動し直す

参照URL
https://hiromiworks.wordpress.com/2016/09/12/excel2016

JSONファイルを整形する方法について

JSONファイルを整形する方法について

JSONファイルを整形したい場合は様々なシチュエーションであると思いますが、
それぞれのケースにおける成形方法を説明致します。

前提条件

macOS
※但し、未検証なだけでWindows環境でもjqは利用できます。

事前準備

jqをインストールする

$ brew install jq

Vimで整形したい場合

コマンドラインで以下を入力する

:%!jq

VSCodeで整形したい場合

JSONを行選択して=を押す
もしくはJSONを行選択してコマンドパレット(右クリック、またはショートカットキーから)を開き、Format Documentを選択する

クリップボードの内容を整形したい

ターミナルから以下のコマンドを実行する

pbpaste | jq

※試したことはないですが、Windowsでもpbpasteは使える様です。

Vdebugを使ってVimでPHPのデバッグ環境を整える

PHPはずっとPHPStormで書いていて不自由はなかったのですが、最近他の言語でvimを使いだしたところ、全部vimでやりたくなる一過性の病にかかったのでPHPでデバッグ環境を整えています。

PHPのxdebugを実行するのにvimのプラグインVdebugを使います。
vim-vdebug/vdebug: Multi-language DBGP debugger client for Vim (PHP, Python, Perl, Ruby, etc.)

全部マニュアルに書いてあるので読めば終了なんですが、せっかく触りながらマニュアルの内容を確かめたので備忘として残しておきます。
ただし、CLIでローカル実行した場合についてです。
ブラウザからのリクエストで起動する場合やリモートデバッグはまたいつか追記するかもしれません。

<実行中の雰囲気>
phpdbg-memory-2.gif

インストール・初期設定

xdebugのインストールはすでにたくさん記事があるので省略。

Vdebugのインストール

僕はPlugin managerにjunegunn/vim-plugを使っています。

.vimrc
call plug#begin('~/.vim/plugged')" Debug
Plug 'vim-vdebug/vdebug'call plug#end()

.vimrcに追記してから

:PlugInstall

呼び出しスクリプトの作成

また、CLIから実行する場合は、環境変数XDEBUG_CONFIGidekeyの指定が必要です。毎回打つのが面倒なのでショートカット用のshellscriptを作ります。

php-xdebug
#!/bin/bashexport XDEBUG_CONFIG="idekey=xdebug"
/usr/bin/php "$@"

phpのパスは環境に合わせます。
実行権限付与して適宜パスの通っている場所に移します。

$ chmod +x php-xdebug
$ mv php-xdebug /to/your/path/

こんな風に使用。

$ php-xdebug myscript.php

使い方

基本の使い方

  1. 止めたい行にブレークポイントを設置(F10)
  2. Debuggerをスタート(F5)
  3. Terminal別タブでそのブレークポイントを通過する処理を呼び出し
  4. Debuggerをストップ(F6を2回)

windowの見方

各windowはこんな感じになります。
スクリーンショット 2020-06-13 23.02.54.png

よく使うキーバインド

  • F5・・Start
  • F6・・Stop
  • F2・・Step Over
  • F3・・Step In
  • F4・・Step Out
  • F9・・Run To Cursor
  • F10・・Toggle Break Point

ブレークポイント

  • F10でtoggle
  • :BreakpointWindowでブレークポイント一覧を確認
    • このウィンドウで消したいブレークポイントの行にカーソルをあわせて ddで該当ブレークポイントを削除
  • :BreakpointRemove *で一括削除

いろんなブレークポイント

F10の通常の行ブレークポイント以外にいくつかの特性を持ったブレークポイントを利用できます。

使い方
:Breakpoint <type> <arguments>

conditional

行ブレークポイントと似ていますが、ブレークが発動する条件を指定できます。
使い所は「ループの◯回目のみ止めたい」とかですかね。
標準の行ブレークポイント以外では唯一これだけ使いそうな気がします。

例)$xが2の場合のみブレーク
:Breakpoint conditional $x == 2

exception

指定した例外が発生した場合にブレークする

:Breakpoint exception PDOException

call

指定の関数が呼び出された場合にブレークする。マニュアルを見るに、挙動は保証されていないようです。

:Breakpoint call open_file

return

指定の関数からreturnされた場合にブレークする。同じく、挙動は保証されていないようです。

:Breakpoint return open_file

watch

指定の変数に書き込みがあった場合にブレークする。マニュアルにはxdebugでサポートされていないので期待するなと書いてあります。僕の環境では動かなかったです。特に期待してなかったので大丈夫でした。

:Breakpoint watch $myvar

任意の式の評価

実行ポイントのコンテキストで任意の式を評価させることができます。デバッガーの醍醐味とも言える機能ですね。
実行方法が3種類あります。

1) 記述した式を評価する方法

:VdebugEval $x * 3

これはwatch windowに表示されますが、ステップを進めるとデフォルトのwatch windowに戻ります。
指定した式の評価をwatch windowに固定表示させたい場合は:VdebugEval!を使います。

:VdebugEval! $x * 3

デフォルトのwatch windowに戻したい場合は式無しで以下を打ち込みます

:VdebugEval!

2)visualモードで選択した式を評価する方法

vで選択後 <leader>eで評価

3) traceウィンドウで評価を確認する

:VdebugTraceを使うとwatch windowとは別にtrace windowで式をトレースできます。
VdebugEval!と似ていますが、watch windowをデフォルトとのままにしつつ式の評価を追うことができます。

:VdebugTrace $x

細かい設定とか

デフォルトオプション

    let g:vdebug_options = {
    \    'port' : 9000,
    \    'timeout' : 20,
    \    'server' : '',
    \    'on_close' : 'stop',
    \    'break_on_open' : 1,
    \    'ide_key' : '',
    \    'debug_window_level' : 0,
    \    'debug_file_level' : 0,
    \    'debug_file' : '',
    \    'path_maps' : {},
    \    'watch_window_style' : 'expanded',
    \    'marker_default' : '⬦',
    \    'marker_closed_tree' : '▸',
    \    'marker_open_tree' : '▾',
    \    'sign_breakpoint' : '▷',
    \    'sign_current' : '▶',
    \    'continuous_mode'  : 1,
    \    'simplified_status': 1,
    \    'layout': 'vertical',
    \}

個別で上書き

.vimrc
    if !exists('g:vdebug_options')
      let g:vdebug_options = {}
    endif
    let g:vdebug_options.port = 9001

まとめて上書き

.vimrc
let g:vdebug_options = {
    \   '"port' : 9000,
    \    'break_on_open' : 0,
    \    'ide_key' : '',
    \}

基本はデフォルトのまま使っていますが、break_on_openは0にしています。これは実行されるスクリプトの1行目でステップが止まるかどうかの指定です。ブレークポイントより前で止まっても鬱陶しいのでオフにしています。

レイアウト

g:vdebug_options.layouthorizontalを指定するとレイアウトがデフォルトから変わります。
スクリーンショット 2020-06-23 21.46.34.png

感想

  • evaluationを複数同時にtraceできない点以外はIDEの場合とくらべて特に不便とかはなかったです。

VimでPythonのコードを自動整形する

使うものリスト

今回使っているプラグインのリンクです。
各自READMEなど確認しておいてください。

autopep8のインストール

pip install autopep8

vim pluginのインストール

vimのプラグイン管理をdeinで行っている人は、plugin_lazy.tomlに以下の行をコピーして貼り付ける。(deinを使ってない人は今すぐdeinを使いましょう)

[[plugins]]
repo = 'nvie/vim-flake8'
on_ft = ['python']

[[plugins]]
repo = 'tell-k/vim-autopep8'
on_ft = ['python']

.vimrcの編集

gitにpushする前に自動で実行したりファイルを保存するときに自動で実行したりすることも可能ですが、あまり勝手に実行されても怖いのでvim上でsift+fを押したときに自動整形が実行されるように設定します。
以下を.vimrcに追記します。

"autopep8を<sift>+fで実行
function! Preserve(command)
    " Save the last search.
    let search = @/
    " Save the current cursor position.
    let cursor_position = getpos('.')
    " Save the current window position.
    normal! H
    let window_position = getpos('.')
    call setpos('.', cursor_position)
    " Execute the command.
    execute a:command
    " Restore the last search.
    let @/ = search
    " Restore the previous window position.
    call setpos('.', window_position)
    normal! zt
    " Restore the previous cursor position.
    call setpos('.', cursor_position)
endfunction
function! Autopep8()
    call Preserve(':silent %!autopep8 --ignore=E501 -')
endfunction
autocmd FileType python nnoremap <S-f> :call Autopep8()<CR>

参考

これはこちらのStackoverflowのページを参考にしています。

使い方

  • vimのノーマルモードでF7キーを押すと、Flake8が実行されてpep8に準拠していない箇所が表示される。
  • 同じくノーマルモードでsift+fキーを押すと、Autopep8が実行されて、ソースコードの自動整形が行われる。

vimで:buffersなどの結果を絞り込む

諸元

:buffersoldfilesなどを絞り込みたくて、夏。

解決策

:filterを使う。

:fileter /.py$/ oldfiles

余談

過去に開いたファイルを絞り込みつつプロンプト指定ができる。
Uniteとか使えない環境で重宝する。

:filter /.py/ bro[wse] ol[dfiles]

Vim ( & ideavim ) キーマップ設定ガイド

Vim ( & ideavim ) キーマップ設定ガイド

なにやら難しそ〜うな vim の設定を、キー設定に絞って基本戦略という考え方でまとめてみようと、唐突に思った

凝ったワザとかイベント設定とかは視野に入れず、手に馴染むキー設定を自分で見つける方法を紹介します

なので設定集ではありません
自分の道具に人の設定が馴染むわけはないからね

こんな事を考えつつ自分で色々設定すると vi はグッと良い道具になるよ、というお話です

基本

ヘルプ

:tab help sみたいにヘルプを引くとsの説明が確認できる

["x]s       [count] 文字を [レジスタ x に入れ] 削除し、挿入を始め
            る (s は Substitute --置換 を意味する)。"cl" と同義で
            ある (行単位でない linewise )。

開いたタブは:bdeleteで閉じられる ( バッファの b )

ちなみに、:tab h sでも開けるし、:bdでも閉じられる

vim の命令は一意にできる長さを打てば残りは打っても打たなくても良いので、設定ファイルに書くときはフルで、手で打つときは略記で打ったりする

以後 vim のマニュアルに則り、略して良い部分は[]で囲って表記する

:tab h[elp] s, :bd[elete]

設定方法

設定ファイルに設定を書く場合は、ホームディレクトリに.vimrcを作ってそこに書けば良い

vim を再起動するか、:so[urce] ~/.vimrcで読み込むことで反映できる

設定ファイルを書く前に動作確認をしたい場合は、設定ファイルの内容を:で直接入力すれば良い

以下に例を示す

" sample
nnoremap jk

この設定はノーマルモードのjkの挙動にする設定である ( コメントは" )

設定ファイルに書く場合はそのままnnoremap j kと書き、直接入力する場合は:nnoremap j kとすれば良い
ただし直接入力した設定は、vim を終了すると破棄される

vim を終了せず設定を破棄したい場合は、:nun[map] jと入力すれば良い ( Normal UN Map )

また、:nnoremapだけ入力すると今ノーマルモードに設定されているキー設定が確認できる

設定の基本文法

先ほどのnnoremapについて補足する

vim のモードは実は細かくいくつか存在しているが、まずはこの 3 つだけ知っていれば十分設定を読み書きできる

" normal mode
nnoremap ab" visual mode
vnoremap ab" insert mode
inoremap ab

ちなみにnoremapmapが存在する、違いは以下の通り

nmap bc
nmap ab

と設定した場合、acの挙動をする

nnoremap bc
nnoremap ab

と設定した場合、abの挙動をする

他の設定を辿るか辿らないかの違いだが、基本的には再マップされないnnoremapを用いる方が安全で理解しやすいため、本記事ではnoremapを用いる

また、装飾キーは以下の様に表現する

nnoremap <s-a> bnnoremap A bと同意である
shift の場合は大文字で設定しても良いが、ctrl キーとかを装飾とする場合は<c-a>と記載する

方針

それでは本題

いくつかのグループに分けて整理すると手に馴染みやすいと思うので、グルーピングの方針を紹介する

  • shift で逆挙動
  • shift で強化
  • prefix を統一する
  • 左右や上下の向きを統一する
  • 他頻出するが打ち辛いもの
  • IntelliJ Actions

shift で逆挙動

デフォルトのキー設定のうち、shift をつけると挙動が逆になるものがいくつかある

o: カーソルに空行を作って入力モードにする
O: カーソルに空行を作って入力モードにする

とか

p: カーソルのにペーストする
P: カーソルのにペーストする

とか

f: カーソルのに向かって文字を探してジャンプする
F: カーソルのに向かって文字を探してジャンプする

とか

n: 検索文字をに探してジャンプする
N: 検索文字をに探してジャンプする

これに則って逆の挙動なのに全然違うキーマップをリマップすると良い

例えば

u: undo
<c-r>: redo

これは覚えづらいし流れで入力しづらいので、以下の様にリマップするのがおすすめだ

nnoremap U <c-r>

他にも自分で独自のキー設定を行う場合も、これを念頭に置いて設定するのがおすすめだ

shift で強化

デフォルトのキー設定のうち、shift をつけると挙動が強化されるものがいくつかある

i: カーソルので入力モードとなる
I: カーソルの行頭で入力モードとなる

とか

s: 1文字を削除しつつ入力モードとなる
S: 1を削除しつつ入力モードとな

とか

v: 文字単位のビジュアルモードになる
V: 行単位のビジュアルモードになる

とか

zo: 折り畳みを1つ開く
zO: 折り畳みを再帰的に全て開く

これに則ってデフォルトのキーに合わせて強化コマンドを設定すると良い

例えばj一文字下に移動するコマンドを強化してJ画面の一番下に移動するコマンドにしたりすると、手に馴染むと思う

ちなみに僕は色々試してみて10 行下に移動するコマンドにした

nnoremap J 10<Down>

prefix を統一する

先述のzoの様に、複数のキーを使って設定することも可能だ

例えばzで始まるものは畳み込みに関係するものが多い ( ジャバラのイメージらしい? )

自分でよく使う似た設定は同じプリフィックスでまとめたりすると使いやすかったりする

例えば僕はタブ操作に関係するものはgで始まる様に設定している

" 新規タブ
nnoremap gk :tabedit" タブを閉じる
nnoremap gj :bd<CR>" タブを閉じる ( 強制 )
nnoremap gJ :q!<CR>

これはもともとタブ左右切り替えがgtgTだったので、それに寄せたらこうなったって感じだ
gjに対してgJが強力なコマンドになっているのも、基本方針に則っている

余談 イメージ

むかーしマウスジェスチャーとかで設定した閉じるアクションが ↓ だったので、僕はずっと閉じるは ↓ のイメージ
最近の iPhone のタスク管理とかだと ↑ スワイプで終了したりするけど、あんなイメージで使ってる

▲ 余談

他には「まぁ無くなってもいっかな」ってキーを prefix 用にしてしまう、というのもアリだ

例えばよく例に上がるのがsだ ( 僕は好きなので潰してないけど )

sは1文字消しつつ挿入モードになるんだけど、あんま使わないってのとclが同じ結果になるのでよく潰して良いと言われている

あと<Space>も実質空いているので、こんな押しやすいキーを使わない手はないかな ( IntelliJ Actions で触れる )

あとは逆転の発想で, , , を好きに使ってしまうという発想もある

案外カーソルキーは使わないし、使わない方が良いし、稀にしか使わないけど設定しておくと便利なやつとかを当てはめておくのもアリだ

余談 カーソルキー

というかカーソルキーを使う限り、一生懸命 vi に慣れようとしてもせいぜい普通の 1.2 ~ 1.3 倍くらいのスピードにしかならない

それだったら vs code なり sublime なりに集中した方がよっぽど良いと、僕は思う

vi に慣れたいんだったらカーソルキーはやめよう

こんな感じで無効にしてしまった方がずっと良い

nnoremap <Left><Nop>

参考: Vimのカーソルキーを封じる - Qiita

▲ 余談

左右や上下の向きを統一する

例えばジャンプのデフォルトのキーはこうなっている
( vim で言語設定してジャンプできる様にしてない場合は、:tab h[elp] xで開いたヘルプの中や、IntelliJ の vim プラグイン ( IdeaVim ) で試すと確認できる )

<C-]>: 進む
<C-t>: 戻る

こんな押しづらくて覚えづらい2つのコマンド、手に馴染むわけないよね!

僕はこう変えた

nnoremap tl<C-]>
nnoremap th<C-t>

基本的に新しいタブは右側に開くので、カーソル移動のl, hとイメージを合わせてみた感じだ
これなら「ジャンプはtと方向だったな」って感じで習得できる

それから、タブ切り替えも僕はこう変えた

nnoremap gh gT
nnoremap gl gt

同じ考え方で、右のタブに切り替えるのをlに、左をhにしている

もう一つ僕の設定を
こんなのもアリだと思う

nnoremap zj zt
nnoremap zk zb

zzはカーソルのある行を画面の真ん中になる様に位置調整するコマンドで、「もうちょっと上も下も見たいな」って時に重宝する

zjzkで画面の真ん中ではなくて画面の上下端に調整することができる ( わかりづらいけど、カーソルを動かすのではなくスクロールバーを動かす動き )

もちろんこれもカーソル移動のj, kと合わせて設定している

こういうのは自分でうまく設定すると本当に手に馴染むので、ぜひ試してみて欲しい

他頻出するが打ち辛いもの

ここは今までの法則に則らないものだが、2つ発想の種を紹介したい

何が頻出するかは本当に人によるので、「よく使うな」と思ったら都度色々設定してみるのが良いと思う

僕は例えばこんなのを設定している

vnoremap v<C-v>
vnoremap ,<ESC>ggVG

一つ目はvnoremapだけど、実質はノーマルモードでvvと同じで、これで矩形選択ができる
矩形選択は縦に消したり縦に行末セミコロンを書いたりできるので極めて重宝する

これは装飾キーは os や pc によって位置が違ったりするのであまり使いたくないという考えから来ている
家は mac だけど会社の特定の環境は windows なんだ、とかあるよね

二つ目も実質ノーマルモードのv,と同じで、これは範囲全選択ができる
僕はチャットやメールも vi で書くので、書き終わったらv,yってすることがとても多いためだ ( ctrl + a, ctrl + c と同じ感じ )

これは見る通りggVGという普段から多用するキーのただの連打だけど、使用頻度を考えたらリマップした方が楽そうだなという考えから来ている

この辺は好みの問題なので、参考までにという感じだ

IntelliJ Actions

最後に IntelliJ に特化した話をしたい

何度か出てきている ideavim だが、こいつは結構すごい

設定ファイルは~/.ideavimrcという別のファイルだが、基本的に vimscript の文法のままキーマップとかができる

さらにすごいのは、.ideavimrcからは IntelliJ の機能が呼べるということだ
例えば「横断検索」とか「リファクタンリング」がnnoremap a Refactorみたいな感じで呼べてしまうのだ

あんまりちゃんとした?マニュアルがなさそうだったので、僕はここを見て探した
IdeaVim actionlist gist

僕の設定の一部を抜粋して紹介したい

nnoremap <Space>r:action Replace<CR>
vnoremap <Space>r:action Replace<CR>

nnoremap <Space>R :action ReplaceInPath<CR>
vnoremap <Space>R :action ReplaceInPath<CR>

nnoremap <Space>f:action Find<CR>
vnoremap <Space>f:action Find<CR>

nnoremap <Space>F :action FindInPath<CR>
vnoremap <Space>F :action FindInPath<CR>

基本方針に則って普段使っていたアクションをマッピングしたものだ

目立つくせに暇をしている<Space>共通の prefixにし、rRfF強化の関係になっている

また、ジャンプもこんな感じに設定している

nnoremap tl:action GotoDeclaration<CR>
nnoremap tL :action GotoImplementation<CR>
nnoremap th:action Back<CR>

tlthが先述の通り左右の方向と合わせた進むと戻るで、tLが interface ではなく implementation にジャンプするアクションになっている ( 極めて便利 )
これも基本方針通りtltL強化の関係になっている

余談 os やエディタを使い分ける面倒さ

実はこの設定は最近取り入れた

リモートワークになり windows を触らないといけなかったりリモート接続でキーの位置が狂ったりしていて、装飾キーを使う操作が苦痛だった

装飾キーから離れて vi に依存する様にすると os や物理キーに縛られづらくなると思うので、今後も積極的に考えていきたいと思う

ちなみにエディタを乗り換えたときに「1行消す」「置換ウィンドウを開く」とかのショートカットキーを覚え直すのが嫌なので、僕は vi 操作一本に絞って覚える様にしている

▲ 余談

自分の設定を作るには

基本スタンスはこんな感じだ、どうだろう?

あくまで個人的な考え方だけど、僕はこんな感じだったので参考まで
( ちなみに僕は勝手に vi を使い始めて今 8 年、周りに vimmer はほぼいなかったので完全に我流 )

  • いきなり人の設定を真似したりチートシートを覚えようとしても、無理に使う感じがするので合わない
  • 基本的に vi は素で使って「あ、僕これよく使うな」「んーこれ面倒だな vimmer はどうやってるんだろう」って思ったら都度調べたり設定したりしてた
  • そうすると本当に自分が使うものだけが自分の形で残る
  • 知見を広げるには人の設定ファイルを google とか git とかで探して、片端からヘルプを読んで取り捨て選択をしていた
  • たまに設定の棚卸しをして、捨てたりリマップしたりする ( これ絶対便利!って気持ちで設定したのを一度も使ってなかったりするw )

とにかく自分の欲に忠実に、そして堅実にヘルプを見てカスタマイズするのが醍醐味だと、僕は思うな!

良い道具磨きを

こちらもよろしく

Vim および作業効率化でいくつかネタをしたためている、こっちも見てもらえると嬉しいな

Vim パワーはテキストオブジェクトと繰り返しが7割 - 脱初心者の一歩

Vim パワーはテキストオブジェクトと繰り返しが7割 - 脱初心者の一歩

7割だって? ( 要出典 )
タイトルは勢いです

が、それでも vim の力のかなりの部分を占めるテキストオブジェクト等と繰り返しについて紹介します

diw: 1 単語を消すとかyab: かっこの中をコピーみたいな、ちょっと長くてしかもめちゃめちゃバリエーションがあって覚えづらそうなやつのことね

わかれば大したことないコマンドなのにパワーがすげーので、ぜひ使ってみよう!

本記事は以下の三本立てでお送りします

  • 範囲指定操作
  • テキストオブジェクト
  • 繰り返し

範囲指定操作

テキストオブジェクトと言いつつ本当はテキストオブジェクトではないんだけど似ている ( そして強力! ) 機能も一緒に紹介するぞ
数字に続いてまたタイトル詐欺だったごめんよ :p

これには厳密な名前はないと思うので、便宜上範囲指定操作と言います

基本

基本的には次の二手で成立する

操作 + カーソル移動

操作例

キー挙動覚え方
v選択visual
d削除delete
yコピーyank ( vim ではコピーをヤンクと言う )
c削除しつつインサートモードんー、なんだろう?
極めて便利なのでこれだけは指に覚えさせてしまおう

カーソル移動例

キー挙動補足
h j k l上下左右数字をつけるとその分動く
4h10k
^ と $行頭と行末
gg と G先頭行と末尾行
n次にヒットする検索ワードの先頭にジャンプする検索は/等で行う
%対応しているかっこにジャンプする
fカーソルより右の指定の文字ににジャンプするabcde の a にカーソルがあるときに
fdでカーソルがdの上になる
tカーソルより右の指定の文字のにジャンプするabcde の a にカーソルがあるときに
tdでカーソルがcの上になる

カーソル移動はそもそも重宝するので、それぞれ単体を普段から使う様にしておこう

細かい説明

基本的には次の二手で成立する

操作 + カーソル移動

範囲指定操作は、操作を、カーソルのある位置を始点とし、カーソル移動でジャンプする先を終点として実行する、という挙動になる

下のテキストを例に説明しよう

mailService.apply(body)
reportService

ちなみに undo はuで redo はctrl + rだ、がんがん手元で試してみよう

例 $

. にカーソルがあるときにd$とすると削除 + ここから行末なのでこうなる

mailService
reportService

dではなくてyだとコピーなのでy$.apply(body)がクリップボードに入る
下の行でpすればこうなる

mailService.apply(body)
reportService.apply(body)

例 %

( にカーソルがあるときにd%すると削除 + 対応するかっこまでなのでこうなる

mailService.apply
reportService

例 h j k l

mail の m にカーソルを合わせてd4l削除 + 4 右なのでこうなる

ちなみにd4lは 3 文字だけど、4lで一手なのでd4lは二手ね

Service.apply
reportService

ただ、文字数を意識するのは辛いので、大抵の場合は後述する t / f の方を推奨する

他には例えば 1 行目でdjすると削除 + 下の行なのでこうなる

カーソル移動を2jとかにすれば任意行をdできる

例 t / f

body の b にカーソルを合わせてdt)すると削除 + )の左までなので body が消える

mailService.apply()
reportService

mail の m にカーソルを合わせてdf.すると削除 + .の上までなのでmailService.が消える

apply(body)
reportService

例 c

同じく mail の m にカーソルを合わせてctSなら削除しつつインサートモード + Sの左までなので mail を消しつつ字を書ける
ctSsmsとでもすると、こうなる

smsService.apply(body)
reportService

整理

こうやって砕いて見ると普段使っているv, y, d, cf, tの組み合わせくらいしかないので、ビビるほど覚えることが多いわけではないでしょう?

自分がどの範囲を選んだのか確認したいときは、操作vにするとわかりやすいぞ

テキストオブジェクト

二手の操作には少し慣れただろうか?

続くテキストオブジェクトは、一定のルールで指定されるひとまとまりのテキストのことで、操作は三手で行われる

基本

操作 + 囲み方 + 範囲で成立する

操作例

ここは範囲指定操作の操作と全く同じなので、問題ないだろう

囲み方

これは抜粋ではなくてこれで全部だ

キー挙動覚え方
i範囲の内側inner
a範囲の境を含む冠詞の a
余談だけどさっき調べるまで勝手に around だと思ってた

範囲

キー挙動補足 / 覚え方
w単語word
記号それで囲まれた範囲" や ( や [ や ` 等
tタグtag

他にもいくつかあるので興味がある人は:tab h text-objectsでマニュアルを見てみよう

細かい説明

操作 + 囲み方 + 範囲で成立する

また例を見ながら上の説明を噛み砕いてみる

今度はこんなテキストを用意しよう

List<String> xs = ["<h2>$title</h2>", 'Hey John', 'thanks']

print(render(xs, 'welcome'))

例 w

thanks の上どこかにカーソルがあるときにdiwとすると削除 + 内側 + 単語なのでこうなる

List<String> xs = ["<h2>$title</h2>", 'Hey John', '']

print(render(xs, 'welcome'))

冒頭で例に出したdiw: 1 単語消すってのはこれのことだ

ちなみに 1 単語消えるので Hey の上で実行するとこうなってしまう

List<String> xs = ["<h2>$title</h2>", ' John', 'thanks']

print(render(xs, 'welcome'))

例 記号

Hey の上どこかにカーソルがあるときにdi'とすると削除 + 内側 + 'なのでこうなる

List<String> xs = ["<h2>$title</h2>", '', 'thanks']

print(render(xs, 'welcome'))

title あたりにカーソルを置いてdi"とするとこうなるし

List<String> xs = ["", 'Hey John', 'thanks']

print(render(xs, 'welcome'))

同じ位置でdi[とすればこうなる

List<String> xs = []

print(render(xs, 'welcome'))

String の上でci<Objectとすれば削除してインサートモード + 内側 + < + Objectなのでこうなる

List<Object> xs = ["<h2>$title</h2>", 'Hey John', 'thanks']

print(render(xs, 'welcome'))

これは大変便利だ、vim を使うならぜひとも習得したい

例 i / a

thanks の上どこかにカーソルがあるときのdi'は上で述べた通りこうなる

List<String> xs = ["<h2>$title</h2>", 'Hey John', '']

print(render(xs, 'welcome'))

同じ場所でda'だと'も含むのでこうなる

List<String> xs = ["<h2>$title</h2>", 'Hey John',]

print(render(xs, 'welcome'))

ちなみにさっきの Hey の上でのdiwdawにすると単語の境 ( = 半角空白 ) も消えるのでこうなる

List<String> xs = ["<h2>$title</h2>", 'John', 'thanks']

print(render(xs, 'welcome'))

ただ多分iの方がよっぽと多用するのでaはついでくらいで覚えておけば良いと思う

例 タグ

title の上どこかにカーソルがあるときにditとすると削除 + 内側 + タグなのでこうなる

List<String> xs = ["<h2></h2>", 'Hey John', 'thanks']

print(render(xs, 'welcome'))

これは拡張子とかは関係なく文字列がそうなっていれば使える
人によっては重宝する、かもしれない

例 入れ子

入れ子になっていても結構良い感じで動いてくれる

welcome の上でdi(をすればこうなるし

List<String> xs = ["<h2>$title</h2>", 'Hey John', 'thanks']

print(render())

render の上でdi(ならこうなる

List<String> xs = ["<h2>$title</h2>", 'Hey John', 'thanks']

print()

この辺は数回自分の手で試せば感覚でわかるはずだ

カーソルを色々動かしながらvi(va(をやって目で見てみることをおすすめする

繰り返し

最後に繰り返しだ、もう覚えるキーはあとたった 1 つだけだ

.を押すと直前の1 操作今のカーソルの場所で実行される

わかりやすい例だと、xで字を消した後は.でも字が消せたり、a,でカンマを入力した後は.でカンマが入力できる

んで、察しの良い方ならa,の例でお気づきかもしれないが、1 操作は 1 キーではないのだ

範囲指定操作やテキストオブジェクトの操作も1 操作なのだ

最後にこんなテキストでいくつか例を示そう

mailService.send(body, "user@com")
smsService.notice(body, "user@corp")

例えばカーソルが 1 行目左端にあるとして、df.mailServiceが消えるのは先に述べた通りだが、
そのままカーソルを下に持って行き.を押すと今度はdf.の繰り返しによりsmsServiceが消える

send(body, "user@com")
notice(body, "user@corp")

違う文字だけど.で同じ様に処理できているのがわかるだろうか

じゃあ今度は body の b の上でct,messageとしてみよう
変数名を body から message に変えたい、という感じだ

ん?変数名を変えるならエディタのリファクタリング機能で良い?
一理あるな ( 速さと手数は慣れ次第だが )
じゃあ com と corp を org に変えるということにしよう

1 行目の com の c の上でct"orgとして、カーソルをjで下に動かして.してみよう

mailService.send(body, "user@org")
smsService.notice(body, "user@corg")

...うまくいかないな?

これは繰り返したい操作の結果がカーソル位置に左右されているからだ

ct"は範囲指定部がtなので、カーソルより左はそのまま残ってしまう

対処方法は大きく 2 つある

1 つは/coで co を検索してnで co にカーソルをジャンプさせながら.する方法だ
c にカーソルが乗ればct"で正しく選択できる

ただしこれはうまくジャンプできる単語でかつどちらも"で区切られていないとうまくいかない

もう 1 つはテキストオブジェクトを使う方法だ

ct"orgではなくciworgであれば1 単語を消して org と打つのでカーソルが単語に乗ってさえいれば問題ない

mailService.send(body, "user@org")
smsService.notice(body, "user@org")

thanks の上どこかにカーソルがあるときにdiwと...

実はテキストオブジェクトの説明ではずっと上どこかと言っていたのだが、こういう違いがあるのだ

( の中をdi(で消してみたり、" の中をdi"で消してみたり、dt@で @ の前を消してみたりして、そのあと別の行で.をしてみよう

コツは繰り返すつもりなら次の箇所への移動方法を考えて、上手に移動する適当に移動しても大丈夫な操作にするか考えてみることだ

余談

vim のテキストオブジェクトはただ文字リテラルだけを見ているので、関連のない別の変数とか文字列の様な文法上関係ない単語でも同じ様に処理することができる
エディタの単語置換が有効な時も当然あるが、文法を考慮せずただ同じ字として扱った方がうまくいく場面も少なからずある

例えば mailService と smsService を mailModule と smsModule に変えたい、みたいなときは/Sしてnしながらct.Moduleとでもした方がよっぽど早い

普段からカーソルをどこに置いてどこまでを指定すると自分の望む都合の良い限定さになるか考えてみると良い

慣れると頭使わなくてもできる様になるぞ
タッチタイピングと一緒だ

▲ 余談

テキストオブジェクトじゃあなくても上手に使えば.はいつでも使えるので、上手に使ってみよう

例えばただ/functionnでメソッドを転々とジャンプしながらO@Override.でアノテーションを片っ端からつけていく、とかもできるからね

締め

範囲指定操作、テキストオブジェクト、繰り返し

どうですか?
難しいですか?

vim は投資だと思うんですよね

真剣に使おうと思ったらどうしたって数週間はメモ帳よりたどたどしくなります

ただそれを超えて二次関数的に生産性が上がるか上がらないかは、この 3 つの習得で決まります
勢いだけで適当言ってきましたが、これだけは断言できます

ひとりでも興味を持ってくれる人が増えれば嬉しいです

こちらもよろしく

Vim および作業効率化でいくつかネタをしたためている、こっちも見てもらえると嬉しいな

  • Vim ( & ideavim ) キーマップ設定ガイド
  • Vim パワーはテキストオブジェクトと繰り返しが7割 - 脱初心者の一歩 ( 本記事 )
  • Vim でテキストを "見る" - テキストを読む tips ( 仮 )
  • タブを支配せよ ( 仮 )

消せないプロセスID(PID)の消去方法!(Vim、Viでの操作不能の対処)

$ sudo visudoのコマンド入力できなくなり凄く困ったので解決方法を記載します!

 何かの不具合で、.ssh %の状態もしくは[ec2-user@ip-xx-x-x-xxx] $から強制終了されるとターミナルでのコマンド入力ができなくなる時があります。

 私も、過去に似たような経験をしたことがあり、多分プロセスIDが正常に切られなかったため、ec2-userにログインした際、$ sudo visudoが入力できないと予測しました。
発生したエラーは下記です

エラー文
visudo: /etc/sudoers がビジー状態です。後で再試行してください

 この問題を可決するのに凄く時間を費やしたので、プロセスID(PID)の一般的な消去方法プロセスID(PID)が無限に増殖する際の消去方法について記載したいと思います。

1. 基本のプロセスID(PID)の消去方法!

1. ターミナルでルートディレクトリーに移動する。または、.ssh %の状態もしくは[ec2-user@ip-xx-x-x-xxx] $にする。

ターミナルの初期画面の状態
xxxxxxxxx@xxxxxxxxxxMacBook-xxx ~ % (例です)

2.psを入力する

ルートディレクトリー
xxxxxxxxx@xxxxxxxxxxMacBook-xxx ~ % ps
.ssh
xxxxxxxxx@xxxxxxxxxxMacBook-xxx ~ .ssh % ps
ec2-use
[ec2-user@ip-xx-xx-xx-xxx ~]$ ps

3.PID(プロセスID)が表示されるのを確認する

psを入力すると下記の図のような画面が表示されると思います。
スクリーンショット 2020-06-30 1.07.29.png

4.PID(プロセスID)をkillorkill -9で削除する
(私はec2-userの状態でエラーが発生したため、ec2-user状態での記載例を載せる)

[ec2-user@ip-xx-xx-xx-xxx ~]$ kill PIDの数値 or kill -9 PIDの数値
[           入力例  ~] $ kill *** or kill -9 *** (*** = PID)

kill -9 (PID番号)で入力すると強制的に終了させる事ができる。

5.PID(プロセスID)が消去できれば、問題なく動作可能

私の場合、この手順ではPID(プロセスID)の消去ができませんでした。実際に起きていた問題は、PID(プロセスID)を消去しても無限に再生される状態でした。

2. PID(プロセスID)の無限増殖の消去方法!

ここからが本題です!
私を苦しめたPID(プロセスID)の無限増殖です。消し方が分かればすごく簡単に直せます!

1. ターミナルでルートディレクトリーに移動する。または、.ssh %の状態もしくは[ec2-user@ip-xx-x-x-xxx] $にする。
言語:ec2-use
[ec2-user@ip-xx-xx-xx-xxx ~]$ (例です)

私は、ec2-user内で発生したので、上記の状態で説明を続ける

2.ps lを入力する
言語:ec2-use
[ec2-user@ip-xx-xx-xx-xxx ~]$ ps l

3.プロセスごとの実行状態を確認する
- 下記のような画面が表示されると思います
スクリーンショット 2020-06-30 0.29.24.png

4.WCHANの列にあるwait_wのPID(プロセスID)をkillで消去する

詳細画面を載せておきます スクリーンショット 2020-06-30 0.29.35.png

killやり方
[ec2-user@ip-xx-xx-xx-xxx ~]$ kill PIDの数値 or kill -9 PIDの数値
[           入力例  ~] $ kill *** or kill -9 *** (*** = PID)

5.無限増殖するプロセスID(PID)の消去ができたため、無事に入力可能となる!

参考資料

psのコマンドの種類は下記のps コマンド集に記載されてます。
もし、ご興味がありましたら見て下さい!
ps コマンド集

最後に

以上で、消せないプロセスID(PID)の消去方法(プロセスID無限増殖)の説明を終わりたいと思います。間違っている点がありましたらご指摘頂けると助かります。

最後までご覧いただき、ありがとうございました。

Vim ノーマルモード zt/zb 押下時のスクロールにオフセットを加える

Vimのノーマルモードで ztをタイプすると, カーソルの位置 (行) はそのままで,
カーソルが画面最上部に表示されるようにスクロールされます.
zbの場合は, カーソル位置が画面最下部になるようスクロールされます (t=top, b=bottom).

カーソル位置が61行目の状態で ztをタイプすると, 次のようにスクロールされるということです.

image.png

ところで, Vim Bootstrapで作ったvimrcで同じ操作をすると, 次のようにスクロールされました.

image.png

カーソル位置の上に3行分が表示される形で画面スクロールされます.
これ, 1行ずつ上へカーソル移動しても同様で, 3行分オフセットされる形で画面がスクロールしていきます.
下方向のスクロール (zb, j) についても同じです.

理由は scrolloffというオプションが作用しているためです.
:set scrolloff=0を実行するか set scrolloff=0.vimrcなどに追記すると,
オフセットされない形でのデフォルトの挙動に戻すことができます.

nanoでもvimでも行番号を表示したい!!

タイトルの通りnanoとvimで行番号を表示する方法

まずはnanoから

手順0(ホームディレクトリにいる場合はスキップ)

cd

手順1

vim ~/.nanorc

手順2

set linenumbers

スクリーンショット 2020-07-03 2.37.28.png

手順3

source .nanorc

これだけ.

続いてvim

手順0(ホームディレクトリにいる場合はスキップ)

cd

手順1

nano ~/.vimrc

手順2

set number

コメントアウトしたい場合は

" 行番号を表示
set number

スクリーンショット 2020-07-03 2.38.20.png

手順3

source .vimrc

これだけ.

こんな感じで行番号を表示することができるけどコピペしづらくなるかも.
一体いつになったらプログラミングの記事を書けるようになるかな...

vimでi love uと打つと愛が消える

iloveu.gif

vimでi love uと打つと愛は消えてしまいました。
儚いですね。

一応解説

i: insertモードに移行
love: 文字をinsert
(esc): insertモード抜ける
u: undoでinsertした文字が消える

vimを閉じずにpythonを実行して結果を表示する話

やりたいこと

  1. pythonをvimを閉じずに実行する
  2. 実行結果を新しいバッファに表示する

できたもの

  • pythonファイルの場合のみ<F5>を押すと実行される
  • 実行結果が新しいバッファに表示される
  • 複数回実行した場合は追記される
  • 複数のpythonファイルが開かれていいる場合カーソルがあるファイルが実行される

vimpy.gif

やったこと

素朴な方法

:!python %

Exコマンド:! hogeはcmdhogeを実行してくれます.これを<F5>へ割り当てます.

autocmd BufRead,BufNewFile *.py inoremap <F5><Esc>:w<CR>:! python %<CR>
autocmd BufRead,BufNewFile *.py nnoremap <F5>:w<CR>:! python %<CR>

これで<F5>を押すことで開いているファイルを実行できます.

問題点

実行結果がENTERを押すことで消えてしまう.

新しいバッファを開く方法

上記の問題を解決するため新しいバッファを開くように設定しました.ただし、既に開いている場合を除かないと<F5>を押すたびに増殖するのでこれを解決するために場合分けが必要です.長くなったのでPyexe()という関数を作りました.
このとき、先程使った:! hogeは実行するだけなので出力を文字列として得られるsystem(hoge)を使います.

"関数を定義function Pyexe()"結果を出力用のバッファに入力後戻ってくる準備"カーソルの現在位置を取得:let pos=getpos(".")"現在のウィンドウのidを取得:let cwinid=win_getid()"現在のウィンドウのバッファのファイル名を取得:let fileName=expand('%')"出力用のバッファの設定"表示するファイル名を決定:let outFileName="~pyOut""既に出力用のウィンドが開かれているか確認する準備"出力用のバッファが存在している場合バッファ番号を得る.存在しない場合-1.:let bnr=bufnr(outFileName)"出力用のバッファのウィンドウidを取得(リスト形式).存在しない場合は空のリスト.:let wids=win_findbuf(bnr)"出力用のバッファが存在する場合ウィンドウidをoutWindidへ.存在しない場合作る.if bnr ==-1|| len(wids)==0"存在しない場合"ウィンドウを分割して出力用のバッファを作る:verticalrightbelownew~pyOut
        "ウィンドウのサイズを調整:verticalresize70"出力用のバッファがウィンドウidを取得:let outWinid=win_getid()"出力用のバッファバッファ番号を得る:let bnr=bufnr(outFileName)else"存在する場合"出力用のバッファのウィンドウidをリストから取り出す:let outWinid=wids[0]endif"出力"出力用のバッファのウィンドウへ移動:call win_gotoid(outWinid)"出力用のバッファの末行へ移動:call setpos(bnr,"$")"cmdを呼び出してpythonを実行:let @r=system('python '.fileName)"出力用のバッファへプットする:putr"再描写:redraw!"開始位置へ戻る"pythonファイルのウィンドウへ移動:call win_gotoid(cwinid)"開始位置へカーソルを移動:call setpos(".",pos)endfunction

あとはこれをpythonの場合のみ<F5>へ割り当てます.

"pythonファイルの場合のみ<F5>キーを押すことで実行できるようにする
autocmd BufRead,BufNewFile *.py inoremap <F5><Esc>:w<CR>:call Pyexe()<CR>
autocmd BufRead,BufNewFile *.py nnoremap <F5>:w<CR>:call Pyexe()<CR>

vimへVundleを導入てPluginSearchで出たエラーを解決

経緯

Windowsでvimを使っているのですがvimのパッケージソフトを導入することにすることにしました。

こちらの記事などを参考にVundleというものを導入することにしました.

導入

githubのQuick Startを参考に導入しました. windowsなので追加でVundle on Windowsこちらの設定も必要のようです.

問題

これで使えると意気揚々と:PluginSearch hogeと叩いてみたところ以下のようなエラーがでました.

function vundle#scripts#all[3]..<SNR>46_load_scripts の処理中にエラーが検出されました:
行    7:
E15: 無効な式です: <html>^M
E15: 無効な式です: <html>^M
function vundle#scripts#all の処理中にエラーが検出されました:
行    5:
E712: filter() の引数はリスト型または辞書型でなければなりません
行   10:
E686: reverse() の引数はリスト型でなければなりません
function vundle#scripts#all[10]..vundle#scripts#bundle_names の処理中にエラーが検出されました:
行    1:
E712: map() の引数はリスト型または辞書型でなければなりません
function vundle#scripts#all[10]..vundle#scripts#view の処理中にエラーが検出されました:
行   15:
E745: リスト型を数値として扱っています
E116: 関数の無効な引数です: append
1 plugins found

解決

  • これを参考にして解決しました.

原因

:PluginSearch hogeはvimのプラグインの一覧をjsonファイルからダウンロードしてきて使っています. ところが、デフォルトのダウンロード先は既に役目を終えたようです.

This used to be a mirror of Vim's scripts site on Github.

It was created to allow early package managers (such as Vim Update Bundles and Vundle) to install scripts straight from GitHub *.

Now that most Vim scripts are developed on GitHub and installable straight from the source, >I'm happy to say that there's no need for vim-scripts anymore.

The code has been emptied out to compel users to switch to better sources. The repos remain so none of the work in pull requests is lost.

The scraper code is preserved on GitHub: vim-scraper.

Happy vimming!

このため、jsonファイルをダウンロードできずhtmlファイルがダウンロードされているため出ているエラーのようです.

解決法

現在も使えるjsonファイルのダウンロード先を指定してあげればうまくいきます.

  1. \bundle\.vundle\script-names.vim-scripts.org.jsonを削除
  2. \bundle\Vundle.vim\autoload\vundle\scripts.vimの237行目
letl:vim_scripts_json ='http://vim-scripts.org/api/scripts.json'

letl:vim_scripts_json ='https://raw.githubusercontent.com/i-cooltea/resource/master/vim-api_scripts.json'

に変更.

これで使えるようになりました.ここで見つけたリンクなのでもっと良いものがあるのかもしれません.

エディタ雑感 (2020)

VSCode, Sublime Text 3, NeoVim, Emacs + Evil (のプラグイン) をラフに比較します。

注意: 素人が書いています。また、リモートなど、考慮に入っていないものも多いと思います。

エディタに期待するもの

僕は以下を重視します。

Rust プログラミングの手厚いサポート

シンボルのリネーム (にバグが無いこと) や、外部クレートのアイテムへのジャンプ (が可能なこと) を重視します。

→ VSCode

文書編集の UI

バッファ単位でテキストの中央寄せをしたいです。また、 タブバーやファイルの ツリービューを使います。そのため、 バッファのグルーピングマルチルートディレクトリのサポートが欲しいです。

→ Emacs (Centaur Tabs, Olivetti)

これは少数派かもしれません

その他 UI について

プレビューしながらのファイル検索や、 interactive grep が好きです。つまり fzf-previewが好きです。リンク先には GIF があります。

→ NeoVim (fzf-preview)

また、 GUI ではなくてターミナルで動かしたいです。

比較

考慮されていない部分も多いと思います。ご容赦ください。

VSCode

Rust の (クライアント側?) サポートが完全な唯一のエディタです。他のプラグインも非常に良く動作します。

  • Good:
    安定性、組み込みターミナル、コマンドパレット
  • Bad:
    ファイル検索にプレビューがありません。 interactive grep ができないと思います。重さ (文字入力の遅さなど) やタブの分厚さも気になります。
  • その他:
    自分で拡張を作るのは大変らしいです。

Sublime Text 3

デフォルトの動作が非常に良いエディタです。 VSCode よりも明らかに 動きが速く、さらにファイル検索にプレビューが付いています。

NeoVintageous.vimrc風ファイルを読めるようになります。ただしバグがあり、 json の設定を開くと 1 分ほど硬直するようになります。謎……

  • Good:
    デフォルトの挙動
  • Bad:
    画面分割 (Origami) が合いませんでした。また、 LSP の詳しい設定法が分かりません。 デフォルトは良いのにディテールが合わないという不思議な結果になりました。
  • その他:
    拡張を簡単に作れるそうです。

NeoVim

設定が簡単で 見た目が良いエディタです。

タブなどは薄いミニマムで、配色はしっかりしており、アイコン表示もできます。

  • Good:
    安定性と極まった UI
  • Bad:
    動きが遅い (文字入力や一部 UI) です。改善可能? また、サイドバー (NERDTree) にはマルチルートディレクトリがありません。
  • その他:
    VimScript です。今後は Lua かも……

Emacs

一部パッケージが非常に発達したエディタです。ただし マンパワーが足りないのか、色々と上手く動作しないのが普通です。

ターミナルでは見た目が悪いです。配色は見づらく、どのパッケージもアイコン表示をサポートしません。

  • Good:
    起動後の動作が軽いです。また、 一部パッケージのディテールが非常に良いです。特に Centaur Tabs によるバッファのグルーピングは、他エディタには無いかもしれません。
  • Bad:
    起動が遅いです。ターミナル上では見た目が悪いです。看板パッケージにも明らかな不具合があって、しかも issue すら立っていないことがよくあります。
  • その他:
    ELisp を使えます。

終わりに

現在は、以下のようにエディタを使い分けるようになりました:

用途使用エディタ
プログラミングVSCode
文書の編集Emacs + Evil
GitNeoVim

人に勧めるなら、 NeoVim (実践Vim) → VSCode かなと思いました。

注意

上記の僕の印象は、エディタの実態からずれているかもしれません。

『君は全然分かっていないぞ』という場合はごめんなさい!

Vimでinsert mode時によく使う機能5選

とはいえ他で応用が効かないので
手癖にしちゃうのは悩ましいところ

キー機能
Ctrl+Cinsert modeから抜ける
Ctrl+Hbackspace
Ctrl+J改行
Ctrl+U行頭からカーソル位置までを削除
Ctrl+W単語削除

あ、あとCtrl+Oで一時的にnormal modeに戻れるのは重宝しています

vim cheat sheet

replace Replace backward slash '\' with forward slash '/'

:%s/\\/\//g

copy all lines

gg"*yG

select all

ggVG

cut paste

Shift + V => X => P

copy paste

Shift + V => Y => P

delete

d

go to end of line

$

open 2files

vi -o /path/to/file1 /path/to/file2

VimでWorld Wide Web

こんにちわ
ゴリラです

普段Vimを使ってコーディングしていると、「あれ、あの関数名なんだっけ?」とか「引数何を受け取るんだっけ?」とかで思い出せないことが多々あると思います。
そういう時、大抵の人はブラウザを使うと思いますが、アプリを切り替えないといけないので効率が悪いなとずっと思っていました。

そこで、この度w3mを導入してみました。ちょっとQOL(Quality Of Life)上がった感があるので紹介してきます。

w3mとは

簡単に言うとテキストベースブラウザです。一応sixel対応できるので画像表示もできます。(ただレイアウト崩れるので実用的ではなかった)
テキストベースゆえ、とても軽快でcookieopensslも使えるのでTwitterなどのサービスにログインもできます。

image.png

がっつり色々と調査するなら普通にブラウザを使ったほうが良いですが、
冒頭で言ったような用途であればw3mで充分です。

Vimでw3mを使う

Vimではterminal機能があるので、それを使えばVim上でw3mを使用できます。例えば次のコマンドでgoogle.comを開けます。

:term ++close w3m google.com

ただ、これだけだとちょっと不便です。大体は何かしら検索することが多いので、もう少し便利にするためWWWコマンドを用意します。

function!s:www(word) abort
  execute('term ++close ++shell w3m google.com/search\?q="'.a:word.'"')endfunction

command!-nargs=1 WWW calls:www(<f-args>)

上記の設定をvimrcに追加すれば:WWW ゴリラ vimって実行するとGoogleの検索結果画面が表示されます。
とても良き。

検索以外に、ぼくは普段Goを書いたりするのでpkg.go.devを簡単に開く関数も用意しました。

function!s:gg(package) abort
  execute('term ++close ++shell w3m pkg.go.dev/'.a:package)endfunction

command!-nargs=1 GG calls:gg(<f-args>)

上記設定をすると:GG path/filepath次のようにpkg.go.dev/path/filepathが開きます。

image.png

Vimでw3mのメリット

ズバリ、翻訳できることです。ゴリラ製翻訳プラグインを使って、godocの英語ドキュメントを翻訳しながら読めます。
英語苦手なので、こうやって翻訳しながらじゃないと読めないです(ツライ)

image.png

w3mのキーマップ設定

デフォルトのキーマップでしっくり来ないところがあったので、~/.w3m/keymapに次の設定をしてなるべく使用感をVimに近づけています。

keymap C-u PREV_PAGE
keymap C-d NEXT_PAGE
keymap C-h BACK
keymap C-l NEXT
keymap ] NEXT_TAB
keymap [ PREV_TAB
keymap C-w CLOSE_TAB
keymap b PREV_WORD
keymap H HISTORY
keymap ? HELP
keymap C-n NEXT_LINK
keymap C-p PREV_LINK
keymap C-q EXIT
keymap C-k GOTO

さいごに

導入したばっかりなので、しばらく使ってみています。
みなさんもぜひ使ってみてください。

brew doctorでWarningが表示されたので解決した方法をメモ

brewでnodeをインストールしようとしたらエラーが発生しました。

ターミナル
$ brew doctor

で確認すると以下のようなWarningが表示されたので、解決した方法を備忘録として残しておきます。

ターミナル
Warning: Unbrewed header files were found in /usr/local/include.
If you didn't put them there on purpose they could cause problems when
building Homebrew formulae, and may need to be deleted.

Unexpected header files:
  /usr/local/include/node/js_native_api.h
  /usr/local/include/node/js_native_api_types.h
  /usr/local/include/node/libplatform/libplatform-export.h
  /usr/local/include/node/libplatform/libplatform.h
  /usr/local/include/node/libplatform/v8-tracing.h
  /usr/local/include/node/node.h
  /usr/local/include/node/node_api.h
  /usr/local/include/node/node_api_types.h
  /usr/local/include/node/node_buffer.h
  /usr/local/include/node/node_object_wrap.h
  /usr/local/include/node/node_version.h
  /usr/local/include/node/openssl/aes.h
  /usr/local/include/node/openssl/archs/BSD-x86/asm/crypto/buildinf.h
  /usr/local/include/node/openssl/archs/BSD-x86/asm/crypto/include/internal/bn_conf.h
  /usr/local/include/node/openssl/archs/BSD-x86/asm/crypto/include/internal/dso_conf.h
  /usr/local/include/node/openssl/archs/BSD-x86/asm/include/openssl/opensslconf.h
  /usr/local/include/node/openssl/archs/BSD-x86/asm/include/progs.h
  /usr/local/include/node/openssl/archs/BSD-x86/asm_avx2/crypto/buildinf.h
  /usr/local/include/node/openssl/archs/BSD-x86/asm_avx2/crypto/include/internal/bn_conf.h
  /usr/local/include/node/openssl/archs/BSD-x86/asm_avx2/crypto/include/internal/dso_conf.h
  /usr/local/include/node/openssl/archs/BSD-x86/asm_avx2/include/openssl/opensslconf.h
  /usr/local/include/node/openssl/archs/BSD-x86/asm_avx2/include/progs.h
  /usr/local/include/node/openssl/archs/BSD-x86/no-asm/crypto/buildinf.h
  /usr/local/include/node/openssl/archs/BSD-x86/no-asm/crypto/include/internal/bn_conf.h
  /usr/local/include/node/openssl/archs/BSD-x86/no-asm/crypto/include/internal/dso_conf.h
  /usr/local/include/node/openssl/archs/BSD-x86/no-asm/include/openssl/opensslconf.h
  /usr/local/include/node/openssl/archs/BSD-x86/no-asm/include/progs.h
  /usr/local/include/node/openssl/archs/BSD-x86_64/asm/crypto/buildinf.h
  /usr/local/include/node/openssl/archs/BSD-x86_64/asm/crypto/include/internal/bn_conf.h
  /usr/local/include/node/openssl/archs/BSD-x86_64/asm/crypto/include/internal/dso_conf.h
  /usr/local/include/node/openssl/archs/BSD-x86_64/asm/include/openssl/opensslconf.h
  /usr/local/include/node/openssl/archs/BSD-x86_64/asm/include/progs.h
  /usr/local/include/node/openssl/archs/BSD-x86_64/asm_avx2/crypto/buildinf.h
  /usr/local/include/node/openssl/archs/BSD-x86_64/asm_avx2/crypto/include/internal/bn_conf.h
  /usr/local/include/node/openssl/archs/BSD-x86_64/asm_avx2/crypto/include/internal/dso_conf.h
  /usr/local/include/node/openssl/archs/BSD-x86_64/asm_avx2/include/openssl/opensslconf.h
  /usr/local/include/node/openssl/archs/BSD-x86_64/asm_avx2/include/progs.h
  /usr/local/include/node/openssl/archs/BSD-x86_64/no-asm/crypto/buildinf.h
  /usr/local/include/node/openssl/archs/BSD-x86_64/no-asm/crypto/include/internal/bn_conf.h
  /usr/local/include/node/openssl/archs/BSD-x86_64/no-asm/crypto/include/internal/dso_conf.h
  /usr/local/include/node/openssl/archs/BSD-x86_64/no-asm/include/openssl/opensslconf.h
  /usr/local/include/node/openssl/archs/BSD-x86_64/no-asm/include/progs.h
  /usr/local/include/node/openssl/archs/VC-WIN32/asm/crypto/buildinf.h
  /usr/local/include/node/openssl/archs/VC-WIN32/asm/crypto/include/internal/bn_conf.h
  /usr/local/include/node/openssl/archs/VC-WIN32/asm/crypto/include/internal/dso_conf.h
  /usr/local/include/node/openssl/archs/VC-WIN32/asm/include/openssl/opensslconf.h
  /usr/local/include/node/openssl/archs/VC-WIN32/asm/include/progs.h
  /usr/local/include/node/openssl/archs/VC-WIN32/asm_avx2/crypto/buildinf.h
  /usr/local/include/node/openssl/archs/VC-WIN32/asm_avx2/crypto/include/internal/bn_conf.h
  /usr/local/include/node/openssl/archs/VC-WIN32/asm_avx2/crypto/include/internal/dso_conf.h
  /usr/local/include/node/openssl/archs/VC-WIN32/asm_avx2/include/openssl/opensslconf.h
  /usr/local/include/node/openssl/archs/VC-WIN32/asm_avx2/include/progs.h
  /usr/local/include/node/openssl/archs/VC-WIN32/no-asm/crypto/buildinf.h
  /usr/local/include/node/openssl/archs/VC-WIN32/no-asm/crypto/include/internal/bn_conf.h
  /usr/local/include/node/openssl/archs/VC-WIN32/no-asm/crypto/include/internal/dso_conf.h
  /usr/local/include/node/openssl/archs/VC-WIN32/no-asm/include/openssl/opensslconf.h
  /usr/local/include/node/openssl/archs/VC-WIN32/no-asm/include/progs.h
  /usr/local/include/node/openssl/archs/VC-WIN64-ARM/no-asm/crypto/buildinf.h
  /usr/local/include/node/openssl/archs/VC-WIN64-ARM/no-asm/crypto/include/internal/bn_conf.h
  /usr/local/include/node/openssl/archs/VC-WIN64-ARM/no-asm/crypto/include/internal/dso_conf.h
  /usr/local/include/node/openssl/archs/VC-WIN64-ARM/no-asm/include/openssl/opensslconf.h
  /usr/local/include/node/openssl/archs/VC-WIN64-ARM/no-asm/include/progs.h
  /usr/local/include/node/openssl/archs/VC-WIN64A/asm/crypto/buildinf.h
  /usr/local/include/node/openssl/archs/VC-WIN64A/asm/crypto/include/internal/bn_conf.h
  /usr/local/include/node/openssl/archs/VC-WIN64A/asm/crypto/include/internal/dso_conf.h
  /usr/local/include/node/openssl/archs/VC-WIN64A/asm/include/openssl/opensslconf.h
  /usr/local/include/node/openssl/archs/VC-WIN64A/asm/include/progs.h
  /usr/local/include/node/openssl/archs/VC-WIN64A/asm_avx2/crypto/buildinf.h
  /usr/local/include/node/openssl/archs/VC-WIN64A/asm_avx2/crypto/include/internal/bn_conf.h
  /usr/local/include/node/openssl/archs/VC-WIN64A/asm_avx2/crypto/include/internal/dso_conf.h
  /usr/local/include/node/openssl/archs/VC-WIN64A/asm_avx2/include/openssl/opensslconf.h
  /usr/local/include/node/openssl/archs/VC-WIN64A/asm_avx2/include/progs.h
  /usr/local/include/node/openssl/archs/VC-WIN64A/no-asm/crypto/buildinf.h
  /usr/local/include/node/openssl/archs/VC-WIN64A/no-asm/crypto/include/internal/bn_conf.h
  /usr/local/include/node/openssl/archs/VC-WIN64A/no-asm/crypto/include/internal/dso_conf.h
  /usr/local/include/node/openssl/archs/VC-WIN64A/no-asm/include/openssl/opensslconf.h
  /usr/local/include/node/openssl/archs/VC-WIN64A/no-asm/include/progs.h
  /usr/local/include/node/openssl/archs/aix-gcc/asm/crypto/buildinf.h
  /usr/local/include/node/openssl/archs/aix-gcc/asm/crypto/include/internal/bn_conf.h
  /usr/local/include/node/openssl/archs/aix-gcc/asm/crypto/include/internal/dso_conf.h
  /usr/local/include/node/openssl/archs/aix-gcc/asm/include/openssl/opensslconf.h
  /usr/local/include/node/openssl/archs/aix-gcc/asm/include/progs.h
  /usr/local/include/node/openssl/archs/aix-gcc/asm_avx2/crypto/buildinf.h
  /usr/local/include/node/openssl/archs/aix-gcc/asm_avx2/crypto/include/internal/bn_conf.h
  /usr/local/include/node/openssl/archs/aix-gcc/asm_avx2/crypto/include/internal/dso_conf.h
  /usr/local/include/node/openssl/archs/aix-gcc/asm_avx2/include/openssl/opensslconf.h
  /usr/local/include/node/openssl/archs/aix-gcc/asm_avx2/include/progs.h
  /usr/local/include/node/openssl/archs/aix-gcc/no-asm/crypto/buildinf.h
  /usr/local/include/node/openssl/archs/aix-gcc/no-asm/crypto/include/internal/bn_conf.h
  /usr/local/include/node/openssl/archs/aix-gcc/no-asm/crypto/include/internal/dso_conf.h
  /usr/local/include/node/openssl/archs/aix-gcc/no-asm/include/openssl/opensslconf.h
  /usr/local/include/node/openssl/archs/aix-gcc/no-asm/include/progs.h
  /usr/local/include/node/openssl/archs/aix64-gcc/asm/crypto/buildinf.h
  /usr/local/include/node/openssl/archs/aix64-gcc/asm/crypto/include/internal/bn_conf.h
  /usr/local/include/node/openssl/archs/aix64-gcc/asm/crypto/include/internal/dso_conf.h
  /usr/local/include/node/openssl/archs/aix64-gcc/asm/include/openssl/opensslconf.h
  /usr/local/include/node/openssl/archs/aix64-gcc/asm/include/progs.h
  /usr/local/include/node/openssl/archs/aix64-gcc/asm_avx2/crypto/buildinf.h
  /usr/local/include/node/openssl/archs/aix64-gcc/asm_avx2/crypto/include/internal/bn_conf.h
  /usr/local/include/node/openssl/archs/aix64-gcc/asm_avx2/crypto/include/internal/dso_conf.h
  /usr/local/include/node/openssl/archs/aix64-gcc/asm_avx2/include/openssl/opensslconf.h
  /usr/local/include/node/openssl/archs/aix64-gcc/asm_avx2/include/progs.h
  /usr/local/include/node/openssl/archs/aix64-gcc/no-asm/crypto/buildinf.h
  /usr/local/include/node/openssl/archs/aix64-gcc/no-asm/crypto/include/internal/bn_conf.h
  /usr/local/include/node/openssl/archs/aix64-gcc/no-asm/crypto/include/internal/dso_conf.h
  /usr/local/include/node/openssl/archs/aix64-gcc/no-asm/include/openssl/opensslconf.h
  /usr/local/include/node/openssl/archs/aix64-gcc/no-asm/include/progs.h
  /usr/local/include/node/openssl/archs/darwin-i386-cc/asm/crypto/buildinf.h
  /usr/local/include/node/openssl/archs/darwin-i386-cc/asm/crypto/include/internal/bn_conf.h
  /usr/local/include/node/openssl/archs/darwin-i386-cc/asm/crypto/include/internal/dso_conf.h
  /usr/local/include/node/openssl/archs/darwin-i386-cc/asm/include/openssl/opensslconf.h
  /usr/local/include/node/openssl/archs/darwin-i386-cc/asm/include/progs.h
  /usr/local/include/node/openssl/archs/darwin-i386-cc/asm_avx2/crypto/buildinf.h
  /usr/local/include/node/openssl/archs/darwin-i386-cc/asm_avx2/crypto/include/internal/bn_conf.h
  /usr/local/include/node/openssl/archs/darwin-i386-cc/asm_avx2/crypto/include/internal/dso_conf.h
  /usr/local/include/node/openssl/archs/darwin-i386-cc/asm_avx2/include/openssl/opensslconf.h
  /usr/local/include/node/openssl/archs/darwin-i386-cc/asm_avx2/include/progs.h
  /usr/local/include/node/openssl/archs/darwin-i386-cc/no-asm/crypto/buildinf.h
  /usr/local/include/node/openssl/archs/darwin-i386-cc/no-asm/crypto/include/internal/bn_conf.h
  /usr/local/include/node/openssl/archs/darwin-i386-cc/no-asm/crypto/include/internal/dso_conf.h
  /usr/local/include/node/openssl/archs/darwin-i386-cc/no-asm/include/openssl/opensslconf.h
  /usr/local/include/node/openssl/archs/darwin-i386-cc/no-asm/include/progs.h
  /usr/local/include/node/openssl/archs/darwin64-x86_64-cc/asm/crypto/buildinf.h
  /usr/local/include/node/openssl/archs/darwin64-x86_64-cc/asm/crypto/include/internal/bn_conf.h
  /usr/local/include/node/openssl/archs/darwin64-x86_64-cc/asm/crypto/include/internal/dso_conf.h
  /usr/local/include/node/openssl/archs/darwin64-x86_64-cc/asm/include/openssl/opensslconf.h
  /usr/local/include/node/openssl/archs/darwin64-x86_64-cc/asm/include/progs.h
  /usr/local/include/node/openssl/archs/darwin64-x86_64-cc/asm_avx2/crypto/buildinf.h
  /usr/local/include/node/openssl/archs/darwin64-x86_64-cc/asm_avx2/crypto/include/internal/bn_conf.h
  /usr/local/include/node/openssl/archs/darwin64-x86_64-cc/asm_avx2/crypto/include/internal/dso_conf.h
  /usr/local/include/node/openssl/archs/darwin64-x86_64-cc/asm_avx2/include/openssl/opensslconf.h
  /usr/local/include/node/openssl/archs/darwin64-x86_64-cc/asm_avx2/include/progs.h
  /usr/local/include/node/openssl/archs/darwin64-x86_64-cc/no-asm/crypto/buildinf.h
  /usr/local/include/node/openssl/archs/darwin64-x86_64-cc/no-asm/crypto/include/internal/bn_conf.h
  /usr/local/include/node/openssl/archs/darwin64-x86_64-cc/no-asm/crypto/include/internal/dso_conf.h
  /usr/local/include/node/openssl/archs/darwin64-x86_64-cc/no-asm/include/openssl/opensslconf.h
  /usr/local/include/node/openssl/archs/darwin64-x86_64-cc/no-asm/include/progs.h
  /usr/local/include/node/openssl/archs/linux-aarch64/asm/crypto/buildinf.h
  /usr/local/include/node/openssl/archs/linux-aarch64/asm/crypto/include/internal/bn_conf.h
  /usr/local/include/node/openssl/archs/linux-aarch64/asm/crypto/include/internal/dso_conf.h
  /usr/local/include/node/openssl/archs/linux-aarch64/asm/include/openssl/opensslconf.h
  /usr/local/include/node/openssl/archs/linux-aarch64/asm/include/progs.h
  /usr/local/include/node/openssl/archs/linux-aarch64/asm_avx2/crypto/buildinf.h
  /usr/local/include/node/openssl/archs/linux-aarch64/asm_avx2/crypto/include/internal/bn_conf.h
  /usr/local/include/node/openssl/archs/linux-aarch64/asm_avx2/crypto/include/internal/dso_conf.h
  /usr/local/include/node/openssl/archs/linux-aarch64/asm_avx2/include/openssl/opensslconf.h
  /usr/local/include/node/openssl/archs/linux-aarch64/asm_avx2/include/progs.h
  /usr/local/include/node/openssl/archs/linux-aarch64/no-asm/crypto/buildinf.h
  /usr/local/include/node/openssl/archs/linux-aarch64/no-asm/crypto/include/internal/bn_conf.h
  /usr/local/include/node/openssl/archs/linux-aarch64/no-asm/crypto/include/internal/dso_conf.h
  /usr/local/include/node/openssl/archs/linux-aarch64/no-asm/include/openssl/opensslconf.h
  /usr/local/include/node/openssl/archs/linux-aarch64/no-asm/include/progs.h
  /usr/local/include/node/openssl/archs/linux-armv4/asm/crypto/buildinf.h
  /usr/local/include/node/openssl/archs/linux-armv4/asm/crypto/include/internal/bn_conf.h
  /usr/local/include/node/openssl/archs/linux-armv4/asm/crypto/include/internal/dso_conf.h
  /usr/local/include/node/openssl/archs/linux-armv4/asm/include/openssl/opensslconf.h
  /usr/local/include/node/openssl/archs/linux-armv4/asm/include/progs.h
  /usr/local/include/node/openssl/archs/linux-armv4/asm_avx2/crypto/buildinf.h
  /usr/local/include/node/openssl/archs/linux-armv4/asm_avx2/crypto/include/internal/bn_conf.h
  /usr/local/include/node/openssl/archs/linux-armv4/asm_avx2/crypto/include/internal/dso_conf.h
  /usr/local/include/node/openssl/archs/linux-armv4/asm_avx2/include/openssl/opensslconf.h
  /usr/local/include/node/openssl/archs/linux-armv4/asm_avx2/include/progs.h
  /usr/local/include/node/openssl/archs/linux-armv4/no-asm/crypto/buildinf.h
  /usr/local/include/node/openssl/archs/linux-armv4/no-asm/crypto/include/internal/bn_conf.h
  /usr/local/include/node/openssl/archs/linux-armv4/no-asm/crypto/include/internal/dso_conf.h
  /usr/local/include/node/openssl/archs/linux-armv4/no-asm/include/openssl/opensslconf.h
  /usr/local/include/node/openssl/archs/linux-armv4/no-asm/include/progs.h
  /usr/local/include/node/openssl/archs/linux-elf/asm/crypto/buildinf.h
  /usr/local/include/node/openssl/archs/linux-elf/asm/crypto/include/internal/bn_conf.h
  /usr/local/include/node/openssl/archs/linux-elf/asm/crypto/include/internal/dso_conf.h
  /usr/local/include/node/openssl/archs/linux-elf/asm/include/openssl/opensslconf.h
  /usr/local/include/node/openssl/archs/linux-elf/asm/include/progs.h
  /usr/local/include/node/openssl/archs/linux-elf/asm_avx2/crypto/buildinf.h
  /usr/local/include/node/openssl/archs/linux-elf/asm_avx2/crypto/include/internal/bn_conf.h
  /usr/local/include/node/openssl/archs/linux-elf/asm_avx2/crypto/include/internal/dso_conf.h
  /usr/local/include/node/openssl/archs/linux-elf/asm_avx2/include/openssl/opensslconf.h
  /usr/local/include/node/openssl/archs/linux-elf/asm_avx2/include/progs.h
  /usr/local/include/node/openssl/archs/linux-elf/no-asm/crypto/buildinf.h
  /usr/local/include/node/openssl/archs/linux-elf/no-asm/crypto/include/internal/bn_conf.h
  /usr/local/include/node/openssl/archs/linux-elf/no-asm/crypto/include/internal/dso_conf.h
  /usr/local/include/node/openssl/archs/linux-elf/no-asm/include/openssl/opensslconf.h
  /usr/local/include/node/openssl/archs/linux-elf/no-asm/include/progs.h
  /usr/local/include/node/openssl/archs/linux-ppc/asm/crypto/buildinf.h
  /usr/local/include/node/openssl/archs/linux-ppc/asm/crypto/include/internal/bn_conf.h
  /usr/local/include/node/openssl/archs/linux-ppc/asm/crypto/include/internal/dso_conf.h
  /usr/local/include/node/openssl/archs/linux-ppc/asm/include/openssl/opensslconf.h
  /usr/local/include/node/openssl/archs/linux-ppc/asm/include/progs.h
  /usr/local/include/node/openssl/archs/linux-ppc/asm_avx2/crypto/buildinf.h
  /usr/local/include/node/openssl/archs/linux-ppc/asm_avx2/crypto/include/internal/bn_conf.h
  /usr/local/include/node/openssl/archs/linux-ppc/asm_avx2/crypto/include/internal/dso_conf.h
  /usr/local/include/node/openssl/archs/linux-ppc/asm_avx2/include/openssl/opensslconf.h
  /usr/local/include/node/openssl/archs/linux-ppc/asm_avx2/include/progs.h
  /usr/local/include/node/openssl/archs/linux-ppc/no-asm/crypto/buildinf.h
  /usr/local/include/node/openssl/archs/linux-ppc/no-asm/crypto/include/internal/bn_conf.h
  /usr/local/include/node/openssl/archs/linux-ppc/no-asm/crypto/include/internal/dso_conf.h
  /usr/local/include/node/openssl/archs/linux-ppc/no-asm/include/openssl/opensslconf.h
  /usr/local/include/node/openssl/archs/linux-ppc/no-asm/include/progs.h
  /usr/local/include/node/openssl/archs/linux-ppc64/asm/crypto/buildinf.h
  /usr/local/include/node/openssl/archs/linux-ppc64/asm/crypto/include/internal/bn_conf.h
  /usr/local/include/node/openssl/archs/linux-ppc64/asm/crypto/include/internal/dso_conf.h
  /usr/local/include/node/openssl/archs/linux-ppc64/asm/include/openssl/opensslconf.h
  /usr/local/include/node/openssl/archs/linux-ppc64/asm/include/progs.h
  /usr/local/include/node/openssl/archs/linux-ppc64/asm_avx2/crypto/buildinf.h
  /usr/local/include/node/openssl/archs/linux-ppc64/asm_avx2/crypto/include/internal/bn_conf.h
  /usr/local/include/node/openssl/archs/linux-ppc64/asm_avx2/crypto/include/internal/dso_conf.h
  /usr/local/include/node/openssl/archs/linux-ppc64/asm_avx2/include/openssl/opensslconf.h
  /usr/local/include/node/openssl/archs/linux-ppc64/asm_avx2/include/progs.h
  /usr/local/include/node/openssl/archs/linux-ppc64/no-asm/crypto/buildinf.h
  /usr/local/include/node/openssl/archs/linux-ppc64/no-asm/crypto/include/internal/bn_conf.h
  /usr/local/include/node/openssl/archs/linux-ppc64/no-asm/crypto/include/internal/dso_conf.h
  /usr/local/include/node/openssl/archs/linux-ppc64/no-asm/include/openssl/opensslconf.h
  /usr/local/include/node/openssl/archs/linux-ppc64/no-asm/include/progs.h
  /usr/local/include/node/openssl/archs/linux-ppc64le/asm/crypto/buildinf.h
  /usr/local/include/node/openssl/archs/linux-ppc64le/asm/crypto/include/internal/bn_conf.h
  /usr/local/include/node/openssl/archs/linux-ppc64le/asm/crypto/include/internal/dso_conf.h
  /usr/local/include/node/openssl/archs/linux-ppc64le/asm/include/openssl/opensslconf.h
  /usr/local/include/node/openssl/archs/linux-ppc64le/asm/include/progs.h
  /usr/local/include/node/openssl/archs/linux-ppc64le/asm_avx2/crypto/buildinf.h
  /usr/local/include/node/openssl/archs/linux-ppc64le/asm_avx2/crypto/include/internal/bn_conf.h
  /usr/local/include/node/openssl/archs/linux-ppc64le/asm_avx2/crypto/include/internal/dso_conf.h
  /usr/local/include/node/openssl/archs/linux-ppc64le/asm_avx2/include/openssl/opensslconf.h
  /usr/local/include/node/openssl/archs/linux-ppc64le/asm_avx2/include/progs.h
  /usr/local/include/node/openssl/archs/linux-ppc64le/no-asm/crypto/buildinf.h
  /usr/local/include/node/openssl/archs/linux-ppc64le/no-asm/crypto/include/internal/bn_conf.h
  /usr/local/include/node/openssl/archs/linux-ppc64le/no-asm/crypto/include/internal/dso_conf.h
  /usr/local/include/node/openssl/archs/linux-ppc64le/no-asm/include/openssl/opensslconf.h
  /usr/local/include/node/openssl/archs/linux-ppc64le/no-asm/include/progs.h
  /usr/local/include/node/openssl/archs/linux-x32/asm/crypto/buildinf.h
  /usr/local/include/node/openssl/archs/linux-x32/asm/crypto/include/internal/bn_conf.h
  /usr/local/include/node/openssl/archs/linux-x32/asm/crypto/include/internal/dso_conf.h
  /usr/local/include/node/openssl/archs/linux-x32/asm/include/openssl/opensslconf.h
  /usr/local/include/node/openssl/archs/linux-x32/asm/include/progs.h
  /usr/local/include/node/openssl/archs/linux-x32/asm_avx2/crypto/buildinf.h
  /usr/local/include/node/openssl/archs/linux-x32/asm_avx2/crypto/include/internal/bn_conf.h
  /usr/local/include/node/openssl/archs/linux-x32/asm_avx2/crypto/include/internal/dso_conf.h
  /usr/local/include/node/openssl/archs/linux-x32/asm_avx2/include/openssl/opensslconf.h
  /usr/local/include/node/openssl/archs/linux-x32/asm_avx2/include/progs.h
  /usr/local/include/node/openssl/archs/linux-x32/no-asm/crypto/buildinf.h
  /usr/local/include/node/openssl/archs/linux-x32/no-asm/crypto/include/internal/bn_conf.h
  /usr/local/include/node/openssl/archs/linux-x32/no-asm/crypto/include/internal/dso_conf.h
  /usr/local/include/node/openssl/archs/linux-x32/no-asm/include/openssl/opensslconf.h
  /usr/local/include/node/openssl/archs/linux-x32/no-asm/include/progs.h
  /usr/local/include/node/openssl/archs/linux-x86_64/asm/crypto/buildinf.h
  /usr/local/include/node/openssl/archs/linux-x86_64/asm/crypto/include/internal/bn_conf.h
  /usr/local/include/node/openssl/archs/linux-x86_64/asm/crypto/include/internal/dso_conf.h
  /usr/local/include/node/openssl/archs/linux-x86_64/asm/include/openssl/opensslconf.h
  /usr/local/include/node/openssl/archs/linux-x86_64/asm/include/progs.h
  /usr/local/include/node/openssl/archs/linux-x86_64/asm_avx2/crypto/buildinf.h
  /usr/local/include/node/openssl/archs/linux-x86_64/asm_avx2/crypto/include/internal/bn_conf.h
  /usr/local/include/node/openssl/archs/linux-x86_64/asm_avx2/crypto/include/internal/dso_conf.h
  /usr/local/include/node/openssl/archs/linux-x86_64/asm_avx2/include/openssl/opensslconf.h
  /usr/local/include/node/openssl/archs/linux-x86_64/asm_avx2/include/progs.h
  /usr/local/include/node/openssl/archs/linux-x86_64/no-asm/crypto/buildinf.h
  /usr/local/include/node/openssl/archs/linux-x86_64/no-asm/crypto/include/internal/bn_conf.h
  /usr/local/include/node/openssl/archs/linux-x86_64/no-asm/crypto/include/internal/dso_conf.h
  /usr/local/include/node/openssl/archs/linux-x86_64/no-asm/include/openssl/opensslconf.h
  /usr/local/include/node/openssl/archs/linux-x86_64/no-asm/include/progs.h
  /usr/local/include/node/openssl/archs/linux32-s390x/asm/crypto/buildinf.h
  /usr/local/include/node/openssl/archs/linux32-s390x/asm/crypto/include/internal/bn_conf.h
  /usr/local/include/node/openssl/archs/linux32-s390x/asm/crypto/include/internal/dso_conf.h
  /usr/local/include/node/openssl/archs/linux32-s390x/asm/include/openssl/opensslconf.h
  /usr/local/include/node/openssl/archs/linux32-s390x/asm/include/progs.h
  /usr/local/include/node/openssl/archs/linux32-s390x/asm_avx2/crypto/buildinf.h
  /usr/local/include/node/openssl/archs/linux32-s390x/asm_avx2/crypto/include/internal/bn_conf.h
  /usr/local/include/node/openssl/archs/linux32-s390x/asm_avx2/crypto/include/internal/dso_conf.h
  /usr/local/include/node/openssl/archs/linux32-s390x/asm_avx2/include/openssl/opensslconf.h
  /usr/local/include/node/openssl/archs/linux32-s390x/asm_avx2/include/progs.h
  /usr/local/include/node/openssl/archs/linux32-s390x/no-asm/crypto/buildinf.h
  /usr/local/include/node/openssl/archs/linux32-s390x/no-asm/crypto/include/internal/bn_conf.h
  /usr/local/include/node/openssl/archs/linux32-s390x/no-asm/crypto/include/internal/dso_conf.h
  /usr/local/include/node/openssl/archs/linux32-s390x/no-asm/include/openssl/opensslconf.h
  /usr/local/include/node/openssl/archs/linux32-s390x/no-asm/include/progs.h
  /usr/local/include/node/openssl/archs/linux64-mips64/asm/crypto/buildinf.h
  /usr/local/include/node/openssl/archs/linux64-mips64/asm/crypto/include/internal/bn_conf.h
  /usr/local/include/node/openssl/archs/linux64-mips64/asm/crypto/include/internal/dso_conf.h
  /usr/local/include/node/openssl/archs/linux64-mips64/asm/include/openssl/opensslconf.h
  /usr/local/include/node/openssl/archs/linux64-mips64/asm/include/progs.h
  /usr/local/include/node/openssl/archs/linux64-mips64/asm_avx2/crypto/buildinf.h
  /usr/local/include/node/openssl/archs/linux64-mips64/asm_avx2/crypto/include/internal/bn_conf.h
  /usr/local/include/node/openssl/archs/linux64-mips64/asm_avx2/crypto/include/internal/dso_conf.h
  /usr/local/include/node/openssl/archs/linux64-mips64/asm_avx2/include/openssl/opensslconf.h
  /usr/local/include/node/openssl/archs/linux64-mips64/asm_avx2/include/progs.h
  /usr/local/include/node/openssl/archs/linux64-mips64/no-asm/crypto/buildinf.h
  /usr/local/include/node/openssl/archs/linux64-mips64/no-asm/crypto/include/internal/bn_conf.h
  /usr/local/include/node/openssl/archs/linux64-mips64/no-asm/crypto/include/internal/dso_conf.h
  /usr/local/include/node/openssl/archs/linux64-mips64/no-asm/include/openssl/opensslconf.h
  /usr/local/include/node/openssl/archs/linux64-mips64/no-asm/include/progs.h
  /usr/local/include/node/openssl/archs/linux64-s390x/asm/crypto/buildinf.h
  /usr/local/include/node/openssl/archs/linux64-s390x/asm/crypto/include/internal/bn_conf.h
  /usr/local/include/node/openssl/archs/linux64-s390x/asm/crypto/include/internal/dso_conf.h
  /usr/local/include/node/openssl/archs/linux64-s390x/asm/include/openssl/opensslconf.h
  /usr/local/include/node/openssl/archs/linux64-s390x/asm/include/progs.h
  /usr/local/include/node/openssl/archs/linux64-s390x/asm_avx2/crypto/buildinf.h
  /usr/local/include/node/openssl/archs/linux64-s390x/asm_avx2/crypto/include/internal/bn_conf.h
  /usr/local/include/node/openssl/archs/linux64-s390x/asm_avx2/crypto/include/internal/dso_conf.h
  /usr/local/include/node/openssl/archs/linux64-s390x/asm_avx2/include/openssl/opensslconf.h
  /usr/local/include/node/openssl/archs/linux64-s390x/asm_avx2/include/progs.h
  /usr/local/include/node/openssl/archs/linux64-s390x/no-asm/crypto/buildinf.h
  /usr/local/include/node/openssl/archs/linux64-s390x/no-asm/crypto/include/internal/bn_conf.h
  /usr/local/include/node/openssl/archs/linux64-s390x/no-asm/crypto/include/internal/dso_conf.h
  /usr/local/include/node/openssl/archs/linux64-s390x/no-asm/include/openssl/opensslconf.h
  /usr/local/include/node/openssl/archs/linux64-s390x/no-asm/include/progs.h
  /usr/local/include/node/openssl/archs/solaris-x86-gcc/asm/crypto/buildinf.h
  /usr/local/include/node/openssl/archs/solaris-x86-gcc/asm/crypto/include/internal/bn_conf.h
  /usr/local/include/node/openssl/archs/solaris-x86-gcc/asm/crypto/include/internal/dso_conf.h
  /usr/local/include/node/openssl/archs/solaris-x86-gcc/asm/include/openssl/opensslconf.h
  /usr/local/include/node/openssl/archs/solaris-x86-gcc/asm/include/progs.h
  /usr/local/include/node/openssl/archs/solaris-x86-gcc/asm_avx2/crypto/buildinf.h
  /usr/local/include/node/openssl/archs/solaris-x86-gcc/asm_avx2/crypto/include/internal/bn_conf.h
  /usr/local/include/node/openssl/archs/solaris-x86-gcc/asm_avx2/crypto/include/internal/dso_conf.h
  /usr/local/include/node/openssl/archs/solaris-x86-gcc/asm_avx2/include/openssl/opensslconf.h
  /usr/local/include/node/openssl/archs/solaris-x86-gcc/asm_avx2/include/progs.h
  /usr/local/include/node/openssl/archs/solaris-x86-gcc/no-asm/crypto/buildinf.h
  /usr/local/include/node/openssl/archs/solaris-x86-gcc/no-asm/crypto/include/internal/bn_conf.h
  /usr/local/include/node/openssl/archs/solaris-x86-gcc/no-asm/crypto/include/internal/dso_conf.h
  /usr/local/include/node/openssl/archs/solaris-x86-gcc/no-asm/include/openssl/opensslconf.h
  /usr/local/include/node/openssl/archs/solaris-x86-gcc/no-asm/include/progs.h
  /usr/local/include/node/openssl/archs/solaris64-x86_64-gcc/asm/crypto/buildinf.h
  /usr/local/include/node/openssl/archs/solaris64-x86_64-gcc/asm/crypto/include/internal/bn_conf.h
  /usr/local/include/node/openssl/archs/solaris64-x86_64-gcc/asm/crypto/include/internal/dso_conf.h
  /usr/local/include/node/openssl/archs/solaris64-x86_64-gcc/asm/include/openssl/opensslconf.h
  /usr/local/include/node/openssl/archs/solaris64-x86_64-gcc/asm/include/progs.h
  /usr/local/include/node/openssl/archs/solaris64-x86_64-gcc/asm_avx2/crypto/buildinf.h
  /usr/local/include/node/openssl/archs/solaris64-x86_64-gcc/asm_avx2/crypto/include/internal/bn_conf.h
  /usr/local/include/node/openssl/archs/solaris64-x86_64-gcc/asm_avx2/crypto/include/internal/dso_conf.h
  /usr/local/include/node/openssl/archs/solaris64-x86_64-gcc/asm_avx2/include/openssl/opensslconf.h
  /usr/local/include/node/openssl/archs/solaris64-x86_64-gcc/asm_avx2/include/progs.h
  /usr/local/include/node/openssl/archs/solaris64-x86_64-gcc/no-asm/crypto/buildinf.h
  /usr/local/include/node/openssl/archs/solaris64-x86_64-gcc/no-asm/crypto/include/internal/bn_conf.h
  /usr/local/include/node/openssl/archs/solaris64-x86_64-gcc/no-asm/crypto/include/internal/dso_conf.h
  /usr/local/include/node/openssl/archs/solaris64-x86_64-gcc/no-asm/include/openssl/opensslconf.h
  /usr/local/include/node/openssl/archs/solaris64-x86_64-gcc/no-asm/include/progs.h
  /usr/local/include/node/openssl/asn1.h
  /usr/local/include/node/openssl/asn1_mac.h
  /usr/local/include/node/openssl/asn1err.h
  /usr/local/include/node/openssl/asn1t.h
  /usr/local/include/node/openssl/async.h
  /usr/local/include/node/openssl/asyncerr.h
  /usr/local/include/node/openssl/bio.h
  /usr/local/include/node/openssl/bioerr.h
  /usr/local/include/node/openssl/blowfish.h
  /usr/local/include/node/openssl/bn.h
  /usr/local/include/node/openssl/bn_conf.h
  /usr/local/include/node/openssl/bn_conf_asm.h
  /usr/local/include/node/openssl/bn_conf_no-asm.h
  /usr/local/include/node/openssl/bnerr.h
  /usr/local/include/node/openssl/buffer.h
  /usr/local/include/node/openssl/buffererr.h
  /usr/local/include/node/openssl/camellia.h
  /usr/local/include/node/openssl/cast.h
  /usr/local/include/node/openssl/cmac.h
  /usr/local/include/node/openssl/cms.h
  /usr/local/include/node/openssl/cmserr.h
  /usr/local/include/node/openssl/comp.h
  /usr/local/include/node/openssl/comperr.h
  /usr/local/include/node/openssl/conf.h
  /usr/local/include/node/openssl/conf_api.h
  /usr/local/include/node/openssl/conferr.h
  /usr/local/include/node/openssl/crypto.h
  /usr/local/include/node/openssl/cryptoerr.h
  /usr/local/include/node/openssl/ct.h
  /usr/local/include/node/openssl/cterr.h
  /usr/local/include/node/openssl/des.h
  /usr/local/include/node/openssl/dh.h
  /usr/local/include/node/openssl/dherr.h
  /usr/local/include/node/openssl/dsa.h
  /usr/local/include/node/openssl/dsaerr.h
  /usr/local/include/node/openssl/dso_conf.h
  /usr/local/include/node/openssl/dso_conf_asm.h
  /usr/local/include/node/openssl/dso_conf_no-asm.h
  /usr/local/include/node/openssl/dtls1.h
  /usr/local/include/node/openssl/e_os2.h
  /usr/local/include/node/openssl/ebcdic.h
  /usr/local/include/node/openssl/ec.h
  /usr/local/include/node/openssl/ecdh.h
  /usr/local/include/node/openssl/ecdsa.h
  /usr/local/include/node/openssl/ecerr.h
  /usr/local/include/node/openssl/engine.h
  /usr/local/include/node/openssl/engineerr.h
  /usr/local/include/node/openssl/err.h
  /usr/local/include/node/openssl/evp.h
  /usr/local/include/node/openssl/evperr.h
  /usr/local/include/node/openssl/hmac.h
  /usr/local/include/node/openssl/idea.h
  /usr/local/include/node/openssl/kdf.h
  /usr/local/include/node/openssl/kdferr.h
  /usr/local/include/node/openssl/lhash.h
  /usr/local/include/node/openssl/md2.h
  /usr/local/include/node/openssl/md4.h
  /usr/local/include/node/openssl/md5.h
  /usr/local/include/node/openssl/mdc2.h
  /usr/local/include/node/openssl/modes.h
  /usr/local/include/node/openssl/obj_mac.h
  /usr/local/include/node/openssl/objects.h
  /usr/local/include/node/openssl/objectserr.h
  /usr/local/include/node/openssl/ocsp.h
  /usr/local/include/node/openssl/ocsperr.h
  /usr/local/include/node/openssl/opensslconf.h
  /usr/local/include/node/openssl/opensslconf_asm.h
  /usr/local/include/node/openssl/opensslconf_no-asm.h
  /usr/local/include/node/openssl/opensslv.h
  /usr/local/include/node/openssl/ossl_typ.h
  /usr/local/include/node/openssl/pem.h
  /usr/local/include/node/openssl/pem2.h
  /usr/local/include/node/openssl/pemerr.h
  /usr/local/include/node/openssl/pkcs12.h
  /usr/local/include/node/openssl/pkcs12err.h
  /usr/local/include/node/openssl/pkcs7.h
  /usr/local/include/node/openssl/pkcs7err.h
  /usr/local/include/node/openssl/rand.h
  /usr/local/include/node/openssl/rand_drbg.h
  /usr/local/include/node/openssl/randerr.h
  /usr/local/include/node/openssl/rc2.h
  /usr/local/include/node/openssl/rc4.h
  /usr/local/include/node/openssl/rc5.h
  /usr/local/include/node/openssl/ripemd.h
  /usr/local/include/node/openssl/rsa.h
  /usr/local/include/node/openssl/rsaerr.h
  /usr/local/include/node/openssl/safestack.h
  /usr/local/include/node/openssl/seed.h
  /usr/local/include/node/openssl/sha.h
  /usr/local/include/node/openssl/srp.h
  /usr/local/include/node/openssl/srtp.h
  /usr/local/include/node/openssl/ssl.h
  /usr/local/include/node/openssl/ssl2.h
  /usr/local/include/node/openssl/ssl3.h
  /usr/local/include/node/openssl/sslerr.h
  /usr/local/include/node/openssl/stack.h
  /usr/local/include/node/openssl/store.h
  /usr/local/include/node/openssl/storeerr.h
  /usr/local/include/node/openssl/symhacks.h
  /usr/local/include/node/openssl/tls1.h
  /usr/local/include/node/openssl/ts.h
  /usr/local/include/node/openssl/tserr.h
  /usr/local/include/node/openssl/txt_db.h
  /usr/local/include/node/openssl/ui.h
  /usr/local/include/node/openssl/uierr.h
  /usr/local/include/node/openssl/whrlpool.h
  /usr/local/include/node/openssl/x509.h
  /usr/local/include/node/openssl/x509_vfy.h
  /usr/local/include/node/openssl/x509err.h
  /usr/local/include/node/openssl/x509v3.h
  /usr/local/include/node/openssl/x509v3err.h
  /usr/local/include/node/uv.h
  /usr/local/include/node/uv/aix.h
  /usr/local/include/node/uv/android-ifaddrs.h
  /usr/local/include/node/uv/bsd.h
  /usr/local/include/node/uv/darwin.h
  /usr/local/include/node/uv/errno.h
  /usr/local/include/node/uv/linux.h
  /usr/local/include/node/uv/os390.h
  /usr/local/include/node/uv/posix.h
  /usr/local/include/node/uv/stdint-msvc2008.h
  /usr/local/include/node/uv/sunos.h
  /usr/local/include/node/uv/threadpool.h
  /usr/local/include/node/uv/tree.h
  /usr/local/include/node/uv/unix.h
  /usr/local/include/node/uv/version.h
  /usr/local/include/node/uv/win.h
  /usr/local/include/node/v8-internal.h
  /usr/local/include/node/v8-platform.h
  /usr/local/include/node/v8-profiler.h
  /usr/local/include/node/v8-testing.h
  /usr/local/include/node/v8-util.h
  /usr/local/include/node/v8-value-serializer-version.h
  /usr/local/include/node/v8-version-string.h
  /usr/local/include/node/v8-version.h
  /usr/local/include/node/v8-wasm-trap-handler-posix.h
  /usr/local/include/node/v8-wasm-trap-handler-win.h
  /usr/local/include/node/v8.h
  /usr/local/include/node/v8config.h
  /usr/local/include/node/zconf.h
  /usr/local/include/node/zlib.h

Warning: You have unlinked kegs in your Cellar.
Leaving kegs unlinked can lead to build-trouble and cause brews that depend on
those kegs to fail to run properly once built. Run `brew link` on these:
  node

解決方法

Warning: Unbrewed header files were found in /usr/local/include.

まずは以下のWarningを解決した方法を書きます。

ターミナル
Warning: Unbrewed header files were found in /usr/local/include.
If you didn't put them there on purpose they could cause problems when
building Homebrew formulae, and may need to be deleted.

Unexpected header files:
  /usr/local/include/node/js_native_api.h
  /usr/local/include/node/js_native_api_types.h
  /usr/local/include/node/libplatform/libplatform-export.h
  /usr/local/include/node/libplatform/libplatform.h
  .
  .
  .
  .
  /usr/local/include/node/v8.h
  /usr/local/include/node/v8config.h
  /usr/local/include/node/zconf.h
  /usr/local/include/node/zlib.h

このWarningに書いてあることは、
/usr/local/includeというファイルあるけど、意図的においている訳ではないなら削除して
みたいな感じなので書かれた通りにファイルを削除していきます。

ターミナルに以下を入力して、vimでファイル作成、vimのテキストエディタを開きます。

ターミナル
$ vim ~/.del_files.sh

vimのテキストエディタが開けたらiを入力してINSERTモードに変更します。
1行目に#!/bin/bashを入力し、2行目以降にUnexpected dylibs:以下にあるファイルをコピペして、escを押して、ノーマルモードに変更します。

vim
#!/bin/bash
  /usr/local/include/node/js_native_api.h
  /usr/local/include/node/js_native_api_types.h
  /usr/local/include/node/libplatform/libplatform-export.h
  /usr/local/include/node/libplatform/libplatform.h
  .
  .
  .
  .
  /usr/local/include/node/v8.h
  /usr/local/include/node/v8config.h
  /usr/local/include/node/zconf.h
  /usr/local/include/node/zlib.h

カーソルを#!/bin/bashの下にあるファイルの先頭に置いて、control + vでビジュアルモード(VISUAL BLOCK)に変更し、一番下のファイルまで移動して:を押します。
そうすると下に:'<,'>が入力された状態でコマンドラインが表示されるので、続けてs/^/rm -f /と入力します。

Enterを押して、全てのファイルの先頭にrm -fと追加されているのを確認したら、:を押して、一番下の入力欄にwq!と入力してEnterを押します。

vim
#!/bin/bash
rm -f   /usr/local/include/node/js_native_api.h
rm -f   /usr/local/include/node/js_native_api_types.h
rm -f   /usr/local/include/node/libplatform/libplatform-export.h
rm -f   /usr/local/include/node/libplatform/libplatform.h
.
.
.
.
rm -f   /usr/local/include/node/v8.h
rm -f   /usr/local/include/node/v8config.h
rm -f   /usr/local/include/node/zconf.h
rm -f   /usr/local/include/node/zlib.h

そうすると通常のターミナルに戻るので、

ターミナル
$ bash ~/.del_files.sh

を実行するとファイルが削除できるはずだったのですが、

ターミナル
$ bash ~/.del_files.sh
rm: /usr/local/include/node/js_native_api.h : Permission denied
rm: /usr/local/include/node/js_native_api_types.h: Permission denied
rm: /usr/local/include/node/libplatform/libplatform-export.h: Permission denied
rm: /usr/local/include/node/libplatform/libplatform.h: Permission denied
  .
  .
  .
  .
rm: /usr/local/include/node/v8.h: Permission denied
rm: /usr/local/include/node/v8config.h: Permission denied
rm: /usr/local/include/node/zconf.h: Permission denied
rm: /usr/local/include/node/zlib.h: Permission denied

のように表示されて削除ができませんでした。

ファイルの後ろに: Permission deniedと書かれているので、権限を付与するかsudoコマンドで実行することが必要と判断して、sudoコマンドの実行をするためにもう一度vim ~/.del_files.shを開いてsudoコマンドを追加します。

まず、vim ~/.del_files.shをターミナルに入力してvimのテキストエディタを開きます。

その後、ファイルの先頭にカーソルを合わせて、control + vでビジュアルモード(VISUAL BLOCK)に変更して、一番下のファイルまで移動して、:を押します。

先ほどと同様に下に:'<,'>が表示されるので、今度はs/^/sudo /と入力して、Enterを押します。

ファイルの先頭にsudoと追加できていたら:を押して、コマンドラインにwq!と入力してEnterを押します。

vim
#!/bin/bash
sudo rm -f   /usr/local/include/node/js_native_api.h
sudo rm -f   /usr/local/include/node/js_native_api_types.h
sudo rm -f   /usr/local/include/node/libplatform/libplatform-export.h
sudo rm -f   /usr/local/include/node/libplatform/libplatform.h
.
.
.
.
sudo rm -f   /usr/local/include/node/v8.h
sudo rm -f   /usr/local/include/node/v8config.h
sudo rm -f   /usr/local/include/node/zconf.h
sudo rm -f   /usr/local/include/node/zlib.h

通常のターミナルに戻ってきたら以下のコマンドを実行します。

ターミナル
$ bash ~/.del_files.sh

これでWarningの一つが解決しました。

Warning: You have unlinked kegs in your Cellar.

次にこのWarningを解決した方法を書きます。

ターミナル
Warning: You have unlinked kegs in your Cellar.
Leaving kegs unlinked can lead to build-trouble and cause brews that depend on
those kegs to fail to run properly once built. Run `brew link` on these:
  node

とりあえず読んでみるとbrew linkしてくださいということが書かれているみたいですが、今回は一回リセットしてnodeをインストールしたいと思っているので、リンク先のディレクトリを削除していきます。

ターミナル
$ brew unlink node
Unlinking /usr/local/Cellar/node/14.5.0... 0 symlinks removed

次に表示されているディレクトリを削除します。

ターミナル
$ rm -drf /usr/local/Cellar/node/

Warningを解決したのでbrew doctorで確認します。

ターミナル
$ brew doctor
Warning: Broken symlinks were found. Remove them with `brew cleanup`:
  /usr/local/opt/node
  /usr/local/opt/node@14

brew cleaupをしてくださいというWarningが表示されたので実行します。

ターミナル
$ brew cleanup

実行した後、brew doctorで確認します。

ターミナル
$ brew doctor
your system is ready to brew.

これで全てのWarningを解決することができました。

参考にしたサイト

https://qiita.com/ponsuke0531/items/80f716c803ac23c7849d
https://qiita.com/6592sho/items/b24766e203fb7a48b056
https://qiita.com/rinimaruranran/items/2d8d930ad846fa41b9e6

Browsing Latest Articles All 4224 Live