Quantcast
Channel: Vimタグが付けられた新着記事 - Qiita
Viewing all 5727 articles
Browse latest View live

Vim初心者に送るカテゴリ別Vim Pluginまとめ

$
0
0

動機

最近会社に入った後輩がVimを使っていました。
彼の.vimrcはプラグインが何も入っていない非常にシンプルなものでした。
これはしめたものだぞと、良さそうなプラグインを怒涛のように勧めまくろうと思ったのですが、
勢いのままに雑多な情報を与えては彼が混乱してしまうし、
同じような系統のプラグインであっても好みによるものが多いので
自分が使っているからと勧めるのは良くないと踏みとどまりました。

というわけで一旦自分の中でプラグインに関する情報をまとめた上で、
じっくりと彼に選んでもらいたいと思い。この記事をしたためました。

Vim以外の記事書けって上司に言われてたのに結局またVim書いちゃったよ...

新人の彼は、これから深い闇に染まり混沌を愛するDarkVimmerになるのか、
Vimのデフォルトを愛しシンプルさを信仰するWhiteVimmerになるのか、
はたまたVim以外のエディタを使うのはわかりません。
しかし、それでもこういうものもあるんだなと知っておくことで、
彼のこれからのエディタ生活が、より良いものになることを願います。

注意

  • できるだけフラットにご紹介したいですが、自分が使っているプラグインは思い入れが強いので、つい力が入る可能性があるのでご注意ください
  • Vim対応とNeovim対応、それにバージョンによっては対応していない場合などあるのでご注意ください。Neovimについては別記事にまとめたので参考にしてください
  • プラグインは増やしすぎるとVimが重くなります。軽くしようと遅延ロードしまくると消耗するので、入れすぎにご注意ください

インタラクティブフィルター系プラグイン

それにつけてもインタラクティブフィルターです。
ファイルとかタグとかヘルプとかを一覧に出力し、ファジーに絞り込むにくいやつ。
数多くのVimmerはこれを取り込んだが最後、その便利さに取り込まれて使わずにはいられない。
もはや現代のエディタに必須の機能といえるでしょう。

なお私はdenite.nvimとfzf.vimを併用しています

ctrlp.vim

kien/ctrlp.vim

  • pure Vimscript により実装
  • シンプルかつ豊富な拡張性
  • 拡張プラグインを追加することで更に機能強化が可能

紹介するこのカテゴリのプラグインの中で、唯一 pure Vimscript (Vimscriptのみで実装されているプラグイン)のプラグインとなります。
Vimscriptのみで実装されているということは、他のプログラムを導入する必要なく、
プラグインをインストールするだけで使用することができるということです。これは非常に魅力的です。

だからといって機能が不足しているということはなく、必要十分な機能を持っています。

fzf.vim

junegunn/fzf.vim

  • Go実装されたインタラクティブフィルターのラッパー
  • はやいはやいとにかくはやい

fzfといばGitHub Trend(Golang)のランキング常連であり、
最もスターの多いインタラクティブフィルターコマンドとして有名です。
このプラグインはfzfをVimからコールするためのラッパーを提供し、
絞り込みはGo実装されたバイナリであるfzfにて行われます。

なんといってもその特徴は実装がGoだからこそ出せるその速度。
候補が数万ファイルあろうがいとも簡単に絞り込みをやってみせるパワフルさ。そこに痺れる憧れる。
grepしてからその結果のプレビュー表示とか、重めの処理をしてもサクサクするのはやばい。

denite.nvim

Shougo/denite.nvim

  • NeoVimのリモートプラグイン(Vim8以降ならVimでも使える)
  • 豊富なオプションによる高い拡張性
  • Vimと親和性の高いイカしたデザイン
  • Pythonによる機能拡張

我らが暗黒微無王のお通りです。その特徴は圧倒的な拡張性。これぞ暗黒。
Python実装のリモートプラグインのため、導入は他のプラグインに比べて難易度が高めです。
しかしその拡張性故に色々自分好みにカスタマイズすると手放せなくなるほどの中毒性を持ちます。

Pythonにより絞り込みとアクションを定義したスクリプトを記述することで、
自分のサブコマンド(deniteではsourceと呼ばれます)を自作することができます。
上記でご紹介した他プラグインでもできますが、Vimscriptが苦手ならPythonで書けるのはありがたかったりします。

ファイラー系プラグイン

Vimにはnetrwというファイラーが付属していますが、
重かったり使い勝手が良くないという理由から
ファイラー系プラグインを使用するVimmerが多いのが実情かと思います。
上記インタラクティブフィルター系プラグインを使用していればいらなくねという人も
いらっしゃるらしいのですが、私は普通にいると思っています。

ちなみに私はnerdtree使用しています。

nerdtree

scrooloose/nerdtree

  • Vimファイラー界で最も有名
  • 長い歴史が培った豊富なオプションと拡張プラグイン

Vimで入れるべき必須プラグイン的な記事があると必ず紹介されています。
IDEとかAtomやVSCode等のファイルエクスプローラがVimに欲しければ、まずコレでしょうね。
その特徴はなんと言っても豊富な機能と拡張プラグインの多さです。
依存プラグインを導入することで、Gitと連携してGitStatusを表示に反映することや、
タブ間で共通のツリーを表示するといった機能拡張も可能です。

vim-dirvish

vim-dirvish

  • シンプルなファイラー(パスナビゲータと銘打っており厳密にはファイラーでないらしい)
  • 早い

起動するときれいなパスの一覧が高速で起動します。コンセプト(Lines are filepaths)が明確でかっこいい。
ファイラーなんて高速で起動して一覧が見れてファイル開けりゃいいんだよというミニマリストにおすすめです。
プラグイン組み込みのファイル操作コマンドなどがないためご注意ください。
こちらも依存プラグインでの機能拡張が可能です。

vaffle.vim

cocopon/vaffle.vim

  • シンプルなファイルマネージャ
  • 上記nerdtreeとvim-drivishの中間的な存在

シンプルながら必要十分なファイル操作機能を有したバランスの良いファイラーといえるのではないでしょうか。
個人的にnerdtreeは機能が多くUI的にちょっとかっこ悪いかもと、私も思ったりします。
複数のウィンドウでファイラーを開けるところも面白そうです。

拡張テキストオブジェクト系プラグイン

Vimの便利機能といえばテキストオブジェクトといった具合の文脈で紹介されていることも多いですね。
このカテゴリはそのテキストオブジェクトの拡張となります。
主に", ' ,[ ,{などの囲む系文字列に対する操作を拡張してくれます。
慣れていくと面倒な囲み文字列の追加や変更、削除などをより効率的に行うことが可能となります。

私はvim-sandwichを使っています

machakann/vim-sandwich

  • 後発プラグイン
  • プラグイン単体でのドットリピートの実現
  • 変更対象がハイライトされたりと嬉しい機能がある

この系統のプラグインとしては後発なだけあって、
対象箇所のハイライトや、これまで複数のプラグインで実現していた操作のドットリピートなどの実現など
うまくまとまっており、ベターな選択肢な印象です。

vim-surround

tpope/vim-surround

  • Vim Pluginでは有名なtpope氏のプラグイン

このジャンルでは古株プラグインです。

vim-sandwich

Syntaxチェック & Linter系プラグイン

Vimをコーディングで使う上で、文法チェックは非常に重要になります。
極端な話、Shellに戻ってmakeやlintを実行した後またVimに戻れば同じことはできますが、
記述したらどの行にエラーが発生しているかビジュアル的に見れたり、
QuickFixでエラー箇所の一覧を表示して快適にジャンプしたりという状態に慣れていると、
Shellで出力したファイルと行を確認して手動で移動するのは前時代的に思えます。

このジャンルはVimの非同期実行機能であるJobの登場以降、
その恩恵を最も強く受けたジャンルの一つでもあります。
Lintの実行中にコーディングをブロックしないのはとても重要ですね。

なお私はALEを使用しています。

ALE

w0rp/ale

  • 最近のLinter実行プラグインではディファクトになりつつある
  • 非同期実行可能
  • 豊富な対応言語
  • 豊富なコマンドとオプション
  • LSP対応

ALEは Asynchronous Lint Engine の略だそうで、その名の通りLintの非同期実行が可能です。
VimにJobが追加されて以降、古参のSyntasticのシェアを奪う怒涛の勢いで伸びてきたプラグインです。
このジャンルの現在のディファクト的な存在といえます。

対応言語の多さや豊富なコマンド、オプションには目を見張るものがあり、最近話題の Language Server にも対応しています。
インストールして充実したドキュメントに目を通せばサクッと使え、かつオプションで細かい制御が可能と優等生です。
ただ一方で豊富な機能にブロッキングされて編集のノイズになるという声も。

neomake

neomake/neomake

  • Linterというよりはmakeの置き換えだそうです
  • 非同期実行可能
  • ALEよりも玄人志向な印象

名前の示すとおり、Vimの組み込みコマンドであるmakeの置き換えを謳っています。
makeはコンパイルを実行し、エラーがあればその内容をQuickFixに表示する組み込みコマンドですね。
しかし、makeにはないgutterへのエラーマークの表示や
エラー箇所のハイライト表示などQuickFixを表示するだけでない現代的な仕上がりとなっています。
ALEと比べるとオプションやコマンドは少なく玄人向けという感じがしますが、ウォッチする価値があるプロジェクトだと思います。

syntastic

vim-syntastic/syntastic

  • この系統では古株のプラグイン
  • 非同期実行はできない

古株のプラグインですが、以下のIssueを見る限り今後非同期実行をサポートする気は無いようです。

現在ではLinterの意義はプログラミングする高まってきており、非同期実行をサポートしていないのは厳しい印象を受けます。

プログラム実行(ランナー)系プラグイン

コーディングしたら可能な限り早く実行したい。それがプログラマの性(さが)というものです。
私達プログラマーはその業務の中で膨大な回数のトライ&エラーを繰り返します。
そのサイクルを高速化する上で重要なのがこのジャンルになります。

私はvim-quickrunを使用しています。

vim-quickrun

thinca/vim-quickrun

  • まさしくプログラム実行用のプラグイン
  • 実験的であるもののjobやterminal

実は記述したプログラミングを実行する。
というワークに焦点を当てたプラグインvim-quickrunをおいて他にありません(私が知らないだけの可能性があるので知ってたら教えてください)
vim-quickrunを入れて、最低限の設定をするだけで各種言語で記述したプラグラムを即時実行する環境が手に入ります。
実験的な機能とのことですが、jobやterminalといった新機能をrunnerとして使用可能です。
ただし作者の方がNeovimを使用していないので、これら実験機能はVim限定です。
細かく設定することでTestのランナーとしても使用可能です。

vim-dispatch

tpope/vim-dispatch

  • 非同期ランナー
  • tmuxやscreenと連携したりする。カッコイイ

基本的に非同期で実行し、QuickFixに流す機能のみを提供します。
なので実行には:Dispatch respc %など実態のプログラム入力が必要となります。
いろんな言語に対応したいのであればAutocmdでファイルタイプ別にキーバインドを設定するなどの対応が必要です。
なおvim-testというプラグインと連携することでテストランナーとして使用することができます。

大きな特徴としてtmuxやscreenなどのターミナルマルチプレクサを認識し、
ペイン切ってそのペイン上でプログラムを実行する機能を持っていることです。
プログラムの実行経過をリアルタイムで見ることができます。

asyncrun.vim

skywind3000/asyncrun.vim

  • 非同期ランナー

上記vim-dispatch同様に非同期実行機能とQuickFix連携機能をもつランナーです。
ほとんど使ったことないのでご紹介のみにとどめます。

自動補完系プラグイン

実はVimにはプラグインを入れなくとも補完機能があります。
ただし明示的に<C-p>, <C-n>を使う必要があるので、自動補完ではなく手動補完です。
このジャンルは言語別プラグイン(jedi-vimやvim-go)に搭載されているパターンなどありますが、
ここでは特定言語に依存しないプラグインのみご紹介します。

割と導入ハードルが高くdeoplete.vimに満足しているため他が試せていない状態です。また余裕が合ったら追記します。

YouCompleteMe

Valloric/YouCompleteMe

使ってないので紹介のみ

deoplete.nvim

Shougo/deoplete.nvim

  • NeoVimのリモートプラグイン(Vim8以降ならVimでも使える)
  • 2017/12頃から処理並列化によりかなり高速に
  • 豊富な拡張(source)により、多くの言語に対応
  • neocomplete.vimの後継

別記事を参照

nvim-completion-manager

roxma/nvim-completion-manager

使ってないので紹介のみ。
作者の興味が他に移ったため(Issue)、現在他の方がフォークしているプロジェクトがあります。

ncm2/ncm2

asyncomplete.vim

prabirshrestha/asyncomplete.vim

使ってないので紹介のみ。

LSP(Laungage Server Protocol)系プラグイン

Language Serverと通信するためのクライアントです。
各言語のコーディング機能をLSのプラグインでで統一できたらかなり便利になると思うのですが、
現状整備が追いついていない印象です。

こちらも自動補完系と同様に導入ハードルが高く試せていない状態です。また余裕が合ったら追記します。

なおNeovimでは本体側にクライアントをビルドインする流れもあるそうです。

vim-lsp

prabirshrestha/vim-lsp

vim-lsc

natebosch/vim-lsc

languageclient-neovim

autozimu/languageclient-neovim

ステータスライン拡張プラグイン

Vimはターミナル上で動作するエディタなので、その見た目は簡素でシンプルなものです。
しかしIDEに慣れ親しんだ方には、ともすれば貧弱なUIに見えることでしょう。
そんなときはステータスライン拡張プラグインです。
キャラクタベースの中で美しく見やすいステータスラインを実現してくれます。

