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

vimtutorを使ってみての感想

$
0
0

はじめに

Vimの勉強を始めたはいいものの、使う機会が少ないためコマンドが身につかないと思っていました。
そこでvimtutorを使ってみてどうだったかを書きたいと思います。

vimtutorを使う前

・移動や挿入のコマンドは一部知っていた
・実際にVimを使うとなるとコマンドが出てこない

vimtutorのインストール

# Ubuntu
sudo apt-get install vim

vimtutorの起動

# 以下のコマンドで日本語版が使えます
vimtutor ja

コメント 2019-11-27 161818.png

やってみた

・1回目は45分くらいかかりました。知っていることもありましたが、新しく知ったことも多かった。
・2回目以降は30分くらいで終わりました。少しずつ慣れてきた感覚があった。

感想

vimtutorをやった後に実務でvimを触ったときに、以前よりもスムーズにコマンドが扱えるようになりました。
また、より効率的な方法(コマンド)はないのかという考え方をするようになりました。

非常に基本的な話でしたが、やはり使ってみて身につくということを改めて思いました。


Vim PluginでもUnit testを回したい!

$
0
0

Vim PluginでもUnit testを回したい!

こんにちは、IKです。
ところで皆さんは毎日Vim scriptを書き、Vim Pluginを公開していると思いますが、
Unit test、したくないですか...?
したいと思ったそこの貴方が今回の対象です!!!

この記事を書く際に、@kamyknさんのspelunker.vimを参考にしています。

用意するもの

以下の3点です

(今回はCircieCIを使った方法を書きます)

テスト導入

今回は自分の作成したPluginにUnit testを導入したので、自分のPluginをベースにUnit testの導入フローを紹介したいと思います。

以下のような、Vimで天気をみるためのPluginのためのUnit testです。

https://github.com/kazukazuinaina/Weather.vim

Untitled.gif

ディレクトリ構造

.
├── .circleci
│   ├── .vimrc
│   └── config.yml
├── .github
│   └── ISSUE_TEMPLATE
│       ├── ISSUE_TEMPLATE.md
│       └── bug_report.md
├── .gitignore
├── LICENCE
├── README.md
├── Weather.gif
├── autoload
│   ├── Weather
│   │   ├── city
│   │   │   ├── Hiroshima.vim
│   │   │   ├── Hukuoka.vim
│   │   │   ├── Kyoto.vim
│   │   │   ├── Nagoya.vim
│   │   │   ├── Osaka.vim
│   │   │   ├── Sapporo.vim
│   │   │   ├── Sendai.vim
│   │   │   ├── Shiga.vim
│   │   │   └── Tokyo.vim
│   │   ├── returncity.vim
│   │   ├── test
│   │   │   ├── test_popup.vim
│   │   │   └── test_status.vim
│   │   └── test.vim
│   └── Weather.vim
├── doc
│   └── Weather.txt
└── plugin
    └── Weather.vim

テストコードに関するスクリプトは、testディレクトリ内にあるtest_status.vim
Weatherディレクトリ内にあるtest.vimです。

簡単にこのスクリプトについて紹介しておきます。

  • test.vim

これは、testディレクトリに置かれた単体テスト用のスクリプト群をまとめて実行するためのファイルです。

  • test_status.vim

これは、apiを叩いた際にhttp statusが正しく返って来ているかをtestするためのスクリプトファイルです。

testコードカキコ

じゃあ実際にtestを書いていきましょう。

test_status.vim

" test_status.vimlets:dir= expand('<sfile>:h:h').'/city'lets:city_data= map(glob(expand(s:dir).'/*.vim',1,1),'fnamemodify(v:val, ":t:r")')function! Weather#test#test_status#run()foriins:city_dataletl:id = Weather#returncity#return(i)letl:res= webapi#http#get('http://weather.livedoor.com/forecast/webservice/json/v1?city='.id)
  echo i." status:".l:res.status
  call assert_equal(200,l:res.status)endforendfunction

test_status.vimは、cityディレクトリにある都市のファイル名を抜き出し、その都市に対応するidを指定してapiをgetで叩き、それをassert_equalで評価するためのスクリプトになります。
今回のケースだと、call assert_equal(200, l:res.status)の部分がそれに当たり、これはwebapi#http#get('http://weather.livedoor.com/forecast/webservice/json/v1?city='.id)で返ってきたhttpレスポンスが200ならヨシ!、そうでないならダメと言う感じになります。

assert_equalについてはこちらに記事がが参考になると思います!

https://thinca.hatenablog.com/entry/20151203/1449076256

test.vim

" test.vimscriptencoding utf-8lets:save_cpo=&cpo
set cpo&vimfunction! Weather#test#run()" v:errorsを初期化するletv:errors =[]call Weather#test#test_status#run()if len(v:errors)>=1
    echo v:errors
    " error exit
    execute 'cq!'endif
echo 'test success'
execute 'qall!'endfunctionlet&cpo =s:save_cpo
unlet s:save_cpo

test.vimは、test_status.vimで実行したassert_equalの結果を返し、Vimを終了させるようなスクリプトになっています。

もし、assert_equalを実行し、問題なければ:qa!でVimを終了、問題があれば:cq!でVimを終了させるスクリプトになっています。

circle ciの設定

testが書けたらあとはcircle ciに丸投げしちゃいましょう!!

version:2jobs:build:docker:-image:centos:7working_directory:~/projectsteps:-checkout-run:name:lscommand:ls -la-run:name:yumcommand:yum update -y && yum install make gcc ncurses-devel ssh git -y-run:name:Build latest Vimcommand:git clone https://github.com/vim/vim.git && (cd vim && make && make install)-run:name:Vim versioncommand:vim --version-run:name:Install webapi-vimcommand:git clone https://github.com/mattn/webapi-vim-run:name:write .vimrccommand:mv ~/project/.circleci/.vimrc ~/.vimrc-run:name:check pathcommand:ls -la && pwd-run:name:Unit testcommand:vim +":call Weather#test#run()"

これで、circle ciくんが自動でVimを起動し、テストを動かし、Vimを終了するところまで自動で回してくれます!
自動化って素晴らしい!!

やっていることとしては、

  1. yumをupdate
  2. 必要なpackage群をインストール
  3. Vimをビルド
  4. pluginをインストール
  5. vimrcをホームディレクトリに配置(もっといい方法あると思います)
  6. Vimを起動し、上記のtest用の関数を呼び出す

これがtest用のvimrcです

scriptencoding utf-8set encoing=utf-8
syntax enable
set runtimepath+=~/project
set runtimepath+=~/project/webapi-vim

スクリーンショット

テストが成功した図

スクリーンショット 2019-11-22 16.45.15.png

テストが失敗して絶望している図

スクリーンショット 2019-11-26 9.34.57.png

最後に

どうでしたか?
これでより豊かなVim lifeが送れることでしょう!
Happy Vimming!!

次の@aiya000さんの記事にも期待です!!

参考文献

https://thinca.hatenablog.com/entry/20151203/1449076256
https://github.com/kamykn/spelunker.vim

VimをVisual Studio Codeっぽく使ってみる ①

$
0
0

Vim2 Advent Calendar 2019の 3日目 担当の @Chitamaです。
Webやアプリを開発をやってます。

Visual Studio Codeをを立ち上げずに Vimでコードを書いてみたらと、いつもよりメモリの使用量が 1GB ほど少なかったので、VimだけでVisual Studio Codeっぽく使えないか試してみました。
今回は、vim標準のファイラnetrwだけでできる範囲でやってみます。

標準設定で使ったとき

まず、まっさらな vimrcだとこんな感じです。

プロジェクトフォルダを開く

  • 基本操作
    • edit <開きたいプロジェクトフォルダパス>
    • e <開きたいプロジェクトフォルダパス>

trends

  • やりたいこと
    • 開い時に上部に表示される情報を非表示にしたい
    • ツリー形式で展開するように表示したい

ファイルを開く

  • 基本操作
    • ディレクトリ/ファイルを開く: Enter
    • 水平方向で開く(画面分割): o
    • 垂直方向で開く(画面分割): v
    • ファイルを閉じる: :bd
    • 右のウィンドに移動: <Cntl+w> l
    • 左のウィンドに移動: <Cntl+w> h
    • ウィンドに移動: <Cntl+w> 長押し

trends

  • やりたいこと
    • ファイルが左側に開くので、右側にしたい
    • 行番号を表示したい
    • コードに色分けしたい

vimrcを追記

やりたいことが実現できるように vimrcを書いてみます。

" プラグインを有効にするfiletype plugin on"##### nwtrw #####" 上部の情報を非表示にするletg:netrw_banner=0" 表示形式をTreeViewに変更するletg:netrw_liststyle=3"コードの色分け
syntax on"#####表示設定#####"行番号を表示するsetnumber" 新しいウィンドウを下に開くset splitbelow
" 新しいウィンドウを右に開くset splitright
  • Vim(左)、 Visual Studio Code(右)

trends    trends

とりあえず

見た目だけっぽくしてみました。
次は、開発で使ういろいろな機能も試してみようと思います、

金井の戯言【NIT-Numazu Advent Calendar 2019】

$
0
0

書くことないんですけど

なんかプロコン同好会で参加して欲しいとか言われたから参加したけどさあ
どうすんのこれマジで
現時点で書くこと無いし、何も強い人じゃないから既に劣等感しか無いんですけど
技術的なこと書ける人、強くていいですね!^ ^

…ぼやいててもしょうがないので取り敢えず自己紹介書きます。

とってつけたような自己紹介


名前 : 金井 一真
趣味 : ぷろぐらみんぐ、原付で小旅行、ピアノ
使用言語 : C / C++ / Ruby / HTML / CSS /
コメント : 最近基本情報受かりました、おら基本情報技術者様だぞ道を開けろ
関連リンク : ついたーぎとはぶ

適当に書いてたら方針が決まった

ぼく結構何事も浅く広くな人間なので(信条は狭く深くなのに!)、色んなことをちまちま並べて書いていくことにする

一記事で二度美味しいって言え!!!!!!!!!!!!!!!

それじゃいきます

vimのはなし

今これ書いてるのもvimです。vimを弄り回す人たち凄いですね、これmarkdownなのにリアルタイムで変更が見れるプラグイン使って書いてるんですよ。
あ、URL貼っとこ。
https://github.com/suan/vim-instant-markdown
というわけで個人的にすこポイントを幾つか挙げていく。

キーボードから手が離れない

これ90%くらいを占めてます。それくらいキーボードから手が離れないのは重要。
いちいちマウス触るのめんどくさいんすよね。それだけ。
自分とマウスは一体だから問題ないですよって人は別にいいんじゃないですかね?わからん。

なんかかっこいい


逆にこれがかっこいいと思わん人とは感性が合わないんやろなって思います。
画面分割とか、ひたすらキーボードカタカタやって作業してるのオシャレじゃないですかね?そんなことない?

強めのオタクたちのプラグインがたくさんある

多分これを一番推すべきなんでしょうね。
ぼくはまだvimの素の機能すら完全に使いこなせていないので、あんまたくさん入れてないんですよ。今はmarkdown周りだけかな?
vimスーパー完璧人間になってからあれこれいれると作業効率がとんでもないことになると思います。そう信じてます。

とりあえずこんなもんですかね。実際vimmerになってから作業効率は間違いなく上がってるし、そこそこ使いやすいエディタだと思います。端末からのアクセスが早いのも良し、軽いのも良し。かっこいい。いいことずくめ。
ただ惜しむらくは、日本語入力との相性が悪いことですかね…
編集モードと入力モードを行ったりきたりするエディタなので、編から入に切り替えようってときに日本語のままの状態になってると、

こうなる。

(なんか伝わりにくいスクショですね、vim触ったことある人は言わんとすることわかるはず)
これ急いでるときにやられるとほんま迷惑で、編集モードに入ったら自動で英語入力に戻すシステムだかプラグインだか入れなきゃいけない。あるのかな?探してみるか。
といった感じでvimの話は以上。みんなもvim使ってね!

bot開発のはなし

ぼくの趣味みたいになってる奴です。ついったのbotと、でぃすこのbotがあります。
これなんでハマってるかというと、自分のした改造がレスポンスとしてわかりやすく現れる、ってのと、色んな人に遊んでもらえるってところかなって思います。
  
↑ これは僕のbotをつっつくたべさん
要は、わかりやすく評価されるから嬉しいよねって話です。
他にもいいところが有って(活かせてはいない)、色んなAPIとか.jsonファイルとかの扱いが上手になります。外部のAPIを使うとbotの完成度が上がるので良いです。ぼくのbotでは天気予報が出来たりします。すごい!すごいって言え!
ただ、あんまりdiscordの方のファイル構造がうまくいってなくて困ってます。ファイル構造云々は多分rubyの理解度の問題なんだよな、精進します。
みなさんのdiscordにもかめせんにんを入れて遊んでみてね!
ついったーのbotの方は、僕のツイを分解してマルコフ連鎖で繋げてツイートする、なんてことをしている奴です。あの、案外面白いです。僕のことをフォローしている人は是非セットでフォローしていただきたい。
というわけで以上、bot開発のはなしでした。みんなもbot開発、やってみよう!

Josephineのはなし

かっこつけて英語使いたかっただけです。ジョセフィーヌのはなしです。
ジョセフィーヌって誰だよ、何だよ、って方もいらっしゃると思うのでご紹介します。

この亀のぬいぐるみの名前です。かわいい。
この子は、八景島シーパラダイスで開催された「鎮守府第三次瑞雲祭り」にいった際にお土産で買ってきました。
会場内を歩き回って疲れたときに亀を見て癒されたのが妙に印象に残っており、「せっかくだから」と言って買いました。
名前の由来は…

父に強引に命名されました

これマジ?(由来とか)ないじゃん…
ちなみに父に命名される前は「亀五郎」と呼んでました。なんで五郎なんだ。
ちなみに、ついったのFFの絵を描く人にお願いして、擬人化を描いて貰ったりしました。

かわいい。
僕の顔みたいな存在なので、ぜひ覚えてあげてください、ジョセフィーヌのはなしでした。

もう十分だろ

書くことがないとぼやきから始まった記事でしたが、なんだかんだそこそこ書けたような気がします。埋めるだけならついったーらんどで鍛えた文章力が火を噴きます。噴くな。
記事作成を完走した感想(激うまギャグ)ですが、専門的な内容が結局書けなかったのが悔しい、是れに尽きます。色々なことを齧っている割には深く学習は出来ていないので、今の僕はなんとも中途半端なエンジニアなのかなと。まぁでも、ひとまずやることは応用情報の勉強でしょうし、専門化はまだまだ先のお話となりそうです。
というわけで、この記事もそろそろ終わりです。如何だったでしょうか?もしちょっとでも面白いと思っていただけたのであれば、僕のついったーの方をフォローしていただけると泣かない程度に喜びます。
御拝読頂きまして、ありがとうございました。お疲れやまでした。

Ruvimine

$
0
0

RUNTEQ AdventCallendar 2019 3rd Article

Rubymine with Vim

  1. Install plugin IdeaVim
    スクリーンショット 2019-11-30 午後8.00.27.png

  2. Reboot Rubymine
    スクリーンショット 2019-11-30 午後8.27.39.png

  3. Vim
    スクリーンショット 2019-11-30 午後11.24.12.png

  4. Happy!
    スクリーンショット 2019-11-30 午後8.25.01.png

    ・
               ・
               ・
    

[解説]
・ideaVimというプラグインを導入すると、RubyMine上のコードエディタがVimになります。

・Vimの設定は~/.vimrcの設定を引き継ぎますが、インデントやタブなどの設定はRubyMineに準拠します。
・RubyMine上のVimの設定を個別に定義したい場合は~/.ideavimrcを作成して記載してください。

・Vim力の低下を感じた際には Terminalのプラグインを入れ、ショートカットキー(option + t など)を設定することで即座に素のVimを起動できるようにしてください。
スクリーンショット 2019-11-30 午後11.09.15.png
スクリーンショット 2019-11-30 午後11.10.13.png

スクリーンショット 2019-11-30 午後11.11.06.png

・Vimに嫌気が差したらoption + vで無効化してください。

Vim初心者向けに矢印キーを無効にするプラグインを作ってみた

$
0
0

この記事はTUT Advent Calendar 2019の記事です。

はじめに

私の通っている大学でVimを使ってる人をたまに見るのですが、結構な頻度で矢印キー(カーソルキー)を使ってる人を見かけます。
そこで、そんな人たちがhjklキーでの移動に矯正できるように「disarrow.vim」というプラグインを作成しました。
https://github.com/Inazuma110/disarrow.vim

このプラグインを導入すると、矢印キーを押すと警告の表示がでます。

ちなみにこのメッセージ文はVIM Adventuresから引用しています。

Requirements

Neovim 0.4.0以上が必要になります。
初心者向けと謳っていますが、単にaptでInstallしてもこのバージョンは入らないはずです。
https://github.com/neovim/neovim/wiki/Installing-Neovimを参照して新しめなバージョンをInstallしてください。

Install

deinを使ってtomlファイルで管理しているなら

[[plugins]]
repo ='Inazuma110/disarrow.vim'

dein以外のプラグインマネージャーを使ったことがないので他のプラグインマネージャーでのInstall方法については割愛しますが、特別な操作はいらないはずです。

Configuration

警告文を日本語にしたい場合は、vimrcにて

letg:disarrow#lang='ja'

とします。

最後に

Vimscript初心者なので、書き方の問題やバグなどありましたらこの記事のコメントやGitHubのIssueやPRなどで教えてください:bow:

vimでファイルを開いたら常に新しいタブで開くようにする

$
0
0

いくつか方法はありますが、 以下に落ち着きました。
シンプルに新しいタブを開いてバッファを移動します。

