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

Vi(Vim)の基本操作メモ

$
0
0

エンジニアが1年目には覚えたいViの基本操作について、個人的によく使う操作方法をメモします。

起動

$ vi ファイル名

入力モードについて

viはコマンドモードで立ち上がる (コマンドモードについて下記に記載)。
文字を入力する場合は、入力モードに移る以下キーを入力する。

[a]   ...カーソルの右から入力開始(a: Add の意味)
[A]   ...行末から入力開始
[i]   ...カーソルの左から入力開始(i: Insert の意味)
[I]   ...行頭から入力開始
[o]   ...現在の行の下に1行挿入し、その行頭から入力開始
[O]   ...現在の行の上に1行挿入し、その行頭から入力開始

コピー・貼り付けについて、入力モードでは何か他のテキストの文字列、外部サイトの文字列をコピーし、そのまま貼り付けることができる。

コマンドモードについて

escキーでコマンドモードに移る。ファイル・文字列操作、保存等が可能。

カーソル移動

1文字移動

基本的に矢印キーは使うなと昔上司に言われました。でも使ってもいいと思いますが…

左: [←キー] or [h] or [BackSpace]
右: [→キー] or [l] or [Space]
上: [↑キー] or [k]
下: [↓キー] or [j]

単語ごとに移動

[w]    ...1語次へ
[b]    ...1語前へ

削除・貼り付け

[x]    ...1文字削除。
[yy]   ...1行コピーしクリップボードへ格納する。
[dd]   ...1行切り取りしクリップボードへ格納する、または1行削除。
[p]    ...クリップボードの内容をカーソル行の下の行に貼り付ける。

行番号

:set number    ...行番号を表示
:se nu         ...行番号を表示(上に同じ)
::set nonumber 
:se nonu
:行番号        ...行番号を指定して移動

検索

[/]文字列    ...カーソルの後方に検索を行う
[?]文字列    ...カーソルの前方に検索を行う
[n]文字列    ...次の検索該当文字列へ
[N]文字列    ...前の検索該当文字列へ

置換

:s/文字列1/文字列2/    ...カーソル行で最初の「文字列1」のみを「文字列2」に置換する
:s/文字列1/文字列2/g    ...カーソル行の「文字列1」を全て「文字列2」に置換する

取り消し

[u]    ...直前の操作をやめる(u: Undo の意味)
[U]    ...行全体に操作を取りやめる

ビジュアルモード

ctrl + V でビジュアルモードに遷移。矩形選択しxで選択箇所の削除など可能。

終了処理

終了
:q    …書込みを行わず終了(quitの意味)
:q!    ...書込みを行わず強制終了
:wq    ...書込み後終了
:wq!    ...書込み後強制終了

色分けされていたほうが見やすいので、Vimを推奨されている方もいますが、
操作方法についてはViもVimも同じです。


vim

$
0
0

vim 補完

setcompleteopt=menuoneforkinsplit("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_",'\zs')exec"imap <expr> ".k." pumvisible() ? '".k."' : '".k."\<C-X>\<C-P>\<C-N>'"endfor

Powershellでvimを使う

$
0
0

vimのインストール

以下リンクから日本語版or英語版どちらかを選んでインストール。

