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

Vim初心者が感じた、Vimの不満点を改善してみた

$
0
0

AtomからVimへ

今までテキストエディタはAtomを使用していたのですが、こういった記事を見てからAtomを使うのが億劫になってしまいました。
なので、最近はVimを使うようにしています。
Qiitaの記事を見ながら色々とプラグインを入れたりしていたのですが、操作に不満を覚えることがあったので、今回はVim初心者の私が改善した点を投稿します。

行頭・行末の移動とコマンドモードに戻るキー入力、打ちにくくないですか?

Vimはデフォルトでは、

Key 結果 
 0  行頭に移動 
 ^  行頭に移動 
 $  行末に移動 
 Esc  コマンドモードに戻る 
 ctl + [  コマンドモードに戻る 

となっています。
しかし、どれもホームポジションから少々離れているので、これを改善しようと思います。
私のタイピングスキルが低いだけですかね?笑
でも、少なくとも$とかは誰でも打ちにくいと思います……!

.vimrcの編集

こういったVimのコマンドを編集するのは.vimrcファイルを用います。
デフォルトでは無いので、自分で作ります。
そうしたら、このファイルを開いて自分の好きなように編集出来ます。

~$ touch .vimrc
~$ vim .vimrc

私は以下のようにしました。

noremap <C-h> 0
noremap <C-l> $
inoremap <C-j> <Esc>
vnoremap <C-j> <Esc>

これらは何を意味しているのかというと、

Key 結果 
 ctl + h  行頭に移動 
 ctl + l  行末に移動 
 ctl + j  コマンドモードに戻る 

という風にVimのコマンドを編集したことになります。
詳しい編集方法などは、下記の「参考にしたサイト」から見てみてください。
上記のようにすると、ほぼホームポジションが崩れないので、初心者でも高速にVimを扱えるようになると思います。

こういうのを考えるようになると、他の人がどういう設定をしているのか気になってきます笑
もし上記の設定だとまずい場合があれば教えてください!

参考にしたサイト

http://vimblog.hatenablog.com/entry/vimrc_key_mapping
https://cocopon.me/blog/2013/10/vim-map-noremap/


vim 命令集

$
0
0

通常状態:Esc
挿入状態:i
一文字追加&挿入状態:a
一行追加&挿入状態:o
一文字置換:r
複数文字置換:R
保存::w
閉鎖::q
保存&閉鎖::wq

#28/100DaysOfCode【gitでローカルリポジトリにコミットして、リモートリポジトリにプッシュしようとしてみた】

$
0
0

概要

本日やりたかったこと
①リモートリポジトリとローカルリポジトリの接続
②Eclipseで先週のフィードバックのリライト
③リモートへのプッシュ
④Javaの勉強へ

本日やったこと
①リモートリポジトリとローカルリポジトリの接続
②vimコマンドの理解
③add commit

できなかった理由~技術編~
①インデックスからローカルへコミットができていないままリモートへプッシュしようとしていた。
②untracked fileの対応。未追跡がどこで発生しているのかと、なぜ発生していると他のディレクトリがUPできないかがわからなかった。
③修正版のディレクトリをローカルリポジトリへアップするのができなかった(解決済み)
④リモートリポジトリへプッシュするはずが最後ごちゃごちゃってなった。(集中力が切れてなにがわからないかわからない、あした見る)

できなかった理由~その他ノウハウ~
①ターミナルの記録を残すときに注釈をいれながら理解していくこと。わからない部分がわからないまま飛んでしまいそうになる。

リモートリポジトリとローカルリポジトリの接続

昨日はローカルリポジトリの作成が完了したあと
リモートリポジトリとの接続ができずに終わった。

そのときのエラーメッセージをどうして控えておかなかったのか、、、不覚、、、

というわけでもう一度リモートリポジトリとローカルリポジトリを接続するところから始める。

昨日参考にしたサイトは下記。
【さるわか】

tomimotukenoMBP:~ yusuketomimoto$ git remote add origin https://github.com/ytomimoto/WEBbytom.git

まずはリモートリポジトリを接続して

tomimotukenoMBP:~ yusuketomimoto$ git push https://github.com/ytomimoto/WEBbytom.git gittest
error: src refspec gittest does not match any.

プッシュを実行。

そしてこのエラーメッセージである。
確か昨日の記憶によると
プッシュしてくれと指定したブランチの名前"gittest"が違うか
そもそもローカルにコミットできていないケースがある。

なのでまずローカルのブランチの名前を確認する。
【it branchメモ - ローカルやリモートのブランチ一覧を見る。リモートブランチ(追跡ブランチ)の情報を更新する(オプション-r、-a)】
この方法で確認できるらしい。

image.png

するとどうやらそもそもブランチがローカル上にない様子。昨日コミットしたはずだが、、、

というわけでもう一度ディレクトリ・ローカルリポジトリを作成しローカルへコミットしてみようと思う。
【今さら聞けない!GitHubの使い方【超初心者向け】】

image.png

image.png

ううう、やっとできた、、、やったぞ、、、
多分昨日インデックスからローカルへのコミットができていなかったのだろう。

image.png

やはり確認するとローカルでブランチが作成されている。
image.png
(色が薄くて見づらい、、、すいません、、、)

では昨日はどういう状態だったのだろう??
image.png
やっぱりコミットされた形跡がある。
ローカルにコミットできているはずなのにgit branch で確認できていない状況ってなんだろう。

もう一度やってみる。
まずワークツリー内で先程用意したhello.htmlを更新する。(new addを追加)

image.png

いまワークツリー内で更新をしたので一度
下記を参考にしてローカルリポジトリへコミットしてみたいと思う。

//

image.png

//

ファイルを変更するには一度git add→ git commitをする必要がありそうである。
するとそもそも指定したファイル名に一致するファイルがディレクトリに存在しないと表示されている。

tomimotukenoMBP:~ yusuketomimoto$ git add hello.html
fatal: pathspec 'hello.html' did not match any files
tomimotukenoMBP:~ yusuketomimoto$ git commit -m "add new file"
On branch master

念の為確認したがディレクトリにはやはり存在している。
image.png

下記の通りワークツリー内に存在しているはずなのになぜだろう。

image.png

今現状としては初回はリモートにプッシュできるものの、二回目以降プッシュができない状態である。

修正版をローカルリポジトリへコミット→リモートリポジトリにプッシュする方法を調べてみたいと思う。

//

image.png

//

これを見てみるとどうやらすでにインデックスに存在しているファイルに変更を加えてローカルリポジトリにコミットするのではなく、
インデックスに存在しているファイルを一度コピってそれを編集して別フアイルとしてインデックスにあげる必要があるのか?

tomimotukenoMBP:~ yusuketomimoto$ git add hello.html
fatal: pathspec 'hello.html' did not match any files
tomimotukenoMBP:~ yusuketomimoto$ git add .
warning: adding embedded git repository: Documents/GitHub/iceberg.vim
hint: You've added another git repository inside your current repository.
hint: Clones of the outer repository will not contain the contents of
hint: the embedded repository and will not know how to obtain it.
hint: If you meant to add a submodule, use:
hint: 
hint:   git submodule add <url> Documents/GitHub/iceberg.vim
hint: 
hint: If you added this path by mistake, you can remove it from the
hint: index with:
hint: 
hint:   git rm --cached Documents/GitHub/iceberg.vim
hint: 
hint: See "git help submodule" for more information.

やはり最初にgit add でワークツリーにある更新済みファイルをインデックスに
加えようとすると対象ファイルが見つからないとなってしまう。

もう一度addについて調べてみる必要がありそうだ。
ドットインストールがいいらしいので少しみてみる。

参考にしてコミットしてみたが、やはり新しいディレクトリの作成とローカルへの追加はできる。
入力画面から抜けられないと思ったらvimというエディターが起動していたらしい。
【vimの抜け方】

image.png

nothing added to commit but untracked files present
tomimotukenoMBP:~ yusuketomimoto$ git push origin master
error: src refspec master does not match any.
error: failed to push some refs to 'https://github.com/ytomimoto/WEBbytom.git'
tomimotukenoMBP:~ yusuketomimoto$ 

この()内の違いはなんだ、、、→ git log --onelineでシンプルにコミットを見ることが可能。

ドットインストールを進めていくと6コマ目で
既にインデックスへ上がっているディレクトリを更新してローカルへプッシュする方法が上がっていた。

tomimotukenoMBP:awesome yusuketomimoto$ git log --stat
///--stat オプションは、各コミットエントリに続けて変更されたファイルの一覧と変更されたファイルの数、追加・削除された行数が表示される。
commit 4fdce660f0c4638a01663dbf8e737e6d7ca7d719 (HEAD -> master)
Author: ytomimoto <interntomimoto0104@gmail.com>
Date:   Sun Sep 9 17:18:51 2018 +0900

    initial commit
    :wq
    :wq
    :wc:wq

 hello2.html | 20 ++++++++++++++++++++
 1 file changed, 20 insertions(+)

commit 2837f9268a2251bc1abcc141e21c15e156f554f6 (origin/master)
Author: ytomimoto <interntomimoto0104@gmail.com>
Date:   Sun Sep 9 10:51:20 2018 +0900

    add new file

 hello.html | 16 ++++++++++++++++
 1 file changed, 16 insertions(+)
tomimotukenoMBP:awesome yusuketomimoto$ ls
hello.html  hello2.html

//今回はvim上で修正を加えているが通常はIDE上からインデックス内のファイルへ変更を加えることになると思う。

tomimotukenoMBP:awesome yusuketomimoto$ vim hello.html
tomimotukenoMBP:awesome yusuketomimoto$ git status
On branch master

//ここではインデックスにもステージされてないし、ローカルにもコミットされていないという状態を指している。
Changes not staged for commit:

//インデックスに載せたいならadd
  (use "git add <file>..." to update what will be committed)

//変更が間違っているならcheckoutをしなさいよとなっている
  (use "git checkout -- <file>..." to discard changes in working directory)

//このmodifiedが変更されましたという意味になっている。

    modified:   hello.html

Untracked files:
  (use "git add <file>..." to include in what will be committed)

    .index.html.swp

no changes added to commit (use "git add" and/or "git commit -a")
tomimotukenoMBP:awesome yusuketomimoto$ 

//ここで一旦間違えた設定で修正をなくしてみる
tomimotukenoMBP:awesome yusuketomimoto$ git checkout -- hello.html

//catは泥棒ネコ的な意味合いで覚える。盗み見る。
tomimotukenoMBP:awesome yusuketomimoto$ cat hello.html
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  <meta http-equiv="Content-Style-Type" content="text/css">
  <title></title>
  <meta name="Generator" content="Cocoa HTML Writer">
  <meta name="CocoaVersion" content="1561.6">
  <style type="text/css">
    p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica}
  </style>
