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

Vimのインサートモードで自動インデントさせずにクリップボードの内容をペーストする

$
0
0

以下の記事でも対処法を書いている方がいたのですが,この方法は記載されていなかったようなので残しておきます.

やり方

インサートモードで <C-r><C-p>*とすることでインデントされずにペーストできます.

環境

shell
$ vim --version | head -4
VIM - Vi IMproved 8.0 (2016 Sep 12, compiled Aug  8 2017 03:46:05)
MacOS X (unix) version
Included patches: 1-891
Compiled by travis@Traviss-Mac-598.local
vim
setautoindent

挙動の例

クリップボードの内容
funchoge(b:Bool){ifb{print("hoge")}else{print("not hoge")}}

ペーストした時(i<C-r>*<ESC>)の内容(自動インデントされちゃう場合)

vim
funchoge(b:Bool){ifb{print("hoge")}else{print("not hoge")}}

ペーストした時(i<C-r><C-p>*<ESC>)の内容(自動インデントさせない場合)

vim
funchoge(b:Bool){ifb{print("hoge")}else{print("not hoge")}}

vimで複数行に同じ文字列を書き込む

$
0
0

Ctrl-vでvisualモードに入り、jを連打して、文字列を書き込みたい複数の行の先頭を選択する。

image.png

このあとShift-iで書き込みたい文字列(例として"- ")を入力後、escapeキーを押すと、選ばれた行全ての先頭に、入力した文字列が挿入される。

image.png

Vim入門[今度こそ覚える!!]

$
0
0

プログラム言語の便利な関数、エディタのコマンド、爪切り、耳かき、キャッシュカードの置き場所。
最初はバッチリ覚えたと思っていても、いざ必要になった時に思い出せないんですよね。
今回はVimのコマンドくらいは一生覚えられるようにしようと思います。
本屋さんで語源の乗ってる英単語帳を見て語源とセットにしたら覚えられるかと思ってわかる範囲で語源もつけて見ました。

必要最小限のコマンド

Vimの起動

ターミナル上で以下のコマンドを実行することで起動できます。

vim [ファイル名]

ファイル名を指定せずに起動もできます。存在しないファイル名でVimを起動するとその名前で新しいバッファを作成し、保存するタイミングで新しいファイルとして保存されます。

保存、終了

ZZ:内容が変更されている場合は保存してvimを終了。
:w:変更をファイルに書き込む
:w [ファイルパス]:名前をつけてファイルを保存する。
:q:ウィンドウを閉じる。Vimを終了することになるので、変更があれば警告が出る。
:q!:Vimを強制終了。内容が変更されていても警告なしで終了。

スクリプト系の言語でプログラムを書いているなら、:wで変更を書き込んでウィンドウを閉じずにソースコードを見ながら実行して動作を確認することができます。

変なコマンドを使って思わぬ変更をしてしまい、取り返しがつかなくなったら:q!コマンドで保存せずに終了することができます。

wは'write'の'w'で、qは'quit'の'q'です。

カーソル移動:h/j/k/l/0/$

h:左方向にカーソルを移動する。
j:下方向にカーソルを移動する。
k:上方向にカーソルを移動する。
l:右方向にカーソルを移動する。
0:行の先頭にカーソルを移動する。
$:行末にカーソルを移動する。

このコマンドには語源はなく、操作しやすい配置になっています。

削除、コピー、貼り付け:x/dd/yy/p

x:カーソル上の1文字を削除する。
dd:カーソルがある一行を削除する。
yy:カーソルがある一行をコピーする。
p:ddまたはyyで削除やコピーをした内容を貼り付けする。

dは'delete'の'd'で、yは'yank'の'y'、pは'paste'の'p'です。
xはバツ印という意味でしょうか?

これで超入門編は終わりです。
Vimを使っていたらキーボード右下のカーソルキーでカーソルを動かすこともできますが、hjklで慣れておく方が色々捗るかと思います。

次からが本題の各系統のコマンドのまとめです。

カーソル移動・画面スクロール系

ここでのコマンドは全てノーマルモードのコマンドです。

単語単位で移動する:w/e/b/W/E/B

w:次の単語に移動する。
e:単語の最後の文字に移動する。
b:手前にある単語の先頭に移動する。

W/E/Bでは、ドットやコロンのような記号もひと続きの単語として移動します。

wは'word'の'w'、eは'end'の'e'で、bは'back word'の'b'ですね。

ウィンドウ内でカーソルを移動する:H/M/L (上/中/下)

H:現在表示されているウィンドウの一番上の行にカーソルが移動する
M:現在表示されているウィンドウの一番中央の行にカーソルが移動する
L:現在表示されているウィンドウの一番下の行にカーソルが移動する

Hは'Home'、Mは'Middle'で、Lは'Last'です。

画面をスクロールする:Ctrl-f/Ctrl-b/Ctrl-e/Ctrl-y (一画面上/下/一行上/下)

Ctrl-f:1画面分下へスクロールする。
Ctrl-b:1画面分上へスクロールする。

Ctrl-e:画面を1行分下へスクロールする。
Ctrl-y:画面を1行分上へスクロールする。

fは'forward'の'f'、bは'backward'の'b'ですね。
'forward'と'backward'は日本語でそれぞれ'順方向'と'逆方向'の意味です。

eは'extra line'の'e'ですが、yの方はわかりませんでした…

好きな行にカーソルを移動する:gg/G/<数字>G/:<数字>

gg:ファイルの先頭の行にカーソルを移動する。
G:ファイルの最後の行にカーソルを移動する。
<数字>G:数字で指定した番号の行へカーソルを移動する。
:<数字><enter>:<数字>Gと同様に、数字で指定した番号の行へカーソルを移動する。

gの由来は'go to'の'g'です。
:<数字><enter>で指定した行番号へ移動するのはedエディタのコマンドの名残です。
コロンから始まるコマンドはVimがまだedエディタの名残ですね。

編集系

挿入モードに入る:i/a/s/cw/I/A/S/C