私はlightline.vimを使用しています。

vim-airline

  • 豊富なオプションによる簡単カスタマイズ
  • 他のプラグインとの連携が豊富

vim-airline/vim-airline

現状のステータスライン拡張プラグインとしてはディファクトな印象を受けます。
その理由は豊富なオプションによる簡単な表示のON/OFFや
他のプラグインとの連携による表示可能な機能の多彩さからも伺えます。

lightline.vim

itchyny/lightline.vim

  • 軽量
  • プログラマブルなカスタマイズで柔軟な対応が可能

上記vim-airlineに比べ軽量に動作します。
airlineが入れてオプションで見た目を編集してくれ。といったポリシーに対し、
lightline.vimは基本機能をベースにレイアウトだけ提供して、
あとは自分でVimscript記述してカスタマイズしてくれといったポリシーであり、
プログラマブルな設定をする必要があります。
だからこそVimscriptが使える人ならかなり自由なカスタマイズが可能です

コメントアウト系プラグイン

Vimは高度な編集機能を持っているから、
コメントアウトくらい自分でやればいいじゃんという人もいるかもしれませんが
私は無理でした。キーバインド一発でON/OFFできるのは便利です。
個人的に各プラグインの機能自体に差はないと思っているので一覧だけ置いておきます。

私はcaw.vimを使用しています

tcomment_vim

tomtom/tcomment_vim

nerdcommenter

scrooloose/nerdcommenter

caw.vim

tyru/caw.vim

まとめてみた感想

Vimはその歴史の長さにより大量のプラグインが存在します。
またプラグインの進化と同様に、Vimの本体やそのフォークプロジェクトも進化しており、
新機能を用いたプラグインもどんどん増えているため、
これまでディファクトであったプラグインも新興プラグインによってその地位を脅かされる
といった事例も出てきています。とりわけJobによる非同期処理はその傾向が顕著です。

この記事を含め人に頼らず自分で動向をウォッチしていくことも非常に重要ですね。
私も自分のプラグインをご紹介できる機会を作りたいものです(遠い目)


vimで保存時に自動コンパイル

$
0
0

対象

  • vimが好き
  • コンパイルが面倒
  • シェルで作業してる人

概要

latexやsassなど主にコンパイルが面倒なものは自動コンパイルがそもそも実装されています。
latexであれば
$ latexmk -pvc sample.tex
sassであれば
$ sass --watch sample.scss:sample.css
ファイルの変更を自動で読み、コンパイル、エラー文を吐いてくれます。
しかし、毎回編集を行う前に打ち込むのは面倒。
今回はコンパイルを自動化していきます。

vimでファイルタイプごとに設定を分ける。

vimには拡張子ごとに設定ファイルを分ける機能が標準装備されています。
filetypeを指定することによってそれが可能になります。
詳しく知りたい方は公式リファレンスをクリックしてみてください。
今回は拡張子がtexとscssのものを扱っています。

~/.vimrc
filetype plugin on
augroup fileTypeSet
    autocmd!
    autocmd BufNewFile,BufRead *.scss setfiletype scss
augroup END

letg:tex_flavor='latex'

vimのaugroup内でファイルを開いた時の設定を記述することができます。上記のようにすると拡張子がscssの場合、filetypeとしてscssを読み込む。という意味になります。
またtexをfiletypeとして指定するとき一つ注意点があり、texは元々vimのグローバル変数の設定からfiletypeを振り分けることができるようになっています。
だから新しく追記する代わりに変数に代入してやります。

vimはruntimepathに設定しているファイルを読みに行くのでここはおとなしく標準で設定されている~/.vim/ftplugin以下に拡張子ごとの設定ファイルを置いていきます。
ftpluginはなければ自分で作成します。sassの例を加えるならば以下の二つを追加します。

  • ~/.vim/ftplugin/scss.vim
  • ~/.vim/ftplugin/tex.vim

設定を記述する

vimではコマンドラインモードで:!を用いることによってシェルのコマンドを実行することができます。コンパイル後のファイルがカレントディレクトリになるよう :lcd %:hで編集中ファイルのディレクトリに移動し、 :!latexmk %:pでファイル保存時にlatexをオートでコンパイルするようにしました。%:pには編集ファイルのフルパスが入ります。

~/.vim/ftplugin/tex.vim
autocmd BufWritePost * :lcd %:h|:!latexmk %:p

これはこれで動いたのですがここで僕はそもそもこんな少量でいいんだったらそのままvimrcにかけばよくね?となりました。

最終的な着地点

現在僕のvimrcはこのようになっています。
Rとlatexとc言語のコンパイルを行えるようにしています。

~/.vimrc
filetype plugin on
augroup setAutoCompile
    autocmd!
    autocmd BufWritePost *.tex :lcd %:h|:!latexmk %:p
    autocmd BufWritePost *.c:lcd %:h|:!gcc %:p
    autocmd BufWritePost *.cpp :lcd %:h|:!g++-std=c++14 %:p
    autocmd BufWritePost *.R :lcd %:h|:!R -f %:p
augroup END

これでまたvimrcが強くなりましたね。

メリット

  • 保存時にエラー文が見れるので楽
  • コンパイルする手間が省ける(競技プログラミングに強い)

デメリット

  • 壊れたコードのままうかつに保存すると大量のエラー文がでる(逆に言えばコンパイルできないコードの状態で保存しないくせがつく...??)

エクスプローラからWSLのVIMでファイルを開く方法

$
0
0

お断り

以下の方法は本質的に下記サイトの内容をWindows10 1803アップデートに合わせて更新しつつ,パスに空白が含まれる場合に対応し,SendTo版を加えたものです.

また以下ではvimを例に説明していますが,vim固有の機能を使うわけではないので,ファイル名を引数として受け取る別のコマンド(emacsなど)でも問題ありません.

目的

ちょっとしたテキストファイルの編集に,Windows Subsystem for Linux(以下WSL)のvim(≠gvim)を使いたい.しかもエクスプローラーから直接vimを起動したい.

理由

  • Windows版のvimをインストールしてSendToにでも入れておけば良いだけではある.しかしWSL側で作業するときは必ずvimを使うのでもともとvimは入っている.2つのvimをインストールするのは避けたい.
  • WSL側のvimなら,Linuxで作業しているときと全く同じようにコマンドを呼べる(範囲指定して:'<,'>:!sort|uniqでソートして重複を削除するとか).

方法1:レジストリを編集してコンテキストメニューに加える

以下の2点を実現するように,レジストリにキーを追加することで,コンテキストメニューからvimでファイルを開くことができるようにする.

  1. bash.exeを起動して,その中でvimを起動する.
  2. vimの引数にはエクスプローラで選択していたファイル名をWSL形式に変換して渡す.

まずregeditを起動してHKEY_CLASSES_ROOT\*\shellに新規キーとしてOpenWithVimを作る(名前は適当でよい).作成したら名前が(規定)な文字列値(REG_SZ)がその下にできているはずなので,値(データ)をOpen with Vim (&W)にする.これもエクスプローラ上でファイルを右クリックした際に表示されるコンテキストメニュー上での項目名なので何でもよい.ただし末尾の(&W)はショートカットキーを決める文字列なので,好みのものに変更するとよい1

続けてキーOpenWithVIMの下に新規キーとしてcommandを作成し,(規定)文字列値のデータを

C:\Windows\System32\bash.exe -c "vim \"$(wslpath -a -u "%1")\""

にする.なお冒頭の参考サイトでは1803アップデート以前のWSLを想定して同様の処理を以下のようにsedで行っている.

C:\Windows\System32\bash.exe -c "vim $(lower=$(echo "%1" | sed 's/\\/\//g' | sed 's/://') && echo /mnt/${lower,})"

以上を行うと,

  1. ファイルを選択した状態でアプリケーションキー/メニューキーを押す(もしくはファイルを右クリックする)
  2. コンテキストメニューが表示される
  3. Wキーを押す

という操作でvimが起動する.

参考までに,以下をOpenWithVim.regなど適当な名前のテキストファイルとして作成してダブルクリックすれば,上記のregeditによるキー追加を行うことができる.

OpenWithVim.reg
Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\*\shell\OpenWithVim]
@="Open with Vim (&W)"

[HKEY_CLASSES_ROOT\*\shell\OpenWithVIM\command]
@="C:\\Windows\\System32\\bash.exe -c \"vim \\\"$(wslpath -a -u \"%1\")\\\"\""

方法2:「送る」メニューに加える

手順1のcommandと同じ内容を持つバッチファイルを作成してSendToに配置すれば,コンテキストメニューの「送る」からvimで開くことができるようになる.

まずWin+Rを押して「ファイル名を指定して実行」を開き,shell:sendtoを実行するとSendToフォルダが開く.このフォルダに下記の内容でバッチファイルを作る.ファイル名は適当でもよいが,先頭の文字がそのままショートカットキーになるので,使いやすいものを選ぶとよい.

vim-wsl.bat
C:\Windows\System32\bash.exe -c "vim \"$(wslpath -a -u "%1")\""

以上を行うと,

  1. ファイルを選択した状態でアプリケーションキー/メニューキーを押す(もしくはファイルを右クリックする)
  2. コンテキストメニューが表示される
  3. Nキーで「送る」サブメニューが開く
  4. Vキーを押す

という操作でvimが起動する.

参考


  1. たとえばvimの頭文字から(&V)としてもよい.しかし「以前のバージョンの復元」とキーが重複するため,Vキーを押した後にEnterを押す手間が増える. 

vim で編集中のファイルをブラウザで開いたり、格納ディレクトリを Finder を開いたりするエイリアス(Mac)

$
0
0

mac はopenというコマンドでダブルクリックのようなことをできる。
参考: 知ってるとちょっと便利なMacの固有コマンド

また、vim のコマンドラインモードでは%で今編集中のファイルのパスを手に入れることができる。

(おまけ)
これは vim の今の作業ディレクトリからの相対パスになる。
また、フルパスにしたり拡張子にしたりもできる。
気になる人は:tab h %:pとかしてみるとマニュアルが引ける。
挙動を確かめて見たい場合は:!echo %:eとかやってみるとわかる。

これを知っていると、例えば.htmlを編集している時に以下のコマンドで編集ファイルをブラウザで開ける。

:!open %

vim の作業ディレクトリを開きたい場合は、.が今の作業ディレクトリを表すのでこう。

:!open .

編集しているファイルのあるディレクトリを開きたいなら、%:hを付ける。

:!open %:h

だいたいこんな感じ。

ただし、openはまんまダブルクリックなので、:!open %の際に例えば.mdファイルがエディタに紐づいているとエディタが開いてしまう。
そんな時は-aでアプリを指定するか、.appに含まれている実行ファイルを直接使う。

-aならこう。

:!open -a /Applications/Google\ Chrome.app %

.appを使うならこう。こっちはopenを使ってないので細かい挙動が決められる。

:!/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --new-window %

で、ここらまで行くとさすがに長いので、適当に自作コマンドを作る。

.vimrc
command! B !/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --new-window %

command! Bに続けて書くだけ。
Bの部分は大文字で始まって入れば良いので、今まで紹介した!で始まるコマンドを適当に登録すれば良い。

呼ぶ時はこう。

:B

快適だ :D

historyから特定のコマンド履歴を消す [Vim]

「怖くないLinux」Vim編

$
0
0

熱狂vim塾

みんなだいすきVim.
というかハードルが高すぎるんだよね。実はかなり高機能エディタなので、正直使わないのはもったいない。
一応今回の目標は「vimでの不自由ない修正作業」だけど、vimの高機能っぷりを教えておきます。
Windows向けもあるんやで。

※ここから、コマンドっぽいところはaBC-cみたいに書きます。それぞれ
a←普通に[a]キーを押す
BShiftキーを押しながら[b]キーを押す
C-cCtrlキーを押しながら[c]キーを押す

みたいになってます。わかりづらいと思いますが結構技術書なんかもこの書き方が多いハズ。頑張ろう。

mode解説

さて、vimを最も難しく、そして高機能化しているもの、それが[mode]という概念だ。

Normal Mode

すべての基本。とりあえずコマンドのうちはじめはここ。
まず覚えておくべきは「Escを連打すれば必ずNormal Modeになる」ということだ。
たいていの状況からでもEsc連打でNormal Modeになるぞ。そこから落ち着いて色々コマンドなんか打てばいい。

とりあえず以下のコマンドを打鍵して、カーソルを自由に動かしてみよう。
hjkl
これ、私は実際結構わかりづらいと思ってる。
jkが上下どうなっているか結構忘れると思う。というかこれで移動すること実際そこまでないしね。別にカーソルキーでも動けるからいいのだ。

Insert Mode

もちろんエディタなので、文字が打てなければ行けない。
Normal Modeから特定のキーを打鍵することによりInsert modeとなり、キーボードに書いてある文字を入力できる状態となる。

insert modeになるためには下記のキーのいずれかを押すことでinsert modeになる。
左下に -Insert- って現在のモードが表示されると思うので、そこを見ながら頑張ろう。

iインサート、挿入(カーソルの場所の左から文字が打てる)
I行頭に挿入
aアペンド、追加(カーソルの場所の右から文字が打てる)
A行末に追加
oオープン、1行下に行を追加(カーソルの場所の次に行が開いて文字が打てる)
O 1行上に行を追加(カーソルの場所の前に行が開いて文字が打てる)

oとか Oはあんまり触らないんじゃなかろうか。結構これだけでも便利よ。