function OpenFilesToTabs()if len(filter(range(1, bufnr('$')),'buflisted(v:val)'))>1
      execute 'b # | tabnew | blast | bp'endifendfunction
autocmd BufNewFile,BufRead * :call OpenFilesToTabs()

MacからWinに即Vimが移植できた話

$
0
0

MacからWinに即Vimが移植できた話

tl;td;

dotfileは、PublicなGithub管理がいいぞ

背景(という名のポエム)

それはゴリラ.vim#10当日のことでした。
それまで社用PCとしてMacbookProを利用していたのですが、「好きなPC買って良いよ!」と会社から言われ「じゃあThinkpadで!」と答えたのが数週間前。
そこから恒例の納入延期が入り、12月上旬に届く予定だったのですが……
「0Deltaさん、PC何か突然来たんだけど……」「……へっ?」
というやりとりが行われました。ゴリラ.vim当日(11/13)に。

何はともあれ、念願のThinkpadです。セットアップしないわけにはいきません。
重要なデータは全てGoogleDriveにぶん投げ、ThinkpadのOSや生体認証をセットアップし終わった頃にはもうイベントに出発しなければならない時間でした。
いそいそと机を片付け、Macはデータバックアップだけ走らせて置いていきました。

そして「念願のゴリラ.vim初参加だ!」と着席した後、Vimでメモを取ろうとしたのですが
/bin/bash vim command is Not found
……Vim入ってないやん!!

なんということでしょう、VimのイベントにVim無しで参加していたのです!
あっ、コレはいかん! と思い、超速でセットアップしました。
そして、2人目のLTが始まる頃には、ほぼほぼ完全にセットアップができていました。やったぜ

しかし、0からセットアップをしていた訳ではなく、いくつかの準備があったからこそ、爆速セットアップができたのでした。
準備しといて良かった! と思えたTipsを、この記事で少しでも共有できればなと思います。

やっていたこと

  • dotfilesに設定ファイルを集約していた
    • 社用PCが壊れた際にできるだけダウンタイムを減らして復旧できるように、最初から作業環境だけでも復旧できるようにしてました。
  • そもそもMac→Winの移行は辛過ぎるのでWSL2前提にした
    • 特にパス周りがとても辛い事は明白だったので、できるだけ共通化しようとしていました。
  • Vimのビルドスクリプト組んでた
    • これは移行の為ではなかったのですが、最新のパッチを取り込みたかったので自作のビルドスクリプトを組んでいました。

環境の変化

  • 強力なデバックは行なわなくなった
    • ぶっちゃけて言えば、インストールだけで分割画面+ブレークポイントを含めたデバックができるのはとても強力で、それを求めてVimを選ぶのは無謀です。(もちろん、Vimをしっかり拡張すればとても快適にデバック可能です。)
      逆に今は、デバック機能がなくとも追えるログを出すプログラミングを意識しています。
  • Windowsでdockerやgitを扱う関係上、ターミナルでの作業がほとんどになっており、同じターミナルでちょっとした変更は完結させたくなった。
    • Emacsも手ですが、慣れの問題からVimを選んでいます。
  • Vim日本語ユーザ会に入った
    • 英語の勉強がてら、Vimのヘルプファイル翻訳方法を求めて入ったのですが、とても濃いメンバでとても楽しい。
    • そして質問や疑問が爆速で解決して行くので楽しい

で、結果どうなったの?

これだけで構築完了です!

git clone http://github.com/0Delta/dotfiles
cd dotfiles && bash ./install.sh
git clone http://github.com/0Delta/myvim
sudo apt update &&sudo apt install<Vimビルド用色々>
vim myvim/install.sh # ここだけ素のVim、インストールパス等を合わせるcd myvim && bash ./install.sh

途中の設定書き換えだけはどうしようもならないので手動です。
また、初回インストールのaptは自動化済で、first.shという名前のスクリプトで一発で行けるようになってます。

ところで、何故privateじゃダメなのか

ダメじゃないです。
もう一度言います。ダメじゃないです。

じゃあ何でそんな事言ったのさ? というと、僕個人の意見として以下のような意見があるから。

  • そもそも機密情報は別PCに持ち出せない方が良い
    • 例えば鍵なら再生成が好ましいのでは?
  • ユーザ名は固定じゃないのを想定しておくべき
    • ${HOME}を参照するか~を使えば良い
  • Publicにしておくとマサカリが飛んで来る
    • 改善チャンスが生まれる
  • git pullする時に認証がいらない
    • privateだと、先に鍵を生成して登録する必要がでてくる、更に言えば先にEdgeを捨ててChromeを入れる必要もある

あくまで僕の意見です
特に設定ファイルに自動で書き込まれてgit pushしてしまい、問題が起こる可能性も高いので、そこはトレードオフです。
(僕はgit-secretsで予防しています。)
まさかを見越してprivateなリポジトリにするのは賢い選択です。決して間違いではないです。

まとめ(まとまってない)

そもそもこれだけアウトプットするのが久々な上、プライベートで急な要件が来てあまり纏められませんでしたが……

言いたいことは積極的に自動化しておこうということ。
そしてできるだけ他の人に見せられる状態を維持しておくこと。自然と良いコードになりますし、改善のチャンスも増えます。
更に良いコードを書く週間がつけば、仕事で書くコードも高品質になりやすく良いスパイラルになります。

特に「もし壊れたら」にまつわる事柄はできるだけ自動化/障害耐性を持たせるべきだと再認識しました。
(今回の件とは別になりますが、あやうく3年分の家族写真データが消えかけた事もありました……)

実際に動いているプログラム

実際に使っているプログラムを晒して終わりにしたいと思います。
またリポジトリは公開状態なので、フルが気になる人は探してみると良いでしょう。

dotfilesのリンクを張るスクリプト

#!/bin/bashcd$(dirname$0)DOTFILES_DIR=$(pwd)links=(".vimrc ~/"".vim ~/"#      : <ここにコピーするファイルとコピー先>)for link in"${links[@]}";do
    from="${DOTFILES_DIR}/${link%% *}"to="${link#* }"if["${to##*/}"=""];then
        to="${to}${from##*/}"fi

    if["${to%%/*}"="~"];then
        to="${HOME}/${to#*/}"fi

    if[-e"${to}"];then
        echo${to} is exists. skipping...
    else
        echo link${from}${to}ln-s${from}${to}fi
done

Vimのビルドスクリプト

#!/bin/bashCONFIG=()
CONFIG+=("enable-fail-if-missing")
CONFIG+=("disable-gui")# : <ここにconfigに与える引数(Vimに持たせる/持たせない機能)>
CONFIG+=("with-compiledby=0Delta")
CONFIG+=("prefix=/usr/local")CONFIG_CMD="./configure"for v in"${CONFIG[@]}"do
  CONFIG_CMD+=" --${v}"done

git submodule foreach git fetch origin && git pull origin master && git add vim && git commit -m"update vim repo"&& git push

cd vim/src
make distclean
eval${CONFIG_CMD}
make -j$(sysctl -n hw.ncpu)&& make install

vim --version | head-n 4

それでは、クリスマスも良いVimライフを!


最近ぼくがVimに設定したこと

$
0
0

ハロー、ハッピーVimmer :tada:

今日はVim pluginと、それに対する僕の設定を紹介します。

マクロの実行をdot repeat可能にした

まずはシンプルかつ最強なやつです。