i:カーソルの左側から挿入モードに入る。
a:カーソルの右側から挿入モードに入る。
s:カーソル上の1文字を削除してから挿入モードに入る。
cw:カーソル上の単語を削除してから挿入モードに入る。

I:行の先頭から挿入モードに入る。
A:行の末尾から挿入モードに入る。
S:行全体を削除してから挿入モードに入る。
C:カーソルの現在の位置から行末までを削除してから挿入モードに入る。

iは'insert'、aは'append'、sは'swap'、cwは'change word'の頭文字から'cw'です。

新しい行を追加してから挿入モードに入る:o/O

o:現在行の下に新たな行を追加して挿入モードに入る。
O:現在行の上に新たな行を追加して挿入モードに入る。

oは'open line'の'o'です。

行を連結する:J

J:現在の行を一つ上の行と連結する。ビジュアル選択した状態でJコマンドを実行すると選択している行を全て連結する。

Jは'Join'の'J'です。

ビジュアルモード:v/Ctrl-v

v:ビジュアルモードに入る。v$で現在のカーソル位置から行末までをビジュアル選択する。
Ctrl-v:ビジュアルモードに入る。hjklコマンドでカーソルを動かして矩形選択の範囲を指定する。

矩形選択した状態でdを使うと、選択範囲を削除する。
矩形選択した状態でs/cを使うと、選択範囲を削除した後に挿入モードに入る。

矩形選択した状態でI/Aとタイプすれば、選択範囲の先頭または末尾にカーソルが移動して挿入モードに入ります。プログラムを複数行コメントアウトする時などに多用します。

vは'visual'の'v'ですね。

インデント深さを変える:>>

\>>:ノーマルモードで>>とタイプすると、その行のインデントを1つ増やす。
\<<:ノーマルモードで<<とタイプすると、その行のインデントを1つ減らす。
<数字>+>>で数字の行数だけ複数行を一つインデントする。

複数行をビジュアル選択した状態で>とタイプすると、選択した行をまとめてインデントできます。
複数行を選択した状態で<数字>+>とタイプすると、指定した複数行で数字の分だけインデントを深くします。

これも語源などは特に無いようですが、おそらく見た目から来ていると思います。

大文字/小文字を切り替える:~/u/U

~:ノーマルモードだとカーソル上の文字を大文字/小文字を切り替える。ビジュアルモードだと選択範囲の文字を全て大文字/小文字を反転させる。

u:ビジュアル選択している文字を全て小文字にする。
U:ビジュアル選択している文字を全て大文字にする。

uは'uppercase'の'u'です。
uppercaseは英語で大文字という意味です。

単語補完:Ctrl-p/Ctrl-n

Ctrl-p/Ctrl-n:挿入モードで初めの数文字を入力してから、Ctrl-pまたはCtrl-nとタイプすると、その文字から始まる単語を補完する。単語を補完する候補はバッファの中から探される。

Ctrl-p/Ctrl-nはそれぞれ逆方向検索/順方向検索という違いがあります。それほど気にせずどちらかを覚えておけば大丈夫だと思います。

pは'previous'の'p'で、nは'next'の'n'です。
previousは英語で前という意味です。

部分的な編集系

挿入モードに入らなくても内容を編集することもできます。
ここでのコマンドは全てノーマルモードでのコマンドです。

カーソルの下にある数字を増減する:Ctrl-a/Ctrl-x

Ctrl-a:カーソルの下にある数字を1つ増やす。
Ctrl-x:カーソルの下にある数字を1つ減らす。

これも語源がわかりませんでしたが、おそらくaは'add'の'a'でxはアルファベット順の逆なのか、キーボード上で近いからなのかだと思います。

1文字/複数の文字を上書きする:r/R

r:カーソルの上にある1文字を上書きする。ちょっとスペルミスした時によく使います。
R:カーソルの上にある文字を上書きする。ESCを押すまで上書きを続けます。

rは'replace'の'r'ですね。

直前の編集を繰り返す:ドット(.)

.:直前のテキスト編集をもう一度繰り返す。

結構複雑な編集も繰り返すことができるので便利です。

検索・置換系

文字列を検索する

/<文字列>:順方向に文字列を検索する。
?<文字列>:逆方向に文字列を検索する。
n:直前に検索したワードで順方向にもう一度検索する。
N:直前に検索したワードで逆方向にもう一度検索する。
%:プログラム中のカッコ文字に対応するカッコ文字を検索する。

f<文字>:fの次に入力した文字を順方向検索し、その文字のところへカーソルを移動する。
F<文字>:fの次に入力した文字を逆方向検索し、その文字のところへカーソルを移動する。
t<文字>:fの次に入力した文字を順方向検索し、その文字の一つ手前へカーソルを移動する。
T<文字>:fの次に入力した文字を逆方向検索し、その文字の一つ手前へカーソルを移動する。

nは'next'の'n'で、fは'find'の'f'ですね。

文字列を検索して置換する。

:s/[old]/[new]:置換される文字列[old]を検索して置換する文字列[new]で置き換える。

sは'search'の's'です。

Vimでは正規表現を用いることでより複雑な検索や置換ができますが、ここでは割愛します。
詳しく書かれた記事があるので参考にしてください。

バッファ・ウィンドウ操作系

ここでのコマンドは全てノーマルモードでのコマンドです。

現在開いているバッファを確認する::ls

:ls:現在開いているバッファの一覧を表示する。

:b3のようにタイプするとその番号のバッファを表示します。

lsはbashのlsコマンドから、bは'buffer'から来ています。

ウィンドウを分割/移動する:Ctrl-w

Ctrl-w + v:ウィンドウを縦方向に分割する。
Ctrl-w + s:ウィンドウを横方向に分割する。

Ctrl-w + w:次のウィンドウへ移動
Ctrl-w + W:前のウィンドウへ移動
Ctrl-w + h/j/k/l:ウィンドウを移動(左/下/上/右)

:qで開いたウィンドウを閉じます。

コマンドを組み合わせた編集

いくつかのコマンドを組み合わせることで、もっと便利に編集することができます。
これぞVimって感じがする、僕的に一番好きな機能です。