Insert modeでもカーソルキーなら移動できる。すごいやん。でもvimを結構使っていると、カーソルキーではないところで移動したほうが楽じゃん!って気づく。気づいてからじゃ遅いので、insertが終了したらEscを連打してnormal modeにしておこう。

Visual mode

さてここからが本番。

vVC-vのどれかでvisual modeに入ることができます。抜けるのはEsc。いつも心にEsc
さて、visual modeに入ったあと、上のカーソル移動キーで自由に移動してみよう。わかりやすく言うとマウスでドラッグしている状態、になっているかな?
これがvisual modeで、わかりやすくコマンド対象を選択することができます。
もちろんこれだけでは効力を発揮できず、いろんなコマンドと組み合わせることで真価を発揮するタイプのものです。

以下、visual modeで選択している状態から

  • yヤンク、コピー
  • Y一行ヤンク
  • dデリート、じゃなくて切り取り
  • D行末までデリート
  • cチェンジ、選択部分を削除して挿入モードへ
  • C行末までチェンジ
  • pペースト、貼り付け、y,d,cなどで切り取った内容をカーソルの次に挿入
  • Pペースト、貼り付け、y,d,cなどで切り取った内容をカーソルの前に挿入

などだけ覚えておくだけでも割りと使えます。
コピー、切り取りしたところはpPで貼り付けられるぞ。
さて、それぞれ違いをかんたんに説明しておきましょう。これを覚えているだけで随分変わってくると思われますので。

  1. vで選択した場合
    普通に選択開始箇所から、マウスでドラッグした風の選択範囲を対象として動作します。

  2. Vで選択した場合
    やってみれば分かり易いです、いわゆる「行選択」状態になります。上の切り取り、なんかと組み合わせるとX行だけ切り取り!なんてことがかんたんにできます。マウスなしでも。

  3. C-vで選択した場合
    いわゆる「矩形選択モード」となる。
    サクラエディタで言うところのShift+F6、秀丸エディタとかだとAlt+マウスドラッグ、みたいな?
    これのポイントは切り取り、貼付け時になるべく切り取った状態のまま貼り付けようとするところです。
    といってもその他のエディタとそこまで変わらないです。

visual modeはこの次のmodeと組み合わせるとすっごい便利なのでぜひ覚えよう!

Command Line Mode

:から始まるコマンドを使うmodeです。
Normal modeでとりあえず:を打ってみてください。
これは左下なんかにMode名が出ないはずです。:は出てると思いますが。

ここで色々入力することで特殊コマンドなんかができます。これがcommand line modeだ!

:set [target]って打つことでvimの設定を変更したり、
:%s/before/after/gって打つと[before]って文字列が[after]に変換できたりするぞ!

そしてなにより:help [command]でvimコマンドのhelpが開けるぞ!

この辺から妙に難しく感じるかも知れないが、linuxコマンドとそこまで変わらない。実際覚えておくべきことは少ないので、大丈夫大丈夫。
とりあえず:set nowrap:set list:set cursorlineとかを打って設定を変えて見よう。
これ、結構色々見た目変えられるし、結構色々できるんです。すごいんです。

そして検索、/でコマンドラインみたいに下に検索窓?が出てくるから、そこへ検索する文字列を入力して文字検索だ。
文字検索結果はEnterで次の結果。。。には行かない。

あくまでコマンドラインモードとしては「検索を実施した」なのだ。それ以降はnormal modeとして結果を引き継ぐ必要がある。
といっても難しくない。nで次の結果を表示、Nで前の結果を表示する。
わかりやすいね!

検索系、類似コマンドを上げておこう。検索と置換はvimの華!

*カーソルのある位置の単語を検索する
#カーソルのある位置の単語を逆に検索する
これ、nNが逆になるのがミソ。ってかわかりづらい。なんでこうなった。

これ知ってるだけでかっこいい!ってなるはず。ならんか。

オペレータについて(コマンドの構成、作り方について)

さて、ここまでvimの各種モードの解説、またそれなりに程々なコマンドの説明等をしてきましたが、normal modeにおけるコマンドの構成についてここで少し語ります。

normal modeにおけるコマンドについては通常復数のキーの組み合わせで構成されており、それぞれ意味を持っています。分けて解説します。

例えば、カーソルの有るところから単語1個分削除(実際は切り取りの為貼り付けが可能)のnormal mode コマンドは
dwとなっています。

もちろん上記コマンド、dwで分割でき、それぞれd部分がオペレータ、wがモーション、というものです。

dがdeleteのオペレーションを決定し、wでword,つまり単語単位で実行してね、となっています。
これ、今まで出てきたものとそれぞれ組み合わせることが出来ます。

例えば2cw。これは2changewordの組み合わせなので単語2個分変更(削除して挿入モードへ)となります。

ある程度、この構成で出来ている、というのが分かりさえすれば結構スムーズにどのコマンドを打てば狙っている事ができるか、というのが出来てくると思います。

またvisual modeとの組み合わせが強力です。
visual modeで選択している時にnormal modeと同じコマンドを実行しようとした場合、visual modeで選択している部分がモーション扱いになり、オペレータのみを入力すればコマンドが実行されます。

大体のvim教本などで最初にコマンドでdd(1行分削除)やyy(1行分コピー)に数字を頭につけて複数行、なんてのがよく紹介されるのですが実際使いづらいです。

10ddとか書いても実際10行消したいのかどうなのか、行数を数えてから実行、なんてよくあると思います。
だったらVで行選択visual modeにしてからカーソルを下に移動して行き、目標の箇所までたどり着いたらdで削除ってやったほうが自然です。

とにかくvimのnormal modeのコマンドについてはオペレータ、モーションの構成(逆に打っても大体動きます)がありますよ、ってところを覚えておきましょう。

数字を頭につけるのはggは便利かもしれません。
特に数字を付けない場合は最初の行へカーソルを移動、ですが数字をつけることにより指定行へ移動、となります。
100ggなら100行目へ移動、です。
eclipseならC-l100Enterですかね。