</head>
<body>
<p class="p1">Test</p>
</body>
</html>
tomimotukenoMBP:awesome yusuketomimoto$ 

ここまでで既にインデックス上にある
ディレクトリの修正が完了した。

tomimotukenoMBP:awesome yusuketomimoto$ git status
On branch master


//このアントラックドファイルの意味が不明、あとからググろう。
Untracked files:

  (use "git add <file>..." to include in what will be committed)

    .index.html.swp

nothing added to commit but untracked files present (use "git add" to track)

//とりあえず今修正したファイルをインデックスにステージしようと思う。

tomimotukenoMBP:awesome yusuketomimoto$ git add hello.html

//ここまではおけ
tomimotukenoMBP:awesome yusuketomimoto$ git status
On branch master

//するとやはりアントラックドファイルが登場。
//ドットインストールでは 新しくコミットしましたを意味する英文が出ているのになぜ、、、
Untracked files:
  (use "git add <file>..." to include in what will be committed)

    .index.html.swp

nothing added to commit but untracked files present (use "git add" to track)

というわけでUntracked filesとの格闘スタート。
【.2 Git の基本 - 変更内容のリポジトリへの記録】
//
作業コピー内の各ファイルには 追跡されている(tracked) ものと 追跡されてない(untracked) ものの二通りがあることを知っておきましょう。追跡されている ファイルとは、直近のスナップショットに存在したファイルのことです。これらのファイルについては変更されていない(unmodified)」「変更されている(modified)」「ステージされている(staged)」の三つの状態があります。追跡されていないファイルは、そのどれでもありません。直近のスナップショットには存在せず、ステージングエリアにも存在しないファイルのことです。最初にプロジェクトをクローンした時点では、すべてのファイルは「追跡されている」かつ「変更されていない」wq状態となります。チェックアウトしただけで何も編集していない状態だからです。

ファイルを編集すると、Git はそれを「変更された」とみなします。直近のコミットの後で変更が加えられたからです。変更されたファイルを ステージ し、それをコミットする。この繰り返しです。ここまでの流れを図 2-1 にまとめました。
//

スナップショットって?なんなん?
//
スナップショットとは、ある時点でのソースコードや、ファイル、ディレクトリ、データベースファイルなどの状態を抜き出したもののことです。 バックアップをする際に、バックアップ処理中にファイルが更新されると、ファイルやディレクトリに不整合が起こることがあります。 これを防ぐために使用されるのがスナップショットです。
//

今回はuntracked file については未追跡というとこまでの理解でとどめておく。
どこで未追跡ファイルと認識されるのかについては知っておかないといけない。
またなんで未追跡ファイルがあると他のファイルを add できないのかも気になる。

とりあえず下記で削除の方法だけ確認しておく。
【git Untracked files(未追跡ファイル)を1発で消し去る】

tomimotukenoMBP:awesome yusuketomimoto$ git clean -f
Removing .index.html.swp
tomimotukenoMBP:awesome yusuketomimoto$ git status
On branch master
nothing to commit, working tree clean
tomimotukenoMBP:awesome yusuketomimoto$ git add hello.html
tomimotukenoMBP:awesome yusuketomimoto$ git status
On branch master
nothing to commit, working tree clean
tomimotukenoMBP:awesome yusuketomimoto$ vim hello.html
tomimotukenoMBP:awesome yusuketomimoto$ git add hello.html
tomimotukenoMBP:awesome yusuketomimoto$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    modified:   hello.html

tomimotukenoMBP:awesome yusuketomimoto$ 

これで修正したものをローカルリポジトリへコミット完了。
そして最後にこれをリモートへプッシュする。

tomimotukenoMBP:awesome yusuketomimoto$ git push origin master
Enumerating objects: 4, done.
Counting objects: 100% (4/4), done.
Delta compression using up to 8 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 681 bytes | 681.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To https://github.com/ytomimoto/WEBbytom.git
   2837f92..4fdce66  master -> master

できたっぽいのでは??
しかし

