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

Vim — コマンド入力モードで移動するショートカット (普通のショートカットが効かない)

$
0
0

結論から書く

  • CTRL-B (行頭に移動)
  • CTRL-E (行末に移動)

を覚えておくだけで相当便利になりそう。

ショートカット一覧

CTRL-B or <Home>
        cursor to beginning of command-line
CTRL-E or <End> 
        cursor to end of command-line
CTRL-H              
<BS>        Delete the character in front of the cursor (see |:fixdel| if
        your <BS> key does not do what you want).
<Del>       Delete the character under the cursor (at end of line:
        character before the cursor).
CTRL-W      Delete the |word| before the cursor.  This depends on the
        'iskeyword' option.
CTRL-U      Remove all characters between the cursor position and
        the beginning of the line.  

コマンド入力モードとは

:/とかで出てくるあいつ。

image.png

正式には『コマンドラインモード」というらしい。(今回はじめて知った)

Command-line mode is used to enter Ex commands (":"), search patterns
("/" and "?"), and filter commands ("!").

Vim documentation: cmdline

悩み

普通のショートカットがいきなり効かなくなる。

Ctrl+a^$も使えないし、なんなの。

と思いつつ Vim 使用頻度が低いので放置していた。

Versions

  • VIM - Vi IMproved 8.1 (2018 May 18, compiled Aug 7 2018 21:57:52)
  • Mac OS High Sierra

Links


Vim — 「q と コロン を打ったら出てくるあいつ」( q: ) は何と呼ぶのか >「コマンドライン・ウィンドウ」らしい

$
0
0

Vimを終了 ( :q ) させようとすると、たまに押し間違えてでてくるあいつ。

コマンドラインウィンドウ。
カタカナで書くと山口百恵の曲っぽい。

もしくは単に「コマンドウィンドウ」と呼ぶみたいだ。

image

通常のコマンドモードとは違って、Vim的なキーストロークやショートカットキーなどを保ったまま、コマンド履歴を扱えたり、コマンドを打てるっぽい。

いいね!

だがしかし、めちゃくちゃググりにくい

英語で思いつく限りの単語でググっても出てこないレベル。
ググり方が悪いのだろうか?

  • Google "Vim q and colon" (思うような結果なし)
  • Google "Vim q before colon" (思うような結果なし)
  • Google "Vim colon after q" (思うような結果なし)
  • Google "Vim command line q colon" (思うような結果なし)

名前が分からないとそもそも始まらない。

vimの画面には Command Lineと表示されていることを頼りに Vim command line qとぐぐったらようやくヒットした。

ドキュメント

6. Command-line window              *cmdline-window* *cmdwin*

                            *command-line-window*
In the command-line window the command line can be edited just like editing
text in any window.  It is a special kind of window, because you cannot leave
it in a normal way.
{not available when compiled without the |+cmdline_hist| or |+vertsplit|
feature}

