diff options
-rw-r--r-- | runtime/doc/tags | 1 | ||||
-rw-r--r-- | runtime/doc/todo.txt | 24 | ||||
-rw-r--r-- | runtime/doc/version7.txt | 8 | ||||
-rw-r--r-- | runtime/tutor/tutor.ja.utf-8 | 612 | ||||
-rw-r--r-- | src/eval.c | 35 | ||||
-rw-r--r-- | src/ex_cmds.c | 14 | ||||
-rw-r--r-- | src/ex_cmds.h | 4 | ||||
-rw-r--r-- | src/ex_cmds2.c | 2 | ||||
-rw-r--r-- | src/globals.h | 9 | ||||
-rw-r--r-- | src/main.c | 102 | ||||
-rw-r--r-- | src/misc1.c | 4 | ||||
-rw-r--r-- | src/misc2.c | 10 | ||||
-rw-r--r-- | src/proto/window.pro | 2 | ||||
-rw-r--r-- | src/screen.c | 21 | ||||
-rw-r--r-- | src/search.c | 2 | ||||
-rw-r--r-- | src/structs.h | 70 | ||||
-rw-r--r-- | src/version.h | 4 |
17 files changed, 619 insertions, 305 deletions
diff --git a/runtime/doc/tags b/runtime/doc/tags index 9c49ee714..fdaa136f4 100644 --- a/runtime/doc/tags +++ b/runtime/doc/tags @@ -5429,7 +5429,6 @@ hebrew hebrew.txt /*hebrew* hebrew.txt hebrew.txt /*hebrew.txt* help various.txt /*help* help-context help.txt /*help-context* -help-tags tags 1 help-translated various.txt /*help-translated* help-xterm-window various.txt /*help-xterm-window* help.txt help.txt /*help.txt* diff --git a/runtime/doc/todo.txt b/runtime/doc/todo.txt index bcdc52c1c..2912a5884 100644 --- a/runtime/doc/todo.txt +++ b/runtime/doc/todo.txt @@ -1,4 +1,4 @@ -*todo.txt* For Vim version 7.0aa. Last change: 2006 Feb 16 +*todo.txt* For Vim version 7.0aa. Last change: 2006 Feb 17 VIM REFERENCE MANUAL by Bram Moolenaar @@ -32,19 +32,12 @@ be worked on, but only if you sponsor Vim development. See |sponsor|. Support WINDOW TABS. Works like several pages, each with their own split windows. Let's call them "tab pages". - - check all places where lastwin is used - - check all places where win_valid() is used - - check all places where last_window() is used - - ":tabclose N" close tab N - - Add ":tabonly" - close all other tabs. - - check all places wheren only_one_window() is used. - Add tabpage(): returns current tab page number. - ":tabsplit" makes a copy of the current tab page. - Add TabLeavePre and TabEnterPost autocommands - line at top of frame with tabs. Add 'tabtext' option, like 'statusline'. - - make a diff for each tab page separately. - - E999 + - check for E999 - docs: General remark: commands that work on windows only work on the windows in the current tab page. Including :windo. @@ -54,7 +47,10 @@ windows. Let's call them "tab pages". :tab N :tabs {count}gt + :close may close current tab page if there is one window. :tabclose + :tabclose N - close tab N + :tabonly - close all other tabs. :close and :quit (last window in tab) "gt": Use "1gt" - "99gt" to switch to another tab. "gt" goes to the next one. Hint in docs: To mess with another buffer, without @@ -65,15 +61,23 @@ windows. Let's call them "tab pages". X closes current tab page :argall and :ball only opens window for buffers that are not in any window in any tab page - :diffoff only in the current tab page + :diffoff only works in the current tab page + diff works per tab page + "vim -p *" opens each file in a separate tab page (up to 10). - add GUI Tabs for some systems. Patch for GTK 1.2 passed on by Christian Michon, 2004 Jan 6. Simple patch for GTK by Luis M (nov 7). - Need to be able to search the windows in inactive tabs, e.g. for the quickfix window. +Future enhancements: + tab page local variables? + tab page local options? 'diffopt' could differ between tab pages. + tab page local colors? Crash with X command server (Ciaran McCreesh). +Motif: in diff mode dragging one scrollbar doesn't update the other one. + Ctags still hasn't included the patch. Darren is looking for someone to do maintanance. diff --git a/runtime/doc/version7.txt b/runtime/doc/version7.txt index 7bfc4ec8d..7f7c092c3 100644 --- a/runtime/doc/version7.txt +++ b/runtime/doc/version7.txt @@ -1,4 +1,4 @@ -*version7.txt* For Vim version 7.0aa. Last change: 2006 Feb 16 +*version7.txt* For Vim version 7.0aa. Last change: 2006 Feb 17 VIM REFERENCE MANUAL by Bram Moolenaar @@ -750,6 +750,9 @@ from happening. ":breakadd here" and ":breakdel here" can be used to set or delete a breakpoint at the cursor. +It is now possible to define a function with: > + :exe "func Test()\n ...\n endfunc" + The tutor was updated to make it simpler to use and added text to explain a few more important commands. Used ideas from Gabriel Zachmann. @@ -1701,4 +1704,7 @@ event that removed the balloon again. Ignore the key release event. ":set background&" didn't use the same logic as was used when starting up. +When "umask" is set such that nothing is writable then the viminfo file would +be written without write permission. (Julian Bridle) + vim:tw=78:ts=8:ft=help:norl: diff --git a/runtime/tutor/tutor.ja.utf-8 b/runtime/tutor/tutor.ja.utf-8 index ae5677ba3..e12cd6986 100644 --- a/runtime/tutor/tutor.ja.utf-8 +++ b/runtime/tutor/tutor.ja.utf-8 @@ -1,25 +1,26 @@ =============================================================================== -= V I M 教 本 (チュートリアル) へ よ う こ そ - Version 1.5 = += V I M 教 本 (チュートリアル) へ よ う こ そ - Version 1.7 = =============================================================================== - Vim は、このチュートリアルで説明するには多すぎる程のコマンドを備えた - 非常に強力なエディターです。このチュートリアルは、あなたが Vim - を万能エディターとして使いこなせるようになるのに十分なコマンドについて - 説明をするようなっています。 + Vim は、このチュートリアルで説明するには多すぎる程のコマンドを備えた非常 + に強力なエディターです。このチュートリアルは、あなたが Vim を万能エディ + ターとして使いこなせるようになるのに十分なコマンドについて説明をするよう + なっています。 - チュートリアルを完了するのに必要な時間は、覚えたコマンドを試すのにどれ - だけ時間を使うのかにもよりますが、およそ25〜30分です。 + チュートリアルを完了するのに必要な時間は、覚えたコマンドを試すのにどれだ + け時間を使うのかにもよりますが、およそ25から30分です。 - 学ぶコマンドにはこの文章を変更するものもあります。練習を始める前にコ - ピーを作成しましょう("vimtutor"したならば、既にコピーされています)。 + ATTENTION: + 以下の練習用コマンドにはこの文章を変更するものもあります。練習を始める前 + にコピーを作成しましょう("vimtutor"したならば、既にコピーされています)。 - このチュートリアルが、使うことで覚えられる仕組みになっていることを、心 - しておかなければなりません。正しく学習するにはコマンドを実際に試さなけ - ればならないのです。文章を読んだだけならば、きっと忘れてしまいます!。 + このチュートリアルが、使うことで覚えられる仕組みになっていることを、心し + ておかなければなりません。正しく学習するにはコマンドを実際に試さなければ + ならないのです。文章を読んだだけならば、きっと忘れてしまいます!。 - さぁ、Capsロック(Shift-Lock)キーが押されていないことを確認した後、 - 画面にレッスン1.1 が全部表示されるところまで、j キーを押してカーソルを - 移動しましょう。 + さぁ、Capsロック(Shift-Lock)キーが押されていないことを確認した後、画面に + レッスン1.1 が全部表示されるところまで、j キーを押してカーソルを移動しま + しょう。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ レッスン 1.1: カーソルの移動 @@ -33,15 +34,15 @@ 1. 移動に慣れるまで、スクリーンでカーソル移動させましょう。 2. 下へのキー(j)を押しつづけると、連続して移動できます。 ----> これで次のレッスンに移動する方法がわかりましたね。 + これで次のレッスンに移動する方法がわかりましたね。 3. 下へのキーを使って、レッスン1.2 に移動しましょう。 -NOTE: 何をタイプしているか判らなくなったら、<ESC>を押してノーマルモードにしま - す。それから入力しようとしていたコマンドを再入力しましょう。 +Note: 何をタイプしているか判らなくなったら、<ESC>を押してノーマルモードにし + ます。それから入力しようとしていたコマンドを再入力しましょう。 -NOTE: カーソルキーでも移動できます。しかし hjkl を使用することに一度慣れてしま - えば、はるかに速く移動することができるでしょう。 +Note: カーソルキーでも移動できます。しかし hjkl に一度慣れてしまえば、はるか + に速く移動することができるでしょう。いやマジで! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ レッスン 1.2: VIM の起動と終了 @@ -52,27 +53,27 @@ NOTE: カーソルキーでも移動できます。しかし hjkl を使用す 1. <ESC>キーを押しましょう。(確実にノーマルモードにするため) 2. 次のようにタイプ: :q! <ENTER> + これにより編集した内容を保存せずにエディタが終了します。 ----> これにより編集した内容を保存せずにエディタが終了します。 - 編集内容を保存して終了するときは次のようにタイプします: - :wq <ENTER> - - 3. シェルプロンプトからチュートリアルを始めるにはコマンドをタイプします。 + 3. シェルプロンプトが出てきたら、このチュートリアルを始める為ににコマンド + をタイプします。 そのコマンドは: vimtutor <ENTER> - 通常はこうでしょう: vim tutor <ENTER> - ----> 'vim' は Vim エディタの起動を、'tutor' は編集したいファイルを意味します。 4. これまでのステップを覚え自信がついたならば、ステップ 1 から 3 までを実 - 際に試して、Vim を1度終了してから再び起動しましょう。それからレッスン - 1.3までカーソルを移動させましょう。 + 際に試して、Vim を1度終了してから再び起動しましょう。 + +NOTE: :q! <ENTER> は全ての変更を破棄します。レッスンにて変更をファイルに保 + 存する方法についても勉強していきましょう。 + + 5. 1.3までカーソルを移動させましょう。 + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ レッスン 1.3: テキスト編集 - 削除 ** ノーマルモードにてカーソルの下の文字を削除するには x を押します ** - 1. 以下の ---> と記されたされた行にカーソルを移動しましょう。 + 1. 以下の ---> と示された行にカーソルを移動しましょう。 2. 間違いを修正するために、削除する最初の文字までカーソルを移動します。 @@ -82,7 +83,7 @@ NOTE: カーソルキーでも移動できます。しかし hjkl を使用す ---> その ううさぎ は つつきき を こええてて とびはねたた - 5. 行が正しくなったら、レッスン 1.4 に移りましょう。 + 5. 行が正しくなったら、レッスン 1.4 へ進みましょう。 NOTE: 全てのレッスンを通じて、覚えようとするのではなく実際にやってみましょう。 @@ -95,15 +96,15 @@ NOTE: 全てのレッスンを通じて、覚えようとするのではなく ** ノーマルモードにてテキストを挿入するには i を押します ** - 1. 以下の ---> と記されたされた最初の行にカーソルを移動しましょう。 + 1. 以下の ---> と示された最初の行にカーソルを移動しましょう。 - 2. 1行目を2行目と同じ様にするために、テキストを挿入しなければならない位 - 置の次の文字にカーソルを移動します。 + 2. 1行目を2行目と同じ様にするために、テキストを挿入しなければならない位置 + の次の文字にカーソルを移動します。 3. i キーを押してから、追加が必要な文字をタイプしましょう。 - 4. 間違いを修正したら <ESC> を押してコマンドモードに戻り、正しい文に - なる様にステップ 2 から 4 を繰り返しましょう。 + 4. 間違いを修正したら <ESC> を押してコマンドモードに戻り、正しい文になる様 + にステップ 2 から 4 を繰り返しましょう。 ---> この には 足りない テキスト ある。 ---> この 行 には 幾つか 足りない テキスト が ある。 @@ -113,6 +114,52 @@ NOTE: 全てのレッスンを通じて、覚えようとするのではなく ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + レッスン 1.5: テキスト編集 - 追加 + + + ** テキスト追加するには A を押しましょう ** + + 1. 以下の ---> と示された最初の行にカーソルを移動しましょう。 + カーソルがその文字上にあってもかまいません。 + + 2. 追加が必要な場所で A をタイプしましょう。 + + 3. テキストを追加し終えたら、 <ESC> を押してノーマルモードに戻りましょう。 + + 4. 2行目の ---> と示された場所へ移動し、ステップ 2 から 3 繰り返して文法を + 修正しましょう。 + +---> ここには間違ったテキストがあり + ここには間違ったテキストがあります。 +---> ここにも間違ったテキス + ここにも間違ったテキストがあります。 + + 5. テキストの追加が軽快になってきたらレッスン 1.6 へ進みましょう。 + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + レッスン 1.6: ファイルの編集 + + + ** ファイルを保存して終了するには :wq とタイプします ** + + !! NOTE: 以下のステップを実行する前に、まず全体を読んでください!! + + 1. レッスン 1.2 でやったように :q! をタイプして、このチュートリアルを終了 + します。 + + 2. シェルプロンプトでこのコマンドをタイプします: vim tutor <ENTER> + 'vim'が Vim エディタを起動するコマンド、'tutor' は編集したいファイルの + 名前です。変更してもよいファイルを使いましょう。 + + 3. 前のレッスンで学んだように、テキストを挿入、削除します。 + + 4. 変更をファイルに保存します: :wq <ENTER> + + 5. vimtutor を再度起動し、以下の要約へ進みましょう。 + + 6. 以上のステップを読んで理解した上でこれを実行しましょう。 + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ レッスン 1 要約 @@ -127,14 +174,14 @@ NOTE: 全てのレッスンを通じて、覚えようとするのではなく 4. カーソルの下の文字を削除するには、ノーマルモードで x とタイプします。 5. カーソルの位置に文字を挿入するには、ノーマルモードで i とタイプします。 - i テキストのタイプ <ESC> + i テキストのタイプ <ESC> カーソル位置に追加 + A テキストの追加 <ESC> 行末に追加 -NOTE: <ESC> キーを押すとノーマルモードに移行します。その際、間違ったり入力途中 - のコマンドを取り消すことができます。 +NOTE: <ESC> キーを押すとノーマルモードに移行します。その際、間違ったり入力途 + 中のコマンドを取り消すことができます。 さて、続けてレッスン 2 を始めましょう。 - ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ レッスン 2.1: 削除コマンド @@ -143,7 +190,7 @@ NOTE: <ESC> キーを押すとノーマルモードに移行します。その 1. ノーマルモードであることを確認するために <ESC> を押しましょう。 - 2. 以下の ---> と記されたされた行にカーソルを移動しましょう。 + 2. 以下の ---> と示された行にカーソルを移動しましょう。 3. 消したい単語の先頭にカーソルを移動しましょう。 @@ -154,7 +201,7 @@ NOTE: <ESC> キーを押すとノーマルモードに移行します。その ---> この 文 紙 には いくつかの たのしい 必要のない 単語 が 含まれて います。 - 5. 3 から 4 までを文が正しくなるまで繰り返し、レッスン 2.2 に移りましょう。 + 5. 3 から 4 までを文が正しくなるまで繰り返し、レッスン 2.2 へ進みましょう。 @@ -166,7 +213,7 @@ NOTE: <ESC> キーを押すとノーマルモードに移行します。その 1. ノーマルモードであることを確認するのに <ESC> を押しましょう。 - 2. 以下の ---> と記されたされた行にカーソルを移動しましょう。 + 2. 以下の ---> と示された行にカーソルを移動しましょう。 3. 正しい文の末尾へカーソルを移動しましょう(最初の . の後です)。 @@ -175,77 +222,123 @@ NOTE: <ESC> キーを押すとノーマルモードに移行します。その ---> 誰かがこの行の最後を2度タイプしました。 2度タイプしました。 - 5. どういうことか理解するために、レッスン 2.3 へ移りましょう。 + 5. どういうことか理解するために、レッスン 2.3 へ進みましょう。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Lesson 2.3: コマンドと目的語 + レッスン 2.3: オペレータとモーション + + 多くのコマンドはオペレータとモーションからテキストに変更を加ます。 + 削除コマンド d のオペレータは次の様になっています: - 削除コマンド d の形式は次の様になっています: + d モーション - [回数] d 目的語 もしくは d [回数] 目的語 それぞれ: - 回数 - そのコマンドを何回繰り返すか(省略可能, 省略した時は =1)。 - d - 削除コマンド。 - 目的語 - 何に対して働きかけるか(以下に挙げます)。 + d - 削除コマンド。 + モーション - 何に対して働きかけるか(以下に挙げます)。 - 目的語一覧: + オペレータの一部一覧: w - カーソル位置から空白を含む単語の末尾まで。 e - カーソル位置から空白を含まない単語の末尾まで。 $ - カーソル位置から行末まで。 -NOTE: 冒険したい人は、ノーマルモードにてコマンドなしに目的語を押して + つまり de とタイプすると、カーソル位置から単語の終わりまでを削除します。 + +NOTE: 冒険したい人は、ノーマルモードにてコマンドなしにモーションを押して みましょう。カーソルが目的語一覧で示される位置に移動するはずです。 +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + レッスン 2.4: モーションにカウントを使用する + + + ** 何回も行いたい繰り返しのモーションの前に数値をタイプします。 ** + + 1. 以下の ---> と示された業の先頭にカーソルを移動します。 + + 2. 2dw をタイプして単語2つ分移動します。 + + 3. 3e をタイプして3つ目の単語の終端に移動します。 + + 4. 0 (ゼロ)をタイプして行頭に移動します。 + + 5. ステップ 2 と 3 を違う数値と使って繰り返します。 + +---> This is just a line with words you can move around in. + + 6. レッスン 2.5 に進みましょう。 + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - レッスン 2.4: それ以外の形のコマンド + レッスン 2.5: より多くを削除するためにカウントを使用する + + + ** オペレータとカウントをタイプすると、その操作が複数回繰り返されます。 ** + + 既述の削除のオペレータとモーションの組み合わせにカウントを追加することで、 + より多くの削除が行えます: + d 数値 モーション + + 1. ---> と示された行の行頭部分にカーソルを移動しましょう。 + + 2. UPPER CASE の単語2つを 2dw とタイプして削除します。 + + 3. UPPER CASE という連続した単語を、1つのコマンドと異なるカウントを指定し、 + ステップ 1 と 2 を繰り返します。 + +---> このABC DE行のFGHI JK LMN OP単語はQ RS TUV綺麗になった。 + +NOTE: オペレータ d とモーションの間にカウントを使った場合、オペレータのない + 場合のモーションのように動作します。 + 例: 3dw と d3w は同等で、3w を削除します。 + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + レッスン 2.6: 行の操作 + + ** 行全体を削除するには dd とタイプします ** - ** 行全体を削除するには dd とタイプしましょう ** + 行全体を削除する頻度が多いので、Viのデザイナーは行の削除を d の2回タイプと + いう簡単なものに決めました。 - 行全体の削除は頻繁に行なう作業なので、Vim の設計者は行を削除するのには、 - 単に列内にて2回 d をタイプする方が簡単だろうと判断しました。 + 1. 以下の句の2行目にカーソルを移動します。 + 2. dd とタイプして行を削除します。 + 3. さらに4行目に移動します。 + 4. 2dd とタイプして2行を削除します。 - 1. 下にある一連のフレーズの2行目にカーソルを移動しましょう。 - 2. dd とタイプして行を削除しましょう。 - 3. では4行目に移動してみましょう。 - 4. 2dd とタイプして2行削除してみましょう。 - (回数-コマンド-目的語 の形式を思い出しましょう) +---> 1) バラは赤い、 +---> 2) つまらないものは楽しい、 +---> 3) スミレは青い、 +---> 4) 私は車をもっている、 +---> 5) 時計が時刻を告げる、 +---> 6) 砂糖は甘い +---> 7) オマエモナー - 1) バラは赤い、 - 2) つまらないものは楽しい、 - 3) スミレは青い、 - 4) 私は車をもっている、 - 5) 時計が時刻を告げる、 - 6) 砂糖は甘い - 7) オマエモナー ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - レッスン 2.5: やり直しコマンド + レッスン 2.7: やり直しコマンド ** 最後のコマンドを取り消すには u を押します。U は行全体の取消です。 ** - 1. 以下の ---> と記されたされた行にカーソルを移動し、最初の間違いにカーソル - を移動しましょう。 + 1. 以下の ---> と示された行にカーソルを移動し、最初の間違いにカーソ + ルを移動しましょう。 2. x をタイプしていらない先頭の文字を削除しましょう。 3. さぁ、u をタイプして最後に実行したコマンドを取り消しましょう。 4. 今度は、x を使用して誤りを全て修正しましょう。 5. 大文字の U をタイプして、行を元の状態に戻しましょう。 6. u をタイプして直前の U コマンドを取消しましょう。 - 7. ではコマンドを再実行するのに CTRL-R (CTRL を押したまま R を打つ)を - 数回タイプしてみましょう(取消の取消)。 + 7. ではコマンドを再実行するのに CTRL-R (CTRL を押したまま R を打つ)を数回 + タイプしてみましょう(取消の取消)。 ---> このの行のの間違いを修正々し、後でそれらの修正をを取消しまますす。 - 8. これはとても便利なコマンドです。さぁレッスン 2 要約に移りましょう。 + 8. これはとても便利なコマンドです。さぁレッスン 2 要約へ進みましょう。 @@ -255,24 +348,24 @@ NOTE: 冒険したい人は、ノーマルモードにてコマンドなしに 1. カーソル位置から単語の末尾までを削除するには dw とタイプします。 - 2. カーソル位置から行の末尾までを削除するには d$ とタイプします。 - 3. 行全体を削除するには dd とタイプします。 - 4. ノーマルモードでのコマンド形式は + 4. モーションを繰り返すには数値を付与します: 2w + 5. 変更に用いるコマンドの形式は + オペレータ [数値] モーション - [回数] コマンド 目的語 もしくは コマンド [回数] 目的語 それぞれ: - 回数 - そのコマンドを何回繰り返すか。 - コマンド - 削除 d の類で何をするか。 - 目的語 - 単語 w や行末 $ などの類で何に対して働きかけるか。 + オペレータ - 削除 d の類で何をするか。 + 数値 - そのコマンドを何回繰り返すか。 + モーション - w (単語)や $ (行末)などの類で、テキストの何に対して働きか + けるか。 - 5. 前回の動作を取消す: u (小文字 u) + 6. 行の先頭に移動するにはゼロを使用します: 0 + + 7. 前回の動作を取消す: u (小文字 u) 行全体の変更を取消す: U (大文字 U) 取消しの取消し: CTRL-R - - ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ レッスン 3.1: 貼り付けコマンド @@ -302,7 +395,7 @@ NOTE: 冒険したい人は、ノーマルモードにてコマンドなしに ** カーソルの下の文字を置き換えるには r をタイプします ** - 1. 以下の ---> と記されたされた最初の行にカーソルを移動しましょう。 + 1. 以下の ---> と示された最初の行にカーソルを移動しましょう。 2. 最初の間違いの先頭にカーソルを移動しましょう。 @@ -313,7 +406,7 @@ NOTE: 冒険したい人は、ノーマルモードにてコマンドなしに ---> この合を人力した時ね、その人は幾つか問違ったキーを押しもした! ---> この行を入力した時に、その人は幾つか間違ったキーを押しました! - 5. さぁ、レッスン 3.2 に移りましょう。 + 5. さぁ、レッスン 3.2 へ進みましょう。 NOTE: 実際に試しましょう。決して覚えるだけにはしないこと。 @@ -325,7 +418,7 @@ NOTE: 実際に試しましょう。決して覚えるだけにはしないこ ** 単語の一部、もしくは全体を変更するには cw とタイプします ** - 1. 以下の ---> と記されたされた最初の行にカーソルを移動しましょう。 + 1. 以下の ---> と示された最初の行にカーソルを移動しましょう。 2. lubw の u の位置にカーソルを移動しましょう。 @@ -348,14 +441,13 @@ cw は単語を変更するだけでなく、挿入も行えることに注意 ** 変更コマンドは、削除コマンドと同じ様にオブジェクトを使用します ** - 1. 変更コマンドは、削除コマンドと同じような動作をします。その形式は - [回数] c 目的語 もしくは c [回数] 目的語 + c [数値] モーション 2. オブジェクトも同じで、w は単語、 $ は行末などといったものです。 - 3. 以下の ---> と記されたされた行にカーソルを移動しましょう。 + 3. 以下の ---> と示された行にカーソルを移動しましょう。 4. 最初の間違いへカーソルを移動しましょう。 @@ -364,6 +456,7 @@ cw は単語を変更するだけでなく、挿入も行えることに注意 ---> The end of this line needs some help to make it like the second. ---> The end of this line needs to be corrected using the c$ command. +NOTE: タイプ中の間違いはバックスペースキーを使って直すこともできます。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ レッスン 3 要約 @@ -376,40 +469,40 @@ cw は単語を変更するだけでなく、挿入も行えることに注意 2. カーソルの下の文字を置き換えるには、r をタイプした後、それを置き換える 文字をタイプします。 - 3. 変更コマンドではカーソル位置から特定の目的語で指定される終端までを変更 - することが可能です。例えば cw ならばカーソル位置から単語の終わりまで、 + 3. 変更コマンドではカーソル位置から特定のモーションで指定される終端までを変 + 更することが可能です。例えば cw ならばカーソル位置から単語の終わりまで、 c$ ならば行の終わりまでを変更します。 4. 変更コマンドの形式は - [回数] c 目的語 もしくは c [回数] 目的語 + c [数値] モーション -さぁ、次のレッスンに移りましょう。 +さぁ、次のレッスンへ進みましょう。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ レッスン 4.1: 位置とファイルの情報 - - ** ファイル内での位置とファイルの状態を表示するには CTRL-g をタイプします。 - ファイル内のある行に移動するには SHIFT-G をタイプします ** + ** ファイル内での位置とファイルの状態を表示するには CTRL-G をタイプします。 + ファイル内のある行に移動するには G をタイプします ** NOTE: ステップを実行する前に、このレッスン全てに目を通しましょう!! - 1. CTRL を押したまま g を押しましょう。ページの一番下にあるステータス行 - にファイル名と行が表示されるはずです。 ステップ 3 のために行番号を - 覚えておきましょう。(訳者注:ルーラーがある場合はそちらに注目) - - 2. 最下行に移動するために shift-G とタイプしましょう。 + 1. CTRL を押したまま g を押しましょう。この操作を CTRL-G と呼んでいます。 + ページの一番下にファイル名と行番号が表示されるはずです。 ステップ 3のため + に行番号を覚えておきましょう。 - 3. 先ほどの行の番号をタイプし、 shift-G をタイプしましょう。 - 最初に Ctrl-g を押した行に戻って来るはずです。 - (数字をタイプしているときには画面に表示されません) +NOTE: 画面の右下隅にカーソルの位置が表示されているかもしれません。これは + 'ruler' オプション(レッスン6で説明)を設定することで表示されます。 - 4. 自信が持てたらステップ 1 から 3 を実行しましょう。 + 2. 最下行に移動するために G をタイプしましょう。 + ファイルの先頭に移動するには gg とタイプしましょう。 + 3. 先ほどの行の番号をタイプし G をタイプしましょう。最初に CTRL-G を押した行 + に戻って来るはずです。 + 4. 自信が持てたらステップ 1 から 3 を実行しましょう。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ レッスン 4.2: 検索コマンド @@ -417,22 +510,22 @@ cw は単語を変更するだけでなく、挿入も行えることに注意 ** 語句を検索するには / と、前方検索する語句をタイプします。** - 1. ノーマルモードで / という文字をタイプします。画面一番下に : コマンド - と同じ様に / が現れることに気づくでしょう。 + 1. ノーマルモードで / という文字をタイプします。画面一番下に : コマンドと + 同じ様に / が現れることに気づくでしょう。 2. では、'errroor' <ENTER> とタイプしましょう。これが検索したい単語です。 3. 同じ語をもう一度検索するときは 単に n をタイプします。 逆方向に語句を検索するときは N をタイプします。 - 4. 逆方向に語句を検索したい場合は、/ コマンドのかわりに ? コマンドを使用し - ます。 - ----> "errroor" is not the way to spell error; errroor is an error. - -検索がファイルの終わりに達すると、ファイルの先頭から検索を続行します。 + 4. 逆方向に語句を検索する場合は、/ の代わりに ? コマンドを使用します。 + 5. 元の場所に戻るには CTRL-O (Ctrl を押し続けながら o 文字タイプ)をタイプし + ます。さらに戻るにはこれを繰り返します。CTRL-I は前方向です。 +Note: "errroor" は error とスペルが違います; errroor はいわゆる error です。 +Note: 検索がファイルの終わりに達すると、オプション 'wrapscan' が設定されている + 場合は、ファイルの先頭から検索を続行します。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ レッスン 4.3: 対応する括弧を検索 @@ -440,8 +533,7 @@ cw は単語を変更するだけでなく、挿入も行えることに注意 ** 対応する ),] や } を検索するには % をタイプします ** - 1. 以下の ---> と記されたされた行で (,[ か { のどれかにカーソルを移動 - しましょう。 + 1. 下の ---> で示された行で (,[ か { のどれかにカーソルを移動しましょう。 2. そこで % とタイプしましょう。 @@ -449,21 +541,22 @@ cw は単語を変更するだけでなく、挿入も行えることに注意 4. 最初の括弧に移動するには % とタイプしましょう。 + 5. 他の (,),[,],{ or } でカーソルを移動し、% が何をしているか確認しましょう。 + ---> This ( is a test line with ('s, ['s ] and {'s } in it. )) + NOTE: この機能は括弧が一致していないプログラムをデバッグするのにとても役立ち ます。 - - ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ レッスン 4.4: 間違いを変更する方法 ** 'old' を 'new' に置換するには :s/old/new/g とタイプします ** - 1. 以下の ---> と記されたされた行にカーソルを移動しましょう。 + 1. 以下の ---> と示された行にカーソルを移動しましょう。 2. :s/thee/the <ENTER> とタイプしましょう。このコマンドはその行で最初に見 つかったものにだけ行なわれることに気をつけましょう。 @@ -474,27 +567,28 @@ NOTE: この機能は括弧が一致していないプログラムをデバッ ---> thee best time to see thee flowers is in thee spring. 4. 複数行から見つかる文字を変更するには - :#,#s/old/new/g #,# は2行の行番号を指します。 + :#,#s/old/new/g #,# には置き換える範囲の開始と終了の行番号を指定しま + す。 :%s/old/new/g ファイル全体で見つかるものに対して変更する。 - - - + :%s/old/new/gc ファイル全体で見つかるものに対して、1つ1つ確認をとりな + がら変更する。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ レッスン 4 要約 - 1. Ctrl-g はファイルでの位置とファイルの詳細を表示します。 - Shift-G はファイルの最下行に移動します。行番号後に Shift-G とすると - その行に移動します。 + 1. CTRL-G はファイルでの位置とファイルの詳細を表示します。 + G はファイルの最下行に移動します。 + 数値 G はその行に移動します。 + gg は先頭行に移動します。 2. / の後に語句をタイプすると前方に語句を検索します。 ? の後に語句をタイプすると後方に語句を検索します。 - 検索の後 n で、同方向に検索を再び行い、また N で逆方向に検索を行ないま - す。 + 検索の後の n は同じ方向の次の検索を、N は逆方向の検索をします。 + CTRL-O は場所を前に移し、CTRL-I は場所を次に移動します。 - 3. (,),[,],{, or } 上にカーソルがある状態で % をタイプすると - 対応した対に移動します。 + 3. (,),[,],{, もしくは } 上にカーソルがある状態で % をタイプすると対になる文 + 字へ移動します。 4. 現在行の最初の old を new に置換する。 :s/old/new 現在行の全ての old を new に置換する。 :s/old/new/g @@ -502,7 +596,6 @@ NOTE: この機能は括弧が一致していないプログラムをデバッ ファイルの中の全ての検索語句を置換する。 :%s/old/new/g 'c' を加えると置換の度に確認を求める。 :%s/old/new/gc - ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ レッスン 5.1: 外部コマンドを実行する方法 @@ -519,11 +612,11 @@ NOTE: この機能は括弧が一致していないプログラムをデバッ シェルプロンプトのようにディレクトリの一覧が表示されるはずです。 もしくは ls が動かないならば :!dir を使用しましょう。 ----> NOTE: この方法によってあらゆるコマンドが実行することができます。 - ----> NOTE: 全ての : コマンドは <ENTER> を押して終了しなければなりません。 - +Note: この方法によってあらゆるコマンドが実行することができます。もちろん引数 + も与えられます。 +Note: 全ての : コマンドは <ENTER> を押して終了しなければなりません。 + 以降ではこのことに言及しません。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -540,37 +633,38 @@ NOTE: この機能は括弧が一致していないプログラムをデバッ 3. では :w TEST とタイプしましょう (TEST は、選んだファイル名です)。 4. これによりファイル全体が TEST という名前で保存されます。 - もう一度 :!dir とタイプして確認してみましょう。 + もう一度 :!dir もしくは !ls とタイプして確認してみましょう。 ----> ここで Vim を終了し、ファイル名 TEST と共に起動すると、保存した時の +Note: ここで Vim を終了し、ファイル名 TEST と共に起動すると、保存した時の チュートリアルの複製ができ上がるはずです。 - 5. では、 :!del TEST とタイプしてファイルを削除してみましょう。 - + 5. さらに、次のようにタイプしてファイルを消しましょう(MS-DOS): :!del TEST + もしくは(Unix): :!rm TEST ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ レッスン 5.3: 選択した書き込み - ** 部分的に保存するには :#,# w ファイル名 とタイプします ** +** ファイルの位置を保存するには、v モーションと :w FILENAME をタイプします。 ** - 1. もう一度ディレクトリの一覧を取得するために :!ls とタイプし、TEST の様に - ファイルを一つ選んでみましょう。 + 1. この行にカーソルを移動します。 - 2. このページの始めまでカーソルを移動し、ファイルの行数を知るために Ctrl-g と - タイプしましょう。その行番号を憶えておきましょう。 + 2. v を押し、以下の第5項目にカーソルを移動します。テキストが強調表示されるの + に注目して下さい。 - 3. そしてページの終りまで移動し、再度 Ctrl-g を行います。 - この行番号も憶えておきましょう。 + 3. 文字 : を押すと、画面の最下部に :'<,'> が現れます。 - 4. ある部分だけを TEST という名で保存するために、:#,# w TEST とタイプします。 - この #,# は覚えておいた2つの番号(上端,下端) であり、 TEST がファイル名 - となります。 + 4. w TEST (TESET は存在しないファイル名)をタイプします。 + Enter を押す前に :'<,'>w TEST となっていることを確認して下さい。 - 5. 再度、ファイルが存在することを確認するために :!dir とタイプしましょう。 - ただしこのファイルは消してはいけません。 + 5. Vim は TEST というファイルに選択された行を書き込むでしょう。 + !dir もしくは !ls でそれを確認します。 + それは削除しないでおいて下さい。次のレッスンで使用します。 +NOTE: v を押すと、Visual 選択が始まります。カーソルを動かすことで、選択範囲を + 大きくも小さくもできます。さらに、その選択範囲に対してオペレータを適用 + きます。例えば d はテキストを削除します。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ レッスン 5.4: ファイルの取込と合併 @@ -578,21 +672,21 @@ NOTE: この機能は括弧が一致していないプログラムをデバッ ** ファイルの中身を挿入するには :r ファイル名 とタイプします ** - 1. 先ほどの TEST というファイルが存在することを確かめるために :!dir と - タイプしましょう。 + 1. カーソルを以下の行に合わせます。 - 2. カーソルをこのページの先頭に移動します。 +NOTE: ステップ 2 の実行後、レッスン 5.3 のテキストが現れます。下に下がってこ + のレッスンに移動しましょう。 -NOTE: ステップ 3 を実行すると、画面に レッスン 5.3 が現われるので、カーソルを - 下に移動しこのレッスンまで戻りましょう。 + 2. では TEST というファイルを :r TEST というコマンドで読み込みましょう。 + ここでいう TEST は使うファイルの名前のことです。 + 読み込まれたファイルは、カーソル行の下にあります。 - 3. では、:r TEST とタイプして TEST ファイルを取込みましょう。この TEST は - ファイル名です。 + 3. 取込んだファイルを確認してみましょう。カーソルを戻すと、レッスン5.3 の + オリジナルとファイルによるものの2つがあることがわかります。 -NOTE: ファイルの取込みはカーソルの位置から行われます。 +NOTE: 外部コマンドの出力を読み込むことも出来ます。例えば、 + :r !ls は ls コマンドの出力をカーソル以下に読み込みます。 - 4. 取込んだファイルを確認してみましょう。カーソルを戻すと、レッスン5.3 の - オリジナルとファイルによるものの2つがあることがわかります。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -602,19 +696,19 @@ NOTE: ファイルの取込みはカーソルの位置から行われます。 1. :!command によって 外部コマンドを実行します。 よく使う例: - :!ls - ディレクトリのファイル一覧を見る。 - :!del ファイル名 - ファイル名というファイルの削除する。 + (MS-DOS) (Unix) + :!dir :!ls - ディレクトリ内の一覧を見る。 + :!del FILENAME :!rm FILENAME - ファイルを削除する。 2. :w ファイル名 によってファイル名というファイルがディスクに書き込まれる。 - 3. :#,# w ファイル名 によって # から # までを保存する。 + 3. v モーションで :w FILENAME とすると、ビジュアル選択行がファイルに保存さ + れる。 4. :r ファイル名 によりファイル名というファイルがディスクより取込まれ、 カーソル位置の下に挿入される。 - - - + 5. :r !dir は dir コマンドの出力をカーソル位置以下に読み込む。 @@ -624,18 +718,18 @@ NOTE: ファイルの取込みはカーソルの位置から行われます。 ** o をタイプすると、カーソルの下の行が開き、挿入モードに入ります ** - 1. 以下の ---> と記されたされた行にカーソルを移動しましょう。 + 1. 以下の ---> と示された行にカーソルを移動しましょう。 2. o (小文字) をタイプして、カーソルの下の行を開き、挿入モードに入ります。 - 3. ---> と記された行を写し、<ESC> とタイプして追加モードを終了しましょう。 + 3. さらに挿入モードを終了する為に <ESC> をタイプします。 ---> o をタイプするとカーソルは開いた行へ移動し挿入モードに入ります。 4. カーソルの上の行に挿入するには、小文字の o ではなく、単純に大文字の O をタイプします。次の行で試してみましょう。 -この行の上へ挿入するには、この行へカーソルを置いて Shift-O をタイプします。 +---> この行の上へ挿入するには、この行へカーソルを置いて O をタイプします。 @@ -647,94 +741,118 @@ NOTE: ファイルの取込みはカーソルの位置から行われます。 ** カーソルの次の位置からテキストを追加するには a とタイプします ** - 1. ノーマルモードにして以下の ---> と記されたされた最初の行で $ をタイプし - て、終端にカーソルを移動しましょう。 + 1. カーソルを ---> で示された業へ移動しましょう。 - 2. カーソルの文字の後ろにテキストを追加するために a (小文字) をタイプしま - す。 + 2. e を押して li の終端部までカーソルを移動します。 -NOTE: これは最後の文字にてテキストを挿入し、<ESC> をタイプしてカーソルを右に - 移動し、最後に x タイプして行末に追加するといったような i のタイプを - 避けることがきます。 + 3. カーソルの後ろにテキストを追加するために a (小文字) をタイプします。 - 3. さて最初の行を完成しましょう。テキストが挿入される位置を除けば、 - 追加コマンドは挿入モードとまったく同じです。 + 4. その下の行ののような単語に完成させます。挿入モードを抜ける為に <ESC> に押 + します。 ----> この行で、行末に文章を追加する ----> この行で、行末に文章を追加する練習をすることができるでしょう。 + 5. e を使って次の不完全な単語へ移動し、ステップ 3 と 4 を繰り返します。 + +---> This li will allow you to pract appendi text to a line. +---> This line will allow you to practice appending text to a line. +Note: a, i と A は同じ挿入モードへ移りますが、文字が挿入される位置だけが異なり + ます。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - レッスン 6.3: その他の置換 + レッスン 6.3: その他の置換方法 ** 1文字以上を置き換えるには大文字の R とタイプしましょう ** - 1. 以下の ---> と記されたされた行にカーソルを移動しましょう。 - - 2. ---> と記された2行目と違う、最初の単語の先頭にカーソルを移動しましょう。 - (単語 'last') + 1. 以下の ---> と示された業にカーソルを移動します。最初の xxx の先頭に移動し + ます。 - 3. ここで R をタイプして、最初の行と次の行が同じになるように既存のテキスト - へ上書きタイプし、1行目の残りの部分を書き換えましょう。 + 2. R を押して、2行目の数値をタイプすることで、xxx が置換されます。 ----> To make the first line the same as the last on this page use the keys. ----> To make the first line the same as the second, type R and the new text. + 3. 置換モードを抜けるには <ESC> を押します。行の残りが変更されていないままに + なることに注意してください。 - 4. モードを抜けるために <ESC> をタイプすると、変更していない部分が残ること - に注意しましょう。 + 5. 残った xxx をステップを繰り返して置換しましょう。 +---> Adding 123 to xxx gives you xxx. +---> Adding 123 to 456 gives you 579. +NOTE: 置換モードは挿入モードに似ていますが、全てのタイプされた文字は既存の文字 + を削除します。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - レッスン 6.4: オプションの設定 + レッスン 6.4: テキストのコピーとペースト + + ** テキストのコピーにはオペレータ y を、ペーストには p を使います ** - ** 検索や置換の際に大文字と小文字を無視する様にオプションを設定します ** + 1. ---> と示された行へ移動し、カーソルを "a)" の後に置いておきます。 + + 2. v でビジュアルモードを開始し、"first"の手前までカーソルを移動します。 + + 3. y をタイプして強調表示されたテキストを yank (コピー)します。 + 4. 次の行の行末までカーソルを移動します: j$ - 1. 以下の様にタイプして 'ignore' を検索しましょう: - /ignore + 5. p を押して貼り付け(put)てから、次をタイプします: a second <ESC> + + 6. ビジュアルモードで " item." を選択し、y でヤンク、次の行の行末まで j$ で + 移動し、 p でテキストをそこに put します。 + +---> a) this is the first item. + b) + + Note: 単語を1つ yank するのに y をオペレータとして yw とすることも出来ます。 +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + レッスン 6.5: オプションの設定 + + + ** 検索や置換の際に大文字/小文字を無視するには、オプションを設定します ** + + 1. 次の様に入力して 'ignore' を検索しましょう: /ignore <ENTER> n を押して何度か検索を繰り返します。 - 2. 以下の様にタイプして 'ic' (Ignore Case の略です) オプションを設定します。 - :set ic + 2. 次の様に入力して 'ic' (Ignore Case の略) オプションを設定します: :set ic 3. では n によってもう1度 'ignore' を検索します。 n を押してさらに数回検索を繰り返しましょう。 - 4. 'hlsearch' と 'incsearch' オプションを以下の様に設定しましょう。 - :set hls is + 4. 'hlsearch' と 'incsearch' オプションを設定しましょう: :set hls is + + 5. 検索コマンドを再入力して、何が起こるか見てみましょう: /ignore <ENTER> - 5. もう一度検索コマンドを入力して、何が起こるか見てみましょう: - /ignore + 6. 大文字小文字の区別を無効にするには次の様に入力します: :set noic +Note: マッチの強調表示をやめるには次の様に入力します: :nohlsearch +Note: 1つの検索コマンドだけ大文字小文字の区別をやめたいならば、フレーズに \c + を使用します: /ignore\c <ENTER> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ レッスン 6 要約 - 1. o をタイプするとカーソルの下の行を開けて、そこで挿入モードになる。 O (大文字) をタイプするとカーソルの上の行で挿入モードになる。 2. カーソル上の文字の次からテキストを追加するには a とタイプする。 行末に自動でテキストを挿入するには大文字 A をタイプする。 - 3. 大文字の R をタイプすると置換モードに入り、<ESC>を押すと抜ける。 - - 4. ":set xxx" とタイプするとオプション "xxx" が設定される。 - - - - - + 3. e コマンドは単語の終端部カーソルを移動する。 + 4. y オペレータはテキストを yank (コピー)し、p はそれを put (ペースト)する。 + 5. 大文字の R をタイプすると置換モードに入り、<ESC>を押すと抜ける。 + 6. ":set xxx" とタイプするとオプション "xxx" が設定される。 + 'ic' 'ignorecase' 検索時に大文字小文字の区別しない + 'is' 'incsearch' 検索フレーズに部分マッチしている部分を表示する + 'hls' 'hlsearch' マッチするすべを強調表示する + 長い方、短い方、どちらのオプション名でも使用できます。 + 7. "no" を付与し、オプションを無効にします: :set noic ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - レッスン 7: オンラインヘルプコマンド + レッスン 7.1: オンラインヘルプコマンド + ** オンラインヘルプを使用しましょう ** @@ -744,20 +862,19 @@ NOTE: これは最後の文字にてテキストを挿入し、<ESC> をタイ - <F1> キーを押す(もしあるならば)。 - :help <ENTER> とタイプする。 - ヘルプウィンドウを閉じるには :q <ENTER> とタイプします。 + ヘルプウィンドウのテキストを読むと、ヘルプの動作が理解できます。 + CTRL-W CTRL-W とタイプすると ヘルプウィンドウへジャンプします。 + :q <ENTER> とタイプすると ヘルプウィンドウが閉じられます。 - ":help" コマンドに引数を与えることにより、あらゆる題名のヘルプを見つける - ことができます。これらを試してみましょう(<ENTER> をタイプし忘れないように): + ":help" コマンドに引数を与えることにより、あらゆる題名のヘルプを見つけること + ができます。これらを試してみましょう(<ENTER> をタイプし忘れないように): :help w :help c_<T :help insert-index :help user-manual - - - ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - レッスン 8: 起動スクリプトの作成 + レッスン 7.2: 起動スクリプトの作成 ** Vim の特徴を発揮する ** @@ -770,15 +887,61 @@ NOTE: これは最後の文字にてテキストを挿入し、<ESC> をタイ :edit $VIM/_vimrc MS-Windows 向け 2. ここでサンプルの "vimrc" を読み込みます。 - :read $VIMRUNTIME/vimrc_example.vim 3. 以下のようにファイルへ書き込みます。 - :write 次回 Vim を起動すると、色づけ構文が使えるようになるでしょう。 この "vimrc" ファイルへ、お好みの設定を追加することができます。 + より多くの情報を得るには :help vimrc-intro とタイプします。 + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + レッスン 7.3: 補完 + + + ** CTRL-D と <TAB> でコマンドラインを補完する ** + + 1. コンパチモードでないことを確認します: :set nocp + + 2. 現在のディレクトリに在るファイルを :!ls か :!dir で確認します。 + + 3. コマンドの開始をタイプします: :e + + 4. CTRL-D を押すと Vim は "e" から始まるコマンドの一覧を表示します。 + + 5. <TAB> を押すと Vim は ":edit" というコマンド名を補完します。 + + 6. さらに空白と、既存のファイル名の始まりを加えます: :edit FIL + + 7. <TAB> を押すと Vim は名前を補完します。(もし一つしか無かった場合) + +NOTE: 補完は多くのコマンドで動作します。そして CTRL-D と <TAB> 押してみてくだ + さい。特に :help の際に役立ちます。 + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + レッスン 7 要約 + + + 1. ヘルプウィンドウを開くには :help とするか <F1> もしくは <Help> を押す。 + + 2. コマンド(cmd)のヘルプを検索するには :help cmd とタイプする。 + + 3. 別のウィンドウへジャンプするには CTRL-W CTRL-W とタイプする。 + + 4. ヘルプウィンドウを閉じるには :q とタイプする。 + + 5. お好みの設定を保つには vimrc 起動スクリプトを作成する。 + + 6. : command で可能な補完を見るには CTRL-D をタイプする。 + 補完を使用するには <TAB> を押す。 + + + + + + + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ これにて Vim のチュートリアルを終わります。エディタを簡単に、しかも充分に @@ -805,7 +968,8 @@ NOTE: これは最後の文字にてテキストを挿入し、<ESC> をタイ Modified for Vim by Bram Moolenaar. - 日本語訳 松本泰弘 E-mail:mattn@mail.goo.ne.jp + 日本語訳 松本 泰弘 <mattn_jp@hotmail.com> + 監修 村岡 太郎 <koron@tka.att.ne.jp> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - vi:set ts=8 sts=4 sw=4 tw=76: + vi:set ts=8 sts=4 sw=4 tw=78: diff --git a/src/eval.c b/src/eval.c index d29f1a4f1..8c7049be3 100644 --- a/src/eval.c +++ b/src/eval.c @@ -17258,6 +17258,7 @@ ex_function(eap) char_u *name = NULL; char_u *p; char_u *arg; + char_u *line_arg = NULL; garray_T newargs; garray_T newlines; int varargs = FALSE; @@ -17531,7 +17532,11 @@ ex_function(eap) break; } - if (*p != NUL && *p != '"' && *p != '\n' && !eap->skip && !did_emsg) + /* When there is a line break use what follows for the function body. + * Makes 'exe "func Test()\n...\nendfunc"' work. */ + if (*p == '\n') + line_arg = p + 1; + else if (*p != NUL && *p != '"' && !eap->skip && !did_emsg) EMSG(_(e_trailing)); /* @@ -17563,7 +17568,20 @@ ex_function(eap) { msg_scroll = TRUE; need_wait_return = FALSE; - if (eap->getline == NULL) + if (line_arg != NULL) + { + /* Use eap->arg, split up in parts by line breaks. */ + theline = line_arg; + p = vim_strchr(theline, '\n'); + if (p == NULL) + line_arg += STRLEN(line_arg); + else + { + *p = NUL; + line_arg = p + 1; + } + } + else if (eap->getline == NULL) theline = getcmdline(':', 0L, indent); else theline = eap->getline(':', eap->cookie, indent); @@ -17594,7 +17612,8 @@ ex_function(eap) /* Check for "endfunction". */ if (checkforcmd(&p, "endfunction", 4) && nesting-- == 0) { - vim_free(theline); + if (line_arg == NULL) + vim_free(theline); break; } @@ -17660,7 +17679,8 @@ ex_function(eap) /* Add the line to the function. */ if (ga_grow(&newlines, 1) == FAIL) { - vim_free(theline); + if (line_arg == NULL) + vim_free(theline); goto erret; } @@ -17670,12 +17690,17 @@ ex_function(eap) p = vim_strsave(theline); if (p != NULL) { - vim_free(theline); + if (line_arg == NULL) + vim_free(theline); theline = p; } ((char_u **)(newlines.ga_data))[newlines.ga_len] = theline; newlines.ga_len++; + + /* Check for end of eap->arg. */ + if (line_arg != NULL && *line_arg == NUL) + line_arg = NULL; } /* Don't define the function when skipping commands or when an error was diff --git a/src/ex_cmds.c b/src/ex_cmds.c index dff491a37..c6cdc5a50 100644 --- a/src/ex_cmds.c +++ b/src/ex_cmds.c @@ -1811,15 +1811,18 @@ write_viminfo(file, forceit) /* Use mch_open() to be able to use O_NOFOLLOW and set file * protection: - * Unix: same as original file, but strip s-bit. + * Unix: same as original file, but strip s-bit. Reset umask to + * avoid it getting in the way. * Others: r&w for user only. */ #ifdef UNIX + umask_save = umask(0); fd = mch_open((char *)tempname, O_CREAT|O_EXTRA|O_EXCL|O_WRONLY|O_NOFOLLOW, (int)((st_old.st_mode & 0777) | 0600)); + (void)umask(umask_save); #else fd = mch_open((char *)tempname, - O_CREAT|O_EXTRA|O_EXCL|O_WRONLY|O_NOFOLLOW, 0600); + O_CREAT|O_EXTRA|O_EXCL|O_WRONLY|O_NOFOLLOW, 0600); #endif if (fd < 0) fp_out = NULL; @@ -3504,8 +3507,11 @@ do_ecmd(fnum, ffname, sfname, eap, newlnum, flags) /* Tell the diff stuff that this buffer is new and/or needs updating. * Also needed when re-editing the same buffer, because unloading will * have removed it as a diff buffer. */ - diff_new_buffer(); - diff_invalidate(); + if (curwin->w_p_diff) + { + diff_buf_add(curbuf); + diff_invalidate(curbuf); + } #endif if (command == NULL) diff --git a/src/ex_cmds.h b/src/ex_cmds.h index 6571ccef3..d505bff37 100644 --- a/src/ex_cmds.h +++ b/src/ex_cmds.h @@ -880,11 +880,13 @@ EX(CMD_tags, "tags", do_tags, EX(CMD_tab, "tab", ex_tab, RANGE|NOTADR|COUNT|TRLBAR), EX(CMD_tabclose, "tabclose", ex_tabclose, - BANG|TRLBAR|CMDWIN), + RANGE|NOTADR|COUNT|BANG|TRLBAR|CMDWIN), EX(CMD_tabedit, "tabedit", ex_tabedit, BANG|FILE1|RANGE|NOTADR|EDITCMD|ARGOPT|TRLBAR), EX(CMD_tabfind, "tabfind", ex_tabedit, BANG|FILE1|RANGE|NOTADR|EDITCMD|ARGOPT|TRLBAR), +EX(CMD_tabonly, "tabonly", ex_tabonly, + TRLBAR|CMDWIN), EX(CMD_tabs, "tabs", ex_tabs, TRLBAR|CMDWIN), EX(CMD_tcl, "tcl", ex_tcl, diff --git a/src/ex_cmds2.c b/src/ex_cmds2.c index 0e671c8af..b2a9327f1 100644 --- a/src/ex_cmds2.c +++ b/src/ex_cmds2.c @@ -2232,7 +2232,7 @@ ex_listdo(eap) if (!win_valid(win)) break; win_goto(win); - win = win->w_next; + win = curwin->w_next; } #endif else if (eap->cmdidx == CMD_bufdo) diff --git a/src/globals.h b/src/globals.h index c6409b96b..0cea5c28b 100644 --- a/src/globals.h +++ b/src/globals.h @@ -507,11 +507,12 @@ EXTERN frame_T *topframe; /* top of the window frame tree */ #ifdef FEAT_WINDOWS /* - * Tab pages are nothing more than alternative topframes. "first_tabpage" - * points to the first one in the list, "topframe" is the current one. + * Tab pages are alternative topframes. "first_tabpage" points to the first + * one in the list, "curtab" is the current one. */ -EXTERN tabpage_T *first_tabpage; -EXTERN int redraw_tabpage INIT(= FALSE); /* redraw tab pages line */ +EXTERN tabpage_T *first_tabpage; +EXTERN tabpage_T *curtab; +EXTERN int redraw_tabline INIT(= FALSE); /* need to redraw tabline */ #endif /* diff --git a/src/main.c b/src/main.c index 1a71be908..31c6f6fba 100644 --- a/src/main.c +++ b/src/main.c @@ -32,6 +32,11 @@ /* Maximum number of commands from + or -c arguments. */ #define MAX_ARG_CMDS 10 +/* values for "window_layout" */ +#define WIN_HOR 1 /* "-o" horizontally split windows */ +#define WIN_VER 2 /* "-O" vertically split windows */ +#define WIN_TABS 3 /* "-p" windows on tab pages */ + /* Struct for various parameters passed between main() and other functions. */ typedef struct { @@ -65,7 +70,7 @@ typedef struct #endif #ifdef FEAT_WINDOWS int window_count; /* number of windows to use */ - int vert_windows; /* "-O" used instead of "-o" */ + int window_layout; /* 0, WIN_HOR, WIN_VER or WIN_TABS */ #endif #ifdef FEAT_CLIENTSERVER @@ -189,7 +194,6 @@ main #endif #ifdef FEAT_WINDOWS params.window_count = -1; - params.vert_windows = MAYBE; #endif #ifdef FEAT_TCL @@ -416,8 +420,8 @@ main { if (params.window_count == -1) params.window_count = 0; /* open up to 3 windows */ - if (params.vert_windows == MAYBE) - params.vert_windows = TRUE; /* use vertical split */ + if (params.window_layout == 0) + params.window_layout = WIN_VER; /* use vertical split */ } #endif @@ -1738,12 +1742,21 @@ command_line_scan(parmp) parmp->no_swap_file = TRUE; break; + case 'p': /* "-p[N]" open N tab pages */ +#ifdef FEAT_WINDOWS + /* default is 0: open window for each file */ + parmp->window_count = get_number_arg((char_u *)argv[0], + &argv_idx, 0); + parmp->window_layout = WIN_TABS; +#endif + break; + case 'o': /* "-o[N]" open N horizontal split windows */ #ifdef FEAT_WINDOWS /* default is 0: open window for each file */ parmp->window_count = get_number_arg((char_u *)argv[0], &argv_idx, 0); - parmp->vert_windows = FALSE; + parmp->window_layout = WIN_HOR; #endif break; @@ -1752,7 +1765,7 @@ command_line_scan(parmp) /* default is 0: open window for each file */ parmp->window_count = get_number_arg((char_u *)argv[0], &argv_idx, 0); - parmp->vert_windows = TRUE; + parmp->window_layout = WIN_VER; #endif break; @@ -2235,6 +2248,9 @@ create_windows(parmp) mparm_T *parmp; { #ifdef FEAT_WINDOWS + int rewind; + int done = 0; + /* * Create the number of windows that was requested. */ @@ -2246,12 +2262,17 @@ create_windows(parmp) { /* Don't change the windows if there was a command in .vimrc that * already split some windows */ - if (parmp->vert_windows == MAYBE) - parmp->vert_windows = FALSE; - if (firstwin->w_next == NULL) + if (parmp->window_layout == 0) + parmp->window_layout = WIN_HOR; + if (parmp->window_layout == WIN_TABS) + { + parmp->window_count = make_tabpages(parmp->window_count); + TIME_MSG("making tab pages"); + } + else if (firstwin->w_next == NULL) { parmp->window_count = make_windows(parmp->window_count, - parmp->vert_windows); + parmp->window_layout == WIN_VER); TIME_MSG("making windows"); } else @@ -2284,9 +2305,30 @@ create_windows(parmp) ++autocmd_no_leave; #endif #ifdef FEAT_WINDOWS - for (curwin = firstwin; curwin != NULL; curwin = W_NEXT(curwin)) -#endif + rewind = TRUE; + while (done++ < 1000) { + if (rewind) + { + if (parmp->window_layout == WIN_TABS) + goto_tabpage(1); + else + curwin = firstwin; + } + else if (parmp->window_layout == WIN_TABS) + { + if (curtab->tp_next == NULL) + break; + goto_tabpage(0); + } + else + { + if (curwin->w_next == NULL) + break; + curwin = curwin->w_next; + } + rewind = FALSE; +#endif curbuf = curwin->w_buffer; if (curbuf->b_ml.ml_mfp == NULL) { @@ -2306,7 +2348,7 @@ create_windows(parmp) check_swap_exists_action(); #endif #ifdef FEAT_AUTOCMD - curwin = firstwin; /* start again */ + rewind = TRUE; /* start again */ #endif } #ifdef FEAT_WINDOWS @@ -2316,16 +2358,19 @@ create_windows(parmp) (void)vgetc(); /* only break the file loading, not the rest */ break; } -#endif } -#ifdef FEAT_AUTOCMD - --autocmd_no_enter; - --autocmd_no_leave; #endif #ifdef FEAT_WINDOWS - curwin = firstwin; + if (parmp->window_layout == WIN_TABS) + goto_tabpage(1); + else + curwin = firstwin; curbuf = curwin->w_buffer; #endif +#ifdef FEAT_AUTOCMD + --autocmd_no_enter; + --autocmd_no_leave; +#endif } } @@ -2351,9 +2396,18 @@ edit_buffers(parmp) arg_idx = 1; for (i = 1; i < parmp->window_count; ++i) { - if (curwin->w_next == NULL) /* just checking */ - break; - win_enter(curwin->w_next, FALSE); + if (parmp->window_layout == WIN_TABS) + { + if (curtab->tp_next == NULL) /* just checking */ + break; + goto_tabpage(0); + } + else + { + if (curwin->w_next == NULL) /* just checking */ + break; + win_enter(curwin->w_next, FALSE); + } /* Only open the file if there is no file in this window yet (that can * happen when .vimrc contains ":sall") */ @@ -2375,6 +2429,9 @@ edit_buffers(parmp) break; } } + + if (parmp->window_layout == WIN_TABS) + goto_tabpage(1); # ifdef FEAT_AUTOCMD --autocmd_no_enter; # endif @@ -2383,7 +2440,7 @@ edit_buffers(parmp) --autocmd_no_leave; # endif TIME_MSG("editing files in windows"); - if (parmp->window_count > 1) + if (parmp->window_count > 1 && parmp->window_layout != WIN_TABS) win_equal(curwin, FALSE, 'b'); /* adjust heights */ } #endif /* FEAT_WINDOWS */ @@ -2825,6 +2882,7 @@ usage() main_msg(_("-U <gvimrc>\t\tUse <gvimrc> instead of any .gvimrc")); #endif main_msg(_("--noplugin\t\tDon't load plugin scripts")); + main_msg(_("-p[N]\t\tOpen N tab pages (default: one for each file)")); main_msg(_("-o[N]\t\tOpen N windows (default: one for each file)")); main_msg(_("-O[N]\t\tLike -o but split vertically")); main_msg(_("+\t\t\tStart at end of file")); diff --git a/src/misc1.c b/src/misc1.c index fc56c913a..bcc43dafb 100644 --- a/src/misc1.c +++ b/src/misc1.c @@ -2458,7 +2458,7 @@ changed() ml_setflags(curbuf); #ifdef FEAT_WINDOWS check_status(curbuf); - redraw_tabpage = TRUE; + redraw_tabline = TRUE; #endif #ifdef FEAT_TITLE need_maketitle = TRUE; /* set window title later */ @@ -2848,7 +2848,7 @@ unchanged(buf, ff) save_file_ff(buf); #ifdef FEAT_WINDOWS check_status(buf); - redraw_tabpage = TRUE; + redraw_tabline = TRUE; #endif #ifdef FEAT_TITLE need_maketitle = TRUE; /* set window title later */ diff --git a/src/misc2.c b/src/misc2.c index 2ff4d5c58..680202f1c 100644 --- a/src/misc2.c +++ b/src/misc2.c @@ -962,6 +962,12 @@ free_all_mem() ++autocmd_block; /* don't want to trigger autocommands here */ +#ifdef FEAT_WINDOWS + /* close all tabs and windows */ + do_cmdline_cmd((char_u *)"tabonly!"); + do_cmdline_cmd((char_u *)"only!"); +#endif + # if defined(FEAT_SYN_HL) /* Free all spell info. */ spell_free_all(); @@ -1012,7 +1018,7 @@ free_all_mem() free_tag_stuff(); free_cd_dir(); set_expr_line(NULL); - diff_clear(); + diff_clear(curtab); clear_sb_text(); /* free any scrollback text */ /* Free some global vars. */ @@ -2792,7 +2798,7 @@ set_fileformat(t, opt_flags) #ifdef FEAT_WINDOWS /* This may cause the buffer to become (un)modified. */ check_status(curbuf); - redraw_tabpage = TRUE; + redraw_tabline = TRUE; #endif #ifdef FEAT_TITLE need_maketitle = TRUE; /* set window title later */ diff --git a/src/proto/window.pro b/src/proto/window.pro index ae6aa636f..7fa357270 100644 --- a/src/proto/window.pro +++ b/src/proto/window.pro @@ -7,7 +7,6 @@ int make_windows __ARGS((int count, int vertical)); void win_move_after __ARGS((win_T *win1, win_T *win2)); void win_equal __ARGS((win_T *next_curwin, int current, int dir)); void close_windows __ARGS((buf_T *buf, int keep_curwin)); -int last_window __ARGS((void)); void win_close __ARGS((win_T *win, int free_buf)); void win_close_othertab __ARGS((win_T *win, int free_buf, tabpage_T *tp)); void win_free_all __ARGS((void)); @@ -16,6 +15,7 @@ void win_init __ARGS((win_T *wp)); int win_alloc_first __ARGS((void)); void win_init_size __ARGS((void)); int win_new_tabpage __ARGS((void)); +int make_tabpages __ARGS((int maxcount)); int valid_tabpage __ARGS((tabpage_T *tpc)); tabpage_T *find_tabpage __ARGS((int n)); void goto_tabpage __ARGS((int n)); diff --git a/src/screen.c b/src/screen.c index f9ed5e17e..928b1b01b 100644 --- a/src/screen.c +++ b/src/screen.c @@ -394,7 +394,7 @@ update_screen(type) } redraw_cmdline = TRUE; #ifdef FEAT_WINDOWS - redraw_tabpage = TRUE; + redraw_tabline = TRUE; #endif } msg_scrolled = 0; @@ -476,7 +476,7 @@ update_screen(type) #ifdef FEAT_WINDOWS /* Redraw the tab pages line if needed. */ - if (redraw_tabpage || type >= NOT_VALID) + if (redraw_tabline || type >= NOT_VALID) draw_tabpage(); #endif @@ -706,7 +706,7 @@ updateWindow(wp) #ifdef FEAT_WINDOWS /* When the screen was cleared redraw the tab pages line. */ - if (redraw_tabpage) + if (redraw_tabline) draw_tabpage(); if (wp->w_redr_status @@ -4965,7 +4965,7 @@ redraw_statuslines() for (wp = firstwin; wp; wp = wp->w_next) if (wp->w_redr_status) win_redr_status(wp); - if (redraw_tabpage) + if (redraw_tabline) draw_tabpage(); } #endif @@ -7084,7 +7084,7 @@ screenclear2() win_rest_invalid(firstwin); redraw_cmdline = TRUE; #ifdef FEAT_WINDOWS - redraw_tabpage = TRUE; + redraw_tabline = TRUE; #endif if (must_redraw == CLEAR) /* no need to clear again */ must_redraw = NOT_VALID; @@ -8463,7 +8463,7 @@ draw_tabpage() tabpage_T *tp; int tabwidth; int col = 0; - int scol; + int scol = 0; int had_current = FALSE; int attr; win_T *wp; @@ -8475,8 +8475,9 @@ draw_tabpage() int attr_sel = hl_attr(HLF_TPS); int attr_nosel = hl_attr(HLF_TP); int attr_fill = hl_attr(HLF_TPF); + char_u *p; - redraw_tabpage = FALSE; + redraw_tabline = FALSE; if (tabpageline_height() < 1) return; @@ -8548,11 +8549,15 @@ draw_tabpage() MAXPATHL, TRUE); trans_characters(NameBuff, MAXPATHL); len = STRLEN(NameBuff); + p = NameBuff; if (len > scol - col + tabwidth - 1) /* TODO: multi-byte chars */ + { + p += len - (scol - col + tabwidth - 1); len = scol - col + tabwidth - 1; + } if (len > 0) { - screen_puts_len(NameBuff, len, 0, col, attr); + screen_puts_len(p, len, 0, col, attr); col += len; } screen_putchar(' ', 0, col++, attr); diff --git a/src/search.c b/src/search.c index 5531fb6c0..d50634465 100644 --- a/src/search.c +++ b/src/search.c @@ -4938,7 +4938,7 @@ search_line: #if defined(FEAT_WINDOWS) && defined(FEAT_QUICKFIX) if (g_do_tagpreview != 0 - && curwin != curwin_save && win_valid(curwin_save)) + && curwin != curwin_save && win_valid(curwin_save)) { /* Return cursor to where we were */ validate_cursor(); diff --git a/src/structs.h b/src/structs.h index 6153099e6..fac17856d 100644 --- a/src/structs.h +++ b/src/structs.h @@ -1526,6 +1526,60 @@ struct file_buffer }; + +#ifdef FEAT_DIFF +/* + * Stuff for diff mode. + */ +# define DB_COUNT 4 /* up to four buffers can be diff'ed */ + +/* + * Each diffblock defines where a block of lines starts in each of the buffers + * and how many lines it occupies in that buffer. When the lines are missing + * in the buffer the df_count[] is zero. This is all counted in + * buffer lines. + * There is always at least one unchanged line in between the diffs. + * Otherwise it would have been included in the diff above or below it. + * df_lnum[] + df_count[] is the lnum below the change. When in one buffer + * lines have been inserted, in the other buffer df_lnum[] is the line below + * the insertion and df_count[] is zero. When appending lines at the end of + * the buffer, df_lnum[] is one beyond the end! + * This is using a linked list, because the number of differences is expected + * to be reasonable small. The list is sorted on lnum. + */ +typedef struct diffblock_S diff_T; +struct diffblock_S +{ + diff_T *df_next; + linenr_T df_lnum[DB_COUNT]; /* line number in buffer */ + linenr_T df_count[DB_COUNT]; /* nr of inserted/changed lines */ +}; +#endif + +/* + * Tab pages point to the top frame of each tab page. + * Note: Most values are NOT valid for the current tab page! Use "curwin", + * "firstwin", etc. for that. "tp_topframe" is always valid and can be + * compared against "topframe" to find the current tab page. + */ +typedef struct tabpage_S tabpage_T; +struct tabpage_S +{ + tabpage_T *tp_next; /* next tabpage or NULL */ + frame_T *tp_topframe; /* topframe for the windows */ + win_T *tp_curwin; /* current window in this Tab page */ + win_T *tp_prevwin; /* previous window in this Tab page */ + win_T *tp_firstwin; /* first window in this Tab page */ + win_T *tp_lastwin; /* last window in this Tab page */ + long tp_old_Rows; /* Rows when Tab page was left */ + long tp_old_Columns; /* Columns when Tab page was left */ +#ifdef FEAT_DIFF + diff_T *tp_first_diff; + buf_T *(tp_diffbuf[DB_COUNT]); + int tp_diff_invalid; /* list of diffs is outdated */ +#endif +}; + /* * Structure to cache info for displayed lines in w_lines[]. * Each logical line has one entry. @@ -1550,22 +1604,6 @@ typedef struct w_line } wline_T; /* - * Tab pages point to the top frame of each tab page. - */ -typedef struct tabpage_S tabpage_T; -struct tabpage_S -{ - tabpage_T *tp_next; /* next tabpage or NULL */ - frame_T *tp_topframe; /* topframe for the windows */ - win_T *tp_curwin; /* current window in this Tab page */ - win_T *tp_prevwin; /* previous window in this Tab page */ - win_T *tp_firstwin; /* first window in this Tab page */ - win_T *tp_lastwin; /* last window in this Tab page */ - long tp_old_Rows; /* Rows when Tab page was left */ - long tp_old_Columns; /* Columns when Tab page was left */ -}; - -/* * Windows are kept in a tree of frames. Each frame has a column (FR_COL) * or row (FR_ROW) layout or is a leaf, which has a window. */ diff --git a/src/version.h b/src/version.h index b00a9a1c0..80a3f61a4 100644 --- a/src/version.h +++ b/src/version.h @@ -36,5 +36,5 @@ #define VIM_VERSION_NODOT "vim70aa" #define VIM_VERSION_SHORT "7.0aa" #define VIM_VERSION_MEDIUM "7.0aa ALPHA" -#define VIM_VERSION_LONG "VIM - Vi IMproved 7.0aa ALPHA (2006 Feb 16)" -#define VIM_VERSION_LONG_DATE "VIM - Vi IMproved 7.0aa ALPHA (2006 Feb 16, compiled " +#define VIM_VERSION_LONG "VIM - Vi IMproved 7.0aa ALPHA (2006 Feb 17)" +#define VIM_VERSION_LONG_DATE "VIM - Vi IMproved 7.0aa ALPHA (2006 Feb 17, compiled " |