tomimotukenoMBP:awesome yusuketomimoto$ cat hello.html
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  <meta http-equiv="Content-Style-Type" content="text/css">
  <title>aaaaaaaaaaaaaaaaaaaaaaaaaa</title>
  <meta name="Generator" content="Cocoa HTML Writer">
  <meta name="CocoaVersion" content="1561.6">
  <style type="text/css">
    p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica}
  </style>
</head>
<body>
<p class="p1">Test</p>
</body>
</html>
tomimotukenoMBP:awesome yusuketomimoto$ 

ローカル上ではタイトルにa連打している。
statusでも

tomimotukenoMBP:awesome yusuketomimoto$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    modified:   hello.html

になっているにもかかわらずリモート上では更新されていない。
謎である。

image.png

てか向こうで更新扱いになってないし、、、

image.png

2分前にリモートにプッシュしたはずなのだが、、、

tomimotukenoMBP:awesome yusuketomimoto$ git remote add hello.html git@github.com:ytomimoto/WEBbytom.git
tomimotukenoMBP:awesome yusuketomimoto$ git push hello.html git@github.com:ytomimoto/WEBbytom.git
error: src refspec git@github.com does not match any.
error: failed to push some refs to 'git@github.com:ytomimoto/WEBbytom.git'
tomimotukenoMBP:awesome yusuketomimoto$ git push git@github.com:ytomimoto/WEBbytom.git hello.html
error: src refspec hello.html does not match any.
error: failed to push some refs to 'git@github.com:ytomimoto/WEBbytom.git'
tomimotukenoMBP:awesome yusuketomimoto$ git push git@github.com:ytomimoto/WEBbytom.git master
The authenticity of host 'github.com (192.30.255.113)' can't be established.
RSA key fingerprint is SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'github.com,192.30.255.113' (RSA) to the list of known hosts.
Enter passphrase for key '/Users/yusuketomimoto/.ssh/id_rsa': 
Enter passphrase for key '/Users/yusuketomimoto/.ssh/id_rsa': 
Everything up-to-date
tomimotukenoMBP:awesome yusuketomimoto$ 

やば、なにかしたかな、、、

とりあえずリモートへプッシュができない汗
けど今日はvimの簡単な使い方とadd commitの使い方がわかった。

数年ぶりに Vim 環境を整理しなおしたのでまとめ

$
0
0

ここ 2 年くらいはガッツリ Swift エンジニアだったのもあって、わりと Vim から離れてたわけなんですけども、いまアプリ開発自体は担当しなくなって最近は Ruby/PHP 触る時間が増えてきて、まあ Xcode と比べるとだいぶ(自分の)環境が貧弱で不便だし、ここ数年で大きな変化があったっぽい感じなのでプラグインまわりをモダンな環境に移行しはじめてます。なお、この記事には Ruby や PHP に特化した話題は出てこない模様。

neovim

いきなりだけど neovimにしました。neovim のほうが deopleteとか deniteとか先進的なプラグインのサポートが良さそうと思ったのが理由です。

2 年くらい前に触った時は、日本語入力してると文字化けしていくという謎の現象があったり、パフォーマンスで気になるところがあって移行しなかったのですけど、今回試した 0.3.1 だと特に気になる点もなくて快適でした。

Plugins

まずは「あ、これ一度も使ってないや」ってやつを削除しまくってから(大事)、もうメンテされてない古いやつを移行したりとかなんとか。

とりあえず主に使ってるプラグインを列挙します。

Shougo/dein.vim

https://github.com/Shougo/dein.vim

パッケージ管理のプラグイン。これがないと始まらない。

Denite 関連

https://github.com/Shougo/denite.nvim
https://github.com/Shougo/neomru.vim

Denite ってなんて言えばいいんですかね。検索のインターフェイス。バッファの切替やファイルオープンが高速にできるやつです。neomru は denite 用に「最近使ったファイル」を検索できるようにしてくれる。

git まわり

tpope/vim-fugitive

https://github.com/tpope/vim-fugitive

git のコマンド実行をエディタから出ないでできる。前は git-vimを使ってたけど、blame くらいしか使わなかったかな…結局コマンドラインのほうが慣れてるという。後述する rhubarb が便利なので乗り換えた。

tpope/vim-rhubarb

https://github.com/tpope/vim-rhubarb

fugitive を拡張するためのプラグイン。github で管理しているファイルを開いてから :Gbrowseをすると、なんと github.com 上の該当のファイルをブラウザで開いてくれてプレビューできる。VISUAL モードで選択してからだとアンカーリンクにもなる。

仕事だと github 上のリンクでポインタを示すことが結構あるんでこれはだいぶ捗りそう。

airblade/vim-gitgutter

https://github.com/airblade/vim-gitgutter

sign の領域に git のステータスを表示してくれる。追加・削除・変更したところがすぐわかる。

3. tmux 2018-09-09 21-10-42.png

vim-scripts/git-commit

https://github.com/vim-scripts/git-commit

git commitしてコミットメッセージを編集する時に、git diffの内容も一緒に見れるようにしてくれるプラグインです。なにを変更したのかわかるので便利。

補完まわり

Shougo/deoplete.nvim

https://github.com/Shougo/deoplete.nvim
https://github.com/Shougo/neoinclude.vim
https://github.com/Shougo/neosnippet.vim
https://github.com/Shougo/neosnippet-snippets

neocomplete から乗り換えて deoplete へ。なにが変わったのか正直よくわからないのだけど…安定してます。neosnippet も素のままで十分環境がよくなる。

まだ言語ごとに特化した補完プラグインが選定できてないのでそれについてはまた今後。

Raimondi/delimitMate

https://github.com/Raimondi/delimitMate

カッコやクォーテーションを入力したら閉じカッコとかを補完してくれる。こういうの、導入前は「余計なことされたら邪魔そう」とか思う方なんだけど、すくなくとも delimitMate はまったく手放せない存在になっている。

w0rp/ale

https://github.com/w0rp/ale

lint 結果を逐一報告してくれるプラグイン。PHP を書いてるとセミコロンを忘れる事故が多発するんだけど、こいつのおかげで syntax error に悩まされることはなくなりそうです。

3. tmux 2018-09-09 21-32-44.png

以前は syntasticを使ってたんだけど、ファイルを自動保存してるとチェックしてくれないことと、ale のほうが動作速度が快適のようなので乗り換えました。

thinca/vim-localrc

https://github.com/thinca/vim-localrc

.local.vimrcてファイルを置いとくと、このファイルがあるディレクトリ以下のファイルを開いた時に内容が適用される。プロジェクトごとの設定とか管理するのに使ってます。

vim-scripts/table_format.vim

https://github.com/vim-scripts/table_format.vim

テキストを整形してくれる。これも長年愛用しているプラグイン。

3. tmux 2018-09-09 21-43-50.png3. tmux 2018-09-09 21-44-05.png
実行前実行後

m文字以内を表す{,m}なんて量指定子は存在しない。…わけではない。

$
0
0

結論

通常?多くの言語で使える正規表現では{,m}は使えず、{0,m},{1,m}を使う必要がある。

が、
(いまのところ見つけられた範囲では)
Rubyやvimなどでは{,m}の書き方が使える。

正規表現エンジンで言うと、
鬼車系とNFAが該当するようだ。


引用記事です。

発端

n文字以内を指定したくて、Googleで「正規表現 以内」で検索。
出てきたページ
正規表現:文字数や、文字数の範囲を指定する表現 | WWWクリエイターズ
を参照。

「〜文字以下」の指定

同様に最小値の指定を省けば、「〜文字以下」の表現となります。

