私は Vim について長所と短所の両方について多くのことを聞いた。他のどのエディタよりも(開発者として)Vimのほうが速いはずです。私はいくつかの基本的なことをするためにVimを使っていますが、せいぜい10回生産性が低い Vimを使っています。
あなたがスピードについて話すときあなたが気をつけるべきである(あなたはそれらを十分に気にかけないかもしれないがあなたがすべきである)2つのことだけがある:
これが私がなぜVimの生産性がはるかに低いのかを示す2つの例です。
コピー/切り取り&貼り付けずっとやります。現代のすべての編集者と共にあなたが押す Shift 左手で、右手でカーソルを動かしてテキストを選択します。それから Ctrl+C コピーする場合は、カーソルを移動して Ctrl+V 貼り付けます。
Vimではそれは恐ろしいことです。
yy
で1行コピーします(行全体をコピーする必要はほとんどありません)。[number xx]yy
はxx
行をバッファにコピーします。しかし、あなたが望むものを選択したかどうかを正確に知ることはありません。元に戻すには、[number xx]dd
次にu
を実行する必要があります。もう一つの例? 検索と置換。
/
で検索したいものをタイプしてください。そして特殊文字があれば\
each特殊文字の前にを押してから、を押す Enter。そして、Vimを使ったすべてのものはそのようなものです。正しい方法でそれを処理する方法がわからないようです。
私の質問は:
現代の編集者よりも生産的なVimの使い方は何ですか?
あなたはテキストの選択とコピーについて話しています、私はあなたが Vim Visual Mode を見てみるべきだと思います。
ビジュアルモードでは、Vimのコマンドを使ってテキストを選択することができ、それからあなたはその選択で何でもすることができる。
以下の一般的なシナリオを検討してください。
次に一致するかっこを選択する必要があります。
あなたがすることができます:
v%
カーソルが開始/終了括弧の上にある場合vib
カーソルが括弧ブロック内にある場合あなたは引用符の間のテキストを選択したいです:
あなたは中括弧ブロックを選択したい(Cスタイル言語では非常に一般的です):
viB
vi{
ファイル全体を選択します。
ggVG
ビジュアルブロック選択 もう一つの本当に便利な機能です、それはあなたがテキストの長方形の領域を選択することを可能にします、あなたはただ押すだけ Ctrl - V それを開始し、そしてあなたが望むテキストブロックを選択し、そしてヤンク、削除、貼り付け、編集等のようなあらゆるタイプの操作を実行する。編集するのは素晴らしい コラム指向テキスト。
いくつかの生産性のヒント:
スマートな動き
*
および#
は、カーソルを前方または後方に置いてWordを検索します。w
W
b
/e
。 (スペースで区切られた場合のみB
/E
)gg
/G
はファイルの先頭/末尾にジャンプします。%
は、一致する{..}または(..)などにジャンプします。{
/}
は次の段落にジャンプします。'.
は最後に編集した行に戻ります。g;
は最後に編集した位置に戻ります。クイック編集コマンド
I
を挿入します。A
は最後に追加します。o
/O
は、現在の前後に新しい行を開きます。v
/V
/Ctrl+V
ビジュアルモード(テキストを選択するため)Shift+R
C
は行の残りの部分を変更します。コマンドを組み合わせる
ほとんどのコマンドは量と方向を受け入れます。例えば:
cW
= Wordの末尾まで変更3cW
= 3ワードを変更BcW
=フルワードの始まり、フルワードの変更ciW
=内側のWordを変更します。ci"
= ".."の間で内側を変更ci(
=(..)の間でテキストを変更ci<
= <..>の間でテキストを変更します(vimrcではset matchpairs+=<:>
が必要です)4dd
= 4行削除3x
= 3文字を削除します。3s
= 3文字を代入します。便利なプログラマコマンド
r
は1文字を置き換えます(例えば、rd
は現在のcharをd
に置き換えます)。~
は大文字小文字を変更します。J
は2行を結合します.
最後のコマンドを繰り返す(単純なマクロ)==
行のインデントを修正>
インデントブロック(ビジュアルモード)<
unindent block(ビジュアルモード)マクロ撮影
q[ key ]
を押して録音を始めます。q
を押して記録を停止します。@[ key ]
で再生できます。非常に特殊なコマンドや動作を使用することで、VIMは次の行にそれらの正確なアクションを再生できます。 (例:末尾に追加する場合はA、カーソルをWordの先頭または末尾に移動する場合はb
/e
)
よくできた設定の例
# reset to vim-defaults
if &compatible # only if not set before:
set nocompatible # use vim-defaults instead of vi-defaults (easier, more user friendly)
endif
# display settings
set background=dark # enable for dark terminals
set nowrap # dont wrap lines
set scrolloff=2 # 2 lines above/below cursor when scrolling
set number # show line numbers
set showmatch # show matching bracket (briefly jump)
set showmode # show mode in status bar (insert/replace/...)
set showcmd # show typed command in status bar
set ruler # show cursor position in status bar
set title # show file in titlebar
set wildmenu # completion with menu
set wildignore=*.o,*.obj,*.bak,*.exe,*.py[co],*.swp,*~,*.pyc,.svn
set laststatus=2 # use 2 lines for the status bar
set matchtime=2 # show matching bracket for 0.2 seconds
set matchpairs+=<:> # specially for html
# editor settings
set esckeys # map missed escape sequences (enables keypad keys)
set ignorecase # case insensitive searching
set smartcase # but become case sensitive if you type uppercase characters
set smartindent # smart auto indenting
set smarttab # smart tab handling for indenting
set magic # change the way backslashes are used in search patterns
set bs=indent,eol,start # Allow backspacing over everything in insert mode
set tabstop=4 # number of spaces a tab counts for
set shiftwidth=4 # spaces for autoindents
#set expandtab # turn a tabs into spaces
set fileformat=unix # file mode is unix
#set fileformats=unix,dos # only detect unix file format, displays that ^M with dos files
# system settings
set lazyredraw # no redraws in macros
set confirm # get a dialog when :q, :w, or :wq fails
set nobackup # no backup~ files.
set viminfo='20,\"500 # remember copy registers after quitting in the .viminfo file -- 20 jump links, regs up to 500 lines'
set hidden # remember undo after quitting
set history=50 # keep 50 lines of command history
set mouse=v # use mouse in visual mode (not normal,insert,command,help mode
# color settings (if terminal/gui supports it)
if &t_Co > 2 || has("gui_running")
syntax on # enable colors
set hlsearch # highlight search (very useful!)
set incsearch # search incremently (search while typing)
endif
# paste mode toggle (needed when using autoindent/smartindent)
map <F10> :set paste<CR>
map <F11> :set nopaste<CR>
imap <F10> <C-O>:set paste<CR>
imap <F11> <nop>
set pastetoggle=<F11>
# Use of the filetype plugins, auto completion and indentation support
filetype plugin indent on
# file type specific settings
if has("autocmd")
# For debugging
#set verbose=9
# if bash is sh.
let bash_is_sh=1
# change to directory of current file automatically
autocmd BufEnter * lcd %:p:h
# Put these in an autocmd group, so that we can delete them easily.
augroup mysettings
au FileType xslt,xml,css,html,xhtml,javascript,sh,config,c,cpp,docbook set smartindent shiftwidth=2 softtabstop=2 expandtab
au FileType tex set wrap shiftwidth=2 softtabstop=2 expandtab
# Confirm to PEP8
au FileType python set tabstop=4 softtabstop=4 expandtab shiftwidth=4 cinwords=if,Elif,else,for,while,try,except,finally,def,class
augroup END
augroup Perl
# reset (disable previous 'augroup Perl' settings)
au!
au BufReadPre,BufNewFile
\ *.pl,*.pm
\ set formatoptions=croq smartindent shiftwidth=2 softtabstop=2 cindent cinkeys='0{,0},!^F,o,O,e' " tags=./tags,tags,~/devel/tags,~/devel/C
# formatoption:
# t - wrap text using textwidth
# c - wrap comments using textwidth (and auto insert comment leader)
# r - auto insert comment leader when pressing <return> in insert mode
# o - auto insert comment leader when pressing 'o' or 'O'.
# q - allow formatting of comments with "gq"
# a - auto formatting for paragraphs
# n - auto wrap numbered lists
#
augroup END
# Always jump to the last known cursor position.
# Don't do it when the position is invalid or when inside
# an event handler (happens when dropping a file on gvim).
autocmd BufReadPost *
\ if line("'\"") > 0 && line("'\"") <= line("$") |
\ exe "normal g`\"" |
\ endif
endif # has("autocmd")
設定は~/.vimrc
に格納するか、システム全体で/etc/vimrc.local
に格納してから、以下を使用して/etc/vimrc
ファイルから読み取ることができます。
source /etc/vimrc.local
(#
コメント文字をVIMで動作させるためには"
に置き換える必要があります。ここでは適切な構文の強調表示をしたいと思いました)。
ここにリストしたコマンドはかなり基本的なもので、これまで使用してきた主要なものです。彼らはすでに私の生産性をかなり向上させています。
の Control+R メカニズムは非常に便利です:-) 挿入モードまたはコマンドモード(つまり、コマンドを入力するときは:
行に)どちらでも、番号付きまたは名前付きレジスタを続けます。
詳細については:help i_CTRL-R
と:help c_CTRL-R
を参照してください。さらにCTRL-Rの良さについては近くをスヌープしてください。
ここにはたくさんの良い答えがあります、そしてviの禅についての1つの驚くべき答えがあります。私が言及していないことの一つは、vimはプラグインを介して非常に拡張可能であるということです。原作者が考えたことのないあらゆる種類のクレイジーなことを行わせるためのスクリプトとプラグインがあります。これは信じられないほど便利なvimプラグインの例です。
Rails.vimはtpopeによって書かれたプラグインです。それはRails開発をしている人々のための素晴らしいツールです。それはあなたが簡単にコントローラのメソッドから関連するビューへ、モデルへ、そしてそのモデルのユニットテストへとジャンプすることを可能にする魔法の文脈依存の事をします。それはRails開発者として数百時間ではないにしても数十時間を節約しました。
このプラグインを使用すると、ビジュアルモードでテキストの領域を選択し、 Gist.github.com に投稿するためのクイックコマンドを入力できます。これにより、簡単なペーストビンへのアクセスが可能になります。これは、IRCまたはIMを介して他のユーザーと共同作業している場合には非常に便利です。
このプラグインはスペースバーに特別な機能を提供します。スペースバーをピリオドに似たものに変えますが、アクションを繰り返す代わりにモーションを繰り返します。その場で定義した方法でファイルを素早く移動するのに非常に便利です。
このプラグインを使用すると、何らかの方法で区切られているテキストを操作できます。それはあなたに、括弧の中のもの、クォートの中のものなどを表すオブジェクトを与えます。それは、区切られたテキストを操作するために役に立ちます。
このスクリプトは派手なタブ補完機能をvimにもたらします。オートコンプリート機能はすでにvimの中核にありますが、これは複数の異なるマルチキーショートカットではなくクイックタブにそれをもたらします。とても便利で、そして信じられないほど使うのが楽しいです。これはVSのインテリセンスではありませんが、それは素晴らしいステップであり、タブ補完ツールに期待したいと思う多くの機能をもたらします。
このツールは外部の文法チェックコマンドをvimに取り入れます。私は個人的にそれを使ったことはありませんが、私はそれについて素晴らしいことを聞きました、そして概念は打ち負かすのは難しいです。手作業で行わなくても構文をチェックすることは非常に時間の節約になり、最終的にテストを中止するときよりも、導入時に構文上のバグを見つけるのに役立ちます。
Vimの内側からgitに直接アクセスする。繰り返しますが、私はこのプラグインを使ったことはありませんが、ユーティリティを見ることができます。残念ながら、私はsvnが "new"と見なされる文化にいるので、しばらくの間gitが動作しているとは思わないでしょう。
Vim用のツリーブラウザ私は最近これを使い始めました、そしてそれは本当に便利です。ツリービューを縦に分割してファイルを簡単に開くことができます。これは、頻繁に飛び交うソースファイルが多数あるプロジェクトに最適です。
これはメンテナンスされていないプラグインですが、それでも信じられないほど便利です。それは「あいまいな」記述構文を使用してファイルを開く機能を提供します。つまり、スパースツリーのファイルでは、関心のあるファイルを残りの部分から明確にするのに十分な文字を入力するだけで済みます。
Vimには素晴らしいツールがたくさんあります。私はここで表面を傷つけただけだと確信しています、そしてそれはあなたのドメインに適切なツールを探す価値があります。伝統的なviの強力なツールセット、それに対するvimの改良、そしてさらにvimを拡張するプラグインの組み合わせは、これまで考えられてきたテキストを編集するための最も強力な方法の1つです。 Vimはemacs、Eclipse、ビジュアルスタジオ、そしてテキストメイトと同じくらい簡単に強力です。
duwanis のおかげで vimの設定 のおかげで、私はここから多くのことを学び、ほとんどのプラグインを借りてきました。
.
最後のテキスト変更コマンドを繰り返す
私はこれで多くの時間を節約できます。
ビジュアルモードについては前述しましたが、テキストファイルの固定サイズの列を編集するときにブロックビジュアルモードを使用すると、時間が大幅に節約されます。 (Ctrl + Vでアクセス).
gi
最後に編集した場所に移動します(検索を実行し、編集に戻りたい場合に非常に便利です)
^ Pおよび^ N
前のテキスト(^ P)または次のテキスト(^ N)を入力します。
^ Oおよび^ I
前の場所(^O
-"O"
)に移動するか、次の場所(^I
-"I"
のすぐ近くにある"O"
)に移動します。検索を実行したり、ファイルを編集したりすると、これらの「ジャンプ」を前後にナビゲートできます。
私は最近このサイトを発見しました: http://vimcasts.org/ /
それはかなり新しくて本当に本当に良いです。このサイトを運営している人は、textmateからvimに切り替え、特定のvimトピックについて非常によく簡潔にキャストしています。見てみな!
CTRL + Aは立っている数を増やします。
ノーマルモードの全て:
現在行の特定の文字の次のインスタンスに移動するにはf <char>、繰り返すには;を使用します。
現在行の特定の文字の前のインスタンスに移動するにはF <char>、繰り返すには;を使用します。
インテリジェントに使用されるならば、上記の2つはあなたが並んで動き回るのをより速くすることができます。
次のインスタンスを検索するWordの*。
前のインスタンスを検索するWordの#。
a。セッションを保存
:mks セッション名
b。セーブセッションを強制する
:mks! セッション名
c。ロードセッション
gvimまたはvim -S sessionname
a。足し算と引き算
CTRL-A;カーソル位置またはカーソル位置の後ろに、数字または英字に[count]を追加します。 {Viにはない
CTRL-X;カーソル位置またはその後ろにある数字または英字から[count]を引きます。 {Viにはない}
b。ウィンドウキーのマッピング解除
ウィンドウ内では、Ctrl-Aはファイル全体の選択のためにすでにマップされているので、rcファイルにマップ解除する必要があります。 mswin.vim CTRL-Aマッピング部分をコメントとしてマークするか、アンマップでrcファイルを追加します。
c。マクロあり
CTRL-Aコマンドはマクロで非常に役に立ちます。例:番号付きリストを作成するには、次の手順を使用します。
- 最初のリスト項目を作成し、それが番号で始まっていることを確認してください。
- qa - バッファ 'a'への記録を開始
- Y - エントリーをヤンク
- p - エントリのコピーを最初のエントリの下に置きます
- CTRL-A - 数を増やす
- q - 録画を停止
- @a - ヤンクを繰り返し、putとtimesをインクリメントする
先週の仕事で、私たちのプロジェクトは他のプロジェクトから多くのPythonコードを継承しました。残念ながら、そのコードは私たちの既存のアーキテクチャには収まりませんでした - それはすべてグローバル変数と関数で行われていましたが、それらはマルチスレッド環境では動作しませんでした。
オブジェクト指向になるように作り直す必要のある80個までのファイルがありました - すべての関数がクラスに移動された、パラメータが変更された、import文が追加されたなどです。私は一人の人間が手作業でそれをすることが1日に2-4を行うことができると推定するでしょう。
そこで私は最初の1つを手作業で行い、それから変更を自動化するためのvimスクリプトを書きました。そのほとんどはvimコマンドのリストでした。
" delete an un-needed function "
g/someFunction(/ d
" add wibble parameter to function foo "
%s/foo(/foo( wibble,/
" convert all function calls bar(thing) into method calls thing.bar() "
g/bar(/ normal nmaf(ldi(`aPa.
最後のものは少し説明に値する:
g/bar(/ executes the following command on every line that contains "bar("
normal execute the following text as if it was typed in in normal mode
n goes to the next match of "bar(" (since the :g command leaves the cursor position at the start of the line)
ma saves the cursor position in mark a
f( moves forward to the next opening bracket
l moves right one character, so the cursor is now inside the brackets
di( delete all the text inside the brackets
`a go back to the position saved as mark a (i.e. the first character of "bar")
P paste the deleted text before the current cursor position
a. go into insert mode and add a "."
すべてのimport文を生成するなど、さらに複雑な変換をいくつか行うために、Pythonをvimスクリプトに埋め込みました。
数時間の作業の後、少なくとも95%の変換を実行するスクリプトがありました。ファイルをvimで開いて:source fixit.vim
を実行するだけで、ファイルは瞬く間に変換されます。
自動化して結果をテストする価値のない残りの5%を変更する作業はまだ残っていますが、このスクリプトを書くのに1日を費やすことで、何週間もの作業を節約できたと私は思います。
もちろん、これをPythonやRubyのようなスクリプト言語で自動化することは可能でしたが、書くのにははるかに時間がかかり、柔軟性が劣るでしょう。ネストした括弧、例えばbar(foo(xxx))
をfoo(xxx).bar()
に変換します。 Vimはその作業に完璧でした。
組み込みファイルエクスプローラを使用してください。このコマンドは:Explore
であり、これを使用するとソースコードを非常に高速にナビゲートできます。 .vimrc
にこれらのマッピングがあります。
map <silent> <F8> :Explore<CR>
map <silent> <S-F8> :sp +Explore<CR>
エクスプローラを使ってファイルを変更することもできます。私のお気に入りのキーをいくつか投稿します。<F1>
を押すと全リストが表示されます。
cd ..
)私はアメリカ暗号協会の会員です。隔月誌には、さまざまな種類の100以上の暗号文が掲載されています。これらのうちのおよそ15個は「暗号」であり、文字を数字に置き換えたさまざまなタイプの算術問題です。数字の代わりに文字を除いて、これらのうちの2つか3つは数独です。グリッドが完成すると、9つの異なる文字が、グリッド内のどこかに、線、対角線、らせんなどで単語を綴ります。
鉛筆で作業したり、問題を手書きで入力するのではなく、問題をWebサイトのメンバーエリアからダウンロードします。
これらの数独を使って作業するとき、私はviを使います。viが持っている機能を他の編集者がほとんど持っていないからです。解くのが簡単だと思うので、主に文字付きグリッドを番号付きグリッドに変換してから、完成した番号付きグリッドを文字付きグリッドに戻して解決策の単語を見つけます。
問題は9つの文字からなる9つのグループとしてフォーマットされ、2つの行に書かれた-
sがブランクを表します。最初のステップは、これらをそれぞれ9文字の9行にフォーマットすることです。これについて特別なことは何もありません。ただ8つの改行を適切な場所に挿入するだけです。
結果は次のようになります。
T-O-----C
-E-----S-
--AT--N-L
---NASO--
---E-T---
--SPCL---
E-T--OS--
-A-----P-
S-----C-T
したがって、これを数字に変換する最初のステップは、異なる文字のリストを作成することです。まず、ブロックのコピーを作ります。私はカーソルをブロックの一番上に置いてから:y}}p
とタイプします。 :
は私をコマンドモードにし、y
は次の移動コマンドをヤンクします。 }
は次の段落の終わりへの移動なので、y}
はその段落をヤンクします。 }
はカーソルを段落の最後に移動し、p
はカーソルの直後にヤンクしたものを貼り付けます。そのため、y}}p
は次の段落のコピーを作成し、その2つのコピーの間にカーソルを置きます。
次に、それらのコピーの1つを異なる文字のリストに変換します。そのコマンドはもう少し複雑です。
:!}tr -cd A-Z | sed 's/\(.\)/\1\n/g' | sort -u | tr -d '\n'
:
は再び私をコマンドモードにします。 !
は、次のヤンクの内容をコマンドラインでパイプ処理する必要があることを示します。 }
は次の段落をヤンクし、次にコマンドラインはtr
コマンドを使用して大文字以外のすべてを取り除き、sed
コマンドは各行を1行に印刷し、sort
コマンドはそれらの行をソートして重複を除去します。そしてtr
は改行を取り除き、最初の段落を構成していた9行を置き換えて、9行の1文字を区別します。この場合、文字はACELNOPST
です。
次のステップはグリッドの別のコピーを作ることです。そして、私が今識別した文字を使って、それらの文字をそれぞれ1から9の数字に置き換えます。それは簡単です::!}tr ACELNOPST 0-9
。年です。結果:
8-5-----1
-2-----7-
--08--4-3
---4075--
---2-8---
--7613---
2-8--57--
-0-----6-
7-----1-8
これは通常の方法で解決されるか、またはあなたが好むかもしれない数独ソルバーに入力することができます。完成した解は:!}tr 1-9 ACELNOPST
で文字に変換できます。
ごく少数の人に匹敵する力がviにあります。最大の問題は、viのチュートリアルブック、Webサイト、ヘルプファイルなどのほんのわずかなものしか、可能なことの表面にほとんど触れられていないことです。
大量のテキスト操作
どちらかのマクロを通して:
qq
q
@q
(初回)、その後@@
。20@@
あるいは正規表現を通して:
:%s/[fo]+/bar/g
(しかし、注意してください:あなたが後者を行う場合、あなたは2つの問題を抱えるでしょう:)。
私は最近q:
を発見しました。それは「コマンドウィンドウ」を開き、あなたの最新の元モード(コマンドモード)コマンドを表示します。ウィンドウ内を通常どおりに移動できます。また、<CR>
を押すとコマンドが実行されます。編集などもできます。複雑なコマンドや正規表現をいじっていて、全部を再入力したくない場合、または複雑なものが3つ前のコマンドであった場合は、非常に貴重です。それはbashのset -o vi
とほとんど同じですが、vim自体のためです(heh!)。
行ったり来たりするためのより興味深い情報については:help q:
を参照してください。
私は先日Vimの完全な完成を発見しました、そして私はそれが何をするのかについて少しぼんやりしていることを認める間、私はどちらかをつぶすだけで驚くほど良い結果を得ました Ctrl + xCtrl + u または Ctrl + n/Ctrl +p 挿入モードそれほどではない IntelliSense 、しかし私はまだそれを学んでいます。
やってみよう! :help ins-completion
これらはショートカットではありませんが、関連しています。
彼らは私の生産性を高めます。
私がよく使うもう一つの便利なvi "ショートカット"は 'xp'です。これはカーソルの下の文字を次の文字と交換します。
ビジュアルモード
他の何人かの人が言っているように、ビジュアルモードはあなたのコピー/カット&ペーストの問題に対する答えです。 Vimはあなたに 'v'、 'V'、そしてC-vを渡します。 vimの小文字の 'v'は、メモ帳のshiftキーと基本的に同じです。いいことは、あなたがそれを抑える必要がないということです。任意の移動方法を使用して、選択範囲の開始点(または終了点)に効率的に移動できます。次に「v」を押して、効率的な移動テクニックをもう一度使用して、選択のもう一方の端に移動します。それから 'd'か 'y'はあなたがその選択を切り取るかコピーすることを可能にする。
VimのビジュアルモードがJim Dennisのviでのカット/コピー/貼り付けの説明より優れている点は、正確な位置を取得する必要がないということです。時にはあなたが行きたい場所のまわりにあなたを得るより複雑な単一の移動コマンドを考え出すよりもあなたが行きたい場所の大体の近くに到達しそしてそれから他の動きでそれを洗練するために速い動きを使うほうが効率的です。
このようにビジュアルモードを広範囲に使用することのマイナス面は、常に使用する松葉杖になる可能性があることです。しかし、もしあなたがvi(m)の新しい側面を学ぶことに非常に積極的であるなら、これはおそらくあなたに大きな影響を与えません。
また、ビジュアルラインとビジュアルブロックモードは、同じテーマのバリエーションを提供します。これは非常に強力な場合があります。特にビジュアルブロックモードです。
キーボードの有効利用について
私はまた、交互の手がキーボードを使う最も速い方法であるというあなたの主張に反対します。それには真実の要素があります。非常に一般的に言えば、同じものを繰り返し使用するのは遅いです。この原則の最も重要な例は、同じ指でタイプされた連続したキーストロークが非常に遅いということです。あなたの主張はおそらく、このパターンでs/finger/hand /変換を使用するという自然な傾向から生じています。ある程度は正しいですが、効率スペクトルの極端な上限では正しくありません。
ピアニストに聞いてください。連続して数枚の音符を交互に手で弾くのか、片手の指を連続して弾くのが速いのかを尋ねます。 4つのキーストロークを入力する最も速い方法は、手を交替させることではなく、昇順または降順で同じ手の4本の指で入力することです(これを「実行」と呼びます)。あなたがこの可能性を考えれば、これは自明のはずです。
もっと難しい問題はこれを最適化することです。キーボード上の絶対距離を最適化するのはとても簡単です。 Vimはそれをします。 「実行」レベルで最適化することははるかに困難ですが、モーダル編集を使用するvi(m)を使用すると、非モーダルアプローチ(ahem、emacs)よりも可能になります。
Emacsについて
Emacsの熱狂者たちがこの最後の括弧付きのコメントのせいで私の投稿全体を完全に無視しないように、emacsとvimの宗教の違いの根本を説明しなければならないと思います。私はエディタウォーズで話をしたことがないし、またそれをやり直すことはおそらくしないだろうが、私は誰もがこのように違いを説明しているのを聞いたことがないので、ここに行く。違いは次のようなトレードオフです。
Vimはあなたに比類のない生のテキスト編集効率を与えますEmacsはあなたにエディタをカスタマイズしてプログラムする比類のない能力を与えます
盲目のvimの熱狂者たちはvimがスクリプト言語を持っていると主張するでしょう。しかし、それは編集者に役立つように設計された曖昧で特別な言語です。 EmacsにはLISPがあります。十分に言った。これらの最後の2文の意味を理解していない場合、またはその評価を発展させるために関数型プログラミングとLISPについて十分に学びたいという希望がある場合は、vimを使用してください。
Emacsの熱狂者たちは、emacsはviperモードを持っていると主張するでしょう、そしてそれはvimのスーパーセットです。しかし、バイパーモードは標準ではありません。私の理解しているところによると、viperモードはemacsユーザーの大多数には使われていません。これはデフォルトではないので、ほとんどのemacsユーザーはおそらくモーダルパラダイムの恩恵に真の感謝を表明しません。
私の意見では、これらの違いは直交しています。私が述べたように、vimとemacsの利点は両方とも有効であると思います。これは究極の編集者がまだ存在しないことを意味します。 emacsが究極のエディタの基礎となる最も簡単なプラットフォームになるだろうということはおそらく本当でしょう。しかし、モーダル編集はemacsの考え方には根付いていません。 emacsコミュニティは将来的にそのように動くかもしれませんが、それはそれほどありそうもないようです。
それで、あなたが生の編集効率を望むならば、vimを使ってください。スクリプト作成やプログラミングのための究極の環境が欲しいなら、emacsを使ってください。プログラマビリティを重視して両方を使いたい場合は、viperモードのemacsを使用してください(または自分のモードをプログラムしてください)。両方の長所を使いたいのなら、今のところ運が悪いです。
<Ctrl> + W、Vで画面を縦に分割します
<Ctrl> + W、Wはウィンドウ間を移動します
このウィンドウで私が編集しているスクリプトを実行する!python%[args]
任意の行を折り畳むためのビジュアルモードのZF
30分ほどvimのチュートリアルをやってください(ターミナルでvimの代わりにvimtutorを実行してください)。あなたは基本的な動きといくつかのキーストロークを学ぶでしょう、これはあなたが少なくともあなたが以前に使ったテキストエディタと同じくらい生産的になるでしょう。その後、ジム・デニスの答えをもう一度読んでください。
私はt
運動について言及している人が誰もいないことに驚きました。私はdt,
やyt,
の形のパラメータリストでそれを頻繁に使います
誰もctagsについて言及していません。 "あふれんばかりのctags"をダウンロードして、あなたが既にあなたの検索パスに持っている狂ったプレインストールされたバージョンの前にそれを置いてください。あなたが取り組んでいるものは何でも根本的にCdです。例えば、Androidカーネルディストリビューションです。 「ctags -R」と入力します。 "tags"という名前のファイルで、そのディレクトリの下にあるソースファイルのインデックスを作成します。これはすべてのタグを含み、言語を規定していないし、ディレクトリのどこにあっても、1つのファイルに入っているので、クロスランゲージ作業は簡単です。
それからそのフォルダでvimを開いて、:help ctagsでいくつかのコマンドを読んでください。私がよく使う数人:
メソッド呼び出しにカーソルを置いてCTRL-]と入力すると、メソッド定義に移動します。
Ta nameと入力してnameの定義に移動します。
大文字と小文字の区別を無視するには、検索内の任意の場所で\c
を使用します(無視またはスマートケースの設定を上書きします)。例えば。 /\cfoo
または/foo\c
は、foo
、Foo
、fOO
、FOO
などに一致します。
大文字と小文字を区別するには、検索のどこかで\C
を使用してください。例えば。 /\Cfoo
または/foo\C
はfooにのみ一致します。
あなたは生産的な近道について尋ねました、しかし私はあなたの本当の質問がそれであると思います:vimはそれの価値がありますか?このスタックオーバーフローの質問に対する答えは - > "はい"です。
あなたは二つのことに気づいたに違いない。 Vimは強力であり、そしてVimは学ぶのが難しいです。その力の大部分は、その拡張性とコマンドの無限の組み合わせにあります。圧倒されないでください。遅くなります。一度に一つのコマンド、一つのプラグイン。無理をしないでください。
あなたがVimに投入したすべての投資は1000倍を返済するでしょう。あなたはあなたが死ぬ前に何時間もの間テキストエディタの中にいることになるでしょう。 Vimがあなたの仲間になります。
自動インデント:
gg
(文書の先頭に移動します)=
(インデントタイム!)shift-g
(文書の終わりに行く)
.vimrc
ファイルには 'filetype plugin indent on'が必要で、おそらく適切な 'shiftwidth'と 'expandtab'設定が必要です。
複数のバッファ、特に2つのファイルを:bp
と:bn
で比較するためのそれらの間の高速ジャンプ Shift + p または Shift + n)
vimdiff
モード(2つの垂直バッファーに分割し、違いを示す色を付ける)
でエリアコピー Ctrl + v
そして最後に、識別子のタブ補完( "mosh_tab_or_complete"を検索)。それは人生を変える人です。
一番上のポスター - :rに同意しました! commandは very 便利です。
ほとんどの場合、これを「貼り付け」に使用します。
:r!cat
**Ctrl-V to paste from the OS clipboard**
^D
こうすれば:set paste
をいじる必要はありません。
cit - 挿入モードの遷移でタグの内容を空にする
yit - タグの内容をコピーする
編集を早くするための3つ目の基準は、必要なキーストローク数です。私はこれがあなたの他の人よりも重要だと思うでしょう2。vimで、ほとんどすべての操作は私がなじみのある他のどのエディタよりも少ないキーストロークしか必要としません。
あなたはあなたがカット&ペーストで問題を抱えていると述べていますが、それはあなたがVimで一般的なモーションコマンドでより多くの経験を必要とするように聞こえます。カーソルから次のセミコロンにyankします。次の最新の検索に移動します。ynこれらはすべて、修飾キーを押しながらマウスで移動するよりもはるかに高速です。また、CMSの応答のいくつかの例に見られるように、vimのモーションコマンドはCとC++のソースコードでの効率的なナビゲーションのために非常に最適化されています。
「私の生産性を高めるためにどのようにvimを使うのですか」という質問に関しては、答えが「効率的」であることを願っています。
私の最も生産的なvi/Vimのトリックは:
:%s
ファイル内に必要なものを置き換えるために、その場で正規表現を使用できることが大好きです。すべてのテキストエディタは正規表現IMHOをサポートする必要があります。
あなたは置換文字列の中で\ =を使うことができ、私はそれを頻繁にします。
#をマーカーとして使うなど、本質的に番号なしリストがvimにある場合は、それを番号付きリストに変換できます。
# CSSLINT
# PHPCS
# Charlie
# Delta
それが1行目で始まれば、あなたはすることができます
:1,6s/#/\=line(".")/g
に変換する
1 CSSLINT
2 PHPCS
3 Charlie
4 Delta
それが1行目で始まらない場合は、単に数学をしてください。
:16,20s/#/\=line(".") - 15/g
より詳しい情報:help sub-replace-expression
これは私がVimを学ぶのに役立つとわかった別の site です。楽しいよ! :)
VIM Adventures は、VIMのキーボードショートカット(コマンド、動作、および演算子)に基づくオンラインゲームです。それは「ゼルダはテキスト編集を満たしています」ゲームです。 VIMコマンドを練習して記憶するためのパズルゲームです(もちろん、古き良きVIもカバーされています)。急な学習曲線なしでVIMを学ぶのは簡単な方法です。
以下を単純なキーコンボにマッピングした後、以下は私にとって非常に便利です。
パスをたどりながらファイルに飛び込む
gf
既存ファイルのフルパス名を取得
:r!echo %:p
既存ファイルのディレクトリを取得
:r!echo %:p:h
実行コード:
:!Ruby %:p
Rubyの略語
ab if_do if end<esc>bi<cr><esc>xhxO
ab if_else if end<esc>bi<cr><esc>xhxO else<esc>bhxA<cr> <esc>k$O
ab meth def method<cr>end<esc>k<esc>:s/method/
ab klas class KlassName<cr>end<esc>k<esc>:s/KlassName/
ab mod module ModName<cr>end<esc>k<esc>:s/ModName/
現在のプログラムを実行します。
map ,rby :w!<cr>:!Ruby %:p<cr>
現在のプログラムの構文を確認します。
map ,c :w!<cr>:!Ruby -c %:p<cr>
現在のスペックプログラムのすべてのスペックを実行します。
map ,s :w!<cr>:!rspec %:p<cr>
それを開きますirb:
map ,i :w!<cr>:!irb<cr>
rspecの省略:
ab shared_examples shared_examples_for "behavior here" do<cr>end
ab shared_behavior describe "description here" do<cr> before :each do<cr>end<cr>it_should_behave_like "behavior here"<cr><bs>end<cr>
ab describe_do describe "description here" do<cr>end
ab context_do describe "description here" do<cr>end
ab it_do it "description here" do<cr>end
ab before_each before :each do<cr>end<cr>
Railsの略語:
ユーザ認証:
ab userc <esc>:r $VIMRUNTIME/Templates/Ruby/c-users.rb<cr>
ab userv <esc>:r $VIMRUNTIME/Templates/Ruby/v-users.erb<cr>
ab userm <esc>:r $VIMRUNTIME/Templates/Ruby/m-users.rb<cr>
firefoxで視覚的に選択されたURLを開きます。
"function
function open_url_in_firefox:(copy_text)
let g:open_url_in_firefox="silent !open -a \"firefox\" \"".a:copy_text."\""
exe g:open_url_in_firefox
endfunction
"abbreviations
map ,d :call open_url_in_firefox:(expand("%:p"))<cr>
map go y:call open_url_in_firefox:(@0)<cr>
rspec:現在の行を含むspecを実行します。
"function
function run_single_rspec_test:(the_test)
let g:rake_spec="!rspec ".a:the_test.":".line(".")
exe g:rake_spec
endfunction
"abbreviations
map ,s :call run_single_rspec_test:(expand("%:p"))<cr>
rspec-Rails:現在の行を含むスペックを実行します。
"function
function run_single_Rails_rspec_test:(the_test)
let g:rake_spec="!rake spec SPEC=\"".a:the_test.":".line(".")."\""
exe g:rake_spec
endfunction
"abbreviations
map ,r :call run_single_Rails_rspec_test:(expand("%:p"))<cr>
rspec-Rails:現在の行を含むspecをデバッグしながら実行します。
"function
function run_spec_containing_current_line_with_debugging:(the_test)
let g:rake_spec="!rake spec SPEC=\"".a:the_test.":".line(".")." -d\""
exe g:rake_spec
endfunction
"abbreviations
map ,p :call run_spec_containing_current_line_with_debugging:(expand("%:p")) <cr>
html
"abbreviations
"ab htm <html><cr><tab><head><cr></head><cr><body><cr></body><cr><bs><bs></html>
ab template_html <script type = 'text/template' id = 'templateIdHere'></script>
ab script_i <script src=''></script>
ab script_m <script><cr></script>
ab Tpage <esc>:r ~/.vim/templates/pageContainer.html<cr>
ab Ttable <esc>:r ~/.vim/templates/listTable.html<cr>
"function to render common html template
function html:()
call feedkeys( "i", 't' )
call feedkeys("<html>\<cr> <head>\<cr></head>\<cr><body>\<cr> ", 't')
call feedkeys( "\<esc>", 't' )
call feedkeys( "i", 't' )
call include_js:()
call feedkeys("\<bs>\<bs></body>\<cr> \<esc>hxhxi</html>", 't')
endfunction
ジャバスクリプト
"jasmine.js
"abbreviations
ab describe_js describe('description here', function(){<cr>});
ab context_js context('context here', function(){<cr>});
ab it_js it('expectation here', function(){<cr>});
ab expect_js expect().toEqual();
ab before_js beforeEach(function(){<cr>});
ab after_js afterEach(function(){<cr>});
"function abbreviations
ab fun1 function(){}<esc>i<cr><esc>ko
ab fun2 x=function(){};<esc>hi<cr>
ab fun3 var x=function(){<cr>};
"method for rendering inclusion of common js files
function include_js:()
let includes_0 = " <link type = 'text\/css' rel = 'stylesheet' href = '\/Users\/johnjimenez\/common\/stylesheets\/jasmine-1.1.0\/jasmine.css'\/>"
let includes_1 = " <link type = 'text\/css' rel = 'stylesheet' href = '\/Users\/johnjimenez\/common\/stylesheets\/screen.css'\/>"
let includes_2 = "<script type = 'text\/javascript' src = '\/Users\/johnjimenez\/common\/javascripts\/jquery-1.7.2\/jquery-1.7.2.js'><\/script>"
let includes_3 = "<script type = 'text\/javascript' src = '\/Users\/johnjimenez\/common\/javascripts\/underscore\/underscore.js'><\/script>"
let includes_4 = "<script type = 'text\/javascript' src = '\/Users\/johnjimenez\/common\/javascripts\/backbone-0.9.2\/backbone.js'><\/script>"
let includes_5 = "<script type = 'text\/javascript' src = '\/Users\/johnjimenez\/common\/javascripts\/jasmine-1.1.0\/jasmine.js'><\/script>"
let includes_6 = "<script type = 'text\/javascript' src = '\/Users\/johnjimenez\/common\/javascripts\/jasmine-1.1.0\/jasmine-html.js'><\/script>"
let includes_7 = "<script>"
let includes_8 = " describe('default page', function(){ "
let includes_9 = "it('should have an html tag', function(){ "
let includes_10 = " expect( $( 'head' ).html() ).not.toMatch(\/^[\\s\\t\\n]*$\/);"
let includes_11 = "});"
let includes_12 = "});"
let includes_13 = "$(function(){"
let includes_14 = "jasmine.getEnv().addReporter( new jasmine.TrivialReporter() );"
let includes_15 = "jasmine.getEnv().execute();"
let includes_16 = "});"
let includes_17 = "\<bs>\<bs><\/script>"
let j = 0
while j < 18
let entry = 'includes_' . j
call feedkeys( {entry}, 't' )
call feedkeys( "\<cr>", 't' )
let j = j + 1
endwhile
endfunction
"jquery
"abbreviations
ab docr $(document).ready(function(){});
ab jqfun $(<cr>function(){<cr>}<cr>);
Ctrl-w Ctrl-f ............ open file under cursor in new window
Ctrl-6 ................... alternate file
'0 ....................... open last file
:x ....................... close if save
コードの一部にテキストを挿入する:
ctrl + v, (selecting text on multiple lines), I, (type something I want), ESC
テキストを編集してN回実行するためのマクロを記録する:
q, a (or some other letter), (do the things I want to record), q, ESC,
(type N, as in the number of times I want to run the macro), @, a
少しの間質問を無視します(私の答えは下にあります)、vimの問題に役立ついくつかのこと:
:map <C-F> /\V
これにより、Ctrl-Fが検索を開始し、検索の最初の文字が\V
になり、すべての「マジック」がオフになるため、何もエスケープする必要がありません(PsPadのように)。
" CTRL-X and SHIFT-Del are Cut
vnoremap <C-X> "+x
vnoremap <S-Del> "+x
" CTRL-C and CTRL-Insert are Copy
vnoremap <C-C> "+y
vnoremap <C-Insert> "+y
" CTRL-V and SHIFT-Insert are Paste
map <C-V> "+gP
map <S-Insert> "+gP
cmap <C-V> <C-R>+
cmap <S-Insert> <C-R>+
(Vimディストリビューションからmswin.vimから直接取得)。これにより、コピーと貼り付けのためにCtrl-C、Ctrl-Vなどが与えられます。
個人的には、標準のVimではコピーと貼り付けがはるかに優れていると感じています。 Vimでは、カーソルを行に置くことができ、yy
と入力してコピーし、10p
と入力して10個のコピーを貼り付けます。 Align プラグインを使用すると、Ctrl-V
(上記のウィンドウマッピングが使用されていない場合)を使用して、作成された数字の列を視覚的にブロック選択できます。 :II
その後、数値の列を自動インクリメントします。同様に、 YankRing を使用すると、10行(またはそれ以上)を次々とコピーして、次々に貼り付けることができます。
Vimが私をより生産的にする方法に関しては、tagsファイルは、これなしではできなかった1つのことだと思います。カーソルがタグの上にあるとき、Ctrl-]
を押して関数に移動し(Ctrl-Tを押して好きなだけレベルを返します)、,p
を押して関数またはマクロの定義を開きます(プレビューウィンドウ(:pclですぐに閉じることができます)または[i
でステータスバーにマクロ定義を表示するだけです。複雑なソースコードをナビゲートするために、これらのツールは非常に貴重です。
ただし、プレビューウィンドウは.vimrcのマッピングに依存します。
:map ,p :ptag <C-R><C-W><CR>
タグファイルでは、エラーをより明確に示す構文の強調表示(認識されたタグを強調表示し、認識されていないタグを強調表示しない)および タグ署名 を移動するときに、いくつかの(私の)プラグインを使用できますキーワードの上にマウスを置きます。
http://www.viemu.com/a-why-vi-vim.html は良い提唱記事です。それは使用の力を説明します . 最後の編集を繰り返すためのコマンド。
コピー/カット&ペースト私はいつもやります。すべての古典的なエディタでは、左手でShiftキーを押しながらテキストを選択するために右手でカーソルを動かします。 Ctrl + Cキーを押してカーソルを移動し、Ctrl + Vキーを押します。
Vimではそれは恐ろしいことです。
* yy to copy one line (you almost never want the whole line!) * [number xx]yy to copy xx lines into the buffer. But you never know
あなたが欲しいものを選択したのとまったく同じです。元に戻すには[number xx] ddしてからuを実行する必要があります。
私は他の答えがよりよく説明したと確信しています、しかしあなたは間違っています。私はよくビジュアルモードを使用してヤンクや削除するテキストを選択します。これはあなたのshift + selectの例に似ていますが、ここではVimには明らかに利点があります。 yyはすばらしいコマンドですが、1行全体をヤンクしたい場合は、代わりにVyを使用することがよくあります。
コピー/切り取りと貼り付け特にビジュアルモードを使用すると、他のエディタからの適応がはるかに簡単になります。だから私は通常カットアンドペーストする方法は次のとおりです。
v
- ビジュアルモードをオンにするw
、e
、b
が便利です(それぞれ次のWordの先頭、次のWordの末尾、この/前のWordの先頭に移動する)。d
- テキストを切り取ります(テキストをコピーする場合はy
を使用してください)p
- 貼り付け(これは現在の文字の後に貼り付け、P
は現在の文字の前に貼り付けます。V
を使用してビジュアルモード(line)に入ることもできます。カーソルがその行にある場合は、自動的に行全体が選択されます。
あなたの.vimrcに入れてください:
noremap; :
この方法でcommmandmodeを入力するのは簡単です。;q
または;w
が動作し、代わりに:q
または:w
が動作します。
3つではなく2つのキーストロークで、これが非常に頻繁に必要になります。
sysadminsには悪い 、どこのボックスでも同じであるためには、箱から出して同じ機能を提供する必要がある。
しかし、 _巨大な_ プログラマのための改善 viを使う。
実際、私はいつもバッファを失っていたので、私が通常ある範囲の行をコピーする方法はそれを一時ファイルに書いてからそれを適切な場所に読み込むことです。
例えば.
ka(マークを設定)
'、 w! t(マークからすべてをファイルtにコピーする)
カーソルを動かします.
:.r t(tを現在の場所に読み込む).
これはおそらくバッファを使うよりもキーストロークが少なくて済み、追跡するのがより簡単で、そしてあなたは長い間存続しているペーストファイルを持つことができます。私はスピードのために、通常ファイルに1文字の名前を使います。
これが速い主な理由は、カーソルを自分の周りに移動させるには、検索機能 "/"を使用し、目的の場所に到達する前に別のパターンの出現に遭遇した場合は "n"を使用することです。
あなたはレジスタの内容を検索することができます。
あなたのレジスタx
に次のものが含まれているとします。
検索する文字列
この文字列を検索するには、通常モードで入力する必要があります
/CTRL-rxENTER
x
レジスタの内容を貼り付けます。
Viのgrokkingについてのすばらしい返信に加えて、vim doesがviコマンドをより使いやすくするいくつかの非常にviに似た機能を追加することに注意する必要があります。最初に思い浮かぶのはテキストオブジェクトです。現在の段落を再フォーマットする{!}fmt
の代わりに、!apfmt
は同じことを行います。最初に、現在のparagraphであるa
テキストオブジェクトを選択することを指定することで機能します。同様に、現在の文字列リテラルを変更するには(例としてfoo
をbar
に)、T"ct"bar
の代わりに(前の"
の直後に移動し、change次の"
の直前まで、bar)を挿入し、ci"bar
:と言うことができます:(最も内側の)引用符の変更、barの挿入。
移動コマンドではなくテキストオブジェクトの観点から考えるのは非常に良いことです。
たくさんのvimのトリックがありますが、今のところ、私が本当に楽しんでいるのは Ctrl+A 私はたまたまいくつかのst ** dコードをハードコードする配列インデックスを扱っているので。
一連のvimコマンドggVGg?
は、現在の文書のテキストにRot13暗号を適用します。
Gung vf zl zbfg cebqhpgvir fubegphg fvapr V nyjnlf glcr va Ebg13。
行のクイックカットおよび上書き部分:
行を編集する際の非常に一般的なタスクは、現在のカーソル位置から特定の場所まで切り取り、新しいコンテンツを上書きすることです。
次のコマンドを使用できます。
ct<identifier>
前方切断用。
cT<identifier>
後方カット用。
切り取りたい行の文字はどこにありますか。
例:これを編集したい行であり、カーソルがI
にあるとしましょう。
Hi There. I am a Coder and I code in : Python and R
。
:
まで切り取り、I am a programmer
で上書きしたい場合は、ct:
と入力し、I am a programmer
と入力します。これにより、Hi There. I am a programmer: Python and R
が生成されます。
行のクイック削除部分:
上記のように、次のコマンドは現在のカーソル位置から「識別子」までコンテンツを削除します
dt<identifier>
前方削除
dT<identifier>
後方削除用
これがあなたにも役立つことを願っています。
私の.vimrcのnnoremap q; q:
は、複雑な検索と置換を作成するときの流れを維持します。