例えばd$と入力すると現在のカーソル位置から行末まで削除することができます。
他にも4yyで現在のカーソル位置から4行をコピーします。
d3wで3単語を削除、ggVGでバッファ全体をビジュアルモードで選択することができます。

組み合わせ方の基本は
{operator} [count] {motion}
となっていて、それぞれ

operator:dyなどの'動作'を意味するコマンド
count:行数や文字数などを指定するための数字
motion:wなどのカーソル移動を意味するコマンド

です。これらを組み合わせることでより早くより便利にVimを使うことができます。

参考にしたもの

http://qiita.com/jnchito/items/57ffda5712636a9a1e62
http://qiita.com/hachi8833/items/7beeee825c11f7437f54#_reference-d89e5711a12b6c84b00a

Vim終了時に勝手に改行文字が挿入されてしまうのを回避する

$
0
0

以下のコマンドを入力した後に終了すればOK

:set binary noeol

Vimで選択範囲をCamelCaseに変換

$
0
0

シェルで、こういう関数を作っておく

.bashrc
camelcase(){
    perl -pe 's#(_|^)(.)#\u$2#g'}

Fishユーザーはこっち

.config/fish/config.fish
functioncamelcaseperl-pe's#(_|^)(.)#\u$2#g'end

これで、標準入力をCamelCaseに変換できる。

~> echo array_map | camelcase
ArrayMap

これだけでも結構便利なのだが、思い立ってVimで使ってみたらちょっと感動した。当然なんですが。

out.gif

余談

ちなみにsnake_caseはこうする。

functionsnakecaseperl-pe's#([A-Z])#_\L$1#g'|perl-pe's#^_##'end

vimrc

$
0
0

最近自分のvimrcを見直したのでメモ程度に晒しておきます.

.vimrc
"============="   vim設定   "=============" エンコードsetencoding=utf8
" ファイルエンコードsetfileencoding=utf-8" シンタックスハイライトsyntaxon" 行番号を表示setnumber" タブ幅settabstop=4" タブ幅(編集時)setsofttabstop=4" インデント幅setshiftwidth=4" インデントをshiftwidthの倍数に丸めるsetshiftround" 改行時に前の行のインデントを継続するsetautoindent" □や○文字が崩れる問題を解決setambiwidth=double
" 現在の行を強調setcursorline" 不可視文字を表示setlist" 不可視文字を表示setlistchars=tab-,trail:-,extends:»,precedes:«,nbsp:%,eol:↲
" compatibleオプションをオフにするsetnocompatible" 右下に表示される行・列の番号を表示するsetruler" .swapファイルを作らないsetnoswapfile" バックアップファイルを作らないsetnowritebackup" バックアップをしないsetnobackup" バックスペースで各種消せるようにするsetbackspace=start,eol,indent
"ビープ音すべてを無効にするsetvisualbellt_vb=setnoerrorbells"エラーメッセージの表示時にビープを鳴らさない" 対応括弧に<と>のペアを追加setmatchpairs& matchpairs+=<:>" 対応括弧をハイライト表示するsetshowmatch" 対応括弧の表示秒数を3秒にするsetmatchtime=3" ウィンドウの幅より長い行は折り返され、次の行に続けて表示されるsetwrap" 文章の折り返し地点を見やすくするsetshowbreak=" 変更中のファイルでも、保存しないで他のファイルを表示sethidden" 新しく開く代わりにすでに開いてあるバッファを開くsetswitchbuf=useopen
" 補完の際の大文字小文字の区別しないsetinfercase" 小文字の検索でも大文字も見つかるようにするsetignorecase" ただし大文字も含めた検索の場合はその通りに検索するsetsmartcase" インクリメンタルサーチを行うsetincsearch" 検索結果をハイライト表示sethlsearch" ESCキー2度押しでハイライトの切り替えnnoremap<silent><Esc><Esc> :<C-u>setnohlsearch!<CR>" マウスモード有効setmouse=a" xtermとscreen対応setttymouse=xterm2
" コマンドモードの補完setwildmenu" コマンド、検索パターンを10000個まで履歴に残すsethistory=10000" ステータスラインを常に表示(0:表示しない、1:2つ以上ウィンドウがある時だけ表示)setlaststatus=2" 現在のモードを表示setshowmode" コマンドを画面最下部に表示するsetshowcmd" 移動コマンドを使ったとき、行頭に移動しないsetnostartofline" スクロールする時に下が見えるようにするsetscrolloff=5" ファイルを開いたときに最後にカーソルがあった場所に移動する
augroup vimrcEx
    auBufRead * if line("'\"")>0&& line("'\"")<= line("$")|
    \ exe "normal g`\""|endif
augroup END

"-----------" キー設定"-----------" j, k による移動を折り返されたテキストでも自然に振る舞うように変更nnoremapj gj
nnoremapk gk

" jjでエスケープinoremap<silent> jj <ESC>" 日本語入力で”っj”と入力してもEnterキーで確定させればインサートモードを抜ける"inoremap <silent> っj <ESC>inoremap<silent>jj <ESC>" Shift + 矢印でウィンドウサイズを変更nnoremap<S-Left><C-w><<CR>nnoremap<S-Right><C-w>><CR>nnoremap<S-Up><C-w>-<CR>nnoremap<S-Down><C-w>+<CR>" TABにて対応ペアにジャンプnnoremap<Tab> %
vnoremap<Tab> %

Windows環境でAtomからPowerShellを使って、SSH接続とCUIエディタを使う

$
0
0

はじめに

AtomIDEなんてものも出たみたいだけれどもまだ対応言語少ないし,
Tera-termを使って開発をしていたけどいちいちウインドウを切り替えるのも面倒くさいなとふと思いWin10のPowerShellからSSH接続とVimを使えるようにしてみた.
自分はローカルのlinux PCにこれで接続してsambaを使いwindowsのネットワークドライブを割り当てて開発してる.

参考にしたページ

Vim + PowerShell - 飲んだくれの記
Windows 10 : OpenSSH インストール : Server World
Customizing your PowerShell Profile

1. OpenSSH-win64 と vim を入れる

