vim

vim操作方法

# 行の最後に移動しinsertモード
shift+A

# redo(やり直し)
ctrl+r

# 文頭へ移動
shift+^
 
# 行末へ移動
shift+$

# 複数行をコピー
shift+V

# 行を削除(カット)
dd

# カーソルの位置から行の最後まで削除
D

# ビジュアルモード。範囲を指定してy(ヤンク)でコピー
v

# ペースト
p

# カーソルの一行上に行を挿入しinsertモード
shift+o

# カーソルの一行下に行を挿入しinsertモード
o
 
# 半画面下へ移動する
ctrl+d

# 半画面上へ移動
ctrl+u

# 選択した行を左寄せ
Vで行選択 → :le

# 選択部分を指定した方向へインデントします。
Vで選択し、:「>」「<」
 
# n(回数)を指定し、指定した値だけインデントします。
Vで選択し、n + shift + 「>」or「<」



## vim設定ファイルの更新

.vimrc

# 行番号を表示
set number

# 括弧を入力した際に、対応する括弧を表示
set showmatch

# タイトルを表示
set title
 
# コードを色分け
syntax on
 
# タブを空白に置き換える
# インデントを4文字分に
set tabstop=4
set softtabstop=4
set shiftwidth=4
  
# スマートインデントを使用
set smartindent
set autoindent
 
# コマンドの履歴の保存数を指定する
set history=10000

# 検索ヒット時に、ヒットした部分を色づけする
set hlserach
 
# 検索に大文字を含んでいる場合、大小区別して検索する
set smartcase
 
# タブを分かりやすくする
set listchars=tab:»-,trail:-

ファイルエンコードの確認/変換

ファイルエンコード/フォーマットの種類として、”enc”, “fileencoding”, “fileformat”の3つがある。
例外として、Excel形式 “.xlsx” から “.tsv” への変換は、GoogleSpreadSheetへインポートしてから “.tsv” 形式でエクスポートを行えばよい。

文字のエンコードを確認/変更する

エンコードを確認する。

:set enc

変更する。

:set enc=utf-8
:set enc=shift_jis

ファイル自体のエンコードを調べる

エンコードを確認する。

:set fileencoding

変更する。

:set fileencoding=utf-8
:set fileencoding=shift_jis
# 短縮型:":set fenc"でも可能。

改行コード

  • unix: LF \n
  • Mac: CR \r
  • Windows: CR+LF \r\n

ファイルの改行コード(フォーマット)を確認/変更する

Windowsで作成したファイルの改行コードは”CR+LF”である。
これに対して、Linuxの改行コードは”LF”であり、ファイルの転送方法によってはWindowsで作成したテキストファイルをVimで開くと、すべての行末に”M”が表示される場合がある。

改行コードを確認する。

:set fileformat

変更する。

:set fileformat=mac
:set fileformat=dos
:set fileformat=unix
# :set ff (短縮系)

改行コードを削除し、”LF”へ変換(^M削除)する。

:%s/^M//g

“^M”は”Ctrl+V+Ctrl+M”で記述可能。

改行コードをコマンドから調べる

od -c xxx.txt | less

vimでペーストする際、インデントをコピー元ママにする

  1. setコマンド “:set paste” をタイプ、Enter。
  2. “i”を押下しInsertモードにし、”command+p”でペーストを行う。

特定の文字数をカウントする

:%s/{検索したい文字}/&/gn + Enter
10 matches on 3 lines

タブをスペースへ変換する

:set expandtab
:%retab

インデントは、タブではなくスペースを利用するようにする。

ファイルの比較をする

vimでファイルを開き、”:vsplit”に続けて編集したいファイル名を入力する。

:vsplit {比較するファイル}

:windo diffthis


ページをスクロールすると比較対象のファイルも同時にスクロールする。

以下も同様のコマンドである。

:vertical diffsplit 編集するファイル
$ vimdiff Aファイル Bファイル

“dp”と入力すると、該当箇所をマージする。

カーソルを行末から下へ、行頭から上へ自動で移動させる

デフォルトだと行末へカーソルを移動させた後、右へさらに移動させても下へは自動で移動してくれない。
以下の設定を”.vimrc”へ記述することで解消する。

set whichwrap=b,s,<,>,[,]

[Git] コマンド

随時更新

前提知識

fetch

“git fetch origin xxx”は、リモートレポジトリ “origin” のブランチ “xxx” を、ローカルのリモート追跡ブランチ (remote tracking branch) に反映させるということである。

