Home > Vim Hacks

Vim Hacks Archive

Hack #231: Rubyで入力と出力からメソッド名を自動補完する

こんにちは、ujihisaです。社内Hackathonがあるということで土日に出社したものの、どちらも僕以外全員不参加で涙目でした。

問題

Rubyでメソッド名を補完する方法をHack #229: 動的型付け言語Rubyでメソッド名などを自動補完するで紹介しました。これは、オブジェクトからそのメソッドをすべて網羅することで補完を行うというアプローチでした。

では、オブジェクトと、メソッドを呼び出すことで得られる返り値の両方から補完を行うことはできないのでしょうか。

例示します。Rubyでは、1というオブジェクトから2というオブジェクトを得るには、1に対してsuccまたはnextというメソッドを呼び出すことで実現できます。

1.succ #=> 2

また、[:a, :b, :c]というオブジェクトから:aというオブジェクトを得るには、[:a, :b, :c]というオブジェクトにfirstなどのメソッドを呼び出すことで実現できます。

[:a, :b, :c].first #=> :a

カーソル位置がオブジェクトの直後のメソッド呼び出しの.にあるとき、メソッド名が自動補完されるのを期待するのはごく自然なことと思います。

解決

つい先日リリースされたばかりの、neco-rubymfというneocomplcacheプラギンを用います。

インストール:

  • Rubygemsパッケージmethodfinderをインストールします。

      $ gem install methodfinder
    
  • neocomplcacheプラギンneco-rubymfをインストールします。もしも未だにneocomplcacheをインストールしていなければ、そちらもインストールして下さい。

続いて、'filetype'rubyであるバッファで、以下のように入力します(ただしはカーソルのつもりです。)

1.¶ #=> 2

すると、1というオブジェクトが持つメソッドでかつ返り値が2であるメソッド nextsuccが補完候補にあらわれます。

neco-rubymf

同様に、

[:a, :b, :c].¶ #=> :a

に対して

array

が得られます。

以下に他の例を画像で示します。

1

2

3

※最後の例は確率的に発生します。

ujihisa

Hack #230: Markdown形式の文書を書く2 (quickrun0.5.0対応版)

こんにちは、ujihisaです。11月くらいに来日する予定で、そのときに大規模なVimの勉強会などを開催したいと思っています。発表をしてみたい方は、気軽に @ujm などに英語で連絡ください(*1) 。

問題

VimでMarkdown形式の文書を書くための記事を2年ほど前に執筆し、こちらで公開していました。

ところで先月quickrun version 0.5.0 がリリースされました。その際大きな仕様変更がありました。それについては下記の記事に詳しく掲載されています。

先ほどのHack #52の記事に掲載されている情報のままでは、Markdown形式で執筆中のバッファの内容をHTMLに変換してブラウザで開くことができません。どのようにすればよいのでしょうか。

解決 (1/2)

quickrun 0.5.0はデフォルトで4種類のmarkdown変換機をサポートしています。

  • Markdown.pl (Perl. cpan install Markdownかな?)
  • kramdown (Ruby. gem install kramdown)
  • bluecloth (Ruby. gem install bluecloth)
  • redcarpet (GitHubなどで使われている悪評高いMarkdownエンジン)
  • pandoc (Haskell. cabal install pandoc)

もしも$PATHに上記のコマンドがあれば、それを用いて変換します。優先順位はこの一覧と同じです。

したがって'filetype'markdownであるようなバッファを編集中に:QuickRunすると、上記コマンドのいずれかが呼ばれ、そして編集中バッファをhtmlに変換したものをquickrunウインドウに表示します。なので、この出力先をbufferではなくbrowserにすればそれで問題が解決されます。

~/.vimrcに以下の設定を記述します。

let g:quickrun_config['markdown'] = {
      \ 'outputter': 'browser'
      \ }

ただし、もしもこれまでg:quickrun_configを全く使った事がない自信があるならば、以下の行をその前に記述してください。

let g:quickrun_config = {}