// 10文字以下の半角数字の表現[0-9]{,10}

という記法を発見。
特に言語指定がされていなかったので、一般的な正規表現と思い込む。

サンプルにならい、JavaScriptの正規表現に組み込んだところ、うまく一致しない。

Online regex tester and debugger: PHP, PCRE, Python, Golang and JavaScript

でチェックしてみても、どうやら正しく動いていないようだ。

JavaScript

正規表現 - JavaScript#特殊文字の使い方 | MDN

ここには{,n}の記述がなかった。
なので、先のサンプルは少なくともJSでは存在しない記法だと考えた。


ではあのサンプルは何でチェックしていたのか?ソラで書いてミスしてしまったものなのか?
卑近な言語の量指定子をついでにチェックしてみた。

Perl

正規表現と言えばPerl。1

perlreref - Perl の正規表現のリファレンス#量指定子 - perldoc.jp

{,n} という量指定子はありません。 これはリテラルな文字列として扱われます。

釘を刺されていた。

Python

6.2. re — 正規表現操作#正規表現のシンタックス — Python 3.6.5 ドキュメント

ないです。

PHP

PHPはPerl互換のPCREとPOSIX正規表現なので、POSIXのほうを

PHP: 繰り返し - Manual

PCREはPerl互換なので見るほどでもなかったかも。

PHP: Perl とは異なる点 - Manual

PHP: POSIX 正規表現との違い - Manual

POSIXの方も指摘されてないので違いはない?

Wiki

正規表現 - Wikipedia

意外と充実してわかりやすそうですが、ない。

その他

正規表現メモ

,n, ,mでチェックしましたが、なさそう。

Ruby

はい、もったいぶりましたが、あるパターン。

正規表現 (Ruby 2.5.0)

(バージョン古い?)

{,m} m回以下(mは数字)

あ り ま し た。

正規表現エンジンを調べる

Rubyの正規表現のエンジンはなんじゃろと検索すると、

Ruby 2.4.1新機能: Onigmo正規表現の非包含演算子(?~ )をチェック

Rubyの正規表現エンジンとしておなじみのOnigmo

鬼車の拡張のよう。

鬼車 正規表現 Version 6.0.0 2016/05/02

{,n}? 零回以上n回以下 (== {0,n}?)

なるほどー。

Vim

なんとなくカバーしてそうだったので記事を書くついでに調べました。

vim正規表現リファレンス#繰返し制御系(量指定子) - Qiita

a\{,m}0回以上 m回以下の aの繰り返しにマッチする。(最長マッチ)

やはりある。
ただ、鬼車は== {0,n}?と言っているので、最短と最長で少し異なるような…?

エンジン調べ

pattern#two-engines - Vim日本語ドキュメント

Vim は二つの正規表現エンジンを持っています:
1. 古い、バックトラッキングエンジン。すべての機能をサポート。
2. 新しい、NFA エンジン。いくつかのパターンで動作が速いがいくつかのパターンで
は遅くなる。

Vim は自動的に適切なエンジンを選択します。何か問題が発生したか、あるいは明示的
にエンジンを選択したいか、あるいはその他の理由で、エンジンを指定したい場合はパ
ターンの先頭で次のように指定します:

pattern#E60 - Vim日本語ドキュメント

\{,m}アトムの 0 以上 m 以下の繰り返し。最長一致
\{-,m}アトムの 0 以上 m 以下の繰り返し。最短一致

なるほど、Vimは最長と最短別々の記法があると。

{すべてViにはない機能です}

さすが。

NFAエンジン

正規表現の詳細仕様(NFAエンジン)

 反復子の {n,m} には、以下のような省略型も存在します。
   {n}   n 回丁度( n >= 0 )
   {n,}   n 回以上( n >= 0 )
   {,m}   0 回以上 m 回以下( m >= 0 )

Vimのほうがさらに拡張されているようだ。

おわり

正規表現を話題にするときは、何の言語(エンジン)を使っているかを少し意識しましょう。
やはり動作環境の掲示は大事。


  1. 個人の感想です。 

vimがdyld: Library not loadedで起動できなくなった [mac]

$
0
0

現象

bashrcでも修正しようとターミナルからvimを起動しようとすると、以下のエラーが出て起動しない

$ vim .bashrc
dyld: Library not loaded: /usr/local/opt/python/Frameworks/Python.framework/Versions/3.6/Python
  Referenced from: /usr/local/bin/vim
  Reason: image not found
Abort trap: 6

python? 最近pythonなんか使ったっけ... いや使ってない
というかvim関係ある?

原因がよく分からない

解決方法

ググったらbrew upgradeしろとある
vimが「dyld: Library not loaded」エラーが出て起動できない(MacOS High Sierra) - Qiita https://qiita.com/tomo62/items/9192477a4109f6a71eb8

よく分からんので、とりあえずbrew upgradeしよう

$ brew upgrade
Updating Homebrew...
==> Auto-updated Homebrew!
Updated 1 tap (homebrew/core).
==> Deleted Formulae
mediatomb

==> Upgrading...略

upgrade終わって、vimを起動させてみると

お、起動した

スクリーンショット 2018-09-12 17.52.53.png

解決した、なんだったんだろうか

実行環境を記入するvimショートカット

$
0
0

READMEとかに自分の環境を載せたほうがいいんだろうけど、
なんかめんどくさい...

こういうことよくありますよね.

じゃあ:EnvInfoって打ったら、
こんなふうに環境情報が記入されるような設定を入れちゃいましょう.:thumbsup_tone1::thumbsup_tone2::thumbsup_tone3:

4.15.0-34-generic

Python 2.7.15

DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=16.04
DISTRIB_CODENAME=xenial
DISTRIB_DESCRIPTION="Ubuntu 16.04.5 LTS"

kinetic

以下vimscript.

私はpython使うのでpythonのヴァージョンを表示させていますが、
これをcmakeだったりのヴァージョンに変えたりアレンジして使ってください.

command! EnvInfo call writeEnvInfo()
function! EnvInfo()
    " carnel version.
    execute ':r! uname -r'
    " python version.
    execute ':r! python -V'
    " Os version.
    execute ':r! cat /etc/lsb-release'
    " ros version.
    execute ':r! rosversion -d'
endfunction

初出勤ーーRubyの環境構築ーー

$
0
0

スクレイパーやクローラーをプログラミングする仕事始めました

開発経験積んで就活で活かしていきたいので、クローラー開発のアルバイトを始めました。rubyでプログラミングしていきます。元々は学校の研究でMATLABを今年の4月からやってたのと、6月からpythonで機械学習とか勉強してました。勉強用twitterアカウントに連絡をいただき、バイトを始めました。学んだことをつらつらと羅列していきます。

  • まずは研修!

rubyは触るの初めてなので、とりあえず最初は研修です。
slackやらTrelloの説明を受け、業務で使うアドレスとスプレッドシートやドライブの説明を受け、研修内容として用意されている課題をこなしていくことに。

  • HTML&CSS

最初の課題はHTMLでhello worldして、その後文字色変えたりエンコード変えたり。
ダウンロードしててよかったAtomさん。この辺は一応progateでちょっとやった程度の僕でも余裕。
こんな感じ。
image.png

  • rubyの環境構築