1つオススメを教えておきます。
ci(di'とかcitとかのなんとかiなんとかです。
これ、構成的には最初の一文字がオペレータ、あと二文字モーションになるのですが、
iなんとかがすごいんです。
簡単に言うとin nantokaで、最後の文字で括られている部分すべてを対象として動作することが出来ます。
ちなみに最後のcitchange in tagです。HTMLタグが該当します。
これ覚えていただけば今日の研修は成功です。と言ってもいいくらい、皆さんに伝えたいしみんな知らないものです。

例文書いておきます。

publicstaticStringgetDefaultDate(intaddMonth,intdefaultDay){Calendarcalendar=newGregorianCalendar();calendar.add(Calendar.MONTH,addMonth);calendar.set(Calendar.DAY_OF_MONTH,defaultDay);DatetargetDate=calendar.getTime();returnDateFormatUtils.format(targetDate,"yyyy/MM/dd");}

ってどこにでもありそうなJavaの日付変換メソッドが合ったとします。
例えばreturn DateFormatUtils.format(targetDate, "yyyy/MM/dd");"yyyy/MM/dd"部分を変更したい!ってなった場合、

  1. 対象部分(今回は"yyyy/MM/dd"の内部)にカーソルを移動する
  2. ci"
  3. yyyy/MM/ddが消え、 return DateFormatUtils.format(targetDate, "|");の状態で縦棒の所にカーソルがinsert modeで!

・・・うん。伝わらない気がしてきました。

これ、HTMLファイルを直したりする時に便利なんです。
HTMLファイルの特定タグの内部を変更するとき、citでタグ内部の文字列を全部消して、そこから変更後内容を書き始める、という事をやるときなどに割と便利です。

リピート.

ちょっとの労力で強力なコマンドのリピートコマンドについて教えておきます。
と言っても上に表示されているとおり、.キーを押すだけです。
これで「直前に実行したコマンド」を再度繰り返します。
例えば上の方の例、ddで1行削除、なんかも1行消してから.を連打して少しずつ消していく、っていうのも自然な感じになるかと思います。

vimは自由度が高すぎて、特定の目標への手段が多すぎるのが良い点でもあり悪い点でもあります。
まあ色々覚えるのが一番ですが、よく使うやつから覚えていけば全然普通のエディタと遜色ない、どころかかなり使い勝手の良いものになっているのでは無いでしょうか。

タブ、バッファについて

vimは基本画面上に1つのファイルしか開けません。と思いがちですが、いっぱい開けます。
しかもタブ使えます。実はタブエディタなんです。すごいでしょ。
command line modeのコマンドでタブ開き等を実行します。
:tabe [target file]で別タブとして指定ファイルを開きます。ファイル指定がない場合はとりあえずタブだけ開きます。
画面上部にタブが表示されるかと思います。テキストだけのCLIなのにタブとか表現しちゃうんです。すごいでしょ。
:tabn(ext)で次タブへ遷移したり出来ます。

ちなみにタブじゃなくて同じ画面内を分割して開いたりもできます。
:sp [target file]:vsp [target file]です。
これ、開くのはいいんですが困るのがカーソルを別画面へ移動できないーって大体なります。
コマンドC-w C-wで隣の画面にカーソルが動きます。
C-w hで左の画面に移動します。C-w jで下の画面に移動します。カーソル移動と一緒ですね。

項目名デフォルト
左に移動<C-w>h
下に移動<C-w>j
上に移動<C-w>k
右に移動<C-w>l
次に移動<C-w>w

ちなみにそれぞれの画面のサイズも変えられます。

項目名デフォルト
縦に最大化<C-w>_
横に最大化<C-w>ぱいぷ
縦横最大化なし
大きさを揃える<C-w>=
幅を増やす<C-w>>
幅を減らす<C-w><
高さを増やす<C-w>+
高さを減らす<C-w>-

それぞれ分割している所、タブで開いているところは別のものを開いている扱いなので、通常通り:qで終了するとカーソルがある所を閉じます。

あと実はバッファ、っていうものもあります。これ大体ミスった!って思うかもしれません。
vimの起動時に復数のファイルを対象として開いたりした場合にバッファ内に復数ファイルが読み込まれ、順番に開いていく、という挙動となります。
ですがめっちゃくちゃ判りづらく、とりあえず一旦閉じてから1個ずつタブなり画面分割なりで開いていった方がいいと思います。正直。。
バッファについては余力があれば書きます。

レジスタについて

レジスタ。何のこと?とお思いかと思いますが、わかりやすく言うと「クリップボード」です。
windows等も通常コピーできるところ(クリップボード)のサイズは1しかありませんね。それがわかりやすくてあれなのですが、実はvimクリップボードいっぱいあります。名前もつけられています。

実は普段コピー(vimだとyank)したり削除したりしたものは「無名レジスタ」というところに入ります。
何も指定していないで貼り付けを行うとこの「無名レジスタ」から貼り付けられます。
だから特に何も指定しなければ通常どおりサイズ1のクリップボードがある、と思ってもらって構いません。

あとは面倒になっちゃったのでhelp貼っておきます。

レジスタには 10 種類ある:             *registers* *E354*
1. 無名レジスタ ""
2. 10個の番号付きレジスタ "0 から "9
3. 小削除用レジスタ "-
4. 26個の名前付きレジスタ "a から "z または "A から "Z
5. 3個の読み取り専用レジスタ ": と ". と "%
6. 代替バッファ用レジスタ "#
7. expression 用レジスタ "=
8. 選択領域用レジスタ "* と "+ と "~ 
9. 消去専用レジスタ "_
10. 最終検索パターン用レジスタ "/

全部覚えるとそれだけで吐き気がしてきそうなので、2.4.だけ覚えておきましょう。

2. 番号付きレジスタ "0 から "9

これらのレジスタには、コピーや削除コマンドによってテキストが蓄えられる。
番号付きレジスタの 0 には、一番最近にコピーしたテキストが蓄えられるが、コピー
の際に ["x] として別のレジスタ名を指定したときは、これには蓄えられない。
4. 名前付きレジスタ "a から "z または "A から "Z

これらのレジスタが使われるのは、ユーザーに指定されたときのみである。コピーや削
除の際にこれらのレジスタを小文字で指定すると、コピーや削除されたテキストが蓄え
られ、元から入っていたテキストは消える。大文字で指定すると、元から入っていた内
容の後ろに新しいテキストを付け加える。

ということで、つまり

  1. レジスタ1~9は過去の履歴が入るイメージ
  2. レジスタa~zは自由に使えるクリップボード

と覚えてもらえば十分です。
使い方としては通常のオペレータの前にレジスタ指定を入れつつ、という使い方になります。

駆使すれば20個以上のクリップボードが貴方のもとに!すげぇ!
とここまで書いて絶対使うことないだろうな、と思いました。無理だよこんなの。

はじめてvim改造 patheogenの導入とnerdTreeの導入と, 時々autocmdの使い方

$
0
0

プログラミング歴1年ちょっと.

ずっと裸のvimでやってきました.

補完もctrl+p,

毎回,ctrl+zで, shellに戻って, コンパイラして, エラーチェックする.

化石のようなプログラマでした.

vimの能力を全然使いこなせていない感が強かったので, ちょっと重い腰をあげて, pluginを入れようと思い立ちました.

まずはファイラーからだなと思い, ぐぐったらnerdTreeがいいらしいということを聞いたので,

早速入れていこうと思います.

pluginを導入する前に, pluginを管理するツールを入れるのが先だと思い, それも調べると, patheogenがいいと聞いたので, まずそれを入れたいと思います.

その中で, 設定するためのvimコマンドも紹介しようと思います.

毎回git hubや公式サイトがあれば, 公式サイトの情報を見て, インストールしようとしています.

今回も, nerdTreeのgitHubから, セットアップします.

想定読者は, 超初心者だけど, かっこいいからLinux使ってるとか, bash使ってるとかそういう人向けです(つまり, 自分です).

概要

  • pathogenの導入
  • nerdTreeの導入
  • nerdTreeを使いやすくするvimの設定のコマンドの説明(次の記事で)

環境

Windows Subsystem for Linuxで,

OS: VERSION="18.04 LTS (Bionic Beaver)"

VIM: Vi IMproved 8.0 (2016 Sep 12, compiled Apr 10 2018 21:31:58)

WSLのせいで, 共有のvim設定ファイルを読んでいる気がしていろいろはまりそう.

pathogenの導入

pathogenは, pluginの管理ツールです.

今までは, すべてのpluginを同じディレクトリに管理しなければいけなくてぐちゃぐたになってたらしいです(初めてpluginを導入するから, 知らないけど).

pathogenは, pluginごとに, ディレクトリを分けて管理できるので, 使いやすいらしいです.

ということで, pathogenを使っていきましょう.

Install

gitHubのvim-pathogenに, アクセスして, READMEを読んで導入していきましょう.

Install to ~/.vim/autoload/pathogen.vim. Or copy and paste the following into your terminal/shell:

と書いてあります.

これをするには, 以下のコマンドをたたきましょう.

~/で指定しているので, カレントディレクトリはどこでも大丈夫です.

mkdir -p ~/.vim/autoload ~/.vim/bundle && \
curl -LSso ~/.vim/autoload/pathogen.vim https://tpo.pe/pathogen.vim

コピペ病にかからないように, 一応コマンドの意味も読んでおきましょう.

mkdirコマンドで, ディレクトリを作ります.

-pオプションを使うことで, ディレクトリを階層ごとに作ることができます.

.vimディレクトリを作って, さらにその子ディレクトリとして, autoloadを作ります.

bundleも同じです.

&&は, &&の前のコマンドが正しく実行された場合, そのあとのコマンドを実行します.

もし前のコマンドで実行が失敗した場合, 次のコマンドが実行されないので, 前のコマンドに依存するような場合に有効です.

今回は, curlコマンドで, 作ったディレクトリの中に出力した情報を保存しようとしているので, ディレクトリができていないとエラーが起きます.

なので, &&でつないでいます.

\は, 改行して次の行に書かれたコマンドも一行として認識されます.

mkdir -p ~/.vim/autoload ~/.vim/bundle && curl -LSso ~/.vim/autoload/pathogen.vim https://tpo.pe/pathogen.vim

と同じ意味になります.

次にcurlです.

これだけで一つの記事が書けそうなくらい深いコマンドですが, 今回は, httpで, URLから, 情報をとってきているくらいの認識で大丈夫です.

  • -sオプションは, 表示を抑える.
  • -Sオプションは, エラーだけ出力する
  • -oオプションは, とってきた情報を指定したファイル名で保存する
  • -Lオプションは, 指定したURLのリソースが違う場所に移動したときに, 別のところにも取りに行ってくれます.

ということで, https://tpo.pe/pathogen.vimを見に行けばわかると思いますが, vim scriptが表示されます.

これをコピペして, ~/.vim/autoload/pathogen.vimに保存しても同じことになります.

これでインストールは終わりです.

次に, Runtime Path Manipulationについて.

Runtime Path Manipulation

runtime pathとは, vimがどのパスから, 設定ファイルやプラグインファイルを読み込んでいるかを設定しているオプションです.

:set runtimepathを, 叩くと, パスがずらっと表示されます.

自分の環境の場合は,

runtimepath=~/.vim,/var/lib/vim/addons,/usr/share/vim/vimfiles,/usr/share/vim/vim80,/usr/share/vim/vimfiles/after,/var/lib/vim/addons/after,~/.vim/after

となっています.

pathogen.vimは, pluginを入れたときに, ~/.vim/bundle配下においておけば, vimが読み込んでくれます.

直接, runtimepathオプションを操作しなくても, pathogen.vimがいい感じに, パスを通して, pluginを入れてくれるということです.

pathogen.vimを実際に機能させるには, ~/.vimrcに以下の一文を入れましょう.

execute pathogen#infect()

また, .vimrcが存在しないときには, 新しく.vimrcを作って,

execute pathogen#infect()
syntax on
filetype plugin indent on

の3文を加えましょう.

下の二つは何を意味するかというと,

syntax on

これは, 構文でいい感じに色づけしてくれます.

filetype plugin indent on

これは,

filetype on
filetype indent
filetype plugin

をまとめたもので,

ファイルを読んだときに, filetypeを識別してくれます.

What is the difference between filetype plugin indent on and filetype indent on?

この2行は.vimrcも使ったことない初学者に対する優しさだと思います.

なくても動きます.

とりあえず, execute pathogen#infect()を書いておけば大丈夫です.

Plugin sensible.vim

試しに, sensible.vimを入れてみましょう.

まず, ~/.vim/bundle配下に移動しましょう.

そして, sensible.vimのgit repositoryをcloneしましょう.

$ cd ~/.vim/bundle && \
git clone https://github.com/tpope/vim-sensible.git

lsで確認すると, 確かに, 入っています.

$ ls
drwxrwxrwx 0 morishita-g morishita-g 4096 Jul  6 18:52 vim-sensible

実際に, sensible.vimが読み込まれているか, 確認するには, vimを開いて,

NORMAL MODEになって, :scriptnamesをたたくと, 読み込まれたshell scriptが一覧で表示されます.

 10: ~/.vim/bundle/vim-sensible/plugin/sensible.vim

実際に, 自分の環境では10番目に読み込まれていました(順番は関係ないですが).

また, 管理するディレクトリを, ~/.vim/bundleから変えたい場合は,

execute pathogen#infect()の引数を変えることで対応できます.

相対パスで指定する場合

execute pathogen#infect('stuff/{}')

{}は, ワイルドカードとして働きます.

なので, ~/.vim/stuff/配下にすべてを読みに行きます.

実験してみましょう.

まず, ~/.vimrcを編集して, さきほどexecute pathogen#infect()と書いた部分を編集して,execute pathogen#infect('stuff/{}')にしましょう.

そして, vimを再起動してみると,,,

~/.vim/bundle配下にあった, sensible.vimが読み込まれなくなっていると思います.

~/.vim/bundleをrenameして, stuffにしてから, vimを再起動してみましょう.

$ pwd
~/.vim
$ mv bundle stuff
$ vim

vimのNORMAL MODEで, :scriptnamesをたたくと,,,

 10: ~/.vim/stuff/vim-sensible/plugin/sensible.vim

と, stuff配下で読み込まれていることがわかります.

絶対パスで指定する場合

execute pathogen#infect('bundle/{}', '~/src/vim/bundle/{}')

第2引数に, 絶対パスを入れれば, そこを読みに行きます.

実際に自分で読み込んでくれるか試してみるといいでしょう.

helptags

pluginのdocumentationを作成するのに, helptagsで作れます.

インストールしたpluginのディレクトリに, docができると思います.

:helptags [docまでのパス]

をたたくと, ヘルプが作成されて,

:help [plugin名]

とすると, ヘルプが見えるようになります.

実際は, pluginのgithubのページにhelpの作り方は書いてあるのでそれに従うといいと思います.

それでは, pathogenのこともある程度わかったところで, nerdTreeを導入しましょう.

nerdTreeの導入

nerdTreeのgitHubから, セットアップします.

pathogenを入れているので,

git clone https://github.com/scrooloose/nerdtree.git ~/.vim/bundle/nerdtree

をたたきます(さっきのstuffから名前を元に戻しておいてください).

これだけで終わりです.

あとは, githubにいろいろ設定の仕方が書いてあるので, それに従って自分のやりたいようにカスタマイズできます.

次回は, nerdTreeのカスタマイズを開設しようと思います.

Vimiumの基本的な使い方

$
0
0

自分用のメモを兼ねたVimiumの使い方をまとめました.

Vimiumとは

VimiumはGoogle Chromeの拡張機能です.
Vimiumをインストール

Vimiumを使う利点

  • Chromeをマウスをなるべく使わずに操作することができます!

  • ショートカットを好きに拡張することができます!!

Vimiumコード一覧

よく使うショートカットをまとめました.
特に重要だと思うものは太文字で表示しています.
詳細は Shift+? で調べることができます.

スクロール

ページスクロールのためのショートカットを紹介します.

  • 基本的なスクロール
キー操作
k
j
l
h
  • 大きなスクロール
キー操作
u上(50%)
gg上(100%)
d下(50%)
G下(100%)

リンクを開く

リンクを様々な方法で操作したい時に,下記を使います.
これは めちゃめちゃ使います.

キー操作
f現在のタブで開く
F新しいタブで開く
o現在のタブで検索
O(shift+o)新しタブで検索

タブの操作

タブを操作するためのショートカットを紹介します.

  • タブの移動
キー操作
K右のタブに移動
J左のタブに移動
  • タブを作成・閉じる・復元
キー操作
t作成
x閉じる
X復元

検索

文字列の検索を行いたいときに使います.(Insertモード)

キー操作
/検索する
n新しいタブで検索
N現在のタブで検索
yyURLのコピー

まとめ

Vimiumを使うことでブラウザの操作が格段に快適になりました.
ただウェブサイトが提供しているショートカットと競合し使えないこともあるので注意してください.


dein.vim SSL connect error dein vim

$
0
0

dein.vim SSL Error

Overview

dein.vimでSSL connect error は発生しました。

[dein] /home/tomyami/.cache/dein/repos/github.com/tomtom/tcomment_vim
[dein] Maybe wrong username or repository.
[dein] Cloning into '/home/tomyami/.cache/dein/repos/github.com/tomtom/tcomment_vim'...Cloning into '/home/tomyami/.cache/dein/repos/github.com/tomtom/tcomment_vim'...Cloning into '/home/tomyami/.cache/dein/repos/github.com/tomtom/tcomment_vim'...Cloning into '/home/tomyami/.cache/dein/repos/github.com/tomtom/tcomment_vim'...Cloning into '/home/tomyami/.cache/dein/repos/github.com/tomtom/tcomment_vim'...Cloning into '/home/tomyami/.cache/dein/repos/github.com/tomtom/tcomment_vim'...Cloning into '/home/tomyami/.cache/dein/repos/github.com/tomtom/tcomment_vim'...Cloning into '/home/tomyami/.cache/dein/repos/github.com/tomtom/tcomment_vim'...
[dein] fatal: unable to access 'https://github.com/tomtom/tcomment_vim.git/': SSL connect error

(☝ ՞ਊ ՞)☝ わお! なにコレーーーー

SSL Errorと出力されております。

ふーん

>>- git --version
git version 2.2.0

新しいバージョン、

検索してみた。

下記参照

Https で通信できなくなった

yum update -y nss curl libcurl
したらいけた。

とのこと

なのでやってみたら成功しました。

vimに, ctagsを導入して, タグジャンプを華麗に(かろうじて)使えるようにした話

$
0
0

vimでも, タグジャンプを使えるようになりたい!

ということで, vim初心者が, ctagsを導入して, タグジャンプを華麗に(かろうじて)使えるようにするための設定を紹介しようと思います.

環境

OS

OS: Windows 10

Windows Subsystem for Linux (WSL)で, Ubuntu 16.04を動かしています.

vimのバージョン

VIM - Vi IMproved 7.4 (2013 Aug 10, compiled Nov 24 2016 16:44:48)
Included patches: 1-1689
Extra patches: 8.0.0056

ctagsの導入

インストール

自分の環境では, ctagsが, インストールされていなかったです.

$ ctags --version
The program 'ctags' is currently not installed. You can install it by typing:
sudo apt install exuberant-ctags

なので, エラーメッセージの案内に従って, sudo apt install exuberant-ctagsを叩いて, インストールします.

$ sudo apt install exuberant-ctags

exuberant-ctagsは, ctagsの進化版と思っておけば大丈夫でしょう.

ワシントン大学のCS(Computer Science)のctagsの導入の授業のレジュメにも, 無印のctagsじゃなくて, exuberant-ctagsを使えと書いてあります(超意訳).

If you are not on forkbomb or attu, make sure that the system you are using has "Exuberant Ctags" installed, rather than the original "Ctags," by running ctags --version.

ちなみに exuberantは, full of energyとかcheerfulとかという意味なので, まあより使いやすいんだろうなとはイメージできると思います.

インストールしたら, 確認のために,

$ ctags --version
Exuberant Ctags 5.9~svn20110310, Copyright (C) 1996-2009 Darren Hiebert
  Addresses: <dhiebert@users.sourceforge.net>, http://ctags.sourceforge.net 
  Optional compiled features: +wildcards, +regex

ちゃんとインストールされていますね.

tagsファイルの作成

tagsという名前のtxtファイルで, どこに飛ぶかなどを定義しています.

これを作成します.

まず, プロジェクトのルートディレクトリに行きましょう.

今回は, 擬似的にプロジェクトを作成します.

tag_jump_projectというルートディレクトリを作ります.

その中に, srcディレクトリとlibディレクトリを作ります.

$ mkdir -p tag_jump_project/src tag_jump_project/lib

今回は, PHPで書きます.

自分の好きな言語で書けばいいと思います(オブジェクト指向言語がいいかも).

src/tag_jump.phpでは, lib/util.phpという名前の関数群を定義したphpファイルからhelloという関数をincludeして, hello()を呼び出すプログラムです.

src/tag_jump.php
<?phpinclude"lib/util.php";hello();
lib/util.php
<?phpfunctionhello(){echo"hello",PHP_EOL;}

保存しましょう.

そして, プロジェクトのルートディレクトリ(./tag_jump)に行きましょう.

そして, ctags -R *を叩きます.

$ ctags -R *

-Rオプションは, recursivelyの意味で, 再帰的にディレクトリをたどって, tagをつけてくれます.

これで, プロジェクトのルートディレクトリ全部のファイルを走査してタグが付きました.

ルートディレクトリに, tagsファイルがあるので, ルートディレクトリから, vimを起動しましょう.

image.png

自分の場合は, NERDTreeを入れているので, 左側に, ファイラーが出ます.

srcを押して, tag_jump.phpを開いてみましょう.

image.png

そして, hello()にカーソルを乗せた状態で, Ctrl + ]を押しましょう.

Boooon

一瞬で, lib/util.phphelloを定義した関数のところに移動しました.

image.png

便利なコマンド

ただ, このctagsは, そこまで頭が良くなくて, 継承したクラスファイル先やインポート, インクルードしたファイル先だけでなく, プロジェクトルートにあるファイルを読み込みこんでしまいます.

だから, 同じ名前ものすべてにマッチしてしまいます(インターフェースのメソッドで, そのメソッドの実装がいろんなファイルで, 実装されていると, すべてマッチする. 自動で, 実装先を特定してくれない).

なので, 複数候補がある場合は, 第一候補のページに移ります.

:tnで, 次の候補, :tpで前の候補, で移動します.

:tsで候補を一覧することも可能です.

:ts <tag>tagの名前を検索できます.

この例では, :ts helloと叩くと, helloが定義されている場所をリスト化してくれます.

そこで選択すると, ジャンプしてくれます.

tsは, tab selectの略です.

tj(ump) <tag>は, もっと便利で, 候補が複数ある場合だけ, リスト化して, 一つしか候補がない場合は, 直接ジャンプしてくれます.

また, Ctrl + ]の代わりに, Ctrl + w }で, プレビュー画面で表示してくれます(水平分割で, 開いていたバッファは, 裏に隠れない).