続いてopen-browser.vimがインストール済みかどうか確認します。インストールしていなければ、すぐにいれましょう。

これで'filetype'markdownなバッファから:QuickRun (あるいはデフォルトのキーマッピングである\rの打鍵) で、新しいウインドウが分割されてHTMLが出力されるかわりに、ブラウザが立ち上がってそちらにHTMLがきれいに表示されるはずです。

解決 (2/2)

大抵の方は(1/2)の時点で大丈夫なのですが、しかしASCIIの範囲内に収まらない文書を書く一部の人は、pandocでMarkdownをHTMLに変換した後に、文字化けしたHTMLを見てしまったのではないでしょうか。

この場合はpandocの-sオプションを用います。

let g:quickrun_config['markdown'] = {
      \ 'outputter': 'browser',
      \ 'cmdopt': '-s'
      \ }

おっとしかしpandoc以外でも-sを使われると困ります。間違ってredcarpetなどをインストールしてしまうと、なぜかそちらの方が高い優先度をもっているため、そちらを使われてしまうのです。ここはpandocを使用するよう強制してみましょう。

let g:quickrun_config['markdown'] = {
      \ 'type': 'markdown/pandoc',
      \ 'outputter': 'browser',
      \ 'cmdopt': '-s'
      \ }

実はこのあたりは詳しくはquickrun公式ヘルプに掲載されています。詳しくは:h quickrun-examplesをご覧ください。

補足

現在開発中のquickrun 0.5.1では新機能”hook”というものがつくそうです。いまから楽しみですね!

脚注

  • *1 スペイン語も勉強中ですので、対応可能です。
ujihisa

Hack #229: 動的型付け言語Rubyでメソッド名などを自動補完する

問題

静的型付け言語Haskellでの自動補完はHack #211で紹介しました。このときは補完候補の取得にghc-modという外部コマンドを用いました。補完候補を自動的に出力するためにneocomplcacheというVimプラギンを用いました。

動的型付け言語Rubyにおける自動補完はどのようにすれば達成できるでしょうか。Rubyのように非常に静的な解析が難しい言語では、メソッド名などの候補の取得が非常に困難であることが知られています。そもそも現在参照している式あるいは変数がどのクラスに属しているか、ほとんどのケースでは静的に決定することができません。クラスが分かったとしても、その変数のみが特異メソッドを持っているかもしれません。

解決(1/2)

Rubyでメソッド名を手動補完するために使えるものは、標準添付のvim-rubyというVimプラギンと、m2ymさんによって開発されたRSenseがあります。

vim-rubyは、+rubyであるVim環境(*1)における補完機能を提供します。 Ruby組み込み定数・クラス・グローバル関数(*2)などが補完できます。 詳しくは:h ft-ruby-omniを参照してください(*3)。 補完関数はオムニ補完として定義されているので、デフォルトの設定では、挿入モードで<C-x><C-o>と打鍵することで補完機能を実行することができます。

vim-rubyが諦めた部分は

  • 編集中ファイル内で定義された定数・クラス・メソッドなどへの補完
  • 文脈に応じたメソッド名の補完 (例えば1という数値オブジェクトに対してはFixnumクラスに定義されたメソッドのみが補完されるべき)

です。これらに対応するためには、Rubyのパーサなどを実装する必要があり、かなり大変です。またそもそも処理に時間がかかりすぎ、補完機構としはやりすぎと判断したのかもしれません(*4)。

図1: vim-rubyが正しく補完候補を生成している例

図2: vim-rubyが正しくない補完候補を生成してしまっている例

一方RSenseは、vim-rubyが提供している機能にさらに加えて、上記の諦めた部分にも対応しています。

図3: RSenseが正しく補完候補を生成している例

RSenseの補完関数もオムニ補完として定義されています。デフォルトでは、挿入モード時に<C-x><C-o>と打鍵することで補完のポップアップがでてきます。なお、初回起動時は若干時間がかかりますが、二回目からは非常にすばやいです(*5)。

解決(2/2)