OPEN                        *c_CTRL-F* *q:* *q/* *q?*

There are two ways to open the command-line window:

Vim documentation: cmdline

参照

Vim command window

...

q: — Open with a command history from normal mode
q/ — Open with a search history from normal mode (to search forward)
q? — Open with a search history from normal mode (to search backward)
Ctrl+F — Open with a command history from command mode

Vim command window | Arabesque

あわせて読みたい?

TODO

「Vimでググりにくいキーワード大全」みたいなまとめをいつか作ってみたい。

Thanks to

Vim — コマンド入力モードで移動するショートカット (普通のショートカットが効かない) - Qiitaでコメントいただいた @shiracamusさん

Links

漆黒の闇に近づくために(なるべく画面を黒くして目を疲れないようにしよう)

$
0
0

内容

目が疲れるのでなるべく黒画面にするための方法

黒画面にした環境

windows7
Linux Mint LMDE2
word2016(windows版)
Vim
jupyter notebook
vivaldi

はじめに

僕は長期間、いやそれ程長くなくても、白い画面をディスプレイで見ていると目が疲れてくる。なのでまず何でも黒い画面にしたくなるのだが、そんな僕のデスクトップを通りがかる会社の皆さんは、なんで君の画面はいつ見てもそんなに黒いのかねやばいサイトでも見ているのかねと言わんばかりにクスクスと通り過ぎていく。

…僕がおかしいのだろうか?そんなことはない、真夏に自転車に乗る時は日焼け防止のために紫外線カットのサングラスが必須だと聞いた、それとよく似ているはずだ。
というわけで、僕ができる限り行っている黒画面の方法を思いつくままに書いてみようと思う。

windows7

これは下記の方法よりも万能なワイルドカード的方法だが、ウィンドウズ標準機能の拡大鏡を使う。
win++(ウィンドウズキーと"+"(プラス)キー同時押し)で拡大鏡のメニューが出せる。すると任意の拡大率で起動するが、すぐにWin+-(マイナス)を押せば等倍表示に戻る。この際、オプションから「色反転を有効にする」をチェックしていれば反転表示となる。

全ての場面で有効なワイルドカードではあるが、Aeroが使用可能なPC、またAeroが有効なテーマを使用している必要がある。また、僕の環境では少し描画が重いように感じる。そして、下記の他ソフトで独自に白黒反転していると逆に白くなってしまうので、僕は最後の手段として使用している。
ちなみにandroidは白黒反転機能が標準的に用意されているのでとても便利。

vim

これはお馴染molokaiなどcolorschemeを使用しよう。

_gvimrc
colorscheme molokai

~/.vim/colors/molokai/molokai.vimのように置く。

pdf閲覧

evinceがお勧め。文字だけでなく図も白黒反転してくれる。そして素晴しいところは、Ctrl+iで反転切り替えができるから。Okularも反転はできるのだがショートカットキーがなかった。pdfを閲覧している時は、図などで反転ではイメージできない時があるので随時切り替えたくなる。そのような時にショートカットキーがあるのとないのでは雲泥の差だ。
またLinuxでも標準的に使用可能なのもよい。windows版はmsys2などを経由してインストールするのがよいようだ。こちら参考

word

上記の拡大鏡で実現するのに気付く前に採っていた方法は、ワードのメニューで、「デザイン→ページの色」で濃い目の色を選ぶと白黒反転するのを利用して、autohotkeyでショートカットキーを作成して実現していた。

;バックグラウンドの色を青に
#b::
IfWinActive, ahk_exe WINWORD.EXE
{
  send, !gpc
  sleep, 100
  send,{down}{down}{down}{down}{down}
  send,{right}{right}{right}{right}
  send,{enter}
  }
  return

;バックグラウンドの色を白に
#w::
IfWinActive, ahk_exe WINWORD.EXE
{
  send, !gpc
  sleep, 100
  send,n
  }
  return

注意点は、文字の色が「自動」で設定されていないと反転してくれないので、そのような文字が多い時は素直に諦めて拡大鏡を使用するか、全ての文字を選択して自動に設定しなおす。もちろんこの場合は色が全部同じになってしまい困る場合もあるだろう。

jupyter notebook

ipython notebookの時は凄く苦労したのだが、今はjupyter themesを入れるのがとても楽チンでよい。

pip install jupyter-themes
jt -t molokai

molokai以外にも黒くてかっこいいのはあるので、そちらも試してみよう。

vivaldi

change colorsがおすすめ。
vivaldiというかchrome系ブラウザなら使えると思うのだが、cssを上書きすることのできるプラグイン。上書きのオン/オフを、ショートカットキーに割り当てることができるのでとてもいい。書き換えた後の背景、文字の色はオプションから自分で指定できる。

最後に

やっぱ目はいたわらなきゃ!

Vim — 最初からインサートモードでファイルを開く

逆引きVim(随時更新)

$
0
0
  • 行末へ移動:$
  • 行頭へ移動:0, ^
  • 一文字決してインサート:s

Vim の jj を Mac の日本語入力中でも使えるようにする

$
0
0

TL;DR

Vimや GUI エディタの Vim 拡張機能 (e.g. vscodevim) を普段使うとき、 jjescにマップして insert mode を抜けるのに使っているのですが、日本語入力中に jj (つまり っj) を入力したときも機能するよう、 Karabiner-Elementscomplex modificationsを設定する方法をまとめました。

Requirements

これを実現するためには日本語入力で っjが入力されたら、

  1. 現在までに入力中の日本語文章の変換を確定させ、
  2. 入力を日本語から半角英数に変更し、
  3. Vim insert mode から何らかの方法で抜ける

ことが必要になります。1. と 2. は returnおよび 英数キーを入力するよう設定すれば OK です。一方、3. については以下の2つの方針が考えられます。

  1. っjescにマップする (jjの入力はなかったことにする)
  2. っjjjにマップする (jjescのマッピングは Vim や Vim 拡張機能の設定に任せる)

Karabiner-Elements を使うと macOS のグローバルなキーボード設定が変えることができるので (もちろん特定のアプリケーションに限定した設定も可能ですが)、ターミナルの Vim だろうが VS Code だろうが jjが使えるようになるのが大きな魅力です。そこで、様々な場面で意図しない escが実行されないように、ここでは後者を選択することにします。

Installation

ここでは @s-showさんの Karabiner-Elementsを使ってキーの2連打に処理を割り当てる方法を参考に、以下の karabiner-vim.jsonを作成しました (Gistにも置いておきました)。これを、 ~/.config/karabiner/assets/complex_modificationsに置いておけば、 Karabiner-Elements Preferences → Complex Modifications → Add rule から選択できるようになるはずです。

add-rule.png

仕組みとしては、

  1. 日本語入力のときに1つ目の jが入力されたら vim-j-flag1にする。もし一定時間何も入力されなかった場合 (to_if_invoked) や j以外の文字が入力された場合 (to_if_canceled) は、 vim-j-flag0に戻す。
  2. 立て続けに2つ目の jが入力されたら vim-j-flag0に戻し、returndelete (を削除) → 英数jj (半角英数) を入力する。

となっています。あとは Vim の場合は .vimrcで、

.vimrc
inoremap <silent> jj <ESC>

としておけば OK です。上で前者の方針を選択した場合も、これを参考に簡単に設定できると思います。macOS 限定のハックですが、 Vim-like な環境で快適に日本語入力ができるようになるので便利ですね!

Code

karabiner-vim.json
{"title":"For Vim","rules":[{"description":"日本語入力の っj を jj にマッピングする","manipulators":[{"type":"basic","from":{"key_code":"j"},"to":[{"set_variable":{"name":"vim-j-flag","value":0}},{"key_code":"return_or_enter"},{"key_code":"delete_or_backspace"},{"key_code":"japanese_eisuu"},{"key_code":"j"},{"key_code":"j"}],"conditions":[{"type":"variable_if","name":"vim-j-flag","value":1},{"type":"input_source_if","input_sources":[{"language":"ja"}]}]},{"type":"basic","from":{"key_code":"j"},"to":[{"set_variable":{"name":"vim-j-flag","value":1}},{"key_code":"j"}],"to_delayed_action":{"to_if_invoked":[{"set_variable":{"name":"vim-j-flag","value":0}}],"to_if_canceled":[{"set_variable":{"name":"vim-j-flag","value":0}}]},"conditions":[{"type":"variable_if","name":"vim-j-flag","value":0},{"type":"input_source_if","input_sources":[{"language":"ja"}]}]}]}]}

References / links

障害者向けのShiftキー自動押下

$
0
0

ErgoDoxEZを使っていて、面白そうではあるが、個人的には不便な設定を見つけたので、紹介する。

Shiftキー自動押下

正確には、ErgoDoxに関係なく、QMKのFirmwareに関する設定の一つ。
結論を言えば、Aキーを一定時間押下し、キーを離したときに、大文字の"A"が入力できる。
通常は、Aキー単体押下では、小文字の"a"のみしか扱えない。
それが今回の対応で、自動でShiftキーを押下してくれるというもの。

Auto Shift

使い方が合っているのか不明だが、一応設定できたことで、合っていると判断する。
それは、
インストールディレクトリ\qmk_firmware\keyboards\ergodox_ez\keymaps\個人のキーマップディレクトリ
に、rules.mkファイルを配置する。

dir.jpg

そして、そのファイルを

rules.mk
AUTO_SHIFT_ENABLE = yes

とする。
その後、コンパイルを行い、"〜〜〜.hex"を作成後、キーボードにファームウェアを流し込めば、Shift自動押下が適応される。
個人的には迷惑この上ない設定だと思う。
解除の方法が分からないのだから・・・(rules.mkを除いた状態でコンパイルを行い、キーボードにhexファイルを流し込めば良いのだが、そういうことではない)。
当然指をくわえて眺めていたわけではない。眺めただけで出来るようになれば努力なんて要らない。

AutoShift解除

Aキーの設定と同じように、On/Offの設定をキーに割り当てておけば、無効化できる。
KC_ASOFFをどこかのキーに設定しておけば、そのキー押下で、今回設定したShift自動押下機能が無効化される。

AutoShift実行

無効化後、再度有効にする場合は、KC_ASONをどこかのキーに設定しておけば、そのキー押下で、再度有効になる。

AutoShift実行切り替え

上記は、2つのキー設定が必要になる。
トグルの場合、ワンタップで有効・無効が切り替えられれば、キーの有効活用が出来るだろう。
KC_ASTGをどこかのキーに設定しておけば、ワンタップで有効・再度ワンタップで無効化できる。
Windowsキーにワンタップでこのキーを設定しておけば、便利・・・ではないか。
私は、昨日投稿したキーをWindowsキーと組み合わせている。

AutoShift有効時間

押下時間の長さで、Shiftキー押下が有効になっているかどうかが決まる。
短い時間の押下では、そのままのキーになり、長い時間の押下では、Shiftキー押下とそのキーの組合せになる。
その時間を長くしたい場合は、KC_ASUPをどこかのキーに設定しておけば、このキーによって、キーの押下時間を長くしなければならない(待機時間が上がる)。
例えば、今まで1秒押下したら"a"が"A"になっていたのに、今回の設定で、5秒押下しなければ"a"が"A"にならないといった感じだ。
手の動きが遅い人には良いかもしれない。

また、逆にせっかちな人は、今まで1秒押下したら"a"が"A"になったのすら長いと感じる人だ。
そんな人は、KC_ASDNをどこかのキーに設定して、何回か押下しよう。
そうすれば、"a"押下を0.1秒で"A"にできる(待機時間が下がる意味のDown?)。

※今回の待機時間は例なので、信じないように。
標準の待機時間は175ミリ秒だと思う。

KC_ASRP

これ何?
指をくわえて眺めることしか出来ない人間なので、これが何か分からない。
もしかしたら現在の待機時間を出力する?
このキーコードをキーに設定後、テキストエディタがアクティブになっているときに、キー押下によって、"\n175\n"が出力された。
\n:改行

キーの種類によりAutoShift有効を制限する。

これまたC言語のファイルを触ることになるのだが、これこそどうすれば良いのか分からない。
きっとヘッダファイルに、制限したい文字種類を記載すれば良いと思う。
ヘッダファイルが重要なので、別の場所で定義しても仕方ない。
インストールディレクトリ\qmk_firmware\keyboards\ergodox_ez
config.hファイルに記載する必要がある。
このファイルであれば、どこに記載しても良いと思う。

無効化により、キーを押下し続けた場合、押下時間に比例して、その文字(キー)が打ち込まれることになる。
他のキーは、押下によって一時停止するため、肩すかしを食らうほどタイミングが合わなくなる。

NO_AUTO_SHIFT_NUMERIC

他は有効にしたいが、数字だけはShift押下を無効にしたい場合に宣言する。
宣言方法は、以下になる。

config.h
#define NO_AUTO_SHIFT_NUMERIC

NO_AUTO_SHIFT_SPECIAL

他は有効にしたいが、特殊な記号だけはShift押下を無効にしたい場合に宣言する。
宣言方法は、以下になる。

config.h
#define NO_AUTO_SHIFT_SPECIAL

特殊な記号:-_=+[{]};:'",<.>/?
スペース・ハイフン・アンダーバー・イコール・プラス・鍵括弧開(閉)・波括弧開(閉)・コロン・セミコロン・シングルクォーテーション・ダブルクォーテーション・カンマ・小なり不等号・ピリオド・ピリオド・大なり不等号・スラッシュ・ハテナ(クエッション)

対象外なのは、!や@など数字キーをShift押下で変化する記号が対象外のようだ。
ならば、円記号はどうなるのか・・・。

NO_AUTO_SHIFT_ALPHA

他は有効にしたいが、文字だけはShift押下を無効にしたい場合に宣言する。
宣言方法は、以下になる。

config.h
#define NO_AUTO_SHIFT_ALPHA

要は、a〜zを普通に使えると言うこと。
大文字にするには、わざわざ人間様の手でShiftキーを押下した上で、文字キーを押さなければならない。

メリット

時間調整が可能で、有効有無を切り替えられるのはありだと思う。
やはり、身体障害者向けだと思うが・・・。
最低でもVim使いには邪魔な存在でしかない。
今回有効にしたため、カーソルを移動させるため、kキー押下でヘルプが起動するようになった。
大文字の"K"が押下したことになり、カーソル配下の文字をヘルプで探す動きになった。
最初その挙動が理解できず、かなり焦った。
jキーもそうだ。大文字の"J"になり、2行が1行にまとめられる様は、混乱の元になる。
自分で大文字にする設定をしているはずなのに、意図せずに大文字になるため、体が固まる。
しかし、慣れれば便利かも知れない。

デメリット

わざわざキーボードで制御する意味がよく分からない。
考えられるのは、どうしても体が不自由で、ペン一本でしかキーボードを打てない状態になった場合であり、かつOS側の設定を変更出来ないときに限りそうだ。
そんな場合に、キーボードを使えるのか疑問だが。
OS側の設定というのは、WindowsOSであれば、標準でその機能が備わっているからだ。

アクセシビリティ

障害者.png
※画像真ん中の「固定キー機能を使用する」を"オン"にすれば、今回の機能と似たようなことが出来る。
あくまで"似た"動作が出来る。

以上。

1週間もせずに、ErgoDoxEZに関する投稿をしてきた。しかし、HHKBを使って執筆しているのは内緒だ。

Vim — 知らないと損するインサートモードへの入り方色々

$
0
0

一覧

  • i— 現在のカーソル位置からインサートモードへ
  • a— 現在の位置 + 1文字先からインサートモードへ
  • I— 行頭に移動してインサートモードへ
  • A— 行末に移動してインサートモードへ
  • o— 行末に改行を挿入してインサートモードへ (次行をオープン)
  • O— 行頭に改行を挿入してインサートモードへ (前行をオープン)
  • s— 現在カーソル位置の1文字を削除してインサートモードへ (ほしかった‥!)
  • cw— 現在カーソル位置の単語末(w)まで削除してインサートモードへ (c0とかc$とかいろいろできる)

まだまだあるかも。

今まで aしか使っていなくてかなり損していたぐらいの気持ち。

インサートモードからの逃亡

insert modeを抜けるときはCTRL-Cが一番押しやすい
Ctrl-[を使うのが正統派。 (Ctrl-[はEscapeを押したのと同じ効果)

参考

image.png

Versions

  • VIM - Vi IMproved 8.1 (2018 May 18, compiled Aug 7 2018 21:58:18)

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

みんなにもっとCtrl-zで実行中のjobをサスペンドできること知って欲しいし、使って欲しい (bash、Zsh)

$
0
0

皆さんこんにちは、かみけん(@kamykn)です。
(最近、アカウント名をkmszkからkamyknに変えました。)

この記事で紹介すること

bashやzshなら実はscreenやtmuxを使わなくてもVimやMySQL CLIなどを一つのウインドウで複数起動できるので、作業が少し楽になるかもという内容です!
これ教えると結構ヘェ〜ってなってる人(年上のプログラマにも意外と…)が多かったので記事にして見ました。

jobとforegroundとbackground

VimやMySQLなどの開いている状態(実行している状態)のjobはCtrl-zでbackgroundに回すことができます。
backgroundにjobは複数保持することができ、fg (foreground)コマンドによって任意のタイミングで呼び出すことができます。

fgとjobs

今回登場するコマンドはfgjobsになります。(あと、バックグラウンドに回す際のCtrl-zも使います。)

VimやMySQLなどの開いている状態(実行している状態)のjobをCtrl-zでbackgroundに回し、そして必要になったときにfgコマンド(foreground)で呼び出しています。

↓↓ jobのサイクルのイメージ

[foreground] ─── 入力:Ctrl-z ───> [background]
     ^                                 │
     └──────────── 入力:fg ────────────┘

実演

おもむろにVimを立ち上げたあとにCtrl-zを押してみましょう。

ctrlz1.gif

Vimが消えました。

Vimはどこに行ったのでしょう。消えたVimを探すべく、今度は jobsと打ち込んでみます。

❯ jobs
[1]  + suspended  vim ~/.vimrc

いました。なにやらVimがsuspended状態であることがわかったので、次に fgと打ち込んでみます。(または単に %1でもいいでしょう。)

ctrlz2.gif

無事に先程のvimを開くことができました。
単にfgとすると最後に起動状態にあったjobsに戻ることが出来ます。

次に複数のjobを立ち上げてみます。

またCtrl-zでもどって、今度はmysqlコマンドを叩いてみます。
再度Ctrl-zでログイン中のmysqlをsuspendし、jobsコマンドでmysqlが増えていることが確認できました。

❯ jobs
[1]  - suspended  vim ~/.vimrc
[2]  + suspended  mysql -u root -p

今度はMySQLとVimを交互に開いてみます。
%1、Ctrl-z、%2、Ctrl-z、%1、Ctrl-z …

ctrlz3.gif

または%1の代わりにbashならfg 1でもOKです。(Zshだと fg %1になります…)

自分の使い方

自分はそんなにたくさんサーバーにSSHする人ではないですが、1環境(サーバー)に対して1ウインドウ(tmuxなどのタブなど)開いておけばバックグラウンドで複数jobを立ち上げることで満足な感じになりました。

あと、バックグラウンドを使い始めると、気がついたら実はVimが複数立ち上がってたみたいなことが増えてくるので、最近はプロンプトにjob数を表示したりしてます。

スクリーンショット 2018-08-29 0.15.45.png
一番右の1がjob数になっていて1つjobが立ち上がっていることがわかります。
設定はこんな感じです。

local prompt_location="%F{081}%B%~%b%f"local promot_mark="%B%F{208}%(!,#,$) %f%b"local status_code="%(?,,%F{208} / %f%B%F{red}%?%f%b)"local number_of_jobs="%(1j.%F{208} / %f%F{226}%B%j%b%f.)"PROMPT="
${prompt_location}%B"'$vcs_info_msg_0_'"%b${number_of_jobs}${status_code}${promot_mark}"

1行空行作ってプロンプトが入り、更に改行して常にコマンドが左から始まるようにしています。
(終了ステータスもnon-zeroのときに赤字ででます。vcs_infoは他の方の記事をご参考いただけると…!)
Vim乱立はこれでなんとか防げそうです…。

これで、tmuxやscreenを使うことができないような極限状態でも生き抜くことができるかもしれませんね…!

以上で共有は終わりです。
みなさんのCLIライフが捗りますように!!

Git — git commit した時などに Vim を最初からインサートモードで開く

$
0
0

素早くコミットしていく開発スタイルだとじわじわと便利

git config

~/.gitconfig
[core]
  editor = 'vim' -c 'startinsert'

Versions

  • git version 2.8.1
  • VIM - Vi IMproved 8.1

Links

git + peco + Vim — git grep でマッチしたファイルを選んでVim で編集する

$
0
0

イメージ

  • echoという文字列があるファイルを git grepする
  • 12行目でマッチしているファイルを選ぶ

image

  • Vimで12行目から編集開始できる

image

ポイント

  • $EDITORの環境変数で利用するエディタを決める
  • git grep --line-numberオプションを使って、git grepで引っかかった行を読み込むようにする ( Vim を使う場合 )
  • git grep の結果からファイルパスをパースする
  • peco を使ってインクリメンタル検索をする

スクリプト例

#!/usr/bin/env bash -eu# Usage## $ command [grep-keyword] --some-grep-option# 利用するエディタを環境変数から決めるreadonly editor=${EDITOR:-vim}# peco が入っていなければ終了するif[!$(which peco)];then
  echo You need peco please install
  exit
fi# git grep する# git grep には自由なオプションを渡せるようにしておく ( --line-number をのぞいて )readonly git_grep_result=$(git grep--line-number$@)# git grep のマッチ結果がなければ終了するif[-z"$git_grep_result"];then
  echo No match with git grep
  exit
fi# git grep の結果からpecoで検索モードに入るreadonly git_grep_select=$(echo"$git_grep_result" | peco --query="$1")# peco での選択結果がなければ終了するif[-z"$git_grep_select"];then
  exit
fi# pecoで選んだ行からファイルパスをパースするreadonly filepath=$(echo"$git_grep_select" | awk-F':''{ print $1 }')# git grep の結果からファイルの行番号をパースするreadonly line_number=$(echo"$git_grep_select" | awk-F':''{ print $2 }')if[!-z"$filepath"];then# エディタが Vim なら 引っかかったファイル行番号から開くようにするif[["$editor"=~ vim ]]&&[!-z"$line_number"];then
    eval"$editor" +"$line_number""$filepath"else
    eval"$editor""$filepath"fi
fi

gitim/git-grep-edit at acdbbf9bcbfd92e10d62be3f92bff5e6e5b0366e · YumaInaura/gitim

Versions

  • git version 2.8.1
  • peco version v0.5.3 (built with go1.10)
  • bash 4.2
  • Mac OS High Sierra

Links

Vim のファイルセーブは異常だからやめたい

$
0
0

Vim 使いの皆さんは、 Vim のファイルを保存する方法をご存知だろうか?

そうだ、 :w<CR>のことだ。

……皆さん、お気づきだろうか。
たかがファイルを保存するのに、
なんと、

三つもキーをタイプしている!!!

あまりの衝撃に、 # を使って強調してしまった。

そして、私みたいな US キーボード使いなら Shift ; w <CR>だ。

四つに跳ね上がっている!!!

意味がわからない。
日本は法治国家ではなかったのか(錯乱
信じられないほどの苦行だ。

プログラマーの三大美徳である「怠惰」をなんだと思ってるんだ!! と激昂した私は、オートセーブをしたくてたまらなくなった。

この記事で達成すること

vim からフォーカスを外した場合、自動でセーブする。

もう一つのアプローチとしては、一定時間入力しなければセーブするというものがあるが、ファイルセーブ時に何かする機能が全滅するのでやめておく。

手順

長く険しい道のりだが、最後までやり遂げてくれ。

neovim, gui vim を使っていない者はここから

neovim 使いはこの項目をスキップすべし。
gui 版の vim もスキップして問題ないはず(確かめてない)。

いくつかのターミナル(どれだよ)を除いて vim はフォーカス状態を感知できないらしい。

mac 使いは以下の二つを実行すべし。
windows linux 使いは自分で頑張れ。

  • iterm2 を使う
  • sjl/vitality.vimを入れる
    これは iterm2 tmux vim 三者の連携をいい感じにしてくれるプラグインで、 vim がフォーカス状態を感知できるようになる。

そして下へと続く。

neovim, gui vim を使っている者はここから始める

$ echo 'autocmd FocusLost * silent! wa' >> ~/.vimrc

tmux を使わない場合はここで終わり。

おめでとう。
vimrc に一行文字列を追加するという危険な旅を終えたあなたには、それ相応の見返りがあったはずだ。

このやり方は、ファイルに紐づいてないバッファーや、セーブできないファイルがあった時、スキップする。
もちろん、 vim を終了する時にはちゃんと警告が出るので、セーブを終えないまま vim を退出するようなことにはならないが、ちゃんとエラーを表示してほしい人はこっちを使うといいだろう。

$ echo 'autocmd FocusLost * wa' >> ~/.vimrc

これで OK 。

Tmux を使っている

しかし、 tmux 使いはまだだ。
tmux の中の vim はフォーカス状態を感知することが出来ない。

険しい道のりが続く。

$ echo 'set -g focus-events on' >> ~/.tmux.conf

終わりである。

ターミナルからフォーカスを外した時はもちろん、 tmux のウィンドウを移動した時にもセーブされる。

果てしなく長い手順の果てに、 tmux 使いもきっとオートセーブを手に入れたことだろう。

少なくとも Mac デフォルトのターミナルと iTerm2 で確認したところ、問題なく動いた。

やったね。

P.S. :w<CR>を筋肉が覚えててやめられない。

Good Bye Vim. Hello VSCode.

$
0
0

かつてのVim人気はどこへ

5年くらいまでの技術記事といえばVimが常連。はてぶのテクノロジーカテゴリは毎日必ずなにかしらVimの記事がホットエントリに上がっていました。
Vim Advent Calendar 2013に至っては、本来の目的であるクリスマスまでのカウントダウンを通り越して、年を越し、春を迎え、GWを過ぎ、最終的に6月まで続きました。いかに人気がすごかったのか分かります。

5年前としては、開発環境として決定版的なテキストエディタが存在しなかったことが大きな原因で、その役割をVimが担っていました。
プラグイン拡張で自分が好きにカスタマイズできることからも大ブレイクになりました。私自身も毎日なにかしら .vimrcの微調整をしていました。 実際にshimma/dotfilesは 610 commits あります。いかに愛情を注いでいたのかお分かり頂けると思います。

JetBrains IntelliJの衝撃

しかし時は流れ、2014年ごろから世の中は変化してきました。 「JetBrainsのIntelliJがなかなか便利らしい。Vim modeもあるらしい」という噂です。一部の熱心なVimユーザたちも次第にJetBrains製品に流れていきました。

ただ個人的には、Vimモードもそうですが 「いちいち細かくカスタマイズしなくてもデフォルトでプロジェクトを解析して、いい感じにコードジャンプなど含めて動いてくれる」 ということが決定打ではないかと感じました。VimにはCtagsと組み合わせるソリューションもありますが、Vim上でカスタマイズして自由自在に動かすには割と敷居が高く、いわゆるカスタマイズ疲れ、ctags疲れが起きていたかもしれません。

次世代エディタ VSCode

さらに時は流れ、マイクロサービス志向も進み、小粒なプロジェクトを行き来するような風潮になってきました。そうするとどうなるか。IntelliJの起動が重い問題が徐々に顕在化しました。IntelliJは便利ですが、地味に起動が重い。実際の業務では1リポジトリだけを開発するケースは稀で、Railsプロジェクト、cookbooksプロジェクト、golangプロジェクトなど複数プロジェクトを横断して作業するようになってきました。IntelliJを複数起動するのも重いですし、メインのRailsだけはIntelliJで起動して、小さいプロジェクトはVimで開いたりしていましたが、それでもエディタをスイッチしたりと、なんとも効率が悪いな、という印象がありました。

その後、VSCode こと Visual Studio Code が登場です。使ってみた感想は「軽くて早い。文字列検索も早い。プラグインも豊富。

試しに今年2018年の4月頃からRailsプロジェクト開発を完全にVSCodeに切り替えたところ、2〜3日で乗り換え完了しました。IntelliJキーバインディングを提供するプラグインもあり、移行はスムーズでした。

Vim vs 普通のテキストエディタ

Vimは「文字編集を自由自在にマウスを使わずに操作できる」ということも一種の大きな強みかと思います。エディタを使っていてエンジニアらしい気持ちよさもあり、開発者を惹きつける要素もありました。

長らくすべての文字入力活動はVimを利用し、日常の文書まで含めてVim一色にしていた時代もありました。しかし最終的な感想としては、普通のテキストエディタのほうが断然編集効率いいです。ピンポイントにマウス/タッチパッドで指定したり、画面スクロールしたりするほうが直感的に早く文字にたどり着けます。GUI最強です。

Vimのモード切り替えを主たる開発から取り除くことは多少最初は抵抗がありましたが、切り替えたらあっという間でした。今までギブスをつけて開発していたのか、というくらいの感覚もありました。
私自身のVimに対する力不足が起因することが多いとは思います。しかし、少なくとも自分にとっては切り替えたことが各種生産性の向上に繋がりました。

VSCodeをメインエディタにして数ヶ月たち、今の結論は「基本をVSCodeで作業し、細かい編集をVimで行うハイブリッド型」 に落ち着いて来ました。VSCodeのショートカットキーで「 Cmd + 2」をターミナルのトグルに設定し、必要あればピョコッとターミナルの小窓を出して、Vim編集に遷移できるようにもしています。

//keybinding.json{"key":"cmd+2","command":"workbench.action.terminal.toggleTerminal","when":"terminalFocus"},{"key":"cmd+2","command":"workbench.action.terminal.focus","when":"!terminalFocus"},

ただ意外とVScodeのターミナルはレンダリングが遅いので、Vimの作業時間が長くなるときは、Hyperのターミナル起動をして、そこからVimでファイル操作をするケースも多いです。
今回はVScodeを使っていても、なおVimで未だに使い続けているプラグインやテクニックについてご紹介したいと思います。(前置き完)

Vim実践テクニックのご紹介

No.1: シェル内のコマンドを1行にまとめたい

種類コマンド備考
ビジュアルモード矩形選択(normal) Ctrl + vdefault
remove_dust(normal) Space+ rvimrc custom
行結合(normal) Shift + jdefault
コマンドリピート(normal) .default

sample6.gif

個人的なポイントとしては、Vimで律儀に一個ずつ適切なキーを考えて叩くよりは、ビジュアルモードを活用したほうが作業が早く終わります。
Vimのマクロ機能などを利用しても実現できますが、矩形選択で直感的に操作したほうが頭を使わなくていいので、ぱっとみて完結できるのであれば、私自身はこちらを使うことが多いです。

余談ですが、昔に Vimの生産性を一撃で高めるシンプルなテクニックという記事を書きましたが、キーリピート速度を上げておくと、行結合がかなり高速で終わるので快適です。(そしてVimに限らず使えるテクニックなのでオススメです。)

参考 vimrc

" https://github.com/shimma/dotfiles/blob/master/.config/nvim/init.vim#L192-L198function!s:remove_dust()let cursor = getpos(".")
    %s/\s\+$//ge
    call setpos(".", cursor)
    unlet cursor
endfunction
command! Rd :calls:remove_dust()" Space+rを押すことでホワイトスペースを除去
nnoremap <silent><Space>r:Rd<CR>

No.2: 特定のJsonでキーから抜き出してRubyの配列作りたい

種類コマンド備考
ビジュアルモード矩形選択(normal) Ctrl + vdefault
sort(command) :sortdefault,
マクロ機能(normal) qqdefault

hyper56.gif

マクロ機能はVimユーザの特権かと思います。Vimはカーソル移動をキータイプで実現するため、マクロとの相性が非常に良いです。デフォルトではノーマルモードで qqと叩くだけで簡単にマクロを登録することができ、 @qで召喚できます。 (正確には qの次の文字はマクロの識別子で、マクロを別々に登録できます。しかし、現実的にはマクロはワンショットでしか利用しないため、打ちやすい qqで登録して、 @qで呼び出すケースが殆どです)

Vimのソート機能も地味に便利です。範囲指定も可能で、部分的にソートをかけることが出来ます。今回の動画のケースは、文字列全体に対してソートを行うことで、コメント行を抜き、同一インデントの箇所だけを抜き出しています。

終わりに

こういった実際のVimの動かし方などは、あまり動画で共有されるものでもないかなと思います。
今後も少しづつ展開して、2018年現在の今でもVimに興味をもっていただける方が増えるきっかけになればいいなと思います。

リクエストがあれば、今後もこのようなVimの記事を出していこうと思います。ご支援よろしくお願いします。

文字列操作 〜SedとVimと、時々、正規表現〜

$
0
0

文字列操作〜SedとVimと、時々、正規表現〜


みなさんSedコマンド使ってますか?
手打ちで文字列編集とかしてません?
正規表現使ってますか?
Vimはエディターの好みの問題なので興味あれば使ってみてください。

今回はSedコマンドと正規表現、Vimでの文字列置換やあれこれを書きます。

Sedコマンドて何者ですか?

Sedコマンド - wikipediaより一部引用
  • sed(セド)は、入力ストリーム(ファイルまたはパイプラインからの入力)に対してテキスト変換などのデータ処理をおこなうために使用されるプログラムである。名称「sed」は「ストリームエディタ」を意味する英語「stream editor」に由来する。
  • sedは、入力を行単位で読み取り、sedスクリプトと呼ばれるシンプルな命令文に従ってテキスト変換などの編集をおこない、また行単位で出力する。基本的には照合ルールに従い場合分けをおこなうフィルタと捉えることができる。オリジナル版のsedはベル研究所のマクマホンによって1973年前後に開発されたUNIXユーティリティで、現在ではコマンドラインをサポートするさまざまなオペレーティングシステムに搭載されている。
  • 大量のテキストファイルに対して一括で定形の処理をおこなう場合に大きな威力を発揮する。正規表現に対応しており、ある条件の範囲内の文字列を探し出して処理することができる。特定の条件に合った文字列を検索し置換するなどの用途に用いる。

テキスト変換などのデータ処理をおこなうために使用されるプログラム

つまりは文字列操作が行えます。
そしてこれ!これが一番強い!そしてVimとの組み合わせもなかなか強い!
※強い=便利

大量のテキストファイルに対して一括で定形の処理をおこなう場合に大きな威力を発揮する。
正規表現に対応しており、ある条件の範囲内の文字列を探し出して処理することができる。
特定の条件に合った文字列を検索し置換するなどの用途に用いる。

実際に使ってみます。

$ cat test.txt
010
035

↑のようなテキストデータがあるとします。
試しに「0 (ゼロ)」を「A」に置換してみましょう!

$ cat test.txt | sed -e "s/0/A/g"
A1A
A35

できました。最初の文字列「010」が「A1A」になってますね。
なぜなら全ての「0」を「A」へ置換したから。

では次に「先頭の『0』のみを『A』へ」置換してみましょう。

$ cat test.txt | sed -E "s/^0/A/g"
A10
A35

できました。先ほどとは若干コマンドが異なります。
sedコマンドでは正規表現を利用する際、オプションに「-e」ではなく「-E」を利用します。
また、「先頭」という条件であるため、「0 (ゼロ)」の前に「^」を記述しています。

では次に、「先頭の『0』を『A』へ、末尾の『0』を『Z』へ」置換してみましょう。

$ cat test.txt | sed -E "s/^0/A/g" | sed -E "s/0$/Z/g"
A1Z
A35

こんな感じ。正規表現便利。

正規表現の実力はこんなもんじゃない

  • 正規表現についてはこちらがわかりやすいです

「『A〜Z』で始まり、何文字か続いた場合『ああああ』に置換」

$ cat test.txt
ABCD_1234_ABCD

$ cat test.txt | sed -E "s/^[A-Z]*/ああああ/g"
ああああ_1234_ABCD