はい、つまづきました。
環境構築ってやっぱり面倒ですね。避けては通れないからしょうがないけどな!
まず何でつまづいたかというと、僕の使ってるPCはwindowsなんですが、rubyのインストールにrbenvを使えという指示。rbenvはwindowsに対応してないからWindows Subsystem for Linux (WSL) でUbuntuをインストールしてUbuntu上でrubyを動かしていくことになる。研究室のワークステーションぶっ壊したことあるからLinuxにトラウマ...
参考にしたurlはこちら。
https://qiita.com/yukio_tokuyoshi/items/042546812c663ceeccf3

続いてrubyのインストール。この記事にしたがってやっていくことに。
https://qiita.com/godai0505/items/44d12ef0d52b2dc9d560

するとエラー吐いてインストールできない。エラーメッセージをググって解決。(エラーの理由はワカラナイ、解決したからいいや)
https://askubuntu.com/questions/237576/no-acceptable-c-compiler-found-in-path

そして次はbundlerインストールして bundle経由でruby実行できるようにしましょうとの指示。
何それ...
とりあえずググってみてこのページを参考にしてやってみよう。
http://sounanda.jp/itskillup/?p=749

そしてその途中で気づく。「WSL環境でファイルの読み書きってどうやるの...?
ファイルがどこに保存されてるのかも知らねぇ...」社員さんに尋ねてみた。
cui上でしかできないから読み書きはVimでやらなきゃいけないだと...
エディタアプリ使えないってマジか。macならUbuntuも必要なくそのままrbenv使えてエディタもAtom使えたらしい。反apple派の人間だったからwindowsのPC買った5月の俺を呪う。
71Ts-3JCvkL._SL1500_.jpg

後悔してもしょうがない。Vimの書き方覚えなきゃ。ってところで今日はとりあえず終わり。環境構築も終わってないぞ。大丈夫か。

とりあえず次の出勤までにVimの書き方覚えて.rbファイルの実行はできるようにしときます。


Example Article

Vim — 複数行をカット&ペーストする ( 3行カットするなら 3dd → p )

Vimでredo

初めてのテストコード

$
0
0

研修ということでRubyでの課題を進めていました。
基本的にはpythonでなら知ってる関数と同じことができるメソッドを探して進めていたんですが...

  • test/unitを使ってテストコードを書く

じゃんけんの勝ち負けを判定するクラス、メソッドを書いて、それをテストするコードを書く課題。
テストコードはpythonでも書いたことがなく、クラスも自分で書くのは数回しかやってないから何から始めりゃいいのか。
とりあえずググって見様見真似で書いてみた。

janken_class.rb
classJankendefhantei(p_hand,c_hand)ifp_hand==c_handreturn"あいこ"elsif(p_hand=="グー"&&c_hand=="チョキ")\||(p_hand=="チョキ"&&c_hand=="パー")\||(p_hand=="パー"&&c_hand=="グー")return"勝ち"elsereturn"負け"endendend

このクラスを使って標準入力からg,c,p(グー、チョキ、パー)を入力してコンピュータ側でのランダムな手との対戦結果を表示するコード。

janken.rb
require'./janken_class'player=gets.chompcpu=Random.rand(0...3)gcp={"g"=>"グー","c"=>"チョキ","p"=>"パー"}hands=gcp.valuesp_hand=gcp[player]c_hand=hands[cpu]janken=Janken.newresult=janken.hantei(p_hand,c_hand)puts"あなたは#{p_hand}、私は#{c_hand}#{result}です。"

そして問題のテストコード。

janken_test.rb
require'test/unit'require'./janken_class'classTC_janken<Test::Unit::TestCasedefsetup@obj=Janken.newenddeftest_draw_gcheck=@obj.hantei("グー","グー")assert_equal("あいこ",check)enddeftest_draw_ccheck=@obj.hantei("チョキ","チョキ")assert_equal("あいこ",check)enddeftest_draw_pcheck=@obj.hantei("パー","パー")assert_equal("あいこ",check)enddeftest_win_gcheck=@obj.hantei("グー","チョキ")assert_equal("勝ち",check)enddeftest_win_ccheck=@obj.hantei("チョキ","パー")assert_equal("勝ち",check)enddeftest_win_pcheck=@obj.hantei("パー","グー")assert_equal("勝ち",check)enddeftest_lose_gcheck=@obj.hantei("グー","パー")assert_equal("負け",check)enddeftest_lose_ccheck=@obj.hantei("チョキ","グー")assert_equal("負け",check)enddeftest_lose_pcheck=@obj.hantei("パー","チョキ")assert_equal("負け",check)endend

1つずつメソッドを作らなくても1つのメソッド内で複数の場合をテストした方がよいとのご指摘により修正。

janken_test_modify.rb
require'test/unit'require'./janken_class'classTC_janken<Test::Unit::TestCasedefsetup@obj=Janken.newenddeftest_jankencheck=@obj.hantei("グー","グー")assert_equal("あいこ",check)check=@obj.hantei("チョキ","チョキ")assert_equal("あいこ",check)check=@obj.hantei("パー","パー")assert_equal("あいこ",check)check=@obj.hantei("グー","パー")assert_equal("負け",check)check=@obj.hantei("パー","チョキ")assert_equal("負け",check)check=@obj.hantei("チョキ","グー")assert_equal("負け",check)check=@obj.hantei("グー","チョキ")assert_equal("勝ち",check)check=@obj.hantei("チョキ","パー")assert_equal("勝ち",check)check=@obj.hantei("パー","グー")assert_equal("勝ち",check)endend

test\unitについてはもっと公式リファレンス読み込んで理解しておきたい。

  • Vimがやっぱり使いづらい

色々とコード書いてて、やっぱり使いづらい。特に普通のIDEみたいに手軽にコピペができないのがしんどい。クリップボードが使えない設定になってたからvim_gnomeインストールして設定もいじってみたけどうまくいかない。WSLだからかな...

  • Ubuntu上からWindowsのファイルを操作

これには色々な方法があるみたいだけど、僕はUbuntuのホームディレクトリにwindowsのフォルダのシンボリックリンクを作ることにしました。

ln -s /mnt/c/Users/name ~/name

これ使えばもしかしたらwindows側のIDEからスクリプト書いてUbuntuで実行できるかも?

(小ネタ)連番を作成する方法

$
0
0

昔は効率よく作成できなかった連番の作成方法です。
手入力で
1
2
3
4
5
...
とやって打ち間違えたり。。
今思いつくものを挙げてみます。
例はほとんどが1から1ずつ増加するパターンですが、ほぼ逆順や間隔を指定できます。

色々な作成方法

色々と言っておきながら、あまり思いつきませんでした。。

Excelやスプレッドシートを使う

一番知っている人が多そうです。
セルに上から
1
2
3
と入力していき、「3」のセルの右下を下方向にドラッグするとセルごとに連番が入力されていきます。

ATOMのSequential Numberプラグインを使う

無理矢理感があり、まずやりませんがとっさに思いついたので。(笑)
Sequential Numberプラグインはインストール済とします。

  1. 新規ファイルを開き振りたい数字の数だけ改行する。
  2. 改行をドラッグしてコマンドパレットから「Split into lines」を実行(もしくはCtrl(Cmd) + Shift + LでもOK)
  3. コマンドパレットから「Sequential Number」を実行
  4. 各行に連番が出力されます。

seqコマンドを使う

手っ取り早くて、一番よく使います。
例のように逆順や間隔指定もさほど難しくありません。

seq 2 -1

2
1
0
-1
seq 0 3 9

0
3
6
9

Vimエディタ上でseqコマンドを使うこともあります。(むしろその方が多い。)
コマンドモードで外部プログラムを呼び出す方法です。

