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

新人エンジニアのためのエディタ入門

$
0
0

もうクリスマス当日ですが、 Fringe81 Advent Calendar 2017の10日目の記事です。

大幅に遅れてしまってFringeneerの皆さん本当にごめんなさい。

最初に

入社してからエンジニアデビューした新人から、こんな声を聞くことがあります。

  • どのエディタがいいんです?
  • Vim / Emacsってよく聞くけど、よく分からないです
  • Vim / Emacsが苦手です
  • キーバインドが覚えられないです
  • カスタマイズって敷居が高いです

こういった声に答えるべく、エディタよもやま話から、Vimの基本的な操作、Atomのカスタマイズの方法とかについて書きました。

すでにVimやAtomをバリバリ使っている方は対象読者ではありませんので悪しからず。

エディタよもやま話

VimとEmacs

エンジニアにとってエディタと言えば、Vim(vi含む)かEmacsです。
誰が決めたかは知りませんが、大昔からそう決まっています。

ちなみに僕が好きなエディタもEmacsです。

ただ、両者はともに高機能ですが、独特のキーバインド、最初のうちほとんど上昇しない学習曲線、使い始めの生産性の低さから、初心者のやる気をくじきます。
一方で、一度学習曲線が上を向き始めると、どんどん使いこなせるようになり、生産性もそれに伴い急激に上昇するエディタでもあります。

カスタマイズにはそれぞれVim scriptやEmacs Lispという若干マイナーな言語を覚える必要があり、カスタマイズのハードルは高めです。

個人的なイメージではありますが、両者の特色として下記を挙げます。

  • Vim
    • 究極のエディタ
    • 合理的な操作体系(ゆえにコツを覚えると類推しながら操作できるようになる)
    • たいていの作業環境で既にインストールされている
    • キーの同時押しが少なく指に優しい
  • Emacs
    • 究極の環境(カスタマイズしまくることが前提)
    • デフォルトの操作体系はVimほど合理的ではない(と思う)
    • インストールされていない作業環境も多い
    • キーの同時押しが多くて指がつる(けど1週間程度で慣れる)

色々と違いはありますが、どちらのエディタも達人の域になると、視線の動きとカーソルがほとんどシンクロしています。

ちなみに、よくVimユーザーとEmacsユーザー間の「エディタ戦争」とか言われますが、正直なところガチのエディタ戦争を目にしたことはありません。
「これだからEmacsは・・・」などとユーザー同士で揶揄したりもしますが、冗談ぽくいじり合う感じが多く、どちらかというとEclipseなどのIDE(統合開発環境)が彼らの共通の敵だったりします。

3つめの選択肢 Atom

そんな使いこなすのが難しいVimやEmacsですが、同じくらい高機能でありながら、近年台頭してきて、初心者にもとっつきやすいエディタがあります。
Atomです。

キーバインドもとても常識的ですし、カスタマイズに使う言語はJava ScriptやCSSというおそらく最も競技人口が多い言語を使うため、カスタマイズも容易です。

サイズの大きなファイルをいじったりする場合は動きがもっさりして辛かったりしますが、それ以外の面であれば、2大エディタとほとんど遜色ないレベルの高機能さです。
これからプログラミングを始めようとしている方から、VimやEmacsをバリバリ使っている方まで、広いユーザー層を満足させられるエディタだと思います。

おすすめエディタ

好きなエディタはEmacs、と言っておいてアレですが、新人からおすすめエディタを聞かれたらVimとAtomを勧めています。

その理由は下記です。

  • Vim
    • ターミナルからサーバーにログインして作業をする時のデファクトスタンダード
    • とっつきにくい印象をもたれがちだが、一度考え方に慣れるとEmacsより操作を覚えやすい
    • 大きいサイズのファイルを扱う時に、Atomはもちろん、Emacsよりも動作が軽い
  • Atom
    • 一般的なアプリケーションと同じキーバインドが多い
    • パッケージの導入も簡単で、初心者エンジニアが「エディタを育てていく」ことの楽しさを学びやすい
      • プログラミングの学習に役立つパッケージを簡単に入れられる
    • エディタを簡単にカスタマイズできる

以降では、あえてEmacsではなく、VimとAtomの基礎的な使い方やTipsを紹介したいと思います。

それほど詳しいわけではないので役者不足だと自覚していますが、まぁご容赦ください。

Vimと仲良くなる

Vimと仲良くなるために押さえておいた方がよい概念やTipsを新人エンジニア向けに紹介します。

「使いこなす」とまではいかなくても、ここに書いてあることを読めば「苦手意識がなくなる」程度には、Vimと仲良くなれると思います。
僕自身それほどVimと仲良しなわけではないですが、それでも苦手意識は特にありません。

hjkliEsc:wq:q!しか覚えていない、そんな貴方に読んでいただきたいです。

モード

一にも二にも、「モード」という概念がVimへの敷居を上げていると言ってもいいでしょう。

初めてVimに触れ、 hogeと打とうとしても思うように入力できない時の絶望感を、誰しも一度は味わったことがあるのではないでしょうか。

Vimには以下のモードがあります。

  • ノーマルモード
  • 入力モード
  • コマンドモード
  • 検索モード
  • ビジュアルモード

書籍やサイトによっては、ノーマルモード・入力モード・コマンドモードの3つのモードと言っていたりもします。
どれが正しいのかは知りません。(公式ドキュメントでも読めば書いてあるでしょうが)

まずは、ノーマルモードとその他のモードがある、と覚えましょう。

ノーマルモードから各モードには下記のキーバインドで移行できます。

モードキーバインド
入力モードiIaAoOなど
コマンドモード:
検索モード/?
ビジュアルモードvVCtrl + vなど