OpenSSH-win64

OpenSSH-win64はgithubからダウンロードできます.
これをC:\Program Files\あたりに解凍してOpenSSH-win64フォルダにpathを通しておく.

そしたらWindows PowerShellを管理者権限で起動して, 以下のコマンドを実行

WindowsPowerShell
PS C:\Windows\system32> Set-ExecutionPolicy Unrestricted

PS C:\Windows\system32> cd "C:\Program Files\OpenSSH-Win64"

PS C:\Program Files\OpenSSH-Win64> .\install-sshd.ps1

後は必要に応じてファイアーウォールでポート空けてあげれば終わり.

無題.jpg

サービス一覧からsshdのスタートアップを自動にすればシステムと一緒に立ち上がる.(危ない気しかしないけど)
ps1.jpg

Vim

次にCUIエディタがPowerShellだと使えないようなので, Vimも適当なところに解凍(私はC:\tools\にいれた).
こっちもPathを通して vi と view が使えるようにProfileにエイリアスを登録する.

2. PowerShellのProfileにaliasとfunctionを登録する.

初めにPowerShellでTest-Path $profileを実行.
Profileが既に存在すればTrueが返ってくると思うが今回はFalseが返ってきているので,
New-Item -path $profile -type file –forceを実行してProfileを生成.
生成先のディレクトリが表示されるのでそこにあるMicrosoft.PowerShell_profile.ps1をテキストエディタなりvimなりで編集する.
ps2.jpg

以下私の設定を載せておく.

Microsoft.PowerShell_profile.ps1
set-location C:\   <= ルートディレクトリの設定

New-Alias vi C:\tools\vim80-kaoriya-win64\vim.exe   <= viのalias登録
New-Alias vim C:\tools\vim80-kaoriya-win64\vim.exe
function view() {C:\tools\vim80-kaoriya-win64\vim.exe -R $args} <=viewのalias登録

function ssh-linux { ssh user@hostaddress }  <=ssh接続のfunction設定

3. Atomのplatformio-atom-ide-terminalから接続

あとはAtomにplatformio-atom-ide-terminalをいれて先ほど設定したfunction名を打ち込めば接続できます.
ssh-keygen.exeで鍵作成すれば鍵認証もできるので私は便利だと思います.

ps3.jpg

オツカレサマデシタ.

pythonのlistを速く書くvim tips

$
0
0

書きたいもの

classes=('plane','car','bird','cat','deer','dog','frog','horse','ship','truck')

まずはじめに、以下のように打つ

classes=('plane,car,bird,cat,deer,dog,frog,horse,ship')

のあとにvimの痴漢で

:s/,/','/g

とすればいい。

もっと簡単な方法あったら、vimmerの方達教えてください。


Vim におけるプラグイン管理についてまとめてみた

$
0
0

概要

最近 Xcode で iPhone アプリを開発したり Unity で VR アプリ開発をする生活から、 ターミナルで Rails や Python を書く生活に変わったので、vim 周りを再調査しました。自分が以前環境整備していた頃とは大きく環境が変わってそう。

vim のプラグインをどう管理して、どう探すかについて簡単にまとめました。

プラグインマネージャー

vim のプラグイン管理はサードパーティー製のプラグインマネージャーを使うのが一般的。

人気どころのプラグインマネージャーを以下に列挙した。github のスター数で比較すると Vundle が一番使われてそう。今回は Vundle に絞って以下、導入について説明するが、他も github の README に大抵導入方法が書いてあるのでそちらを参考に。

ちなみに NeoBundle は日本製で、国内での人気は高かったが、最近作者さんが dein.vim を作って、今は NeoBundle のメンテをしていないそう。

プラグインマネージャースター数備考
Vundle15,768スター数が一番多い
vim-pathogen9,435
vim-plug8,495.vimrc への記述が少なくて済む
NeoBundle2,098日本製
dein.vim1,432NeoBundle の後継

Vundle のインストール

Vundle Quick Startを参考に説明する。

1. .vim/bundle 以下に Vundle.vim を配置する

$ git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim

2. .vimrc の先頭に以下を記載

Plugin 'VundleVim/Vundle.vim' 以下の行に導入したいプラグインを追加していけば良い。

set nocompatible
filetype off

Plugin 'VundleVim/Vundle.vim'

" 導入したいプラグインを以下に列挙
" Plugin '[Github Author]/[Github repo]' の形式で記入
Plugin 'airblade/vim-gitgutter'

call vundle#end()
filetype plugin indent on

" その他のカスタム設定を以下に書く

3. プラグインのインストール

インストール方法は 2 つ。

  • vim を開いた状態で、以下を入力して Enter
:PluginInstall
  • ターミナル上で以下のコマンドを実行
$ vim +PluginInstall +qall

Vim プラグインの探し方

vim.org

  • vim 本家のサイト
  • プラグイン数: 5476

スクリーンショット 2017-09-17 15.44.10.png

Vim Awesome

  • プラグイン検索サービス
  • プラグイン数: 15621
  • インストール数、 github スター数が見れるので人気のプラグインが分かりやすい

スクリーンショット 2017-09-17 15.44.25.png

圧倒的に本家より、 Vim Awesome が使いやすく、プラグイン数も多いので Vim Awesome 一択な気がする。他にもツールあれば教えてください。

複数 PC 間のプラグイン同期

.vimrc など、 PC の設定系のドットファイル (.bashrc や .tmux.conf など)はまとめて github のリポジトリにしておくのが管理上ラク。新しいプラグインマネージャーを入れた時に git に push して、自分の開発環境の最新の状態を保てる。

簡単なシェルスクリプトを書いて、ホームディレクトリ間でコピーできるようにすればインストールや更新も簡単にできる。

まとめ

プラグインの探し方、管理の仕方についてまとめました。
なにか間違い等あればご指摘ください!

Vim でブラウザのようにファイル間で進む、戻る操作をする方法

$
0
0

操作方法

  • <C-i>で進む(Ctrl キーを押しながら i キーを押す)
  • <C-o>で戻る