ですとか。使い方は色々。

Vimの小技

エディターとして利用されるVimですが、コマンドによる置換や文字列の操作が可能なのです。
試しにコメントの行を消してみましょう。(.sh ファイルじゃなくても良いです)

$ cat test.sh 
# test# aaaaaaaコマンド書いたよ
# lkfdbjfgjbas:# hoge

このような適当なファイルを用意します。
Vimでファイルを開き、コメント行を意味する「#」を検索、その後マッチした行を削除します。おまけで逆のパターンも。

$ vi test.sh

# 編集モードに入っていない状態で
/#

# 「#」を含む行を削除する場合
:g//d

$ cat test.sh 
コマンド書いたよ

# 「#」を含まない行を削除する場合
:v//d

$ cat test.sh 
# test# aaaaaaa# lkfdbjfgjbas:# hoge

置換もできます。

vi test.sh

# 編集モードに入っていない状態で
:%s/#/@/g

$ cat test.sh 
@ test
@ aaaaaaa
コマンド書いたよ
@ lkfdbjfgjbas:
@ hoge

「#」を「@」へ変換できました。この置換機能では、正規表現も利用できます。

$ cat test.txt
Android_1234
Android_4321
iOS_1234
iOS_4211
1234_Android
1234_iOS

# vimで開いて
vi test.txt