:r!seq 0 3 9

プログラマーらしく(?)プログラムで出力

上のseqコマンドがあるので、やはりあまりやりませんが、
(この方法を使うとすれば、もっと複雑な数列の場合でしょう。)
プログラマーがプログラムで解決しようとする心がけが大切と思っておくことにします。
ここではphpをターミナルで実行させていますが、お好きな言語でどうぞ。

php -r 'for ($i = 1; $i <= 10; $i++) {echo $i . "\n";}'

1
2
3
4
5
6
7
8
9
10

「連番」でググってみると

連番作成のフリーソフトやWeb上で連番を作成できるツールがけっこう転がっていますね。
上記の方法、意外に知られていないかも?

Virtual Boxでローカル環境を作る初心者メモその3

$
0
0

前回前々回

  • MacOS High SierraにVirtual BoxとVagrantをインストールして、Vagrantを使ってVirtual BoxにCentOSを乗せつつ、IPアドレスを192.168.33.10に設定。

  • sshでCentOSにログインし、ドットインストールのリポジトリを使ってApache、Rubyその他アプリケーションをインストール。

しました。

今回はその続きです。CentOSにVimとRailをインストールして、rbenvでRubyのバージョンもあげました。

Vim

Vimと仲良くなりたいのでVimを入れる。
こちらの記事でそのままでできました。👉 CentOS に Vim をインストール

Vimのバージョン確認

$ yum list installed | grep vim
Failed to set locale, defaulting to C
vim-minimal.x86_64     2:7.2.411-1.8.el6

必要なパッケージが入ってるか確認

$ yum list installed | grep mercurial
$ yum list installed | grep ncurses-devel
$ yum list installed | grep make         
$ yum list installed | grep gcc 

入ってなかったのはインストール

$ yum install mercurial
$ yum install ncurses-devel
$ yum install make
$ yum install gcc

/usr/local/srcの下のvimというディレクトリ内にリポジトリを複製

$ cd /usr/local/src
$ sudo hg clone https://bitbucket.org/vim-mirror/vim vim

そこに移動して中身見てみる

$ cd vim
$ ls

複製してからリポジトリが更新されてないか確認する

$ sudo hg pull
pulling from https://bitbucket.org/vim-mirror/vim
searching for changes
no changes found

makeする

$ sudo ./configure --with-features=huge --enable-multibyte --disable-selinux
$ sudo make
$ sudo make install

確認

vim --version
VIM - Vi IMproved 7.4 (2013 Aug 10, compiled Mar  1 2015 06:42:11)

vimrcはあとで。とりあえず簡単なテキストならCyberduckでいちいちファイル開かなくてもVimで更新できそう。

rubyのバージョンをあげる

$ ruby -v

2.3.1 でした。2.4.1にしたい。
ドットインストール見てバージョンあげます。

$ cd ~/.rbenv
$ git pull origin master
$ cd ~/.rbenv/plugins/ruby-build 
$ git pull origin master
$ rbenv install 2.4.1
$ rbenv global 2.4.1
$ rbenv rehash
$ ruby -v

2.4.1になりました。

Railsをインストール

ドットインストールです。

# その前にSQLiteがインストールされてるか確認

$ sqlite3 --version

3.6.20入ってます。

# gemでインストール

$ gem install rails --no-document
$ rails -v

2.3.1が入りました。

ここまで。

VimでQiitaの記事を投稿しよう! ~QiitaPyの紹介~

$
0
0

はじめに

Qiitaの素晴らしい点の一つは,記事をmarkdownで書けることだと思います.多くのユーザがブラウザ上でmarkdownを書き,記事を投稿していることでしょう.しかしmarkdownを使い慣れたエディタで書くことができれば,投稿がより楽しくなるのではないでしょうか.

Vimmerの皆さん,VimでQiitaの記事を書きたくありませんか?

Vimmerな私は,VimからQiitaへ投稿ができるプラグインQiitaPyを開発しました!
本記事では,QiitaPyの機能と使い方について紹介したいと思います.

QiitaPyのリポジトリ: https://github.com/Kenta11/QiitaPy

セットアップ

Vimの確認

QiitaPyを使うには,Python3が使用できるVimが必要です.bashのコンソールをご使用の場合,以下のコマンドでPython3が使えるかを確認できます.

$ vim --version | grep python3
+conceal           +linebreak         +python3/dyn       +vreplace
# python3の左に+があれば,python3が使える!

QiitaPyをインストール

deinをお使いの方であれば,以下のコマンドを実行して下さい.

call dein#add('Kenta11/QiitaPy')

必要なモジュールをインストール

QiitaPyに必要なpythonのライブラリをインストールします.

pip install pyyaml
pip install qiita_v2

チュートリアル

設定ファイルの用意

まず初めに認証のためのアクセストークンを作って下さい.トークンは40文字の文字列で, https://qiita.com/settings/applicationsで作ることができます.そしてVimを起動し,以下のコマンドを入力して下さい.

QiitaPy config

config.jpg

~/.QiitaPy.yamlというファイルが作成されるので,ACCESS_TOKENに続いてトークンを書いて下さい.またUSER_NAMEの後には Qiitaのユーザ名を書いて下さい.

テンプレートの生成

記事のテンプレートを以下のコマンドで作成できます.

QiitaPy template

template.jpg

生成されたテンプレートの上部はYAMLメタデータブロックです.titleに続いて書き込んだ文字列が,投稿する記事のタイトルになります.またtagsの下に続く"- :"はタグで,例えばVim 8のタグを付けたい場合は"- Vim: 8"として下さい.tweetはその記事を初めて投稿する際に,あなたのアカウントと連携するTwitterアカウントで記事をツイートするかをtrue/falseで指定できます.
YAMLメタデータブロックの下は記事の本文です.markdownの書式に従って,自由に記事を書きましょう.

投稿する

完成した記事を投稿しましょう.例によって,コマンドを使いアップロードします.

QiitaPy post new

post.jpg

これで記事がアップロードされました!Qiitaに見に行きましょう!!

Qiita.jpg

やった!

QiitaPyコマンドの詳細

config

設定ファイルを開きます.設定ファイルは.QiitaPy.yamlという名前でホームディレクトリに配置されます.

QiitaPy config

post

記事を投稿・更新します.その記事を初めて投稿する際は,newオプションが必要です.

QiitaPy post new

記事を更新する場合はnewオプションは不要です.ただし記事を特定するために,後述するlistコマンドで表示される疑似キーが必要です.

QiitaPy post

list

投稿済みの記事の一覧を表示します.記事は"疑似キー: タイトル"で表示されます.なお表示される記事は最新のものからとなります.

QiitaPy list

より古い記事を見たい場合は,ユーザ名とページ番号を追加して下さい.

# 先程は1ページ目を表示していました
# 2ページ目を表示する場合は以下のコマンドを入力
QiitaPy list Kenta11 2

また自分以外のユーザの記事一覧も表示できます.

# hogefooさんの記事リストの3ページ目を表示
QiitaPy list hogefoo 3

edit

投稿済みの記事を取得します.なお記事を指定するには,listコマンドで表示される疑似キーが必要です.

# 7番目の記事を取得
QiitaPy edit 7

template

記事のテンプレートファイルを生成します.

QiitaPy template

おわりに

この記事もQiitaPyを使って投稿しました^^.Vimから投稿や編集ができるのは楽しいですね.みなさんも是非使ってみて下さい.
もしQiitaPyに関する質問・要望がありましたら,本記事のコメントや私のTwitter宛に是非教えて下さい.よいVim生活を!