厳密には vim が管理するジャンプリストの行き来なので、ファイル単位の進む/戻るではないが、かなり重宝する。

ちなみにジャンプリストは vim 起動中に以下のコマンドを入力すると一覧で見ることができる。

:jumps (:ju でも可)

意外と知らない Vim でできること

$
0
0

概要

自分はターミナルで Vim を使って開発するのが好きなのだが、 Sublime Text でよくね?とか VSCode でよくね?みたいなことを言われて、話をすると、

  • タグジャンプができたり
  • ファイルをツリーで表示できたり
  • ファイル検索できたり
  • 補完できたり

するから良いと言われ、それって標準の Vim でもできるのでは、と思って調べてみたら意外にできると知ったので記事にしてみました。

他のエディタに Vim プラグインを乗っけるというのもありだとは思いますが、

  • エディタアップデートの際にプラグインアップデートしなきゃだったり
  • 結局サーバーに入る時にそういったソフトは使えなかったり
  • カスタマイズしにくかったり

するので、標準 Vim でやっています。

タグジャンプ(定義元に移動)

コードを書いてて、定義元を表示したいことはしばしばある。これは Vim 標準の ctags を使うことで解決できる。ctags はソースからタグファイルを生成して、vim からそのタグファイルを読み込めるようにすることで、定義元を特定してタグジャンプを可能にする。

スクリーンショット 2017-09-17 17.40.12.png

mac だと homebrew で最新にした方が良さそう。

$ brew install ctags

ctags でタグファイルを作るのは以下のように ctags コマンドをたたく

$ ctags --languages=RUBY -R .

tags ファイルが生成されるので以下の操作で定義元にジャンプできる

操作方法動作
<C-]>一番目の候補にジャンプ
g<C-]>複数候補を表示 > 選択ジャンプ

ファイルツリー表示

ファイルツリーは、 NERDTreeというライブラリが使いやすいのでこれはライブラリで導入。カレントディレクトリ以下のファイル選択が捗る。ライブラリ導入は別記事にて: Vim におけるプラグイン管理についてまとめてみた

スクリーンショット 2017-09-17 17.05.05.png

ファイル検索

標準では vimgrep を使うとファイル検索ができるが、これもライブラリを使ったほうがラク。Unite.vimなどを使うと良い。

:Unite file

と叩いて、挿入モードでパターン入力すると、ファイル検索ができ、所望のファイルを開くことができる。

Unite.vim

その他のライブラリでは ctrlp.vimとかも良さそう。

自動補完

Vim には標準で挿入モード中に <C-p><C-n> と打つと補完が走る。設定をすれば ctags で生成したファイルや辞書データ(スペルチェックに使う)を候補にすることも可能。

こちらまだ深掘りできてないが、デフォルトの補完は設定がややめんどそうなので、neocomplete.vimなどライブラリ導入を検討したほうがラクそう。

ファイル進む、戻る

以下のキーで直前に編集したファイルに戻ったり進んだりできる。

操作方法動作
<C-i>進む
<C-o>戻る

参考: Vim でブラウザのようにファイル間で進む、戻る操作をする方法

まとめ

ライブラリも多用しましたが、標準の Vim で用意された機能をライブラリでより使いやすくされています。これら、ライブラリを使わずに標準機能で頑張ってみるのも良いと思います。その際には 実践Vimに詳しく書かれているので、そちらを参考にされるのが良いと思います。

Ubuntu 個人的なキーバインドの整理

$
0
0

Ubuntu 16.04LTSをインストールし直した際に
いくつかショートカット系を再設定したのと同時に、各アプリのデフォルトキーバインドで記憶が曖昧なのを
整理したので、まとめ。
各アプリのデフォルト設定と、個人的に設定したものが混ざっていますので、ご注意ください。

fcitx

key bindingwhat to do
Ctrl + ;switch input method (EN <-> JP)

fcitxのGUIの設定画面で設定。 Ctrl + ;なのは私の個人的な設定です。

Terminator

key bindingwhat to do
Ctrl + Shift + esplit vertically
Ctrl + Shift + osplit horizontally
Ctrl + Shift + nmove to next frame
Ctrl + Shift + vpaste from clipboard

すべてデフォルト。

Unity or Others

key bindingwhat to do
Supersearch and launch app
Alt + Tabswitch app
Ctrl + Alt + tlaunch terminator
Ctrl + Alt + flaunch firefox
Ctrl + Alt + Shift + nmove current window to next display

ウインドウをデュアルディスプレイにおける隣のディスプレイに移動させるのは
CompizConfig Setting Managerから設定可能。

vi

勉強中です。