手動補完がいかに実用的でないかは過去のVim Hacksで散々と述べられてきました。

通常の補完ではユーザーが明示的に補完のためのキーを押す必要がありました。つま り、「頭が補完をする」と考えなければ補完ができないのです。これにより、作業効 率が落ちてしまいます。それならばシステムが自動的に判断して、補完のためのキー を押したらどうでしょうか。これでユーザーはやらなければならない作業のみに集中 することができます。Vim7よりオムニ補完が実装されたので、Visual Studioのように 「関数やメンバを補完」は実現できるようになりました。しかし、そこには「自動的 に」が欠けているのです。

Shougo 2009 http://vim-users.jp/2009/07/hack-44/

自動補完を用いましょう。RSenseはneocomplcacheと連携することで自動補完として使うことができます。

RSenseを公式ドキュメントに従ってインストールした上で、~/.vimrcに以下の記述を行ないましょう。

if !exists('g:neocomplcache_omni_patterns')
  let g:neocomplcache_omni_patterns = {}
endif
let g:rsenseUseOmniFunc = 1
if filereadable(expand('~/git/rsense/bin/rsense'))
  let g:rsenseHome = expand('~/git/rsense')

  let g:neocomplcache_omni_patterns.ruby = '[^. *\t]\.\w*\|\h\w*::'
endif

ただし、'~/git/rsense/bin/rsense''~/git/rsense'の部分を自身の環境に合致する内容にしてください。

なお、この設定は、neocomplcache作者により書かれた以下の記事を参考にしています。

http://vinarian.blogspot.com/2010/03/rsenseneocomplcache.html

補足

RSenseですら、特異メソッドには対応していないようです。

a = Object.new
def a.hello
  :world
end
a.

ここからhelloを補完することはできません。(*6)

脚注

  • *1 :versionして+rubyがあるかどうか調べてみてください。まあ、不必要です。
  • *2 本記事の読者がRuby使いには限らないことを考慮して”グローバル関数”と記述しましたが、実際にはRubyに関数は存在しません。Kernelなどに定義されているpなどのメソッドを便宜的にそのように読んでみました。
  • *3 なお、ドキュメントに書かれているからといって実際に動作するとは限りません。私の環境では実際に試してみると動作しないものがたくさんありました…。
  • *4 g:rubycomplete_buffer_loadingg:rubycomplete_classes_in_globalを設定し、かつ+rubyな環境であればそれらにも対応しているとドキュメントに書かれています。お試しください。常用するのはかなり難しいようです。
  • *5 初回起動時にこっそりと補完サーバを立ち上げるためです。なお、Windows環境の場合は特別な設定が必要なようです。詳しくは公式ドキュメントを参照ください。
  • *6 この例だとhelloメソッドが同じバッファで定義されているのでneocomplcacheのバッファ内キーワード補完が働き、helloが補完対象にあらわれます。が、これはオブジェクトaだけでなくすべての対象に働いてしまいます。また、helloの定義がそのバッファ内でないなら、当然ながらお手上げです。

参考文献

Vanrb Lightning Talk Slides: Ruby and Vim

非常にわかりやすい図がたくさんあります。

ujihisa

Hack #228: 見た目を気軽に変更する(その2) ColorRoller版

問題

vim を長い間使用していると、お気に入りの定番カラースキームが3、4種類は決まってくるものです。

お気に入りのカラースキームを探す場合は、

  1. Color Sampler Pack をインストールする。
  2. :Unite colorscheme を駆使して片っ端から気に入るものを探す。

という流れで探すのが便利で手軽だと思います。

:Unite colorscheme によるカラースキームの変更は一つ一つ :colorscheme コマンドでカラースキームを入力する手間に比べればとても手軽です。
しかし、一度お気に入りが決まってしまうと、 もっと手早くカラースキームを切り替えたいと感じる方もいるのではないでしょうか?

問題提起が少し強引な気もしますが、筆者はお気に入りの3、4種類のカラースキームをワンキーで手早く切り替えたいと感じていました。

対処