インストールするディレクトリはどこでも。(最近のWindowsならデフォルトはC://Program Files (x86)/のはず)

エイリアスコマンドを作成

Powershell上でコマンドからvimを立ち上げられるようにエイリアス設定する。

1. まず念のためPowershellスクリプトファイルの実行権限があるか確認する。

Powershellの設定を編集するために、Powershellスクリプトファイル(.ps1ファイル)の実行が有効になっていることが必要だが、Windowsはデフォルトだと大体これが無効になってる。(ウイルスなどに悪意のあるスクリプトを実行させないため)

試しに、Powerhsellで以下をたたいてみる。

get-executionpolicy

これでもしRestrictedが返ってきたらスクリプトが無効な状態。以下をPowershellでたたいてRemoteSignedの権限に設定する。

set-executionpolicy remotesigned

これで再度get-executionpolicyをたたき、RemoteSignedが返ってきたらOK。

2. Powershellのプロファイルの場所を確認する。

Powershellで以下をたたくとプロファイル(Powershellの設定ファイル)のパスが返ってくる。

$profile

C:\Users\(ユーザー名)\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1<- 多分大体ここになってる。もし存在してなければこのパスでファイルを作成しておく。

3. プロファイルにエイリアスの設定を追記

2.のプロファイル(.ps1ファイル)をテキストエディタで開いて以下を追記する。

set-aliasvi'C:\Program Files (x86)\Vim\Vim81\vim.exe'set-aliasvim'C:\Program Files (x86)\Vim\Vim81\vim.exe'

set-alias vi以降の部分はインストールしたvimのパスなので自分がインストールしたところを記入する。

これでエイリアスの設定は完了。viもしくはvimコマンドがPowershell上で実行可能になる。

Powershellからvimを実行

試しにPowershellで、

vi testfile.txt

と打ってみる。

testfile.txtが作成され編集画面が立ち上がったら導入成功!

わかった気で十分!Vim基本設定

$
0
0

.vimrcに設定しておくと便利な基本設定を、分かった気になれる程度にまとめました。

基本設定

Vim の文字コードを指定する

Vim の内部文字コードを設定する。
バッファの内容はこの文字コードで扱われる。

set encoding=utf-8

ファイル書き込み時の文字コードを指定する

fileencodingを設定すると、バッファの内容がファイルに書き込まれる時の文字コードを指定することができる。
その際、encodingからfileencodingに文字コードの変換が行われる。
そのため、encodingfileencodingの文字コードが同じ場合は、設定しなくてもよい。

set fileencoding-utf-8

ファイル読み込み時の文字コードを指定する

ファイル読み込み時に使用する文字コードを指定する。
fileencodingsencodingの文字コードが違う場合は、encodingの文字コードに変換されてバッファが開かれる。

set fileencodings=utf-8

BOM付きを指定する

UnicodeにはBOM無しBOM付きの2種類がある。BOMはバイトオーダーマーク(byte order mark)の略で、Unicodeで符号化したテキストの先頭に付与される数バイト程度のデータのこと。

set bomb

Vimスクロール時のスピードを速くする

jkキーを押し続けスクロールする時などのスピードを上げる(との噂がある)。一応設定。

set ttyfast

deleteキーを有効にする

Vimでdeleteキーを押すと、^?と出る時の対処法。

set backspace=indent,eol,start

タブを半角スペースに置き換える

インサートモードでTabキー押下時やインデントの際、タブ文字ではなく、半角スペースが挿入されるようになる(ソフトタブという)。

set expandtab

タブ幅を設定する

Pythonをはじめとしたインデント幅がスペース4つ分のコードを書く際は、タブ幅を4つにしておくと、少し幸せになれる。

set tabstop=4

オートインデント時のインデント幅の設定

tabstopと同じ値にしておけばよい。

set shiftwidth=4

ソフトタブのスペース幅の指定

softtabstop<Tab>を押下した時、いくつスペースを挿入するを設定する。値を0にすると、softtabstopの機能はOFFになる。

set softtabstop=0

新しいウィンドウを下に開く

Vimの初期設定では、ウィンドウの分割は、水平分割は上側に新規ウィンドウが表示される。

set splitbelow

新しいウィンドウを右に開く

Vimの初期設定では、ウィンドウの分割は、垂直分割は左側に新規ウィンドウが表示される。

set splitright

スムーズにbuffer切り替える

buffer(ここでは、メモリ上に展開される複数のテキストファイルのこと)を切り替える際、編集中のファイルを保存しなくてもよいように設定(高速移動を実現)。

set hidden

検索結果をハイライトする

逆に、ハイライト表示したくない場合は、set nohlsearch

set hlsearch

インクリメンタルサーチの実現

検索中に文字を打つ際、(その都度)自動的に検索できる。

set incsearch

検索時、大文字と小文字を無視

set ignorecase

検索をより賢く設定

ignorecaseを有効にしている場合に、smartcaseを有効にすると、検索文字列に大文字が入ると、ignorecaseを無効化してスマートに検索できる(大文字、小文字を無視しない)。

全て小文字で検索すると、大文字と小文字は、通常通り(ignorecaseの効果で)、無視して検索される。

set smartcase

バックアップファイルを作成しない

Vimで編集する際、通常、~(チルダ)がファイル名末尾についたバックアップファイルが作成される。それが邪魔であると感じるなら、nobackupを設定する。
重要ファイルを編集する際は、意識的に、編集前にset backupを実行して、バックアップファイルを作成するとよい。

set nobackup

スワップファイルを作成しない

Vimエディタでは、ユーザがオリジナルのファイルから変更した情報やアンドゥ用の情報をswapファイルに格納している。

スワップファイルが作成される場合は、以下二つ。
- 他のVimエディタで同じファイルを編集している
- ファイルを編集している最中にVimエディタがエラーで強制終了した

実際は、緊急時に備えて、noswapfileに設定しないほうがいいかも。。

setnoswapfile

改行コードの自動認識

この設定で、日本語の文字コードを自動判別し、utf-8環境で編集や表示が可能となる。

set fileformats=unix,dos,mac

カーソルの位置を表示する

Vimの最下部のバーの右側にカーソル位置を表示してくれる。
%表示してくれるため、今ファイルのどのあたりにいるかがわかる。

set ruler

行番号を表示する

setnumber

カーソル行の背景色変更

カーソル行(作業箇所)が視覚化できて操作しやすい。

set cursorline

スクロール開始位置を設定

例えば、下記のように、set scrolloff=20と設定している場合、
- 下方向にスクロール時: 画面下端から20行上
- 上方向にスクロール時: 画面上端から20行下
でスクロール開始。

set scrolloff=20

ステータスラインを表示

  • 0: 表示しない
  • 1: 2つ以上ウィンドウがある時だけ表示
  • 2: 常に表示
set laststatus=2

モードラインを有効にする

ファイルにVim特有の記述をしておくことでそのファイルがVimで開かれた時に特定の設定を有効にすることができる。

set modeline

モードラインの検索行数を指定

ファイルの上下の端からmodelinesで指定された行数だけ、モードラインを探しに行く。

set modelines=10

ステータスバーの設定

set statusline=%F         " ファイル名表示
set statusline+=%m        " 変更のチェック表示
set statusline+=%r        " 読み込み専用かどうか表示 
set statusline+=%h        " ヘルプページなら[HELP]と表示
set statusline+=%w\       " プレビューウインドウなら[Prevew]と表示 

内容が変更されたら自動的に再読み込み

set autoread

エラービープ音の停止

set noerrorbells visualbell t_vb=

ヤンクした箇所をクリップボードにコピー

set clipboard+=unnamed

ターミナルでマウスを使用できるようにする

ノーマルモード(n)ビジュアルモード(v)インサートモード(i)コマンドラインモード(c)の4つのモードを全て有効にできるaがお手軽。

set mouse=a

シンタックスハイライトを有効にする

ON にしておくと、ファイルの拡張子で自動で各種キーワードをシンタックスハイライトで表示してくれる。

syntax on

参考

vim-easy-alignでvimmerへの道を極めよう

$
0
0

.vimrcに設定しているプラグインの一つvim-easy-alignの使い方を備忘録として、簡単なメモに残します。

vim-easy-alignとは

vim-easy-alignは、区切り文字でパラグラフを簡単に整形できるプラグイン。例えば、プログラムの可読性を高めるために、コマンド一つで=の位置をを同じに出来たり、マークダウン記法のテーブルを見やすく整形出来たりする。

使い方

下記のように設定すると、ノーマルモード、ヴィジュアルモードでgaコマンドが利用できるようになる。

"=======================================" vim-easy-align"=======================================
xmap ga <Plug>(EasyAlign)
nmap ga <Plug>(EasyAlign)

基本のコマンドと覚え方は、次の通り(=は場面に応じて切り替える)。

コマンド覚え方
vipga=visual-select inner paragragh ga =
gaip=gainner paragragh =

個人的に、使用頻度が高いのは、次の二つ。

  • =(イコール)を基準に整形する
  • テーブルを見やすく整形する

それぞれ主に、gaip=gaip*|コマンドを使う。


1. =(イコール)を基準に整形する

before

i = 0
x, y = 3, 4
ary = [1, 2, 3]

gaip=コマンドを使うと、

after

i    = 0
x, y = 3, 4
ary  = [1, 2, 3]

2, テーブルを見やすく整形する

before

|command|how to remember|
|---|---|
|vipga=|visual-select inner paragragh ga =|
|gaip=|ga inner paragragh =|

gaip*|コマンドを使うと、

after

| command | how to remember                    |
| ---     | ---                                |
| vipga=  | visual-select inner paragragh ga = |
| gaip=   | ga inner paragragh =               |

といった具合である。


=の代わりに使えるその他

コマンド説明
=一致した一つ目の=を基準に整列させる
2=一致した二つ目の=を基準に整列させる
*=一致した全ての=を基準に整列させる
**=一致した全ての=を基準に左右交互に整列させる
Enter整列させる位置を(左/ 右/ 中央)で切り替える

Enterの使い方

  • <Enter>一回でに、二回で中央に整列させることができる。 <Enter>なしでは、上記の二つの例で見たように、左詰で整列させる(デフォルト)。
  • gaip<Enter><Enter>*=のように使う。

参考

github, vim-easy-align

関連

vim-surroundでvimmerへの道を極めよう

Vi操作に慣れるまでの道のり

$
0
0

徐々にViに慣れるため、操作方法を順次更新

カーソル移動編

  • 1ページ分、下にスクロール
    • Ctl + f
  • 1ページ分、上にスクロール
    • Ctl + b
  • ファイルの先頭
    • gg
  • ファイルの最終行
    • G
  • 行末へ移動
    • $
  • 行の先頭へ
    • 0
  • 行の先頭のテキストへ
    • ^

文字列検索編

  • 上から順番に検索する
    • /<文字列>

操作取り消し

  • 一個前の操作にを取り消す
    • u

コピー&ペースト

  • 一行コピー ヤンクと言うらしい

    • yy
  • 貼り付け

    • p

文字削除

  • カーソル位置にある単語を1つ削除
    • dw

各行末空白削除

  • 正規表現で各行の空白を削除する
    • :%s/ *$//g

vim + ripgrep + fzf

vim-shell間でクリップボードを使わずにテキストをやり取りする

$
0
0

通信用バッファ ~/.vim/bf

クリップボードを使わずにvimとshellの間でテキストをやりとりできる方法が Software Design 2013年10月号で紹介されていました。dockerやvagrantにsshしてvimを利用している私にとっては好都合の技です。これを自分なりに使いやすくした方法を紹介します。

aliasとして使う

.bashrc
alias bf='cat > ${HOME}/.vim/bf'alias bfcat='cat ${HOME}/.vim/bf'

zshのglobal aliasとして使う

.zshrc
alias-gB='| bf'

vimのキーマップを設定して使う

.vimrc
" vim - shell 通信用バッファ
imap <leader>p<ESC>:read ${HOME}/.vim/bf<CR>i
nmap <leader>p:read ${HOME}/.vim/bf<CR>" vmap <C-b> :w!${HOME}/.vim/bf<CR> の改良↓
augroup MyBuf
    autocmd!
    autocmd TextYankPost * call writefile(split(string(v:event.regcontents)[2:-3],"', '"), $HOME ."/.vim/bf")" [ 2:-3 ]はリストのprefix [' と surfix ']を消すため
augroup END

注意点

  • split()writefile()の引数がリストを要求しているため、string->listに変換する必要がある
  • split(..., "', '")はリストの区切りを消すため
  • [ 2:-3 ]はリストのprefix [' と surfix ']を消すため

雑誌上ではC-Bが使われていましたが、"1ページ戻る"デフォルトのキーバインドが潰れてしまうため、私はLeader pを使っています。(Pasteのpと近いので。)

Leaderのデフォルトはバックスラッシュですが、私の場合、LeaderSpaceに設定しています。

vimでLeaderをSpaceに設定するキーマップ
let mapleader ="\<Space>"

また、雑誌に載っていたスクリプトでは選択→yankしないと~/.vim/bfに保存されませんでしたが、autocmdを使って改良したスクリプトでは選択→yankだけでなく、yyyGなど、選択せずにyankした文字列も~/.vim/bfに格納されるよう拡張しました。

使い方

shellの結果をvimにペースト

shellの実行結果をvimに読み込む
# bashなど
$ ps | bf
# zsh
$ ps B
# vim上で<Leader>p
  PID TTY          TIME CMD
26353 pts/5    00:00:00 ps
26354 pts/5    00:00:00 cat
26966 pts/5    00:00:03 zsh

vimで書いたコマンドをshellで実行

vim上でshellコマンドを書いてyankする
echo hello world
vim上で書いたコマンドを実行する
$$(bfcat)hello world

#または
$ bfcat | sh
hello world

bfの実行をalias化

これよく使いそうだからaliasにできますね。記事書きながら良いのを思いつきました。

bfcatの内容を$SHELLで実行する
alias bfexec='bfcat | ${SHELL}'
vimで以下のように書いてからyank
for i (hoge1 hoge2 hoge3) echo $i
vimでyankした内容をshellで実行する
$ bfexec  # `for i ...echo $i` をzshで実行hoge1
hoge2
hoge3

$ bfexec | bf  # 実行結果を~/.vim/bfに保存
vim上でLeader-p
hoge1
hoge2
hoge3

for i ...$iの文法はbashでは使えず、zsh専用です。
aliasのパイプ後を${SHELL}環境変数にすることで実行シェル、私の場合はzshで実行されます。

vimで書いたコマンドをshellに流して実行し、その結果をまたパイプ+bfで拾ってvimに再書き込み?この手順は二度手間ってやつでは?

vimで書いたコマンドをバッファ通さずvim上で実行するには?

shellとの通信用バッファを使わないので、この記事の範疇ではありませんが、気になったので調べてみると、:'<,'>!<command>を使えばよいそうです。つまり、実行したいコマンドを書いたテキストを選択してから:.
Vimで変態テキスト処理!シェルコマンドを使い倒す

リンク先に倣って設定ファイルにLeader CRでその行または選択範囲をシェルに渡して実行するよう設定しました。

選択範囲または現在行をshellとして実行するキーマップ
vnoremap <Leader><CR>:!${SHELL}<CR>
nnoremap <Leader><CR> V:!${SHELL}<CR>

まとめ

shell -> vim
shellの実行結果をvimに渡す。またはvimで書いたコマンドをshellに読み込むか実行する。

.bashrc
# vimとの通信用バッファalias bf='cat > ${HOME}/.vim/bf'# 書込alias bfcat='cat ${HOME}/.vim/bf'# 読込alias bfexec='bfcat | ${SHELL}'# 実行

shellの実行結果をvimに渡す(zshのglobal alias)

.zshrc
alias-gB='| bf'

vim -> shell
vimで書いたコマンドをshellに渡す

.vimrc
" vim - shell 通信用バッファ" vim - shell 通信用バッファ
imap <leader>p<ESC>:read ${HOME}/.vim/bf<CR>i
nmap <leader>p:read ${HOME}/.vim/bf<CR>" vmap <C-b> :w!${HOME}/.vim/bf<CR> の改良↓
augroup MyBuf
    autocmd!
    autocmd TextYankPost * call writefile(split(string(v:event.regcontents)[2:-3],"', '"), $HOME ."/.vim/bf")" [ 2:-3 ]はリストのprefix [' と surfix ']を消すため
augroup END

おまけ
vim上で書いたshellコマンドをvim上で実行

.vimrc
vnoremap <Leader><CR>:!${SHELL}<CR>
nnoremap <Leader><CR> V:!${SHELL}<CR>

tmux使えば良いんじゃ...?

tmuxのコピー機能を使って端末間のテキストコピーは以前から行っていましたが、改行文字やらshellのPS1(ホスト名とか現在ディレクトリ名)をコピーしないようにor貼付け後に削除する作業が煩雑でした。
しかし、このbfバッファを挟む方法なら純粋なテキストだけをshell-vim間でやりとりできます。

tmuxとbf alias運用法の違い

  • tmuxでyank: 実行後に必要範囲を取捨選択してコピー
  • bfに流し込む: 実行前にパイプ| bfして、バッファに流すことを予め宣言

shellからvimへ、1行程度を思いつきでvimにペーストするならtmuxの方がよいかもしれませんが、コマンドの結果を何度もvimに貼り付けたりするならbfの方が良いかもしれません。複数行をtmuxであとでまとめてvimに貼り付けるとプロンプトを消したり面倒くさいので、command | bf→ vimでLeader pcommand | bf→ vimでLeader p繰り返します。

vimからshellへは

  • 複雑なコマンドをvimで書いてから、ターミナルで結果を継続観察(| tail -f)
  • コマンドをバックグラウンドで走らせておいて後から戻りたい(command &してからfg)
  • 対話的な実行(rm -i path/to/file.txt)するならvim上でshellコマンドの実行

上記のような操作はvim上でshell走らせるよりは、vimで書いたコマンドをターミナル上でbfexecしてあげたほうが良いかもしれません。tmux上でコピー→shellに貼り付けは改行文字が入ったりして経験上やっかいです。この辺は適材適所でしょう。

参考

jpg

Software Design 2013年10月号


[Vim] インデントとタブもしくはスペースを区別する

$
0
0

インデントの挿入

Vimにおいて、インデントは以下の操作で挿入することが可能です。

  • ノーマルモード時に '>>' or '<<' による挿入
  • インデントの自動挿入

インデントの自動挿入

インサートモード時にて、自動でインデントを挿入するオプションとして以下が存在します。

オプション説明
autoindent (ai)改行時に、前の行と同じ数だけ自動でインデントを挿入される
smartindent (si)改行時に、ブロックに応じて自動でインデント数を調整して挿入される
smarttab (st)行の先頭で<Tab>キーを入力するとインデントを挿入する

インデントとタブもしくはスペースを区別する理由

インデントで挿入される 見た目の空白数は、siftwidth(sw)オプションによって決まります。

このとき実際に入力される文字コードは、 タブもしくは スペースが使われますが、 expandtab(et)softtabstop(sts)の値に大きく依存します。

例: set noet sts=4 sw=6としたとき インデントを挿入すると、入力される制御文字は、以下で構成されます。

[水平タブ][スペース][スペース]

上記、noexpand設定なのでインデントの補完にタブが優先して使われ、足りない分スペースで補われるためです。

プログラマーのためのインデント設定 ベストプラクティス

例: タブをインデントとする場合

.vimrc
set noet ts=4 sts=-1 sw=0
  • sts=-1負数にすることで shiftwidthに従うようにする。
  • sw=00にすることで、 tabstopに従うようにする。

こうすることによって、インデントをタブからスペースに切り替えた際に、空白数の設定は tabstopの値を変更するだけですみます。

Appendix

tabstopsofttabstopの違い

オプション説明
tabstopファイルに書き込まれているタブ制御文字(\t)に対する見た目上の空白数を設定する
softtabstopインサートモード時に、<Tab>キー、<BS>キーの入力に対する見た目上の空白数を設定する。実際に入力される制御文字は、インデントと同様に expandtabに依存します。

参照

Vim/NeovimにALEをインストールすると追加されるALE標準コマンド(抜粋)

$
0
0

ALE(Asynchronous Lint Engine)はvim/neovim上でプログラムのコードチェックをいい感じにやってくれるプラグインです。

みなさん便利なキーマップなどゴリゴリ設定していると思いますが、私のような手抜きvimmerはなるべくデフォルトの機能でどうにかしたいです。OSのクリップボードへコードをコピーするため、ALEを停止する方法を調べたところ行き当たったのでメモとしてピックアップしました。

インストールや設定方法は次のページなどをご参照ください。
「NeovimでモダンなPython環境を構築する」
https://qiita.com/lighttiger2505/items/e0ada17634516c081ee7

※※「おい何言ってるんだ、普通はこうするんだ!」など、ご指摘ありましたらコメントください※※

ALEをインストールすると追加されるALE標準コマンド(抜粋)

コマンド機能
:ALEEnableALEをオンにする
:ALEDisableALEをオフにする
:ALEToggleALEのオフ/オフを切り替える
:ALEFirst先頭のハイライトへ移動する
:ALELast一番後ろのハイライトへ移動する
:ALENext次のハイライトへ移動する
:ALENextWrap次のハイライトへ移動する
(最後まで行くと最初からループ)
:ALEPrevious前のハイライトへ移動する
:ALEPreviousWrap前のハイライトへ移動する
(最後まで行くと最初からループ)
:ALEDetail(カーソル位置の) エラーの詳細を別バッファに表示する
:ALEFix(カーソル位置の) 自動修正を実行する

ハイライト移動系コマンドのオプション

ALEFirstやALELast、ALENextやALEPreviousなどはオプションをとることでジャンプするエラーの種類や挙動を指定できます(各オプションは複数指定も可能です)。

オプション機能
-wrap最後まで行くと最初からループ
-errorerrorのハイライトを対象にして移動
-warningwarningのハイライトを対象にして移動
-stylestyle error/warningのハイライトを対象にして移動

もっと知りたい人は

他にもたくさんのALEコマンドが公式のdocに紹介されています。
https://github.com/dense-analysis/ale/blob/master/doc/ale.txt

Golang環境構築手順メモ

$
0
0

最近Goを触り始めました。
開発環境を構築する際に毎回忘れて調べ直しているので、備忘録としてメモしたいと思います。
OSはLinux(CentOS7)とWindows10を対象にしています。(Mac持っていないので試せていません。)

ちなみに、エディタはVimを使用します。

Linux(CentOS7)

Goのインストール、Vimのアップデート、vim-goプラグインの導入の順で記載していきます。

Linuxについては、Virtualbox、Vagrantで以下のVagrantfileを使用して作成しています。
(※IPはそのままでも大丈夫だと思いますが、適当です。)
使用する場合、以下のようなフォルダ構成で、shareフォルダをVagrantfileと同じ場所に作成して起動してください。

フォルダ構成
gotest (フォルダ)
  |-share (フォルダ)
  |-Vagrantfile
Vagrantfile
Vagrant.configure("2")do|config|config.vm.box="centos/7"config.vm.hostname="gotest"config.vm.network"private_network",ip: "192.168.50.10"config.vm.synced_folder"./share","/home/vagrant/ws",mount_options: ['dmode=755','fmode=644']config.vm.provider"virtualbox"do|v|v.name="gotest"v.memory=4096v.cpus=2endconfig.vm.provision"shell",inline: <<-SHELL
    yum update -y
    yum install epel-release -y
    yum install man-pages.noarch man-pages-ja.noarch vim-enhanced git -y
  SHELLend

Goのインストール

yumでもインストールできますが、若干バージョンが古いため、公式サイトからダウンロードしてインストールします。
※curlで指定しているURLはDownloadsからリンクをコピーして持ってきています。

Goのインストール
$ mkdir ~/DL        # ダウンロードしたファイルをホームに置くのが好きじゃないのでDLフォルダを作っています。(任意)
$ cd ~/DL
$ curl -L -O https://dl.google.com/go/go1.12.9.linux-amd64.tar.gz
$ sudo tar -C /usr/local -xzf go1.12.9.linux-amd64.tar.gz

環境変数の設定
$ echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.bash_profile
$ echo 'export PATH=$PATH:$(go env GOPATH)/bin' >> ~/.bash_profile
$ source ~/.bash_profile

確認
$ go version
go version go1.12.9 linux/amd64

Go用のディレクトリ作成
$ mkdir -p `go env GOPATH`/{src,bin,pkg}

※/usr/localに直接コマンドのを置いているだけなので、更新の際は上書きで大丈夫かな?(調べていない。)

Go自体のインストールは上記で終わりですが、
追加でやっておくと良さそうな手順を補足しておきます。

ライブラリやコマンドの追加時に使用するパッケージのインストール
$ sudo yum install -y git mercurial subversion
GOのREPLをインストール
$ GO111MODULE=off go get -u github.com/motemen/gore/cmd/gore

確認
$ gore
gore version 0.4.1  :help for help
gore>

終了は:q
gore> :q

Vimのアップデート

後続手順でインストールするvim-goはVim 7.4.2009またはNeovim 0.3.1.以上のバージョンが必要な為アップデートします。

vim-go requires at least Vim 7.4.2009 or Neovim 0.3.1.

環境のアップデート
$ sudo yum update -y
$ sudo yum install -y git gcc ncurses-devel

GitHubからダウンロード
$ cd 
$ git clone https://github.com/vim/vim.git ~/DL/vim    # DLはGoインストール時に作成したディレクトリ

Vimのビルド
$ cd ~/DL/vim
$ make && sudo make install
$ cd        # ホームに戻る

バージョン確認
$ vim --version | head -n 1
VIM - Vi IMproved 8.1 (2018 May 18, compiled May  7 2019 13:12:36)

(バージョンが変わっていない場合は、再ログインを試してください。)

vim-go(Vimプラグイン)のインストール

プラグインを入れると、保存時にフォーマットを直してくれるなど便利!。

$ curl -fLo ~/.vim/autoload/plug.vim --create-dirs https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
$ git clone https://github.com/fatih/vim-go.git ~/.vim/plugged/vim-go

以下の内容を ~/.vimrc に追加。 (echoから>> ~/.vimrcまでで1つのコマンドです。)
echo "call plug#begin()
  Plug 'fatih/vim-go', { 'do': ':GoInstallBinaries' }
call plug#end()" >> ~/.vimrc

Vimを起動しコマンドラインモードで:GoInstallBinariesを実行する。

プラグインインストール
$ vi        # または $ vimコマンドラインモード(:を入力)で実行する
:GoInstallBinaries

※上記を実行していない場合、既存のgoファイル(例:sample.go)を開いた際に以下のエラーが表示されます。

vim-go: could not find 'gopls'. Run :GoInstallBinaries to fix it
Error detected while processing function <SNR>10_register[9]..go#lsp#DidOpen:
line   19:
E117: Unknown function: sendMessage

※プラグインのアップデートは以下のコマンドで実行できます。

:PlugUpdate

Windows10

Windowsでインストールした時のメモです。
WindowsではGitBashを使用しているので、GitBashを前提とした内容になっています。
しっかり確認できていない部分もあるため、補足程度に参照よろしくお願いします。

Chocolateyのインストール

Chocolateyをインストールしていない方は、以下を参考にインストールします。
(コマンドをコピーして管理者権限で実行するだけです)
https://chocolatey.org/install

Goのインストール

管理者権限で起動したコマンドプロンプト、またはPowerShellで以下を実行してインストールします。

検索
> choco search golang

インストール
> choco install -y golang

更新は以下
> choco upgrade -y golang

Git Bash導入

最新(2019/08/24現在:2.23)のGitBashでは、Vimのバージョンがvim-goの要求するバージョンになっています。
Vimのバージョンが古い場合は、公式サイトからインストーラーをダウンロードして最新をインストールしてください。

※GitBash(Git for Windows)もChocolateyでインストールできるらしいですが、
 インストーラーを使用してインストール済みだったため、ここではインストーラーを使用しています。

インストール後、GitBashを起動し以下を実行してGo用の環境変数を追加します。

環境変数の設定
$ echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.bash_profile
$ echo 'export PATH=$PATH:$(go env GOPATH)/bin' >> ~/.bash_profile
$ echo 'export GOBIN=$HOME/go/bin' >> ~/.bash_profile

設定の反映
$ source ~/.bash_profile

Windowsでもgoreが使用できます。Linuxと同様にインストールします。

GOのREPLをインストール
$ GO111MODULE=off go get -u github.com/motemen/gore/cmd/gore

GitBashでは挙動がおかしい場合があるので、コマンドプロンプトを使用します。
> gore
gore version 0.4.1  :help for help
gore>
gore> :q

vim-goのインストール(Windows用 補足)

vim-goのインストールについてはLinuxでの手順とほぼ同様のため、まずはそちらを参照してください。
以下はWindowsでの設定時に発生したエラー?の補足です。

補足1:curl実行失敗

curlコマンドの実行時に以下のようなメッセージが表示される場合があります。

$ curl -fLo ~/.vim/autoload/plug.vim --create-dirs https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
You don't have permission to create C:.

GitBashの起動は、「フォルダを開く - 右クリック - Git Bash Here」で起動することが多いですが、
その際に保存する場所(今回は~/.vim)でGitBashを起動することで問題なく実行できました。

自分の場合、Cドライブ、Dドライブに分割しており、
保存する場所がCドライブになのに、GitBashの起動をDドライブで実行したため、
上記のようなメッセージが表示されたようです。

補足2:GoInstallBinaries実行時のエラー

WindowsではLinuxで設定していない環境変数GOBINを設定しています。
設定していない場合:GoInstallBinariesの実行時に以下のようなメッセージが出力されました。

vim-go: installing finished!と最後に出力されるため、
成功したかのように見えますが、goのファイルを開くと初回と同様のエラーが表示され:GoInstallBinariesの実行を再度求められます。

vim-go: gogetdoc not found. Installing github.com/zmb3/gogetdoc to folder C/bin/
vim-go: guru not found. Installing golang.org/x/tools/cmd/guru to folder C/bin/
vim-go: gopls not found. Installing golang.org/x/tools/gopls@latest to folder C/bin/
Error installing golang.org/x/tools/gopls@latest: Fetching https://golang.org/x/tools/gopls?go-get=1^@Parsing meta tags from https://golang.org/x/tools/gopls?go-get=1 (status code 200)^@get "golang.org/x/tools/gopls": f
ound meta tag get.metaImport{Prefix:"golang.org/x/tools", VCS:"git", RepoRoot:"https://go.googlesource.com/tools"} at https://golang.org/x/tools/gopls?go-get=1^@get "golang.org/x/tools/gopls": verifying non-authoritativ
e meta tag^@Fetching https://golang.org/x/tools?go-get=1^@Parsing meta tags from https://golang.org/x/tools?go-get=1 (status code 200)^@go: finding golang.org/x/tools/gopls v0.1.3^@Fetching https://golang.org/x/tools?go
-get=1^@Parsing meta tags from https://golang.org/x/tools?go-get=1 (status code 200)^@get "golang.org/x/tools": found meta tag get.metaImport{Prefix:"golang.org/x/tools", VCS:"git", RepoRoot:"https://go.googlesource.com
/tools"} at https://golang.org/x/tools?go-get=1^@go: finding golang.org/x/tools v0.0.0-20190710153321-831012c29e42^@Fetching https://golang.org/x/net?go-get=1^@Fetching https://golang.org/x/sync?go-get=1^@Parsing meta t
ags from https://golang.org/x/net?go-get=1 (status code 200)^@get "golang.org/x/net": found meta tag get.metaImport{Prefix:"golang.org/x/net", VCS:"git", RepoRoot:"https://go.googlesource.com/net"} at https://golang.org
/x/net?go-get=1^@Parsing meta tags from https://golang.org/x/sync?go-get=1 (status code 200)^@get "golang.org/x/sync": found meta tag get.metaImport{Prefix:"golang.org/x/sync", VCS:"git", RepoRoot:"https://go.googlesour
ce.com/sync"} at https://golang.org/x/sync?go-get=1^@go: finding golang.org/x/net v0.0.0-20190620200207-3b0461eec859^@go: finding golang.org/x/sync v0.0.0-20190423024810-112230192c58^@Fetching https://golang.org/x/crypt
o?go-get=1^@Fetching https://golang.org/x/text?go-get=1^@Fetching https://golang.org/x/sys?go-get=1^@Parsing meta tags from https://golang.org/x/text?go-get=1 (status code 200)^@get "golang.org/x/text": found meta tag g
et.metaImport{Prefix:"golang.org/x/text", VCS:"git", RepoRoot:"https://go.googlesource.com/text"} at https://golang.org/x/text?go-get=1^@Parsing meta tags from https://golang.org/x/crypto?go-get=1 (status code 200)^@get
 "golang.org/x/crypto": found meta tag get.metaImport{Prefix:"golang.org/x/crypto", VCS:"git", RepoRoot:"https://go.googlesource.com/crypto"} at https://golang.org/x/crypto?go-get=1^@Parsing meta tags from https://golan
g.org/x/sys?go-get=1 (status code 200)^@get "golang.org/x/sys": found meta tag get.metaImport{Prefix:"golang.org/x/sys", VCS:"git", RepoRoot:"https://go.googlesource.com/sys"} at https://golang.org/x/sys?go-get=1^@go: f
inding golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2^@go: finding golang.org/x/text v0.3.0^@go: finding golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a^@go: downloading golang.org/x/tools v0.0.0-20190710153
321-831012c29e42^@go: extracting golang.org/x/tools v0.0.0-20190710153321-831012c29e42^@go: downloading golang.org/x/tools/gopls v0.1.3^@go: extracting golang.org/x/tools/gopls v0.1.3^@go: downloading golang.org/x/sync
v0.0.0-20190423024810-112230192c58^@go: extracting golang.org/x/sync v0.0.0-20190423024810-112230192c58^@cannot install, GOBIN must be an absolute path^@
vim-go: could not find 'gopls'. Run :GoInstallBinaries to fix it
function <SNR>13_GoInstallBinaries[133]..go#lsp#Restart の処理中にエラーが検出されました:
行    7:
E18: 予期せぬ文字が :let にありました
vim-go: fillstruct not found. Installing github.com/davidrjenni/reftools/cmd/fillstruct to folder C/bin/
vim-go: godef not found. Installing github.com/rogpeppe/godef to folder C/bin/
vim-go: motion not found. Installing github.com/fatih/motion to folder C/bin/
vim-go: errcheck not found. Installing github.com/kisielk/errcheck to folder C/bin/
vim-go: dlv not found. Installing github.com/go-delve/delve/cmd/dlv to folder C/bin/
vim-go: gocode not found. Installing github.com/mdempsky/gocode to folder C/bin/
vim-go: impl not found. Installing github.com/josharian/impl to folder C/bin/
vim-go: golangci-lint not found. Installing github.com/golangci/golangci-lint/cmd/golangci-lint to folder C/bin/
vim-go: gotags not found. Installing github.com/jstemmer/gotags to folder C/bin/
vim-go: gorename not found. Installing golang.org/x/tools/cmd/gorename to folder C/bin/
vim-go: goimports not found. Installing golang.org/x/tools/cmd/goimports to folder C/bin/
vim-go: gocode-gomod not found. Installing github.com/stamblerre/gocode to folder C/bin/
vim-go: gomodifytags not found. Installing github.com/fatih/gomodifytags to folder C/bin/
vim-go: keyify not found. Installing honnef.co/go/tools/cmd/keyify to folder C/bin/
vim-go: golint not found. Installing golang.org/x/lint/golint to folder C/bin/
vim-go: iferr not found. Installing github.com/koron/iferr to folder C/bin/
vim-go: asmfmt not found. Installing github.com/klauspost/asmfmt/cmd/asmfmt to folder C/bin/
vim-go: gometalinter not found. Installing github.com/alecthomas/gometalinter to folder C/bin/
vim-go: installing finished!

メッセージ内容を見ると以下の内容があり、「GOBINは絶対パスである必要があります」とのことです。

Error installing <中略> cannot install, GOBIN must be an absolute path
vim-go: could not find 'gopls'. Run :GoInstallBinaries to fix it

おわり

これで一通りGoの環境ができました。
今回は以上です。

参考

https://golang.org/doc/install
https://golang.org/dl/
https://stupiddog.jp/note/archives/1148
https://stupiddog.jp/note/archives/1147
https://github.com/hnakamur/vim-go-tutorial-ja
https://motemen.hatenablog.com/entry/2015/02/go-repl-gore
https://github.com/motemen/gore
https://www.slideshare.net/zaruhiroyukisakuraba/go-80884259
https://budougumi0617.github.io/2018/05/30/debug-go-by-vim-go-and-delve/
https://qiita.com/shiro01/items/a300b6d5b572a314ce5e
https://chocolatey.org/docs/commands-reference

google colabのvim keybindingsでnormal modeに戻る方法についての質問

$
0
0

vimではnormal modeに戻る際にやの入力をすると思います。
google colabでは上記のやはセルの選択解除に割り当てられています。
そのためかcode cellでinsert modeに入った後、でnormal modeに戻ろうとするとgoogle colabのコマンドモードに入ってしまい、
insert modeのままとなってしまいます。colabのショットカットを変えても、同様の現象が起こります。ページを更新し直す以外にnormal modeに戻る方法はないでしょうか。ご指導よろしくお願いします。

以下スクリーンショットです。

①vim keybindsに変更
Screenshot from 2019-08-27 18-59-36.png
②i を入力しnormal mode から insert mode
Screenshot from 2019-08-27 19-00-34.png
Screenshot from 2019-08-27 19-00-51.png
③ESCを押してもnormal modeに戻れず、コマンドモードになってしまう。
Screenshot from 2019-08-27 19-01-04.png

VimでReactを書く(2019年版)

$
0
0

2019年の情報がなかったのでまとめました。

目標

  • VimでTypeScript or JavaScriptのReactをVSCodeのように書きたい

完成形

cnfly-fff7t.gif

必要なもの

NeoVim のインストール

今回はneovim dev版を使います。

Installing Neovim · neovim/neovim Wiki

# dev版で導入 (floating windowが使える)$ brew install--HEAD neovim
# version 確認$ nvim -v
NVIM v0.4.0-dev
Build type: Release

coc.nvimとは

coc.nvimは、vim8.0 / neovim のためのインテリセンスエンジン。

TypeScriptで作られており、言語ごとの機能拡張をプラグイン内のextentionでサポートする言語サーバクライアントです。
要は、VSCodeのような力をvim / neovim に与えるもの。

IDEに必要な言語解析機能を組み込みで実装するのではなく、言語サーバとして外部実装する Language Server Protocolが策定された頃から、VimのIDE化、超高機能化が囁かれてきましたが、とうとうTypeScript製でnpmを使用するプラグインが現れました。

まるでVSCodeみたい。 conquer of completion (補完の征服)と名付けられたのもすごいですね。

coc.nvimの導入

導入には vim 8.0 以降、または neovim 0.3.1 以降が必要です。更に vim/neovim上で nodeのサポートが必要。

まず、neovimのnodeサポートを整えます。

node

公式ではcurlを使ったワンライナーでのnodejsインストール手順が書かれていますが、nodeはversion管理システム経由で入れることにします。 使用するversion管理システムはnodebrew。

# nodebrewの導入$ brew isntall nodebrew
# nodebrew用のディレクトリの生成$ mkdir-p ~/.nodebrew/src
# v12のnode.jsを導入$ nodebrew install 12
$ nodebrew use 12
# neovimにnode.jsの環境を$ npm i -g neovim

nodeのパスを通すため、init.nvim に以下を記載。

init.nvim
let g:node_host_prog = system('echo -n $(which neovim-node-host)')

:checkhealthを行い、以下の表示がでれば neovimのnodejsサポートはOK。

## Node.js provider (optional)
  - INFO: Node.js: v12.9.0
  - INFO: Neovim node.js host: /usr/local/bin/neovim-node-host
  - OK: Latest "neovim" npm/yarn package is installed: 4.5.0 

coc.nvimの導入

coc.nvim はdein.nvim経由で導入。

coc.nvim はnpm製なので導入後にプラグインのディレクトリでnpm installを走らせる必要があります。あらかじめinstall.shが用意されているので、実行されるようbuildオプションを記載。

また、公式リポジトリに記載された設定例をcoc-options.vimとして取り込みます。 coc.nvim: Example vim configuration

dein.toml設定
[[plugins]]
repo = 'neoclide/coc.nvim'
build = './install.sh nightly'
hook_add = 'source ~/.config/nvim/coc-options.vim'

extensionsの導入

coc.nvimにはextensionsが用意されており、言語ごとに機能拡張できます。公式にあるように、coc.nvimの拡張はVSCodeの拡張からforkされています。

Using coc extensions · neoclide/coc.nvim Wiki

Reactに対応するため下記のextentionsを:CocInstallで導入。

:CocInstall coc-tsserver coc-eslint

CocConfig

:CocConfigcoc-settings.jsonが開きます。

ちなみに、coc-settings.jsonを開くと自動で:CocInstall coc-jsonが走ります。

設定として、TsserverをJavaScriptに適用するように、またESLintをTypeScript/TSXに適用するように変更します。

こちらの設定はVSCodeとほぼ同じですね。

coc-settings.json
{"tsserver.enableJavascript":true,"eslint.filetypes":["javascript","typescript","typescriptreact","javascriptreact","typescript.tsx"]}

完成

これでVimでコード補完しつつReact(+TypeScript)を書けるようになりました。

Vimで改行コードとインデントを無視して差分を拾う

$
0
0

diffoptを設定する

//現在のdiffoptを確認
:set diffopt
diffopt=internal,filler
//改行コードとインデントを無視する設定を追加
:set diffopt=internal,filler,iwhiteall

その他のオプションは:help 'diffopt'から確認できます。

どんな文字化けにも自動対応できるbashスクリプトを5分で作った

$
0
0

こいつをbashrcにぶちこんで、viiというコマンドを押せば大丈夫。

bashrc
function vii(){FORMAT=`nkf -g$@`;FORMAT=($FORMAT// /)
    vim -c":e ++enc=$FORMAT"$@;}# nkf必須なので、brew install nkfとかyum install nkfしておいてください。

そもそも文字化けって自動対応してくれない

vimにはfileencodingsという、「読み込み時のフォーマット」を指定するオプションがあります。本来vimrcに
set fileencodings=utf-8,sjis,euc-jp,latin1
って文を書いとけばとりあえず大丈夫だよ、って話なんですけどこいつザルなので結構失敗します

「左から順にフォーマット検知→失敗したら右のフォーマットを試す」仕組みなのですが、そもそも文字化けが起こるのってファイルの一部だけだったりするので、Shift-JISなのに「あれ〜?英文ちゃんと成功してるやん・・・こいつutf-8やな!」ってご認識していただくわけです。

なので、ファイル読み込み前にエンコードを検知してやる

それがnkf。
nkf -g ファイル名でエンコードを抜き取ってきます。
そんでvimを開くときにそのエンコードをぶちこんでやるわけです。

これで文字化けしようがありません。きちんとフォーマットに対応して開いてくれます。

注意

エンコードというのは、目的があって使用されてたりします(サーバー古いからeuc-jpみたいな)

セーブするときに間違ってutf-8にしちゃったーって事がおきないよう、もしもvimrcにset fileencoding=の設定があったら削除しときましょう。

地獄見ます(敗北回数:3回)


coc-typescriptで最初に開いたtsxのファイルだけtsとして認識される問題の対処法

$
0
0

vim起動後最初に開いたtsxのファイルだけtsとして認識されてしまい、正しくtsserverに解析されない問題が発生していた。

原因

vim側のfiletypetypescriptに設定されてしまっていた。
2ファイル目以降もtypescriptとして認識されていたが、いい感じに解析してくれていた。

対策

typescriptのハイライトをしてくれるleafgarland/typescript-vimfiletypetypescriptに設定していたので消去した。
ハイライトはmaxmellon/vim-jsx-prettyだけで十分してくれたので消しても問題なかった。

~/.config/nvim/init.vimに以下の設定を追記し、tsxfiletypetypescript.tsxとして認識されるようにする。

autocmd BufNewFile,BufRead *.tsx letb:tsx_ext_found=1
autocmd BufNewFile,BufRead *.tsx setfiletype=typescript.tsx

参考

https://github.com/neoclide/coc.nvim/issues/48
https://github.com/ianks/vim-tsx/blob/master/ftdetect/typescript.vim

[Vim] Esc の遅延解消

$
0
0

Insert モードなどから抜ける際に Esc を押すと、実際に抜けるまで僅かながら遅れを感じることがあります。この記事はその改善方法です。Eliminating delays on ESC in vim and zshを参考にしているので、ほぼ似た内容です

Vim

~/.vimrctimeoutlenttimeoutlenを設定します。

set timeoutlen=1000 ttimeoutlen=0

これらは公式によれば以下のように説明されています。

The time in milliseconds that is waited for a key code or mapped key sequence to complete.
Vim documentation: options

訳: キーコードとマッピングされたシーケンスの完了を待機する時間(ms)

これだけでは何のことかさっぱり理解できませんが、What is the difference between “mapped key sequences” and “key codes”?
にある statox氏の回答はとても詳しく説明されているので勉強になります。

Z shell

zsh は、複数文字シーケンスを使う時に、最初のシーケンスから次に追加のキーが入力されるまでどのくらい待機するかを、KEYTIMEOUTという変数を参考にして決めます。値は 1/100 秒で指定します。

# ShortestKEYTIMEOUT=1

tmux

tmux もまた同様にしてエスケープシーケンスを待機します。その待機時間は .tmux.confに以下を設定することで短縮できます。

set -s escape-time 0

ゼロ埋め連番作成 (vim Tips)

$
0
0

こんな感じのゼロ埋めシーケンスデータを準備したい

0000000
0000001
0000002
0000003
 :
(途中省略)
 :
0009997
0009998
0009999

想定シーン

  • 1万行作りたい → エクセルじゃきつい
  • DBとか使えない
  • vimがある

vim機能のおさらい

インクリメント、デクリメント

インクリメントデクリメント
[Ctrl] + [a][Ctrl] + [x]

nrformatsの設定

設定値振る舞い
octal8進数扱い(デフォ)
hex16進数扱い
alphaアルファベット
未設定10進数扱い

キーマクロ

記録開始記録終了実行
[qa][q][@a]

※aに設定する場合

実行(ベースデータ作成)

vim起動

$ vim zero.txt

nrformatsを10進数に

:se nf=

6桁のゼロを記入

000000

実行(キーマクロでインクリメント記録)

キーマクロ開始

[qa]

1行目をyank(コピー)

[yy]

ペースト

[p]

000000
000000

カーソル行でインクリメント

[Ctrl] + [a]

000000
000001

キーマクロ終了

[q]

実行(1万行作成)

キーマクロ実行(1万回)

[10000@a]
無題.png

vimで複数行をコメントアウトする

$
0
0

GIF2.gif

実際の入力

ctrl + v      // 矩形ビジュアルモード
j             // 4行下へ
j
j
j
shift + i     // カーソルから前側に入力
#             // 入れたい文字を入力
Esc           // 選択行へ反映、若干時間差あり

ctrl + v      // 矩形ビジュアルモード
j             // 4行下へ
j
j
j
x             // 削除

vimで一気にコメントアウトする方法(複数行の先頭に文字を追加する方法) - Qiita

vimで複数行のコメント入れたり消したりする(矩形入力・矩形選択削除) - Qiita

vimで複数行のインデントを連続で行う - Qiita

【レビュー】デスクトップを動画キャプチャーしてアニメーションGIFファイルにする「GifCam」 - 窓の杜

mysql - Docker Hub

stack.yml
# Use root/example as user/password credentialsversion:'3.1'services:db:image:mysqlcommand:--default-authentication-plugin=mysql_native_passwordrestart:alwaysenvironment:MYSQL_ROOT_PASSWORD:exampleadminer:image:adminerrestart:alwaysports:-8080:8080

vimでのファイルエンコーディングまとめ(vim Tips)

$
0
0

よく使う設定値

設定項目省略形設定内容
ファイルエンコードfileencodingfencutf-8 | sjis | cp932 | euc-jp
改行コードfileformatffdos | mac | unix
BOM(Unicode時)bomb | nobomb--

現在の状態確認

:se fenc ff

例:SJIS(CRLF)のファイル
GS000308.png
GS000309.png

UTF-8(LF)に変換

:se fenc=utf-8 ff=unix

GS000310.png

変換結果確認

utf-8に変換したのでついでにBOM確認も含める
GS000311.png
GS000312.png
BOMはついていない

BOMを付ける

:se bomb

※ BOMを取り除きたいときは :set nobomb
GS000313.png

バイナリで確認してみる

:%!xxd

GS000315.png
GS000316.png
BOMが付いた

戻す

:%!xxd -r

GS000317.png
GS000318.png

その他

指定したコードで開きなおす

:e ++enc=sjis

GS000320.png
GS000321.png

変換不可で?になるのを考慮する場合

:e ++enc=sjis ++bad=keep

GS000323.png
GS000324.png

Viewing all 5745 articles
Browse latest View live


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