# 検索
/_[0-9]*$# 置換
:%s///g

$ cat test.txt
Android
Android
iOS
iOS
1234_Android
1234_iOS

パッとみてなぜこうなったか理解できたなら、直感で初歩的な正規表現が利用できるようになっているかと思います。

最後に

「別にコマンド使わずにエディタでよくね?」と思われた方へ。

(……きこえますか…今… あなたの…脳中に…直接… 呼びかけています……サイズの大きいファイルだったり……Vim以外のエディタがない環境だった場合…………
インフラをやっていると……大量の……ログを……見る必要が……あるのですよ……)

そんな来るか来ないかもわからない時のためにsedコマンド、Vim、そして正規表現を知っておきたい。
まぁ、Vimでログファイル開いたら死ぬんだけど。。。catとか色々やりようはありますよね!
これらを組み合わせて利用することで作業効率がグッと上がったりすると、僕は思ってます。

少なくともsedと正規表現は覚えていた方が得だと思います。


vim の neocomplete プラグインをインストール

$
0
0

vim の補完プラグイン neocompleteをインストールした時のメモ。

環境は以下。

  • ubuntu 16.10 (Yakkety Yak)
  • vim: version 7.4.1829

requriementsによると、 7.3.885+ with Luaが必須だそうです。

バージョンはOKですが、with Luaかどうかはわからないので確認。