dot-repeatは通常1つの動作のみを繰り返しますが、これを使えば、以下のような繰り返しが可能です。

  1. qaマクロ記録開始
  2. dt(動作1
  3. dip動作2
  4. 3lD動作3
  5. +qマクロ記録完了
  6. @aマクロを発動
  7. .下に移動してから、上述のdt(から3lまでを実行
  8. .下に移動してから(略
  9. .下に移動してからry
  10. 繰り返し

sample

Webページを非同期で表示するようにした

これは自作プラグインで、まだドキュメントの整備が終わっていない(する予定がない)のですが、せっかくなので紹介させてください。

これを以下のように設定すると

次のようにweblio辞書をVimのpopupで表示します。

sample

ドキュメントを追加して、あとは内部のバッファをいじれるようにすれば、もっと便利になると思いますが、使う人は僕以外いないし、いらんか。という。
だれかドキュメント書いて!

英和翻訳を非同期で表示するようにした

weblio辞書で和英ができるようになったので、あとは英和が必要です。

<leader>kで、選択した英文を翻訳してくれるようにしました。

sample

日本語関連の操作をしやすくした - vim-fmap

これはfキー及びFtTキーの4つへ、キーバインディングを提供してくれるプラグインです。

例えば以下を実行すると

nmap <leader>f<Plug>(fmap-forward-f)
FNoreMap p(  " 大文字括弧開き

<leader>fpbキーで、Vimデフォルトのf(を実行してくれます。

sample

僕はこれを以下のように設定して、IMEオンオフなしで日本語文字にジャンプできるようにしています!
これでnormal・visual・operatorへのいずれでも、ジャンプが可能になります :point_down:

letg:fmap_escape_keys=['','','']

augroup vimrc
  autocmd VimEnter * FNoreMap / ・
  autocmd VimEnter * FNoreMap T ・
  autocmd VimEnter * FNoreMap tt …
  autocmd VimEnter * FNoreMap '' 
  autocmd VimEnter * FNoreMap p(
  autocmd VimEnter * FNoreMap k「
  autocmd VimEnter * FNoreMap K 〈
  autocmd VimEnter * FNoreMap -k『
augroup END

詳しくは :point_down:

括弧の操作を最強にした - vim-operator-surround

いわずと知れたプラグインですが、これも僕は日本語文字に活用しています。
(もちろん日本語文字以外にも。)

例えばカーソル下にwordという単語があれば、normalからのgajKキーでその周りに「」を追加することができ、つまりは「word」することができます。

これ :point_down:の執筆で大活躍でした。(宣伝)

gina.vimのコミット画面をcommittia.vimみたいにした

gina.vimは今季マジ推しのプラグインのうち、ひとつです。

そのまま使うでも便利なのですが、自前でキーマッピングを追加してみました。
見てみてください! :point_down:

sample

ちなみに、このキーマッピングの本家は :point_down:
(これを直接利用しようと考えたのですが、どうやらターミナルからgit-commitする用だったので、諦めました。もしVim上からもできるようだったら、すみません。)


以上です。
Happy Viming!

ZZ

vimを布教するならこんなふうに

$
0
0

advent calendar5日目にして途絶えそうだったので2週目

これは

自分が感じるvimのいいところ/好きなところをまとめて、こんなことができるよと初学者に伝えるためのもの
もちろん他にもあるけれど人に布教するならここかな!という部分を挙げる

TL;DR

コード埋め込みの部分がほぼ本編

こんな部分

前提条件

  • 謝罪
  • 環境
    • VIM - Vi IMproved 8.1 (2018 May 18, compiled Sep 18 2019 03:49:48)
  • 要求
    • タッチタイピング
      • 自分はvimを使いたくて習得した
  • 他のエディタの経験(記事を書いてる人の)
    • Atom
    • Sublime
    • VSCode

書かないこと

  • 入門のような基本操作の列挙
  • vimrcによる設定や拡張
  • 他エディタとの比較
  • 熱意
    • 本当は だってvim使ってるとかっこいいじゃん!!!とか書きたい

参考文献

この記事の執筆はもちろん、その他も含めた知識全般はこちらから

予備知識

説明の都合上、モードの概念が登場するので補足
これは研究室の後輩に向けて作成した過去資料なので資料中の厳密さや、悪ノリにはご容赦いただきたい
mode.png
mode_change.png

本編

いいところ/好きなところ

よく言われていること

キーボードで操作が完結する
カーソル移動はもちろん貼り付けやペーストなどの編集も可能で、OSのショートカットキーよりも楽である

e.g.
- 左h、下j、上k、右l
- Ctrl + CCMD + Cではなくyyyでコピー(ヤンク)

ここはこんな感じで短めに

操作の種類

一見似た操作が多く存在するが、適切な操作を選択できると結果的に同じ操作であっても単純に打鍵数が減る

  • NormalモードからInsertモードに入る操作(思いつくだけ)
    • i: カーソル位置からInsertモードに入る
    • a: カーソル位置の直後からInsertモードに入る
    • s: カーソル位置の文字を削除してInsertモードに入る
    • o: カーソル行の下に新たに行を挿入してその行でInsertモードに入る
    • I: カーソル行の先頭からInsertモードに入る
    • A: カーソル行の末尾からInsertモードに入る
    • S: カーソル行の文字を削除してInsertモードに入る
    • O: カーソル行に新たに行を挿入してその行でInsertモードに入る

A$aOkoがほぼ同じ操作となる。($は行末への移動)
また、リピートなどを考慮するとさらに大きな差となる(後述)

テキストオブジェクト

テキストオブジェクトは基本操作方法の一つです。
https://vim-jp.org/vimdoc-ja/usr_04.html#04.8

定義としては操作のことであるらしいが、テキスト中にて、”ある単位”でオブジェクトを認識してくれる機能だと考えても良いと思う

  • よく使うオブジェクトの単位
    • 単語: スペース区切りでは確実に認識される、日本語は綺麗に書かないと期待する認識はされない
    • タグ: html, xmlでの<tag>
      • vue.jsなどのタグを認識するためには拡張の必要がある可能性がある(拡張なしでは未検証)
    • 記号: ", ', (, [, {, <で囲まれている

これらに対してさらに

  • 操作
    • 削除
    • 編集
    • コピー
  • 範囲(タグor記号)
    • 内側のみ
    • 全体

などを指定して実行できる

e.g.

python
print("hello")# hの上で di" と入力すると
print("")# "の上で da( と入力すると
print
html
<divclass="myclass"><p>hello world</p></div><!-- wの上で dat と入力すると --><divclass="myclass"></div><!--  mの上で da< と入力すると --></div>

tordory(操作)
+
iora(範囲)
+
torwor"or'or(or[or{or<(対象)
といった感じで使うことが多い

単発繰り返し(マイクロマクロ)

1.単発繰り返し single-repeat
最後の変更を繰り返す。変更の回数は[count]で指定した回数で置き換えられる。'cpoptions' に 'y' フラグが含まれてる時には、ヤンクコマンドも繰り返す。コマンドラインコマンドは繰り返さない。
https://vim-jp.org/vimdoc-ja/repeat.html#single-repeat

つまり、.はテキストに対して最後に行った編集を繰り返すコマンドである
どこかでみかけたマイクロマクロという呼び方で呼んでいた
汎用性の高い?抽象的な?操作を心がけていると、このコマンドはより高い利益をもたらしてくれる

python
print("hello")# hの上で di" と入力すると
print("")# "の上で da( と入力すると
print### 1行目の任意の位置で I# <Esc> と入力すると
# print("hello")
# hの上で di" と入力すると
print("")# "の上で da( と入力すると
print### その2行下、4行下の行の任意の位置で . と入力すると
# print("hello")
# hの上で di" と入力すると
# print("")
# "の上で da( と入力すると
# print

このとき、0i# <Esc>を使うと.は最後に行ったi# <Esc>しか記憶しないため期待する動作にはならない(0は行頭への移動)

これは単純な例だが、.の存在を踏まえて編集操作を選択すればより大きな恩恵を享受できる(学びはじめの頃は楽しい)

複雑な繰り返し(マクロ)

3. 複雑な繰り返し complex-repeat
タイプした文字をレジスタ{0-9a-zA-Z"}にレコーディングする(大文字なら追記)。レジスタを実行中は 'q' コマンドは無効化される。マッピングや :normal の中でも機能しない。
https://vim-jp.org/vimdoc-ja/repeat.html#complex-repeat

すなわち、文字のキーに複雑な処理を記憶させることができるということ
自動的に最後の編集を記憶する.とは異なり、記憶させる宣言が必要である

個人的に、丁寧に確認しつつ記憶させないと期待しない編集をすることがあるので、利用するには腰が重い
これも正式名称ではないが、マクロと呼んでいる

html
<divclass="myclass"><p>hello world</p></div><!-- wの上で dat と入力すると --><divclass="myclass"></div><!--  mの上で da< と入力すると --></div>

1行目の任意の位置で qwI<!-- <Esc>A--><Esc>q と入力すると(今回はwに保存)

<!-- <div class="myclass"><p>hello world</p></div> --><!-- wの上で dat と入力すると --><divclass="myclass"></div><!--  mの上で da< と入力すると --></div>その2行下、4行下の任意の位置で @w と入力すると

<!-- <div class="myclass"><p>hello world</p></div> --><!-- wの上で dat と入力すると --><!-- <div class="myclass"></div> --><!--  mの上で da< と入力すると --><!-- </div> -->

コメントアウトの例ばかりだったが、思いつかなかっただけなので実際には適用例は多い(はず)

実践例

プログラムではないが、簡易的な日中の予定兼TODOリストをファイルで管理する例
これはn倍速なのでかなり早くなっているが、操作としても9:00と3くらいしか具体的な入力はしていないでのかなり楽だった
vim_demo.gif
gifじゃない元動画のリンク

  • ちなみにファイルで管理する理由
    • GUIがめんどくさい
      • vimでのコピーペーストはドラッグ&ドロップよりも楽だと感じる
    • 簡易さ

vim以外での"vim"

みんながつかっていることはいいことで、その恩恵としてvim操作を可能にする拡張が他の環境でも大抵存在している(開発してくれている方がいる)

  • chrome
  • jupyter notebook
  • bash/zsh
  • 他エディタ などなど

おわり

なんだかんだ基本操作の列挙してない???

検索について

$
0
0

概要

私が使用している検索テクニックをまとめました。

基本

*

検索で使うのは、ほぼこれだけです。

手打ちは面倒です。

検索ワードはファイル内に存在するので移動したほうが早いことが多いです。

単語を調べたいけれど、単語までが遠い場合

\<aaa\>

は、打つの面倒なので

/aaa

で検索してから、*を使用します。

単語を打つのが面倒でクリックするのも面倒な場合

.

で代用します。

a...b

みたいな感じです。
先頭と末尾だけで合致すれば、ほぼ見つけられます。

単語の途中を調べる場合

/<c-r><c-w>

でカーソルしたをとり、編集します。

検索して変更したい場合

cgn<c-r>"

消して復元して編集します。

検索して先頭の文字を変更したい場合

5s

先頭はこちらも使えます。

検索したやつの後ろに移動したい場合

//e+1

//e+1をもう一回編集する場合

/<c-n>

検索したやつをGrepする場合

:vim // %
:vim // *

もう一回検索する

//

さいごに

以上です。

Vimいいよってお話

$
0
0

何か布教したいエンジニア AdventCalendar 2019の5日目の記事です。

はじめに

普段はサーバーに接続して直接ファイルを編集するときにvimを使っています。
使っていく中でいいなと思った点、微妙だと思った点を挙げていきます。
具体的な操作方法はそんなに詳しく書いていません。

vimの良いところ

1. キーボードだけですべての操作が可能

個人的にはこれが何よりの利点です。
何をするにしてもマウス操作がいらないので無駄に手を動かすことなく、タイピングに集中できます。
h,j,k,lのカーソル移動に慣れてしまうと、ほかのエディタ使うと少しイライラします…

2. 気軽に編集ができる

ほかのエディタでは編集したいファイルをクリックして開いてから編集しますが、vimの場合vim <編集したいファイル名>と打つだけですぐに編集ができます。
またサーバーにあるファイルを編集する際、ほかのエディタではSFTPなどの設定をしたり、サーバーからファイルを落として編集、アップロードしなければいけませんが、vimを使う場合基本的にサーバーに接続しているのでそのような設定や操作がいらないのも手軽でいいです。

いまいちなところ

1. 設定のわかりにくさ

設定を.vimrcというファイルに書く必要があり、ほかのエディタと比べるとわかりやすいとは言えません。
またプラグインを入れることもできますが、やはり他と比べると少し面倒に感じます。

2. 補完が弱い

Ctrl+n/Ctrl+pで一度書いた単語を補完することはできますが、一度も出ていない単語は補完してくれません。
プラグインで解消することはできますが、やはりIDE等の補完や予測変換には負けると思います。

3. 慣れるまでに(ほかのエディタより)時間がかかる

正直これが一番大きい点だと感じます。
ノーマルモード、インサートモードなどのモードの概念や各コマンドなど覚えることが多く、初めて触ったときは拒絶感がありました。
ですが、基本的には

  • ノーマルモードからインサートモード(ノーマルモードでiキー)
  • インサートモードからノーマルモード(インサートモードでESCキー)
  • ファイルの保存(ノーマルモードで:w)
  • 編集終了(ノーマルモードで:q)

ができれば十分で、さらに便利にしたいと思った時にコマンドを調べればいいので、1日もあれば上記の操作はできるようになると思います。

最後に

vimは少し癖があって扱いにくい印象がありますが、慣れてしまえばどうということはなく、シンプルな分、自分好みのエディタにすることが可能です。
この記事を読んで少しでもvimに興味を持ってもらえたらいいなと思います。

おまけ

これだけは絶対に設定ファイルに書いたほうがいいです。

.vimrc
inoremap <silent> jj <Esc>

通常インサートモードからノーマルモードに戻る際、ESCキーを押す必要がありますが、この設定ではjを2回押すことでインサートモードからノーマルモードに戻ることができます。
押すキーは1つ増えますが、少し離れたESCキーを押すよりも効率よくモード切替ができます。

なぜ私はVimを使い始めたのか:アンドゥ機能事始め

$
0
0

動機

Vim歴がもうすぐ7年になろうとする私ですが、そもそもVimを使い始めた理由は当時のエディタの中でアンドゥ()の機能が最も優れていたのがVimだったからです。

しかし、Vimのアンドゥ機能は十分に理解されているとは言い切れないと思っています。そこでこの記事ではVimのアンドゥ機能について解説を加えていきます。

本編

Vimのアンドゥ機能の基本

Vimではアンドゥをu、リドゥをCtrl+rで行います(どちらもノーマルモードでの話)。

Vimはアンドゥの履歴をツリー状にかつ無制限に保存できます。特に「ツリー状」のアンドゥ機能(アンドゥツリーとも言われます)を持つエディタはなかなか珍しいのではないかと思います。

アンドゥ機能がツリー状であることとモーダル形式の編集が合わさることでVimの強力な優位性が生まれます。モードに入ってから出るまでが一つのアンドゥ単位であるため、論理的に意味のある編集(インサートモードで特定の文字列を入力する・c2wなどで文字列の変更を行うなど)を繰り返すことであたかも各編集がGitにおけるコミットであるかのように扱うことができます。

アンドゥツリー間の移動がブランチのチェックアウトと似ている点が重要で、プラグインを使ってアンドゥツリーを可視化することでGitに近い操作性で過去の編集を取り戻すことができます。

具体例

original
classFoodefbarputs'bar'endend

以上のファイルが与えられているとします。ここで、メソッド名を変更します。

modified1
classFoodefbazputs'bar'endend

しかし、この変更はあまり良くないとわかったため、uで操作をアンドゥしoriginalに戻ります。
その後、今度はクラス名を変更します。

modified2
classHogedefbarputs'bar'endend

ここで、modified2からmodified1に戻るにはどうすればいいのでしょうか?

Vimの標準機能でやる場合、:undolistでアンドゥの一覧を取得しundo nでn番のアンドゥ履歴を復元できます。しかし、これはあまり直感的ではありません。
私はundotreeというプラグインを使っています(レポジトリのURL)。これはアンドゥツリーをビジュアルに表示するツールです。jkのようなVim標準の操作で履歴間を移動し、差分のプレビューを見ながら目的の履歴を復元できます。

スクリーンショット 2019-12-04 21.20.02.png

これはundotreeプラグインでmodified1の状態に復元したところです。どこが変更されたのかも含め、わかりやすく表示されています。

実際に試してみるとわかるのですが、FooHogeに変更した、これをu一つで戻れるだけでもかなり便利です。さらにツリーの機能により、「さっきのあの状態」に戻れるという安心感を得ることができます。

アンドゥの永続化

ここまででも便利なアンドゥ機能ですが、なんとVimを閉じたあともアンドゥを保存しておけるという機能があります。
設定は簡単で、

if has("persistent_undo")set undodir=$HOME."/.undodir"set undofile
endif

こんな感じのコードを.vimrcに記述するだけです($HOME."/.undodir"の箇所を好みの場所に書き換えてください)。

タイムトラベル

Vimには履歴を順に行ったり来たりする機能だけではなく、履歴を時間指定する機能まであります。機能の性質上例示が難しいのですが、:earlier 1dで1日前の状態に戻れるようです。

小ネタ:インサートモードの途中で履歴を分けたい場合

通常、インサートモードでの文字列の追加は全て一つのアンドゥ単位として扱われます。しかし、長文を入力するときなど、途中でアンドゥの区切りを入れたくなるときがあります。そういったときはCtrl+g uをインサートモード内で使います。

まとめ

Vimのアンドゥ機能についてざっとまとめてみました。機能として必要十分であり、プラグインの支援を得ることでとても強力なものになりえます。普段Vimを使っている方もそうでない方も、色々と試してみることをおすすめします。

参考文献

:h undo.txt
:h usr_32.txt

Vimでロック・リーする

$
0
0

この記事はRUNTEQ Advent Calendar 2019 5日目の記事です。
昨日は @tukinasikotonohaさんの 『地方出身のエンジニア未経験者が、東京のプログラミングスクールに通う前にやっておいた方が良いこと』でした。


『木の葉の美しき碧い野獣』ロック・リーを知っているか?
私は子供の頃、彼が好きだった

私が初めてのエディタにVimを選んだのも、体術というシンプルな技を極めんとするリーの姿と、無骨でシンプルなエディタを使いこなすVimmerの姿が無意識のうちに重なったからかもしれない

そう、私はVimでロック・リーになりたかった

ところが今の私はどうだ

私はロック・リーになれなかった。呪印の力に溺れ、堕ちたのだ

他人のvimrcをコピペした。キーリピートの速度を上げ、全ての移動を hjklで済ますようになった。プラグインの存在を知ってからは、毎日貪るように新しいプラグインを導入した

vim-easymotionを導入した時になってようやく私はそれが大蛇丸の呪印であることに気づいたが、もう遅かった。この時にはもう、Vimの基本的な体術である wbを使って移動することは馬鹿らしいとさえ考えていた

プラグイン、キーマップ、vimrc編集の危うさ

Vimのカスタマイズ性を楽しみにVimに入ってきた者は、初心者のうちから積極的なカスタマイズをしたがる傾向にある。だが呪印の餌食になりたくなければ慎重になった方がいい

Vimのノーマルモードではほぼ全てのキーに何らかのマップが施されている。独自のキーマップも確かに便利だが、デフォルトのマップを潰してしまう可能性は常に考えておかねばならない(デフォルトの全てのマップは :h index.txtで確認できる)

プラグインは呪印だ。簡単に強大な力を得られるが、その代償として「速さ」と「どこでも使えるポータブルなVim力」を失うことになる。このトレードオフのどちらを取るかは人それぞれだが、「プラグインや自分のvimrcがないとまともにVim使えない!」なんてことは避けたいものだ

Vimでロック・リーする

リーは自らの四肢に重りをつけて生活することで24時間鍛錬を続けていた

これに習い、Vimでもある程度の制約を設けることで通常より圧倒的に早く素のVim力を向上させることができる

すでに素のVimを使いこなしている人には必要ない鍛錬だが、過去の私のように、他人のvimrcをコピペしたり、よくわからないままプラグインを使っている人はぜひこの方法で鍛え直してみてほしい

過去の自分と決別する

$ rm-rf ~/.vimrc ~/.vim

キーを制限する

~/.vimrc
map <Left><Nop>
map <Down><Nop>
map <Up><Nop>
map <Right><Nop>
map <Backspace><Nop>

矢印キーを封印する代わりに word/WORDを使った移動、 f/tを使った移動、/の検索や mのマーク、{/}の空行移動などを使用する

バックスペースは別に封印しなくてもどちらでもいいが、私はホームポジションから離れたくないので <C-h><C-w>, <C-u>の方がより好みだ

<補足>負荷を上げる

~/.vimrc
map <Left>:qa!
map <Down>:qa!
map <Up>:qa!
map <Right>:qa!
map <Backspace>:qa!

もっと強い負荷の掛け方を思いついた人は教えて欲しい

キーのリピート速度を下げる

macなら簡単にキーリピート速度を変更できる

SS 2019-12-04 18.23.39.jpg

キーリピートが速いと長距離の移動でも hjklで済ませがちだ。これを制限することでVimの特徴的なモーションをより早く習得することができる

ヘルプを強制する

ヘルプには全ての情報が載っているし、他のどんな情報より正確だ
少なくとも下記2つの場面では必ずヘルプを見よう

  1. vimrcに新しい記述を追加するとき(set numberなど)
  2. 初めて使うキーを使用するとき(w, .など)

ヘルプは :h[elp] {検索ワード}で見ることができる
理想は自分がVim上で押す全てのキー・コマンドについてのヘルプを読むこと

<補足>ヘルプの日本語化

デフォルトのヘルプは英語。どうしても無理ならヘルプの代わりにvim-jp日本語ドキュメントを読むか、もしくは以下の手順でヘルプを日本語化する

  1. お好みのプラグインマネージャでvimdoc-jaをインストール
  2. vimrcに set helplang=ja,enを追記

vim-jpを毎日読む

ヘルプ参照に加えてvim-jp日本語ドキュメントを毎日読むこと。特にモーション、ジャンプ、検索、ファイル操作(ファイル移動)あたりを覚えたい

1日1コマンド覚えるつもりでこまめに読んでみてほしい

『実践Vim』を読む

実践Vim』は神本だ

Kindle版は2,000円ちょっとで購入できる

vimrc追記方針

YAGNIの法則に則る

追記の際は必ずヘルプを見ること

重りを外す

Vimで2週間もロック・リーしていれば、これまでより圧倒的に成長した自分のVim力に気がつくだろう

こうなったら、少しずつプラグインや独自キーマップ、キーリピートの速さを上げる、などに手を出していけばいい。鍛錬を積んだ君なら呪印も、禁術も使いこなすことができるはずだ

リーー!! 外せ!!!!!!!(マイト・ガイ)

脱terapadの為のvim環境構築

$
0
0

これはTokyo City University Advent Calendar 2019 6日目の記事だよ

情報系の学科なのにまだterapadでコード書いてるんですか?

キャンパス内で開講されるプログラミング系の講義ごとで使われているテキストエディタを調べると(講義名は割愛)

学年学科言語エディタ
1情報システムCterapad
1情報システムJavaIDE
2情報システムC++terapad
2情報システムJavaIDE
3情報システムphp+SQLterapad
1社会メディアJSterapad
1社会メディアJSterapad

とまぁこの通りほとんどの講義でソースコードをterapadで書いている.

講義のアシスタントをしていると「コンパイルが通らない理由がtypo」「スペースに全角が混じっている」みたいな理由で課題に苦戦する学生が多く,とてもかわいそう.

脱terapadの為のvim環境構築

vimのある幸せな世界へ

情報系の学科なのにエディタが無改造terapadでは救済されないのでvimを使ってコーディングすれば人生の悩みから解放されます.大学内で使えるパソコンには既にvimがインストールされており今日からでも使えるのですが、素のvimだといろいろ不便なので使いやすく改良してやろうというのが本記事の魂胆です.

最初は学内で使えるパソコン上でvimを便利に使えるようになるのを想定していたのですが,そこはgitもなければbashも使えない,想像を絶するゴミ環境不便さだったので諦めました.自分はAndroid上で動く仮想Linuxターミナルみたいなものでこれらをやりましたがwin系ならおおよそ同じ手順でできると思います.Macは知りません.以下の作業はgit bashとかやると幸せかもしれません.

:Tutorialをする(しなさい)

プロンプトおったててとりあえずvimとタイプしてvimを開きましょう(vimが入ってない場合はkaoriyaとかapt-get install vimとかで拾って来てください)

hoge

なんかでてきましたね.

続いて:Tutorialとタイプしましょう
tutorial

なんか始まりました.これはチュートリアルです,記事内でチュートリアルを書くのが面倒なので20分で終わるのでこれをしてください,というかこの記事は環境構築がメインなので細かい使い方とかは各自ググってください.

信仰もまずは形から

vimは.vimrcというファイルにいろいろ書き込むことでどんな細かい設定も自分好みに変更することができます.
.vimrcファイルを作って以下のコードをコピペしてあげればとりあえず最低限どうにかなります.信仰もまずは形からです.

"エンコードの設定
set encoding=utf-8
set fileencodings=utf-8,iso-2022-jp,euc-jp,sjis
set fileformats=unix,dos,mac

"ファイルの設定
" バックアップファイルを作らない
set nobackup
" スワップファイルを作らない
set noswapfile
" 編集中のファイルが変更されたら自動で読み直す
set autoread
" バッファが編集中でもその他のファイルを開けるように
set hidden
" 入力中のコマンドをステータスに表示する
set showcmd

" 見た目系
" 行番号を表示
set number
" 現在の行を強調表示
set cursorline
" インデントはスマートインデント
set smartindent
" 括弧入力時の対応する括弧を表示
set showmatch
" ステータスラインを常に表示
set laststatus=2
" コマンドラインの補完
set wildmode=list:longest
" 折り返し時に表示行単位での移動できるようにする
nnoremap j gj
nnoremap k gk
" 構文ハイライトの有効化
syntax enable
"ビープを鳴らさない
set belloff=all
"右スクロールバーを非表示
set guioptions+=R
"コメントを読みやすくする
autocmd ColorScheme * highlight Comment ctermfg=3
"タブの設定
set tabstop=4
set expandtab
set shiftwidth=4

"最後のカーソル位置を記憶
augroup vimrcEx
    au BufRead * if line("'\'") > 0 && line("'\'") <= line("$") |
                \ exe "normal g`\"" | endif
augroup END

"操作系
"改行時の自動コメントアウトを無効化
autocmd FileType * setlocal formatoptions-=ro
"クリップボードから貼り付けができるようにする
set clipboard&
set clipboard^=unnamedplus
" 行末の1文字先までカーソルを移動できるように
set virtualedit=onemore

"検索系
"検索文字が小文字のとき、大文字小文字を区別しない
set ignorecase
"検索文字が大文字のとき、大文字小文字を区別する
set smartcase
"同期的な検索をする
set incsearch
"ファイルの最後まで検索したらファイルの先手王に戻る
set wrapscan
"検索語をハイライトする
set hlsearch
"ESCキー連打でハイライトを解除
nmap <Esc><Esc> :nohlsearch<CR><Esc>

.vimrcを再び読み込むと変更が反映されます.このコピペに気に入らない箇所があったらググって直してください.

プラグインによる魂の浄化

上の変更はあくまでもvimが元々持ってる機能の調整でしかありません.なのでプラグインを入れてより便利にしましょう.
そのために,プラグインを管理するためのツールdein.vimをインストールします.

プラグイン管理ツールdein.vimのDark Powerを授かる

dein.vim

Dark Powerを持つvim/Neovimプラグインマネージャ

です(公式readmeより翻訳).これによって,欲しいプラグインが置いてあるgithubのレポジトリ名を書くだけでそのプラグインを自動的にvimに導入することが出来ます.

インストール

まずはホームディレクトリに.cache/vimというディレクトリを作成し,そこにcurlでdein.vimのインストーラを持ってきます.

$ mkdir -p .cache\dein
$ cd .cache\dein
$ curl https://raw.githubusercontent.com/Shougo/dein.vim/master/bin/installer.sh > installer.sh
$ sh ./installer.sh ~/.cache/dein

実行すると以下の文章が出てきます

"dein Scripts-----------------------------
if &compatible
  set nocompatible               " Be iMproved
endif

" Required:
set runtimepath+=/c/Users/$HOME/.cache/dein/repos/github.com/Shougo/dein.vim

" Required:
if dein#load_state('/c/Users/$HOME/.cache/dein')
  call dein#begin('/c/Users/$HOME/.cache/dein')

  " Let dein manage dein
  " Required:
  call dein#add('/c/Users/$HOME/.cache/dein/repos/github.com/Shougo/dein.vim')

  " Add or remove your plugins here like this:
  "call dein#add('Shougo/neosnippet.vim')
  "call dein#add('Shougo/neosnippet-snippets')

  " Required:
  call dein#end()
  call dein#save_state()
endif

" Required:
filetype plugin indent on
syntax enable

" If you want to install not installed plugins on startup.
"if dein#check_install()
"  call dein#install()
"endif

"End dein Scripts-------------------------

このコードを先ほどの.vimrcの末尾に加えて上げましょう.またこの時についでにインストールしたinstaller.shはrmしておきましょう.

tomlファイルの設定

本来は.vimrcに欲しいプラグインをドコドコ書いてあげるだけでいいのですが,せっかくなので必要なプラグインを別ファイルにまとめ,そちらで管理できるようにしてあげましょう..cache/dein/tomlという名前のディレクトリを作ってあげ,その中にplugins.tomlplugins_lazy.tomlの二つファイルを作ってあげます.plugins.tomlはvimの起動と同時にファイルが読み込まれます.一方,lazyは起動よりやや遅延してロードが発生する仕組みを持っているので,例えばビジュアルモードの時にのみ読み込まれるプラグインなんかはこちらに書いたりします.よくわかんなかったら気にせずplugins.tomlにプラグインを書いていけばいいと思います.

$ mkdir ./cache/dein/toml
$ cd ./cache/dein/toml
$ vim plugins.toml
$ vim plugins_lazy.toml

plugins.tomlファイルの方に欲しいプラグインを書いていきます.今回は例として,vim内でディレクトリを移動できるようになるプラグインVimFiler,インデントを可視化するindentLineを入れてあげましょう.hook_add=''''''で囲った部分は.vimrcと同じようにプラグインが持つ変数を変更できます.
以下plugins.tomlの中身

[[plugins]]
repo = 'Shougo/unite.vim'

[[plugins]]
repo = 'Shougo/vimfiler'

[plugins]]
repo = 'Yggdroot/indentLine'
hook_add = '''
    let g:indentLine_Char = '|'
'''

最後に.vimrcに先ほど追加した部分の一部書き換えます.数行追加して,最後の部分のコメントを外してやります.

"dein Scripts-----------------------------
if &compatible
  set nocompatible               " Be iMproved
endif

" Required:
set runtimepath+=/c/Users/$HOME/.cache/dein/repos/github.com/Shougo/dein.vim

" Required:
if dein#load_state('/c/Users/$HOME/.cache/dein')
  call dein#begin('/c/Users/$HOME/.cache/dein')
" tomlファイルのディレクトリを変数に持たせる
  let g:rc_dir = expand('~/.cache/dein/toml')
  let s:toml = g:rc_dir . '/plugins.toml'
  let s:lazy_toml = g:rc_dir . '/plugins_lazy.toml'


  " Let dein manage dein
  " Required:
  call dein#add('/c/Users/$HOME/.cache/dein/repos/github.com/Shougo/dein.vim')

  " Add or remove your plugins here like this:
  "call dein#add('Shougo/neosnippet.vim')
  "call dein#add('Shougo/neosnippet-snippets')

   call dein#load_toml(s:toml,{'lazy':0})
   call dein#load_toml(s:lazy_toml,{'lazy':1})

  " Required:
  call dein#end()
  call dein#save_state()
endif

" Required:
filetype plugin indent on
syntax enable

 If you want to install not installed plugins on startup.
if dein#check_install()
  call dein#install()
endif

"End dein Scripts-------------------------

書き終えてあと一度.vimrcを閉じ,再び開くとプラグインのインストールが自動で始まります.VimFilerがどんなものかはググってね.

これであなたもvimによって救われた

おわり

都市大アドカレ2019の6日目記事ということで書いたけど,新規性なことは全くないので多分これまでの中でも一番内容がゆるゆるなんじゃないでしょうか.本当は学内PCでこれらをやろうとしたけどgitもなければbashもない,それらを導入しても起動のたびにパスがなくなってしまう.そんな不便なもん使うんじゃねぇ!ということで諦めました.B4生にはあるまじきょゎょゎ記事なのですが備忘録のついで残す次第でありました.

明日はうちのかわいい学科の後輩ちゃんの担当です.


3分でわかるエディタ戦争物語

$
0
0

エディタ戦争って?

エディタ戦争(Editor War)とは、プログラミングを行う人々(特にハッカー文化に属する人々)の間で続いている、どのテキストエディタが一番よいかというテーマの論争を指す。 -wikipediaより抜粋

プログラマにとってエディタは手足、エディタは家族、エディタは生命です。どんなエディタを使うか、そしてそれをいかに使いこなすかがプログラマのステータス(自己満足)と言えるでしょう。

これはそんなエディタをめぐり、長らく続く戦争の記録です。

エディタの歴史

ラインエディタ時代

遥か太古、エンジニアはコマンドによってテキストを編集していました。この頃は世は全て事もなし、人々の心は安泰に包まれていたともいなかったとも言われています。とにかく、大きな争いは起こりませんでした。
ラインエディタではUnixのed系が有名です。

スクリーンエディタ

その後、ファイルの内容を画面に表示しながら編集することができるスクリーンエディタが登場しました。そして1970年代にはviEmacsという二つのエディタが生まれ、現代まで続くエディタ戦争の火種となりました。

vi

1976年にビル・ジョイ氏により開発されました。ラインエディタのexを先祖に持ち、コマンド等に根強く残っています。
viの特徴は以下の通りです

  • モード: viにはコマンド、挿入、ビジュアルなど多数のモードがあり、これらを切り替えながら編集します。
  • コマンド:コマンドモードでは文字列の挿入、削除、置換等を多数のコマンドを組み合わせて行います。
  • 軽量:viは他のエディタと比べてコンパクトです。

現在はvimという後継が広く普及しており、Unix系OSには大抵の場合このどちらかが標準で入っています。

Emacs

Emacsはviの少し前から同時期にMITで開発が始まりました。

  • コマンド:Emacsにはモードが存在せず、コマンドは修飾キー(Ctrlなど)と他のキーの組み合わせで入力されます。
  • 対応言語:多くの言語(C++等メジャーな言語からウィキペディアページの編集モードまで)がサポートされています。
  • カスタマイズ:Lispでエディタをカスタムできる他、拡張機能を入れればwebブラウザやメールまで使えます。

こちらも多くの人に広まりましたが、処理系が乱立した結果viほどのまとまりはないです。

エディタ戦争開戦

そのうちvi派とEmacs派は、お互いを批判し始めました。

vi派の主張

  • viはUNIX系OSには必ず含まれる。
  • Emacsはカスタムしすぎて他の環境になった時使いづらいが、viはそうでもない。
  • Emacsは十得ナイフであり、機能の多さのせいでリソースを使いすぎる。
  • 「Emacsは優れたOSだが、優れたエディタだけが足りない。」
  • viは修飾キーが無いから腱鞘炎にならない。

Emacs派の主張

  • viよりコマンドが豊富で、しかもモードに煩わされない。
  • Lispにより容易に拡張できる。
  • Emacsは多くのニーズに応えられる。

その後Emacs教会ができたりviカルトができたりして、エディタ界はこの二派で大別されました。
これにより情勢は安定されたかのように見えましたが...

エディタ戦国時代

vi(とその後継であるvim)もEmacsも、CUI上で使われることが普通でした。
しかしグラフィカルのウィンドウを持つOSが普及し、今やデスクトップ用途のほぼ全てでGUIが使われています。エディタも例外ではなく、GUI上で動作するものが台頭するようになりました。
最近では以下の3つがメジャーといえます。

Atom

GitHub開発。テーマは"A hackable text editor for the 21st Century"
macOS、Windows、Linux等で動作し、パッケージをインストールすることで機能をカスタマイズできる。

Sublime Text

プロプライエタリ(商用)のエディタ。Pythonで開発されているらしい。
macOS、Windows、Linux等で動作し、ファイル検索等プロジェクト管理に強い(らしい)。

Visual Studio Code

Microsoft開発。同社のIDEであるVisual Studioのテキストエディタ部分。
macOS、Windows、Linux等で動作し、結構早い。

現状

プログラミングという行為がコマンドラインで行われるとは限らないのは、今や常識となりました。
しかしvi(,m)やEmacsを未だ愛用する人も多く、vimは現在でも1位か2位の人気を誇ります。
これらの背景には、単純に好き・CUIはどんな環境でも使える・コンパイラやgit等ツールの使用がCUIからの方がやりやすい等の理由があります。
最早エディタ戦争は、作業環境におけるGUC派とGUI派の代理戦争となったのです(???)

感想

vimは慣れるまで苦労したが、コマンドで編集できるのは結構楽だし面白い。まだまだ訓練の余地はあるし、使えば使うほど手に馴染むエディタだ。
AtomやVS Codeなどはプロジェクト管理やwebサービスとの連携においては最早IDEとの境界も曖昧なくらい高機能だが、テキスト入力についてはコマンドは排除されショートカットくらいしかない。それってnanoと変わらなくね?
という老害っぽいことを以前話したら、友達に「Atomにも操作をvimっぽくするパッケージあるよ」と言われた。諸行無常。

これが無いと個人的に辛いVimの話

$
0
0

この記事はVim2 Advent Calendar 2019の6日目の記事です。

はじめに

皆さん、Vim使ってますか? 私は、iterm2+neovim+tmuxという環境で毎日使っています。(iterm2からAlacrittyに乗り換えたいが、日本語入力がなぁ、、、、)
ほんの2年前は「Vimで作業なんてできない! SublimeTextで十分や!」なんて言ってましたが、今じゃ「Vimじゃないと仕事できない!!」なんて言ってる今日このごろです。
ただVSCodeの勢力がものすごくて、部署の殆どの人がVSCodeを使っています。Vimを使ってるのは自分だけという肩身の狭い思いをしながら毎日を過ごしてます。

それなりに使ってきた中で、「こいつを入れておいてよかった」「意外とこのマッピング便利」など、良かったものを書いていこうかと思います。
たくさんあるので、その中でもいくつかピックアップします。

プラグイン編

0. vim-plug

https://github.com/junegunn/vim-plug
軽量でシンプルなプラグインマネージャ。Vimmerな人の多くはdein.vimを使ってるようですが、こちらを使っています。0と書いてるのはこれがないと何も始まらないからです笑

1. fzf.vim

https://github.com/junegunn/fzf.vim

fuzzy検索用コマンドfzfをVimから扱えるようにするプラグイン。これが無いと作業が進まないですね。入れておいて損は無いプラグインです。
デフォルトでリポジトリ内のファイルを検索して開いたり、agコマンドによるファイル内検索などが標準で提供されています。

よくやるのは、
1. ag(またはrg)コマンドでファイル内検索
2. 該当箇所を見つけたら、それを含むファイルを選択
3. QuickFixに出力されるので、qfreplaceと組み合わせて置換処理
4. 保存すると変更が反映されます
replace.gif

おすすめマッピング

# カーソル下にあるwordをagで検索
nnoremap <silent><leader>ag  :Ag <C-R><C-W><CR>
nnoremap <silent><leader>AG  :Ag <C-R><C-A><CR>
# visual modeで選択したwordを検索
xnoremap <silent><leader>ag  y:Ag <C-R>"<CR>

# ファイルを開く(CrtlP風、よく使います)
# 条件分岐はNERDTree上で使うと、ツリー内でファイルが開かれるのを防ぐために入れてます
autocmd VimEnter * nnoremap <silent><expr><C-P>(expand('%')=~'NERD_tree' ? "\<C-W>\<C-W>":'').":Files<CR>"

# カーソル配下の文字列からファイルを開く(gfとかでうまく開けない場合に便利です。たまに使います)
autocmd VimEnter * nnoremap <silent><expr><leader>F (expand('%')=~'NERD_tree' ? "\<C-W>\<C-W>":'').':Files'.(!empty(expand('<cword>')) ? '--query='.expand('<cword>'):'').'<CR>'

Filesコマンドの代わりに、https://github.com/tweekmonster/fzf-filemruのFilesMruを使ってます。
リポジトリごとに最近開いたファイルがまとまって上位に表示されるのでおすすめです。
あとneovimを使ってる場合、fzf.vimのpreview表示で、 --no-unicodeオプションを付けるとsyntax表示が正常になるのでつけると良いです。

2. coc.nvim

https://github.com/neoclide/coc.nvim

YouCompleteMeやdeopleteなどのauto-completion系プラグインの一つです。(LSPで動作します)
少し前まではdeopleteを使ってたのですが、Python依存が強くて動かなくなることが結構ありました。YouCompleteMeも依存モジュールが結構あって、deoplete同様設定周りが大変そうだったので、代替を探してた際に見つけたものです。これのすごいところは、

  • インストールすればすぐ使えるようになる
  • 補完がめちゃ早い
  • 専用の拡張が豊富(補完以外にも様々な拡張があり、これで事足りるんじゃないかというくらい)

設定はWikiに分かりやすく載ってるので読んでみてください。今使ってる拡張として

letg:coc_global_extensions=[      \'coc-lists'      \,'coc-json'      \,'coc-marketplace'      \,'coc-html'      \,'coc-css'      \,'coc-tsserver'      \,'coc-solargraph'      \,'coc-python'      \,'coc-snippets'      \,'coc-vetur'      \]

があります。 この変数に設定しておくと、vim起動時にその拡張がなければ勝手にインストールしてくれます。

3. vim-easyclip

vimのヤンクや削除などのoperatorの操作を拡張させた感じのプラグインです。いくつかのマッピングが変更されています。
これを入れると、例えばddが一行削除とクリップボードにコピーが行われたものが、一行削除だけになりクリップボードにコピーされなくなります。代わりにmmが一行削除とクリップボードにコピーとなります。

おすすめマッピングと設定

# クリップボードにコピーしたものを履歴として残す。vim再起動時に復元
letg:EasyClipShareYanks=1

vimscriptを書いてfzfを使って今までコピーした履歴から復元することも可能
vimを終了して再度開き直しても呼び出せるので、結構便利です。

# easycilpからコピーした一覧を取得
function!s:yank_list()redir=> ys
  silent Yanks
  redir END
  return split(ys,'\n')[1:]endfunction

# 引数からPasteコマンドで貼り付け
function!s:yank_handler(reg)if empty(a:reg)
    echo "aborted register paste"elselet token = split(a:reg,' ')
    execute 'Paste'. token[0]endifendfunction

# fzfを使って一覧を呼び出して貼り付け
command! FZFYank call fzf#run({\'source':<sid>yank_list(),\'sink':function('<sid>yank_handler'),\'options':'-m --prompt="FZFYank> "',\'down':'40%'\})

# マッピングはお好みで
nnoremap <C-Y><C-Y>:<C-U>FZFYank<CR>
inoremap <C-Y><C-Y><C-O>:<C-U>FZFYank<CR>

こんな感じになります
yank.gif

4.git-messenger.vim

https://github.com/rhysd/git-messenger.vim
カーソルの行変更のコミットをPreviewウィンドウやホップアップで確認することができるプラグイン
使う頻度はそこまで高くないですが、変更履歴をサッと確認するのに便利です。
マッピングはREADMEを読んで設定してみてください。

こんな感じになります
messenger.gif

マッピング編

プラグインとは関係ないけど、リマップしてよく使ってるものを抜粋

" escと押し間違えてhelpを開かないようにする
nmap <F1><nop>
imap <F1><nop>" neovimのターミナルでECSキーでノーマルモードにするif has("nvim")
  autocmd TermOpen * tnoremap <Esc><C-\><C-N>endif" ウィンドウをCtrlとjklhで移動する
nmap <C-j><C-w>j
nmap <C-k><C-w>k
nmap <C-l><C-w>l
nmap <C-h><C-w>h" 画面分割
noremap <silent><C-w>s :<C-u>split<CR>
noremap <silent><C-w>v:<C-u>vsplit<CR>" 行移動
vnoremap <silent>J :m'>+1<CR>gv=gv
vnoremap <silent>K :m-2<CR>gv=gv
nnoremap <silent>J :m+<CR>==
nnoremap <silent>K :m-2<CR>==" OS側のクリップボードにコピーする(vimのクリップボードと共有したくなかったので、必要なときだけコピーできるようにしてます)
command! Pbcopy0 :let @*=@0
nnoremap YY yy:<C-U>Pbcopy0<CR>:echomsg"Copy to Clipbord!"<CR>
vnoremap YY y:<C-U>Pbcopy0<CR>:echomsg"Copy to Clipbord!"<CR>" スペースキー2回で保存する
noremap <space><space>:<C-U>w<CR>" quickfixとlocation list内にあるファイル間の移動し、ターミナル中央に移動
nnoremap ]q:cnext<CR>zz
nnoremap [q:cprev<CR>zz
nnoremap ]l:lnext<CR>zz
nnoremap [l:lprev<CR>zz

設定編

"コメントアウト行後の改行時にコメントアウトを入れない" この2つを設定すると、コマンドモードで小文字でもタブ補完できるようにするset ignorecase
set smartcase

auFileType * setlocal formatoptions-=ro

" neovimでターミナルの色がcolorschemeと違った感じになるのを防ぐ設定if has("nvim")letg:terminal_color_0="#1b2b34" "black
  letg:terminal_color_1="#ed5f67" "redletg:terminal_color_2="#9ac895" "green
  letg:terminal_color_3="#fbc963" "yellow
  letg:terminal_color_4="#669acd" "blue
  letg:terminal_color_5="#c695c6" "magenta
  letg:terminal_color_6="#5fb4b4" "cyan
  letg:terminal_color_7="#c1c6cf" "white
  letg:terminal_color_background="#1b2b34" "background
  letg:terminal_color_foreground="#c1c6cf" "foreground
endif" カーソルの位置を復元するif has("autocmd")
  augroup redhat
    autocmd BufRead *.txt set tw=78
    autocmd BufReadPost *
    \if line("'\"")>0&& line ("'\"")<= line("$")|    \   exe "normal! g'\""|    \endif" git commitのカーソル位置は常に最初
    autocmd VimEnter FIleType gitcommit normal! gg0
    autocmd VimEnter COMMIT_EDITMSG  normal! gg0
  augroup END
endif" vimでファイルを開いたときに、tmuxのwindow名にファイル名を表示if exists('$TMUX')&& !exists('$NORENAME')auBufEnter * if empty(&buftype)|call system('tmux rename-window "[vim]"'.expand('%:t:S'))|endifauVimLeave * call system('tmux set-window automatic-rename on')endif

tmuxのファイル名の表示はこんな感じになります(左下のstatuslineを見るとわかります)
openfile.gif

まとめ

ざっと書きましたが、ごく一部の設定になります。vimのカスタマイズって沼ですよね。手を付けてしまうとなかなか抜け出せないです。
自分だけのオリジナルのvimを作って、VSCodeに引けを取らないエディタを目指しましょう!

ぼくのVimさばきを支える設定とその導入手順を紹介する

$
0
0

<まえがき> Vimはこわくない。 :sunflower:

つい最近までVimといえば強いエンジニアが使うこわいエディターだという勝手なイメージが私の中にありました。
しかし、いざvimrcを自分でカスタマイズし始めると楽しくなってしまい、いつの間にかメインエディターがVimになりました。Vimmerの数だけVimがあり、使い方に正解のないというVimの魅力に気づいてしまったのです。
この記事ではこれまでに私が行ったVimを使いやすくするための設定とその手順を紹介します。
あくまでカスタマイズの一例として誰かの役に立てると嬉しいです。Vimはこわくありません!:sunny:
d1d05424d7ca11326ac2686ce07e69c2.gif

目次 :book:

この記事では筆者がVimを(そこそこ)使いこなせるようになった設定とその導入手順をご紹介します。
手順に沿って設定を進めれば誰でもVimを(そこそこ)使えるようになるはずです:fire:

章番号タイトル
1章.vimrc をdotfilesで管理しよう :gear:
2章Vimの基本設定をしよう:pick:
3章VimとEmacsのキーバインドと仲良くなろう :open_hands:
4章dein.vimでプラグインを管理しよう :zap:
5章おすすめのプラグインを紹介します :doughnut:
6章画面分割をビシバシっ!とキメよう :waning_gibbous_moon:
7章tmux導入してターミナル環境を整えよう :family_wwbb:
8章tigを使ってターミナルからgitを高速で操作しよう :pencil:
9章fzfで高速な単語検索とファイル検索を実現しよう :mag:
10章強力なLanguage Serverの恩恵を受けよう :muscle:

ダラダラと書いていたら長くなったので気になるところだけ読んでくださいmm

1. .vimrc をdotfilesで管理しよう :gear:

基本的にVimの設定は~/.vimrcに記述します。(.vimrcがない場合は作成します)
Vimの使い心地に大きく影響する.vimrcをコンピュータごとにカスタマイズするのは大変です。
そこでdotfilesの出番です。dotfilesを利用して.vimrcを効率的に管理しましょう。

この章の続きを読む

dotfilesは.zshrc.vimrcといった設定ファイルを一つにまとめたディレクトリの総称です。
dotfilesをGit管理下におき、Gitホスティングサービス(GitHubなど)で管理することで、複数のコンピュータで同じ設定ファイルを簡単に用意することができます。

さっそくdotfilesを作成し、Git管理を始めましょう。

dotfilesを作成する
$ mkdir dotfiles
$ cd dotfiles
$ git init

次にdotfilesへバージョン管理したい設定ファイルを追加していきます。
例えば、ホームディレクトリ直下の何らかの設定ファイル.hogercをdotfilesで管理する流れは以下のようになります。
① ホームディレクトリ直下の.hogerc~/dotfiles/へ移動させる。
② ホームディレクトリ直下に~/dotfiles/.hogercへのシンボリックリンクを作成する。

具体的なコマンド
$ mv ~/.hogerc ~/dotfiles/
$ ln-s ~/dotfiles/.hogerc ~/.hogerc

シンボリックリンクの作成とは簡単に言えば「このファイルを参照したい時はこっちを見てね!」という目印ファイルを作成しておくことです。これによってこれまで通り設定ファイル~/.hogercへの参照が解決されます(ハッピー)。

それでは上記の基本的な流れに沿って.vimrcをdotfilesで管理しましょう。

.vimrcをdotfilesで管理する
$ mv ~/.vimrc ~/dotfiles/
$ ln-s ~/dotfiles/.vimrc ~/.vimrc

これでdotfilesで.vimrc管理を始めることができました:star2:
ついでにホームディクレクトリ直下の.vim.zshrc.zprofileといった設定ファイルも ~/dotfiles/ へ移動させ、シンボリックリンクを作成しておきましょう。

ここからは余談ですが、dotfilesにはinstall.shなどの名前で、シンボリックリンク作成やパッケージインストールのコマンドをまとめたシェルスクリプトを用意しておくことが多いようです。dotfilesをgit cloneしてinstall.shを実行するだけで環境設定が終わればとってもスマートです:sparkles:

GitHubで公開されている様々なdotfilesを参考に、オリジナルのdotfilesを育てていくと良さそうです。

2. Vimの基本設定をしよう :pick:

この章では、筆者の.vimrcを紹介します。
すでに.vimrcを自分でカスタマイズしている方はスキップしていただいて大丈夫です。

以下の.vimrcから必要な設定があればコピーしましょう。

この章の続きを読む

そのままコピーすると筆者と同じVim設定(2019/11/25現在)となります(:skull::beginner::warning:)。
.vimrc(筆者の.vimrcより抜粋/コメント付き)
" シェルを指定してくださいsetshell=/bin/zsh

" encodingset encoding=utf8
scriptencoding utf8
set fileencoding=utf-8set termencoding=utf8
set fileencodings=utf-8,ucs-boms,euc-jp,ep932
set fileformats=unix,dos,mac
set ambiwidth=double
set nobomb
set t_Co=256" スワップファイルの作成先を変更setnoswapfile" ヤンクをクリップボードへ繋ぐset clipboard+=unnamed

" ビープ音を消すset belloff=all" 行番号系setnumber" タイトル系set title

" インデント系filetype plugin indent onset expandtab
set tabstop=2set softtabstop=2set autoindent
set smartindent
set shiftwidth=2auFileTypegosetlocalsw=4ts=4sts=4 noet

" 挿入モードでバックスペース削除を有効set backspace=indent,eol,start" 検索するときに大文字小文字を区別しないset ignorecase

" 検索した時にハイライトset hlsearch

" キーバインド------------------------------------------------------------------" xで削除した時はヤンクしない
vnoremap x "_x
nnoremap x "_x

" 1 で行頭に移動
nnoremap 1 ^

" 2で行末に移動
nnoremap 2 $

" , で前のバッファタブへ
nnoremap <silent>,:bprev<CR>" . で次のバッファタブへ
nnoremap <silent>.:bnext<CR>" Option + | でファイル内の文字置換
nnoremap \ :%s/old/new/g<LEFT><LEFT><LEFT><LEFT><LEFT><LEFT><LEFT><LEFT>" 現在のバッファ削除
nnoremap bd:bd<CR>" 括弧の補完
inoremap {<Enter>{}<Left><CR><ESC><S-o>
inoremap [<Enter>[]<Left><CR><ESC><S-o>
inoremap (<Enter>()<Left><CR><ESC><S-o>" クオーテーションの補完
inoremap ' ''<LEFT>
inoremap " ""<LEFT>" insertモードでemacsのキーバインドを使えるようにする
imap <C-p><Up>
imap <C-n><Down>
imap <C-b><Left>
imap <C-f><Right>
imap <C-a><C-o>:call<SID>home()<CR>
imap <C-e><End>
imap <C-d><Del>
imap <C-h><BS>
imap <C-k><C-r>=<SID>kill()<CR>" visulaモードでインデント調整後に選択範囲を開放しない
vnoremap >>gv
vnoremap <<gv

" 画面分割系
nnoremap sj <C-w>j
nnoremap sk <C-w>k
nnoremap sl<C-w>l
nnoremap sh<C-w>h
nnoremap ss :<C-u>sp<CR><C-w>j
nnoremap sv:<C-u>vs<CR><C-w>l" plugin manager ---------------------------------------------" 4章で紹介" ------------------------------------------------------------" カラースキーム(任意です)if(empty($TMUX))if(has("nvim"))let $NVIM_TUI_ENABLE_TRUE_COLOR=1endifif(has("termguicolors"))set termguicolors
  endifendif

syntax oncolorscheme onedark

上記の.vimrcをコピーするとデフォルトのVimに行番号表示、括弧補完などの機能が追加されます。
Vimが少しだけリッチになりましたね:sparkles:
(なお、筆者の.vimrcをそのままコピーした方はこれ以降の章の.vimrcへの追記の項目はスキップして大丈夫です)


ちなみに筆者の最新の.vimrcこちらです。

3. VimとEmacsのキーバインドと仲良くなろう :open_hands:

Vimの独特なキーバインドは慣れるまでは苦行のように感じるかもしれません。さらにVimに登場するモードという概念が他のエディターから移ってきた人を混乱させます。しかし、一度慣れてしまえばその強力なキーバインドに病みつきになってしまうでしょう。

Vimのキーバインドを使いこなすためには練習あるのみです。
筆者の場合は1週間Vim以外のエディターを使わないという縛りを課すことでVimに対する気持ち悪さを消すことができました。
(Vimのキーバインドを紹介する記事は広いインターネットの世界にたくさん転がっているため、ここでは細かいキーバインドの説明は割愛します:scissors:)

この章の続きを読む

はじめてVimの操作を学ぶにはチュートリアルが最適です。

terminal
$ vimtutor

コマンドを実行すると以下の画面が立ち上がり、Vimの操作方法を順序よく学ぶことができます。
スクリーンショット 2019-11-24 21.20.57.png
ちなみに$ vimtutor enとコマンドを実行すると言語を切り替えることができます(できました)。


さて、この章のタイトルは「VimとEmacsのキーバインドと仲良くなろう」でした。
なぜEmacs???と疑問に思われた方もいるのではないでしょうか。

実はMacOSはデフォルトでEmacsライクなキーバインドが使えます。
試しにGoogle documentのファイルの中でEmacsキーバインドを使ってカーソルを移動させると上手く動作することが確認できます。
dfdc51754d1c8051da2e22dd07c8cbf0.gif

覚えると便利なEmacsカーソル操作のキーバインドは以下です。(C-p: コントロールキーを押しながらpを押すという意味)

Emacsキーバインド説明単語の意味Vimキーバインドでは
C-p1 行上に移動previousk
C-n1 行下に移動nextj
C-f1 文字前に移動forwardh
C-b1 文字後に移動backl
C-a行の先頭に移動-^
C-e行の末尾に移動-$

一見するとキーが散らばっていて難しく感じますが、単語の意味を考えると覚えやすいと思います。

.vimrcに以下の設定を追加した時、上記のEmacsキーバインドがVimで威力を発揮します:japanese_ogre:

.vimrc
" InsertモードでEmacsのキーバインドを使えるようにする
imap <C-p><Up>
imap <C-n><Down>
imap <C-b><Left>
imap <C-f><Right>
imap <C-a><C-o>:call<SID>home()<CR>
imap <C-e><End>
imap <C-d><Del>
imap <C-h><BS>
imap <C-k><C-r>=<SID>kill()<CR>

コメントアウトの通りですが、上記の設定を追加するとInsertモードでEmacsキーバインドを利用したカーソル移動が可能になります。
35b85e2c58f590e865294d97fca25728.gif
地味ですが、Normalモードに戻らずカーソルを操作できるのは便利です。

ちょっとした編集の際にぜひ使ってみてください:relieved:

4. dein.vimでプラグインを管理しよう :zap:

幸せなことにインターネットの世界では私たちのVimを強化するプラグインを公開してくれている方々がいます。
その恩恵を最大限に受けるためにもプラグインマネージャを使ってプラグインを効率的に管理しましょう。

公開されているプラグインマネージャーにも様々なものがありますが、筆者はShougoさんが開発されている dein.vimを使っています。

この章ではdein.vimの基本的な使い方を解説します。さっそくdein.vimを使ってプラグイン管理をはじめてみましょう。
Quick startに記載されている通りの手順を踏めばdein.vimの導入は簡単です。
しかし、ここでは一歩踏み込んだ設定としてプラグインの設定をtomlファイルとして切り出す方法を紹介します。

この章の続きを読む

まずは以下のコマンドを実行してdein.vimをインストールしましょう。
2つ目のコマンドではdein本体をインストールするディレクトリを自由に指定することができます。
ここでは~/.vim/bundlesとしていますが ~/.cache/dein~/.local/share/deinなど他のディレクトリを指定することもできます。もし他のディレクトリを指定した場合はこれ以降の~/.vim/bundlesを自分の指定ディレクトリに合わせて変更してください。

terminal
$ curl https://raw.githubusercontent.com/Shougo/dein.vim/master/bin/installer.sh > installer.sh
$ sh ./installer.sh ~/.vim/bundles

次に、.vimrcに以下の設定を追加しましょう。

.vimrc
" plugin manager ---------------------------------------------if&compatible
  set nocompatible
endif" プラグインがインストールされるディレクトリlets:dein_dir= expand('~/.vim/bundles')" dein.vim本体lets:dein_repo_dir=s:dein_dir.'/repos/github.com/Shougo/dein.vim'if&runtimepath !~# '/dein.vim'if!isdirectory(s:dein_repo_dir)
    execute '!git clone https://github.com/Shougo/dein.vim's:dein_repo_direndif
  execute 'set runtimepath^='. fnamemodify(s:dein_repo_dir,':p')endif" tomlセットlets:toml_dir=expand('~/.dein/')lets:toml=s:toml_dir.'dein.toml'lets:toml_lazy=s:toml_dir.'dein-lazy.toml'" プラグインのロードif dein#load_state(s:dein_dir)call dein#begin(s:dein_dir)call dein#load_toml(s:toml)call dein#load_toml(s:toml_lazy,{'lazy':1})call dein#end()call dein#save_state()endif" インストールしていないプラグインがあればインストールを実行if dein#check_install()call dein#install()endif" ------------------------------------------------------------

ここでは.dein配下のdein.tomldein-lazy.tomlという2つのtomlファイルを読み込む設定をしています。
したがって、.deinディレクトリをdotfiles直下に作り、ホームディレクトリ直下にシンボリックリンクを作成しておくと良さそうです。

terminal
$ cd ~/dotfiles
$ mkdir .dein
$ ln-s ~/dotfiles/.dein ~/.dein
$ cd .dein
$ touch dein.toml dein-lazy.toml

シンボリックリンクはファイルだけでなく、ディレクトリでも作成することが可能です。


dein-lazy.tomlは読み込み時に {'lazy': 1}を指定してます。これによりdein-lazy.tomlには遅延読み込みが適用されます。
プラグインをたくさん追加するとVimの起動は遅くなりがちですが、起動時に必要のないプラグインはdein-lazy.tomlで遅延読み込みさせることでこの問題を解決することができます:sparkles:

またプラグインごとの設定をhookで管理できるため.vimrcを散らかすことがなくなります。

hookについてはこちらの記事が参考になります。
[dein.vim] hook の便利な使い方

tomlファイルは基本的に以下のように記述します。

tomlファイルの基本的な書き方
[[plugins]]
repo = 'インストールしたいプラグインのリポジトリ'
hook_add = 'Vim起動時に読み込む設定'

tomlファイルにプラグインを追記しておけば先ほど.vimrcに記述した以下のスクリプトによってVimを起動するだけで新たなプラグインをインストールしてくれます:sparkles:

自動インストールのスクリプト
" インストールしていないプラグインがあればインストールを実行if dein#check_install()call dein#install()endif

これでプラグインを効率的に管理できる環境が整いました:sunny:


5. おすすめのプラグインを紹介します :doughnut:

この章では開発効率をUPさせるVimのおすすめプラグインを幾つかピックアップして紹介します。
プラグインを使用する上で必要なパッケージやツールのインストール方法と筆者のtomlファイルでの設定をまとめています。

この章の続きを読む

① scrooloose/nerdtree

GitHubのリポジトリ: https://github.com/scrooloose/nerdtree

NERDTREEを利用するとVim上で視認性の高いディレクトリツリーを表示することができます:sparkles:
dc3bffe119dcac3a6c7d0b2d0404afd2.gif

使用方法
1. dein.tomlに設定を追記する。

dein.tomlの設定
[[plugins]]
repo = 'scrooloose/nerdtree'
hook_add = '''
  let NERDTreeShowHidden=1
    nnoremap <silent><C-a> :NERDTreeFind<CR>:vertical res 30<CR>
'''

筆者の設定では<C-a>でディレクトリツリーを表示、:qでディレクトリツリーを閉じます。
また、NERDTREEにはメニューモード(ディレクトリツリー上でmを押す)で、子要素の追加や削除、リネームを簡単に行う機能があります。

▽NERDTREEの操作方法についてはこちらの記事が参考になります。
vim-plugin NERDTree で開発効率をアップする!

ちなみにデフォルトのVimでは:e .でカレントディレクトリのファイル一覧を表示できます。


② vim-airline/vim-airline

GitHubのリポジトリ: https://github.com/vim-airline/vim-airline

vim-airlineを使うとグラフィカルで見た目がカッコいいステータスバーを手軽に利用することができます:sparkles:
スクリーンショット 2019-11-25 1.52.47.png

使用方法
1. Power Line fontsをインストールする。

teminal
$ git clone https://github.com/powerline/fonts.git --depth=1
$ ./install.sh
$ cd ..
$ rm-rf fonts

2. dein.tomlに設定を追記する。

dein.tomlの設定
[[plugins]]
repo = 'vim-airline/vim-airline'
[[plugins]]
repo = 'vim-airline/vim-airline-themes'
depends = 'vim-airline'
hook_add = '''
    let g:airline_theme = 'onedark'
    let g:airline#extensions#tabline#enabled = 1
    let g:airline#extensions#tabline#buffer_idx_mode = 1
    let g:airline#extensions#tabline#fnamemod = ':t'
'''

3. .vimrcに以下の設定を追記する。

.vimrc
" , キーで次タブのバッファを表示
nnoremap <silent>,:bprev<CR>" . キーで前タブのバッファを表示
nnoremap <silent>.:bnext<CR>" bdで現在のバッファを削除
nnoremap bd:bd<CR>

vim-airlineには様々なテーマが用意されています。
> vim-airlineのテーマ一覧
dein.tomlのlet g:airline_theme = 'onedark'を書き換えて好みテーマを指定しましょう。

筆者の設定ではバッファタブを有効にしており、,を押すと次にタブ、.を押すと前のタブに移動することができます。
また、不要になったタブはbdで削除できます。
4f82fcf14064b1cf933bf5423e837b0f.gif

Vimにはデフォルトのタブ機能がありますが、筆者はvim-airlineのバッファタブを利用しているため使用していません。
混乱を避けるためにデフォルトのタブ機能を使うかvim-airlineのバッファタブを使うか、どちらかを選んで利用するのが良いでしょう。


③ nathanaelkane/vim-indent-guides

GitHubのリポジトリ: https://github.com/nathanaelkane/vim-indent-guides

vim-indent-guidesを使うとインデントがカラフルに色付けされます:sparkles:
スクリーンショット 2019-11-25 2.43.42.png

使用方法
1. dein.tomlに設定を追記する。

dein.tomlの設定
[[plugins]]
repo ='nathanaelkane/vim-indent-guides'
hook_add ='''
    letg:indent_guides_enable_on_vim_startup=1letg:indent_guides_exclude_filetypes=['help','nerdtree']letg:indent_guides_auto_colors=0
    autocmd VimEnter,Colorscheme * :hi IndentGuidesOdd ctermbg=237
    autocmd VimEnter,Colorscheme * :hi IndentGuidesEven ctermbg=240'''

Vimのインデント可視化系のプラグインといえばvim-indent-guidesかindentLineがよく使われています。筆者はvim-indent-guideを落ち着いたカラーで利用するのが好きです。


④ airblade/vim-gitgutter

GitHubのリポジトリ: https://github.com/airblade/vim-gitgutter

vim-gitgutterはGitの差分を行番号横のsignで分かりやすく示してくれます:sparkles:
スクリーンショット 2019-11-25 3.02.25.png

使用方法
1. dein.tomlに設定を追記する。

dein.tomlの設定
[[plugins]]
repo ='nathanaelkane/vim-indent-guides'
hook_add ='''
    set signcolumn=yes
    letg:gitgutter_async=1letg:gitgutter_sign_modified='rw'
    highlight GitGutterAdd ctermfg=green
    highlight GitGutterChange ctermfg=yellow
    highlight GitGutterDelete ctermfg=red
    highlight GitGutterChangeDelete ctermfg=yellow
'''

行番号横に表示されるsignのおかげでどこを編集したのかすぐに確認することができます。


⑤ dense-analysis/ale

GitHubのリポジトリ: https://github.com/dense-analysis/ale

dense-analysis/aleを利用するとVim上でLinterを走らせることができます:sparkles:

使用方法
1. 利用したい言語のLinterをインストールし、設定ファイルなどの用意を済ませておく。

2. dein.tomlに設定を追記する。設定は参考例です。

dein.tomlの設定(参考例)
[[plugins]]
repo ='dense-analysis/ale'
hook_add ='''
  letg:ale_set_highlights=0letg:ale_lint_on_enter=1letg:ale_lint_on_save=1letg:ale_lint_on_text_changed=0letg:ale_sign_column_always=1letg:ale_linters={    \'css':['stylelint','prettier'],    \'dockerfile':['hadolint'],    \'erb':['erb'],    \'html':['HTMLHint'],    \'haml':['haml-lint'],    \'javascript':['eslint'],    \'json':['jq'],    \'ruby':['rubocop','solargraph'],    \'typescript':['eslint'],    \'vim':['vint'],    \'yaml':['yamllint'],    \}letg:ale_sign_error='E'letg:ale_sign_warning='W'letg:ale_echo_msg_error_str='E'letg:ale_echo_msg_warning_str='W'letg:ale_echo_msg_format='[%linter%] %s (%severity%)'letg:ale_statusline_format=['E %d','W %d','']letg:ale_open_list=1letg:ale_set_loclist=0letg:ale_keep_list_window_open=0letg:ale_javascript_prettier_use_local_config=1'''

VimでもLinterを積極的に利用して綺麗なコードを書きましょう:star2:


⑥ tomtom/tcomment_vim

GitHubのリポジトリ: https://github.com/tomtom/tcomment_vim

tomtom/tcomment_vimを使うとVimでコメントアウト操作を手軽に行えるようになります:sparkles:
4d533d3cc77984b5ab779bb4ab4b6546.gif

使用方法
1. dein.tomlに設定を追記する。

dein.tomlの設定
[[plugins]]
repo ='tomtom/tcomment_vim'
hook_add ='''
    vnoremap ? :'<,'>TComment<CR>'''

筆者の設定ではVisualモードで?(= Shift + /)を押すと選択した範囲をコメントアウトします。
ちなみに?をキーバインドとして利用しているのはVSCodeで Cmd + /キーでコメントアウトしていた名残です。


⑦ luochen1990/rainbow

GitHubのリポジトリ: https://github.com/luochen1990/rainbow

luochen1990/rainbowはVim上でカラフルな括弧を表示してくれます:sparkles:
スクリーンショット 2019-11-25 3.40.17.png

使用方法
1. dein.tomlに設定を追記する。

dein.tomlの設定
[[plugins]]
repo ='luochen1990/rainbow'
hook_add ='''
    letg:rainbow_active=1'''

対応する括弧が色付けされて視認性が上がります。


⑧ alvan/vim-closetag

GitHubのリポジトリ: https://github.com/alvan/vim-closetag

alvan/vim-closetagを利用すると閉じタグを自動で補完してくれます:sparkles:

使用方法
1. dein-lazy.tomlに設定を追記する。

dein-lazy.tomlの設定
[[plugins]]
repo ='alvan/vim-closetag'
on_ft =['html','xhtml','javascript','typescript','javascript.jsx','typescript.tsx']
hook_add ='''
  letg:closetag_filenames='*.html'letg:closetag_xhtml_filenames='*.jsx,*.tsx,*.vue'letg:closetag_filetypes='html'letg:closetag_xhtml_filetypes='jsx,tsx,javascript.jsx,typescript.tsx,vue'letg:closetag_emptyTags_caseSensitive=1letg:closetag_shortcut='>''''

閉じタグの補完で地味に開発効率UPします:sun_with_face:


6. 画面分割をビシバシっ!とキメよう :waning_gibbous_moon:

65406c1504f07faa515eafe4643b14c4.gif
キーボードでの画面分割、画面移動の操作に慣れるとVimでの開発効率は格段にUPします。
この章では画面分割をビシバシっ!と決めれられるよう、便利なプラグインとキーバインドの設定を行います。

この章の続きを読む

デフォルトのVimではコマンドモードで:sp:vsといったコマンドを実行することで画面分割ができます。
しかし毎回コマンドを実行するのはすこし面倒なので、画面分割を簡単にするキーバインドを設定しましょう。

.vimrc
nnoremap sj <C-w>j
nnoremap sk <C-w>k
nnoremap sl<C-w>l
nnoremap sh<C-w>h
nnoremap ss :<C-u>sp<CR><C-w>j
nnoremap sv:<C-u>vs<CR><C-w>l

上記のキーバインドはPrefixとしてsキーを使用します。

垂直方向へ画面を分割したい時はまずsを押してvを押します。
水平方向へ画面を分割したい時はまずsを押してsを押します。
2d3dd7ba6c52b261b65547eef9de39ec.gif

そして画面の移動はsを押したあとにVimお馴染みの方向キーhjklで行います。
05ee291f4b8ae81cb1b83100bc94a6c0.gif

オリジナルのキーバインドを設定することで画面分割がとても簡単になりました:star:

▽ 画面分割については以下の記事が参考になります。
Vimの便利な画面分割&タブページと、それを更に便利にする方法


画面の分割と移動が簡単にできるようになったので、次は画面サイズの変更も簡単に行いたくなってきました。
そこで画面サイズの変更を簡単に行えるプラグインを導入します。

simeji/winresizer

GitHubのリポジトリ: https://github.com/simeji/winresizer

simeji/winresizerは画面サイズの変更を簡単にするプラグインです:sparkles:

使用方法
1. dein.tomlに設定を追記する。

dein.tomlの設定
[[plugins]]
repo ='simeji/winresizer'

simeji/winresizerの使い方は以下のようになります。
① サイズを変更したい画面にカーソルを持ってきて<C-e>(Ctr + e)を押す。
② 画面がwindow resize modeに切り替わるのでhjklで画面サイズを自由に変更する。
③ エンターキーで画面サイズを確定させる。

d8b78e9f5fa8019dbd7a169cc0515009.gif

とても簡単ですね:sunny:

この章では画面の分割と移動、サイズの変更を簡単に行うための設定を紹介しました。
これからは息をはくように画面を分割してVimを使いこなしましょう:fire:

7. tmux導入してターミナル環境を整えよう :family_wwbb:

aa69b7488c40841e212ef17769220b2c.gif

(※ tmuxは次章で紹介するtigと合わせて使うと便利です)

強いエディター代表のVSCodeにはcommand+jで簡単にターミナルを起動できる機能があります。

やはりVSCodeは最強のエディターなのでしょうか?(心の声<はい、そうです。))
いえ、必ずしもそうとは言えません。もちろんVimでも同じようなことができます:beers:

この章の続きを読む

Vimを使い始めたころ、VSCodeが恋しくて仕方ありませんでした。
特にターミナル機能をVimで実現するにはどうすれば良いのかと悩んでいました。

しかし、気づいたのです。
Vimをカスタマイズするのではなく、実行環境であるターミナルを使いやすくすれば良いのだ!と。

tmuxで複数のターミナルを操作しよう

tmuxを使えば1つのウィンドウ(tmuxセッション)の中で複数のターミナル(独立した疑似端末/ペイン)を起動することができます。
簡単に言えば「今まで別々のタブやウィンドウで起動していたターミナルを一つにまとめられるぞっ!」ということです。

92576171f7554033c701dfeb4af057fe.gif

使用方法
1. tmuxをインストールする。

terminal
$ brew install tmux

2. 設定ファイル.tmux.confをdotfiles直下に用意し、ホームディクトリにシンボリックリンクを作成する。

terminal
$ cd ~/dotfiles
$ touch .tmux.conf
$ ln-s ~/dotfiles/.tmux.conf ~/.tmux.conf
  1. .tmux.confに設定を記述する。

特にこだわりがなければ以下の設定をコピペしてください。

.tmux.confを表示
.tmux.conf
# シェルを設定してください
set-option -g default-shell /bin/zsh

# set prefix key
set -g prefix C-s
unbind C-b

set-option -g history-limit 100000

# enable mouse
set-option -g mouse on

# fix remaining word
set -s set-clipboard off

# color
set -g default-terminal "screen-256color"
set-option -ga terminal-overrides ",xterm-256color:Tc"

# reduce delay
set -sg escape-time 10
set-option -g repeat-time 500

# index number
set -g base-index 1
set -g pane-base-index 1

setw -g monitor-activity on

# create new window
bind c new-window -c '#{pane_current_path}'
# split window
bind v split-window -h -c '#{pane_current_path}'
bind s split-window -v -c '#{pane_current_path}'

# select pane
bind h select-pane -L
bind j select-pane -D
bind k select-pane -U
bind l select-pane -R

# resize pane
bind -r H resize-pane -L 3
bind -r J resize-pane -D 3
bind -r K resize-pane -U 3
bind -r L resize-pane -R 3

# remove pane
bind q kill-pane

  1. tmux起動のエイリアスを.zshrcに設定しておく。(任意です)
.zshrcなど
alias t='tmux'

シェルログインとともにtmuxを起動した人はこちら
.zshrcなど
# SHELL LOGIN WITH TMUX / If not running interactively, do not do anything[[$-!=*i*]]&&return[[-z"$TMUX"]]&&exec tmux

tmuxの使い方は簡単です。
まずはターミナルでtmux(エイリアスを使う場合はt)とコマンドを入力しましょう。
すると以下のように新規のtmuxセッションが作成されます。
4565267c1efb5efbed642b7bb4896c6f.gif

筆者の.tmux.conf設定ではPrefixキーとして<C-s>(Ctr + s)を使用しています。

tmuxでは一つの画面のことをペインと呼びますが、新たなペインを立ち上げる場合は以下のように操作します。
- 画面を垂直分割してペインを立ち上げる場合: <C-s>を押したあとにv
- 画面を水平分割してペインを立ち上げる場合: <C-s>を押したあとにs

そして、ペインの移動は<C-s>を押したあとにhjklキーで行うことができます。

この操作は1つの前の章で紹介したVim内の画面分割と似ていますね!:eyes:
tmuxの画面分割はPrefixが<C-s>、Vim内での画面分割はPrefixがsで、コントロールキーを押すかどうかの違いだけです:star:

そして分割したペインはexitすることで閉じることができます。
6d1e581f36345a737398ee081002998c.gif

次に、ペインのサイズを変更してみましょう。
ペインのサイズは同じくPrefixキーである<C-s>を押したあとにHJKLキーで行うことができます。
ペインの移動にshiftキーを加えただけです。
Vim内での画面サイズ変更とは少し違いますが、使っていくうちにすぐに慣れるので大丈夫です:star:

24c19144e206270195722fc7d49539af.gif

ここまででtmuxでのペイン操作がスムーズにできるようになりました:family_mwgb:

これからはtmuxセッションの中でVimを使った開発を行い、ターミナル操作をしたくなれば新たなペインを立ち上げ簡単にコマンドを実行できます。もうVSCodeのターミナル機能が恋しくなることはありません:fire:

※ちなみに別ペインで操作した変更をVimで読み込む場合は:e!コマンド(再読み込み)で対応できます。

tmuxについての余談

:page_with_curl:
Vim8からは:termでVimターミナルモードが使えるようになりました。
筆者も素早くシェルを叩きたいときはたまにVimのターミナルモードを利用しています。
しかし、Prefixがめんどくさかったりでやはりtmuxを利用する方が好きです:family_mmgb:
好きな方を使うと良いと思います:yum:

8. tigを使ってターミナルからGitを高速で操作しよう :pencil:

9be1e7c280ea5f7d6839c3a9c3b5af97.gif

Vimを使い始めてすぐに恋しくなったVSCodeの機能がありました。
それはGitの差分をグラフィカルなUIで確認でき、直感的操作でステージングやコミットできる機能です。

同じような操作性をVimに求めるのは難しいのでしょうか?
実はtigを使ってターミナル環境を整えれば全て解決します。しかも、VSCodeよりも高速にGitの操作が可能です。

この章の続きを読む

tmuxの章でも書いたようにVimをカスタマイズするのではなく、実行環境であるターミナルを使いやすくすることが重要です。

tigを導入してGitを操ろう

tigはターミナル上でGitの差分をカラフルに表示したり、操作することができるツールです。
3dfb047ebd97a6d8b08e1f02a304cee5.gif

使用方法
1. tigをインストールする。

terminal
$ brew install tig

2. 設定ファイル.tigrcをdotfiles直下に用意し、ホームディクトリにシンボリックリンクを作成する。

terminal
$ cd ~/dotfiles
$ touch .tigrc
$ ln-s ~/dotfiles/.tigrc ~/.tigrc
  1. .tigrcに設定を記述する。

特にこだわりがなければ以下の設定をコピペしてください。

.tigrc
# view settings
set main-view  = id:yes date:default,local=yes author commit-title:graph=yes,refs=yes,overflow=false
set blame-view = date:default id:yes,color line-number:yes,interval=1 text
set pager-view = text
set stage-view = text
set log-view   = text
set blob-view  = text
set diff-view  = text:yes,commit-title-overflow=no
set tab-size = 2
set ignore-case = true
set split-view-width = 80%
set split-view-height = 80%
set diff-options = -m --first-parent
set refresh-mode = auto

# Dでstatus viewのuntracked fileを削除できるようにする
# https://github.com/jonas/tig/issues/31 見るとおもしろい
# https://github.com/jonas/tig/issues/393 見るとおもしろい
bind status D ?@rm %(file)

color cursor black white bold

tigはターミナル上でtigコマンドを実行することで起動します。
tigにはいくつかのviewがあり、起動したあとに以下のキーでviewを切り替えることができます。

キー表示されるview
mMain view
sStatus
tTree (files)
yStash view
gGrep
hHelp

ここでは主に利用することになるであろうStatus viewでのコミットまでの操作を簡単に説明します。
tigでtigを起動しsを押す or tig statusを実行する
以下のようなStatus viewが表示されます。git statusした時と同じような表示で違和感ないと思います。
スクリーンショット 2019-11-26 1.46.09.png

uでステージとアンステージを行う

ファイルをまるごとステージング、アンステージする場合はカーソルをファイルに合わせてuを押します。
b6fec6021baa020a58f04d6129300fb5.gif

ファイル内のhunk(変更単位)ごとにステージング、アンステージする場合はファイルをエンターキーで選択し、hunk単位でuを押します。
e2ec9a172032e70c2ad9bd5bb526f6c1.gif
1行ずつステージ、アンステージする場合は1を押します。

Cでコミットする
Status viewでC(大文字)を押すとお馴染みのgit commit画面になりステージした内容をコミットできます。
982c9aff7af572197367de2324c2be25.gif

tigの終了はqです。

tigはとても便利なツールですね:star:
具体的な使い方として前の章で紹介したtmuxと合わせ技をよく使います。
Vimで作業中、理解できるでしょう。理解できるでしょう。 tmuxで分割ペインを立ち上げる → tigでコミット という流れです。
9f2d55c684a9e6d3945b4ab7548f6c3b.gif

ちなみにStatus Viewで変更を取り消すときはuではなく!を使います。
Untracked filesの変更を取り消す場合はDを使います。

(Untracked filesの変更を取り消しコマンドDはtig本体の機能ではなく.tigrcのオリジナル設定です。なぜデフォルトでUntracked filesの変更を取り消し機能がないのかはこちらのIssueが参考になります。)

便利なtigとtmuxを使いこなしてVimとターミナルの環境を最強にしましょう:fire:

9. fzfで高速な単語検索とファイル検索を実現しよう :mag:

fzfを使えばカレントディレクトリから高速でファイルや単語をあいまい検索することができます。
さらにfzf.vimにはファイルの編集履歴から簡単にファイルを開くことができる機能もあります。
5b1d9305751f677f7bba6411508a8f63.gif

fzfの高速で強力な検索機能を使ってVimをもっと使いやすくしましょう:sunny:

この章の続きを読む

まずはfzfをVimで使えるように設定しましょう。

使用方法
1. fzf本体のインストール

terminal
$ brew install fzf

2. ripgrepをインストール
ripgrepはgrepやAgより高速な検索ツールです。

terminal
$ brew install ripgrep

3. .zshrcに設定を追加

.zshrcなど
# Settings for fzfexport PATH="$PATH:$HOME/.fzf/bin"export FZF_DEFAULT_COMMAND='rg --files --hidden --glob "!.git"'export FZF_DEFAULT_OPTS='--height 30% --border'[-f ~/.fzf.zsh ]&&source ~/.fzf.zsh

4. Vim用のプラグインをインストール
dein.tomlに以下の設定を追加してください。

dein.toml
# fzf
[[plugins]]
repo = 'junegunn/fzf'
hook_post_update = './install --all'
merged = 0

# fzf.vim
[[plugins]]
repo = 'junegunn/fzf.vim'
depends = 'fzf'
hook_add = '''
    command! -bang -nargs=* Rg
    \ call fzf#vim#grep(
    \ 'rg --column --line-number --hidden --ignore-case --no-heading --color=always '.shellescape(<q-args>), 1,
    \ <bang>0 ? fzf#vim#with_preview({'options': '--delimiter : --nth 4..'}, 'up:60%')
    \ : fzf#vim#with_preview({'options': '--delimiter : --nth 4..'}, 'right:50%:hidden', '?'),
    \ <bang>0)
    nnoremap <C-g> :Rg<Space>
    nnoremap <C-p> :GFiles<CR>
    nnoremap <C-h> :History<CR>
'''

以上でfzfの曖昧検索がVimで使えるようになりました:star:
次に具体的な使い方をご紹介します。

カレントディレクトリ配下からファイル検索

例えばディレクトリをvim .で開き、作業していたとします。
ファイルを検索したい時は<C-p>(コントロール押しながらp)を押します。
すると以下のようにQuickfixでファイルのあいまい検索ができます。
スクリーンショット 2019-11-27 12.03.42.png
カーソルの移動にはTABshift + TABか前の章で紹介したEmacsのキーバインドを使います。
ちなみになぜpをバインドしているかというと以前にctrlp.vimというプラグインを使っていた名残です。

しかし、実は<C-p>には:GFilesをバインドしているためGit管理下のファイルしか検索できません。
ほとんどの場合は:GFilesで問題ないのですが、未だGitでtrackingしていないファイルを検索したい場合はコマンドモードで:Filesを実行してください。
スクリーンショット 2019-11-27 12.10.25.png
するとGit管理していないファイルも検索することができます。コマンドを打つのが面倒な方はキーバインドを設定しても良いかもしれません。

バッファの編集履歴からファイルを開く

さっきまで開いていたファイルをもう一度開きたいということは良くあります。
そんな時は<C-h>を使うとバッファの編集履歴(≒ファイルの編集履歴)からファイルを開くことができます。
366aa648eb84e4536d8ab5e6c2d24f5c.gif
h:Historyhで覚えやすいと思います。

(ちなみに簡単なファイルバックの場合はVimデフォルトの<C-o>でも可能です。)

カレントディレクトリ配下から単語を検索

例えばディレクトリをvim .で開き、作業していたとします。
カレントディレクトリ以下のfzfという単語を検索したくなった時は<C-g>を押して、引数に検索したい単語を渡します。
e8eec2bd6184871fc28d588c12282fdd.gif
すると上のGIFのようにカレントディレクトリ以下の単語を検索することができます。
ちなみに、?を押すとカーソルで選択中のファイルの中身を見ることができます。


以上がfzfの簡単な使い方です。

ここで紹介した検索以外にもfzf.vimには様々な検索方法があります。詳しくはコマンド一覧をご覧ください。

私の友人はfzfがあればNERDTREEやタブなんて要らないと言っていましたが本当にそうだと思います。
これからはfzfでバシバシと検索を使いましょう:fire:

10. 強力なLanguage Serverの恩恵を受けよう :muscle:

VimにLanguage Server(言語サーバー)との通信(LSP)をサポートするプラグインを追加すれば、非常に強力で便利な言語サーバーの恩恵を受けることができます。
137734a038aa4cb5b3e830c0b8772483.gif

言語サーバーの恩恵によって実現できる機能には以下のようなものが挙げられます。
① コードジャンプ(定義元ジャンプ)
② リアルタイムの入力補完
③ エラー警告やインフォメーションの表示

この章ではLanguage Server Protocol(LSP)をサポートしているVimのプラグイン「con.nvim」の導入手順と基本的な使い方を紹介します。

この章の続きを読む

はじめに言語サーバーとその通信プロトコルであるLSP(Language Server Protocol)について簡単に説明します。
languageserver.png
言語サーバーはエディターとは別のプロセスで独立して立ち上がります。
エディターから言語サーバーに対してリクエストが送られると、言語サーバーはそれに応じたレスポンスを返します。このリクエストとレスポンスの通信方式の決まりがLSP(Language Server Protocol)です。
決まった通信プロトコルを利用する言語サーバーを用意しておけば、クライアント(エディター側)は言語サーバーとのやりとりだけで仕様の異なる言語ごとの機能を実装できるようになります。つまり、エディターは言語ごとの実装を言語サーバーに任せられてハッピー!というわけです:sunny:

言語サーバーとLSPについてはマイクロソフトの以下のページが参考になります。
言語サーバー プロトコル

次にLSPをサポートしているプラグイン「coc.nvim」をインストールしましょう。

coc.nvim

GitHubリポジトリ: https://github.com/neoclide/coc.nvim

使用方法
1. Node.jsをインストール(既にNode.jsをインストール済みの場合はスキップ)

terminal
$ curl -sL install-node.now.sh/lts | zsh

2. dein.tomlに設定を追加

dein.toml
[[plugins]]
repo ='neoclide/coc.nvim'
rev ='release'
build ='''
  git checkout release
'''
hook_add ='''
  inoremap <silent><expr><TAB>        \ pumvisible() ? "\<C-n>":        \<SID>check_back_space() ? "\<TAB>":        \ coc#refresh()
  inoremap <expr><S-TAB> pumvisible() ? "\<C-p>":"\<C-h>"
  inoremap <expr><S-Tab> pumvisible() ? "\<C-p>":"\<S-Tab>"function!s:check_back_space() abort
    letcol=col('.')-1return!col|| getline('.')[col-1]=~# '\s'endfunction
  nmap <silent> gd <Plug>(coc-definition)
  nmap <silent> gy <Plug>(coc-type-definition)
  nmap <silent> gi <Plug>(coc-implementation)
  nmap <silent>gr<Plug>(coc-references)'''

coc.nvimはLSPクライアント以外にも様々な機能をcoc extensions(拡張機能)として提供しています。(拡張機能一覧)

拡張機能はVimのコマンドモードで:CocInstall 拡張機能名と実行することでインストールすることができます。拡張機能の本体は~/.config/coc/extensionsにインストールされます。

例えば、coc-emojiをインストールしたい時は:CocInstall coc-emojiとコマンドを実行します。インストール完了後、マークダウンファイルで:を打つとたくさんの絵文字が補完で表示されるようになりました。
スクリーンショット 2019-11-29 20.36.15.png

他にもcoc.nvimには様々な拡張機能が提供されているので、拡張機能一覧から欲しいものを見つけてインストールしましょう:ramen:


続いてcoc.nvimで言語サーバーの恩恵を受けてみましょう。
coc.nvimはLSPクライアントであるため、言語サーバーは別で用意する必要があります。
言語サーバーはcoc.nvimの拡張機能として提供されているものと各自でインストールする必要があるものに分けられます。拡張機能が存在する場合は拡張機能を利用するのが良いでしょう。

例えばTypeScriptの言語サーバーは拡張機能(coc-tsserver)として用意されているため、:CocInstall coc-tsserverを実行するだけで言語サーバーを用意することができます。

言語サーバーが拡張機能として提供されていない場合は、言語サーバーをインストールした後に~/.vim/coc-settings.jsonに以下のように設定を追記します。

coc-settings.jsonの例
{"languageserver": {"golang": {"command": "gopls",
            "rootPatterns": ["go.mod"],
            "filetypes": ["go"]},
        "bash": {"command": "bash-language-server",
            "args": ["start"],
            "filetypes": ["sh"],
            "ignoredRootPaths": ["~"]}}

言語サーバー一覧とcoc-settings.jsonの記述例はこちらから確認できます。

言語サーバーの用意ができればいよいよコードジャンプ(定義元ジャンプ)入力補完警告やインフォメーションの表示といった便利な機能が利用できるようになります:star2:

例えばTypeScriptの場合。
① コードジャンプ
4572f7b9e208cdc75ce357f01fbb3e96.gif
関数や変数、型の定義元へオリジナルのキーバインドgdで簡単にジャンプすることができます。
ちなみにジャンプ元のファイルへ戻るには<C-o>が便利です。

② 入力補完
5c3dd9e830a830fe618f8d3f6e0c1fbb.gif
<tab>またはEmacsキーバインドで候補を選択します。

③ 警告やインフォメーションの表示
17416dbeb333a0f4bdccb4d56a16fedd.gif
こちらの例ではReactコンポーネントの引数の型が違うよ!とエラーを警告してくれました。

このように言語サーバーのパワーは非常に強力です:muscle:
coc.nvimで言語サーバーの恩恵を受けてVimを最強の開発環境にしましょう!

ちなみにcoc.nvimにはfzfライクなあいまい検索を実現する拡張機能などもあります。好きなようにカスタマイズすると楽しそうです:sparkles:

<あとがき> Vimは楽しい! :star2:

この記事では私がVimをそこそこ使えるようになるまでに行った設定とその手順を紹介してみました。
ここで紹介したこと以外にもターミナル、tmux、Vimのカラースキームを統一する、高速なターミナルエミュレーターを導入するなどVimをもっと使いやすくする方法を考えると楽しいはずです。(わたしの使っているカラースキームはatom-one-dark-terminalonedark.vimです。おすすめのターミナルエミュレーターはalacrittyです。)
Vimを使い始めてもうすぐ1ヶ月が経ちますが、今でも私のdotfilesはスクスクと成長中です。
きっとまた1ヶ月後にこの記事を読むとリライトしたくなる箇所がたくさんあるんだろうなと思っています:sweat:
しかし、Vimが楽しいことはこれからも変わらない気がしています。

今後もVimライフを楽しみましょう:fire:


最後に筆者の最新設定(dotfiles)を貼っておきます。

実はたくさんあるVimエミュレーション

$
0
0

この記事はVim2 Advent Calendar 2019の7日目の記事です。

みなさんはVimエミュレーションは使っていますか?

Vimは使っているけれどVimエミュレーションは使っていない人もいれば、
Vimは使っていないけれどVimエミュレーションは使っている人もいる。
そんなVimエミュレーションですが、現在では多くのブラウザ、テキストエディタ、IDEで提供されるようになっており、
VimエミュレーションのおかげでVimの操作性を他のソフトウェアでも享受できるようになっています。

もし、Vimの外でVimのキーバインドが使えたらマウスを使わずにキーボードだけで操作できるのではないか、
もし、このテキストエディタの機能(マルチカーソルなど)と一緒にVimの機能が使えたらすごい編集ができるのではないか、
もし、この開発効率のいいIDEを使いつつVimのキーバインドも使えたならすごい快適なのではないだろうか、
そんなことを思ったことのある人は少なくないと思います。

Vimエミュレーションはそんなことを実現できたり…できなかったり…という感じなのですが、
当記事ではそんなVimエミュレーションについて、紹介したいと思います。

Vimエミュレーションとは何か

Vimエミュレーションは何かを一言で表すならば、ブラウザやテキストエディタ、IDEなどでVimのキーバインド及び概念を再現するもの、といったところでしょうか。
hjklでの上下左右の移動から始まり、dでの切り取り、pでの貼り付け、ノーマルモードや挿入モードといったモードの概念、マクロによる操作のリピート、テキストオブジェクト、など、各VimエミュレーションによってVimの機能をどれぐらい再現しているか、再現できているかは異なりますが、いずれも実現できる範囲でVimの機能を再現しています。

だいたいのVimエミュレーションではhjklをはじめとしたキーでカーソル移動、スクロールができるようになり、ノーマルモードによる素早いテキスト編集ができるようになります。全てのキーがショートカットキーになったような状態になるため、いつもとはまた違った操作性を得ることができます。

しかし、Vimエミュレーションがもたらすものは必ずしもメリットばかりという訳でもありません。
Vimを使っている人が必ずしもVimエミュレーションを使っているとは限らないのには理由がある訳ですね。
試してみる最初は気にしないで大丈夫なのですが、次のようなメリット、デメリットがあります。

メリット

主に4つ。

  1. キーボードで完結する操作が増える。
    • マウス、タッチパッドの利用頻度が減るためキーボードを触っている時間が増えます。また、矢印キーの利用頻度が減るためホームポジションを維持できる時間も増えます。
    • 環境によってはマウスを出しづらかったりするのでそういう場所でありがたいです。
  2. プレーンテキスト編集速度が向上する。
    • なんだかんだいってVimはプレーンテキストの編集が得意なのでVimの編集機能の再現度が高ければプレーンテキストの編集速度が上がります。
    • 場面場面によっては素のオリジナルのほうが速く編集できる場合もあります。また、フォーマット、リファクタリング等は専用のツールかIDEに任せたほうがいいでしょう。
  3. 操作の快適性が向上する。
    • ほぼ全ての操作がショートカットキー相当になります。程度の差こそ個人差はあれど多かれ少なかれVimを使っている人はVimの快適性を目当てにVimを使っているように、Vimの操作性を得ることで同様の快適性を得られます。
    • 個人差はありますが、あまり使っていない場合でもたまに使ってみると楽しかったりする…と思います。
  4. Vimへの抵抗感が減る。
    • Vimへの移行がしやすくなるでしょう。また、もしLinuxサーバ等に入って作業をする際、Linuxサーバには確実にVimが入っているのでファイル編集への抵抗感が減ります。
    • 個人差はありますが、とりあえずサーバではVimが使えるという安心感を享受できたりする…と思います。

デメリット

主に4つ。別でブラウザ特有のものが1つ。

  1. Vimの機能を100%再現しているわけではない。
    • Vimの機能を知っていれば知っているほど、Vimにはあったこれが無い…となります。無かったからといって詰むことはないんですが、快適性に影響します。
    • とはいえ、使い続けると慣れてきます。個人差はありますが…。また、Vimをがっつり使っていた訳ではなかったのであればあまり気にならないでしょう。
  2. 既存のショートカットキーを上書きする。
    • 既存のショートカットキーを上書きするため、既存の機能へのアクセスがしづらくなります。IDEでは特に編集以外のショートカットも多いので影響が大きいです。
    • これはVimエミュレーションの作り次第というか、既存の機能との共存をどのようにしているか次第ではあります。
  3. 日本語入力に苦労する。
    • Vimと同じで最初は日本語入力に苦労するはずです。Vimのモード(ノーマル/挿入)と日本語入力のモード(英数/ひらがな)の二つのモードが別々にあるので確実に混乱することでしょう。
    • これはVimと同様で慣れます(モード切り替えにはパターンがあるので)。それでも日本語多めだと編集速度は落ちますが…。
  4. Vimから離れづらくなる。
    • Vim特有の快適性みたいなものがあってVimエミュレーションにも同様の快適性があるんですが、それによってVimの快適性が得られない場面で辛くなります。CapsLockキーのCtrlキー化などと似た感じですね。
    • 個人差があります。操作感がVimと違うから…といって他のソフトを敬遠してしまったりするとよくないです。
  5. (ブラウザ特有) Hit-a-hintで事故をする。
    • ブラウザ向けのVimエミュレーションには大体Hit-a-hintといって特定のキーを押すと、各リンクにアルファベットが振られそのアルファベットを入力するとそのリンクに飛べる機能があるのですが、これが使っていてときどき事故します。
    • 例えば誤フォローしたりとか、誤いいねしたりとか。そこまで事故はしないんですが、事故するときは事故します。

使うか使わないかの決め方

趣味にあっていれば使う…ぐらいでいいと思います。
Vimエミュレーション抜きの操作感とVimエミュレーション抜きの操作感は異なるので、
どちらがいいかとは一概に言い難いです。それに、Vimを使うという選択肢もありますしね。

もしVimを使っていなかったとしても、Vimが気になっていたら試していいと思います。
ドットインストール等のVimの入門等で紹介されている範疇の操作であればだいたい再現されているはず…です。

また、同じVimエミュレーションでもブラウザ向けのVimエミュレーションはあくまでVim風というかVimと異なる独自の操作が色々あってほぼ別物なので、
ブラウザ向けのVimエミュレーションは単体で試してみて、よさそうだったら使っていいと思います。

Vimエミュレーションの一覧

さて、そんなVimエミュレーションにはどのようなものがあるのかですが、次のようなものがあります。
これらは2019年12月6日時点で1年以内に最終更新があり、確実に利用ができるVimエミュレーションの一覧になります。

Vimエミュレーションには以前からからあり今も保守されているものもあれば、
保守されなくなってしまったもの、APIの変更によりプロジェクトの終了を余儀なくされたものもあります。
そのため、一覧から外しているものもありますが、それらも込みのリストだともっと数があります。込みのリストはどこかで…。

テキストエディタ向け

テキストエディタVimエミュレーション
EmacsEvil
Visual Studio CodeVSCodeVim
Atomvim-mode-plus
Sublime TextNeoVintageous
Sublime Six
BracketsVimderbar

全体的に再現度が高めな気がします。マルチカーソルを併用できたりするのもいいですね。
(EmacsにはVIP、Viper、といったものがあったと聞きます。こちらはどうなのでしょうか…。Atomのvim-modeは非推奨になっていてvim-mode-plusが推奨されています。Sublime TextのVintageとVintageousはそれぞれ開発が止まっています。)

IDE向け

IDEVimエミュレーション
Visual StudioVsVim
XcodeXVim2
EclipseVrapper
NetBeansjVi
IntelliJ IDEAIdeaVim

いずれも長く保守されていて、このIDEならこれといえる定番なものとなっています。
(変わったことといえばXcodeのXVimがXVim2になったことぐらいでしょうか。)

また、リストにはありませんが、Qt CreatorにはFakeVim、MonoDevelopにはVi ModeというVimエミュレーションを有効にする機能があります

ブラウザ向け

テキストエディタVimエミュレーション
FirefoxVimium-FF
Vim-Vixen
Tridactyl
Surfingkeys
VVimpulation
ChromeVimium
Surfingkeys
SafariVimari
sVim

5年前とはリストが大きく変わっています。
(FirefoxのVimエミュレーションはVimperatorやVimFXが動かせなくなり、使えるVimエミュレーションが大きく変わりました。Chromeにも以前ViChromeや、Vrome、cVimといったものがありました。SafariのVimariとsVimはMacを持ってなくて試せていないのですが今でも使える感じでしょうか…?)

用途が編集ではなくブラウジングなので他のVimエミュレーションとはまた違うのですが、
Vimのキーバインドを多く再現しており、キーボードだけで多くの操作ができるようになります。

また、VivaldiはリストにありませんがVivaldiはChromeの拡張をそのまま使えるためVivaldiでもVimエミュレーションは利用できます。

その他

ソフトウェア種類
tigGitインターフェース
cgdbGDBインターフェース
qutebrowserブラウザ
Vimbブラウザ
Luakitブラウザ
Kakouneテキストエディタ
ShibaMarkdownプレビュアー
Readlineライブラリ(C)
FakeVimライブラリ(C++(Qt))
Aceライブラリ(JavaScript)
CodeMirrorライブラリ(JavaScript)

VimエミュレーションというよりはVimを参考にしているもの…ぐらいの感じのような気もしますが、いずれもVimが提供するキーバインドと同じキーバインドを提供しています。

これとは別に、カウントされるかは怪しいですが、
いくつかのWebサイトにはVimのキーバインドがショートカットキーになっているサービスがあります。

Webサイトショートカット内容
Twitterjkで選択ツイートを移動、/でキーワード検索にフォーカス
TweetDeckjkで選択ツイートを移動、hlで選択列を移動、/でキーワード検索にフォーカス
BookWalkerhjklでページ送り(wasdでも可)
GoogleDrivehjklで選択ファイルを移動
GoogleCalenderjkで月、週、日を移動
ニコニコ静画(漫画)jkで上下スクロール
はてなブックマークjkで選択記事を移動
GitHubjkで選択ファイルを移動
Pocketjkで選択URLを移動
Pixivjkでページ送り(2枚以上の投稿の場合のみ)

jkでのスクロールはホームポジションを崩さずにできる操作なので、もしかしたらVimは関係ないかもしれませんが、
BookWalkerやGoogleDriveのショートカットキーは恐らくVim由来…だと思います。

まとめ

Vimエミュレーションはこのようにたくさんの人が作っていています。
Vimエミュレーションが合うかどうかは人によりますが、
いずれも各々の熱意のこもったものに仕上がっています。
よければ触ってみてください!

また、もしリストに無いものがあったら是非教えてください…!

明日から使える Command-line window テクニック

$
0
0

この記事は Vim Advent Calendar 7 日目の記事です.6 日目の記事は daisuzu さんによる VimのtagfuncでLSPを使うでした.8 日目は gorilla0513 さんの記事が入る予定です.

はじめに

皆さんは Vim の Command-line windowをご存知でしょうか.
名前に馴染みがなくとも,あるいは「意図して」使ったことがなくとも,見たことのある方なら多いかもしれません.そう,Vim を終了しようと思って :qと押したつもりが間違って q:と押してしまったときに起動してしまう,あの画面です.

vim1.png

Vim 初心者にとっては初見殺しのこの画面.私も初めて出会ったときはとても困惑しました.Vim を終了させようとしたのに,終了しないどころか代わりに変な画面が出てきた.得体の知れないこの画面をどう閉じれば良いかも分からない(<ESC>を押しても消えません.ウィンドウだと分かれば :qで閉じると分かるんですが).そんな最悪の出会いが気づかぬうちにトラウマになっていたのかもしれません.私は Vim を始めてから1年の間ずっと,このウィンドウの存在を知りつつも,なんとなく使用を避け続けてきました.しかしつい1ヶ月ほど前にこの機能の便利さを知り,今は最大限活用しようと一生懸命リハビリ(?)に励んでいます.
この記事は,私と同じようにトラウマに陥り避けてしまっていた(かもしれない)Vimmer に捧げる Command-line window の布教記事です.

対象読者

  • Vim の Command-line window ってなんぞや?という人
  • Command-line window ねー,私あまり好きじゃないなあー,という人
  • Command-line window ねー,あまり使いこなせてないなー,という人

私はピュアホワイトな Vimmer では全くありませんが,今日お話する機能にプラグインの話はほぼ出ません.したがって,素の Vim でなんとかしたいホワイトな Vimmer にもおすすめです(ただし,後半で ~/.vimrcへの設定追加は行います).
なお本記事はある程度最近の Vim なら共通する話題だと思っていますが,私は Neovim を普段使いしているため,Neovim 特有の話が混入しているかもしれません.不正確な箇所などが発見された場合は,是非コメントなどでご指摘いただければ幸いです.

Command-line window の基本機能

Command-line windowとは, Vim/Neovim に搭載されている機能の一つです.デフォルトでは,Normal モードで q:と打つことで出現します.

(再掲)
vim1.png

かつての自分が間違えてしまったように,このキーマップは :qという Vim を終了するためのコマンドと極めて紛らわしいため注意してください.気になる方はキーマップを変更するのもありだと思います.なお,間違えて開いてしまった場合は落ち着いて :q<CR>と押下しましょう( <CR>はエンターキー).Command-line window は特殊なウィンドウであり,通常のウィンドウと同様に :qで閉じることができます.

さて,画面に並んでいるのは,自分が過去に打ったコマンドです(上にいくほど古い).デフォルトでは自分が打った直近6種類のコマンド + 空行が表示されるはずです1.履歴は j/k でスクロールでき,エンター (<CR>) で実行することができます.たとえば先程の画面から, :h history:help historyの略で, historyについてのヘルプを開くためのコマンド)を再度実行したくなったとします.Command-line window を開いたときにウィンドウの最下端にカーソルが合ったとすると,そこからkを2回押せば h historyと書かれた行の上にカーソルが来ます.後はそこで <CR>を押せば以下のようにヘルプ画面が表示されます.Normal モードから :h history<CR>とコマンドを打ったときと同じ効果が得られるというわけです.

スクリーンショット 2019-11-26 23.07.02.png

これが Command-line window の基本的な使い方となります.

なお,ノーマルモードで q/と打つと検索履歴が表示されます.q:とは違い,「暴発」してしまうことがほとんどないため,q:と比べると知名度が低いかもしれません.昔の検索を使いまわして再検索をかけることができます.

スクリーンショット 2019-12-03 21.23.39.png

Command-line window のすごいところ

今の話だけ聞くと,Command-line window は過去の履歴を参照して使い回すためだけのものだ,と思われるかも知れません.1ヶ月前の私も同じように思ってました.通常のコマンドラインだって補完はあるし履歴は辿れるし十分だ,わざわざウィンドウで開く必要なんかない.

全然違いました.Command-line window にはすごい所がたくさんあったのです.

その1: 通常のバッファと(ほぼ)同じように内容を編集できる

Normal モード・Insert モードを駆使する Vimmer にとって,Command-line モード 2でのテキスト編集は,通常のウィンドウにおける編集ほど自由度が高いとはいえません3.Normal モードほど自由にはモーションやテキストオブジェクトを使えませんし,有効なモーション(行頭・行末移動など)も使うには Command-line モード特有のキーマップを覚える必要があります.通常のウィンドウでは hjklを使いこなしているのに,Command-line モードではついつい矢印キーを使ってしまっていませんか?私のことです.通常のウィンドウだとテキストオブジェクトでサクっと消せる文字列も,Command-line モードでは Deleteキーやなどでちまちま消してしまっていませんか?私のことです,ごめんなさい.

その問題を綺麗に解決してくれるのが Command-line window です.Command-line window は編集可能なウィンドウなので,通常のウィンドウと同じキーマップを使ってコマンドを編集することができます.これは長いファイルパスの途中をいじりたいときや,:sで置換するときに複雑な正規表現をあれこれ編集したいときにとても便利です.

たとえばこんな複雑な正規表現が相手でも...
(再掲)
スクリーンショット 2019-12-03 21.23.39.png
f[と打つだけで次に出現する [の位置まで移動できますし...
スクリーンショット 2019-12-03 21.25.03.png
ci[と打つだけで今移動してきた角括弧 [0-9a-z\<]の中身を変更することができます.
スクリーンショット 2019-12-03 21.27.30.png
ノーマルモードと変わらない操作性を実現できるということです.便利ですね!

ただし,一部のキーマッピングについてはズウ上のウィンドウでの機能から変更があったり,使えなかったりする点には注意が必要です.例えば Command-line window ではエンターを押すとそのコマンドが実行されます.これは Insert モードでも例外ではありません.<C-c>も「現在いる行を Command-line に移して Command-line モードに遷移する」機能にマッピングされています.また,Command-line window を開いている間は他のウィンドウには移れません.他のバッファに遷移して文字列を自由にヤンクしてまた Command-line window に戻る... というわけにいかないのは少し残念ですね.

なお, Command-line window での編集は一時的なものであり,履歴そのものには反映されません.つまり Command-line window で過去のコマンドを変更/削除しても,ウィンドウを閉じてまた q:で開き直せば元通りです.したがって過去の改変はできませんが,逆に言えば気兼ねなく好き勝手編集できる,ということでもあります.なお,「編集してから <CR>を押すなどして実行したコマンド」については新たにコマンドを打ったものとして履歴に保存されますから,後々編集することができます.

その2: 検索や置換もできる

Command-line window では,通常のウィンドウと同様に /による検索や :から始まるコマンドによるジャンプ・編集ができます.これも実用上かなりありがたい機能です.例えば履歴から任意の文字列を検索することができますし,:s/hoge/fuga/gで,あるコマンドの全ての hoge を fuga に置換することもできます.:g:vを使った絞り込みも可能です(活用例は後述). q/で開いた検索画面を「検索」することだって可能です(実用性があるかは分かりませんが).

その3: コマンドラインからも開ける

Command-line モードでいくつかコマンドを打った後に,「あ,やっぱ Command-line window で編集したい」と思うことがあるかもしれません.それ,大丈夫です.コマンドライン上で <C-f>を押すだけです.

スクリーンショット 2019-12-03 21.49.28.png
このように,途中までコマンドを打ってしまった状態でも... <C-f>と押せば
スクリーンショット 2019-12-03 21.50.08.png
ほらこの通り.簡単に Command-line window に遷移できます.

:から始まるコマンドラインに限らず,/を使った検索の途中で <C-f>と打つと検索履歴がたどれます.さらにマイナーですが,expression レジスタの中でも使えます.Insert モード中で <C-r>=と打った後,<C-f>を押してみてください.expression レジスタを使ったことがある人は,その履歴が表示されるはずです.

Command-line window を使いこなしてみる

さて,すごいところをたくさん知ったので,今度は Command-line window をより使いやすくするためのカスタマイズを行いたいと思います.以下は私が試みたカスタマイズ例です.

使わないバーを消す

通常の window で set numberを設定している人は,Command-line window でも行数が表示されます.全く無意味とは言えないものの,1000を超えてくるとちょっと邪魔です.また,set signcolumn=yesの設定になっている人は,Command-line window にも signcolumn (エラーなどを表示するために左端に表示される列)が表示されてしまいます.number (行数表示)はともかく,signcolumn の方はまず使わないと思います..vimrcに以下のような設定を書いて,さらっと無効化しましょう.

" 行数を非表示
autocmd CmdwinEnter[:/?=]setlocal nonumber
" signcolumn を非表示
autocmd CmdwinEnter[:/?=]setlocal signcolumn=no

Command-line window に入ったときに特定のコマンドを走らせたい/特定のオプションを有効にしたい,というニーズのために,CmdwinEnterというイベントが用意されています.詳しくはヘルプ参照 (:help CmdwinEnter).

自明なコマンドを履歴から消す

:q, :q!, :wqといったコマンドは,単純すぎてコマンド履歴からたどりたくなるようなものではありません.しかし,そういったコマンドはかなり頻繁に打たれるため,履歴の一番前の方4に出てきて本質的なコマンドを探す際の邪魔になります.かわいそうですが,CmdwinEnter の時点で表示から消してしまいましょう.特定の正規表現に合致する行を消すことのできる :g/(regexp)/dコマンドを使います.

autocmd CmdwinEnter:g/^qa\?!\?$/d
autocmd CmdwinEnter:g/^wq\?a\?!\?$/d

今までに引いたヘルプ一覧へのショートカット

ヘルプや置換などよく使うコマンドは,
それらを絞り込むコマンドを予めキーマップなどに割り当てておくと時間短縮につながるかもしれません.
たとえば以下のようにすれば,ノーマルモードで <Space>?と打つことで今までに引いたヘルプの一覧を取得できます.

nnoremap <silent><Space>? q::v/\v^h%[elp] /d<CR>:nohlsearch<CR>

また以下のようにすれば,ノーマルモードで <Space>/と打つことで今までに行った置換操作の一覧を取得できます.

nnoremap <silent><Space>/ q::v/\v^(\%<Bar>('[0-9a-z\<]<Bar>\d+),('[0-9a-z\>]<Bar>\d+))?s\//d<CR>:nohlsearch<CR>

ただし,range 部分の正規表現がわりとテキトーで,自分が実用的に使う「1行置換」「全置換」「行数,マーク,VISUAL モードによる範囲指定置換」しか対応していません.本当は $.を用いた range にも対応すべきなのですが,面倒なので放置しています.もっと幅広い range に対応させたい方は,いいかんじに改善していただければと思います!

終わりに

最後まで読んでくださりありがとうございました.Command-line window は使うタイミングを見極めればかなり強力で,複雑なコマンド操作を書きたいときの強い味方だと思っています.本記事の布教によって Command-line window を使う人が少しでも増えたら嬉しい限りです.
本記事を読んでくださった方々は,是非他の Vim Advent Calendar 2019Vim2 Advent Calendar 2019の記事も読んでみてください.きっとさらに Vim の魅力を知ることができると思います!


  1. 一度に表示されるコマンドの数(=ウィンドウの行数)は 'cmdwinheight'オプションで指定可能です. 

  2. Normal モードから :キーを押すと下一行にコマンドを書けますよね.あれを打っているときのモードです.今回説明する Command-line window とは違います. 

  3. 勿論,Command-line モードにも便利なキーマップはたくさんありますが... 

  4. 行で言うと最終行のほうですね,ややこしいですが.すぐ見える位置に出てきてしまうということです. 

Viewing all 5719 articles
Browse latest View live


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