使い捨て環境でLinuxでvimの最新版が使うときは

Windowsメモ帳のメニュー と viエディタコマンドの対応

$
0
0

Windowsメモ帳のメニュー と viエディタコマンドの対応

(一部)

ファイル

新規

GUIのテキストエディタなどと違い、原則として、ファイル名がつかない状態での編集はしないので、注意。

:e 新ファイル名

開く

:e 既存ファイル名

上書き保存

:w

名前を付けて保存

:w 新ファイル名

(参考)カレント行に別ファイルの内容を読み込み

:r 別ファイル名

終了

編集結果を保存して終了

:wq

編集結果を破棄して終了

:q!

(編集していない場合)終了

:q

編集

元に戻す

u

切り取り

カーソル位置の文字を切り取り

x

カーソルの前の文字を切り取り

X

カレント行を切り取り

dd

コピー

カレント行をコピー

yy

カーソル位置の文字をコピー

yl

貼り付け

カーソル位置/カレント行の前に貼り付け

P

カーソル位置/カレント行の後に貼り付け

p

削除

カーソル位置の文字を削除

x

カーソルの前の文字を削除

X

カレント行を削除

dd

検索

後方検索

/文字列

前方検索

?文字列

次を検索

n

逆方向に検索

N

置換

ひとつめの文字列Aを文字列Bに置換

:%s/文字列A/文字列B/

文字列Aを文字列Bに全置換

:%s/文字列A/文字列B/g

(参考)カーソル位置の文字を■に置換

r■

vs codeのvimでescとcapslockが入れ替わらない時の対処法

$
0
0

ubuntu18.04でgnome-tweak-toolを使いescとcapslockを入れ替えて使用しているが、

拡張機能のvimを入れたvisual studio codeで
・capslockで反応無し
・escボタンで、escとcapslockの同時押しのような反応

という状態に陥った。