key bindingwhat to do
gj, gkmove cursor (move visually)
*forward search the word under cursor
#backward search the word under cursor
;next searched word
,next searched word(inverse direction)
.repeat the previous command
:e ., :Sopen file explorer with current dir
:g/hoge/dremove all lines including "hoge"
:vim hoge % | cwgrep "hoge" in current file
:vim hoge ./* | cwgrep "hoge" in files of current dir
:vim hoge ./** | cwgrep "hoge" in all files under current dir
:vertical diffsplit foo.cget diff between current buffer and foo.c
:doobtain different codes from the other
:dpput different codes into the other

ssh

Xの転送設定。ssh越しにグラフ書いたりしたいので。。。

  • ログインされる側で /etc/sshd/sshd_config で X11Forwarding yes を追加(コメントアウトを外す)。
  • ログインする際に ssh -X オプションをつける

おわり

Vimの undojoin で :%!autopep8 や :%!clang-format を快適に

$
0
0

前置 (plugin の話はありません)

 Vim でプログラムを編集していると、バッファ全体に外部コマンドを適用したい時があります。たとえば、python の autopep8 や c/c++ の clang-format など。
 これらのフォーマッタには整形範囲を限定するオプションがあり、ここは手動で整形したい、ここは機械的な整形で、と使い分けができます。

autopep8
autopep8 --line-range 100 110
clang-format
clang-format -lines=100:110

 ところで、これらのコマンドは部分的な整形であっても、入力にはファイル全体を渡す必要があります。そうすると Vim からは :%!を使って、

:%!autopep8 --line-range 100110

とすれば、一応目的を達します。
問題はここから・・・

問題1. 範囲指定が面倒だ。

 これは、a:firstlinea:lastline (:h func-range) を使った関数を定義し、visual モードの選択範囲を渡せばよいので、割合簡単に解決しました。

.vimrc
" autopep8function! s:FormatAutopep8() range
    let cmd =':silent %! autopep8 '
        \ .'--line-range '.a:firstline.' '.a:lastline.' '
        \ .'-'
    execute cmd
endfunction

augroup Formater
    au!auFileType python
        \ :xnoremap <buffer><silent>f :call<SID>FormatAutopep8()<cr>
augroup END

こうして、visual モードで整形したい部分を選択し、fを押すとその部分だけ整形されるようになりました。が、

問題2. 実行時や undo/redo 時にカーソルが飛んでいく。

 実行すると、カーソルが1行目へ飛んでしまいます。これは使いづらい。
 また、結果が期待と違っていたからと uすれば、カーソルが最終行に飛び、さらに <c-r>してもカーソルが最終行に。この辺りの挙動が何だか良くわからないですが、全然嬉しくない。

 今回の場合、整形前後を目diff (という言葉はあるのかな)するのが小さな楽しみでもあるので、実行時も undo/redo 時もカーソル位置は動いて欲しくないのです。

 実行後のカーソル位置の保存は、winsaveview()winrestview()を使えば実現できますが、undo/redo 時にカーソル位置を留めるのが難しい。
 いろいろ調べると undojoin (:h undojoin「以降の変更を直前の undo ブロックにつなげる。」) が正解に近そうな感じだったので、試行錯誤の結果、このようになりました。

.vimrc
function! s:KeepPosExec(cmd)let save_view = winsaveview()silent! execute "normal! i\<space>\<bs>\<esc>"|undojoin| execute a:cmd
    call winrestview(save_view)endfunction" autopep8function! s:FormatAutopep8() range
    let cmd =':silent %! autopep8 '
        \ .'--line-range '.a:firstline.' '.a:lastline.' '
        \ .'-'call s:KeepPosExec(cmd)endfunction

augroup Formater
    au!auFileType python
        \ :xnoremap <buffer><silent>f :call<SID>FormatAutopep8()<cr>
augroup END

 execute "normal! i\<space>\<bs>\<esc>"は何もしない、一見意味のないコマンドですが、現在のカーソル位置をundoブロックに記憶させる意味があります。なお、execute "normal! i\<esc>"では効果ありませんでした。
 ここに undojoinexecuteを繋げた形、
silent! execute "normal! i\<space>\<bs>\<esc>" | undojoin | execute a:cmdでは、全体がひとつの undo ブロックとして記憶されます。そしてその起点は normal!〜ですから、uしたとき戻ってくるのは現在位置、という仕組みです。

結果

こうなりました。同種のコマンドなら同様に対応できそうです。
ただ、"normal! i\<space>\<bs>\<esc>"という力技、なんとかならないかな・・・

.vimrc
function! s:KeepPosExec(cmd)let save_view = winsaveview()silent! execute "normal! i\<space>\<bs>\<esc>"|undojoin| execute a:cmd
    call winrestview(save_view)endfunction" clang-formatfunction! s:FormatClang() range
    let cmd =':silent %! clang-format '
        \ .'-lines='.a:firstline.':'.a:lastline.' '
        \ .'-style="{
        \   AccessModifierOffset                : -4,
        \   AlwaysBreakTemplateDeclarations     : true   ,
        \   Standard                            : C++11,
        \   ColumnLimit                         : 100,
        \   BreakBeforeBraces                   : Attach ,
        \   IndentWidth                         : 4,
        \   UseTab                              : Never  ,
        \   AllowShortIfStatementsOnASingleLine : false  ,
        \   AlignConsecutiveAssignments         : true   ,
        \   AlignConsecutiveDeclarations        : true   ,
        \   AlignEscapedNewlinesLeft            : true   ,
        \   IndentCaseLabels                    : true   ,
        \ }"'
    call s:KeepPosExec(cmd)endfunction" autopep8function! s:FormatAutopep8() range
    let cmd =':silent %! autopep8 '
        \ .'--line-range '.a:firstline.' '.a:lastline.' '
        \ .'-'call s:KeepPosExec(cmd)endfunction

augroup Formater
    au!auFileTypec,cpp,objc,objcpp
        \ :xnoremap <buffer><silent>f :call<SID>FormatClang()<cr>auFileType python
        \ :xnoremap <buffer><silent>f :call<SID>FormatAutopep8()<cr>
augroup END

Vim patchダイジェスト [2017/09] (仮)

$
0
0

Vim patchダイジェスト [2017/09] (仮)
(8.0.10278.0.x)

  • 8.0.1039: :four_leaf_clover:setbufline()を追加しました。カレントバッファ以外のバッファを変更できるようになりました。
  • 8.0.1038: :four_leaf_clover:「取り消し線(Strike-through)」属性のサポートを追加しました。synIDattr()の引数{what}に"strike"を追加、'highlight'の表示モードにtを追加、termcapオプションt_Tst_Teを追加、他。
  • 8.0.1037: 'diffopt'"icase"アイテムが大文字小文字以外の差分がある場合のハイライト表示に反映されない件を修正しました。
  • 8.0.1035: :four_leaf_clover:バッファラインのterminalへの送信がWindowsで正しく動作しない件を修正しました(2)。:terminalの引数に++eofを追加しました。(関連patch: 8.0.1034)
  • 8.0.1034: :four_leaf_clover:バッファラインのterminalへの送信がWindowsで正しく動作しない件を修正しました(1)。term_start()の引数{options}にエントリ"eof_chars"を追加しました。(関連patch: 8.0.1035, 8.0.1036)
  • 8.0.1033: 環境変数TERMがscreen.xtermの場合はxtermと同等のtermcapを使用するようにしました。但し、termresponseのバージョンが大き過ぎる時は、xtermではないと認識します。
  • 8.0.1031: :four_leaf_clover:getqflist()およびsetqflist()の引数{what}のエントリ"text"の名称を"lines"に変更しました。(getqflist()の戻り値のエントリ"text"およびsetqflist()の第1引数{list}のエントリ"text"と混乱しやすかった為) (関連patch: 8.0.1006)
  • 8.0.1029: :four_leaf_clover:getqflist()は常に"items"エントリを返すようにしました。
  • 8.0.1028: Windowsで$HOME未設定時にviminfoを$VIM/_viminfoに作成していた件を修正しました。(関連patch: 8.0.1012)
  • 8.0.1027: PuTTY, XfceおよびKonsoleで環境変数TERMが "xterm-256colors" の場合、起動時に't_RS'の値('$q q')や't_RC'の値('?12$p')が画面に出力されてしまう件を修正しました。(関連patch: 8.0.0996, 8.0.1016, 8.0.1021)

凡例

表記意味
:four_leaf_clover:新機能、大幅な仕様変更
'hoge'オプション (:h options参照)
:hogeExコマンド (:h :index参照)
hoge()組み込み関数 (:h functions参照)
v:hogeVim定義済変数 (:h v:参照)

方針

こちらを参照。


ひとこと

何気に良く使うVim tips #1 前後の文字を入れ替える

$
0
0

よくある、前後一文字逆タイプミス

pirnt('hello')

ここで、カーソルをiに持ってて、xpすると

pirnt('hello')#^ でxpprint('hello')

vimコマンドメモ

$
0
0

Vim初心者に捧ぐ実践的入門
を参考に個人的に使用しているコマンドをメモ。

ノーマルモード

操作vim覚え方
jキーボードのホームポジション(になるくらい重要)
kホームポジションの隣、2番目に重要
hjの左にあるから左に進む
l余ってるからここに割り当てられた
一文字切り取るx切り取るイメージ
操作vim覚え方
w次の単語の先頭へword
e単語の最後へend
b前の単語の先頭へback
0行頭へ右端なのに行頭へ
$行末へ正規表現と同じ
ggファイルの先頭へ
Gファイルの最終行へ
%マッチする文字へ移動(対応する[]や()への移動)使い方確認中
操作vim覚え方
上書き保存:wwrite
名前をつけて保存:w ファイル名write as
編集終了:qquit
保存して終了:wqwrite quit
ファイルを開く:e ファイル名edit (tabの二度押しでファイル名の類推可能)

ノーマルモード to インサートモード

操作vim覚え方
現在の次の文字位置に移動+インサートモードへa
現在の文字位置からインサートモードへi
インサートモードへiinsertの頭文字
次行を新規行として挿入してインサートモードへo
現在行に新しい行を追加してインサートモードへO

インサートモード to ノーマルモード

操作vim覚え方
ノーマルモードへesc特になし

インサートモード

更新中。。。

Vimコマンド-基本的なコマンド

$
0
0

自分が見返すためにまとめておきます

  • 起動と終了

    • 開始
      vim
    • 終了
      :q <Enter>
  • ファイルの保存

    • ファイルを上書き保存
      :w
    • 名前をつけて保存
      :w <ファイル名>
    • ファイルを保存せずにVimを終了する
      :q!
  • カーソルの移動

    • 左に移動する
      h
    • 下に移動する
      j
    • 上に移動する
      k
    • 右に移動する
      l
  • 文字の削除
    x

  • 文字の入力
    i
    終わるときはEscキーをクリックする

  • 単語単位のカーソル移動

    • 前方に単語1つぶん移動する
      w
    • 後方に単語1つぶん移動する
      b
    • スペース区切りで前方に単語1つぶん移動する
      W
    • スペース区切りで後方に単語1つぶん移動する
      B
  • 行頭行末への移動

    • 行頭への移動
      0
    • 行末への移動
      $
  • 行番号での移動

    • 最初の行への移動
      gg
    • 最後の行への移動
      G
    • 特定の行への移動
      <数字>G
  • 様々なデリート

    • 行末までをデリート
      d$
    • 行頭までをデリート
      d0
    • 1文字をデリート
      x
    • 単語1つをデリート
      dw
    • 最初の行までをデリート
      dgg
    • 最後の行までをデリート
      dG
  • ヤンク(コピー)

    • 現在カーソルのある行をヤンク(コピー)
      yy
    • 現在カーソルのある行をデリート
      dd
  • 検索と置換

    • /を推すと検索モードになる。そのまま検索したい文字を入力してEnter
      /<文字列>下方向に向かって<文字列>を検索する
    • ?を推すと検索モードになる。そのまま検索したい文字を入力してEnter
      ?<文字列>上方向に向かって<文字列>を検索する
      • nを押すと次の検索結果に移動する
      • Nを押すと前の検索結果に移動する

参考文献
非常によくまとまっていて、頭の中が整理できました
新しいLinuxの教科書
https://www.amazon.co.jp/%E6%96%B0%E3%81%97%E3%81%84Linux%E3%81%AE%E6%95%99%E7%A7%91%E6%9B%B8-%E5%A4%A7%E8%A7%92-%E7%A5%90%E4%BB%8B/dp/4797380942

端末の Vim でも挿入モードで縦棒カーソルを使いたい

$
0
0

Neovim が端末版でも GUI 版と同様に挿入モード時にカーソルを|(縦棒)にしてくれるのが良いなぁというツイートをしたら Vim でのやり方を教えていただいたのでメモ.

tmp.gif

https://twitter.com/satoh_fumiyasu/status/910554613044015104

下記の設定を vimrc に書けばOK.

if has('vim_starting')    " 挿入モード時に非点滅の縦棒タイプのカーソルlet&t_SI .="\e[6 q"    " ノーマルモード時に非点滅のブロックタイプのカーソルlet&t_EI .="\e[2 q"    " 置換モード時に非点滅の下線タイプのカーソルlet&t_SR .="\e[4 q"endif

Neovim は DECSCUSR を使ってカーソルの形状を変えているようなので,その制御シーケンスを使う.

Vim には t_で始まる名前の端末オプションがあって,その中に挿入モード開始時のオプション t_SIと終了時のオプション t_EI,置換モード開始時のオプション t_SR(それぞれ多分 Start Insert と End Insert, Start Replace の略)があるので,そこでカーソルの形を変えるシーケンスを追加する.

上記設定以外にも点滅させたり(\e[1 q, \e[5 q, \e[3 q)もできる.

手元のターミナル (iTerm2 と Terminal.app) でしか確認していないけれど,DECSCUSR をサポートしている端末では動くはず.

WindowsのGVimの:terminalから色々なシェルを使う

$
0
0

はじめに

最近、vimに実装された:terminalが便利そうなのでWindowsから色々いじってみました。
Windows版はvim/vim-win32-installerからzipをダウンロードできます。

gvim-terminal.png

上のキャプチャではVimを4つに分割してそれぞれ以下のシェルを動かしています。

Git Bashコマンドプロンプト
WSL BashPowerShell

:terminalのヘルプと概要はここから

以下、私の好みでオプションに++close++curwinを指定しています。

コマンドプロンプトとPowerShellを動かすやつ

この2つは簡単です。

:terminal ++close++curwin

Windowsのデフォルトシェルはコマンドプロンプトなのでシェルを指定しなくてもよいです。

:terminal ++close++curwin powershell

PowerShellはデフォルトシェルではないので引数に指定します。

WSLのBashを動かすやつ

:terminal ++close ++curwin C:/WINDOWS/System32/bash.exe -c "cd; bash -l"

Windows側からWSLのホームディレクトリに移動できないので-cオプションで移動後にbashを起動しています。
シェル起動時のディレクトリがどこでもよいならこのオプションは不要です。

Git for WindowsのBashを動かすやつ

function! GitBash()    " 日本語Windowsの場合`ja`が設定されるので、入力ロケールに設定しなおすletl:oldlang = $LANG
    let $LANG = systemlist('"C:/Program Files/Git/usr/bin/locale.exe" -iU')[0]

    " Git for Windowsに同梱されたvimで誤作動するのでvimが設定する環境変数を削除するletl:oldvim = $VIM
    letl:oldvimruntime = $VIMRUNTIME
    letl:oldmyvimrc = $MYVIMRC
    letl:oldmygvimrc = $MYGVIMRC
    let $VIM =''let $VIMRUNTIME =''let $MYVIMRC =''let $MYGVIMRC =''    " ホームディレクトリに移動するlcd $USERPROFILE
    " :terminalでgit for windowsのbashを実行する
    terminal ++close++curwin C:/Program Files/Git/bin/bash.exe -l    " 環境変数とカレントディレクトリを元に戻すlet $LANG =l:oldlang
    let $VIM =l:oldvim
    let $VIMRUNTIME =l:oldvimruntime
    let $MYVIMRC =l:oldmyvimrc
    let $MYGVIMRC =l:oldmygvimrc
    lcd-endfunctionnnoremap<Leader>g :<C-u>call GitBash()<CR>

:terminalで起動したGit Bashから同梱のvimを実行しようとすると以下の理由で色々設定が必要でした。

  • LANGja_JPja_JP.UTF-8のような値にしないとlsで日本語が出ない
  • GVimが設定した環境変数のままだとGit for Windowsに同梱されたvimのパスと合わなくてエラーになる

更に、以下のaliasを~/.bashrcに設定しておくとremote - Vim日本語ドキュメントの機能を使って、Git Bash同梱のvimを使わずにGvimでファイルを開くことができます。

if [ -x <vim install folder>/vim.exe ]; then
    alias vim="<vim install folder>/vim.exe --servername GVIM --remote"
fi

さいごに

minttyと比べると描画がちょっと遅かったり256色カラーにならなかったりと見劣りする部分はありますが、ターミナルのコピペをvimの操作で行ったり、複数のシェルを1つのウインドウにまとめられるのが便利でした。

参考リンク

社内布教用のvimチートシート

$
0
0

前提

この投稿は社内でvimを布教するに当たって、基本的な使い方を説明するためのチートシートです。
分かりやすさを重視して、vimの正確な用語を使っていない箇所が多数あります。
なお、30分ほどの時間の余裕があるなら、この記事を読むより、vimで :Tutorialと打ち、チュートリアルを実践することをお勧めします(※英語に堪能でない場合は日本語化しておくこと良いでしょう)。

また、この記事は随時編集される可能性があります。

移動(基本)

  • hjklで左/下/上/右に移動
    • 何はともあれ、これを覚えましょう。

モード切り替え

  • vimには大きく分けて3つのモードがあります。
    • ノーマルモード: カーソル移動や編集
    • 挿入モード: テキストを入力
    • 選択モード: テキストを選択
      • 通常選択モード
      • 行選択モード
      • 矩形選択モード
キー説明
ESCノーマルモードに戻る(困ったらとにかくESC)
iカーソルの位置で挿入モード開始
aカーソルの直後で挿入モード開始
I行頭で挿入モード開始
A行末尾で挿入モード開始
o次の行で挿入モード開始
v選択モード開始
V行選択モード開始
Ctrl+V矩形選択モード開始

移動(応用1)

キー説明
w次の単語の先頭へ移動
b前の単語の先頭へ移動
^行頭へ移動(インデントを考慮する)
0行頭へ移動(インデントを考慮しない)
$行末へ移動
ggファイル先頭へ移動
Gファイル末尾へ移動

編集(ノーマルモード)

キー説明
x1文字削除
dd1行削除
Dカーソル位置以降を削除
yy1行コピー
0行頭へ移動(インデントを考慮しない)

編集(選択モード)

キー説明
d選択範囲を削除
y選択範囲をコピー

移動(応用2)

キー説明
f+「文字」行内で「文字」の位置まで移動
t+「文字」行内で「文字」の手前まで移動

頻出パターン

キー説明
cwカーソル位置の単語を削除
cwカーソル位置の単語を削除して挿入モード開始
yyp現在行を複製
f,;;;次のコンマへ移動(を繰り返す)
f;;;次のスペースへ移動(を繰り返す)
Viewing all 5608 articles
Browse latest View live