$ git branch -a
* develop
  feature/dynamodb
  feature/ph1-add-flag
  master
  remotes/origin/HEAD -> origin/master # remote追跡ブランチ
  remotes/origin/develop # remote追跡ブランチ
  remotes/origin/ph1-test # remote追跡ブランチ

merge

“git merge origin/xxx” は、リモートレポジトリ “origin” のブランチ “master” の追跡ブランチ (origin/xxx) を、現在のブランチにマージするということである。
マージする場合は --no-ff オプションを基本的に付与する。二つのブランチが fast-forward な関係かどうかにかかわらず、必ずマージコミットが作られる。

-ff: fast-foward

Git コマンド

$ mkdir {WORKING_COPY}
$ cd {WORKING_COPY}

# Gitリポジトリを新たに作成する。バージョン管理外の既存プロジェクトをGitリポジトリに変換したり, カレントリポジトリの初期化を行う。
$ git init

# リモートからローカルへリポジトリのクローン
$ git clone https://{USERNAME}:{PASSWD}@github.com/{ORGANIZATION}/{REPOSITORY}.git

# リモートからローカルへリポジトリのクローンができない場合
# sslVerifyを解除しない場合 "SSL certificate problem: Invalid certificate chain" のようにエラーとなる場合がある。
$ git config --global http.sslVerify false
$ git clone git@xxx...
$ git config --global http.sslVerify true

# ユーザー名/メールアドレスの設定
$ git config user.name "xxx"
$ git config user.email "xxx@gmail.com"

# 他のワーキングコピーも共通でユーザー名/メールアドレスを設定
$ git config --global user.name "xxx"
$ git config --global user.email "xxx.gmail.com"

# 設定の一覧を表示する
$ git config --global --list

# 現在のリポジトリの設定のみ表示
$ git config --list

# 半角区切りで複数ファイルをインデックスへ追加可能。コミット前の一時保存場所への追加と思えば良い。
$ git add README.md xxx.html

# -Aをつけると、変更を全てインデックスへ追加
$ git add -A

# コミット
$ git commit -m "first commit"

# リモートレポジトリのURL情報を追加。どこへpushするのか指定する。
$ git remote add origin git@git....git

# リモートブランチのURL確認
$ git remote -v
origin https://github.com/xxx

# リモートリポジトリを指定する
$ git remote set-url origin git@xxx.github.com:xxx/xxx.git

# リモートリポジトリのmasterへプッシュ。-uは次回からブランチ名(今回はmaster)を省略可能なオプション。
$ git push -u origin master

# チェックアウト (ローカルへブランチを落とす)
$ git checkout origin release/1.1.2

# 最新のコミットをリモートから取得する
$ git pull origin master

# (コミット前の)ローカルの変更を全て取り消す
$ git checkout .

# (コミット前の)ローカルの変更を一部取り消す
$ git checkout -- /path/to/file
# コミットIDを指定してコミットしたものも含めてローカルの変更を全て取り消す
$ git reset --hard c6c2114

# ブランチを指定してコミットしたものも含めてローカルの変更を全て取り消す
$ git reset --hard origin/master

# ローカルでrevertを使ってpush内容を取り消し、リモートへ反映(resetと異なり、コミットが残る)
$ git revert {commit id}

# ステータスを確認する
$ git status

# コミットログを確認する
$ git log --oneline

# グラフ上に展開
$ git log --graph

# コミットログをコミットメッセージから検索する。
$ git log --grep hoge

# 現在のコミットIDを確認する
$ git show -s --format=%H

# 全てのブランチの一覧 (表示されない場合は、更新する)
$ git branch -a | grep release

# リモートブランチの更新
$ git remote update

# ブランチの作成
$ git branch develop

# 作成ブランチをプッシュ
$ git push origin develop

# developをチェックアウトし
$ git checkout develop

# masterへマージする
$ git merge -m "create develop" master

# ブランチを削除する
$ git branch -d origin/feature/xxx

# ブランチを強制削除する
$ git branch -D origin/feature/xxx

# リモートリポジトリの削除情報をローカルへ反映させる
$ git fetch --prune

# gitignoreが有効になっているファイルを表示する
$ git status --ignored

1つのマシンで複数のGitアカウントを使用する

$ ssh-keygen -t rsa -f ~/.ssh/xxx -C "some comment"