一方、現在どのモードであっても、ノーマルモードに戻るには Escを使います。
が、実は Ctrl + [でも戻ることができます。
Escキーが押しづらいため、自分は Ctrl + [を使っています。

以降では、各モードについて少し個別に紹介します。

ノーマルモード

カーソル移動のためのモードですが、非ノーマルモードから他の非ノーマルモードに移行するためには、多くの場合は一度ノーマルモードに移行する必要があるため、キーボードで言うところのホームポジション的なモードでもあります。

カーソル移動の主なコマンドをおさらいしておきましょう。

キーバインド振る舞い
hカーソルを左に移動する
jカーソルを下に移動する
kカーソルを上に移動する
lカーソルを右に移動する
^カーソル行の先頭に移動する (正規表現と一緒)
$カーソル行の先頭に移動する (正規表現と一緒)
ggファイルの先頭に移動する
Gファイルの最終行に移動する
Ctrl + f1ページ分進む (Forward?)
Ctrl + b1ページ分戻る (Backward?)
w1単語進む (Word)
b1単語戻る (Back word?)

ちなみにVimのカーソル移動の方法はめちゃくちゃたくさんあります。
興味が出てきたら調べてみてください。( fなんかも便利です)

入力モード

文字を入力するためのモードです。

Vimを使ったことがある人であれば、おそらくどんな人も iくらいは知っていると思いますが、実は色々なキーバインドがあります。

メジャーなところだと、 iaoあたりでしょうか。

それぞれ、以下の動きをします。

キーバインド振る舞い
iカーソル位置から文字を入力する (Insert)
aカーソル位置の次から文字を入力する (Append)
oカーソル行の次に1行挿入して文字を入力する
Iカーソル行の先頭から文字を入力する (Insert)
Aカーソル行の末尾から文字を入力する (Append)
Oカーソル行の前に1行挿入して文字を入力する

最初にすべて覚える必要はないと思いますが、入力モードへの移行に iしか使っていない、というのも勿体ない話です。

段々と慣れて使いこなせるようになりましょう。

コマンドモード

exというラインエディタのコマンドを使うモードなので、Exモードとも呼ばれたりします。
ファイル保存や置換の時に使われることが多いです。

exコマンドは多岐に渡り、軽く紹介できるものでもないので、ここでは割愛します。
とりあえずはファイル保存と置換ができればよいと思います。

置換は下記です。

:%s/before/after/g

セパレータは /の代わりに :を使うこともできるため、 /を含んだ文字列を置換したい時は :を使うと便利です。
他にも、上記の %gなどについては解説が必要ですが、ネット上にいくらでも解説があるので、そちらを参照してください。

ちなみに、ファイル保存する際には :wqを使っている方が多いと思いますが、ノーマルモードで ZZでも同じことができます。

検索モード

/?を押すことで移行することができるモードです。
/はファイル末尾に向かって検索し、 ?はファイル先頭に向かって検索します。

検索中に nで次の候補に移動でき、 Nで一つ前の候補に戻ることができます。

範囲選択モード

vVCtrl + vで移行することができるモードです。

一般的なエディタだと Shiftを押しながらカーソル移動するのと同じイメージです。

キーバインド振る舞い
v範囲選択モードに移行
V行単位の範囲選択モードに移行
Ctrl + v矩形選択モードに移行

範囲選択した状態で、 y (yank) でコピー、 c (change) で変更、 d (delete) で削除ができます。

また、矩形選択している状態で Iを押して入力モードに移行し、文字列を入力してから入力モードを抜けると、矩形選択していたすべての場所に入力した文字列が挿入されます。

Shiftを使った時の挙動

Vimでは、元々のキーバインドにShiftを組み合わせることで、元々の動きが少し変化した振る舞いをすることが多いです。

大きく分けると、

  • 正反対の振る舞いをする(ex. 検索モードに移行する時の /?や、検索後の nNなど)
  • もともとの振る舞いの対象範囲を拡大する(ex. 入力モードに移行する時の iI(挿入対象が、文字から行に拡大)など)

のどちらかが大半な印象です。

元々の操作と、Shiftを同時に押した時の動作を、セットで覚えるとより多くの操作がラクに身につくと思います。

operator

ycdvなどの操作はoperatorと呼ばれ、カーソル移動操作(motion)やtext-objectというものと組み合わせることで、便利な使い方ができます。

以降で、ほんの触りですが紹介してみたいと思います。

motionとの組み合わせ

operatorに続けて、カーソル移動操作のキーバインドを入力することで、カーソル位置から移動先までを対象として、コピー・変更・操作・選択ができます。

例えば、カーソル位置から行末尾までを削除したいときは d$と入力することで実現できますし、単語の先頭にカーソルがある状態で cwと入力すれば単語の変更が行えます。

text-objectとの組み合わせ

operatorに続けて、text-object(色々種類があります)を指定することで、そのtext-objectを対象として、コピー・変更・操作・選択ができます。

text-objectは説明が難しいのですが、a (冠詞のa) または i (innerの略) と、それに "[などの特定の文字を続けたものになります。

text-objectとして最初に指定する aまたは iのアルファベット1文字の意味は下記です。

  • a: 指定した特定の文字が表す対象をtext-objectとして指定する
  • i: 指定した特定の文字が表す対象の内側をtext-objectとして指定する

例を示した方が分かりやすいと思うので、いくつか例を示します。

  • 「"」で囲まれた位置にカーソルがある時
    • 「"」で囲まれた範囲を「"」を含めて選択したい: va"
    • 「"」で囲まれた内側の範囲を選択したい: vi"
  • 「HTMLタグ」で囲まれた位置にカーソルがある時
    • 「HTMLタグ」で囲まれた範囲を「HTMLタグ」を含めてコピーしたい: yat
    • 「HTMLタグ」で囲まれた内側の範囲をコピーしたい: yit

なんとなく分かってもらえたでしょうか。

説明の便宜のために一部不正確に書いてしまっている箇所もあるため、詳しく知りたくなったら調べてみてください。

その他よく使うキーバインド

他にも、よく使うキーバインドとして、

  • u: 直前の操作を取り消す、Undo
  • *: カーソル位置の単語が次に現れる箇所まで移動する
  • J: カーソル行と次の行をつなげる

などがあります。

...ここまででVimの基本的な操作はそれなりに紹介できたのではないかと思いますが、Vimの世界は大変ディープです。ここで紹介できたのはその1%程度だと思います。

書籍やサイトも数多くありますので、「Vimともっと仲良くなりたい!」と思ったら、ぜひご自分でVim道を極めていってください。

Atomと仲良くなる

Vimと異なり、Atomの操作方法は最初から一般ユーザーに親しみやすいものになっているので、操作の仕方については割愛します。

以降では、Atomのカスタマイズの方法とおすすめパッケージについて紹介します。
簡単な独自機能を追加してみることで、エディタをカスタマイズする楽しさを知ってもらえれば嬉しいです。

(予想外にVimについての記述が多くなってしまったので、ここからはあっさりめで行かせていただきます。)

カスタマイズのいろは

Atomのカスタマイズという時、大きく分けて以下の種類があると個人的には考えています。

  • キーマップ(キーバインド)の変更
  • コマンド(機能)の変更・追加
  • 見た目の変更

それぞれをどうカスタマイズしていけばいいか、見ていきましょう。

キーマップの変更

キーマップに変更を加えることで、色々なコマンド(後述)を任意の操作で呼び出すことができるようになります。

メニューから、 Atom -> Keymap...を選択すると ~/.atom/keymap.csonが開かれ、このファイルを編集することでキーマップをカスタマイズできます。 keymap.csonというファイル名からも分かるように、cson形式で定義します。

トップレベルのプロパティ名には、そのキーマップを有効にする文脈をCSSセレクタで指定し、その値に キー: 呼び出しコマンド名という形でキーとコマンド名のマッピングを定義したオブジェクトを指定します。

説明だけでは分からないと思いますので、とりあえず例を見てみましょう。

'.platform-darwin, .platform-linux, .platform-win32':
  'ctrl-g': 'core:cancel'
  'ctrl-p': 'core:move-up'
  'ctrl-n': 'core:move-down'
  'ctrl-b': 'core:move-left'

(略)

'atom-text-editor':
  'ctrl-d': 'core:delete'

(略)
セレクタ

CSONのトップレベルのプロパティですが、
'.platform-darwin, .platform-linux, .platform-win32''atom-text-editor'など、
たしかにCSSセレクタのように見えますね。

AtomはElectronで作られており、Chromiumベースで一種のブラウザになっています。
メニューから View -> Developer -> Toggle Developer Toolsと選択すると、フロントエンドエンジニアにはお馴染みのDeveloper Toolsが表示されます。
Developer ToolsのElementsのタブとにらめっこしていると、たしかにMacの場合は bodyplatform-darwinというクラスが付いていることが分かります。

つまり、上記のCSONでは、まず「どんな要素内でキーが押された時のキーマップを定義するのか」をトップレベルのプロパティで定義しています。
例では、 .platform-darwin.platform-linux.platform-win32というクラスが付加されている要素内と、 atom-text-editorという要素内でのキーマップについて定義しているわけです。

キー&コマンド

では、 atom-text-editor要素内のキーマップについて見てみましょう。

'ctrl-d': 'core:delete'と1行だけ内容の記述があります。

これは「 ctrl-dというキーで core:deleteという名前のコマンドを呼び出す」という定義になっています。

コマンドというのは、atomに登録されている関数です。

https://atom.io/docs/api/v1.0.0/CommandRegistry#instance-addを読んでもらえば分かりますが、Atomでは atom.commands.add(target, commandName, callback)といういかにもな名前のメソッドがあります。
このメソッドを通じて登録されたcallback関数がコマンドであり、この時に commandNameとして指定したものがコマンドの名前になります。

コマンドには、パッケージによって提供されるコマンドと、自分で追加するコマンドがあります。

コマンド名の確認方法

Atomに登録されているコマンドは、コマンドパレット( メニュー上で Packages -> Command Paletteで出るかと )から確認できます。

また、Macだと ⌘ + .で、Key Binding Resolverというペインが開き、操作をする度に今自分が呼んでいるコマンドを確認できます。

コマンドの追加

コマンドを追加することで、エディタに新しい機能を追加することができます。Atomカスタマイズの醍醐味です。

ここからは、簡単な自作コマンドを作ってみましょう。

初期化スクリプト

Atomが起動すると、 ~/.atom/init.jsないし ~/.atom/init.coffeeという初期化スクリプトが読み込まれます。

このスクリプトに処理を記述することで、Atomの機能を拡張していきます。

なお、このスクリプトはメニュー上の Atom -> Init Script...から開くことができますが、ファイルがない状態でこのメニューを選ぶとCoffee Scriptのファイルが作成されてしまうため、Java Scriptを使いたい場合は touch ~/.atom/init.jsなどを実行してからメニューを選びましょう。

「日誌を開く」機能の追加

さて、エンジニアであれば、一日の作業メモファイルを残す習慣のある方も多いかと思います。

そこで、Atomに「日誌を開く」という機能を追加してみましょう。

今日の日付のファイルをホームディレクトリ以下に作成する、下記のようなコードを書いてみましょう。

atom.commands.add('atom-workspace','my-commands:open-journal',ev=>{consttoday=newDate();consthomeDir=process.env[process.platform=="win32"?"USERPROFILE":"HOME"];atom.workspace.open(`${homeDir}/Journals/${today.getFullYear()}/${today.getMonth()+1}/${today.getDate()}.md`);});

Atomを再起動してコマンドパレットを開いて「Open Journal」と検索すると、おそらく上記で登録したコマンドが表示されると思います。
そしてそのコマンドを選択すると、めでたく ~/Journals/2017/12/25.mdといったファイルを開いてくれるはずです。

ここまでで、コマンドの追加は完了です。

コマンドとキーの関連付け

my-commands:open-journalというコマンドは追加できましたが、日誌を開く度にコマンドパレットを開くというまだるっこしいことは、できればやりたくありません。
一発で日誌を開きたいところです。

ここでもう一度 keymap.csonを開いて、下記のような記述を追加してみましょう。

'atom-workspace':
  'ctrl-shift-j': 'my-commands:open-journal'

JournalのJから、 Ctrl + Shift + jというキーをマッピングしてみました。
保存すると即座に設定は反映されるので、 Ctrl + Shift + jを入力してみましょう。

...どうでしょう、日誌は開けたでしょうか?

見た目の変更

キーマップの設定のための keymap.csonや 初期化スクリプトの init.jsと同様に、
見た目をカスタマイズするためのファイルとして ~/.atom/styles.lessというファイルが用意されています。

メニューから Atom -> Stylesheet...を選択すると、lessファイルが開かれて、色々な見た目を制御できるようになります。

好みで色々といじってみるとよいと思います。

等幅フォントに設定しておくと、環境がより快適になります。

エディタカスタマイズの楽しさ

ここまでAtomの独自カスタマイズに必要な最低限のことを、ざっくり紹介できたかと思います。

パッケージが豊富なエディタですから、たいていの機能は誰かしらがパッケージで提供してくれているかもしれません。
ですが、それでも「あー、○○○できる機能があればいいのに・・・なんでないんだ・・・」と思うことは、そのうちきっとあるでしょう。

先に上げたVimやEmacsはVim scriptやEmacs Lispを学習しなければカスタマイズできませんが、AtomではJavaScriptとlessさえ使えれば、どんな機能でも自分で追加が可能です。

もしも欲しい機能がパッケージになかった時は、ぜひ自分でスクリプトを書いてカスタマイズして、「自分の欲しいものを自分で作る」というDIYの楽しさを味わってください。
そして、その機能が世の中の人達にも有用だと思ったら、ぜひパッケージとして公開してみましょう。

Atomはパッケージの作成もとても簡単にできます。

おすすめパッケージ

独自のカスタマイズのやり方について説明しましたが、カスタマイズの基本はどちらかと言えばパッケージの追加かもしれません。
メニュー上で Atom -> Preferences -> Installを選択して、パッケージを検索するだけで簡単にインストールできるので、色々なパッケージを試してみてください。

以下に個人的なおすすめパッケージを紹介しておきます。

最後に

書き始めたら長いエントリーになってしまいましたが、楽しんでもらえたら嬉しいです!

皆様よいクリスマス&お正月を!!!


本当の本当に最低限のvimの使い方

$
0
0

viの印象

viと聞くと、どんなイメージでしょうか?
使いやすい!最高!とか、いやEmacsの方が、、という方は対象にしておりませんのでより詳しいページをごらんください。

どちらかというと、何をしているのかわからない。できれば触りたくないという印象をお持ちの方向けです。
そうした方の場合、まずviを使う場面は、あるファイルをちょっとだけ編集したいというときではないでしょうか。たった1文字、1行書き加えたい。だけどviはよくわからない。そんな時に思いだしていただきたいことを最小限で書いてみます。

viでファイルを開く

コマンドライン上で

vi ファイル名

とすることでviがファイルを開いた状態で起動します。指定したファイルがなければ新規のファイルとなります。たまに何かの設定ファイルを開いたつもりなのにまっさらな画面が表示され、保存しても設定が変わらないときがあります。それはファイル名かディレクトリ名を間違えている可能性が高いです。

ディレクトリ名もファイル名も何文字か入力しTABを押すと補完してくれます。補完されなかった場合は入力した文字で始まるファイルなどが複数あるということです。その状態でTABをもう一度押すと該当する一覧が表示されます。

こうしてviを起動します。

viのモード

ここがややこしいところですが、viはコマンドモードと挿入モードがあります。
起動時はコマンドモードになっています。ここでキーボードから色々なコマンドを入力することができますが、最低限覚えておけば良いのは iwqESCの4つだけです。
モードの切り替えに使うのは
iはコマンドモードから挿入モードへ
ESCはコマンドモードへ映ります。
今、自分がどちらのモードなのかわからない場合はとりあえずESCを連打しましょう。何回押してもコマンドモードになってくれます。

カーソルの移動

viのカーソル移動方法について調べていくとたくさんのコマンドが出てきます。検索や行へジャンプなどありますが、それはまたで大丈夫です。今のviはカーソルが使えます!キーボードの上下左右カーソルでスクロールしながら変更したい箇所をさがしましょう。

編集

変更したい箇所が見つかったら、iを押します。画面下部に

-- INSERT --

や挿入など表示されます。そうするともうなんでもできます。さらにカーソル移動するなり、BACKSPACEで1文字削除、RETURNで改行の挿入なりなんでもできます。必要な箇所を編集しましょう。

保存して終了

作業が完了したら保存して終了です。これを行うときには一旦コマンドモードに入ります。
ESCを押して:wq
と入力します。最初のESCを押した時点で画面下部の -- INSERT --は消え、


:wq

と入力したものがそのまま表示されます。そこでENTERを押します。そうするとうまくいけばもとのシェルの画面にもどります。

保存できない場合

開いているファイルに書き込み権限がなく保存できない場合があります。一旦終了しましょう。1文字も書き換えていなければ終了はコマンドモードで:qを押してENTERすると終了します。しかしどこかを編集していると変更しているのに保存せずに終了するのかと怒られます。
そんな時は:q!と入力しENTERします。そうすると保存せずに終了しシェルに戻れます。
その後書き込み権限を付加するなり

sudo vi ファイル名

と実行し管理者権限で実行するなりしてください。

まとめ

これでひとまず
1. viでファイルを開く

vi ファイル名

2. カーソル移動する
キーボードのカーソル使う 

3. 編集する
i
4. 保存して終了
ESC:wqENTER
まで完了するはずです。

おまけ

しかしやはり、カーソル移動について次のコマンドぐらい覚えておくと便利だと思います。
コマンドモードで
:数字ENTER 指定した数字の行にジャンプ
:文字ENTER 指定した文字の検索
n次の検索

これができると、テキストなどを見ていてこの設定を書き換えというとき、すぐ該当箇所を編集できます。

viはとても高機能なエディタでこれ以外にもたくさんのコマンドがあります。カーソルで移動などというとviを使いこなしておられる方からは怒られそうです。しかし、「viをマスターしたい」のではなく、今「このファイルを編集したい」という方の参考になれたらと思います。

clangd導入メモ

$
0
0

clangdとは

clangのLanguage Server Protocol実装。

LSPはMicrosoftが提唱しているIDE支援のための統一プロトコル。
Language "Server"とあるとおり、言語支援のためのサーバーが常駐する。この手の機構を個別に備えた言語として、TypeScriptのtsserverとか、C#のOmniSharpなどが挙げられるけど、それの汎用版。

clangdはLLVMのフロントであるclangをベースとしたサーバーで、LLVMプロジェクトが公式に開発している。
コンパイラなので、コンパイルエラーの検出はもちろん、コード補完やフォーマット、定義ジャンプと参照元ジャンプ等には対応している。
なので、clang-formatやRTagsといったclang系ツールも、LSPクライアントを導入してしまえば、これらの個別設定をしなくてよい。

clangdのインストール

macだと、brew install llvmとかするとclangdもインストールされるらしい。未確認。
僕は未だにmacports使ってたせいか、知らんうちに手元に入ってた。port install llvm-5.0で勝手にインストールされるらしい。

LLVMのソースからビルドする場合は、 https://clang.llvm.org/get_started.htmlあたりを読むべし。clangdはclang-tools-extraに入ってるので、svn coするのを忘れずに。

インストールしたら、 --versionで確認できるよ(以下はソースからビルドした版)。

$ clangd --version> LLVM (http://llvm.org/):>   LLVM version 6.0.0svn>   Optimized build with assertions.>   Default target: x86_64-apple-darwin16.7.0>   Host CPU: broadwell

エディタ側

vim

vimの場合は汎用LSPクライントをインストールし、こいつにclangdのパスを教えてやる流れ。

LSPクライアントはいくつかあるんだけど、僕は https://github.com/prabirshrestha/vim-lspを利用している。
他と使い比べたわけでもないんだけど、作者がMSの人だしLSP慣れてんのかなーと思ってこれ使ってる。

この人のpluginは vim / nvimの非同期周りを吸収するasync.vimってのが出てくるので、セットでインストールしておく。

Plug 'prabirshrestha/async.vim'
Plug 'prabirshrestha/vim-lsp'
letg:lsp_log_verbose =1letg:lsp_log_file = expand('~/vim-lsp.log')calllsp#register_server({
    \ 'name': 'clangd',
    \ 'cmd': {server_info->['clangd']},
    \ 'whitelist': ['c','cpp','objc','objcpp'],
    \ })" オムニ補完設定
autocmd FileType typescript setlocalomnifunc=lsp#complete

VSC

LLVMが拡張作ってるので、これを入れるがよろし。

vscode-clangd

また、user/projectの設定で、clangdの在処を直接指定することも可能。

{"clangd.path":"/absolute/path/to/clangd"}

compile_commands.json

clangdにコンパイラオプションとかを教える場合、compile_commands.jsonを作って、カレントディクレトリなりに置くとclangdがよしなに探索してくれる。
または clangd起動時に -compile-commands-dirオプションで、jsonファイルの在処を教える、でもよい。

compile_commands.jsonを作る方法はいくつかある。

例えばcmakeの場合は下記のように、 CMAKE_EXPORT_COMPILE_COMMANDSを有効にしてcmakeを実行すると、出力される。

cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=1 .

シンプルにMakefileのみのプロジェクトの場合、Bearを使う。

bear make

Bazelだと、

https://github.com/grailbio/bazel-compilation-database

とか

https://gist.github.com/bsilver8192/0115ee5d040bb601e3b7

があるようだが、きちんと確認してない。

neovim/vimでクリップボードと連携

$
0
0

neovim/vimでクリップボードと連携

環境

OS elementary OS 0.4.1 Loki
vim 7.4
neovim 0.2.3-dev

クリップボードと連携する方法

neovim/vimを起動して
"*yy
または
"+yy
でクリップボードと連携できるはず。

出来ない場合は、以下を実施。

neovimでクリップボードと連携


sudo apt-get install xsel

再度"*yを試せば、連携できるはず。
neovimでクリップボードと連携は、以上。

vimでクリップボードと連携


sudo apt-get install vim-gnome# これで通常のvimを起動時にもクリップボードと連携することが可能。

再度"*yを試せば、連携できるはず。
vimでクリップボードと連携は、以上。

参考

:h clipboard
https://qiita.com/clomsync/items/11fd415769d429b6f017
http://komagawa292.net/20140907/ubuntu-vim-clipboard/

vimの挿入モードで[br]コマンド(?)で[]が入力されて欲しい

$
0
0

vimの挿入モードで[br]コマンド(?)で[<br />]が入力されて欲しい

環境

vim 7.4

imapコマンドとinoremapコマンド

この二つのコマンドの違いは、
imap:再帰的にコマンド変換を適用する。
inoremap:コマンド変換は一度だけ。

# imapコマンドのイメージ
br -> <br /> -> <<br /> /> -> ・・・
↑↑   ↑↑↑↑↑↑↑
      ↑↑      ↑↑↑↑↑↑ 
# inoremapコマンドのイメージ
br -> <br />
↑↑   ↑↑↑↑↑↑↑

これは、
ノーマルモードでのマッピングでも同様です。

参考

:h recursive_mapping

vimのショートカットまとめ

$
0
0

vimをかっこ良く使いこなしたい(願望)

操作示す内容備考
dibカッコの中身を消してインサートモードbはbrackets(カッコ)の意味
vibカッコの中身を消してヴィジュアルモード

vim で .vue のシンタックスハイライトが死ぬ時の設定

$
0
0

https://github.com/posva/vim-vue#my-syntax-highlighting-stops-working-randomly

上記 README にも書いてあるが、「複数の言語が混ざってるファイルだと vim の効率よくシンタックスハイライトかけようとする機能が混乱してうまくいかないことがある」とのことで、下記を .vimrc なり .config/nvim/init.vim なりに書くのがよい。

autocmd FileType vue syntaxsync fromstart

vim-polyglotでシンタックスハイライトまとめて入れてるとついつい固有のオプションとかを見落とす。。

Macのvimを整えてからvimrcを晒す

$
0
0

開発ではvimを使っています。
vimにハイライト機能や補完機能といった諸々の機能をつけてIDEに近い形にしていきます。

なおvimの基本的な使い方(移動やビジュアルモードなど)は今回は対象外にしてます。
今回はあくまでvimの設定について述べます。

以下の順に沿って記していきます。

  1. なぜvimを使うか
  2. vimのREインストール
  3. 基本的なvimrcの設定
  4. vimプラグインの導入
  5. 最終的なvimrcの設定

なぜvimを使うか

言語によってツールを使い分けるのが面倒だった

専門は分析基盤ですが、pythonとシェルスクリプトを半々ずつ用いて開発しています。また、前職ではPHPがメインだったので、PyCharmとPHPStormを入れて開発してた時があります。言語によってツールを使い分けるのが面倒だったので、「自分でvimをカスタマイズして多言語に対応できるようにした方が楽」と思うようになりました。

開発環境のLinuxで直接編集がしたかった

サーバと同じ動きを再現するために、Vagrantを使ってローカルPC(Windows)上にVM(Linux)を立ち上げて開発環境としてました。一時期Windows上でAtomなどを使いスクリプトを編集してから、それをvagrant rsync-autoでWindowsとLinuxを同期することもしていたのですが、同期のスピードが遅くてやめました。「直接サーバ上で編集できるようなエディタが欲しい」と思うようになりました。

vimに慣れてしまうと抜け出せなくった

0$を使って行頭、行末にすぐに移動できたり、ciwを使ってすぐに単語を修正できたり、そういったvimの便利なコマンドを覚えてしまうと、「vim以外のエディタは不便」と感じるようになりました。

VimのREインストール

標準のvimでは足りない機能があるので、改めてvimを入れ直します。

前提となる環境

自宅で使っているMacBooK Airを用います。

2011 MacBook Air 3,1
1.4 GHz Intel Core 2 Duo
2 GB 1067 MHz DDR3
128 GB SSD
High Sierra 10.13.2

pyenv 1.1.5 + anaconda3-4.0.0でpython3を入れています。

標準のvimの設定を確認します。

~$ vim --version
VIM - Vi IMproved 8.0 (2016 Sep 12, compiled Jul 26201719:10:24)
Included patches: 1-503, 505-642
Compiled by root@apple.com
Normal version without GUI.  Features included (+) or not (-):
+acl             +file_in_path    -mouse_sgr       +tag_old_static
-arabic          +find_in_path    -mouse_sysmouse  -tag_any_white
+autocmd         +float           -mouse_urxvt     -tcl
-balloon_eval    +folding         +mouse_xterm     -termguicolors
-browse          -footer          +multi_byte      +terminfo
+builtin_terms   +fork()          +multi_lang      +termresponse
+byte_offset     -gettext         -mzscheme        +textobjects
+channel         -hangul_input    +netbeans_intg   +timers
+cindent         +iconv           +num64           +title
-clientserver    +insert_expand   +packages        -toolbar
-clipboard       +job             +path_extra      +user_commands
+cmdline_compl   +jumplist        -perl            +vertsplit
+cmdline_hist    -keymap          +persistent_undo +virtualedit
+cmdline_info    +lambda          +postscript      +visual
+comments        -langmap         +printer         +visualextra
-conceal         +libcall         -profile         +viminfo
+cryptv          +linebreak       +python/dyn      +vreplace
+cscope          +lispindent      -python3         +wildignore
+cursorbind      +listcmds        +quickfix        +wildmenu
+cursorshape     +localmap        +reltime         +windows
+dialog_con      -lua             -rightleft       +writebackup
+diff            +menu            +ruby/dyn        -X11
+digraphs        +mksession       +scrollbind      -xfontset
-dnd             +modify_fname    +signs           -xim
-ebcdic          +mouse           +smartindent     -xpm
-emacs_tags      -mouseshape      +startuptime     -xsmp
+eval            -mouse_dec       +statusline      -xterm_clipboard
+ex_extra        -mouse_gpm       -sun_workshop    -xterm_save
+extra_search    -mouse_jsbterm   +syntax
-farsi           -mouse_netterm   +tag_binary
   system vimrc file: "$VIM/vimrc"
     user vimrc file: "$HOME/.vimrc"
 2nd user vimrc file: "~/.vim/vimrc"
      user exrc file: "$HOME/.exrc"
       defaults file: "$VIMRUNTIME/defaults.vim"
  fall-back for$VIM: "/usr/share/vim"
Compilation: gcc -c -I. -Iproto -DHAVE_CONFIG_H   -DMACOS_X_UNIX  -g -O2 -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1
Linking: gcc   -L/usr/local/lib -o vim        -lm -lncurses  -liconv -framework Cocoa

ここから

  • クリップボード経由でコピペをしたいのでclipboardを有効に
  • 補完プラグインneocompleteを用いたいのでluaを有効に
  • pythonの補完プラグインjedi-vimでpython3を使いたいのでpython3を有効に

の3点に気をつけてREインストールします。

~$ brew install lua
~$ brew install vim --with-lua --with-python3

すると、/usr/local/bin/vimとして新しいvimが入ります。しかし

~$ which vim
/usr/bin/vim

のようにまだ標準のvimを指していますので、export PATH=/usr/local/bin:$PATH.bash_profileに書き込み、/usr/local/binが優先的に読み込まれるようにします。

~$ source .bash_profile
~$ which vim
/usr/local/bin/vim

これでREインストール完了です。上記3つの機能がつけられていることを見ましょう。

~$ vim --version
VIM - Vi IMproved 8.0 (2016 Sep 12, compiled Dec 28201720:00:41)
macOS version
Included patches: 1-1400
Compiled by Homebrew
Huge version without GUI.  Features included (+) or not (-):
+acl               +farsi             +mouse_sgr         -tag_any_white
+arabic            +file_in_path      -mouse_sysmouse    -tcl
+autocmd           +find_in_path      +mouse_urxvt       +termguicolors
-autoservername    +float             +mouse_xterm       +terminal
-balloon_eval      +folding           +multi_byte        +terminfo
+balloon_eval_term -footer            +multi_lang        +termresponse
-browse            +fork()            -mzscheme          +textobjects
++builtin_terms    -gettext           +netbeans_intg     +timers
+byte_offset       -hangul_input      +num64             +title
+channel           +iconv             +packages          -toolbar
+cindent           +insert_expand     +path_extra        +user_commands
-clientserver      +job               +perl              +vertsplit
+clipboard         +jumplist          +persistent_undo   +virtualedit
+cmdline_compl     +keymap            +postscript        +visual
+cmdline_hist      +lambda            +printer           +visualextra
+cmdline_info      +langmap           +profile           +viminfo
+comments          +libcall           -python            +vreplace
+conceal           +linebreak         +python3           +wildignore
+cryptv            +lispindent        +quickfix          +wildmenu
+cscope            +listcmds          +reltime           +windows
+cursorbind        +localmap          +rightleft         +writebackup
+cursorshape       +lua               +ruby              -X11
+dialog_con        +menu              +scrollbind        -xfontset
+diff              +mksession         +signs             -xim
+digraphs          +modify_fname      +smartindent       -xpm
-dnd               +mouse             +startuptime       -xsmp
-ebcdic            -mouseshape        +statusline        -xterm_clipboard
+emacs_tags        +mouse_dec         -sun_workshop      -xterm_save
+eval              -mouse_gpm         +syntax
+ex_extra          -mouse_jsbterm     +tag_binary
+extra_search      +mouse_netterm     +tag_old_static
   system vimrc file: "$VIM/vimrc"
     user vimrc file: "$HOME/.vimrc"
 2nd user vimrc file: "~/.vim/vimrc"
      user exrc file: "$HOME/.exrc"
       defaults file: "$VIMRUNTIME/defaults.vim"
  fall-back for$VIM: "/usr/local/share/vim"
Compilation: clang -c -I. -Iproto -DHAVE_CONFIG_H   -DMACOS_X -DMACOS_X_DARWIN  -g -O2 -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1
Linking: clang   -L.             -L /BuildRoot/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.Internal.sdk/usr/local/libressl/lib -L/BuildRoot/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.Internal.sdk/usr/local/lib  -L/usr/local/lib -o vim        -lm  -lncurses -liconv -framework AppKit  -L/usr/local/lib -llua -fstack-protector  -L/System/Library/Perl/5.18/darwin-thread-multi-2level/CORE -lperl  -L/Users/daiki_akimoto/.pyenv/versions/anaconda3-4.0.0/lib/python3.5/config-3.5m -lpython3.5m -framework CoreFoundation  -lruby.2.3.0 -lobjc

さらにvim内のpython3のpathがpyenvでインストールされたものになっているかも確認します。

$ vim
:python3 import sys; print(sys.version)3.5.4 | packaged by conda-forge |(default, Dec  92017, 16:23:28)[GCC 4.2.1 Compatible Apple LLVM 6.1.0 (clang-602.0.53)]

基本的なvimrcの設定

お気に入りの配色の配置

vimの配色はvim-hybridがお気に入りなので、予めこれを色の選択肢の中に入れておきます。

~$ mkdir -p git/github.com/w0ng/
~$ cd git/github.com/w0ng/
~/git/github.com/w0ng$ git clone https://github.com/w0ng/vim-hybrid.git
~/git/github.com/w0ng$ cp vim-hybrid/colors/hybrid.vim /usr/local/share/vim/vim80/colors/

vimrcの中身

プラグインを入れる前の基本的なvimの設定は下記になります。

""" release autogroup in MyAutoCmd
augroup MyAutoCmd
    autocmd!
augroup END""" 表示関係sett_Co=256setbackground=darkcolorscheme hybridsyntaxonsetlist" 不可視文字の可視化setnumber" 行番号の表示setruler" カーソル位置が右下に表示されるsetwildmenu" コマンドライン補完が強力になるsetshowcmd" コマンドを画面の最下部に表示するsetwrap" 長いテキストの折り返しsettextwidth=0" 自動的に改行が入るのを無効化setcolorcolumn=80" その代わり80文字目にラインを入れるsetcursorline" その代わり80文字目にラインを入れる" 前時代的スクリーンベルを無効化sett_vb=setnovisualbellsetfoldmethod=indent    " 折り畳みsetfoldlevel=100" ファイルを開くときに折り畳みをしない""" 編集関係setinfercase" 補完時に大文字小文字を区別しないsetvirtualedit=all" カーソルを文字が存在しない部分でも動けるようにするsethidden" バッファを閉じる代わりに隠す(Undo履歴を残すため)setswitchbuf=useopen   " 新しく開く代わりにすでに開いてあるバッファを開くsetshowmatch" 対応する括弧などをハイライト表示するsetmatchtime=3" 対応括弧のハイライト表示を3秒にするsetautoindent" 改行時にインデントを引き継いで改行するsetshiftwidth=4" インデントにつかわれる空白の数auBufNewFile,BufRead *.yml setshiftwidth=2setsofttabstop=4" <Tab>押下時の空白数setexpandtab" <Tab>押下時に<Tab>ではなく、ホワイトスペースを挿入するsettabstop=4" <Tab>が対応する空白の数auBufNewFile,BufRead *.yml settabstop=2setshiftround" '<'や'>'でインデントする際に'shiftwidth'の倍数に丸めるsetnf=" インクリメント、デクリメントを10進数にする" 対応括弧に'<'と'>'のペアを追加setmatchpairs& matchpairs+=<:>" バックスペースでなんでも消せるようにするsetbackspace=indent,eol,start" クリップボードをデフォルトのレジスタとして指定。後にYankRingを使うので" 'unnamedplus'が存在しているかどうかで設定を分ける必要があるif has('unnamedplus')setclipboard& clipboard+=unnamedplus,unnamedelsesetclipboard& clipboard+=unnamedendif" Swapファイル, Backupファイルを全て無効化するsetnowritebackupsetnobackupsetnoswapfile""" 検索関係setignorecase" 大文字小文字を区別しないsetsmartcase" 検索文字に大文字がある場合は大文字小文字を区別setincsearch" インクリメンタルサーチsethlsearch" 検索マッチテキストをハイライト" バックスラッシュやクエスチョンを状況に合わせ自動的にエスケープ
cnoremap <expr>/ getcmdtype() == '/' ? '\/' : '/'
cnoremap <expr> ? getcmdtype()=='?' ? '\?' : '?'""" マクロおよびキー設定" ESCを二回押すことでハイライトを消す
nmap <silent><Esc><Esc> :nohlsearch<CR>" カーソル下の単語を * で検索vnoremap<silent> * "vy/\V<C-r>=substitute(escape(@v, '\/'), "\n",'\\n','g')<CR><CR>" 検索後にジャンプした際に検索単語を画面中央に持ってくるnnoremapn nzznnoremap N Nzznnoremap * *zznnoremap # #zznnoremapg* g*zznnoremapg# g#zz" j, k による移動を折り返されたテキストでも自然に振る舞うように変更nnoremapj gjnnoremapk gk" TABにて対応ペアにジャンプnnoremap<Tab> %vnoremap<Tab> %" [ と打ったら [] って入力されてしかも括弧の中にいる(以下同様)inoremap [ []<left>inoremap(()<left>inoremap { {}<left>inoremap" ""<left>inoremap' ''<left>" Ctrl + hjkl でウィンドウ間を移動nnoremap<C-h><C-w>hnnoremap<C-j><C-w>jnnoremap<C-k><C-w>knnoremap<C-l><C-w>l" Shift + 矢印でウィンドウサイズを変更nnoremap<S-Left><C-w><<CR>nnoremap<S-Right><C-w>><CR>nnoremap<S-Up><C-w>-<CR>nnoremap<S-Down><C-w>+<CR>" タブ間の移動nnoremap<C-n> gtnnoremap<C-p> gT" :e などでファイルを開く際にフォルダが存在しない場合は自動作成function! s:mkdir(dir, force)if!isdirectory(a:dir)&& (a:force ||
        \ input(printf('"%s" does not exist. Create? [y/N]',a:dir))=~? '^y\%[es]$')call mkdir(iconv(a:dir,&encoding,&termencoding),'p')endifendfunction
autocmd MyAutoCmd BufWritePre * call s:mkdir(expand('<afile>:p:h'),v:cmdbang)" vim 起動時のみカレントディレクトリを開いたファイルの親ディレクトリに指定function! s:ChangeCurrentDir(directory, bang)ifa:directory==''lcd %:p:helse
        execute 'lcd' . a:directoryendififa:bang ==''pwdendifendfunction
autocmd MyAutoCmd VimEnter * call s:ChangeCurrentDir('','')

vimプラグインの導入

vimプラグインの管理にはdein.vimを用います。

~$ mkdir -p ~/.vim/dein/repos/github.com/Shougo/
~$ git clone https://github.com/Shougo/dein.vim.git ~/.vim/dein/repos/github.com/Shougo/dein.vim

上記でgitから持ってきて

~$ vim
:call dein#install()

でインストールします。これによって下記のようにプラグインを簡単に入れることができます。

" *******************************************************" dein" *******************************************************if&compatiblesetnocompatibleendifsetruntimepath+=~/.vim/dein/repos/github.com/Shougo/dein.vimif dein#load_state(expand('~/.vim/dein'))call dein#begin(expand('~/.vim/dein'))call dein#add('Shougo/dein.vim')call dein#add('Shougo/neocomplete.vim')" vimの補完機能call dein#add('Shougo/neosnippet.vim')" vimのsnippet機能。:NeoSnippetEditで編集可能。call dein#add('Shougo/neosnippet-snippets')" 基本的なsnippetのセットcall dein#add('scrooloose/nerdtree')" ディレクトリをツリー表示できるcall dein#add('vim-syntastic/syntastic')" 構文チェック。linterは適宜追加。call dein#add('tpope/vim-fugitive.git')" vim内でgitを扱えるようにするcall dein#add('tpope/vim-surround')" 「テキストを囲うもの」の編集を行うcall dein#add('vim-scripts/YankRing.vim')" テキストコピーの履歴を順々に参照できる。<C-p>, <C-n>で循環。call dein#add('davidhalter/jedi-vim', {'on_ft': 'python'})" pythonの高機能な補完機能。call dein#end()call dein#save_state()endiffiletype plugin indent onsyntax enable" If you want to install not installed plugins on startup.if dein#check_install()call dein#install()endif

最終的なvimrcの設定

pythonの構文チェックではflake8を用いるので、予めインストールしておきます。

conda install flake8

プラグインの設定等も合わせた最終的なvimrcの設定は以下の通りとなります。

""" release autogroup in MyAutoCmd
augroup MyAutoCmd
    autocmd!
augroup END""" 表示関係sett_Co=256setbackground=darkcolorscheme hybridsyntaxonsetlist" 不可視文字の可視化setnumber" 行番号の表示setruler" カーソル位置が右下に表示されるsetwildmenu" コマンドライン補完が強力になるsetshowcmd" コマンドを画面の最下部に表示するsetwrap" 長いテキストの折り返しsettextwidth=0" 自動的に改行が入るのを無効化setcolorcolumn=80" その代わり80文字目にラインを入れるsetcursorline" その代わり80文字目にラインを入れる" 前時代的スクリーンベルを無効化sett_vb=setnovisualbellsetfoldmethod=indent    " 折り畳みsetfoldlevel=100" ファイルを開くときに折り畳みをしない""" 編集関係setinfercase" 補完時に大文字小文字を区別しないsetvirtualedit=all" カーソルを文字が存在しない部分でも動けるようにするsethidden" バッファを閉じる代わりに隠す(Undo履歴を残すため)setswitchbuf=useopen   " 新しく開く代わりにすでに開いてあるバッファを開くsetshowmatch" 対応する括弧などをハイライト表示するsetmatchtime=3" 対応括弧のハイライト表示を3秒にするsetautoindent" 改行時にインデントを引き継いで改行するsetshiftwidth=4" インデントにつかわれる空白の数auBufNewFile,BufRead *.yml setshiftwidth=2setsofttabstop=4" <Tab>押下時の空白数setexpandtab" <Tab>押下時に<Tab>ではなく、ホワイトスペースを挿入するsettabstop=4" <Tab>が対応する空白の数auBufNewFile,BufRead *.yml settabstop=2setshiftround" '<'や'>'でインデントする際に'shiftwidth'の倍数に丸めるsetnf=" インクリメント、デクリメントを10進数にする" 対応括弧に'<'と'>'のペアを追加setmatchpairs& matchpairs+=<:>" バックスペースでなんでも消せるようにするsetbackspace=indent,eol,start" クリップボードをデフォルトのレジスタとして指定。後にYankRingを使うので" 'unnamedplus'が存在しているかどうかで設定を分ける必要があるif has('unnamedplus')setclipboard& clipboard+=unnamedplus,unnamedelsesetclipboard& clipboard+=unnamedendif" Swapファイル, Backupファイルを全て無効化するsetnowritebackupsetnobackupsetnoswapfile""" 検索関係setignorecase" 大文字小文字を区別しないsetsmartcase" 検索文字に大文字がある場合は大文字小文字を区別setincsearch" インクリメンタルサーチsethlsearch" 検索マッチテキストをハイライト" バックスラッシュやクエスチョンを状況に合わせ自動的にエスケープ
cnoremap <expr>/ getcmdtype() == '/' ? '\/' : '/'
cnoremap <expr> ? getcmdtype()=='?' ? '\?' : '?'""" マクロおよびキー設定" ESCを二回押すことでハイライトを消す
nmap <silent><Esc><Esc> :nohlsearch<CR>" カーソル下の単語を * で検索vnoremap<silent> * "vy/\V<C-r>=substitute(escape(@v, '\/'), "\n",'\\n','g')<CR><CR>" 検索後にジャンプした際に検索単語を画面中央に持ってくるnnoremapn nzznnoremap N Nzznnoremap * *zznnoremap # #zznnoremapg* g*zznnoremapg# g#zz" j, k による移動を折り返されたテキストでも自然に振る舞うように変更nnoremapj gjnnoremapk gk" TABにて対応ペアにジャンプnnoremap<Tab> %vnoremap<Tab> %" [ と打ったら [] って入力されてしかも括弧の中にいる(以下同様)inoremap [ []<left>inoremap(()<left>inoremap { {}<left>" inoremap " ""<left>" inoremap ' ''<left>" Ctrl + hjkl でウィンドウ間を移動nnoremap<C-h><C-w>hnnoremap<C-j><C-w>jnnoremap<C-k><C-w>knnoremap<C-l><C-w>l" Shift + 矢印でウィンドウサイズを変更nnoremap<S-Left><C-w><<CR>nnoremap<S-Right><C-w>><CR>nnoremap<S-Up><C-w>-<CR>nnoremap<S-Down><C-w>+<CR>" タブ間の移動nnoremap<C-n> gtnnoremap<C-p> gT" :e などでファイルを開く際にフォルダが存在しない場合は自動作成function! s:mkdir(dir, force)if!isdirectory(a:dir)&& (a:force ||
        \ input(printf('"%s" does not exist. Create? [y/N]',a:dir))=~? '^y\%[es]$')call mkdir(iconv(a:dir,&encoding,&termencoding),'p')endifendfunction
autocmd MyAutoCmd BufWritePre * call s:mkdir(expand('<afile>:p:h'),v:cmdbang)" vim 起動時のみカレントディレクトリを開いたファイルの親ディレクトリに指定function! s:ChangeCurrentDir(directory, bang)ifa:directory==''lcd %:p:helse
        execute 'lcd' . a:directoryendififa:bang ==''pwdendifendfunction
autocmd MyAutoCmd VimEnter * call s:ChangeCurrentDir('','')" *******************************************************" dein" *******************************************************if&compatiblesetnocompatibleendifsetruntimepath+=~/.vim/dein/repos/github.com/Shougo/dein.vimif dein#load_state(expand('~/.vim/dein'))call dein#begin(expand('~/.vim/dein'))call dein#add('Shougo/dein.vim')call dein#add('Shougo/neocomplete.vim')" vimの補完機能call dein#add('Shougo/neosnippet.vim')" vimのsnippet機能。:NeoSnippetEditで編集可能。call dein#add('Shougo/neosnippet-snippets')" 基本的なsnippetのセットcall dein#add('scrooloose/nerdtree')" ディレクトリをツリー表示できるcall dein#add('vim-syntastic/syntastic')" 構文チェック。linterは適宜追加。call dein#add('tpope/vim-fugitive.git')" vim内でgitを扱えるようにするcall dein#add('tpope/vim-surround')" 「テキストを囲うもの」の編集を行うcall dein#add('vim-scripts/YankRing.vim')" テキストコピーの履歴を順々に参照できる。<C-p>, <C-n>で循環。call dein#add('davidhalter/jedi-vim', {'on_ft': 'python'})" pythonの高機能な補完機能。call dein#end()call dein#save_state()endiffiletype plugin indent onsyntax enable" If you want to install not installed plugins on startup.if dein#check_install()call dein#install()endif" *******************************************************" neocomplete" *******************************************************" Disable AutoComplPop.letg:acp_enableAtStartup =0" Use neocomplete.letg:neocomplete#enable_at_startup =1" Use smartcase.letg:neocomplete#enable_smart_case =1" Set minimum syntax keyword length.letg:neocomplete#sources#syntax#min_keyword_length =3" Plugin key-mappings.inoremap<expr><C-g>     neocomplete#undo_completion()inoremap<expr><C-l>     neocomplete#complete_common_string()" Recommended key-mappings." <CR>: close popup and save indent.inoremap<silent><CR><C-r>=<SID>my_cr_function()<CR>function! s:my_cr_function()return(pumvisible() ? "\<C-y>" : "") . "\<CR>"endfunction" <TAB>: completion.inoremap<expr><TAB>  pumvisible() ? "\<C-n>" : "\<TAB>"" <C-h>, <BS>: close popup and delete backword char.inoremap<expr><C-h> neocomplete#smart_close_popup()."\<C-h>"inoremap<expr><BS> neocomplete#smart_close_popup()."\<C-h>"" Enable omni completion.
autocmd FileType css setlocalomnifunc=csscomplete#CompleteCSS
autocmd FileType html,markdown setlocalomnifunc=htmlcomplete#CompleteTags
autocmd FileType javascript setlocalomnifunc=javascriptcomplete#CompleteJS
autocmd FileType xml setlocalomnifunc=xmlcomplete#CompleteTags" *******************************************************" neosnippet" *******************************************************" Plugin key-mappings.
imap <C-k><Plug>(neosnippet_expand_or_jump)smap<C-k><Plug>(neosnippet_expand_or_jump)
xmap <C-k><Plug>(neosnippet_expand_target)" SuperTab like snippets behavior."imap <expr><TAB>" \ pumvisible() ? "\<C-n>" :" \ neosnippet#expandable_or_jumpable() ?" \    "\<Plug>(neosnippet_expand_or_jump)" : "\<TAB>"smap<expr><TAB> neosnippet#expandable_or_jumpable() ?
\ "\<Plug>(neosnippet_expand_or_jump)" : "\<TAB>"" For conceal markers.if has('conceal')setconceallevel=2concealcursor=nivendif"set snippet file dirletg:neosnippet#snippets_directory='~/.vim/snippets'" *******************************************************" NERDTree" *******************************************************" ブックマーク初期表示letg:NERDTreeShowBookmarks=1"letg:NERDTreeChDirMode=2" windowサイズ設定letg:NERDTreeWinSize=20" 表示したくないファイル、ディレクトリletg:NERDTreeIgnore=['\.DS_Store$','\.swp$','\~$','\.so']nnoremap<silent><C-e> :NERDTreeToggle<CR>" vim起動時に常に表示" autocmd vimenter * NERDTree" NERDTreeだけが残る場合はvim終了
autocmd bufenter * if(winnr("$")==1&& exists("b:NERDTree")&& b:NERDTree.isTabTree())|q|endif" *******************************************************" syntastic" *******************************************************setstatusline+=%#warningmsg#setstatusline+=%{SyntasticStatuslineFlag()}setstatusline+=%*letg:syntastic_always_populate_loc_list =1letg:syntastic_auto_loc_list =1letg:syntastic_check_on_open =1letg:syntastic_check_on_wq =0letg:syntastic_python_checkers = ['flake8']letg:syntastic_python_flake8_args="--max-line-length=80"" *******************************************************" jedi" *******************************************************letg:jedi#popup_on_dot =0letg:jedi#popup_select_first =0letg:jedi#completions_command ="<S-Tab>"
autocmd FileType python setlocalcompleteopt-=preview

Vim で Prettier を使って自動的に整形する

$
0
0

vim-prettier を使えと prettier 公式が言っている。

https://github.com/prettier/vim-prettier

が、不要な機能が入っているので軽く使いたい場合に面倒だなあと思って ftplugin を書いた。

https://github.com/januswel/javascript.vim

SearchPrettierは Windows を考慮していないが \に置き換えれば動くと思う。

https://github.com/januswel/javascript.vim/blob/master/ftplugin/javascript.vim#L21

npm を使いながら開発しているとそもそもプロジェクトごとにツールチェインが違うので問答無用でグローバルインストールされるのは困る。なので、プロジェクトローカルから親階層に遡っていって最初に見つかった prettier と、そこから近い .prettierrc を使うようにしている。なければグローバルにフォールバック。それでも見つからない場合は動かない。

WindowsのVim8でYouCompleteMeをインストールする

$
0
0

公式に詳しい手順は書いているのですが、手順通りに進めても上手く行かない箇所があったため、備忘録を兼ねてYouCompleteMe(以下YCM)をインストールする手順を残します。

デモ

C++の補完もちゃんと動く
cpp-fs8.png

C#のLINQもちゃんと補完してくれる
rapture-fs8.png

環境

環境はすべて64bitです。

  • Windows 10 Pro
  • Visual Studio Community 2017
    • C++は必須。
    • C#の補完もするならC#も、追加でC++インストール時のMSBuildも必要。
  • LLVM 5.0.0
    • 5.0.0じゃないといけない、5.0.1だと上手くいかなかった。
    • ダウンロード: Pre-Built Binaries:のClang for Windows (64-bit)
  • Python 3.5.x(リンクは3.5.4)
    • ダウンロード: Windows x86-64 executable installer
  • Git

また、Vimの環境は次の通りです。

YCMのインストール

  • 1. vimrcにYCMを追加
vimrc
NeoBundle 'Valloric/YouCompleteMe'
  • 2. YCMプラグインフォルダへ

path\to.vim\bundle\YouCompleteMe\third_party\ycmd\cpp\ycm\CMakeLists.txt
を開き、LLVMへのパスを追加する

CMakeLists.txt
# 25行あたり
set( PATH_TO_LLVM_ROOT "path/to/LLVM" CACHE PATH "Path to the root of a LLVM+Clang binary distribution" )
  • 3. YCMのビルド

コマンドプロンプトを「VS 2017用 x64 Native Tools コマンドプロンプト」で開き、
MSBuild.exeとcmake.exeにパスを通す

※パスは省略

コマンドプロンプト
**********************************************************************
** Visual Studio 2017 Developer Command Prompt v15.5.2
** Copyright (c) 2017 Microsoft Corporation
**********************************************************************
[vcvarsall.bat] Environment initialized for: 'x64'>where msbuild
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\15.0\Bin\MSBuild.exe
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\MSBuild.exe>where cmake
情報: 与えられたパターンのファイルが見つかりませんでした。

>set path=C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\CommonExtensions\Microsoft\CMake\CMake\bin;%path%>where cmake
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\CommonExtensions\Microsoft\CMake\CMake\bin\cmake.exe

このままYCMのパスへ行き、念のためgit submodule udpateをしておく

コマンドプロンプト
path\.vim\bundle\YouCompleteMe>git submodule update --init --recursive

ようやくビルド、pythonによるビルド時のビルドオプションに補完したい言語を指定する、
--allを指定すると、C-family(C、C++、Objective C、Objective C++)、C#、Python、Go、TypeScript、JavaScript、Rustでコード補完が効くようになる。

コマンドプロンプト
path\.vim\bundle\YouCompleteMe>python install.py --all

ビルドに10分くらいかかる

C++用の設定

C++の補間用の設定にthird_party\ycmd\examples.ycm_extra_conf.pyをコピーして使う。
自分はユーザーホームディレクトリに置いてるのでvimrcにそれを読み込むように設定する。

vimrc
let g:ycm_global_ycm_extra_conf = $HOME . '/.ycm_extra_conf.py'

このままではC++の補完が効かないのでC++ヘッダのincludeディレクトリを設定するのだが、この時にVisual Studio 2015(VC14)のだと上手くいった。2

~/.ycm_extra_conf.py
flags = [
'-Wall',
'-Wextra',
# '-Werror',
'-fexceptions',
'-DNDEBUG',
'-std=c++14',
'-x',
'c++',
# C++
'-I',
'C:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/include',
# Boost
'-I',
'E:/SDKs/boost_1_65_1',
]

参考


  1. dein.vimでYCMをインストールすると、:YcmRestartServerをしても補完サーバーが起動しない謎挙動にぶつかった。 

  2. 他のヘッダ(VS2017やmsys2上のGCCなど)だと、補完時にバグったような挙動になった。 

vim初心者

$
0
0

まだプログラミング歴は2年と浅いのですが、
最近使うエディタを変えました。
最初は学校での作業が多かったのでemacsを、
自分のノートPCでの作業は増えてからはatomを、
そして最近、vimを使い始めました。

atomを使い始めた頃、
色もカラフルに分けてくれるし
カッコを開いたら同時に閉じカッコも出してくれる。
段落も勝手に作ってくれるし最高じゃん!って思ってました。

そう、atomはとっても高性能エディタであることは間違い無いのです。
不満はありません。
vimを知らなければずっとatom最高!って思ってたでしょう。

でも、、、vimに出会ってしまいました。

どこでも使える

vimはCUIベースで動くのでCPUのスペックなどを問わず、いつでも動いてくれます。
逆に、commandに対してgraphicalなインターフェースをGUIと言いますよね。
GUIではマウスを使って操作するので、
それなりの解像度や、CPUのスペックが必要なのですが
vimはそれが無いので、どんな環境でも動いてくれます。

軽くて早い

私はまだまだまだ初心者なので軽さとか早さとかに感動することは稀なんですが、
世間のvimmerさんたちはこれがすごくいいみたいです。
私もきっと将来的にはこの軽さに助けられるんでしょう。笑
先ほども述べましたがCUIベースで動くことを踏まえれば軽くて早いのも納得ですよね。

キーボードだけで操作が可能

CPU上で動かすので当然なんですが、
私はvimのコマンド操作にびっくりしました。

矢印を使わないんですね、矢印を。

その結果何が起きたかというとホームポジションからほとんど手が動かないんです。
この快適さ。
本当にびっくりしました。
キーボードだけで全て完結することも感動的なのに、
手の移動がこんなに少ないなんて、、、

vimに慣れると高速に編集することができるようになるって納得です。
これ慣れたらすごいことになりそう。

最後に

ここまで読んでくださってありがとうございます。
ミスや間違い等ありましたらコメントください。
vimについてはいろんな人の記事を読ませていただきましたが、
知れば知るほど抜け出せなくなるエディタらしいです。
でもその分最初の習得に時間がかかるんだとか。
何はともあれどこでも使えるんだから慣れておくに越したことはないです。
もっとvimを知っていきたいと思います。

VIMの矩形選択

$
0
0

いつも忘れるんで、メモである。

vimの矩形選択はcntl+Vである。
ここで、矩形を選択できる。

普通は、これで、ヤンク(y)してペースト(p)するぐらいだが・・

さらには、選択後にIとするとインサートモードになって、
上の一行に文字を追加したあとescでインサートモードを終了すると、
全行にその追加文字を追加できるという優れものである。

コメントを追加するなんて、お手の物という感じである。

問題は文末なのだが、最後の行を選択するときに文末$を指定すると
行の文末まで指定するという意味になる。
当然Aで文字を追加すると、きれいに全行の文末に追加するという
仕様である。

いやいや、りっぱりっぱ!

neovimで検索時のハイライトをオフにする

$
0
0

neovim(vim)で検索時のハイライトを一時的にオフにする

環境

neovim 0.2.3-dev

状況

neovimでは、検索時に、検索した単語がハイライト表示される。
一時的に、そのハイライトを消すには以下のコマンドを実行する。

:nohlsearch

# または以下でも可
:noh

常にハイライト表示を無効にする場合は、以下で設定する。

:setnohlsearch

逆に、ハイライト表示を有効にする場合は、以下で設定する。

:sethlsearch

参考

:h hlsearch
https://qiita.com/ysti/items/ac9ca59d76fc1d2099f6

Xcode9をVimキーバインドで使う手順

$
0
0

Xcode9にXVim2を入れてVimキーバインドで使えるようにする手順です。

  1. 証明書の作成
    XVim2を利用するには証明書が必要になります。
    Xcodeを終了した状態でキーチェーンアクセスを開き、
    [キーチェーンアクセス]->[証明書アシスタント]->[証明書を作成]
    証明書は自己署名ルート、コード署名で作成します。
    sample.png
    証明書名はなんでもOKなので、ここではXcodeSignerとしておきます。
    作成した証明書をXcodeに紐付けます。
    $ sudo codesign -f -s XcodeSigner /Applications/Xcode.app

  2. ソースコードの入手
    GitHubよりソースコードをCloneします。
    $ git clone https://github.com/XVimProject/XVim2

  3. Xcodeのパスを確認
    $ xcode-select -p
    /Applications/Xcode.app/Contents/Developerと出力されればOKです。
    パスがセットされていない場合は、xcode-select -sを使ってセットします。

  4. ビルド
    XVim2のルートディレクトリでmakeします。
    $ make

  5. XCodeの起動
    XVim2をロードするかのダイアログが表示されるので、Load Bundleを選択します。
    Vimのキーバインドによる操作が可能になればインストール完了です。

Simple Vim plugin manager.

$
0
0

久しぶり(2年ぶり?)にVimの設定を見直そうとして調べたところ、Vim 8.0からパッケージ機能に対応して、このパッケージ機能を使用してプラグインを簡単に管理できそうです。

.vimrcにプラグインマネージャーの設定を書かなくても、ダウンロードしたプラグインを.vim/packに配置するだけで、起動時にプラグインが読み込まれるようです。

パッケージ機能の詳細は以下の記事に詳しく記載されているので、そちらをご参照ください。

Vim 8 時代のがんばらないプラグイン管理のすすめ

Vim 8.0 Advent Calendar 6 日目 パッケージ

パッケージとプラグインの配置

~/.vim|--pack||--pack1|||--start||||--plugin1||||--plugin2|||--opt||||--plugin3||||--plugin4||--pack2

パッケージ機能でpack1pack2と分ける理由がよくわからなかったので、pack1を1つだけ用意して管理したほうが楽かも。

pack1の扱いをどうするか考えた結果、プロファイルとして扱った方が正解かな?(profileと読替えても違和感はないので...)

プロファイル管理用の.vim/profilesを用意して、リンクを.vim/pack/profileに貼る。
有効にするプロファイルは1つだけにして、.vim/pack/profileのリンクを切り替える方がスマートに管理できそう。

プロファイル毎にプラグインをインストールするとアップデートが大変になるので、プラグイン管理用の.vim/pluginsを用意して、各プロファイルにプラグインのリンクを貼るほうが良さそう。

最終的なフォルダ構成は以下のようになりました。

フォルダ構成

~/|--.vim||--pack|||--profile  ->  ../profiles/p0||--plugins|||--plugin1|||--plugin2||--profiles|||--p0||||--start|||||--plugin1  -> ../../../plugins/plugin1||||--opt|||||--plugin2  -> ../../../plugins/plugin2||--vimrc.d|--.vimrc

ここまでくるとプラグインの管理が複雑になって、プロファイルやプラグインのリンクを貼るのが大変...

プラグイン管理用のコマンドを作成するしかないかな...

プラグイン毎の設定は.vim/.vimrc.dに配置して、.vimrcから読み込むべきかな?

.vimrc
source ~/.vim/vimrc.d/plugin1.vimsource ~/.vim/vimrc.d/plugin2.vim

プラグイン管理

プラグインの管理が複雑になったので、プラグイン管理用のコマンドを作成しました。

コマンドはGitHubで公開しています。
grayfox

コマンドの使用例です。

プラグインのインストール。インストール先は~/.vim/plugins/です。

grayfox install 'altercation/vim-colors-solarized'

プラグインのアンインストール。

grayfox uninstall 'altercation/vim-colors-solarized'

プロファイルの作成。プロファイルの作成先は~/.vim/profiles/<profile>です。

grayfox create MyProfile1

作成したプロファイルを使用する。

grayfox use MyProfile1

プロファイルの削除。

grayfox remove MyProfile1

プラグインの有効。

grayfox enable'altercation/vim-colors-solarized'

プラグインの無効。

grayfox disable 'altercation/vim-colors-solarized'

まとめ

これでVimのプラグインの管理がしやすくなったかな...

関連記事

Vim 8 時代のがんばらないプラグイン管理のすすめ

Vim 8.0 Advent Calendar 6 日目 パッケージ


vim

$
0
0

まだプログラミング歴は2年と浅いのですが、
最近使うエディタを変えました。
最初は学校での作業が多かったのでemacsを、
自分のノートPCでの作業は増えてからはatomを、
そして最近、vimを使い始めました。

atomを使い始めた頃、
色もカラフルに分けてくれるし
カッコを開いたら同時に閉じカッコも出してくれる。
段落も勝手に作ってくれるし最高じゃん!って思ってました。

そう、atomはとっても高性能エディタであることは間違い無いのです。
不満はありません。
vimを知らなければずっとatom最高!って思ってたでしょう。

でも、、、vimに出会ってしまいました。

どこでも使える

vimはCUIベースで動くのでCPUのスペックなどを問わず、いつでも動いてくれます。
逆に、commandに対してgraphicalなインターフェースをGUIと言いますよね。
GUIではマウスを使って操作するので、
それなりの解像度や、CPUのスペックが必要なのですが
vimはそれが無いので、どんな環境でも動いてくれます。

軽くて早い

私はまだまだまだ初心者なので軽さとか早さとかに感動することは稀なんですが、
世間のvimmerさんたちはこれがすごくいいみたいです。
私もきっと将来的にはこの軽さに助けられるんでしょう。笑
先ほども述べましたがCUIベースで動くことを踏まえれば軽くて早いのも納得ですよね。

キーボードだけで操作が可能

CPU上で動かすので当然なんですが、
私はvimのコマンド操作にびっくりしました。

矢印を使わないんですね、矢印を。

その結果何が起きたかというとホームポジションからほとんど手が動かないんです。
この快適さ。
本当にびっくりしました。
キーボードだけで全て完結することも感動的なのに、
手の移動がこんなに少ないなんて、、、

vimに慣れると高速に編集することができるようになるって納得です。
これ慣れたらすごいことになりそう。

最後に

ここまで読んでくださってありがとうございます。
ミスや間違い等ありましたらコメントください。
vimについてはいろんな人の記事を読ませていただきましたが、
知れば知るほど抜け出せなくなるエディタらしいです。
でもその分最初の習得に時間がかかるんだとか。
何はともあれどこでも使えるんだから慣れておくに越したことはないです。
もっとvimを知っていきたいと思います。

新人達を1ヶ月でガチvimmerにした方法

$
0
0

vim以外のエディタでコード書くと私の手は産まれたての子鹿みたいになります。

効率よくコーディングをしてもらうために、新人やvimで効率よく開発してみたい人にvimの研修を実施しています。今回は研修で非常に有効だった内容についてまとめておきます。

2つの繰り返しキーの存在を認識させる

vimは一度実行したコマンドの組み合わせを記憶する.(ドット)fを使った移動の際のキーストロークを記憶しておく;(セミコロン)があります。これらを駆使することで他のエディタよりも高速な編集作業を行えます。
セミコロンはus配列とjis配列のキーボードを両方使っている人は:(コロン)に置き換えているかもしれません。個人的にはfの繰り返しが使えなくなってしまうのは勿体無いので、やめるか別のキーに割り当てるのをお勧めしています。

vimは行に強く、列に弱いことを認識させる

これはvimを使う上でかなり重要なファクターです。vimは行、つまりは横のラインについては非常に強力な編集能力や移動能力を持っていますが、列、つまり縦のラインが絡むとあまり効果的な機能はありません(強力なのは矩形選択ぐらい)。前述したドットも横のラインの動作に限定した繰り返しを想定してコマンドを組む必要があります。

方向キーとdeleteキーの使用は禁止させる

vimを使っているのにこれらのキーを使うのは言語道断です。これらのキーを使わずとも効率よく移動と削除をする方法がいくつも用意されていますので、それを利用してもらいます。

ある程度vim使いこなせるまでプラグインの利用を禁止する

vimは非常に高機能なエディタとなっており、プラグインなしの標準の状態でも十分すぎるほど効率よくコードが書けます。まずは生の機能を使いこなしてもらい、そのうえで足りない機能を補完するためにプラグインをインストールしてもらいました。

ctagsと連携させる

ctagsというツールがあるのですが、vimは標準でこのツールと連携する機能が備わっています。ctagsを使えば特定の識別子の宣言元へジャンプすることができるなど非常に便利です。そのため、研修前にあらかじめctagsをインストールしてもらいました。

インサートモードに滞在する時間を短くさせる

vimになれていないと、通常のエディタのように使えるインサートモードに長居してしまいます。しかしvimの基本的なコマンドはノーマルモードで提供されます。ある程度編集したら即エスケープ、または、ドットで繰り返し実行可能な単位で編集するを徹底してもらいました。寿司屋とインサートモードのながっちりは粋じゃないと認識してもらいましょう。

インサートモードにおける削除は現在挿入中の文字の削除、または、ドットに記憶させる予定の削除動作に限定させる

インサートモードでもctrl + hctrl + wを使うことで文字の削除は行えます。しかし、削除はノーマルモードからdcを利用する方が、ドットを利用して繰り返しができる可能性が増える上に、大体の場合はより少ないキーストロークで削除作業が行えます。

横の移動は基本は単語単位、またはf, ^, $に限定させる

hlを使えば横移動はできますが、1文字ずつ移動していては日が暮れてしまいます。ソースコードは大概の場合は英語で書かれており、英語は単語の区切りがはっきりしていますので、単語移動(wまたはb)で移動する方が高速で動けます。また、単語移動では効率が悪い行頭(^)や行末($)への移動、特定の文字への移動(f)も用意されているのでそれを使いましょう。これらがかえって効率が悪くなるときはhlを使ってもらいましょう。

置換よりもcを駆使したドットの繰り返しをさせる

特定の文字列を置換するとなると:%s/hoge/guga/gといったやり方が高機能エディタでは一般的です。しかし、置換はキーストロークの数が非常に多く、さらにタイポによるミスが起こりやすいです。置換よりも、ciwのような単語を消しつつ新しい文字を挿入するコマンドを使い対象を、1つ変換してからドットを使ってどんどん変換する方が高速に編集を行える場合が多いです。この方法の一番良いところは、対象が特定の文字列だけでなく、単語(ciwなど)、文字(s)、ある文字までの全ての文字(cf何か1文字など)、といったように柔軟かつ簡単にに変換対象の幅をコントロールできるところにあります。

一度タイピングしたトークンは補完で補わせる

文字の入力は面倒ですが、1度入力してしまえばあとはインサートモード中にctrl + pまたはctrl + nで補完することができます。また、行の補完などもありますが、行の補完よりもヤンクしてペーストする方が個人的には思考のスピードで作業できるので、行の補完は使っていません。

補完の仕組みを理解させる

補完は作業を効率化するのに非常に便利ですが、補完の対象になるトークンがどれになるのかは理解してもらわないと、補完を効率よくコントロールできません。ちなみに対象になるのは現在開いているバッファに存在するトークン、ctagsで生成したtagsファイルに存在するトークンなどです(まっさらなvimの場合)。

バッファを活用させる

vim初心者はよく勘違いしていますが:qはバッファを閉じているわけではなく、ウィンドウを閉じているだけです。ウィンドウで開いたバッファは明示的に閉じるコマンドを入力するまでは生きています。勘違いのせいでtmux等で複数vimを立ち上げてファイルを編集する人もいますが、これはヤンクしたテキストや補完の候補となるトークンをファイル間で共有できないので作業効率が落ちてしまいます。一度開いたバッファは:lsで確認し:b バッファの番号で再度開くことが可能です。毎度ファイルパスを選択するよりもはるかに高速に再び編集が可能になるのでぜひバッファを活用してもらいましょう。
また、標準のvimはemacsなどと比べると、バッファの取り扱いが少々貧弱です。私の場合はBuffer Explorerというプラグインを利用して、もう少し簡単にバッファの操作が行えるようにしています。vimの操作にある程度慣れたらインストールしておくと非常に便利です。

画面は分割しすぎないようにさせる

画面分割は同時に複数のファイルを開きながら作業できるので非常に便利なのですが、1つの画面で表示できるファルの中身が少なくなってしまうデメリットもあります。ファイルの中身を俯瞰できないと、効率のよいキーストロークを導き出すのが困難になってしまうので、ファイルの参照はバッファの切り替えを駆使して行い、画面分割は最小限にとどめさせましょう。
個人的には画面分割は2つまでというルールでやっています。理由は単純に3つもあると画面が大きくても結構見辛いと感じてしまうからです。また、分割も上限分割(:spでできる)に限定しています。これは前述した通りvimは縦よりも横のラインに強いエディタなので、横のラインの視認性は常に最大限にしておきたいからで。

連打させない

vimはシンプルなキーストロークで複雑な編集作業ができるエディタです。文字を消すためにxを連打していては効率的な編集は行えません。最小限のキーストロークで、かつ、ドットで繰り返せる単位を考える癖をつけるためには連打を禁止しましょう。私がペアプロでvimを教える時には、非効率な作業をした場合はuで編集前の状態に強制的に戻させています。効率よくコードを書かないと先に進めないようにしています。「uでもどす、uでもどす」と言うたびに、新人が悲しい顔をしてきますが、心を鬼にして戻させましょう。

数えさせない

vimのコマンドは数字を入力することで、削除する単語の数等も指定することができます。しかし、数えるという行為は意外と時間がかかります。数えないと確定できないようなキーストロークは最小のキーストロークだったとしても非効率になる場合があります。最小のキーストロークでといった矢先に矛盾したことを言いますが、数えるくらいなら連打させてください。といっても連打とはドットやセミコロンの連打に限ります。
例えばfuck you you fackin fuck ranという文の先頭にカーソルがあったとします。この文を編集してranまでの全ての単語を削除するとします。そのような場合に、5df␣などとスペースの数を数えてはいけません。ここの場合はdf␣とした後、ranだけになるまでドットを連打した方が早いです。一般的に人間の脳が意識せずに認識できるまとまりの数は4個までらしいです。それを越えると認識が難しくなり、数える必要がでたりします。また場合によっては特定の1文字が長い文字列の中に何個も現れるような場合は数が少なくてもまとまりを捉えるのが難しくなったりします。そのような場合は何も考えずにドットやセミコロンを連打する方が早いです。

キーストロークを口に出させる

最初のうちはコマンドを覚えること自体が大変です。効率よく覚えるにはキーストロークを言いながら編集することをお勧めします。cawならば「しー、えー、だぶりゅー」などと言いながら編集すると良いでしょう。ある程度覚えてきたら、キーボードを触らずに編集時のキーストロークを唱えさせる練習もしてもらいましょう。エアvimです。これをやっていると、そのうち思考とキーストロークが一致します。

ペアプロの指示をキーストロークにさせる

vim使い同士でペアプロをするなら、オペレータになった時にドライバーへの指示をキーストロークにしてもらうと良いでしょう。すごく訓練になります。そして何より面白いです。

ファイルの探索は:Eとバッファとctagsを駆使させる

:Eで現在開いているファイルが存在しているディレクトリをファイルエクスプローラで開くことができます。ctagsやバッファとこのコマンドを組み合わせると、開きたいファイルを:etabによる補完を使って探索するよりもはるかに高速に開くことができます。

vimでやる方が効率が良いことはvimでさせる

普段コマンドラインでやる作業もvimからやった方が効率がいい場合があります。:!を使うと外部コマンドをvimから使うことができます。mkdirコマンドくらいならいちいちコマンドラインに戻るより、vimでやってしまった方が早い場合もあります。またvimの標準のファイルエクスプローラを使うとmvコマンドでリネームするより効率よくリネームができたりもします。

最後に

コーディングに限らず、PCを使った仕事術はいかにしてキーボードやマウスを触らないかが重要になってきます。開発のお仕事のお給料が勤務時間に打ったキーの数で決まる訳ではないのであれば、是非ともvimで効率よく作業して余った時間をもっとクリエイティブなことに費やしてみてください。

neovim(vim)で一つずつ確認しながら文章全体を置換する

$
0
0

環境

NVIM v0.2.3-dev

neovim(vim)で一つずつ確認しながら文章全体を置換する

以下のコマンドを実行する。

:%substitute/{置換前}/{置換後}/gc
# 次のコマンドでも可
:%s/{置換前}/{置換後}/gc

フラグの意味

gフラグ

gはgdefaultの略(grepのg?)。
各行の二つ目の{置換前}も置換対象とする。
(neovim(vim)では、通常一つ目の{置換前}のみ置換対象とする)

cフラグ

cはconfirmの略
 置換前に確認をする。

参照

:h substitute
:h s_flags

JupyterNotebookにVimの力を加えると、光と闇が両方そなわり最強に見える

$
0
0

前回まででMacにJupyter Notebookを入れ、そのExtensionも追加し、効率的に分析ができる環境を作りました。今回は色やフォントなどの見た目変更、そしてVimで編集をできるようにします。ちなみにタイトルの元ネタはこれです。

(前回までの記事)
僕がpyenv+anaconda3+jupyter notebookを選んだ理由と、その導入
Jupyter notebookのスニペット機能を使って機械学習案件の生産性をあげる

以下の順に沿って記していきます。

  1. 見た目の変更
  2. Vimの導入
  3. cssの調整

前提となる環境として、自宅で使っているMacBooK Airを用います。

2011 MacBook Air 3,1
1.4 GHz Intel Core 2 Duo
2 GB 1067 MHz DDR3
128 GB SSD
High Sierra 10.13.2

またpyenv 1.1.5 + anaconda3-4.0.0でpython3を入れています。

見た目の変更

デフォルトのテーマでは下記の感じになり、割合明るめなので、良い感じに闇に染めていきます。

スクリーンショット 0030-01-04 22.42.01.png

色やフォントの変更にはjupyterthemesを用います。JupyterNotebookのプロセスをいったん落としてから、下記コマンドを実行してください。

~$ pip install jupyterthemes

上記のようにpipパッケージを導入すると、jtコマンドが使えるようになりますので、下記のように色のテーマとフォントを指定します。(上記のサイトを見て自分なりにカスタマイズしてみてください)

~$ jt -t chesterish -T -f roboto -fs 9 -tf merriserif -tfs 11 -nf ptsans -nfs 11 -dfs 8 -ofs 8

ここでJupyterNotebookを起動してみましょう。良い感じに闇に染まりましたね。

スクリーンショット 0030-01-04 23.12.41.png

Vimの導入

さらにVimの力を加えることにより、闇の力を深めていきます。前回記事にしましたが、既にnbextensionsは導入している前提です。Vimの導入にはjupyter-vim-bindingを用います。(下記コマンドについてレポジトリのクローン先はコマンド$ jupyter --pathで調べ、各自適切なパスに変更してください。)

$ git clone https://github.com/lambdalisue/jupyter-vim-binding /Users/daiki_akimoto/.pyenv/versions/anaconda3-4.0.0/share/jupyter/nbextensions/vim_binding

すると、下記のようにVIM bindingのnbextensionが選べますので、これをチェックします。

スクリーンショット 0030-01-04 23.37.18.png

すると、下記のようにVimがJupyterNotebookの中でも使えるようになります。ちょっと見辛いので次の説でCSSをいじって調整してあげます。(注:Safariで開きますと上手く動かないようです。GoogleChromeだと大丈夫でした。)

スクリーンショット 0030-01-04 23.41.05.png

cssの調整

上記のように闇に染まった背景にVimを導入すると、少し明るくなって見にくくなるので、これも塗りつぶしましょう。

.jupyter/custom/custom.cssを編集します。div.cell.edit_mode {という一行がありますので、その直前に下記を挿入します。

/* Jupyter cell is in normal mode when code mirror */.edit_mode.cell.selected.CodeMirror-focused.cm-fat-cursor{background-color:#000000!important;}/* Jupyter cell is in insert mode when code mirror */.edit_mode.cell.selected.CodeMirror-focused:not(.cm-fat-cursor){background-color:#000000!important;}

すると、下記のようにVimの編集範囲も闇に染めることができます。

スクリーンショット 0030-01-04 23.54.47.png

最後に

以上、Jupyter Notebookの色と見た目の変更とVimの導入でした。細かいところですが、毎日使っていくものでもあるので、紹介したサイトを参考になるべく使いやすく自分にあった環境を見つけて頂ければと思います。

この記事を読んだ人はこのコマンドだけでも覚えて帰ってください

$
0
0

はじめに

僕はVimmerではありません
ただ、vimで作業することは避けて通れません。
作業の中「これは使える!」というコマンドがあったので紹介します。

そのコマンドは....

shift + v

重要なことなのでもう一度言います

shift + v

これ何のコマンド?????

これはvimで範囲選択ができるコマンドなのです!
この状態でしたカーソルを押せば下に範囲選択ができる!
すごい!
ここからどのように作業するかはあなた次第!

Viewing all 5692 articles
Browse latest View live


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