どうやら調べると、VS codeのバグらしい
※参照 (https://github.com/VSCodeVim/Vim/issues/2419)

ここに解決策があった

ユーザ設定
// `keydown.code` (推奨) または `keydown.keyCode` のいずれかを使用するキー操作のディスパッチ ロジックを制御します。"keyboard.dispatch":"code",
変更後
"keyboard.dispatch":"keyCode"

なぜ私がVimを使っているかもう一度よく考えよう

$
0
0

tl;dr

なぜ私がVimを使っているのかその理由を書きます。この記事を書いた目的は以下の通りです。

  • 自分がVimを使用する理由を明確にしたい
    • Vimを使用する理由は人それぞれでひとまとめにできないことを表明したい
  • あわよくば他の人がなぜそのエディタ/IDEを使用しているのかフィードバックを得たい

経緯

半年以上前の話ですが、会社の新人くんの開発環境(あまり拡張されていないAtomだった)を横で見ていた時のことです。
(私は人の開発環境が気になって仕方がない性分なので割と人の画面を見ます)
エディタの持つインテリセンスを有効に使えていなかったり、効率的な編集方法をしていなかったため、
私が「ほらおれのVimを見てくれ...便利そうだろ...」とアピっていたら、
新人くんに「Vimを使うべきなのでしょうか?」と聞かれたということがありました。

私がVimを使うのは私なりの理由があるし、彼にその理由がそのまま当てはまらないと思ったため。
Vimは一般的に言われている通り学習コストが高いエディタなので、
自分の開発スタイルをよく考えてチョイスしてほしい。
そしてAtomのもつ機能をもっとうまく使えば、現状よりもっと効率的な編集ができる可能性があると伝えました。

しかし、この説明ではうまく自分の言いたいことを表現できてないのではと思いました。

今思えば、世の中のエディタ紹介記事などを見てみるとVimの説明として、
『中・上級者向けのエディタ。学習コストが高いが使いこなせば超効率いい』
という非常に曖昧な説明が多く、自分がなるほどと思う説明があまりない印象でした。

ならば自分で書けばいいじゃんという気持ちで書いたのがこの記事になります。

エディタに求めるもの

思えば紆余曲折があって、今の私はVimを使っています。
しかし、それは私の開発スタイルにVimが最もフィットするエディタだからであって、
けしてGeekっぽくてチョークールじゃん(昔はそうだった)とか、
Vimこそが至高とか、宗教上の理由で使っているわけではありません。
Vimを使うにあたって検討した事項がいくつもあり、結果としてVimを使っているに過ぎません。

結果として私がエディタに求めるものは以下の通りです。(優先度は上のほうが高い)

  1. ターミナル内で起動する
  2. Vimキーバインドが使える
  3. 拡張性が高い
  4. 高速に起動する
  5. 豊富なファイルフォーマットに対応
  6. 端末を変えても設定を同期可能

ターミナル内で起動する

私の開発スタイルではこの項目の重要度はかなり高いです。
仕事中は基本的にターミナルとブラウザのみ表示し、あとSlackをちょいちょい見る位にしています。

ウィンドウ切り替えが少なければ少ないほど作業効率は上がります。
なぜなら人間は多くの情報を同時にさばけるほど器用ではないと考えていますからです。
その上でターミナルから離れたほうがはるかに効率が上がる作業(画像編集etc...)があれば離れたほうがいいと思っています。

またターミナルで起動できると他コマンドと連携しやすいという利点があります。
具体例はgit commitを打つとVimが起動するアレです。

CLIコマンドからVimなんかのエディタを実行して、
エディタ閉じた後に編集結果を取得する手法って誰が考えたんでしょうね?リーナス?
この動作を考えた人はもう掛け値なしの天才だと思っています。

なお私がターミナルにこもる理由はココにまとめてるのでご参照ください。

Vimキーバインドが使える

Vimキーバインドが自分にとって、最も効率よく編集ができるからです。
詳しい説明はをしている記事が大量にあるので省きますが、具体的には以下になります。

  • ホームポジションを崩さずに最低限の運指で作業ができる
  • モードの存在によりショートカットを設定可能なキーが大量にある

ちなみに逆にemacsのキーバインドじゃない理由は、Ctrlを常時押さえる左手小指が貧弱だからです。
ただ、インサート/コマンドモードのキーバインドはemacsキーバインドにしています。
これはシェル操作時のキーバインドと統一したいというのがその理由です。
ただし補完のキー(<Ctrl-n>,<Ctrl-p>)はデフォルトを潰したくないのでそのままです。

拡張性が高い

これは長い歴史が育んだ大量のプラグインもそうなのですが、どちらかというとその前段である
Vimの豊富なインタフェースをVimscriptにより制御できる点が大きいと思っています。

例えばQuickFixなどの特定のウィンドウをトグル(同じキーで表示/非表示を切り替えするような動作)したければ、
以下のような関数定義した後、キーバインドに登録すればトグルする関数とそれを呼び出すキーバインドの完成です。

function! ToggleQuickfix()letl:nr = winnr('$')cwindowletl:nr2 = winnr('$')ifl:nr ==l:nr2
        ccloseendifendfunction
nnoremap <script><silent><Space>f:call ToggleQuickfix()<CR>

え?Vimscriptが読みづらいですって?それはもう慣れるしかありませんね...

一方でUIの拡張性が低いことについては確かにそうだなと思っています。
そういう不満があるからoni(NeoVimのUIをElectronで作ったやつ)とかがでてきているわけですし。

高速に起動する

プログラムの世界において速さとは力です。ことテキスト編集においてもそれは変わりません。
300ms以内に起動してくれないとすぐ編集できないと感じてしまいます。

豊富なファイルフォーマットに対応

使用するファイルフォーマット毎にごとにエディタを変更するのは
エディタの熟練度の向上という観点から見ると良くありません。
可能な限り一つのエディタで多くのファイルフォーマットをカバーできるに越したことはありません。

端末を変えても設定を同期可能

設定ファイルを指定の場所に置いておけば設定を即座に同期できるのは最高です。
設定の同期がファイルベースですべて自動に行われなければ複数端末で設定の乖離が発生し、
あなたのカスタマイズ熱を冷ましてしまう恐れがあります。

私の来歴とVimに至るまでの流れ

さて私のエディタ選定基準となぜVimが適合するかを書いてみましたが、
Vimを使い込んで結果的にこうなったという感は正直否めません。

そこでなぜこのような選定基準が生まれ、Vimに至ったか。
その過程を私のバックボーンを含めて書くことで上記がより理解しやすくなるのでは。と考えました。

ざっくりいうと私はよくいるSIerからWeb系の転職組です。

SIer時代

連結で社員800人くらいのSIerです勤続年数は約6年でした。

  • 仕事
    • OSはWindows
    • 開発はeclipse
    • メモはサクラエディタ
    • ドキュメントはExcel,Word
  • プライベート
    • OSはMac
    • 開発環境はeclipse
    • メモはAtom
    • 気が向いたときにVim

よくあるSIerスタイルです。大半の開発はJavaだったので開発環境はeclipse一択でした。
一方プライベートでは、Macを使用しており、ターミナルやVimを使うと便利だぜという記事の数々に影響され、
Vimとzshをインストールして.vimrcや.zshrcをいじったりしていました。
しかしこのCLI環境をメインに据えるほどの熟練度ではなかったのでGUI+Atomといったりきたりしていました。
一応退職時点でVim歴2年くらいだったと記憶しています。

Web系時代(今ココ)

業務委託もやる系のWeb系です。今は自社サービスの開発チームにいます。勤続年数は約1年半です。

  • 仕事(前半)
    • OSはMac
    • メインの言語はPython
    • 開発環境はいろいろ模索していた
      • Atom
      • PyCharm
      • VScode
      • Vim
    • メモとドキュメント(基本markdownなので)はVim
  • 仕事(後半)
    • OSはArchLinux
    • Vim以外さわってない
    • ターミナルとブラウザ以外さわってない

転職する際、これからのキャリアをサーバサイドエンジニアでやってこうと決めたので、
とりあえず操作は基本的にターミナルにこもることに決めました。
GUI操作を標準にしているとサーバにログイン後の操作に戸惑うことは前職でわかっていたので、
ローカル端末でもCLIを使うことで熟練度を無駄なく上げられると考えたからです。
なお主に使用する開発言語はPythonでした。

開発環境検討

エディタないしIDEは転職してからは特に固定せず、適当に切り替えて色々試していました。
流れとしては以下一覧の上から順番に使って、いまいち満足していなかったのを覚えています。
なお当時Vimキーバインドに多少慣れてはいたので基本的に各エディタ/IDEにVimエミュレータ系プラグインは入れていました。

  • Atom
    • 外観はエディタの中で一番好き
    • 補完やジャンプなどのインテリセンスの設定がうまくいかず動作しなかった
    • 起動が遅い
    • vim-mode-plusのおかげでVimキーバインドはかなり再現されていた
  • VSCode
    • 起動がAtomに比べて早い
    • Vimエミュレータ系プラグインで満足するものが当時なかった
    • デフォルトでいろいろ揃っているのはいいなという感想
  • PyCharm
    • 言語系のインテリセンスは言わずもがな最強
    • Vimエミュレータに不満
    • メモ用途に使うものではないので使い分けが必要だった

当時の不満点

各エディタ/IDEで満足できなかった要因として、
当時既に私がOS操作を大半をCLIで実施していたことが挙げられます。
zshのカスタマイズによりディレクトリやファイル操作はGUIと遜色ない速度で実施できていたのですが、
ファイル編集になると各エディタ/IDEでファイルを開くときにCLIからコールすると、
ウィンドウが切り替えされてコンソールから移動させられます。
それにファイルを開いたとき、既に起動しているプロセスで開いたりするため、
編集中のプログラムと一緒のウィンドウにただのメモが開いたりするのがどうにも我慢できませんでした。

またVimエミュレータ系のプラグインの挙動がどんなに優れていても、
Vimのキーバインドの完全再現ひいてはVimscriptによるカスタム性はどうしても得られませんでした。
コロン(:)から始めるコマンドモードについては再現していたらラッキーぐらいの勢いでした。

またプライベートで育てた環境をdotfilesリポジトリを同期(git pull)すれば
Vimとzshのセットアップが即時完了という状態に慣れていたのですが。
AtomやVSCodeはプラグインの同期処理のために都度プラグインを入れていくつかの操作をする必要があったため、その点についても不満でした。

VimにスイッチついでにOSも

上記の不満の解決方法を考えたとき、割り切って全部Vimでやればいいかなと思いました。
ものは試しとVimで3ヶ月間位過ごすしてみたら、上記の問題は全部キレイに解消されました。
正直インテリセンスが足りないと思う部分もありましたが、
QuickFixを始めとしたVim標準の機能群や<C-o>,<C-i>,<C-^>などのジャンプに慣れれば、定義を見つけたりするのも苦労はないですし
補完も当時deoplete.nvimが安定稼働してきていたのもあって、苦労すればなんとかなるレベルでした。
それにVimでのファイル編集速度も当時の時点で早くなっていたのもあって、
まあインテリセンスがなくともIDEとトントンくらいの作業効率になっていたと思います。
しかしそこに至るまでそれなりの訓練とスタマイズが必要ではありましたが。

なお現在はArchLinuxにVimをインスコしたものを使用しています。
なぜMacからLinuxを切り替えしたのかというと、iTermの文字描画が遅いのが問題です。
Vimコミュニティに参加して気がついたのですがMacのターミナルって描画遅いんですよ本当に。
あとVimとzshの起動時間も早くなります。実測で30%位は早くなります。体感だと2倍くらい速いです。
原因は私もよく解ってないです。
LinuxのディストリにArchをチョイスしたのはなんとなくカッコイイからです。

まとめと補足(エディタスタイル)

Vimを使うといっても人によってその使い方、エディタスタイルが違います。
Vimと一口にいっても以下のように種類がありますし、それはOSや端末などによって変わります。

  • Vim
  • GVim
  • SpaceVim
  • NeoVim
  • Oni

どなたもその人の環境と、環境に合わせて編み出したスタイルがあるはずなのです。
メモ帳の変わりなのか、軽量IDEなのか、他のエディタと併用しているのか。

Vimを使っている人だけでもエディタスタイルに違いがあるのですから、
他のエディタも含めればこのようなスタイルはもっとたくさんあるはずです。

大事なのは何を使うかではなくどう使うかではないでしょうか?
自分のスタイルを見極め、スタイルに最適なエディタを使っていくことこそが我々の考えるべきことです。
そのエディタに対して愛があればなおよしですね。

なおエディタスタイルとは暗黒美夢王さんが言ってた造語です。どっかで聞いた。

vimのNERDTreeで不可視ファイルを表示しておく設定

$
0
0

.vimrcに以下を追記すればいい

let g:NERDTreeShowHidden=1
Viewing all 5771 articles
Browse latest View live
<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>