ほかにも g Ctrl + ]を叩くと, 候補がある場合, 第一候補ではなく, 候補のリストを表示します.

もっと便利に

tagsファイルは, 新しいメソッドや変数を追加しても, 更新されません.

なので, いちいちctagsコマンドを叩かないと, tagsファイルは更新されず, 新しく定義した関数などは, ジャンプしてくれません.

面倒ですよね?

あります, 自動でtagsを更新してくれるプラグインが.

vim-tags

vim-tagsで, インストールできます.

pathogenが入っている前提でやります.

cd ~/.vim/bundle
git clone https://github.com/szw/vim-tags.git

を叩いて終わりです.

あとはファイルが保存されるごとに, tagsファイルが更新されます.

または, :TagsGenerateを叩けば, 更新されます.

vimから離れず, tagsファイルを更新できて便利ですね.

便利なマッピング

Ctrl + ]は, 複数の候補があっても, 第一候補に自動で移動してしまいます.

g Ctrl + ]を使うと, 候補が一つの場合だけ, 一気に移動して, 候補が複数の場合は, リストを表示してくれます.

なので, マッピングしましょう.

.vimrcに以下を追加しましょう.

nnoremap <C-]> g<C-]>

ctagsをちゃんと使うからお借りしました.


nnoremapの意味は, 3つに分解して考えるとわかりやすいです.

n NORMAL MODEのマッピング
nore not recursivelyという意味

map mappingするよって意味

not recursivelyというのは, 再帰的じゃないという意味です.

aというキーに, bというキーをマッピングしたとましょう.

またほかの設定で, bというキーに, cというキーをマッピングしてたとします.

recursiveだと, aを押したら, bを意味して, bには, cがマッピングされているから,

aを押したら, cが押されたことを意味します.

これを禁止するのが, noreの意味です.


また, 移動した先に画面がすべて持っていかれるのが嫌!

分割して表示して!という方には,

Ctrl + w }

これは, 第一候補に一気に飛んでしましますし, tsを叩くとわかりますが, 候補が表示されません.

または,

以下の

nnoremap <C-h> :vsp<CR> :exe("tjump ".expand('<cword>'))<CR>
nnoremap <C-k> :split<CR> :exe("tjump ".expand('<cword>'))<CR>

.vimrcに追加するといいでしょう.

Vimスクリプトで軽やかにタグジャンプしようからお借りしました.

<C-h><C-k>の部分は, 自分の好きなものに変えて大丈夫です.


exeとかexpandとか<cword>とかなんだよって方.

exeは, ()を一度, 変換してから, コマンドを実行します.

tjumpは前回説明したとおりで, は, いまカーソルにいる単語を意味します.

例えば, いま, hello()関数のところにカーソルがあるとします.

すると, expand(<cword>)は, helloに変わります.

そして, "tjump "と"hello"が.で結合して, "tjump hello"というコマンドに変わり, 実行されます.

はEnterを意味します.

これで, helloのところに移動します.


ここらへんまで設定できれば, まあまあvimで華麗にジャンプできるんじゃないかなと思います.

参考文献

Ctags Tutorial

ctagsをちゃんと使う

Vimスクリプトで軽やかにタグジャンプしよう

まだexuberant-ctags使ってるやつちょっと来い(自戒) universal-ctagsのインストール方法

$
0
0

前回の記事vimに, ctagsを導入して, タグジャンプを華麗に(かろうじて)使えるようにした話で, exuberant-ctagsをインストールしていました.

しかし, これがいけない!

もうずっと前に更新が途絶え, メンテナンスがされていませんでした.

なので, 今回は, これの代わりでいまもメンテナンスがされているuniversal-ctagsのインストールする方法を書きます.

使い方は, 自分が使ってみてから, また記事にしようと思います.

とりあえず環境から,

OS

OS: Windows 10

Windows Subsystem for Linux (WSL)で, Ubuntu 16.04を動かしています.

vimのバージョン

VIM - Vi IMproved 7.4 (2013 Aug 10, compiled Nov 24 2016 16:44:48)
Included patches: 1-1689
Extra patches: 8.0.0056

インストールの方法

インストール方法ですが, aptではインストールできないみたいです.

universal-ctagsのgitHubのdocのautotools.rstに, インストールの方法が, かいてあるので, これのとおりやります.

この記事は, Linux用なので, windowsやmacの場合は, 違う方法がdocumentationに書いてあるので, 読んでやってみましょう.

exuberant-ctagsをすでに, インストールしている場合は, 消して問題ないと思います.

消さなくても, 上書きしてくれるのか?

自分の場合は, わからないので, 一応削除しておきました.

$ sudo apt remove exuberant-ctags
$ git clone https://github.com/universal-ctags/ctags.git
$ cd ctags.git
$ ./autogen.sh
$ ./configure 
$ make
$ sudo make install

自分の環境では, ./autogen.shで,

+ type autoreconf
autoreconf is /usr/bin/autoreconf
+ type pkg-config
pkg-config: not found
+ exit 1

と出ました.

exit 1は, 失敗の印です.

ありがたいことに, pkg-config: not foundとエラーが丁寧に書かれているので, pkg-configをインストールしましょう.

$ sudo apt install pkg-config

もう一度, ./autogen.shを実行すると,

$ ./autogen.sh

だらだら出力が出て, 最後にexit 0が出ます.

0であれば成功です.

あとは, たどっていけば, そのまま行くと思います.

かなり出力が多いですが, もしエラーが出ても丁寧にエラーメッセージが出力されると思うので大丈夫かと思います.

最後に確認として, ctags --versionを叩いて, Universal-ctagsが表示されているか確認しましょう.

$ ctags --version
Universal Ctags 0.0.0(00be957), Copyright (C) 2015 Universal Ctags Team
Universal Ctags is derived from Exuberant Ctags.
Exuberant Ctags 5.8, Copyright (C) 1996-2009 Darren Hiebert
  Compiled: Jul  8 2018, 23:44:35
  URL: https://ctags.io/ 
  Optional compiled features: +wildcards, +regex, +iconv, +option-directory

基本的な使い方は, 前回の記事vimに, ctagsを導入して, タグジャンプを華麗に(かろうじて)使えるようにした話に説明が書いてあります.

vim-gitgutterが使える話

$
0
0

Vimを使っててGitのプラグインが欲しいなーと思ったらたいていの人が使ってる(と思う)gitgutterですが、他の記事とか読んでても横にDiffをつけるくらいしかやっていない。。

これでは能力の無駄遣いすぎる気がするので、色々調べて使えそうな機能をまとめようと思います。

とりあえずインストール

僕はdeinsを使っているので、インストールはこんな感じです。
詳しくは公式ページをどうぞ

dein.toml
[[plugins]]repo="airblade/vim-gitgutter"

HEADからの差分を表示

インストールが済んだらGitで管理しているページを開いてください。
ページを開いて、適当に変更して保存すると以下のように行数の横に+や−が表示出来ていると思います。

image.png