# catした内容をGithubへ貼り付ける。
$ cat .ssh/xxx.pub

configファイルへ以下を追記する。
~/.ssh/config

Host xxx
    User yyy
    HostName github.com
    IdentityFile ~/.ssh/xxx

Gitへ認証させる

$ ssh xxx
The authenticity of host 'github.com (xxx.xx.xxx.xxx)' can't be established.
RSA key fingerprint is SHAxxx:xxx.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'github.com,xxx.xx.xxx.xxx' (RSA) to the list of known hosts.
Saving password to keychain failed
Identity added: /Users/user/.ssh/xxx ((null))
PTY allocation request failed on channel 0
Hi xxx! You've successfully authenticated, but GitHub does not provide shell access.
Connection to github.com closed.

CloneとRemoteへの追加

$ git clone git@{USER}:{PASSWD}/{REPOSITRY}.git
$ git remote add origin git@{USER}:{PASSWD}/{REPOSITRY}.git

Pushしたコミットをある時点まで完全に取り消したい

$ git log --graph
$ git reset --hard c53hgoehhogoeo53h53hog3l
$ git status
On branch feature/test
Your branch is behind 'origin/feature/test' by 3 commits, and can be fast-forwarded.
  (use "git pull" to update your local branch)
nothing to commit, working tree clean

# そのままpushを行ってもエラーとなる
$ git push -u origin feature/test
To https://github.com/org/test.git
 ! [rejected]        feature/test -> feature/test (non-fast-forward)
error: failed to push some refs to 'https://user:pass@github.com/org/test.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

# オプション "-f" を付与する
$ git push -uf origin feature/test
Total 0 (delta 0), reused 0 (delta 0)
To https://github.com/org/test.git
 + c53hgoehhogoeo53h53hog3l feature/test -> feature/test (forced update)
Branch feature/test set up to track remote branch feature/test from origin.

Rebaseを取り消したい

$ git rebase -i {コミットID}
Successfully rebased and updated refs/heads/feature/feature-xxx.

$ git status
On branch feature/feature-xxx
Your branch and 'origin/feature/feature-xxx' have diverged,
and have 2 and 4 different commits each, respectively.
  (use "git pull" to merge the remote branch into yours)

$ git reflog
826ab92 HEAD@{0}: rebase -i (finish): returning to refs/heads/feature/feature-xxx
826ab92 HEAD@{1}: rebase -i (pick): xxx -> yyyへ変更
03d8142 HEAD@{2}: rebase -i (pick): yyy
b28cfc2 HEAD@{3}: rebase -i (start): checkout b28cfc2
92db362 HEAD@{4}:
92db362 HEAD@{6}: commit: xxx -> yyyへ変更
58e9522 HEAD@{7}: checkout: moving from develop to feature-xxx

$ git reset --hard HEAD@{6}
HEAD is now at xxxxxxx xxx -> yyyへ変更

$ git reflog
92db362 HEAD@{0}: reset: moving to HEAD@{6}
826ab92 HEAD@{1}: rebase -i (finish): returning to refs/heads/feature/feature-xxx
826ab92 HEAD@{2}: rebase -i (pick): xxx -> yyyへ変更
03d8142 HEAD@{3}: rebase -i (pick): yyy
b28cfc2 HEAD@{4}: rebase -i (start): checkout b28cfc2

Mergeしたcommitを取り消す

$ git branch
* develop
  feature/feature-xxx

$ git revert -m 1 {mergeしたcommit ID}

# 誤ってrevertした場合
$ git reset --hard HEAD~

# 後はcommit, push

.gitignoreが効かない

“.gitignore” は、Remoteを消しつつ、ローカルでファイルを残してコミット対象から無視させる (という理解)。

$ git touch .gitignore
$ vim .gitignore
$ git add .gitignore
$ git commit -m "add gitignore"

# キャッシュを削除する。ローカルのファイルへは影響しない。
$ git rm --cached {FILE_NAME}

# ディレクトリごとキャッシュ削除。
$ git rm -r --cached .

# commit, pushする。
$ git add .
$ git commit -m "remove cache of gitignore"
$ git push -u origin develop

Remoteにファイルを残しつつ、ローカルの変更をコミット対象から無視させる場合は、以下のコマンドを利用する。

$ git update-index --assume-unchanged {FILE_NAME}

# 元に戻す場合
$ git update-index --no-assume-unchanged {FILE_NAME}

# 設定の反映確認
$ git ls-files -v