下記のコードを .vimrc に貼り付けます。

let ColorRoller = {}
let ColorRoller.colors = [
      \ 'molokai_custom',
      \ 'tomorrow_night_custom',
      \ 'lucius_custom',
      \ 'github256_custom',
      \ 'pyte',
      \ 'newspaper',
      \ ]

function! ColorRoller.change()
  let color = get(self.colors, 0)
  " tabpagecolorscheme を使用している場合は↓の "colorscheme" を "Tcolorscheme" に変える。
  silent exe "colorscheme " . color
  redraw
  echo self.colors
endfunction

function! ColorRoller.roll()
  let item = remove(self.colors, 0)
  call insert(self.colors, item, len(self.colors))
  call self.change()
endfunction

function! ColorRoller.unroll()
  let item = remove(self.colors, -1)
  call insert(self.colors, item, 0)
  call self.change()
endfunction

nnoremap <silent><F9>   :<C-u>call ColorRoller.roll()<CR>
nnoremap <silent><S-F9> :<C-u>call ColorRoller.unroll()<CR>

解説

お気に入りのカラースキーム群をローラー( ColorRoller )に見立てて、ローラーを回す( roll )、戻す( unroll )ことで、カラースキームを切り替えます。
roll()<F9>unroll()<S-F9> (Shiftキーを押しながら <F9> )にそれぞれ割り当てています。

使い方

お気に入りのカラースキームを、 ColorRoller.colors に設定して使用します。

tabpagecolorscheme を使用している場合、 ColorRoller.change() 内のコメントを参考に、
silent exe "colorscheme " . color の行を silent exe "Tcolorscheme " . color に変更して使用して下さい。

最後に

これまでに紹介したカラースキームに関する下記の記事も合わせて参考にして下さい。

t9md

Hack #227: surround.vim の囲むルールを独自に拡張する

surround.vim について

テキストを好きな文字列で”囲む”ことに特化したプラグインとして、surround.vim があります。
定番プラグインなので使用している方も多いでしょう。