次の変更まで進みたいなら ]c、前の変更に戻りたいなら [cで移動することが出来ます。
ショートカットを変更したいなら以下のコードをvimrcに加えてください。

nmap ]h <Plug>GitGutterNextHunk
nmap [h <Plug>GitGutterPrevHunk

と、ここまでがよくある記事です。
ここからは更に便利な機能を書いていきたいと思います。

Glog

これは git logのコマンドですね。
ノーマルモードで :Glogを実行すると以下のような表示が出ます。
::の後ろは今は消してますが、コミットメッセージが表示されます。
これは単体ではあまり使えませんが次の Gdiffと組み合わせるとこで効果を発揮します。

fugitive:///~/.git//8f3032e5b4b02063e299d8be805d1d81738dc3c4/pages/index.vue::...
fugitive:///~/.git//03a7ecbcbf7f244b9fa031ff67e737823fb18dfb/pages/index.vue::...
fugitive:///~/.git//fae312dd5ff77dbb0e8e974c978f0e803b41796a/pages/index.vue::...
fugitive:///~/.git//2eac7fb5084fe094f20ebd51bbac08649d6e4b08/pages/index.vue::...
fugitive:///~/.git//54e42bdc3acece96f77731180249f9c552c5b124/pages/index.vue::...
fugitive:///~/.git//65d924c0cee3a034cbe03ad2cdeb0d5472fbaf9a/pages/index.vue::...
fugitive:///~/.git//c71cf6d87d123fcc3a4e625f52c535adcf361c16/pages/index.vue::...
fugitive:///~/.git//add95331805cb415d81ce14cfc98d344834a9a01/pages/index.vue::...
fugitive:///~/.git//8067e36a079e9871522a58a64ee02da699874cb3/pages/index.vue::...
fugitive:///~/.git//9e6d8ba9bcfe36266e89cffefcecd8b02d33dd34/pages/index.vue::...
fugitive:///~/.git//f90276408d13eca8c15a4766fcc77514e04a2ea2/pages/index.vue::...

また、 :Glog --onelineとすることによって以下のような短いバージョンの結果を得ることも出来ます!

8f3032e ...
03a7ecb ...
fae312d ...
2eac7fb ...
54e42bd ...
65d924c ...
c71cf6d ...
add9533 ...
8067e36 ...
9e6d8ba ...
f902764 ...

Gdiff

これはgit diffのコマンドを行ってくれるコマンドです。
ノーマルモードで :Gdiffと実行すると以下のようにHEADの状態と現在の状態を比較することができます。
このコマンドを見ることで前の状態との変更を見ながらコーディング出来ます!

スクリーンショット 2018-07-09 13.06.15.png

また、HEADよりも前にさかのぼって確認したいときは Glogをつかって

:Gdiff コミット番号

のように書きます。コミット番号は上で言うと 8f3032e5b4b02063e299d8be805d1d81738dc3c4の部分です。

Gblame

このコマンドを実行すると以下のように誰によるいつどのコミットでの変更なのかを見ることが出来ます。
これは、複数人開発の時によくわからないコードがあった時に誰に聞けばいいかが分かるというとても便利な機能です!
下の画像では一人しかいませんが、、笑

スクリーンショット 2018-07-09 13.38.23.png

Gbrowse

正直僕が一番紹介したいと思ってたのはこの機能です。
GitHubなど複数人での作業で、GitHub上でやり取りをするならこの機能はすごく便利だと思います。
ただし、この機能はもしGitHubを使っている場合はvim-rhubarbが必要となります。

これはリポジトリがGitHubやGitlabなどにミラーされていることを推測し、現在のファイルをブラウザ内のオプションの行選択で開くことが出来ます。
開く方法は簡単でまず、Shift-Vで表示したい行を選択します。あとは :Gbrowseを入力し、開いたページのURLをGitHubのPull RequestやIssueに貼ると以下の画像のような結果が得られます。

スクリーンショット 2018-07-09 13.32.52.png

終わりに

このようにgit-gutterにはあまり知られていない機能が沢山あります!(GbrowseとかREADMEにのせてほしい。。)
他にも便利な機能がありましたら、コメントなどで教えてください!

参考

15年目のVim

linuxでJavaの動作確認をすることで、コンパイルや階層理解がグッと理解できた

$
0
0

先日、自社勉強会で、Javaのコンパイル、パッケージ管理について学習した。eclipseで環境が出来たものを編集することしかなかったので、コンパイルオプションを設定し、パッケージを作成することで、コンパイルによる動きやパッケージの管理方法をより理解する機会になった。
自身の復習も兼ねて、ここにアウトプットすることにする。

環境

・CentOS7.4
・java 1.8.0_171
・vi 7.4
・tree 1.6.0

準備

動作検証する為のディレクトリ作成。

# cd
# mkdir -p JAVA/src
# cd JAVA
# mkdir class

コンパイル&実行

treeコマンドで、カレントディレクトリからディレクトリ階層を見ると以下のようになる。

# tree --charset=c
.
|-- class
`-- src

まずは、srcに移動し、テスト用ソースファイルを作成してみる。

# cd src
# vi TestJava.java

class TestJava {

    public static void main(String[] args){

        System.out.println("test");

    }

}

上記の内容で作成後、ディレクトリ階層を確認すると以下のようになる。

# tree ../ --charset=c
../
|-- class
`-- src
    `-- TestJava.java

作ったファイルをコンパイルする。
ここで、オプション指定せずにコンパイルするとsrc配下にclassファイルが作成されるが、作ったあとにclassファイルを別ディレクトリに移動をさせるのは面倒。eclipseでもこの辺は自動で行われていたので、感じてなかったが、手動で行う場合、作成時に指定ディレクトリ(classディレクトリ)に作成されるようにオプションを指定する。ディレクトリの指定は"-d"オプションを使用する。

# javac -d ../class TestJava.java

実行後、ディレクトリ階層の状況を確認。

# tree ../ --charset=c
../
|-- class
|   `-- TestJava.class
`-- src
    `-- TestJava.java

指定したclassディレクトリにファイルが作成されている。このようにソースファイルとクラスファイルは、勝手に誰でもソースを編集できる状況にしない為に分けて管理をする。

実行時、これをclassディレクトリ以外から実行するには、"-cp"オプションでファイルのパスを指定すると、カレントディレクトリにファイルがなくても実行できる。環境変数で設定するCLASSPATHをコマンドライン上で行う場合の方法になる。

# java -cp ../class TestJava
test

実行され、「test」と出力された。

パッケージ

クラスファイルが増えてきたら管理しやすくする為にパッケージを分けて管理する。また、複数人で開発をする際にたまたま同一名のファイルを作成してしまっても名前の衝突をしない為にも良い。
まずは、パッケージ用のディレクトリをsrcディレクトリに作成し、一旦クラスファイルを削除して検証。

# mkdir pack1
# mv TestJava.java pack1
# rm -rf ../class/TestJava.class
# cd pack1
# tree ../../ --charset=c
../../
|-- class
`-- src
    `-- pack1
        `-- TestJava.java

srcディレクトリにだけ、パッケージ用ディレクトリに作成したファイルがある状態になった。
パッケージを使用する際は、ソースの先頭に以下の記述を追加する。

package パッケージ名

記述例は、以下のようになる。

# vi TestJava.java

package pack1;

class TestJava {

    public static void main(String[] args){

        System.out.println("test");

    }

}

このようにソースファイルの先頭に作成したパッケージ名を記述。今回は簡易なパッケージ名でしかテストをしないが、実際はjp/co/testcomp/cvのように階層を掘ってディレクトリを作成する。そして、それをソースに記述する際は、package jp.co.testcomp.cv;のように階層の区切りを「.」で表す。
例のようにパッケージ名は、インターネットドメイン名を逆にしたものから始めることを推奨されている。それは他社や他国のプログラムを利用する際にパッケージ名の衝突をしない為に、、国や企業によって違いのあるドメイン名からパッケージ名をつけることが推奨されているからである。

では、再度実行してみる。

# javac -d ../class pack1/TestJava.java
# tree ../ --charset=c
../
|-- class
|   `-- pack1
|       `-- TestJava.class
`-- src
    `-- pack1
        `-- TestJava.java

classディレクトリにpack1ディレクトリごとファイルが作成された。
もしも、ソースファイルにpackageの記述がなかった場合は、classディレクトリに、pack1フォルダのない状態で、classファイルのみが作成される。

格納先の混乱を招かないように、ソースとクラスファイルの階層は合わせておくと良い。その為にも、packageの記述は忘れてはならない。(eclipseならエラー検知できるだろうけど)

以上。

vimrcのなんとか

$
0
0

Summary

vimrcを書くのに必要最小限な知識のまとめ

Thanks

Vim-JPの掲示板のみなさま

Index

下記をのんびり書くよ〜
  1. minimal.vimrc
  2. syntax ( vimrc で色付け )
  3. syntax ( syntax file を自作する )
  4. map
  5. options
  6. command
  7. template

minimal.vimrc

まずはここからスタート

# 作業用フォルダ foo を作る$ mkdir foo/

# 作業用フォルダ foo に移動$ cd foo/

# 設定ファイル minimal.vimrc を作成する$ echo-e'"minimal.vimrc\n\nsyntax enable\nfiletype plugin indent on'> minimal.vimrc

# minimal.vimrc の確認$ cat minimal.vimrc
"minimal.vimrc

syntax enable
filetype plugin indent on

syntax ( vimrc )

foofoofooという文字を紫色にする

minimal.vimrcを下記のようにする

" minimal.vimrc

syntax enable
filetype plugin indent on" --------------------------------------------------------"             foofoofoo という文字を紫色にする" --------------------------------------------------------" group-name Foo を highlight に追加する
autocmd ColorScheme * highlight Foo ctermfg=103 guifg=#8787af" colorscheme ron をセットするcolorscheme ron

" filetype foo を 拡張子がfoo となってるファイルにセットする
autocmd BufNewFile,BufRead *.foo setfiletype foo

" match(pattern) foofoofoo を group-name Foo に追加する
autocmd FileType foo call matchadd('Foo','foofoofoo')

foofoofooを入力してみる

$ vim -N-u minimal.vimrc foo.foo

Screen Shot 2018-07-11 at 11.22.07.png

syntax ( syntax file )

foofoofooという文字を紫色にする

# syntax フォルダをつくる$ mkdir-p rc/syntax

# syntax file を作成$ vim rc/syntax/foo.vim

    syntax match Foo "foofoofoo"
    highlight  Foo ctermfg=103 guifg=#8787af

minimal.vimrcを下記のようにする

" minimal.vimrc" syntax フォルダを path に追加するset runtimepath+=./rc

syntax enable
filetype plugin indent on" colorscheme ron をセットするcolorscheme ron

" filetype foo を 拡張子がfoo となってるファイルにセットする
autocmd BufNewFile,BufRead *.foo setfiletype foo

foofoofooを入力してみる

$ vim -N-u minimal.vimrc foo.foo

Screen Shot 2018-07-11 at 11.22.07.png

viの使い方メモ

$
0
0

概要

自分がviエディタを使う時に毎回毎回コマンドを調べているのでまとめておこうと思って
注:私がよく使うものしか載せてないです

基本的操作

起動

vi ファイル名.py (pythonの場合)

モード

viにはコマンドモード・編集モードの2つのモードがある.

・[Esc]キーで常にコマンドモードになる.
 →コマンドモードでviを保存や終了できる

コマンドモードコマンド

<コマンド> 作業

~終了系~

<:q> セーブせずに終了

<:w> セーブするが終了しない
<:wq> セーブして終了    

~編集モードに移る~
< i > 現在のカーソル位置から編集可能

メモ これから随時更新予定


Vimmer が Spacemacs に完全に乗り換えるまで (Vimmer 向け設定)

$
0
0

こんな方へ

  • Vim ではなく、Vim のキーバインドが好き。
  • 設定ファイルをすべて自分でメンテナンスするのが面倒。勝手にアップグレードされて欲しい。しかし自分でカスタマイズする余地も欲しい。

この記事はあくまで Vimmer 向けの設定がメインです。

Spacemacs とは

Spacemacs
screenshot

Vim の長所と Emacs の長所を融合させることを目的とした、コミュニティドリブンな Emacs の膨大な設定ファイル群です。

最強のエディタは Vim でも Emacs でもない。Emacs Vim だ! ― @syl20bnr

Spacemacs は次のようなコンセプトをもっています。

  • 人間工学的なキーバインド - キーの入力回数を最小化するのではなく、覚えやすさを優先する。
  • 発見可能であること - エディタのキーバインド/レイヤー&パッケージ/設定方法をエディタの中から参照できる。
  • 一貫していること - 異なる言語モードでもほとんど同じキーバインドで言語特有の操作 (リファクタなど) を扱える。
  • コミュニティドリブン

Emacs のインストール

当然ですが、 最新版の Emacs をインストールしておきます。

sudo pacman -S emacs   # Arch Linux# macOS
brew tap d12frosted/emacs-plus
brew info emacs-plus   # see install options
brew install emacs-plus

Spacemacs のインストール

masterブランチよりも developブランチが遥かに進んでいます。人柱覚悟で新しい機能を試したい方は developブランチにしましょう。

git -C ~/.emacs.d checkout develop

このあと Emacs を一旦起動して終了すると ~/.spacemacsが作成されます。これを ~/.spacemacs.d/init.elに移動しておきます。

mkdir-p ~/.spacemacs.d
mv ~/.spacemacs ~/.spacemacs.d/init.el

Vimmer 用に設定

dotspacemacs/init

以下のように設定する。

VARVALUE
dotspacemacs-editing-style'vim
dotspacemacs-remap-Y-to-y$t
dotspacemacs-line-numbers'relative
dotspacemacs-folding-method'evil

dotspacemacs/user-init

以下を追記する。

(setqevil-want-C-i-jumptevil-want-C-u-scrollt)

C-h, C-wの有効化

Emacs で C-hは Backspace ではなく helpになっているので、Vim に合わせます。ついでに C-wも。
以下を dotspacemacs/user-configに追記します。

dotspacemacs/user-config
(bind-key*"C-h"#'delete-backward-char)(bind-key*"C-w"#'backward-kill-word)(with-eval-after-load'company(bind-key"C-h"nilcompany-active-map)(bind-key"C-w"nilcompany-active-map))

jj で挿入モードを抜ける

私は jk が好きです。dotspacemacs/user-initに以下を追記する。

dotspacemacs/user-init
(setqevil-escape-key-sequence"jk")

evil-surround を vim-surround 風に

これは evil-surround の方が楽なので、慣れてしまってもいいかもしれません。

dotspacemacs/user-config
(evil-define-key'visualevil-surround-mode-map"s"#'evil-substitute)(evil-define-key'visualevil-surround-mode-map"S"#'evil-surround-region)

evil-mc を vim-multiple-cursors 風に

Vim のノーマルモードとマルチカーソルは最強の組み合わせです。
縦にカーソルを作る機能は非常に多用するので実装しました。

dotspacemacs/user-config
(defunuser-custom/evil-mc-make-and-goto-next-match()(interactive)(turn-on-evil-mc-mode)(evil-mc-make-and-goto-next-match))(defunuser-custom//evil-mc-make-vertical-cursors(beginningend)(turn-on-evil-mc-mode)(evil-mc-pause-cursors)(evil-apply-on-rectangle#'(lambda(startcolendcolreal-line-number)(move-to-columnstartcol)(unless(=(line-number-at-pos)real-line-number)(evil-mc-make-cursor-here)))beginningend(line-number-at-pos))(evil-mc-resume-cursors)(evil-normal-state)(move-to-column(min(evil-mc-column-numberbeginning)(evil-mc-column-numberend))))(require'evil-core)(evil-global-set-key'normal(kbd"C-n")#'user-custom/evil-mc-make-and-goto-next-match)(evil-global-set-key'visual(kbd"C-n")#'(lambda(beginningend)(interactive(list(region-beginning)(region-end)))(if(eq(evil-visual-type)'inclusive)(user-custom/evil-mc-make-and-goto-next-match)(user-custom//evil-mc-make-vertical-cursorsbeginningend))))(with-eval-after-load'evil-mc(evil-define-key'normalevil-mc-key-map(kbd"C-n")#'evil-mc-make-and-goto-next-match(kbd"C-m")#'evil-mc-make-and-goto-prev-match(kbd"C-x")#'evil-mc-skip-and-goto-next-match(kbd"C-p")nil(kbd"C-t")nil(kbd"<escape>")#'(lambda()(interactive)(evil-mc-undo-all-cursors)(turn-off-evil-mc-mode)))(evil-define-key'visualevil-mc-key-map(kbd"C-n")nil(kbd"C-p")nil(kbd"C-t")nil);; evil-escape don't work in evil-mc-mode(add-hook'evil-mc-mode-hook#'(lambda()(add-to-list'evil-mc-incompatible-minor-modes'evil-escape-mode))))

avy の高速化

easymotion の代替 avy は、デフォルトで一定時間 2 ストローク目を待つので遅いです。

dotspacemacs/user-init
(setqavy-timeout-seconds0.0)

デーモンモードで爆速起動

まず、デーモンの設定を有効にしておきます。

dotspacemacs/init
;; If non-nil, start an Emacs server if one is not already running.;; (default nil)dotspacemacs-enable-servert...;; If non-nil, advise quit functions to keep server open when quitting.;; (default nil)dotspacemacs-persistent-servert

これで Emacs を SPC q qで終了しても Emacs はバックグラウンドで動作し続けます。(デーモンごと終了するには SPC q Q)
これに加えて「Emacs 起動時に、バックグラウンドで起動している Emacs デーモンが利用可能であれば利用する」という設定を加える必要があります。

上記のシェルプラグインは、Emacs を起動するときに極力デーモンを利用するようにするためのプラグインです。
実装量はそれほど多くないので、その他のシェルでもプラグインの実装を読めば自力で実装できます。(あと emacsclient --help)

更に、デーモンモードで起動するとウィンドウの背景が透明にならない不具合(?)があります。私はこのように回避しています。

dotspacemacs/user-config
(defun user-custom//enable-frame-transparency (frame)
    (spacemacs/enable-transparency frame
                                  (cons dotspacemacs-active-transparency
                                        dotspacemacs-inactive-transparency)))
(user-custom//enable-frame-transparency nil)
(add-hook 'after-make-frame-functions
          #'user-custom//enable-frame-transparency))

使っていて困ったら

  • SPC SPCでコマンド/キーバインドを調べることができます。
  • SPC h dで、現在読み込まれている関数や変数のヘルプや初期値/現在の値を参照できます。
  • emacs --debug-initで詳細なデバッグ情報を表示できます。
  • evil-mode のロード前にエラーが起きてしまった場合は C-x C-cで Emacs を終了できます。
  • S 式を直接入力して実行したい場合は M-:. Lisp をその場で実行したい場合は選択モードで , e r.

WSL上でWindows用のVimをクロスビルド

$
0
0

概要

俺用Vimのビルド環境をWSL上に移行したのでメモ

主なfeature

+terminal+directx+lua/dyn+python/dyn+python3/dyn

環境

WSL + Ubuntu-18.04

ビルドスクリプト

build
sudo apt-get install-y build-essential libtool mingw-w64

git clone --depth 1 https://github.com/LuaJit/LuaJit LuaJit
git clone --depth 1 --single-branch-b 2.7 https://github.com/python/cpython python27
git clone --depth 1 --single-branch-b 3.6 https://github.com/python/cpython python36
cp python27/PC/pyconfig.h python27/Include
cp python36/PC/pyconfig.h python36/Include

git clone https://github.com/vim/vim
pushd vim

make -C src -f Make_ming.mak \CROSS_COMPILE=x86_64-w64-mingw32- WINDRES=x86_64-w64-mingw32-windres \GUI=no \IME=yes\TERMINAL=yes\LUA=../../LuaJit/src DYNAMIC_LUA=yes LUA_VER=51 \PYTHON=yes PYTHONINC=-I../../python27/Include PYTHON_VER=27 \PYTHON3=yes PYTHON3INC=-I../../python36/Include PYTHON3_VER=36 \STATIC_STDCPLUS=yes\-j 4

make -C src -f Make_ming.mak \CROSS_COMPILE=x86_64-w64-mingw32- WINDRES=x86_64-w64-mingw32-windres \GUI=yes\DIRECTX=yes\IME=yes\TERMINAL=yes\LUA=../../LuaJit/src DYNAMIC_LUA=yes LUA_VER=51 \PYTHON=yes PYTHONINC=-I../../python27/Include PYTHON_VER=27 \PYTHON3=yes PYTHON3INC=-I../../python36/Include PYTHON3_VER=36 \STATIC_STDCPLUS=yes\-j 4

popd
  • src/vim.exe
  • src/gvim.exe
  • src/vimrun.exe
  • runtime/

を適当な場所に設置する。

NeovimでC/C++のIDE(っぽい)環境を構築する

$
0
0

はじめに

私はC/C++開発にNeoVimを使用しています。
PythonなどはこのようなVimをIDEチックにみたいな記事がたくさんありますが、C/C++に関しては少ない気がしたので、今回私の使用している環境に関して記しておきます。
ツッコミ大歓迎です

ちなみに現在の私の環境はこんな感じです。
スクリーンショット 2018-07-13 11.05.05.png

Colorschemeは
NeovimでモダンなPython環境を構築する
の記事を真似させていただきました。

システムセッティング

基本的にMac OS Xを前提として話を進めます。
私の使用している環境は、
・Mac OS X 13.06
・neovim 0.3.0
・fishshell 2.7.1
・python3.6.5(pyenv)
・python2.7.10(system標準)
という感じです。

プラグインマネージャーは暗黒美夢王さんのdein.vimを使用していて、tomlファイルでプラグイン管理しています。

この記事の設定を利用するためには、LLVMが必要になります。
私は

$ brew install llvm --with-lldb--with-toolchain--with-python@2

でllvmを入れましたが、その際に少し引っかかったので、それはまた今度記事にします。

IDEって何があったっけ?

IDEにある機能は
・補完
・リンター
・デバッガー
・タグジャンプ
・検索機能
とかな気がします。
これらをそれぞれ説明していきます。

Let's IDE!!!

補完

deoplete.nvim

暗黒美夢王Shougoさんによる自動補完プラグイン。これがないと何も始まらない。
このプラグインの素晴らしさは、補完速度と拡張性です。
これは補完のプラットフォームであり(私の理解では)、各言語のソースを随時追加するという形で環境を作っていくイメージです。

[[plugins]]
repo ='Shougo/deoplete.nvim'
depends ='context_filetype.vim'
on_i =1
hook_source ='''
    call deoplete#enable()" No display of the number of competion listset shortmess+=c" <TAB>: completion.
    inoremap <silent><expr><TAB>          \ pumvisible() ? "\<C-n>":          \<SID>check_back_space() ? "\<TAB>":          \ deoplete#manual_complete()function!s:check_back_space() abort
      letcol=col('.')-1return!col|| getline('')[col-1]=~'\s'endfunction" <S-TAB>: completion back.
    inoremap <expr><S-TAB>  pumvisible() ? "\<C-p>":"\<C-h>"" <C-e>: popup cancel
    inoremap <expr><C-e>       deoplete#cancel_popup()call deoplete#custom#source('_','matchers',['matcher_head'])call deoplete#custom#source('_','converters',[          \'converter_remove_paren',          \'converter_remove_overlap',          \'matcher_length',          \'converter_truncate_abbr',          \'converter_truncate_menu',          \'converter_auto_delimiter',          \])call deoplete#custom#option('keyword_patterns',{          \'_':'[a-zA-Z_]\k*\(?',          \'tex':'[^\w|\s][a-zA-Z_]\w*',          \})call deoplete#custom#option('camel_case',v:true)'''

deoplete-clang, deoplete-clang2, deoplete-clangx

これらはC/C++用のdeopleteソースです。
deoplete-clangdeoplete-clang2はjson compilation databaseに対応しているので、cmakeプロジェクトであればライブラリの補完をすることができます。
さらにdeoplete-clangCMakeLists.txtでcmake関数などの補完も効くのでいいです。(deoplete-clang2はできるかわかりません)
deoplete-clangxはjson compilation databaseに対応していませんが、速度的には一番早いです。
しかし、正直どれもちょっと重い感じはあります。

参考までに、deoplete-clangの設定を書いておきます。基本的にはどれも設定項目は同じです。
詳しくはREADME.mdやdocumentを見てください。

[[plugins]]
repo ='zchee/deoplete-clang'
on_ft =['c','cpp','cmake']
hook_source ='''
    letg:deoplete#sources#clang#libclang_path = system("llvm-config --prefix")[:-2].'/lib/libclang.dylib'letg:deoplete#sources#clang#clang_header = system("llvm-config --prefix")[:-2].'/lib/clang'letg:deoplete#sources#clang#sort_algo ='priority'letg:deoplete#sources#clang#clang_complete_database="./build/"'''
depends =['deoplete.nvim']

参考: deoplete-clangで快適C++エディット!!!

neoinclude.vim

上記のc/c++ソースは、ヘッダファイルの補完をしてくれないので、このプラグインを入れることでヘッダ補完ができるようになります。

[[plugins]]
repo ='Shougo/neoinclude.vim'
on_ft =['c','cpp']
depends =['deoplete.nvim']

リンター

ale

非同期でエラーチェックをしてくれる素晴らしいプラグイン。
c/c++では
・clang
・clangcheck
・clangtidy !!
・clang-format
・cppcheck
・cpplint !!
・cquery
・flawfinder
・gcc
これらの選択肢があります。
私が使用したことあるものは、clang, clangcheck, clangtidyです。
clangは書いてる途中でエラーチェックをしてくれますが、CPUが唸りを上げます(笑)
clangcheckとclangtidyは、CPUに優しいですが、保存時のみしかチェックしてくれません。
CPUには申し訳ないですが、やっぱり書いてる途中でエラー表示して欲しいので、clangを使ってます。

[[plugins]]
repo ='w0rp/ale'
hook_add ='''
    " シンボルカラムを表示したままにするletg:ale_sign_column_always=1" 保存時に整形してくれるletg:ale_fix_on_save=1" 補完してくれるletg:ale_completion_enabled=1" エラー行に表示するマークletg:ale_sign_error='⨉'letg:ale_sign_warning='⚠'" エラー行にカーソルをあわせた際に表示されるメッセージフォーマットletg:ale_echo_msg_format='[%linter%] %s [%severity%]'letg:ale_statusline_format=['⨉ %d','⚠ %d','⬥ ok']letg:ale_linters={        \'c':['clangd'],        \'cpp':['clangd']    \}'''

デバッガー

IDEには絶対デバッガーが付いていますが、Vimでもそれを実現してくれる素晴らしいプラグインがあります。

lldb.nvim

これは本当に素晴らしいです。IDEみたいになります(笑)
リポジトリにYoutubeでの使い方動画があったので、参考にしてください。
ただ、Macでこれを使おうとすると引っかかります。
私はpyenvとpyenv-virtualenvで2系と3系それぞれのneovim用環境を使っていたのですが、システムの標準python(/usr/bin/python2.7)しかlldbモジュールをimportできないという部分でめちゃめちゃ引っかかりました。
ベストな解決策は未だにわからないのですが、私は
・python2 => システム標準
・python3 => pyenv + pyenv-virtualenv
で変えることにしました。

手順としては、

1.標準pythonにneovimモジュールをインストールする。

$ sudo /System/Library/Frameworks/Python.framework/Versions/2.7/bin/python -m easy_install neovim

2.PYTHONPATHにlldbの場所を指定する

$ echo'export PYTHONPATH="/Applications/Xcode.app/Contents/SharedFrameworks/LLDB.framework/Resources/Python:${PYTHONPATH}"'> ~/.bash_profile

3.neovimのg:python_host_progに/usr/bin/python2.7を指定する

init.vim
letg:python_host_prog='/usr/bin/python2.7'letg:python3_host_prog= $HOME .'/.pyenv/versions/neovim3/bin/python'

という手順です。
設定は特にはしていません。

[[plugins]]
repo ='dbgx/lldb.nvim'
on_ft =['c','cpp']

しかし、lldb.nvimはもうメンテナンスされていません!!!
理由はhttps://github.com/dbgx/lldb.nvim/issues/51#issuecomment-294894345
に書いてあります。
したがって、いつ使えなくなるかわからないので、このプラグインを使うことに関して責任は持てません(笑)

使えなくなった時のために、同じようなプラグインを載せておきます。
neogdb
nvim-gdb
どちらもgdbが必要で、

$ brew install gdb

でインストールできます。

参考:neovim + clang + lldbでC++開発環境構築メモ(自動補完、文法チェック、デバッガフロントエンド)

タグジャンプ

タグジャンプは有名どころだと、ctagsgtagsなどがありますが、C++は文法の複雑さ的にこれらだと対応しきれないらしいです。(C++で実際に使ったことないのでほんとかはわかりません)
そこで私はrtagsを使用しています。
rtagsはコンパイラがソースコード解析を行うので、ミスが起こりませんし、使い心地が非常にいいです。

インストールはhomebrewで

$ brew install rtags

とやれば入ります。
ただ、dependencyでllvmがあり、rtagsのdependencyで入れた場合に--with-lldb --with-python@2 --with-toolchainが適用されるかわからなかったので、私はllvmを最初にインストールした後、rtagsをインストールしました。

vim-rtags

これはvimでrtagsを使えるようにしたプラグインです。
rdmを自動で起動してくれて、compile_commands.jsonを自動検出しrcに渡してくれるので、特に何も考えずにVimでrtagsを使うことができます。

[[plugins]]
repo ='lyuts/vim-rtags'
on_ft =['c','cpp']
hook_add ='''
    letg:rtagsUseDefaultMappings=0letg:rtagsAutoLaunchRdm=1'''
hook_source ='''
    noremap <leader>ri:call rtags#SymbolInfo()<CR>
    noremap <Leader>rj :call rtags#JumpTo(g:SAME_WINDOW)<CR>
    noremap <Leader>rJ :call rtags#JumpTo(g:SAME_WINDOW,{'--declaration-only':''})<CR>
    noremap <Leader>rS :call rtags#JumpTo(g:H_SPLIT)<CR>
    noremap <Leader>rV :call rtags#JumpTo(g:V_SPLIT)<CR>
    noremap <Leader>rT :call rtags#JumpTo(g:NEW_TAB)<CR>
    noremap <Leader>rp :call rtags#JumpToParent()<CR>
    noremap <Leader>rf :call rtags#FindRefs()<CR>
    noremap <Leader>rF :call rtags#FindRefsCallTree()<CR>
    noremap <Leader>rn :call rtags#FindRefsByName(input("Pattern? ","","customlist,rtags#CompleteSymbols"))<CR>
    noremap <Leader>rs :call rtags#FindSymbols(input("Pattern? ","","customlist,rtags#CompleteSymbols"))<CR>
    noremap <Leader>rr :call rtags#ReindexFile()<CR>
    noremap <Leader>rl :call rtags#ProjectList()<CR>
    noremap <Leader>rw :call rtags#RenameSymbolUnderCursor()<CR>
    noremap <Leader>rv:call rtags#FindVirtuals()<CR>
    noremap <Leader>rb :call rtags#JumpBack()<CR>
    noremap <Leader>rC :call rtags#FindSuperClasses()<CR>
    noremap <Leader>rc :call rtags#FindSubClasses()<CR>
    noremap <Leader>rd :call rtags#Diagnostics()<CR>'''

参考: 最強のC/C++インデクサー "Rtags" を本気で使う

検索機能

denite.nvim

これまた暗黒美夢王様の素晴らしいプラグインです。
私は全然使いこなせていませんが、完璧に使いこなせれば神になれると勝手に思っています。

[[plugins]]
repo ='Shougo/denite.nvim'
hook_add ='''
    nmap <Space>[denite]
    nmap <Space>p[deniteProject]
    nmap <silent>[denite]b:<C-u>Denite buffer<CR>
    nmap <silent>[denite]g:<C-u>Denite grep<CR>
    nmap <silent>[denite]m:<C-u>Denite file_mru<CR><silent><C-u><C-y>:<C-u>Denite neoyank<CR>
    nmap <silent>[denite]f:<C-u>Denite file/rec<CR>
    nmap <silent>[denite]d:<C-u>Denite directory_rec<CR>

    nmap <silent>[deniteProject]b:<C-u>DeniteProject buffer<CR>
    nmap <silent>[deniteProject]g:<C-u>DeniteProject grep<CR>
    nmap <silent>[deniteProject]m:<C-u>DeniteProject file_mru<CR><silent><C-u><C-y>:<C-u>Denite neoyank<CR>
    nmap <silent>[deniteProject]f:<C-u>DeniteProject file/rec<CR>
    nmap <silent>[deniteProject]d:<C-u>DeniteProject directory_rec<CR>'''
hook_source ='''
    if executable('rg')call denite#custom#var('file/rec','command',['rg','--files','--glob','!.git'])call denite#custom#var('file_rec','command',['rg','--files','--glob','!.git'])call denite#custom#var('grep','command',['rg','--threads','1'])call denite#custom#var('grep','recursive_opts',[])call denite#custom#var('grep','final_opts',[])call denite#custom#var('grep','separator',['--'])call denite#custom#var('grep','default_opts',['--vimgrep','--no-heading'])endifcall denite#custom#map('insert',"<C-n>",'<denite:move_to_next_line>')call denite#custom#map('insert',"<C-p>",'<denite:move_to_previous_line>')call denite#custom#map('insert',"<C-t>",'<denite:do_action:tabopen>')call denite#custom#map('insert',"<C-v>",'<denite:do_action:vsplit>')call denite#custom#map('insert',"<C-h>",'<denite:do_action:split>')call denite#custom#filter('matcher_ignore_globs','ignore_globs',[                \'.git/','build/','__pycache__/',                \'images/','*.o','*.make','*.min.*',                \'img/','fonts/','*~','*.exe','*.bak',                \'.DS_Store','*.pyc','*.class','tags'                \])'''

その他

ここからはメインではないですが、あるといいプラグインを紹介していきます。

a.vim

これによりヘッダファイルとソースファイルを簡単に行き来することができます。

[[plugins]]
repo ='vim-scripts/a.vim'
on_ft =['c','cpp']
hook_source ='''
    nmap <silent><leader>aa :A<CR>
    nmap <silent><leader>at :AT<CR>
    nmap <silent><leader>av :AV<CR>'''

vim-cpp

cpp11用のシンタックスプラグインです。

DoxygenToolkit.vim

Doxygen用のコメントを挿入することができるプラグインです。

[[plugins]]
repo ='vim-scripts/DoxygenToolkit.vim'
on_ft =['c','cpp']
hook_source ='''
    nmap <leader>dox :Dox<CR>'''

vim-cmake

vimからcmakeコマンドを実行できるプラグインです。
自分はtmuxで分割して下のペインでビルドコマンドを打つのであんまり使ってないです。

neosnippet

暗黒美夢王によるスニペットのプラグイン。めちゃ便利。
後続のdeoppetの完成が非常に楽しみ。

[[plugins]]
repo ='Shougo/neosnippet'
on_i =1
hook_source ='''
    imap <C-k><Plug>(neosnippet_expand_or_jump)smap<C-k><Plug>(neosnippet_expand_or_jump)
    xmap <C-k><Plug>(neosnippet_expand_target)if has('conceal')set conceallevel=2 concealcursor=niv
    endifletg:neosnippet#enable_snipmate_compatibility =1letg:neosnippet#enable_completed_snippet =1letg:neosnippet#expand_word_boundary =1letg:neosnippet#enable_completed_snippet =1'''
hook_add ='''
    letg:neosnippet#snippets_directory ="$XDG_CONFIG_HOME/nvim/autoload/snippets/"'''

nerdtree

ファイラーです。
これを選んだ理由は、有名だから(笑)
他にもっといいものがあれば乗り換えます。
Vimfilerとの違いって何ですか?
暗黒美夢王のdefx.nvimがリリースしたら試してみようと思う。

[[plugins]]
repo ='scrooloose/nerdtree'
hook_add ='''
    " 隠しファイルを設定するlet NERDTreeShowHidden =1'''

vim-nerdtree-tabs

全タブで共通のnerdtreeを表示してくれます。
自分はタブをよく使うので、結構便利。

[[plugins]]
repo ='jistr/vim-nerdtree-tabs'
hook_add ='''
    " トグル設定
    map <C-e><plug>NERDTreeTabsToggle<CR>" 起動時有効letg:nerdtree_tabs_open_on_console_startup=1" 起動時にファイルにカーソルを合わせるfunction!s:MoveCursorAtStart()call feedkeys("\<C-l>")endfunction
    autocmd VimEnter * NERDTree |calls:MoveCursorAtStart()'''
depends =['nerdtree']

vim-airline

ステータスラインを表示してくれます。
vimがかっこよくなる。

[[plugins]]
repo ='vim-airline/vim-airline'
hook_add ='''
    " タブラインの表示letg:airline#extensions#tabline#enabled =1" (タブが一個の場合)バッファのリストをタブラインに表示する機能をオフletg:airline#extensions#tabline#show_buffers =0" 0でそのタブで開いてるウィンドウ数、1で左のタブから連番letg:airline#extensions#tabline#tab_nr_type =1" パワーラインフォントの使用letg:airline_powerline_fonts=1" aleの表示letg:airline#extensions#ale#enabled =1" Do not collapse the status line while having multiple windowsletg:airline_inactive_collapse=0" tagbarの表示letg:airline#extensions#tagbar#enabled =1" virtualenvを有効letg:airline#extensions#virtualenv#enabled =1'''

tagbar

クラスのメンバやメソッドの一覧を見れる。
あと今どのメソッドにいるのかわかる。

vim-fugitive

vimでgitを使える。マジ便利。

vim-gitgutter

変更箇所に印をつけてくれる。ちょっとラグがある。

こんな感じです。
ただ羅列してしまった。

Language Serverという選択肢

ぶっちゃけ自分はこれを使ってます!!

Language Serverって何ができるの?

Language Server Protocolについて知らない方は下の記事を参照してください。
参考:language server protocolについて (前編)

ざっくり言うと、これ一つで補完・リンター・参照とか全部できちゃう感じです。

deoplete-clang*とかaleのC/C++のリンターとかは、やっぱりちょっと動作がもたつきます。
pythonとかのソースと比べると、使いづらい印象です。

それに比べて、LSPはまじで早い!
補完の速度もリンターの速度も尋常じゃないほど早いです。
現状C/C++においてはLSPを使うのが最善の選択肢だと勝手に思ってます。

もちろんcompilation databaseにも対応しているので、ライブラリ補完などもソッコー効きます。

LSPのプラグイン

LanguageClient-neovim

他にもvim-lspとかありますが、deoplete対応しているのでこれを使ってます。

[[plugins]]
repo ='autozimu/LanguageClient-neovim'
build =['./install.sh']
hook_add ='''
    lets:node= empty($XDG_CONFIG_HOME) ? expand('$HOME/.config'): $XDG_CONFIG_HOME
    letg:LanguageClient_serverCommands={        \'c':['clangd','-compile-commands-dir='. getcwd().'/build'],        \'cpp':['clangd','-compile-commands-dir='. getcwd().'/build'],    \}" not stop completion $ & /set hidden
    set signcolumn=yes
    letg:LanguageClient_hoverPreview="Never"
    nnoremap <F5>:call LanguageClient_contextMenu()<CR>" Or map each action separately
    nnoremap <silent> K :call LanguageClient#textDocument_hover()<CR>
    nnoremap <silent> gd :call LanguageClient#textDocument_definition()<CR>
    nnoremap <silent><F2>:call LanguageClient#textDocument_rename()<CR>'''

私はcmakeのプロジェクトがメインなので、compile_commands.jsonがある前提でvimの設定をしています。

じゃあ結局お前は何を使ってるんだ!

現状私は

補完

deoplete.nvimをベースにしてLanguageClient-neovim

リンター

LanguageClient-neovim

デバッガー

lldb.nvim

検索

denite.nvim

タグジャンプ

vim-rtags
を使って開発しています。

renameに関しては、vim-rtagsでもLanguageClient-neovimでもできますが、renameした後やっぱ戻したい!ってなった時に、vim-rtagsはReDo一回で1つのシンボルしかReDoしてくれません。
LanguageClient-neovimはReDo一発で全シンボルをReDoしてくれるので、そちらを採用しています。

ヘッダファイル内でエラー吐きまくり

私がLSPを使用している際に、ソースファイルではエラーも出ずに補完もちゃんと効くのに、ヘッダファイルではエラー吐きまくり&補完きかない問題がありました。

そこで、LanguageClient-neovimのissuesで聞いてみたところ、compile_commands.jsonがソースファイルに関するコンパイルコマンドしか記述していないからだという返答が返ってきました。
https://github.com/autozimu/LanguageClient-neovim/issues/495

回答者さんは非常に優しく、解決策をちゃんと提示してくれました。
compdbと言うpythonモジュールを使うと、ヘッダファイルの情報も付与したcompile_commands.jsonを生成してくれるので、ヘッダファイル内でもエラーをはかなくなります。

cmakeで生成されて./build/compile_commands.jsonを元に、compdbで./compile_commands.jsonを作成します。
これを各種プラグインに読み込ませてあげればいいので、LanguageClient-neovimの設定を次のように変更します。

letg:LanguageClient_serverCommands={        \'c':['clangd','-compile-commands-dir='. getcwd()],        \'cpp':['clangd','-compile-commands-dir='. getcwd()],    \}

これで快適に使用することができます。

ちなみにこれを一気にやる関数をfishで書いたので、参考までに貼っておきます。
./build内で実行してください。

function build
    if test-x(command-v clang)
        cmake .. -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ -DCMAKE_EXPORT_COMPILE_COMMANDS=ON
        if test-x(command-v compdb)
            compdb list > ../compile_commands.json
        else
            echo"\e[33mWarning: compdb is not installed"
        end
    else
        cmake ..
        echo"\e[33mWarning: clang is not installed, using default compiler"
    end
end

Help me!

今まで頑張って環境構築を続けて来たのですが、3つほどできていないorわからない部分があるので、どなたかわかる方いらしたら是非教えていただきたいです。

1.ヘッダファイルの中身をソースファイルに展開

CLionであった機能なんですが、

Hoge.hpp
classHoge{public:inthoge();}

とあるものを

Hoge.cpp
#include "hoge.hpp"
intHoge::hoge(){}

と展開したいです。

2.ライブラリのヘッダファイル補完

上でneoincludeを用いればヘッダファイルの補完ができると言いましたが、cmakeプロジェクトにおけるライブラリのヘッダファイルは補完が効きません。
自分はこうしてる!みたいなものがある方がいたら是非教えてください。

3.新規ファイル作成

新規ファイルを目的の場所にソッコー作れる方法を探しています。
自分は基本プロジェクトルートでVimを起動し、そこから動くことはないので、deniteで新規ファイルを作成するとフルパスで記述しないといけません...
なので今はnerdtreeから追加するというナンセンスな方法を取っています。

ファイル生成の簡単な方法があったら是非教えてください。

最後に

めっっっっっっっっちゃ長くなりましたが、読んでいただきありがとうございました。
この記事がどなたかの助けになれば幸いです。
ツッコミ&質問&アドバイスお待ちしております。

Vim を WebAssembly に移植した

viを初心者でも使いやすくしてみる

$
0
0

はじめに

  • vimでは上下左右をhjklで動くのが正道です
  • しかし、vim初心者としては、カーソルがある環境ならばカーソルで動きたいものです
  • また、INSERTモードになったときに、バックスペースも使いたいです
  • さらに、「:」でジャンプするには、行番号を表示したいです

前提

  • NAME="Ubuntu"
  • VERSION="16.04.4 LTS (Xenial Xerus)"

vimの設定ファイルを編集する

vi ~/.vimrc
  • 下記の設定を書き込みます
set nocompatible
set backspace=indent,eol,start
set number
  • 以下、設定の意味を少し説明します

set nocompatible

  • vi互換の動作を無効にするコマンド
  • 主に自分にとってはINSERTモード時にもカーソル移動を可能にしてくれるコマンド
  • 多くのシステムは、これを設定しなくても、上記の事が出来たりします
  • 環境によっては、これをしないとINSERTモードでカーソル入力すると、ABCDと入力してくださいます
  • さくらVPSのUbuntu 16.04.4 LTS (Xenial Xerus)はこれが必要でした

set backspace=indent,eol,start

  • indent 字下げをバックスペースで消去可能
  • eol 行末をバックスペースで消去可能(行を連結)
  • start 挿入の開始点を超えてバックスペースで消去可能

set number

  • 行番号を表示する
  • 行番号が表示されていると、「:(行数)」でのジャンプが楽になって幸せ感があります
Viewing all 5727 articles
Browse latest View live


<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>