# suigyoza 進捗報告 作業環境:Ubuntu18.04 二人,Ubuntu20.04 一人 ## 10/11 * チーム名を決めた > suigyo __u__ zaではなくsuigyozaなのに注意 * GitLab上にプロジェクト作った (https://doss-gitlab.eidos.ic.i.u-tokyo.ac.jp/suigyoza/vscode) * 以下のコマンドでvscodeリポジトリのmainブランチを自分たちのプロジェクトに持ってくることができる ``` git clone https://github.com/microsoft/vscode.git cd vscode git remote rename origin upstream git remote add origin git@doss-gitlab.eidos.ic.i.u-tokyo.ac.jp:suigyoza/vscode.git git push -u origin main ``` * node.js入れた * typescriptコンパイル確認&Hello World * VSCodeをビルドした * node.jsのバージョンに指定があり,詰まった. > node v14-17でないといけない * VSCodeでのデバッグはChrome拡張を使うらしいが,まだよく使い方がわからない.(10/12にて解決) ↓コレの通りにやれば基本は大丈夫 https://github.com/microsoft/vscode/wiki/How-to-Contribute 2つうまく行かなかった箇所があり、 1つめは、 ``` On Debian-based Linux: sudo apt-get install build-essential g++ libx11-dev libxkbfile-dev libsecret-1-dev python-is-python3 ``` これの`python-is-python3`の部分で詰まってしまった。よくみると、Ubuntuのversionが20これだけをとばしたらうまくいきました。つまり、実行したコードは以下。 ``` sudo apt-get install build-essential g++ libx11-dev libxkbfile-dev libsecret-1-dev ``` > python-is-python3はUbuntu20.04以降で,Python2,3の衝突を避けるために実装された機能らしく(?),それ以前の人は無視していい.(というかつけるとエラーが起きる) > https://askubuntu.com/questions/1296790/python-is-python3-package-in-ubuntu-20-04-what-is-it-and-what-does-it-actually 2つめは、 最後の`./scripts/code.sh`はvscode内のターミナルで打ち込んだらcrbug:638180にあたったので、外部の端末から実行した結果、無事にOSS Devが立ち上がりました。めでたしめでたし ---- ## 10/12日 ### undoのソースの発見 __undoRedo.ts及びundoRedoService.tsを発見__ vscode/src/vs/platform/undoRedo/common public undoの定義が vscode/src/vs/platform/undoRedo/common/undoRedoService.tsのl.1057にある > console.log("aiueo");をundoに追加し,デバッグログに表示できた l.1072は,stackに一度も何も入っていないときだけ呼び出される. ```typescript= // l.1072 private _undo(strResource: string, sourceId: number = 0, undoConfirmed: boolean): Promise<void> | void { if (!this._editStacks.has(strResource)) { return; } ``` > おそらくstackが生成されていないとき? > 新規ファイル作成時に押すundoと,立ち上げで過去ログがないときだけ呼ばれる > 一文字でも書いてundoするともう呼ばれない ### undoの実装について undoRedoService.ts l.197にclass ResourceEditStackの定義 ### VSCodeのデバッグについて 1. [the Debugger for Chrome extension](https://marketplace.visualstudio.com/items?itemName=msjsdiag.debugger-for-chrome)をインストール 2. vscodeディレクトリ直下で`code .`とする 3. TSファイル内に適宜ブレイクポイントを設定 4. 実行とデバッグを押し,「Launch VS Code」を選択し,実行(F5) 5. Ctrl+Shift+I or Ctrl+Shift+Pからの 6. F10,F11等で実行 ### ビルドについて 先輩の進捗記録 https://docs.google.com/document/d/19RT8dViW3_agluddDCAxVNEd0xylnLeheMKteVrTtew/edit の10/13あたりが参考になる. > yarn watchでやるといい file をwatchできませんというエラーが出るので以下に従って上限を解放しました 参考: https://code.visualstudio.com/docs/setup/linux#_visual-studio-code-is-unable-to-watch-for-file-changes-in-this-large-workspace-error-enospc 気づき * pushElement(undoRedoServics.ts)にbp置くと,どこでundo,redoが切れているか,(stackにpushしているかがわかる) > Enter,Spaceで切ってる > Enterは強制 > Spaceは,文字との切り替えで切る > Space→Spaceは止まらない(→文字入れて止まる) > 文字→文字求まらない(→Spaceで止まる) --- ## 10/14 ### vscodeデバッグ src/vs/editor/common/model/textModel.tsがredo時にundoRedoService.tsより先に呼び出されている undoRedoService284pushElement内,`this._future = [];`でfuture配列を初期化しているので,ここをコメントアウトすると,すべてのログが残る. ```typescript= public pushElement(element: StackElement): void { // remove the future for (const futureElement of this._future) { if (futureElement.type === UndoRedoElementType.Workspace) { futureElement.removeResource(this.resourceLabel, this.strResource, RemovedResourceReason.NoParallelUniverses); } } // this._future = []; this._past.push(element); this.versionId++; } ``` past,futureという2つのJSarrayをもちいて、redo-undoが行われていることがわかった。 具体的には、 undo時:pastからpop, futureにpush redo時:futureからpop, pastにpush その他の編集をするときは、pastにpopされ、そのたびに、futureは空配列となる。 これらをdeque構造を用いることで、実現したいundo-redo機能を実装できそうである。 undo時:pastからpopした上で、popしたものをleftpop, futureにpush??? redo時:futureからpopした上で、popしたものをleftpop, pastにpush??? その他:pastにpop(futureはから配列にしない) TypeScriptにはdequeがないので[stack2本でdequeを作る](https://www.slideshare.net/catupper/amortize-analysis-of-deque-with-2-stack) ## 10/18 ResourceEditStack ファイルごとの編集履歴 pastとfuture ResourceEditStackSnapshot 時系列順に編集履歴が入っている 木構造との相性悪そう まず何に使うねん ResourceEditStack.createSnapshot スナップショットを作る ResourceEditStack.restoreSnapshot スナップショットの状態を復元する……?いつ呼ばれるん 遡ったけどよくわからん笑 pushElementでfutureを空配列にするのをやめてみると、undo以降の入力が全部単体で処理されてしまう getLastElementの if (editStack.hasFutureElements()) {... を消すとこの問題は解決する もともとなんであったのかがよくわからないので怖い。。。 StackElementにbooleanを持たせ、_resourceUndo内の処理を書き換えると一応それっぽく動いた めでたい ![](https://i.imgur.com/m9oBQJh.jpg) --- ## 10/19 ### 念の為,Pastスタックの上限を調べた. * 実装を見る限りなさそうだが,(というか上限を設けて削除するほうが大変なので空間計算量を犠牲にしていると予想される.)一応調査 * Enter15000回は最初まで戻れた. ## 10/25 編集→保存→閉じる→開く→undo でエラーが出た getElementsの内容をコメントアウトしていたことが原因