デフォルトで、テキストを括弧( [([{ 等)や、HTMLタグで囲んだりする事が出来ます。

surround.vim は囲むルール( 以降 surrounding rule と記載 )を拡張する機能を用意しており、ユーザーが独自に surrounding rule を追加することが出来ます。

surrounding rule の拡張

例えば下記のような設定は

autocmd FileType ruby let b:surround_45 = "<% \r %>"

&filetype が ruby 場合に let b:surround_45 = "<% \r %>" を設定しています。

  • b:surround_4545- の ASCII コード番号です。
  • \r は囲まれるテキストが入るプレースホルダです。

上記のように設定すると、

puts "Hello world!"

の行にカーソルを合わせ、ノーマルモードで yss- と入力すると、下記のように eruby のコードとして囲む事ができます。

<% puts "Hello world!" %>

しかし、毎回 ASCII コードを確認して設定するのは面倒なので、 char2nr() を使用し、下記のように設定する方が分かりやすいでしょう。
以下の設定は E で囲まれるテキストをヒアドキュメント化します。

let b:surround_{char2nr("E")} = "<<EOS \r EOS"

surrounding rule のより詳細な説明は :help surround-customizing を参考にして下さい。

さらに簡単に surrounding rule を拡張する

さて、ここまでは前置きで、目的は基本知識の整理だったのでした。
上述の surrounding rule の拡張をより簡単に行う為の、簡単なプラグインを作成しました。

インストール

Vundle を使用している場合以下のコマンドでインストール出来ます。

:BundleInstall t9md/vim-surround_custom_mapping

設定

g:surround_custom_mapping ディクショナリを設定します。
キー に surrounding rule が設定される &filetype 、値には surrounding rule をディクショナリとして設定します。
キー _(アンダースコア)は特殊なキーで、ここに設定された surrounding rule は全てのファイルタイプで利用できるようになります。

例えば下記の様に設定すると

let g:surround_custom_mapping = {}
let g:surround_custom_mapping._ = {
            \ 'p':  "<pre> \r </pre>",
            \ 'w':  "%w(\r)",
            \ }
let g:surround_custom_mapping.ruby = {
            \ '-':  "<% \r %>",
            \ '=':  "<%= \r %>",
            \ }
  • ppre タグで囲む(全てのファイルタイプで有効)
  • w%w() で囲む(全てのファイルタイプで有効)
  • -%<%> で囲む(ruby ファイルのみ)
  • =%<=%> で囲む(ruby ファイルのみ)

という意味になります。

より具体的な例

もともと私がこのヘルパープラグインを作ったのは

  • html を編集していようが、
  • textile を編集していようが、
  • vim のヘルプを編集していようが

p で整形済みテキストとして囲むというように、似た様な意味(=整形済みテキスト)で囲む場合は、指運動を同じにしたかった からです。
意味に対応する指運動(=運指)が別だと覚えるのが大変です。
上記を実現する設定は下記になります。

let g:surround_custom_mapping = {}
let g:surround_custom_mapping.help = {
            \ 'p':  "> \r <",
            \ }
let g:surround_custom_mapping.textile = {
            \ 'p':  "<pre> \r </pre>",
            \ }
let g:surround_custom_mapping.html = {
            \ 'p':  "<pre> \r </pre>",
            \ }

最後に

このプラグインを作った際、surround.vim 作者の tpope さんに Pull Request を送りました。
取り込まれはしませんでしたが、8/7 日頃に「 来月か、再来月位に新しいのを出す予定、それまでこの pull request はオープンにしておくよ。」と返事をくれました。
ですので、もしかすると9月か10月頃には surround.vim のニューバージョンがリリースされ、今回紹介したプラグインは不要になっているかもしれません。

t9md

Hack #226: 複数のキーワードを手軽にハイライトする

問題

vim でファイルを編集している時やログファイルを閲覧している時に特定のテキストを目立たせたいと思ったことはありませんか?
私はあります。
例えば以下のような場合です。

  • tcpdump の ログファイルを vim で閲覧していて特定の MACアドレス、IPアドレスを目立たせたい。
  • ソースコードを編集していて、特定のキーワードの出現を(ハイライトさせて)意識しつつ編集を進めたい。
  • fugitive.vim:Gblame コマンド(git blame)で特定の author を目立たせたい。

もちろん、 :Unite line 、あるいは / で検索してハイライトして目立たせる事は可能ですが、
複数の単語をハイライトさせたい場合は、 / では対応できません。

対処

quickhl.vim を使用すれば、手っ取り早く色を付けることができます。

動画を用意しました。 Youtube: quickhl.vim

※ 同様の事を目的としたプラグインとして、MultipleSearch 等があります。

インストール

quickhl.vim は vim.org や、github から入手可能です。
version 7.2 以上の vim で動作します。

Vundle を使用している場合は下記のコマンドでインストールできます。

:BundleInstall quickhl.vim

設定

quickhl.vim はデフォルトのキーマップを提供しませんので、ユーザーが .vimrc に設定する必要があります。
筆者オススメのキーマップは以下です。

nmap <Space>m <Plug>(quickhl-toggle)
xmap <Space>m <Plug>(quickhl-toggle)
nmap <Space>M <Plug>(quickhl-reset)
xmap <Space>M <Plug>(quickhl-reset)
nmap <Space>j <Plug>(quickhl-match)

上記の設定をした後、ノーマルモードで <Space>m を押すと、カーソル下の単語がハイライトされます。
同じ単語の上で、もう一度、 <Space>m を押すと、ハイライトがクリアされます。
すべてのハイライトをクリアしたい場合は、 <Space>M (スペースの後、大文字M)でクリアできます。

またビジュアルモードでテキストを選択して、 <Space>m を押すと、選択したテキストがハイライトされます。
複数行のテキストブロックのハイライトには対応していません。
ハイライトの追加削除は :QuickhlAdd , :QuickhlDel でも可能ですが、ハイライトしたい欲望は突然やってくるので、キーマップを設定して備えておくのがいいでしょう。

特定の単語を常にハイライトしたい場合は、 g:quickhl_keywords にキーワードを設定します。
例えば .vimrc に以下の様に設定します。

let g:quickhl_keywords = [
    \ "ujihisa",
    \ "tyru",
    \ "Sixeight",
    \ "t9md",
    \ "thinca",
    \ "Shougo",
    \ ]

その他、一時的に特定のバッファでハイライトを無効(Lock)する、 :QuickhlLock コマンド等も用意されています。
詳しくは :help quickhl で確認して下さい。

t9md

Hack #225: VimからURLを開く

問題

Vimで文書を開いているとしばしばURLが記載されていて、 その度にURLをクリップボードにヤンクしてブラウザのアドレスバーにペーストして…と、とても面倒です。 ファイルパスならgf<C-w>fで開けますが、 URLを開くマッピングは用意されていません。 どうすればいいでしょうか。

解決

open-browser.vimを使います。 まずプラグインをインストールし、次の設定を.vimrcに書きます。

let g:netrw_nogx = 1 " disable netrw's gx mapping.
nmap gx <Plug>(openbrowser-smart-search)
vmap gx <Plug>(openbrowser-smart-search)

そしてURLの上にカーソルをのせてgxをタイプするとそのURLをブラウザで開けます。 またgxが思った通りのURLを開いてくれない場合、ヴィジュアルモードでそのURLを選択してからgxをタイプすると選択した通りのURLが開けます。 詳しくは:help open-browserを参照してください。

tyru

Hack #224: Vim Hacks に記事を投稿する

平素は vim-users.jp および Vim Hacks をご覧いただき、まことにありがとうございます。ご存知の方もいるかと思いますが、現在 Vim Hacks Project は執筆者陣が自宅サーバのメンテナンスもままならないほど多忙なため、記事の更新が滞っています。

ところで、Vim Hacks の記事を見ていて、次のように思ったことはないでしょうか。

  • 自分の知っているVimの小ネタを披露したい!
  • 自作または愛用のプラグインを布教したい!
  • Vim Hacksに記事を書いてVimユーザの役に立ちたい!
  • 何でもいいから記事を書いて目立ちたい!

Vim Hacks Project では、執筆者を常に募集しています。定期的に書くのは無理な場合でも、ゲスト扱いで1度だけ書くことも可能です。今回は、Vim Hacks に記事を書くための手順を紹介します。

  1. 何について書くか決める

    記事を書くのですから、まずは何について書くのかを決める必要があります。 内容は、Vim に関係のあることで、読んだ人が幸せになるであろうことです。 あまり難しく考えることはありません。

    既出の場合もあるので、過去の記事も参考にしてみてください。 既出かどうか確認が面倒な場合は、執筆者に聞いてください。

    ちなみに、自信があるならば内容は後で考えても構いません。

  2. 執筆者に連絡を取る

    書くことが決まったら、執筆者の誰かに連絡を取って記事を書きたい旨を伝えます。 Twitter やメールで直接連絡を取ってもいいですし、チャットルーム で宣言しても構いません。 執筆者陣は新しい執筆者に飢えているので、拒否されることはまずありません。気軽に声をかけてください。

    公開日をいつにするかなどはこの辺りで決めることになります。希望がある場合は言ってもらえれば大体通ります。

    現時点での執筆者とその主な連絡先は、この記事の最後にまとめてあります。

  3. vim-users.jp にログインする

    vim-users.jp は OpenID を使って誰でもログイン可能です。面倒なアカウントの発行などはありません。 代わりに、OpenID を用意してください。

  4. 執筆する

    執筆ガイドラインに従って記事を書きます。守るべきことは、以下のことです。

    • ポストする記事にはタグ「Vim Hacks」を付けてください。
    • 難易度別に応じてタグ「lv1」「lv2」「lv3」を付けてください。
      • ポストする人の主観で付けてください。
    • カテゴリー「Vim Hacks」にチェックを入れてください。
    • パーマリンクの末尾はhackNにしてください。Nは数字です。例えばHack #1の場合はhack1です。
      • 特にリンクは後からの変更がきかないので注意してください。合っているか不安な場合は他の執筆者に確認してもらってください。
    • ポストする記事は下書き保存しておき、00:00に自動公開するよう設定してください。
  5. 公開される

    おめでとうございます!これであなたも Vim Hacks Author です。 もしよければ、次に投稿する記事の内容を考えましょう。

現在の執筆者一覧

thinca

Hack #223: テキストを直感的に移動、複製する

textmanip.vim を使えば、選択したテキストブロックを、直感的に移動、複製する事ができるようになります。

と書いても、「よくわからない」という反応が殆どだと思いますので、動画を用意してみました。

Youtube: textmanip.vim

インストール

textmanip.vim は vim.org や、github から入手可能です。

また Vundle でもインストール可能です。

:BundleInstall t9md/vim-textmanip

設定

textmanip.vim はデフォルトのキーマップを自動で設定しませんのでユーザーが設定する必要があります。
筆者オススメのキーマップは下記です。vimrc に設定します。

" 選択したテキストの移動
vmap <C-j> <Plug>(Textmanip.move_selection_down)
vmap <C-k> <Plug>(Textmanip.move_selection_up)
vmap <C-h> <Plug>(Textmanip.move_selection_left)
vmap <C-l> <Plug>(Textmanip.move_selection_right)

" 行の複製
vmap <M-d> <Plug>(Textmanip.duplicate_selection_v)
nmap <M-d> <Plug>(Textmanip.duplicate_selection_n)

その後なんでもいいので、テキストをビジュアルモードで選択し、コントロールキーを押したまま, hjlk を入力してみて下さい。

モノのように移動できましたよね?楽ですよね?便利ですよね?

<M-d> を押すと、選択したテキストが下方向に複製されます。
ノーマルモードで <M-d> を入力すると、カーソルのある行が複製されます。
<M-d>Altキー を押しながら d です。
Mac ユーザーの人は D-d として、 COMMANDキー を押しながら d に設定するといいかもしれません。

※ 本当は C-d を使いたかったのですが、ノーマルモードでの半ページスクロールとキーが被ってしまいます。
※ ビジュアルモードのみ vmap <C-d> <Plug>(Textmanip.duplicate_selection_v) と設定するのも一つの手です。

ユースケース1

Markdown では整形済みテキスト(preブロック)をインデントで表現しますので、複数行をインデントする事がよくあります。

インデントしたいテキストを選択して、<C-l>を数回押して、右にずらします。

ユースケース2

メソッド or 関数を別の引数で複数回呼び出すコードを書く場合を考えます。
例えば次のような関数呼出しがあり、

some_method("a", 1000)

下記のように引数を変えて複数回呼び出したいとします。

some_method("a", 1000)
some_method("b", 2000)
some_method("c", 3000)

まず、some_method("a", 1000)の行にカーソルを合わせます。
<M-d>を2回押して、行を複製します。
あとは引数を微修正すれば完了です。

t9md

Hack #222: カーソル位置を目立たせる

あるファイルを編集中に全く関係のない別の作業をすると、カーソルの位置を見失ってしまうことが多々あります。
そんな場合に少しでも見失い難くするために、カーソル位置を目立たせることが有用です。

‘cursorline’ と ‘cursorcolumn’ を設定することで、現在のカーソル位置をハイライトすることが出来ます。

:set cursorline
:set cursorcolumn

それぞれ、以下の様にすることで、highlight の指定が行なえます。

:highlight CursorLine     xxx term=underline cterm=underline guibg=Grey90
:highlight CursorColumn   xxx term=reverse ctermbg=7 guibg=Grey90

参照資料

Sixeight

ホーム > Vim Hacks

Search
Feeds
Links
  • 公式
  • 勉強会
  • 情報
  • コミュニティ
  • Meta
    Etc
    Creative Commons License
    This blog is licensed under a Creative Commons License.

    Return to page top