vimを立ち上げて :echo has('lua')してみたら 0でした。
1が返れば with Luaですが without Luaなようです。

with Luaにするには Ubuntu(debian) では以下のパッケージが必要なようです。

  • vim-nox
  • vim-gtk
  • vim-gnome
  • vim-athena
$ sudo apt-get install vim-nox vim-gtk vim-gnome vim-athena

これで再び vim:echo has('lua')すると、、、1が!

あとは、neocomplete.vimをインストール。
私は vim のプラグインはまだ(?) NeoBundleで管理しているので .vimrc

NeoBundle 'Shougo/neocomplete.vim'

を追加してOKでした。

設定サンプル.vimrcを追記するととりあえず補完が機能しているようです!

その他:

  • neocompete.vimの設定については今回はインストール編という事で後々。。。。
  • vimのプラグイン管理は最近は deinが推奨されてるようですね。いつか時間できたら乗り換えます。

プログラミング効率化

$
0
0

vimtutor

terminalでvimtutorと打てば、vimのチュートリアルが行える。

vimium

chromeの拡張機能。コマンドだけでブラウザ操作ができる。

intellij

リモートとローカルのフォルダ構成などを自動マッピングして、自動で同期してくれる。

jsについて

test.js
$(document).ready(function(){});

document(このページ)を読み込み終わったら、function(){}を実行する。

js.test.js
$('.m_tab_item').click(function(){});

m_tab_itemというクラスがついている要素(

など。)をクリックした時にfunction(){}を実行する。

gitについて

git add ./

カレントフォルダをコミット対象として追加する。

git commit -m 'test commit'

コメントtest commitでもってコミット。

git push

自分のいるブランチに対してプッシュ(更新)する。

git branch

自分のいるブランチ名を確認できる

git checkout 'test'

testという名前のブランチに移動する。

git stash

前回のコミットからの変更情報を一時的に別の場所に退避する。プルした時にコンフリクトしたりした場合に、一旦自分の変更を退避させ、プルするといったことをする。

git stash list

stashした変更情報はリスト化されている。一番上が一番新しいやつ。

git stash apply stash@{0}

stash listで確認し、戻したいやつをstash@{0}などで指定する。

git pull origin develop

developという名前のブランチをプル(ローカルに持ってくる)する。

git status

gitに関する現在のステータス情報を取得する。

infinity scroll

testjs
$(window).on('load scroll',function(){$(window).height()+$(window).scrollTop()vardocumentHeight=$(document).height()ここでajax使ってapi叩くその結果からhtmlを作るjqueryinsertAfterhtmlに書き込む

vimで貼りつけ時に自動インデントをしないようにする

$
0
0

ガチのVimmerではないので、よくはまる。
他の場所からコードをコピペでVimに張り付けると、元々ついているインデントに加えてさらにVim側で自動インデントが走ってひどいことに。

貼りつけモードにしてから、貼りつけを行う。

これを先にやっておくことで解決できます。

set paste

vimでclipboardを+にしたいけどならない人向け

$
0
0

初学者です。
vimをコンパイルしたら

$ vim --version | grep clipboard
-clipboard         +jumplist          +persistent_undo   +vertsplit
+emacs_tags        +mouse_dec         -sun_workshop-xterm_clipboard

と、clipboardが-になってしまった。
これを解決した手順の覚え書きです。

vimをコンパイルしたい

ソースコード取得

$ cd /opt/
$ sudo git clone https://github.com/vim/vim 
$ cd vim/

依存したパッケージのソースコード取得

$ sudo apt build-dep vim
Reading package lists... Done
E: You must put some 'source' URIs in your sources.list

できない。終わり。

Ubuntu16.04以降ではデフォルトではソースコードをダウンロードできないらしい。
理由はdeb-srcがコメントアウトされているため。
対応するdeb-srcをコメント解除しろということらしいので、全部解除した。

$ sudo su -c"grep '^deb ' /etc/apt/sources.list | \
sed 's/^deb/deb-src/g' > /etc/apt/sources.list.d/deb-src.list"$ sudo apt update
$ sudo apt build-dep vim

できた。

メイクする

$ sudo ./configure --with-features=huge \--with-x\--enable-multibyte\--enable-luainterp=dynamic \--enable-gpm\--enable-cscope\--enable-fontset\--enable-fail-if-missing\--prefix=/usr/local 
 --enable-pythoninterp=dynamic \--enable-python3interp=dynamic \--enable-rubyinterp=dynamic \--enable-gui=auto \--enable-gtk2-check\$ sudo make
$ sudo make install$ vim --version | grep clipboard
+clipboard         +jumplist          +persistent_undo   +vertsplit
+emacs_tags        +mouse_dec         -sun_workshop      +xterm_clipboard

できた。

参考

大変参考になりました。
Ubuntu 16.04: apt sourceでソースコードをダウンロードする
How to build vim 8 with clipboard support

macにvim8.1とプラグインをインストール

$
0
0

vim8.1がリリースされたので重い腰を上げて数年放置している自分のvim環境をリプレースすることを決意。
以下は軌跡である。

やってみた感想:やれば結構すぐ終わるから面倒くさがらずに早くやればよかった。。。

vim8.1へupdate

$ brew install vim
~略~
$ /usr/local/bin/vim --version
VIM - Vi IMproved 8.1 (2018 May 18, compiled Aug 22 2018 13:55:00)

# .bashrcでvim8.1を向けた。このときvimrcも専用ファイルにした。
alias vi="/usr/local/bin/vim -u ~/.vimrc-local8.1"

いつもの設定を.vimrc-local8.1へ移植

お好みで

" vi互換モードを廃止
set nocompatible

" ステータスバー2行
set laststatus=2

set expandtab     " タブ入力を複数の空白入力に置き換える
set tabstop=2     " 画面上でタブ文字が占める幅
set shiftwidth=2  " 自動インデントでずれる幅
set softtabstop=2 " 連続した空白に対してタブキーやバックスペースキーでカーソルが動く幅
set autoindent    " 改行時に前の行のインデントを継続する
set smartindent   " 改行時に入力された行の末尾に合わせて次の行のインデントを増減する

syntax on

"インクリメンタルサーチを有効にする
set incsearch
" 大文字小文字を区別しない
set ignorecase
" 検索文字ハイライト
set hlsearch

""""""""""" insert mode
" backspace
set backspace=indent,eol,start

" insertモードから抜ける
inoremap <silent> jj <ESC>

" 挿入モードでのカーソル移動
inoremap <C-j> <Down>
inoremap <C-k> <Up>
inoremap <C-n> <Left>
inoremap <C-l> <Right>

プラグイン管理

readmeを参考にしてvimに闇の力を注入する。
今まで使っていたneobundleからリプレース。
https://github.com/Shougo/dein.vim

プラグインインストール

必要なプラグインをインストール
.vimrcにdein#add('#{github path}')を加えて、:call dein#install()でインストールできる

" 例
call dein#add('tpope/vim-fugitive')
Viewing all 5769 articles
Browse latest View live
<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>