Merge branch 'master' into 2821-slim

This commit is contained in:
Arfon Smith
2016-03-10 06:51:35 -06:00
127 changed files with 20325 additions and 78 deletions

15
.gitmodules vendored
View File

@@ -340,9 +340,6 @@
[submodule "vendor/grammars/latex.tmbundle"]
path = vendor/grammars/latex.tmbundle
url = https://github.com/textmate/latex.tmbundle
[submodule "vendor/grammars/less.tmbundle"]
path = vendor/grammars/less.tmbundle
url = https://github.com/textmate/less.tmbundle
[submodule "vendor/grammars/lilypond.tmbundle"]
path = vendor/grammars/lilypond.tmbundle
url = https://github.com/textmate/lilypond.tmbundle
@@ -707,6 +704,18 @@
[submodule "vendor/grammars/atom-language-stan"]
path = vendor/grammars/atom-language-stan
url = https://github.com/jrnold/atom-language-stan
[submodule "vendor/grammars/language-yang"]
path = vendor/grammars/language-yang
url = https://github.com/DzonyKalafut/language-yang.git
[submodule "vendor/grammars/perl6fe"]
path = vendor/grammars/perl6fe
url = https://github.com/MadcapJake/language-perl6fe.git
[submodule "vendor/grammars/language-less"]
path = vendor/grammars/language-less
url = https://github.com/atom/language-less.git
[submodule "vendor/grammars/language-povray"]
path = vendor/grammars/language-povray
url = https://github.com/c-lipka/language-povray
[submodule "vendor/grammars/sublime-terra"]
path = vendor/grammars/sublime-terra
url = https://github.com/pyk/sublime-terra

View File

@@ -1,4 +1,3 @@
source 'https://rubygems.org'
gemspec :name => "github-linguist"
gemspec :name => "github-linguist-grammars"
gem 'byebug' if RUBY_VERSION >= '2.0'

View File

@@ -114,4 +114,9 @@ lib/linguist.rb
Please check out our [contributing guidelines](CONTRIBUTING.md).
##
## License
The language grammars included in this gem are covered by their repositories'
respective licenses. `grammars.yml` specifies the repository for each grammar.
All other files are covered by the MIT license, see `LICENSE`.

View File

@@ -40,18 +40,14 @@ task :samples do
end
task :build_gem => :samples do
rm_rf "grammars"
sh "script/convert-grammars"
languages = YAML.load_file("lib/linguist/languages.yml")
File.write("lib/linguist/languages.json", Yajl.dump(languages))
`gem build github-linguist.gemspec`
File.delete("lib/linguist/languages.json")
end
task :build_grammars_gem do
rm_rf "grammars"
sh "script/convert-grammars"
sh "gem", "build", "github-linguist-grammars.gemspec"
end
namespace :benchmark do
benchmark_path = "benchmark/results"

View File

@@ -1,14 +0,0 @@
require File.expand_path('../lib/linguist/version', __FILE__)
Gem::Specification.new do |s|
s.name = 'github-linguist-grammars'
s.version = Linguist::VERSION
s.summary = "Language grammars for use with github-linguist"
s.authors = "GitHub"
s.homepage = "https://github.com/github/linguist"
s.files = ['lib/linguist/grammars.rb'] + Dir['grammars/*']
s.add_development_dependency 'plist', '~>3.1'
end

View File

@@ -10,7 +10,7 @@ Gem::Specification.new do |s|
s.homepage = "https://github.com/github/linguist"
s.license = "MIT"
s.files = Dir['lib/**/*'] - ['lib/linguist/grammars.rb'] + ['LICENSE']
s.files = Dir['lib/**/*'] + Dir['grammars/*'] + ['LICENSE']
s.executables = ['linguist', 'git-linguist']
s.add_dependency 'charlock_holmes', '~> 0.7.3'
@@ -20,6 +20,7 @@ Gem::Specification.new do |s|
s.add_development_dependency 'minitest', '>= 5.0'
s.add_development_dependency 'mocha'
s.add_development_dependency 'plist', '~>3.1'
s.add_development_dependency 'pry'
s.add_development_dependency 'rake'
s.add_development_dependency 'yajl-ruby'

12
grammars.yml Normal file → Executable file
View File

@@ -354,10 +354,14 @@ vendor/grammars/language-javascript:
vendor/grammars/language-jsoniq/:
- source.jq
- source.xq
vendor/grammars/language-less/:
- source.css.less
vendor/grammars/language-maxscript:
- source.maxscript
vendor/grammars/language-ncl:
- source.ncl
vendor/grammars/language-povray:
- source.pov-ray sdl
vendor/grammars/language-python:
- text.python.console
- text.python.traceback
@@ -372,6 +376,8 @@ vendor/grammars/language-xbase:
- source.harbour
vendor/grammars/language-yaml:
- source.yaml
vendor/grammars/language-yang/:
- source.yang
vendor/grammars/latex.tmbundle:
- text.bibtex
- text.log.latex
@@ -379,8 +385,6 @@ vendor/grammars/latex.tmbundle:
- text.tex.latex
- text.tex.latex.beamer
- text.tex.latex.memoir
vendor/grammars/less.tmbundle:
- source.css.less
vendor/grammars/lilypond.tmbundle:
- source.lilypond
vendor/grammars/liquid.tmbundle:
@@ -443,6 +447,10 @@ vendor/grammars/pascal.tmbundle:
vendor/grammars/perl.tmbundle/:
- source.perl
- source.perl.6
vendor/grammars/perl6fe:
- source.meta-info
- source.perl6fe
- source.regexp.perl6fe
vendor/grammars/php-smarty.tmbundle:
- text.html.smarty
vendor/grammars/php.tmbundle:

View File

@@ -1,5 +1,6 @@
require 'linguist/blob_helper'
require 'linguist/generated'
require 'linguist/grammars'
require 'linguist/heuristics'
require 'linguist/language'
require 'linguist/repository'

View File

@@ -72,7 +72,9 @@ module Linguist
vcr_cassette? ||
generated_module? ||
generated_unity3d_meta? ||
generated_racc?
generated_racc? ||
generated_jflex? ||
generated_grammarkit?
end
# Internal: Is the blob an Xcode file?
@@ -373,5 +375,32 @@ module Linguist
return false unless lines.count > 2
return lines[2].start_with?("# This file is automatically generated by Racc")
end
# Internal: Is this a JFlex-generated file?
#
# A JFlex-generated file contains:
# /* The following code was generated by JFlex x.y.z on d/at/e ti:me */
# on the first line.
#
# Return true or false
def generated_jflex?
return false unless extname == '.java'
return false unless lines.count > 1
return lines[0].start_with?("/* The following code was generated by JFlex ")
end
# Internal: Is this a GrammarKit-generated file?
#
# A GrammarKit-generated file typically contain:
# // This is a generated file. Not intended for manual editing.
# on the first line. This is not always the case, as it's possible to
# customize the class header.
#
# Return true or false
def generated_grammarkit?
return false unless extname == '.java'
return false unless lines.count > 1
return lines[0].start_with?("// This is a generated file. Not intended for manual editing.")
end
end
end

View File

@@ -1,6 +1,3 @@
# Note: This file is included in the github-linguist-grammars gem, not the
# github-linguist gem.
module Linguist
module Grammars
# Get the path to the directory containing the language grammar JSON files.

View File

@@ -321,6 +321,14 @@ module Linguist
end
end
disambiguate ".rpy" do |data|
if /(^(import|from|class|def)[\s\S])/m.match(data)
Language["Python"]
else
Language["Ren'Py"]
end
end
disambiguate ".rs" do |data|
if /^(use |fn |mod |pub |macro_rules|impl|#!?\[)/.match(data)
Language["Rust"]

91
lib/linguist/languages.yml Normal file → Executable file
View File

@@ -475,6 +475,13 @@ CSS:
extensions:
- .css
CSV:
type: data
ace_mode: text
tm_scope: none
extensions:
- .csv
Cap'n Proto:
type: programming
tm_scope: source.capnp
@@ -1283,6 +1290,7 @@ Groff:
- '.8'
- '.9'
- .l
- .me
- .ms
- .n
- .rno
@@ -1303,6 +1311,8 @@ Groovy:
- .gvy
interpreters:
- groovy
filenames:
- Jenkinsfile
Groovy Server Pages:
type: programming
@@ -1323,6 +1333,16 @@ HCL:
ace_mode: ruby
tm_scope: source.ruby
HLSL:
type: programming
extensions:
- .hlsl
- .fx
- .fxh
- .hlsli
ace_mode: text
tm_scope: none
HTML:
type: markup
tm_scope: text.html.basic
@@ -1988,6 +2008,25 @@ M:
tm_scope: source.lisp
ace_mode: lisp
M4:
type: programming
extensions:
- .m4
tm_scope: none
ace_mode: text
M4Sugar:
type: programming
group: M4
aliases:
- autoconf
extensions:
- .m4
filenames:
- configure.ac
tm_scope: none
ace_mode: text
MAXScript:
type: programming
color: "#00a6a6"
@@ -2029,6 +2068,8 @@ Makefile:
- GNUmakefile
- Kbuild
- Makefile
- Makefile.am
- Makefile.in
- Makefile.inc
- makefile
interpreters:
@@ -2555,6 +2596,16 @@ PLpgSQL:
extensions:
- .sql
POV-Ray SDL:
type: programming
aliases:
- pov-ray
- povray
extensions:
- .pov
- .inc
ace_mode: text
Pan:
type: programming
color: '#cc0000'
@@ -2654,7 +2705,7 @@ Perl6:
- Rexfile
interpreters:
- perl6
tm_scope: source.perl.6
tm_scope: source.perl6fe
ace_mode: perl
Pickle:
@@ -2749,8 +2800,10 @@ Prolog:
- .pl
- .pro
- .prolog
- .yap
interpreters:
- swipl
- yap
tm_scope: source.prolog
ace_mode: prolog
@@ -2820,6 +2873,7 @@ Python:
color: "#3572A5"
extensions:
- .py
- .bzl
- .cgi
- .fcgi
- .gyp
@@ -2828,10 +2882,12 @@ Python:
- .pyp
- .pyt
- .pyw
- .rpy
- .tac
- .wsgi
- .xpy
filenames:
- BUCK
- BUILD
- SConscript
- SConstruct
@@ -3001,7 +3057,6 @@ Redcode:
Ren'Py:
type: programming
group: Python
aliases:
- renpy
color: "#ff7f7f"
@@ -3274,6 +3329,7 @@ Shell:
color: "#89e051"
aliases:
- sh
- shell-script
- bash
- zsh
extensions:
@@ -3284,6 +3340,7 @@ Shell:
- .command
- .fcgi
- .ksh
- .sh.in
- .tmux
- .tool
- .zsh
@@ -3526,7 +3583,20 @@ Text:
extensions:
- .txt
- .fr
- .nb
- .ncl
- .no
filenames:
- COPYING
- INSTALL
- LICENSE
- NEWS
- README.me
- click.me
- delete.me
- keep.me
- read.me
- test.me
tm_scope: none
ace_mode: text
@@ -3601,6 +3671,13 @@ Unity3D Asset:
- .unity
tm_scope: source.yaml
Uno:
type: programming
extensions:
- .uno
ace_mode: csharp
tm_scope: source.cs
UnrealScript:
type: programming
color: "#a54c4d"
@@ -3807,6 +3884,7 @@ XML:
- .tsx
- .ui
- .urdf
- .ux
- .vbproj
- .vcxproj
- .vxml
@@ -3823,6 +3901,7 @@ XML:
- .xliff
- .xmi
- .xml.dist
- .xproj
- .xsd
- .xul
- .zcml
@@ -3908,11 +3987,19 @@ YAML:
- .yml
- .reek
- .rviz
- .sublime-syntax
- .syntax
- .yaml
- .yaml-tmlanguage
ace_mode: yaml
YANG:
type: data
extensions:
- .yang
tm_scope: source.yang
ace_mode: text
Yacc:
type: programming
extensions:

View File

@@ -5,12 +5,12 @@ module Linguist
# First form vim modeline
# [text]{white}{vi:|vim:|ex:}[white]{options}
# ex: 'vim: syntax=perl'
# ex: 'vim: syntax=ruby'
VIM_MODELINE_1 = /(?:vim|vi|ex):\s*(?:ft|filetype|syntax)=(\w+)\s?/i
# Second form vim modeline (compatible with some versions of Vi)
# [text]{white}{vi:|vim:|Vim:|ex:}[white]se[t] {options}:[text]
# ex: 'vim set syntax=perl:'
# ex: 'vim set syntax=ruby:'
VIM_MODELINE_2 = /(?:vim|vi|Vim|ex):\s*se(?:t)?.*\s(?:ft|filetype|syntax)=(\w+)\s?.*:/i
MODELINES = [EMACS_MODELINE, VIM_MODELINE_1, VIM_MODELINE_2]

View File

@@ -20,10 +20,17 @@
- ^deps/
- ^tools/
- (^|/)configure$
- (^|/)configure.ac$
- (^|/)config.guess$
- (^|/)config.sub$
# stuff autogenerated by autoconf - still C deps
- (^|/)aclocal.m4
- (^|/)libtool.m4
- (^|/)ltoptions.m4
- (^|/)ltsugar.m4
- (^|/)ltversion.m4
- (^|/)lt~obsolete.m4
# Linters
- cpplint.py
@@ -302,3 +309,6 @@
# Android Google APIs
- (^|/)\.google_apis/
# Jenkins Pipeline
- ^Jenkinsfile$

View File

@@ -1,3 +1,3 @@
module Linguist
VERSION = "4.7.4"
VERSION = "4.7.6"
end

View File

@@ -1,3 +1,3 @@
Year,Make,Model,Length
1997,Ford,E350,2.34
2000,Mercury,Cougar,2.38
2000,Mercury,Cougar,2.38
1 Year Make Model Length
2 1997 Ford E350 2.34
3 2000 Mercury Cougar 2.38

View File

@@ -0,0 +1,54 @@
typedef engine isEngineMessage;
typedef turn isTurnMessage;
typedef connect isConnectMessage;
typedef disconnect isDisconnectMessage;
ClientMessage(char* data) => ();
ParseMessage(char* data) => (int type, int client, char* data);
ReadMessage(int type, int client, char* data) => ();
ParseEngine(int type, int client, char* data) => (int client, int direction);
DoEngine(int client, int direction) => ();
ParseTurn(int type, int client, char* data) => (int client, int direction);
DoTurn(int client, int direction) => ();
ParseConnect(int type, int client, char* data)
=> (int client, char* host, int port);
DoConnect(int client, char* host, int port) => ();
ParseDisconnect(int type, int client, char* data) => (int client);
DoDisconnect(int client) => ();
UpdateBoard(ClientList clients) => (ClientList clients);
SendData(ClientList clients) => ();
DoUpdate(ClientList clients) => ();
DataTimer() => (ClientList clients);
GetClients() => (ClientList clients);
Wait(ClientList clients) => (ClientList clients);
Listen () => (char* data);
source Listen => ClientMessage;
source DataTimer => DoUpdate;
DataTimer = GetClients -> Wait;
DoUpdate = UpdateBoard -> SendData;
ClientMessage=ParseMessage -> ReadMessage;
ReadMessage:[engine, _, _] = ParseEngine -> DoEngine;
ReadMessage:[turn, _, _] = ParseTurn -> DoTurn;
ReadMessage:[connect, _, _] = ParseConnect -> DoConnect;
ReadMessage:[disconnect, _, _] = ParseDisconnect -> DoDisconnect;
atomic GetClients:{client_lock};
atomic DoConnect:{client_lock};
atomic DoDisconnect:{client_lock};

View File

@@ -0,0 +1,44 @@
typedef xml TestXML;
typedef html TestHTML;
typedef inCache TestInCache;
Page (int socket) => ();
ReadRequest (int socket) => (int socket, bool close, image_tag *request);
CheckCache (int socket, bool close, image_tag *request)
=> (int socket, bool close, image_tag *request);
Handler (int socket, bool close, image_tag *request)
=> (int socket, bool close, image_tag *request);
Complete (int socket, bool close, image_tag *request) => ();
ReadInFromDisk (int socket, bool close, image_tag *request)
=> (int socket, bool close, image_tag *request, __u8 *rgb_data);
Write (int socket, bool close, image_tag *request)
=> (int socket, bool close, image_tag *request);
Compress(int socket, bool close, image_tag *request, __u8 *rgb_data)
=> (int socket, bool close, image_tag *request);
StoreInCache(int socket, bool close, image_tag *request)
=> (int socket, bool close, image_tag *request);
Listen ()
=> (int socket);
source Listen => Page;
Handler:[_, _, inCache]=;
Handler:[_, _, _]=ReadInFromDisk -> Compress -> StoreInCache;
Page = ReadRequest -> CheckCache-> Handler -> Write -> Complete;
atomic CheckCache:{cache};
atomic StoreInCache:{cache};
atomic Complete:{cache};
handle error ReadInFromDisk => FourOhFor;

151
samples/FLUX/mbittorrent.fx Normal file
View File

@@ -0,0 +1,151 @@
typedef choke TestChoke;
typedef unchoke TestUnchoke;
typedef interested TestInterested;
typedef uninterested TestUninterested;
typedef request TestRequest;
typedef cancel TestCancel;
typedef piece TestPiece;
typedef bitfield TestBitfield;
typedef have TestHave;
typedef piececomplete TestPieceComplete;
CheckinWithTracker (torrent_data_t *tdata)
=> ();
SendRequestToTracker (torrent_data_t *tdata)
=> (torrent_data_t *tdata, int socket);
GetTrackerResponse (torrent_data_t *tdata, int socket)
=> ();
UpdateChokeList (torrent_data_t *tdata)
=> ();
PickChoked (torrent_data_t *tdata)
=> (torrent_data_t *tdata, chokelist_t clist);
SendChokeUnchoke (torrent_data_t *tdata, chokelist_t clist)
=> ();
SetupConnection (torrent_data_t *tdata, int socket)
=> ();
Handshake (torrent_data_t *tdata, int socket)
=> (torrent_data_t *tdata, client_data_t *client);
SendBitfield (torrent_data_t *tdata, client_data_t *client)
=> ();
Message (torrent_data_t *tdata, client_data_t *client)
=> ();
ReadMessage (torrent_data_t *tdata, client_data_t *client)
=> (torrent_data_t *tdata, client_data_t *client, int type, int length, char *payload);
HandleMessage (torrent_data_t *tdata, client_data_t *client, int type, int length, char *payload)
=> (client_data_t *client);
MessageDone (client_data_t *client)
=> ();
CompletePiece (torrent_data_t *tdata, client_data_t *client, int piece)
=> (torrent_data_t *tdata, client_data_t *client);
VerifyPiece (torrent_data_t *tdata, client_data_t *client, int piece)
=> (torrent_data_t *tdata, client_data_t *client, int piece);
SendHave (torrent_data_t *tdata, client_data_t *client, int piece)
=> (torrent_data_t *tdata, client_data_t *client);
SendUninterested (torrent_data_t *tdata, client_data_t *client)
=> (torrent_data_t *tdata, client_data_t *client);
Choke (torrent_data_t *tdata, client_data_t *client, int type, int length, char *payload)
=> (client_data_t *client);
Cancel (torrent_data_t *tdata, client_data_t *client, int type, int length, char *payload)
=> (client_data_t *client);
Interested (torrent_data_t *tdata, client_data_t *client, int type, int length, char *payload)
=> (client_data_t *client);
Uninterested (torrent_data_t *tdata, client_data_t *client, int type, int length, char *payload)
=> (client_data_t *client);
Bitfield (torrent_data_t *tdata, client_data_t *client, int type, int length, char *payload)
=> (client_data_t *client);
Unchoke (torrent_data_t *tdata, client_data_t *client, int type, int length, char *payload)
=> (torrent_data_t *tdata, client_data_t *client);
SendRequest (torrent_data_t *tdata, client_data_t *client)
=> (client_data_t *client);
Have (torrent_data_t *tdata, client_data_t *client, int type, int length, char *payload)
=> (torrent_data_t *tdata, client_data_t *client);
Piece (torrent_data_t *tdata, client_data_t *client, int type, int length, char *payload)
=> (torrent_data_t *tdata, client_data_t *client, int piece);
Request (torrent_data_t *tdata, client_data_t *client, int type, int length, char *payload)
=> (client_data_t *client);
SendKeepAlives (torrent_data_t *tdata)
=> ();
GetClients ()
=> (int maxfd, fd_set *fds);
SelectSockets (int maxfd, fd_set *fds)
=> (fd_set *fds);
CheckSockets (fd_set *fds)
=> (torrent_data_t *tdata, client_data_t *client);
TrackerTimer ()
=> (torrent_data_t *tdata);
ChokeTimer ()
=> (torrent_data_t *tdata);
Connect ()
=> (torrent_data_t *tdata, int socket);
KeepAliveTimer ()
=> (torrent_data_t *tdata);
Listen ()
=> (torrent_data_t *tdata, client_data_t *client);
source TrackerTimer => CheckinWithTracker;
source ChokeTimer => UpdateChokeList;
source Connect => SetupConnection;
source Listen => Message;
source KeepAliveTimer => SendKeepAlives;
Listen = GetClients -> SelectSockets -> CheckSockets;
CheckinWithTracker = SendRequestToTracker -> GetTrackerResponse;
UpdateChokeList = PickChoked -> SendChokeUnchoke;
SetupConnection = Handshake -> SendBitfield;
Message = ReadMessage -> HandleMessage -> MessageDone;
CompletePiece:[_, _, piececomplete] = VerifyPiece -> SendHave -> SendUninterested;
HandleMessage:[_, _, choke, _, _] = Choke;
HandleMessage:[_, _, unchoke, _, _] = Unchoke -> SendRequest;
HandleMessage:[_, _, interested, _, _] = Interested;
HandleMessage:[_, _, uninterested, _, _] = Uninterested;
HandleMessage:[_, _, request, _, _] = Request;
HandleMessage:[_, _, cancel, _, _] = Cancel;
HandleMessage:[_, _, piece, _, _] = Piece -> CompletePiece -> SendRequest;
HandleMessage:[_, _, bitfield, _, _] = Bitfield;
HandleMessage:[_, _, have, _, _] = Have -> SendRequest;
atomic GetClients:{BigLock};
atomic CheckSockets:{BigLock};
atomic Message:{BigLock};
atomic CheckinWithTracker:{BigLock};
atomic UpdateChokeList:{BigLock};
atomic SetupConnection:{BigLock};
atomic SendKeepAlives:{BigLock};

38
samples/FLUX/test.fx Normal file
View File

@@ -0,0 +1,38 @@
// concrete node signatures
Listen ()
=> (int socket);
ReadRequest (int socket)
=> (int socket, bool close, image_tag *request);
CheckCache (int socket, bool close, image_tag *request)
=> (int socket, bool close, image_tag *request);
// omitted for space:
// ReadInFromDisk, StoreInCache
Compress (int socket, bool close, image_tag *request, __u8 *rgb_data)
=> (int socket, bool close, image_tag *request);
Write (int socket, bool close, image_tag *request)
=> (int socket, bool close, image_tag *request);
Complete (int socket, bool close, image_tag *request) => ();
// source node
source Listen => Image;
// abstract node
Image = ReadRequest -> CheckCache -> Handler -> Write -> Complete;
// predicate type & dispatch
typedef hit TestInCache;
Handler:[_, _, hit] = ;
Handler:[_, _, _] =
ReadInFromDisk -> Compress -> StoreInCache;
// error handler
handle error ReadInFromDisk => FourOhFor;
// atomicity constraints
atomic CheckCache:{cache};
atomic StoreInCache:{cache};
atomic Complete:{cache};

46
samples/Groovy/filenames/Jenkinsfile vendored Normal file
View File

@@ -0,0 +1,46 @@
jettyUrl = 'http://localhost:8081/'
def servers
stage 'Dev'
node {
checkout scm
servers = load 'servers.groovy'
mvn '-o clean package'
dir('target') {stash name: 'war', includes: 'x.war'}
}
stage 'QA'
parallel(longerTests: {
runTests(servers, 30)
}, quickerTests: {
runTests(servers, 20)
})
stage name: 'Staging', concurrency: 1
node {
servers.deploy 'staging'
}
input message: "Does ${jettyUrl}staging/ look good?"
stage name: 'Production', concurrency: 1
node {
sh "wget -O - -S ${jettyUrl}staging/"
echo 'Production server looks to be alive'
servers.deploy 'production'
echo "Deployed to ${jettyUrl}production/"
}
def mvn(args) {
sh "${tool 'Maven 3.x'}/bin/mvn ${args}"
}
def runTests(servers, duration) {
node {
checkout scm
servers.runWithServer {id ->
mvn "-o -f sometests test -Durl=${jettyUrl}${id}/ -Dduration=${duration}"
}
}
}

View File

@@ -0,0 +1,27 @@
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// To compile these two shaders:
// fxc /E pixelMain /T ps_2_0 accelerated_surface_win.hlsl
// fxc /E vertexMain /T vs_2_0 accelerated_surface_win.hlsl
//
// fxc is in the DirectX SDK.
struct Vertex {
float4 position : POSITION;
float2 texCoord : TEXCOORD0;
};
texture t;
sampler s;
// Passes a position and texture coordinate to the pixel shader.
Vertex vertexMain(Vertex input) {
return input;
};
// Samples a texture at the given texture coordinate and returns the result.
float4 pixelMain(float2 texCoord : TEXCOORD0) : COLOR0 {
return tex2D(s, texCoord);
};

105
samples/HLSL/corridor.fx Normal file
View File

@@ -0,0 +1,105 @@
float4x4 matWorldView : WORLDVIEW;
float4x4 matWorldViewProjection : WORLDVIEWPROJECTION;
struct VS_INPUT {
float4 Position : POSITION0;
float3 Normal : NORMAL;
float3 Tangent : TANGENT;
float3 Binormal : BINORMAL;
float2 TexCoord0 : TEXCOORD0;
float2 TexCoord1 : TEXCOORD1;
};
struct VS_OUTPUT {
float4 Position : POSITION0;
float2 TexCoord0 : TEXCOORD0;
float2 TexCoord1 : TEXCOORD1;
float3x3 TangentToView : TEXCOORD2;
};
VS_OUTPUT vs_main(VS_INPUT input)
{
VS_OUTPUT output;
output.Position = mul(input.Position, matWorldViewProjection);
output.TexCoord0 = input.TexCoord0 * 5;
output.TexCoord1 = input.TexCoord1;
output.TangentToView[0] = mul(float4(input.Tangent, 0), matWorldView).xyz;
output.TangentToView[1] = mul(float4(input.Binormal, 0), matWorldView).xyz;
output.TangentToView[2] = mul(float4(input.Normal, 0), matWorldView).xyz;
return output;
}
struct PS_OUTPUT {
float4 gbuffer0 : COLOR0;
float4 gbuffer1 : COLOR1;
};
texture albedo_tex;
sampler albedo_samp = sampler_state {
Texture = (albedo_tex);
MipFilter = Linear;
MinFilter = Linear;
MagFilter = Linear;
AddressU = Wrap;
AddressV = Wrap;
sRGBTexture = True;
};
texture normal_tex;
sampler normal_samp = sampler_state {
Texture = (normal_tex);
MipFilter = Linear;
MinFilter = Linear;
MagFilter = Linear;
AddressU = Wrap;
AddressV = Wrap;
sRGBTexture = False;
};
texture specular_tex;
sampler specular_samp = sampler_state {
Texture = (specular_tex);
MipFilter = Linear;
MinFilter = Linear;
MagFilter = Linear;
AddressU = Wrap;
AddressV = Wrap;
sRGBTexture = True;
};
texture ao_tex;
sampler ao_samp = sampler_state {
Texture = (ao_tex);
MipFilter = Linear;
MinFilter = Linear;
MagFilter = Linear;
AddressU = Wrap;
AddressV = Wrap;
sRGBTexture = True;
};
PS_OUTPUT ps_main(VS_OUTPUT Input)
{
PS_OUTPUT o;
float3 tangentNormal = normalize(tex2D(normal_samp, Input.TexCoord0).xyz * 2 - 1);
float3 eyeNormal = normalize(mul(tangentNormal, Input.TangentToView));
float3 albedo = tex2D(albedo_samp, Input.TexCoord0).rgb;
float ao = tex2D(ao_samp, Input.TexCoord1).r * 0.75;
float spec = tex2D(specular_samp, Input.TexCoord0).r;
o.gbuffer0 = float4(eyeNormal, spec * ao);
o.gbuffer1 = float4(albedo, 1 - ao);
return o;
}
technique mesh {
pass Geometry {
VertexShader = compile vs_3_0 vs_main();
PixelShader = compile ps_3_0 ps_main();
AlphaBlendEnable = False;
ZWriteEnable = True;
}
}

119
samples/HLSL/jellyfish.fx Normal file
View File

@@ -0,0 +1,119 @@
float4x4 matWorldViewProjection : WORLDVIEWPROJECTION;
float4x4 matWorldView : WORLDVIEW;
float4x4 matWorld : WORLD;
float4x4 matView : VIEW;
uniform float4 vViewPosition;
struct VS_INPUT
{
float3 Pos: POSITION;
float3 Normal: NORMAL;
float3 Tangent: TANGENT;
float3 Binormal: BINORMAL;
};
struct VS_OUTPUT
{
float4 Pos : POSITION;
float3 reflection : TEXCOORD1;
float3 refraction : TEXCOORD2;
float fresnel : TEXCOORD3;
};
uniform float3 amt;
uniform float3 scale;
uniform float3 phase;
float3 deform(float3 p)
{
float s = 3;
float3 p2 = p * scale + phase;
s += sin(p2.x) * amt.x;
s += sin(p2.y) * amt.y;
s += sin(p2.z) * amt.z;
return p * s / 3;
}
VS_OUTPUT vs_main( VS_INPUT In )
{
VS_OUTPUT Out;
float3 pos = In.Pos;
float3 norm = In.Normal;
float3 p1 = pos + In.Tangent * 0.05;
float3 p2 = pos + In.Binormal * 0.05;
pos = deform(pos);
p1 = deform(p1);
p2 = deform(p2);
p1 -= pos;
p2 -= pos;
norm = normalize(cross(p1, p2));
float3 view = normalize(pos - vViewPosition.xyz);
Out.Pos = mul(float4(pos, 1.0), matWorldViewProjection);
Out.reflection = reflect(view, norm);
Out.refraction = reflect(view, norm * 0.4f); /* fake, but who cares? */
Out.fresnel = dot(view, norm);
norm = mul(float4(norm, 0.0), matWorldViewProjection);
return Out;
}
#define PS_INPUT VS_OUTPUT
#if 0
textureCUBE reflectionMap;
samplerCUBE reflectionMapSampler = sampler_state
{
Texture = (reflectionMap);
MipFilter = LINEAR;
MinFilter = LINEAR;
MagFilter = LINEAR;
};
#else
// textures
texture reflectionMap
<
string type = "CUBE";
string name = "test_cube.dds";
>;
samplerCUBE reflectionMapSampler = sampler_state
{
Texture = (reflectionMap);
MipFilter = LINEAR;
MinFilter = LINEAR;
MagFilter = LINEAR;
};
#endif
struct PS_OUTPUT
{
float4 color : COLOR0;
};
PS_OUTPUT ps_main( PS_INPUT In )
{
PS_OUTPUT Out;
float4 reflection = texCUBE(reflectionMapSampler, normalize(In.reflection)) * 1.5;
float4 refraction = texCUBE(reflectionMapSampler, normalize(In.refraction));
float fresnel = In.fresnel;
// float fresnel = abs(normalize(In.normal).z);
Out.color = lerp(reflection, refraction, fresnel) * pow(1.0 - fresnel * 0.75, 1.0);
return Out;
}
technique blur_ps_vs_2_0
{
pass P0
{
VertexShader = compile vs_2_0 vs_main();
PixelShader = compile ps_2_0 ps_main();
}
}

41
samples/HLSL/noise.fx Normal file
View File

@@ -0,0 +1,41 @@
float alpha = 1.f;
texture tex;
sampler tex_sampler = sampler_state
{
Texture = (tex);
MipFilter = LINEAR;
MinFilter = LINEAR;
MagFilter = LINEAR;
AddressU = WRAP;
AddressV = WRAP;
};
struct VS_OUTPUT
{
float4 pos : POSITION;
float2 tex : TEXCOORD1;
};
VS_OUTPUT vertex(float4 ipos : POSITION, float2 tex : TEXCOORD0)
{
VS_OUTPUT Out;
Out.pos = ipos;
Out.tex = tex * 2;
return Out;
}
float4 pixel(VS_OUTPUT In) : COLOR
{
return tex2D(tex_sampler, In.tex) * alpha;
}
technique blur_ps_vs_2_0
{
pass P0
{
VertexShader = compile vs_2_0 vertex();
PixelShader = compile ps_2_0 pixel();
}
}

View File

@@ -0,0 +1,625 @@
// This is a generated file. Not intended for manual editing.
package org.intellij.grammar.parser;
import com.intellij.lang.PsiBuilder;
import com.intellij.lang.PsiBuilder.Marker;
import static org.intellij.grammar.psi.BnfTypes.*;
import static org.intellij.grammar.parser.GeneratedParserUtilBase.*;
import com.intellij.psi.tree.IElementType;
import com.intellij.lang.ASTNode;
import com.intellij.psi.tree.TokenSet;
import com.intellij.lang.PsiParser;
import com.intellij.lang.LightPsiParser;
@SuppressWarnings({"SimplifiableIfStatement", "UnusedAssignment"})
public class GrammarParser implements PsiParser, LightPsiParser {
public ASTNode parse(IElementType t, PsiBuilder b) {
parseLight(t, b);
return b.getTreeBuilt();
}
public void parseLight(IElementType t, PsiBuilder b) {
boolean r;
b = adapt_builder_(t, b, this, EXTENDS_SETS_);
Marker m = enter_section_(b, 0, _COLLAPSE_, null);
if (t == BNF_ATTR) {
r = attr(b, 0);
}
else if (t == BNF_ATTR_PATTERN) {
r = attr_pattern(b, 0);
}
else if (t == BNF_ATTR_VALUE) {
r = attr_value(b, 0);
}
else if (t == BNF_ATTRS) {
r = attrs(b, 0);
}
else if (t == BNF_CHOICE) {
r = choice(b, 0);
}
else if (t == BNF_EXPRESSION) {
r = expression(b, 0);
}
else if (t == BNF_LITERAL_EXPRESSION) {
r = literal_expression(b, 0);
}
else if (t == BNF_MODIFIER) {
r = modifier(b, 0);
}
else if (t == BNF_PAREN_EXPRESSION) {
r = paren_expression(b, 0);
}
else if (t == BNF_PREDICATE) {
r = predicate(b, 0);
}
else if (t == BNF_PREDICATE_SIGN) {
r = predicate_sign(b, 0);
}
else if (t == BNF_QUANTIFIED) {
r = quantified(b, 0);
}
else if (t == BNF_QUANTIFIER) {
r = quantifier(b, 0);
}
else if (t == BNF_REFERENCE_OR_TOKEN) {
r = reference_or_token(b, 0);
}
else if (t == BNF_RULE) {
r = rule(b, 0);
}
else if (t == BNF_SEQUENCE) {
r = sequence(b, 0);
}
else if (t == BNF_STRING_LITERAL_EXPRESSION) {
r = string_literal_expression(b, 0);
}
else {
r = parse_root_(t, b, 0);
}
exit_section_(b, 0, m, t, r, true, TRUE_CONDITION);
}
protected boolean parse_root_(IElementType t, PsiBuilder b, int l) {
return grammar(b, l + 1);
}
public static final TokenSet[] EXTENDS_SETS_ = new TokenSet[] {
create_token_set_(BNF_LITERAL_EXPRESSION, BNF_STRING_LITERAL_EXPRESSION),
create_token_set_(BNF_CHOICE, BNF_EXPRESSION, BNF_LITERAL_EXPRESSION, BNF_PAREN_EXPRESSION,
BNF_PREDICATE, BNF_QUANTIFIED, BNF_REFERENCE_OR_TOKEN, BNF_SEQUENCE,
BNF_STRING_LITERAL_EXPRESSION),
};
/* ********************************************************** */
// id attr_pattern? '=' attr_value ';'?
public static boolean attr(PsiBuilder b, int l) {
if (!recursion_guard_(b, l, "attr")) return false;
boolean r, p;
Marker m = enter_section_(b, l, _NONE_, "<attr>");
r = consumeToken(b, BNF_ID);
p = r; // pin = 1
r = r && report_error_(b, attr_1(b, l + 1));
r = p && report_error_(b, consumeToken(b, BNF_OP_EQ)) && r;
r = p && report_error_(b, attr_value(b, l + 1)) && r;
r = p && attr_4(b, l + 1) && r;
exit_section_(b, l, m, BNF_ATTR, r, p, attr_recover_until_parser_);
return r || p;
}
// attr_pattern?
private static boolean attr_1(PsiBuilder b, int l) {
if (!recursion_guard_(b, l, "attr_1")) return false;
attr_pattern(b, l + 1);
return true;
}
// ';'?
private static boolean attr_4(PsiBuilder b, int l) {
if (!recursion_guard_(b, l, "attr_4")) return false;
consumeToken(b, BNF_SEMICOLON);
return true;
}
/* ********************************************************** */
// '(' string ')'
public static boolean attr_pattern(PsiBuilder b, int l) {
if (!recursion_guard_(b, l, "attr_pattern")) return false;
if (!nextTokenIs(b, BNF_LEFT_PAREN)) return false;
boolean r;
Marker m = enter_section_(b);
r = consumeToken(b, BNF_LEFT_PAREN);
r = r && consumeToken(b, BNF_STRING);
r = r && consumeToken(b, BNF_RIGHT_PAREN);
exit_section_(b, m, BNF_ATTR_PATTERN, r);
return r;
}
/* ********************************************************** */
// !'}'
static boolean attr_recover_until(PsiBuilder b, int l) {
if (!recursion_guard_(b, l, "attr_recover_until")) return false;
boolean r;
Marker m = enter_section_(b, l, _NOT_, null);
r = !consumeToken(b, BNF_RIGHT_BRACE);
exit_section_(b, l, m, null, r, false, null);
return r;
}
/* ********************************************************** */
// (reference_or_token | literal_expression) !'='
public static boolean attr_value(PsiBuilder b, int l) {
if (!recursion_guard_(b, l, "attr_value")) return false;
boolean r;
Marker m = enter_section_(b, l, _NONE_, "<attr value>");
r = attr_value_0(b, l + 1);
r = r && attr_value_1(b, l + 1);
exit_section_(b, l, m, BNF_ATTR_VALUE, r, false, null);
return r;
}
// reference_or_token | literal_expression
private static boolean attr_value_0(PsiBuilder b, int l) {
if (!recursion_guard_(b, l, "attr_value_0")) return false;
boolean r;
Marker m = enter_section_(b);
r = reference_or_token(b, l + 1);
if (!r) r = literal_expression(b, l + 1);
exit_section_(b, m, null, r);
return r;
}
// !'='
private static boolean attr_value_1(PsiBuilder b, int l) {
if (!recursion_guard_(b, l, "attr_value_1")) return false;
boolean r;
Marker m = enter_section_(b, l, _NOT_, null);
r = !consumeToken(b, BNF_OP_EQ);
exit_section_(b, l, m, null, r, false, null);
return r;
}
/* ********************************************************** */
// '{' attr* '}'
public static boolean attrs(PsiBuilder b, int l) {
if (!recursion_guard_(b, l, "attrs")) return false;
if (!nextTokenIs(b, BNF_LEFT_BRACE)) return false;
boolean r, p;
Marker m = enter_section_(b, l, _NONE_, null);
r = consumeToken(b, BNF_LEFT_BRACE);
p = r; // pin = 1
r = r && report_error_(b, attrs_1(b, l + 1));
r = p && consumeToken(b, BNF_RIGHT_BRACE) && r;
exit_section_(b, l, m, BNF_ATTRS, r, p, null);
return r || p;
}
// attr*
private static boolean attrs_1(PsiBuilder b, int l) {
if (!recursion_guard_(b, l, "attrs_1")) return false;
int c = current_position_(b);
while (true) {
if (!attr(b, l + 1)) break;
if (!empty_element_parsed_guard_(b, "attrs_1", c)) break;
c = current_position_(b);
}
return true;
}
/* ********************************************************** */
// '{' sequence ('|' sequence)* '}' | sequence choice_tail*
public static boolean choice(PsiBuilder b, int l) {
if (!recursion_guard_(b, l, "choice")) return false;
boolean r;
Marker m = enter_section_(b, l, _COLLAPSE_, "<choice>");
r = choice_0(b, l + 1);
if (!r) r = choice_1(b, l + 1);
exit_section_(b, l, m, BNF_CHOICE, r, false, null);
return r;
}
// '{' sequence ('|' sequence)* '}'
private static boolean choice_0(PsiBuilder b, int l) {
if (!recursion_guard_(b, l, "choice_0")) return false;
boolean r;
Marker m = enter_section_(b);
r = consumeToken(b, BNF_LEFT_BRACE);
r = r && sequence(b, l + 1);
r = r && choice_0_2(b, l + 1);
r = r && consumeToken(b, BNF_RIGHT_BRACE);
exit_section_(b, m, null, r);
return r;
}
// ('|' sequence)*
private static boolean choice_0_2(PsiBuilder b, int l) {
if (!recursion_guard_(b, l, "choice_0_2")) return false;
int c = current_position_(b);
while (true) {
if (!choice_0_2_0(b, l + 1)) break;
if (!empty_element_parsed_guard_(b, "choice_0_2", c)) break;
c = current_position_(b);
}
return true;
}
// '|' sequence
private static boolean choice_0_2_0(PsiBuilder b, int l) {
if (!recursion_guard_(b, l, "choice_0_2_0")) return false;
boolean r;
Marker m = enter_section_(b);
r = consumeToken(b, BNF_OP_OR);
r = r && sequence(b, l + 1);
exit_section_(b, m, null, r);
return r;
}
// sequence choice_tail*
private static boolean choice_1(PsiBuilder b, int l) {
if (!recursion_guard_(b, l, "choice_1")) return false;
boolean r;
Marker m = enter_section_(b);
r = sequence(b, l + 1);
r = r && choice_1_1(b, l + 1);
exit_section_(b, m, null, r);
return r;
}
// choice_tail*
private static boolean choice_1_1(PsiBuilder b, int l) {
if (!recursion_guard_(b, l, "choice_1_1")) return false;
int c = current_position_(b);
while (true) {
if (!choice_tail(b, l + 1)) break;
if (!empty_element_parsed_guard_(b, "choice_1_1", c)) break;
c = current_position_(b);
}
return true;
}
/* ********************************************************** */
// '|' sequence
static boolean choice_tail(PsiBuilder b, int l) {
if (!recursion_guard_(b, l, "choice_tail")) return false;
if (!nextTokenIs(b, BNF_OP_OR)) return false;
boolean r, p;
Marker m = enter_section_(b, l, _NONE_, null);
r = consumeToken(b, BNF_OP_OR);
p = r; // pin = 1
r = r && sequence(b, l + 1);
exit_section_(b, l, m, null, r, p, null);
return r || p;
}
/* ********************************************************** */
// choice?
public static boolean expression(PsiBuilder b, int l) {
if (!recursion_guard_(b, l, "expression")) return false;
Marker m = enter_section_(b, l, _COLLAPSE_, "<expression>");
choice(b, l + 1);
exit_section_(b, l, m, BNF_EXPRESSION, true, false, null);
return true;
}
/* ********************************************************** */
// (attrs | rule) *
static boolean grammar(PsiBuilder b, int l) {
if (!recursion_guard_(b, l, "grammar")) return false;
int c = current_position_(b);
while (true) {
if (!grammar_0(b, l + 1)) break;
if (!empty_element_parsed_guard_(b, "grammar", c)) break;
c = current_position_(b);
}
return true;
}
// attrs | rule
private static boolean grammar_0(PsiBuilder b, int l) {
if (!recursion_guard_(b, l, "grammar_0")) return false;
boolean r;
Marker m = enter_section_(b);
r = attrs(b, l + 1);
if (!r) r = rule(b, l + 1);
exit_section_(b, m, null, r);
return r;
}
/* ********************************************************** */
// string_literal_expression | number
public static boolean literal_expression(PsiBuilder b, int l) {
if (!recursion_guard_(b, l, "literal_expression")) return false;
if (!nextTokenIs(b, "<literal expression>", BNF_NUMBER, BNF_STRING)) return false;
boolean r;
Marker m = enter_section_(b, l, _COLLAPSE_, "<literal expression>");
r = string_literal_expression(b, l + 1);
if (!r) r = consumeToken(b, BNF_NUMBER);
exit_section_(b, l, m, BNF_LITERAL_EXPRESSION, r, false, null);
return r;
}
/* ********************************************************** */
// 'private' | 'external' | 'wrapped'
public static boolean modifier(PsiBuilder b, int l) {
if (!recursion_guard_(b, l, "modifier")) return false;
boolean r;
Marker m = enter_section_(b, l, _NONE_, "<modifier>");
r = consumeToken(b, "private");
if (!r) r = consumeToken(b, "external");
if (!r) r = consumeToken(b, "wrapped");
exit_section_(b, l, m, BNF_MODIFIER, r, false, null);
return r;
}
/* ********************************************************** */
// quantified | predicate
static boolean option(PsiBuilder b, int l) {
if (!recursion_guard_(b, l, "option")) return false;
boolean r;
Marker m = enter_section_(b);
r = quantified(b, l + 1);
if (!r) r = predicate(b, l + 1);
exit_section_(b, m, null, r);
return r;
}
/* ********************************************************** */
// '(' expression ')'
public static boolean paren_expression(PsiBuilder b, int l) {
if (!recursion_guard_(b, l, "paren_expression")) return false;
if (!nextTokenIs(b, BNF_LEFT_PAREN)) return false;
boolean r, p;
Marker m = enter_section_(b, l, _NONE_, null);
r = consumeToken(b, BNF_LEFT_PAREN);
p = r; // pin = 1
r = r && report_error_(b, expression(b, l + 1));
r = p && consumeToken(b, BNF_RIGHT_PAREN) && r;
exit_section_(b, l, m, BNF_PAREN_EXPRESSION, r, p, null);
return r || p;
}
/* ********************************************************** */
// predicate_sign simple
public static boolean predicate(PsiBuilder b, int l) {
if (!recursion_guard_(b, l, "predicate")) return false;
if (!nextTokenIs(b, "<predicate>", BNF_OP_NOT, BNF_OP_AND)) return false;
boolean r;
Marker m = enter_section_(b, l, _NONE_, "<predicate>");
r = predicate_sign(b, l + 1);
r = r && simple(b, l + 1);
exit_section_(b, l, m, BNF_PREDICATE, r, false, null);
return r;
}
/* ********************************************************** */
// '&' | '!'
public static boolean predicate_sign(PsiBuilder b, int l) {
if (!recursion_guard_(b, l, "predicate_sign")) return false;
if (!nextTokenIs(b, "<predicate sign>", BNF_OP_NOT, BNF_OP_AND)) return false;
boolean r;
Marker m = enter_section_(b, l, _NONE_, "<predicate sign>");
r = consumeToken(b, BNF_OP_AND);
if (!r) r = consumeToken(b, BNF_OP_NOT);
exit_section_(b, l, m, BNF_PREDICATE_SIGN, r, false, null);
return r;
}
/* ********************************************************** */
// '[' expression ']' | simple quantifier?
public static boolean quantified(PsiBuilder b, int l) {
if (!recursion_guard_(b, l, "quantified")) return false;
boolean r;
Marker m = enter_section_(b, l, _COLLAPSE_, "<quantified>");
r = quantified_0(b, l + 1);
if (!r) r = quantified_1(b, l + 1);
exit_section_(b, l, m, BNF_QUANTIFIED, r, false, null);
return r;
}
// '[' expression ']'
private static boolean quantified_0(PsiBuilder b, int l) {
if (!recursion_guard_(b, l, "quantified_0")) return false;
boolean r;
Marker m = enter_section_(b);
r = consumeToken(b, BNF_LEFT_BRACKET);
r = r && expression(b, l + 1);
r = r && consumeToken(b, BNF_RIGHT_BRACKET);
exit_section_(b, m, null, r);
return r;
}
// simple quantifier?
private static boolean quantified_1(PsiBuilder b, int l) {
if (!recursion_guard_(b, l, "quantified_1")) return false;
boolean r;
Marker m = enter_section_(b);
r = simple(b, l + 1);
r = r && quantified_1_1(b, l + 1);
exit_section_(b, m, null, r);
return r;
}
// quantifier?
private static boolean quantified_1_1(PsiBuilder b, int l) {
if (!recursion_guard_(b, l, "quantified_1_1")) return false;
quantifier(b, l + 1);
return true;
}
/* ********************************************************** */
// '?' | '+' | '*'
public static boolean quantifier(PsiBuilder b, int l) {
if (!recursion_guard_(b, l, "quantifier")) return false;
boolean r;
Marker m = enter_section_(b, l, _NONE_, "<quantifier>");
r = consumeToken(b, BNF_OP_OPT);
if (!r) r = consumeToken(b, BNF_OP_ONEMORE);
if (!r) r = consumeToken(b, BNF_OP_ZEROMORE);
exit_section_(b, l, m, BNF_QUANTIFIER, r, false, null);
return r;
}
/* ********************************************************** */
// id
public static boolean reference_or_token(PsiBuilder b, int l) {
if (!recursion_guard_(b, l, "reference_or_token")) return false;
if (!nextTokenIs(b, BNF_ID)) return false;
boolean r;
Marker m = enter_section_(b);
r = consumeToken(b, BNF_ID);
exit_section_(b, m, BNF_REFERENCE_OR_TOKEN, r);
return r;
}
/* ********************************************************** */
// modifier* id '::=' expression attrs? ';'?
public static boolean rule(PsiBuilder b, int l) {
if (!recursion_guard_(b, l, "rule")) return false;
boolean r, p;
Marker m = enter_section_(b, l, _NONE_, "<rule>");
r = rule_0(b, l + 1);
r = r && consumeToken(b, BNF_ID);
r = r && consumeToken(b, BNF_OP_IS);
p = r; // pin = 3
r = r && report_error_(b, expression(b, l + 1));
r = p && report_error_(b, rule_4(b, l + 1)) && r;
r = p && rule_5(b, l + 1) && r;
exit_section_(b, l, m, BNF_RULE, r, p, rule_recover_until_parser_);
return r || p;
}
// modifier*
private static boolean rule_0(PsiBuilder b, int l) {
if (!recursion_guard_(b, l, "rule_0")) return false;
int c = current_position_(b);
while (true) {
if (!modifier(b, l + 1)) break;
if (!empty_element_parsed_guard_(b, "rule_0", c)) break;
c = current_position_(b);
}
return true;
}
// attrs?
private static boolean rule_4(PsiBuilder b, int l) {
if (!recursion_guard_(b, l, "rule_4")) return false;
attrs(b, l + 1);
return true;
}
// ';'?
private static boolean rule_5(PsiBuilder b, int l) {
if (!recursion_guard_(b, l, "rule_5")) return false;
consumeToken(b, BNF_SEMICOLON);
return true;
}
/* ********************************************************** */
// !'{'
static boolean rule_recover_until(PsiBuilder b, int l) {
if (!recursion_guard_(b, l, "rule_recover_until")) return false;
boolean r;
Marker m = enter_section_(b, l, _NOT_, null);
r = !consumeToken(b, BNF_LEFT_BRACE);
exit_section_(b, l, m, null, r, false, null);
return r;
}
/* ********************************************************** */
// option +
public static boolean sequence(PsiBuilder b, int l) {
if (!recursion_guard_(b, l, "sequence")) return false;
boolean r;
Marker m = enter_section_(b, l, _COLLAPSE_, "<sequence>");
r = option(b, l + 1);
int c = current_position_(b);
while (r) {
if (!option(b, l + 1)) break;
if (!empty_element_parsed_guard_(b, "sequence", c)) break;
c = current_position_(b);
}
exit_section_(b, l, m, BNF_SEQUENCE, r, false, null);
return r;
}
/* ********************************************************** */
// !(modifier* id '::=' ) reference_or_token | literal_expression | paren_expression
static boolean simple(PsiBuilder b, int l) {
if (!recursion_guard_(b, l, "simple")) return false;
boolean r;
Marker m = enter_section_(b);
r = simple_0(b, l + 1);
if (!r) r = literal_expression(b, l + 1);
if (!r) r = paren_expression(b, l + 1);
exit_section_(b, m, null, r);
return r;
}
// !(modifier* id '::=' ) reference_or_token
private static boolean simple_0(PsiBuilder b, int l) {
if (!recursion_guard_(b, l, "simple_0")) return false;
boolean r;
Marker m = enter_section_(b);
r = simple_0_0(b, l + 1);
r = r && reference_or_token(b, l + 1);
exit_section_(b, m, null, r);
return r;
}
// !(modifier* id '::=' )
private static boolean simple_0_0(PsiBuilder b, int l) {
if (!recursion_guard_(b, l, "simple_0_0")) return false;
boolean r;
Marker m = enter_section_(b, l, _NOT_, null);
r = !simple_0_0_0(b, l + 1);
exit_section_(b, l, m, null, r, false, null);
return r;
}
// modifier* id '::='
private static boolean simple_0_0_0(PsiBuilder b, int l) {
if (!recursion_guard_(b, l, "simple_0_0_0")) return false;
boolean r;
Marker m = enter_section_(b);
r = simple_0_0_0_0(b, l + 1);
r = r && consumeToken(b, BNF_ID);
r = r && consumeToken(b, BNF_OP_IS);
exit_section_(b, m, null, r);
return r;
}
// modifier*
private static boolean simple_0_0_0_0(PsiBuilder b, int l) {
if (!recursion_guard_(b, l, "simple_0_0_0_0")) return false;
int c = current_position_(b);
while (true) {
if (!modifier(b, l + 1)) break;
if (!empty_element_parsed_guard_(b, "simple_0_0_0_0", c)) break;
c = current_position_(b);
}
return true;
}
/* ********************************************************** */
// string
public static boolean string_literal_expression(PsiBuilder b, int l) {
if (!recursion_guard_(b, l, "string_literal_expression")) return false;
if (!nextTokenIs(b, BNF_STRING)) return false;
boolean r;
Marker m = enter_section_(b);
r = consumeToken(b, BNF_STRING);
exit_section_(b, m, BNF_STRING_LITERAL_EXPRESSION, r);
return r;
}
final static Parser attr_recover_until_parser_ = new Parser() {
public boolean parse(PsiBuilder b, int l) {
return attr_recover_until(b, l + 1);
}
};
final static Parser rule_recover_until_parser_ = new Parser() {
public boolean parse(PsiBuilder b, int l) {
return rule_recover_until(b, l + 1);
}
};
}

View File

@@ -0,0 +1,482 @@
/* The following code was generated by JFlex 1.4.3 on 28/01/16 11:27 */
package test;
import com.intellij.lexer.*;
import com.intellij.psi.tree.IElementType;
import static org.intellij.grammar.psi.BnfTypes.*;
/**
* This class is a scanner generated by
* <a href="http://www.jflex.de/">JFlex</a> 1.4.3
* on 28/01/16 11:27 from the specification file
* <tt>/home/abigail/code/intellij-grammar-kit-test/src/test/_GrammarLexer.flex</tt>
*/
public class _GrammarLexer implements FlexLexer {
/** initial size of the lookahead buffer */
private static final int ZZ_BUFFERSIZE = 16384;
/** lexical states */
public static final int YYINITIAL = 0;
/**
* ZZ_LEXSTATE[l] is the state in the DFA for the lexical state l
* ZZ_LEXSTATE[l+1] is the state in the DFA for the lexical state l
* at the beginning of a line
* l is of the form l = 2*k, k a non negative integer
*/
private static final int ZZ_LEXSTATE[] = {
0, 0
};
/**
* Translates characters to character classes
*/
private static final String ZZ_CMAP_PACKED =
"\11\0\1\1\1\1\1\0\1\1\1\1\22\0\1\1\101\0\1\13"+
"\1\0\1\3\1\14\1\0\1\10\1\0\1\2\3\0\1\12\1\7"+
"\3\0\1\6\1\4\1\5\1\11\uff8a\0";
/**
* Translates characters to character classes
*/
private static final char [] ZZ_CMAP = zzUnpackCMap(ZZ_CMAP_PACKED);
/**
* Translates DFA states to action switch labels.
*/
private static final int [] ZZ_ACTION = zzUnpackAction();
private static final String ZZ_ACTION_PACKED_0 =
"\1\0\1\1\1\2\3\1\1\3\10\0\1\4\1\5";
private static int [] zzUnpackAction() {
int [] result = new int[17];
int offset = 0;
offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result);
return result;
}
private static int zzUnpackAction(String packed, int offset, int [] result) {
int i = 0; /* index in packed string */
int j = offset; /* index in unpacked array */
int l = packed.length();
while (i < l) {
int count = packed.charAt(i++);
int value = packed.charAt(i++);
do result[j++] = value; while (--count > 0);
}
return j;
}
/**
* Translates a state to a row index in the transition table
*/
private static final int [] ZZ_ROWMAP = zzUnpackRowMap();
private static final String ZZ_ROWMAP_PACKED_0 =
"\0\0\0\15\0\32\0\47\0\64\0\101\0\15\0\116"+
"\0\133\0\150\0\165\0\202\0\217\0\234\0\251\0\15"+
"\0\15";
private static int [] zzUnpackRowMap() {
int [] result = new int[17];
int offset = 0;
offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result);
return result;
}
private static int zzUnpackRowMap(String packed, int offset, int [] result) {
int i = 0; /* index in packed string */
int j = offset; /* index in unpacked array */
int l = packed.length();
while (i < l) {
int high = packed.charAt(i++) << 16;
result[j++] = high | packed.charAt(i++);
}
return j;
}
/**
* The transition table of the DFA
*/
private static final int [] ZZ_TRANS = zzUnpackTrans();
private static final String ZZ_TRANS_PACKED_0 =
"\1\2\1\3\1\4\1\2\1\5\2\2\1\6\5\2"+
"\16\0\1\3\16\0\1\7\16\0\1\10\20\0\1\11"+
"\11\0\1\12\20\0\1\13\4\0\1\14\25\0\1\15"+
"\10\0\1\16\21\0\1\17\10\0\1\20\12\0\1\21"+
"\6\0";
private static int [] zzUnpackTrans() {
int [] result = new int[182];
int offset = 0;
offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result);
return result;
}
private static int zzUnpackTrans(String packed, int offset, int [] result) {
int i = 0; /* index in packed string */
int j = offset; /* index in unpacked array */
int l = packed.length();
while (i < l) {
int count = packed.charAt(i++);
int value = packed.charAt(i++);
value--;
do result[j++] = value; while (--count > 0);
}
return j;
}
/* error codes */
private static final int ZZ_UNKNOWN_ERROR = 0;
private static final int ZZ_NO_MATCH = 1;
private static final int ZZ_PUSHBACK_2BIG = 2;
private static final char[] EMPTY_BUFFER = new char[0];
private static final int YYEOF = -1;
private static java.io.Reader zzReader = null; // Fake
/* error messages for the codes above */
private static final String ZZ_ERROR_MSG[] = {
"Unkown internal scanner error",
"Error: could not match input",
"Error: pushback value was too large"
};
/**
* ZZ_ATTRIBUTE[aState] contains the attributes of state <code>aState</code>
*/
private static final int [] ZZ_ATTRIBUTE = zzUnpackAttribute();
private static final String ZZ_ATTRIBUTE_PACKED_0 =
"\1\0\1\11\4\1\1\11\10\0\2\11";
private static int [] zzUnpackAttribute() {
int [] result = new int[17];
int offset = 0;
offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result);
return result;
}
private static int zzUnpackAttribute(String packed, int offset, int [] result) {
int i = 0; /* index in packed string */
int j = offset; /* index in unpacked array */
int l = packed.length();
while (i < l) {
int count = packed.charAt(i++);
int value = packed.charAt(i++);
do result[j++] = value; while (--count > 0);
}
return j;
}
/** the current state of the DFA */
private int zzState;
/** the current lexical state */
private int zzLexicalState = YYINITIAL;
/** this buffer contains the current text to be matched and is
the source of the yytext() string */
private CharSequence zzBuffer = "";
/** this buffer may contains the current text array to be matched when it is cheap to acquire it */
private char[] zzBufferArray;
/** the textposition at the last accepting state */
private int zzMarkedPos;
/** the textposition at the last state to be included in yytext */
private int zzPushbackPos;
/** the current text position in the buffer */
private int zzCurrentPos;
/** startRead marks the beginning of the yytext() string in the buffer */
private int zzStartRead;
/** endRead marks the last character in the buffer, that has been read
from input */
private int zzEndRead;
/**
* zzAtBOL == true <=> the scanner is currently at the beginning of a line
*/
private boolean zzAtBOL = true;
/** zzAtEOF == true <=> the scanner is at the EOF */
private boolean zzAtEOF;
/* user code: */
public _GrammarLexer() {
this((java.io.Reader)null);
}
/**
* Creates a new scanner
*
* @param in the java.io.Reader to read input from.
*/
public _GrammarLexer(java.io.Reader in) {
this.zzReader = in;
}
/**
* Unpacks the compressed character translation table.
*
* @param packed the packed character translation table
* @return the unpacked character translation table
*/
private static char [] zzUnpackCMap(String packed) {
char [] map = new char[0x10000];
int i = 0; /* index in packed string */
int j = 0; /* index in unpacked array */
while (i < 52) {
int count = packed.charAt(i++);
char value = packed.charAt(i++);
do map[j++] = value; while (--count > 0);
}
return map;
}
public final int getTokenStart(){
return zzStartRead;
}
public final int getTokenEnd(){
return getTokenStart() + yylength();
}
public void reset(CharSequence buffer, int start, int end,int initialState){
zzBuffer = buffer;
zzBufferArray = com.intellij.util.text.CharArrayUtil.fromSequenceWithoutCopying(buffer);
zzCurrentPos = zzMarkedPos = zzStartRead = start;
zzPushbackPos = 0;
zzAtEOF = false;
zzAtBOL = true;
zzEndRead = end;
yybegin(initialState);
}
/**
* Refills the input buffer.
*
* @return <code>false</code>, iff there was new input.
*
* @exception java.io.IOException if any I/O-Error occurs
*/
private boolean zzRefill() throws java.io.IOException {
return true;
}
/**
* Returns the current lexical state.
*/
public final int yystate() {
return zzLexicalState;
}
/**
* Enters a new lexical state
*
* @param newState the new lexical state
*/
public final void yybegin(int newState) {
zzLexicalState = newState;
}
/**
* Returns the text matched by the current regular expression.
*/
public final CharSequence yytext() {
return zzBuffer.subSequence(zzStartRead, zzMarkedPos);
}
/**
* Returns the character at position <tt>pos</tt> from the
* matched text.
*
* It is equivalent to yytext().charAt(pos), but faster
*
* @param pos the position of the character to fetch.
* A value from 0 to yylength()-1.
*
* @return the character at position pos
*/
public final char yycharat(int pos) {
return zzBufferArray != null ? zzBufferArray[zzStartRead+pos]:zzBuffer.charAt(zzStartRead+pos);
}
/**
* Returns the length of the matched text region.
*/
public final int yylength() {
return zzMarkedPos-zzStartRead;
}
/**
* Reports an error that occured while scanning.
*
* In a wellformed scanner (no or only correct usage of
* yypushback(int) and a match-all fallback rule) this method
* will only be called with things that "Can't Possibly Happen".
* If this method is called, something is seriously wrong
* (e.g. a JFlex bug producing a faulty scanner etc.).
*
* Usual syntax/scanner level error handling should be done
* in error fallback rules.
*
* @param errorCode the code of the errormessage to display
*/
private void zzScanError(int errorCode) {
String message;
try {
message = ZZ_ERROR_MSG[errorCode];
}
catch (ArrayIndexOutOfBoundsException e) {
message = ZZ_ERROR_MSG[ZZ_UNKNOWN_ERROR];
}
throw new Error(message);
}
/**
* Pushes the specified amount of characters back into the input stream.
*
* They will be read again by then next call of the scanning method
*
* @param number the number of characters to be read again.
* This number must not be greater than yylength()!
*/
public void yypushback(int number) {
if ( number > yylength() )
zzScanError(ZZ_PUSHBACK_2BIG);
zzMarkedPos -= number;
}
/**
* Resumes scanning until the next regular expression is matched,
* the end of input is encountered or an I/O-Error occurs.
*
* @return the next token
* @exception java.io.IOException if any I/O-Error occurs
*/
public IElementType advance() throws java.io.IOException {
int zzInput;
int zzAction;
// cached fields:
int zzCurrentPosL;
int zzMarkedPosL;
int zzEndReadL = zzEndRead;
CharSequence zzBufferL = zzBuffer;
char[] zzBufferArrayL = zzBufferArray;
char [] zzCMapL = ZZ_CMAP;
int [] zzTransL = ZZ_TRANS;
int [] zzRowMapL = ZZ_ROWMAP;
int [] zzAttrL = ZZ_ATTRIBUTE;
while (true) {
zzMarkedPosL = zzMarkedPos;
zzAction = -1;
zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL;
zzState = ZZ_LEXSTATE[zzLexicalState];
zzForAction: {
while (true) {
if (zzCurrentPosL < zzEndReadL)
zzInput = (zzBufferArrayL != null ? zzBufferArrayL[zzCurrentPosL++] : zzBufferL.charAt(zzCurrentPosL++));
else if (zzAtEOF) {
zzInput = YYEOF;
break zzForAction;
}
else {
// store back cached positions
zzCurrentPos = zzCurrentPosL;
zzMarkedPos = zzMarkedPosL;
boolean eof = zzRefill();
// get translated positions and possibly new buffer
zzCurrentPosL = zzCurrentPos;
zzMarkedPosL = zzMarkedPos;
zzBufferL = zzBuffer;
zzEndReadL = zzEndRead;
if (eof) {
zzInput = YYEOF;
break zzForAction;
}
else {
zzInput = (zzBufferArrayL != null ? zzBufferArrayL[zzCurrentPosL++] : zzBufferL.charAt(zzCurrentPosL++));
}
}
int zzNext = zzTransL[ zzRowMapL[zzState] + zzCMapL[zzInput] ];
if (zzNext == -1) break zzForAction;
zzState = zzNext;
int zzAttributes = zzAttrL[zzState];
if ( (zzAttributes & 1) == 1 ) {
zzAction = zzState;
zzMarkedPosL = zzCurrentPosL;
if ( (zzAttributes & 8) == 8 ) break zzForAction;
}
}
}
// store back cached position
zzMarkedPos = zzMarkedPosL;
switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction]) {
case 1:
{ return com.intellij.psi.TokenType.BAD_CHARACTER;
}
case 6: break;
case 4:
{ return BNF_STRING;
}
case 7: break;
case 5:
{ return BNF_NUMBER;
}
case 8: break;
case 3:
{ return BNF_ID;
}
case 9: break;
case 2:
{ return com.intellij.psi.TokenType.WHITE_SPACE;
}
case 10: break;
default:
if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
zzAtEOF = true;
return null;
}
else {
zzScanError(ZZ_NO_MATCH);
}
}
}
}
}

38
samples/M4/htmlgen.m4 Normal file
View File

@@ -0,0 +1,38 @@
dnl Took from https://en.wikipedia.org/wiki/M4_(computer_language)
divert(-1)
M4 has multiple output queues that can be manipulated with the
`divert' macro. Valid queues range from 0 to 10, inclusive, with
the default queue being 0.
Calling the `divert' macro with an invalid queue causes text to be
discarded until another call. Note that even while output is being
discarded, quotes around `divert' and other macros are needed to
prevent expansion.
# Macros aren't expanded within comments, meaning that keywords such
# as divert and other built-ins may be used without consequence.
# HTML utility macro:
define(`H2_COUNT', 0)
# The H2_COUNT macro is redefined every time the H2 macro is used:
define(`H2',
`define(`H2_COUNT', incr(H2_COUNT))<h2>H2_COUNT. $1</h2>')
divert(1)dnl
dnl
dnl The dnl macro causes m4 to discard the rest of the line, thus
dnl preventing unwanted blank lines from appearing in the output.
dnl
H2(First Section)
H2(Second Section)
H2(Conclusion)
dnl
divert(0)dnl
dnl
<HTML>
undivert(1)dnl One of the queues is being pushed to output.
</HTML>

View File

@@ -0,0 +1,172 @@
# ===========================================================================
# http://www.gnu.org/software/autoconf-archive/ax_ruby_devel.html
# ===========================================================================
#
# SYNOPSIS
#
# AX_RUBY_DEVEL([version])
#
# DESCRIPTION
#
# This macro checks for Ruby and tries to get the include path to
# 'ruby.h'. It provides the $(RUBY_CPPFLAGS) and $(RUBY_LDFLAGS) output
# variables. It also exports $(RUBY_EXTRA_LIBS) for embedding Ruby in your
# code.
#
# You can search for some particular version of Ruby by passing a
# parameter to this macro, for example "1.8.6".
#
# LICENSE
#
# Copyright (c) 2008 Rafal Rzepecki <divided.mind@gmail.com>
# Copyright (c) 2008 Sebastian Huber <sebastian-huber@web.de>
# Copyright (c) 2008 Alan W. Irwin
# Copyright (c) 2008 Rafael Laboissiere <rafael@laboissiere.net>
# Copyright (c) 2008 Andrew Collier
# Copyright (c) 2008 Matteo Settenvini <matteo@member.fsf.org>
# Copyright (c) 2008 Horst Knorr <hk_classes@knoda.org>
#
# This program is free software: you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by the
# Free Software Foundation, either version 3 of the License, or (at your
# option) any later version.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
# Public License for more details.
#
# You should have received a copy of the GNU General Public License along
# with this program. If not, see <http://www.gnu.org/licenses/>.
#
# As a special exception, the respective Autoconf Macro's copyright owner
# gives unlimited permission to copy, distribute and modify the configure
# scripts that are the output of Autoconf when processing the Macro. You
# need not follow the terms of the GNU General Public License when using
# or distributing such scripts, even though portions of the text of the
# Macro appear in them. The GNU General Public License (GPL) does govern
# all other use of the material that constitutes the Autoconf Macro.
#
# This special exception to the GPL applies to versions of the Autoconf
# Macro released by the Autoconf Archive. When you make and distribute a
# modified version of the Autoconf Macro, you may extend this special
# exception to the GPL to apply to your modified version as well.
#serial 11
AC_DEFUN([AX_RUBY_DEVEL],[
AC_REQUIRE([AX_WITH_RUBY])
AS_IF([test -n "$1"], [AX_PROG_RUBY_VERSION([$1])])
#
# Check if you have mkmf, else fail
#
AC_MSG_CHECKING([for the mkmf Ruby package])
ac_mkmf_result=`$RUBY -rmkmf -e ";" 2>&1`
if test -z "$ac_mkmf_result"; then
AC_MSG_RESULT([yes])
else
AC_MSG_RESULT([no])
AC_MSG_ERROR([cannot import Ruby module "mkmf".
Please check your Ruby installation. The error was:
$ac_mkmf_result])
fi
#
# Check for Ruby include path
#
AC_MSG_CHECKING([for Ruby include path])
if test -z "$RUBY_CPPFLAGS"; then
ruby_path=`$RUBY -rmkmf -e 'print Config::CONFIG[["archdir"]]'`
if test -n "${ruby_path}"; then
ruby_path="-I$ruby_path"
fi
RUBY_CPPFLAGS=$ruby_path
fi
AC_MSG_RESULT([$RUBY_CPPFLAGS])
AC_SUBST([RUBY_CPPFLAGS])
#
# Check for Ruby library path
#
AC_MSG_CHECKING([for Ruby library path])
if test -z "$RUBY_LDFLAGS"; then
RUBY_LDFLAGS=`$RUBY -rmkmf -e 'print Config::CONFIG[["LIBRUBYARG_SHARED"]]'`
fi
AC_MSG_RESULT([$RUBY_LDFLAGS])
AC_SUBST([RUBY_LDFLAGS])
#
# Check for site packages
#
AC_MSG_CHECKING([for Ruby site-packages path])
if test -z "$RUBY_SITE_PKG"; then
RUBY_SITE_PKG=`$RUBY -rmkmf -e 'print Config::CONFIG[["sitearchdir"]]'`
fi
AC_MSG_RESULT([$RUBY_SITE_PKG])
AC_SUBST([RUBY_SITE_PKG])
#
# libraries which must be linked in when embedding
#
AC_MSG_CHECKING(ruby extra libraries)
if test -z "$RUBY_EXTRA_LIBS"; then
RUBY_EXTRA_LIBS=`$RUBY -rmkmf -e 'print Config::CONFIG[["SOLIBS"]]'`
fi
AC_MSG_RESULT([$RUBY_EXTRA_LIBS])
AC_SUBST(RUBY_EXTRA_LIBS)
#
# linking flags needed when embedding
# (is it even needed for Ruby?)
#
# AC_MSG_CHECKING(ruby extra linking flags)
# if test -z "$RUBY_EXTRA_LDFLAGS"; then
# RUBY_EXTRA_LDFLAGS=`$RUBY -rmkmf -e 'print Config::CONFIG[["LINKFORSHARED"]]'`
# fi
# AC_MSG_RESULT([$RUBY_EXTRA_LDFLAGS])
# AC_SUBST(RUBY_EXTRA_LDFLAGS)
# this flags breaks ruby.h, and is sometimes defined by KDE m4 macros
CFLAGS="`echo "$CFLAGS" | sed -e 's/-std=iso9899:1990//g;'`"
#
# final check to see if everything compiles alright
#
AC_MSG_CHECKING([consistency of all components of ruby development environment])
AC_LANG_PUSH([C])
# save current global flags
ac_save_LIBS="$LIBS"
LIBS="$ac_save_LIBS $RUBY_LDFLAGS"
ac_save_CPPFLAGS="$CPPFLAGS"
CPPFLAGS="$ac_save_CPPFLAGS $RUBY_CPPFLAGS"
AC_TRY_LINK([
#include <ruby.h>
],[
ruby_init();
],[rubyexists=yes],[rubyexists=no])
AC_MSG_RESULT([$rubyexists])
if test ! "$rubyexists" = "yes"; then
AC_MSG_ERROR([
Could not link test program to Ruby. Maybe the main Ruby library has been
installed in some non-standard library path. If so, pass it to configure,
via the LDFLAGS environment variable.
Example: ./configure LDFLAGS="-L/usr/non-standard-path/ruby/lib"
============================================================================
ERROR!
You probably have to install the development version of the Ruby package
for your distribution. The exact name of this package varies among them.
============================================================================
])
RUBY_VERSION=""
fi
AC_LANG_POP
# turn back to default flags
CPPFLAGS="$ac_save_CPPFLAGS"
LIBS="$ac_save_LIBS"
#
# all done!
#
])

View File

@@ -0,0 +1,143 @@
# -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.
AC_PREREQ(2.68)
AC_INIT([GARDEN],
[1.0.9],
[bubla@users.sourceforge.net])
AC_CONFIG_AUX_DIR([build-aux])
AM_INIT_AUTOMAKE([-Wall])
AC_CONFIG_SRCDIR([src/input.h])
AC_CONFIG_HEADERS([src/configure.h])
AC_CONFIG_MACRO_DIR([m4])
AC_ARG_ENABLE([debug],
[AS_HELP_STRING([--enable-debug],
[Builds the debug version of the library [[default = no]]]) ],
[],
[enable_debug="no"])
AS_IF([test "x$enable_debug" = "xyes"],
[CFLAGS="${CFLAGS} -g -O0"])
# Checks for programs.
AC_PROG_CC
AC_PROG_LIBTOOL
LT_PROG_RC
AC_CANONICAL_HOST
dnl
dnl Check whether it makes sense to install a garden.desktop file
dnl
AC_CHECK_PROG([have_freedesktop],
[update-desktop-database],
[yes])
AM_CONDITIONAL([HAVE_FREEDESKTOP],
[test "x$have_freedesktop" = "xyes"])
AM_CONDITIONAL([WANT_FREEDESKTOP],
[test "x$enable_desktop_install" = "xyes"])
AC_ARG_ENABLE([desktop-install],
[AS_HELP_STRING([--enable-desktop-install],
[Whether you want to install the garden.desktop file if applicable. !!! DO NOT USE if you are a PACKAGER!!!])]
)
AS_CASE([$host],
[*mingw* | *cygwin*],
[AC_DEFINE([WINDOWS_VERSION],
[1],
[Define when building for Windows])
windows_version="yes"])
AM_CONDITIONAL([WINDOWS_VERSION],
[test "x$windows_version" = "xyes" ])
dnl now the datadir specification, that is useful if one does want to play without installing
AC_ARG_ENABLE([datadir],
[AS_HELP_STRING([--enable-datadir=path-to-your-garden-datafiles],
[Normally you dont have to use this, but it is handy when you want to play the game without installing it or if you want to use already installed data. In the first case, use for instance --enable-datadir=`pwd`/data (if it makes sense)])],
[DATADIR_NAME="$enableval"],
[DATADIR_NAME='$(datadir)/'garden])
# Sets the data subdirectory
AC_SUBST([DATADIR_NAME])
# Checks for libraries.
AC_CHECK_HEADER([allegro.h],
[],
[have_allegro="no"
AC_MSG_ERROR([You don't even have Allegro headers... Get Allegro first!]) ])
AC_CHECK_LIB([m], [sin])
test "x$host_os" != "x$build_os" && CROSS_COMPILING="yes"
try_link_allegro ()
{
LIBS_SAVE=$LIBS
LIBS="$LIBS $1"
AC_MSG_CHECKING([for Allegro using $1])
AC_LINK_IFELSE([AC_LANG_PROGRAM([AC_INCLUDES_DEFAULT
[ #include <allegro.h> ]],
[allegro_init();])END_OF_MAIN() ],
[have_allegro="yes"],
[have_allegro="no"])
AC_MSG_RESULT([$have_allegro])
LIBS=$LIBS_SAVE
AS_IF([test "x$have_allegro" == "xyes"],
[return 0],
[return 1])
}
# first check for 'official allegro'
# The official allegro does not support cross-compiling, though...
AM_PATH_ALLEGRO([4.2.0])
try_link_allegro "$allegro_LIBS"
AS_IF([test "x$?" == "x0"],
[[LIBS="$LIBS $allegro_LIBS"
ALLEGRO_LIB=`echo $allegro_LIBS | sed -e 's/.*-l\([^[:blank:]]*\).*/\1/'`
have_allegro="yes"]])
ALLEGRO_RELEASE_LIBS="alleg alleg42 alleg44"
ALLEGRO_DEBUG_LIBS="alld42 alleg44-debug"
AS_IF([test "x$enable_debug" = "xyes"],
[ALLEGRO_LIBS="$ALLEGRO_DEBUG_LIBS $ALLEGRO_RELEASE_LIBS"],
[ALLEGRO_LIBS="$ALLEGRO_RELEASE_LIBS $ALLEGRO_DEBUG_LIBS"])
for lib in $ALLEGRO_LIBS
do
ldflag="-l$lib"
AS_IF([test "x$have_allegro" == "xyes"],
[break])
try_link_allegro $ldflag
AS_IF([test "x$?" == "x0"],
[LIBS="$LIBS $ldflag"
ALLEGRO_LIB="$lib"
have_allegro="yes"])
done
AS_IF([test "x$have_allegro" != "xyes"],
[AC_MSG_ERROR([Unable to find Allegro game programming library 4.2, check out www.allegro.cc (or your distro repositories if you use a unix-like system)]) ])
# Checks for header files.
AC_CHECK_HEADERS([string.h sys/stat.h])
# Checks for typedefs, structures, and compiler characteristics.
AC_C_INLINE
AC_HEADER_STDBOOL
# Checks for library functions.
AC_SUBST([ALLEGRO_LIB])
AC_CONFIG_FILES([Makefile
src/Makefile
data/Makefile
resources/Makefile
docs/garden.doxyfile
pkgs/w32/winstaller.nsi])
AC_OUTPUT

46
samples/M4Sugar/list.m4 Normal file
View File

@@ -0,0 +1,46 @@
m4_define([m4_list_declare], [m4_do(
[m4_define([$1_GET], [m4_expand([m4_list_nth([$1], $][1)])])],
[m4_define([$1_FOREACH], [m4_foreach([item], [m4_dquote_elt(m4_list_contents([$1]))], m4_quote($][1))])],
)])
m4_define([m4_list_add], [m4_do(
[m4_pushdef([_LIST_NAME], [[_LIST_$1]])],
[m4_ifndef(_LIST_NAME,
[m4_define(_LIST_NAME, m4_dquote(m4_escape([$2])))],
[m4_define(_LIST_NAME, m4_dquote(m4_list_contents([$1]), m4_escape([$2])))],
)],
[m4_popdef([_LIST_NAME])],
)])
m4_define([m4_list_contents], [m4_do(
[m4_pushdef([_LIST_NAME], [[_LIST_$1]])],
[m4_ifndef(_LIST_NAME, [], m4_quote(_LIST_NAME))],
[m4_popdef([_LIST_NAME])],
)])
m4_define([m4_list_nth], [m4_argn([$2], m4_list_contents([$1]))])
m4_define([m4_list_pop_front], [m4_do(
[m4_pushdef([_LIST_NAME], [[_LIST_$1]])],
[m4_car(m4_unquote(_LIST_NAME))],
[m4_define(_LIST_NAME, m4_cdr(m4_unquote(_LIST_NAME)))],
[m4_popdef([_LIST_NAME])],
)])
m4_define([m4_list_pop_back], [m4_do(
[m4_pushdef([_LIST_NAME], [[_LIST_$1]])],
[m4_define(_LIST_NAME, m4_dquote(m4_reverse(m4_unquote(_LIST_NAME))))],
[m4_list_pop_front([$1])],
[m4_define(_LIST_NAME, m4_dquote(m4_reverse(m4_unquote(_LIST_NAME))))],
[m4_popdef([_LIST_NAME])],
)])
dnl
dnl $1: List name
dnl $2: What
dnl $3: If contains
dnl $4: If not
m4_define([m4_list_contains], [m4_do(
[m4_foreach([item], m4_list_contents([$1]), m4_if(item, [$2], [[$3]], [[$4]]))]
)])

207
samples/POV-Ray SDL/balcony.pov Executable file
View File

@@ -0,0 +1,207 @@
// This work is licensed under the Creative Commons Attribution-ShareAlike 3.0 Unported License.
// To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/3.0/ or send a
// letter to Creative Commons, 444 Castro Street, Suite 900, Mountain View, California, 94041, USA.
// Persistence Of Vision Ray Tracer Scene Description File
// File: balcony.pov
// Desc: Povray demonstration scene
// Date: July/August 2001
// Auth: Christoph Hormann
//
// ***********************************************************************
//
// -------------------- 'balcony' demonstration scene --------------------
//
// written July-August 2001 by Christoph Hormann <chris_hormann@gmx.de>
//
// demonstrates use of various new or changed features:
//
// - isosurface (for the rail columns)
// - mesh2 object (table cloth)
// - uv-mapping (table cloth)
// - pattern image type (background heightfield)
// - slope pattern (background heightfield)
// - variable reflection (water & glass)
// - metallic reflection
// - conserve_energy
// - function pattern (water)
// - fading interior (water, drink)
// - 'circular' and 'orient' area_light
// - radiosity
// - photons (objects on the table)
//
// ***********************************************************************
//
// Command line options:
//
// -w240 -h320
// -w480 -h640 +a0.3
// -w600 -h800 +a0.3
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#version 3.6;
#include "functions.inc"
#include "colors.inc"
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#declare AreaLight=on;
#declare Radiosity=on;
#declare Photons=on;
#declare TestLight=off;
#declare show_Fog=true;
#declare show_Water=true;
#declare show_Terrain=true;
#declare show_Building=true;
#declare show_Table=true;
#declare show_TableCloth=true;
#declare show_Chair=true;
#declare show_Table_Stuff=true;
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
global_settings{
max_trace_level 15
assumed_gamma 1
#if (Radiosity=on)
radiosity{
pretrace_start 0.08
pretrace_end 0.01
count 130
nearest_count 5
error_bound 0.3
recursion_limit 1
low_error_factor 0.5
gray_threshold 0.0
minimum_reuse 0.015
brightness 1.0
adc_bailout 0.01/2
normal on
}
#end
#if (Photons=on)
photons {
spacing 0.002
}
#end
}
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
// This scene uses a non-standard camera set-up.
// (See CAMERA in the included documentation for details.)
// If you are new to POV-Ray, you might want to try a different demo scene.
camera {
location <0.5, 0.5, 1.2>
direction y
sky z
up z
right x*image_width/image_height // keep propotions with any aspect ratio
look_at <5, 4.3, 0.9>
angle 36
}
/*
camera { // table detail camera
location <1.5, 1.5, 1.0>
direction y
sky z
up z
right x*image_width/image_height // keep propotions with any aspect ratio
look_at <3.3,2.52,0.5>
angle 30
}
*/
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#if (TestLight=on)
light_source {
<2, 2, 2>
color rgb 0.7
}
#end
light_source {
<3.0, -2.5, 2.6>*10000
color rgb <3.43,2.87,1.95>
#if (AreaLight=on)
area_light 400*x 400*y 4,4
jitter
circular
orient
#end
photons {
reflection on
refraction on
}
}
#if (show_Fog)
fog{
fog_type 2
fog_alt 1.2
fog_offset 0
color rgbt <0.60, 0.68, 0.82, 0.0>
distance 700
up z
}
#end
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#include "sky.inc"
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#if (show_Water)
#include "water.inc"
#end
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#if (show_Building)
#include "building.inc"
#end
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#if (show_Terrain)
#include "terrain.inc"
#end
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#if (show_Table)
#include "table.inc"
#end
#if (show_TableCloth)
#include "table_cloth.inc"
#end
#if (show_Table_Stuff)
#include "table_stuff.inc"
#end
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#if (show_Chair)
#include "chair.inc"
#end
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/

117
samples/POV-Ray SDL/bglass.inc Executable file
View File

@@ -0,0 +1,117 @@
// This work is licensed under the Creative Commons Attribution-ShareAlike 3.0 Unported License.
// To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/3.0/ or send a
// letter to Creative Commons, 444 Castro Street, Suite 900, Mountain View, California, 94041, USA.
// Persistence Of Vision Ray Tracer Include File
// File: bglass.inc
// Desc: drinking glass for 'balcony.pov' demonstration scene
// Date: July/August 2001
// Auth: Christoph Hormann
// Updated: 09Aug2008 (jh) for v3.7 distribution
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#if (version < 3.7)
#version 3.5;
#end
#declare Mat_Glass=
material {
texture {
pigment { color rgbt 1 }
finish {
ambient 0.0
diffuse 0.1
specular 0.5
roughness 0.05
reflection {
0.0, 1.0
fresnel on
}
conserve_energy
}
}
interior {
ior 1.5
fade_distance 0.1
fade_power 1001
fade_color <0.4,0.4,0.4>
}
}
#declare Mat_Liquid=
material {
texture {
pigment { color rgbt 1 }
finish {
ambient 0.0
diffuse 0.1
specular 0.5
roughness 0.01
reflection {
0.0, 1.0
fresnel on
}
conserve_energy
}
}
interior {
ior 1.3
fade_distance 0.03
fade_power 1001
fade_color <0.8,0.3,0.4>
}
}
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#include "shapes.inc"
#local Content_Shape=
merge {
cylinder {
0*z, 5*z, 3.0
}
object { Round_Cylinder_Merge (2*z, -3*z, 3.0, 0.25) }
material { Mat_Liquid }
}
#declare Glass=
union {
merge {
difference {
cylinder {
0.01*z, 14*z, 3.2
}
cylinder {
0*z, 10*z, 3.0
translate 4.6*z
}
object { Round_Cylinder_Merge (2*z, -3*z, 3.0, 0.25) translate 4.6*z }
}
torus {
3.1, 0.1
rotate 90*x
translate 14*z
}
material { Mat_Glass }
}
object { Content_Shape scale 0.99 translate 4.6*z }
scale 1.1
scale 0.01
}
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/

212
samples/POV-Ray SDL/building.inc Executable file
View File

@@ -0,0 +1,212 @@
// This work is licensed under the Creative Commons Attribution-ShareAlike 3.0 Unported License.
// To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/3.0/ or send a
// letter to Creative Commons, 444 Castro Street, Suite 900, Mountain View, California, 94041, USA.
// Persistence Of Vision Ray Tracer Include File
// File: building.inc
// Desc: building for 'balcony.pov' demonstration scene
// Date: July/August 2001
// Auth: Christoph Hormann
// Updated: 09Aug2008 (jh) for v3.7 distribution
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#if (version < 3.7)
#version 3.5;
#end
#declare Tex_Stone=
texture {
pigment {
agate
color_map {
[0.7 color rgb <0.6,0.6,0.6> ]
[1.0 color rgb 0.46 ]
}
warp { turbulence <0.7,0.4,0.4> }
scale <0.3,1.2,1.2>*0.25
rotate -60*y
rotate 70*z
}
finish {
ambient 0.0//0.1
diffuse 0.5
specular 0.15
}
normal {
granite 0.2
warp {turbulence 1}
scale 0.1
}
}
#declare Tex_Floor_A=
texture {
pigment {
color rgb <0.6,0.6,0.6>
}
finish {
ambient 0.0
diffuse 0.5
specular 0.15
}
normal {
granite 0.2
warp {turbulence 1}
scale 0.25
translate 2
}
}
#declare Tex_Floor_B=
texture {
pigment {
color rgb <0.18,0.18,0.22>
}
finish {
ambient 0.0
diffuse 0.5
specular 0.15
}
normal {
granite 0.2
warp {turbulence 1}
scale 0.25
}
}
#declare Tex_Floor=
texture {
checker
texture { Tex_Floor_A },
texture { Tex_Floor_B }
scale 0.4
rotate 45*z
}
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#include "shapes.inc"
#declare fn_Rad=
function {
sin(pow(abs(z*0.4),1.8))+0.4
}
#declare Small_Column_part1=
isosurface {
function { min(sqrt( x*x + y*y ) - fn_Rad(x, y, z), sqrt( x*x + y*y + pow(abs(z*2),1.4)) - 1.0) }
max_gradient 1.8
//eval
accuracy 0.001
contained_by { box { -4, 4 } }
translate 4*z
scale 6
texture { Tex_Stone }
}
#declare Small_Column=
union {
object { Small_Column_part1 translate 3*z }
object { Round_Cylinder_Union (0, 3*z, 10, 1) }
object { Round_Cylinder_Union (51*z, 54*z, 10, 1) }
scale 0.01
translate 0.1*z
texture { Tex_Stone }
}
#declare Large_Column=
union {
object { Round_Cylinder_Merge (0.7*z, 0.8*z, 0.22, 0.02) }
cylinder { 0.75*z, 3*z, 0.2 }
object { Round_Box_Union (<-0.23,-0.23,-0.1>, <0.23,0.23,0.15>, 0.02) }
object { Round_Box_Union (<-0.20,-0.20,0.00>, <0.20,0.20,0.70>, 0.02) }
object { Round_Box_Union (<-0.23,-0.23,0.58>, <0.23,0.23,0.70>, 0.02) }
object { Round_Box_Union (<-0.26,-0.26,0.64>, <0.26,0.26,0.74>, 0.02) }
torus { 0.2, 0.06 rotate 90*x translate 2.74*z }
object { Round_Box_Union (<-0.26,-0.26,2.80>, <0.26,0.26,2.88>, 0.01) }
texture { Tex_Stone }
}
#declare Balustrade=
union {
object { Round_Box_Union (<0.0,-0.15,0>, <5,0.15,0.1>, 0.02) }
object { Round_Box_Union (<0.0,-0.15,0.64>, <5,0.15,0.74>, 0.02) }
#declare Cnt=0;
#while (Cnt<10)
object { Small_Column translate(Cnt*0.5+0.6)*x }
#declare Cnt=Cnt+1;
#end
texture { Tex_Stone }
}
#declare Walls=
union {
box { <-0.5,-0.5,-1>, <-2,5.5,3.2> }
box { <-0.5,-0.5,-1>, <5.5,-2,3.2> }
texture { Tex_Stone }
}
#declare Ceiling_Segment=
union {
box { <-0.20,-0.20,2.94>, <0.20,0.20,2.98> }
box { <-0.14,-0.14,2.94>, <0.14,0.14,3.01> }
}
#declare Ceiling=
union {
box { <5.6,5.6,3.04>, <-2,-2,3.5> }
union {
object { Round_Box_Union (<0.0,-0.26,3.1>, <6,0.26,2.88>, 0.02) rotate 180*z }
object { Round_Box_Union (<0.0,-0.26,3.1>, <6,0.26,2.88>, 0.02) rotate -90*z }
translate <5,5,0>
}
difference {
box { <5.0,5.0,2.95>, <-2,-2,3.5> }
object { Ceiling_Segment translate <4.44,4.44,0> }
object { Ceiling_Segment translate <4.44,3.94,0> }
object { Ceiling_Segment translate <3.94,4.44,0> }
object { Ceiling_Segment translate <3.94,3.94,0> }
object { Ceiling_Segment translate <4.44,3.44,0> }
object { Ceiling_Segment translate <3.44,4.44,0> }
object { Ceiling_Segment translate <3.94,3.44,0> }
object { Ceiling_Segment translate <3.44,3.94,0> }
object { Ceiling_Segment translate <4.44,2.94,0> }
object { Ceiling_Segment translate <2.94,4.44,0> }
}
texture { Tex_Stone }
}
#declare Base=
union {
box { <5.4,5.4,0>, <0,0,-1> texture { Tex_Floor } }
box { <6,6,-1>, <0,0,-2> }
texture { Tex_Stone }
}
object { Balustrade rotate 180*z translate <5,5,0> }
object { Balustrade rotate -90*z translate <5,5,0> }
object { Large_Column translate <5,5,0> }
object { Base }
object { Walls }
object { Ceiling }
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/

382
samples/POV-Ray SDL/chair.inc Executable file
View File

@@ -0,0 +1,382 @@
// This work is licensed under the Creative Commons Attribution-ShareAlike 3.0 Unported License.
// To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/3.0/ or send a
// letter to Creative Commons, 444 Castro Street, Suite 900, Mountain View, California, 94041, USA.
// Persistence Of Vision Ray Tracer Include File
// File: chair.inc
// Desc: chair for 'balcony.pov' demonstration scene
// Date: July/August 2001
// Auth: Christoph Hormann
// Updated: 09Aug2008 (jh) for v3.7 distribution
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#if (version < 3.7)
#version 3.5;
#end
#declare Tex_Table_Foot=
texture {
pigment {
color rgb 0.4
}
finish {
ambient 0.0
diffuse 0.3
specular 0.4
roughness 0.01
metallic
reflection {
0.8
metallic
}
}
}
#declare Tex_Table_Foot_Bottom=
texture {
pigment {
color rgb 0.2
}
finish {
ambient 0.0
diffuse 0.3
specular 0.4
roughness 0.02
}
}
#declare Tex_Dark_Wood=
texture {
pigment {
bozo
color_map {
[0.3 color rgb <0.0,0.0,0.16> ]
[0.5 color rgb <0.0,0.0,0.08> ]
[0.7 color rgb <0.0,0.0,0.0> ]
}
scale <4,1,1>*0.036
}
finish {
ambient 0.09
diffuse 0.3
specular 0.5
roughness 0.025
reflection {
0.15
metallic
}
}
normal {
granite 0.1
scale 0.03
accuracy 0.007
}
}
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#include "shapes.inc"
#local Chair_Tube_Rad=0.01;
#local Chair_Tube_Curve_Rad=0.045;
#local Chair_Leg_Angle=7;
#local Chair_Leg_AngleA=4;
#local Chair_Leg_Depth=0.13;
#local Chair_Plate_Curve_Rad=0.03;
#local Chair_Plate_Thickness=0.008;
#local Chair_Plate_Width=0.48;
#local Chair_Plate_UWidth=0.22;
#local Chair_Plate_Height=0.45;
#local Chair_Plate_UAngle=5;
#local Chair_Plate_Depth=0.26;
#local Chair_Leg=
union {
intersection {
torus { Chair_Tube_Curve_Rad, Chair_Tube_Rad }
plane { x, 0 }
plane { -x, 0 rotate (-90+Chair_Leg_Angle)*y }
}
cylinder {
<-Chair_Tube_Curve_Rad,0,0>,
<-Chair_Tube_Curve_Rad,0,-Chair_Plate_Height+0.01>, Chair_Tube_Rad
rotate Chair_Leg_Angle*y
}
cylinder {
<0,0,Chair_Tube_Curve_Rad>,
<Chair_Leg_Depth,0,Chair_Tube_Curve_Rad>, Chair_Tube_Rad
}
object { Round_Cylinder_Merge (
<-Chair_Tube_Curve_Rad,0,-Chair_Plate_Height-0.003>,
<-Chair_Tube_Curve_Rad,0,-Chair_Plate_Height+0.025>, Chair_Tube_Rad+0.001, 0.005)
rotate Chair_Leg_Angle*y
texture { Tex_Table_Foot_Bottom }
}
translate -Chair_Leg_Depth*x
translate Chair_Plate_Height*cos(radians(Chair_Leg_Angle))*z
}
#macro Chair_Back(Rotate)
union {
intersection {
torus { Chair_Tube_Curve_Rad, Chair_Tube_Rad }
plane { x, 0 }
plane { z, 0 }
translate <-Chair_Leg_Depth, 0.0,Chair_Tube_Curve_Rad*2>
}
cylinder {
<-0.08, 0.0,Chair_Tube_Curve_Rad>,
< 0.05, 0.0,Chair_Tube_Curve_Rad>, Chair_Tube_Rad
}
intersection {
torus { 4, Chair_Tube_Rad }
plane { z, 0.4 }
plane { -z, 0 }
translate <-4-Chair_Leg_Depth-Chair_Tube_Curve_Rad, 0.0,Chair_Tube_Curve_Rad*2>
}
translate -Chair_Tube_Curve_Rad*z
rotate 3*y
rotate Rotate*x
translate Chair_Tube_Curve_Rad*z
translate Chair_Plate_Height*cos(radians(Chair_Leg_Angle))*z
}
#end
#local Chair_Base=
union {
union {
object { Chair_Back(-0.25) translate Chair_Tube_Rad*2*y }
object { Chair_Leg }
object { Chair_Leg rotate 180*z }
rotate -Chair_Leg_AngleA*x
translate -0.23*y
}
union {
object { Chair_Back( 0.25) translate -Chair_Tube_Rad*2*y }
object { Chair_Leg }
object { Chair_Leg rotate 180*z }
rotate Chair_Leg_AngleA*x
translate 0.23*y
}
texture { Tex_Table_Foot }
}
#local Chair_Plate=
union {
intersection {
merge {
torus { Chair_Plate_Curve_Rad, Chair_Plate_Thickness translate (Chair_Plate_Width/2)*y }
torus { Chair_Plate_Curve_Rad, Chair_Plate_Thickness translate -(Chair_Plate_Width/2)*y }
difference {
cylinder {
-(Chair_Plate_Width/2)*y, (Chair_Plate_Width/2)*y,
Chair_Plate_Curve_Rad+Chair_Plate_Thickness
}
cylinder {
-(Chair_Plate_Width/1.8)*y, (Chair_Plate_Width/1.8)*y,
Chair_Plate_Curve_Rad-Chair_Plate_Thickness
}
}
}
plane { -z, 0 rotate -20*y}
plane { -x, 0 }
}
merge {
cylinder {
<0.0, -Chair_Plate_Width/2, Chair_Plate_Curve_Rad>
<0.0, Chair_Plate_Width/2, Chair_Plate_Curve_Rad>,
Chair_Plate_Thickness
}
sphere { <0.0, -Chair_Plate_Width/2, Chair_Plate_Curve_Rad>, Chair_Plate_Thickness }
sphere { <0.0, Chair_Plate_Width/2, Chair_Plate_Curve_Rad>, Chair_Plate_Thickness }
rotate 70*y
}
box {
< 0.00, -Chair_Plate_Width/2, Chair_Plate_Curve_Rad-Chair_Plate_Thickness>,
<-Chair_Plate_Depth, Chair_Plate_Width/2, Chair_Plate_Curve_Rad+Chair_Plate_Thickness>
}
cylinder {
< 0.00, -Chair_Plate_Width/2, Chair_Plate_Curve_Rad>
<-Chair_Plate_Depth, -Chair_Plate_Width/2, Chair_Plate_Curve_Rad>,
Chair_Plate_Thickness
}
cylinder {
< 0.00, Chair_Plate_Width/2, Chair_Plate_Curve_Rad>
<-Chair_Plate_Depth, Chair_Plate_Width/2, Chair_Plate_Curve_Rad>,
Chair_Plate_Thickness
}
box {
<-Chair_Plate_Depth, -Chair_Plate_Width/2+Chair_Plate_Curve_Rad,
Chair_Plate_Curve_Rad-Chair_Plate_Thickness>,
<-Chair_Plate_Depth-Chair_Plate_Curve_Rad, Chair_Plate_Width/2-Chair_Plate_Curve_Rad,
Chair_Plate_Curve_Rad+Chair_Plate_Thickness>
}
cylinder {
<-Chair_Plate_Depth, Chair_Plate_Width/2-Chair_Plate_Curve_Rad,
Chair_Plate_Curve_Rad-Chair_Plate_Thickness>
<-Chair_Plate_Depth, Chair_Plate_Width/2-Chair_Plate_Curve_Rad,
Chair_Plate_Curve_Rad+Chair_Plate_Thickness>,
Chair_Plate_Curve_Rad
}
cylinder {
<-Chair_Plate_Depth, -Chair_Plate_Width/2+Chair_Plate_Curve_Rad,
Chair_Plate_Curve_Rad-Chair_Plate_Thickness>
<-Chair_Plate_Depth, -Chair_Plate_Width/2+Chair_Plate_Curve_Rad,
Chair_Plate_Curve_Rad+Chair_Plate_Thickness>,
Chair_Plate_Curve_Rad
}
torus {
Chair_Plate_Curve_Rad, Chair_Plate_Thickness
rotate 90*x
translate <-Chair_Plate_Depth,
-Chair_Plate_Width/2+Chair_Plate_Curve_Rad, Chair_Plate_Curve_Rad>
}
torus {
Chair_Plate_Curve_Rad, Chair_Plate_Thickness
rotate 90*x
translate <-Chair_Plate_Depth,
Chair_Plate_Width/2-Chair_Plate_Curve_Rad, Chair_Plate_Curve_Rad>
}
translate (Chair_Plate_Height+0.03)*z
translate 0.18*x
}
#local Chair_Back_Plate=
union {
intersection {
union {
intersection {
difference {
cylinder { <0.0, -0.30, 0.0>, <0.0, 0.30, 0.0>, 4+2*Chair_Plate_Thickness }
cylinder { <0.0, -0.40, 0.0>, <0.0, 0.40, 0.0>, 4 }
}
plane { y, Chair_Plate_UWidth rotate Chair_Plate_UAngle*x }
plane { -y, Chair_Plate_UWidth rotate -Chair_Plate_UAngle*x }
}
torus {
4+Chair_Plate_Thickness, Chair_Plate_Thickness
scale <1, 1, 1/cos(radians(Chair_Plate_UAngle))>
rotate Chair_Plate_UAngle*x
translate Chair_Plate_UWidth*y
}
torus {
4+Chair_Plate_Thickness, Chair_Plate_Thickness
scale <1, 1, 1/cos(radians(Chair_Plate_UAngle))>
rotate -Chair_Plate_UAngle*x
translate -Chair_Plate_UWidth*y
}
}
plane { z, 0 rotate -8*y }
plane { -z, 0 rotate -0.2*y }
}
intersection {
union {
cylinder {
<4+Chair_Plate_Thickness, 0.3, 0.0>,
<4+Chair_Plate_Thickness, -0.3, 0.0>,
Chair_Plate_Thickness
rotate -0.2*y
}
cylinder {
<4+Chair_Plate_Thickness, 0.3, 0.0>,
<4+Chair_Plate_Thickness, -0.3, 0.0>,
Chair_Plate_Thickness
rotate -8*y
}
}
plane { y, Chair_Plate_UWidth rotate Chair_Plate_UAngle*x }
plane { -y, Chair_Plate_UWidth rotate -Chair_Plate_UAngle*x }
}
sphere {
<4+Chair_Plate_Thickness, Chair_Plate_UWidth, 0.0>,
Chair_Plate_Thickness
rotate -0.2*y
}
sphere {
<4+Chair_Plate_Thickness, -Chair_Plate_UWidth, 0.0>,
Chair_Plate_Thickness
rotate -0.2*y
}
sphere {
<4+Chair_Plate_Thickness,
Chair_Plate_UWidth-4*sin(radians(Chair_Plate_UAngle))*sin(radians(8)), 0.0>,
Chair_Plate_Thickness
rotate -8*y
}
sphere {
<4+Chair_Plate_Thickness,
-Chair_Plate_UWidth+4*sin(radians(Chair_Plate_UAngle))*sin(radians(8)), 0.0>,
Chair_Plate_Thickness
rotate -8*y
}
translate <-4-Chair_Leg_Depth-Chair_Tube_Curve_Rad+Chair_Tube_Rad,
0.0, Chair_Tube_Curve_Rad*2>
translate -Chair_Tube_Curve_Rad*z
rotate 3*y
translate Chair_Tube_Curve_Rad*z
translate Chair_Plate_Height*cos(radians(Chair_Leg_Angle))*z
}
union {
object { Chair_Back_Plate texture { Tex_Dark_Wood rotate 90*y } }
object { Chair_Plate texture { Tex_Dark_Wood } }
object { Chair_Base }
scale 0.92
rotate -60*z
translate <2.68,3.35,0>
}
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/

12217
samples/POV-Ray SDL/cloth.inc Executable file

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,188 @@
// This work is licensed under the Creative Commons Attribution-ShareAlike 3.0 Unported License.
// To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/3.0/ or send a
// letter to Creative Commons, 444 Castro Street, Suite 900, Mountain View, California, 94041, USA.
// Persistence of Vision Ray Tracer Scene Description File
// File: gamma_showcase.pov
// Vers: 3.7
// Desc: Gamma Handling Test Scene - An arrangement of spheres on a marble plane
// Date: 2010-12-21
// Auth: Christoph Lipka
//
// +w640 +h480 +a0.3 +am1 +fN -d File_Gamma=sRGB Output_File_Name=gamma_showcase.png
// +w640 +h480 +a0.3 +am1 +fN -d File_Gamma=1.0 Output_File_Name=gamma_showcase_linear.png
// +w320 +h240 +a0.3 +am1 +fN -d File_Gamma=sRGB Output_File_Name=gamma_showcase_ref0.png Declare=Stripes=off
// +w320 +h240 +a0.3 +am1 +fN -d File_Gamma=sRGB Output_File_Name=gamma_showcase_ref1.png Declare=Stripes=off Declare=Gamma=1.2
// +w320 +h240 +a0.3 +am1 +fN -d File_Gamma=sRGB Output_File_Name=gamma_showcase_ref2.png Declare=Stripes=off Declare=Gamma=0.8
// +w640 +h480 +a0.3 +am1 -f +d
#version 3.7;
#include "colors.inc"
#include "stones.inc"
#ifndef (Stripes)
#declare Stripes = on;
#end
#ifndef (Gamma)
#declare Gamma = 1.0;
#end
global_settings {
max_trace_level 5
assumed_gamma 1.0
radiosity {
pretrace_start 0.08
pretrace_end 0.01
count 35
nearest_count 5
error_bound 1.8
recursion_limit 2
low_error_factor .5
gray_threshold 0.0
minimum_reuse 0.015
brightness 1
adc_bailout 0.01/2
}
}
#default {
texture {
pigment {rgb 1}
finish {
ambient 0.0
diffuse 0.6
specular 0.6 roughness 0.001
reflection { 0.0 1.0 fresnel on }
conserve_energy
}
}
}
// ----------------------------------------
#local TestRed = rgb <0.5,0.1,0.1>;
#local TestGreen = rgb <0.1,0.5,0.1>;
#local TestBlue = rgb <0.1,0.1,0.5>;
#local CameraFocus = <0,0.5,0>;
#local CameraDist = 8;
#local CameraDepth = 1.8;
#local CameraTilt = 20;
camera {
location <0,0,0>
direction z*CameraDepth
right x*image_width/image_height
up y
translate <0,0,-CameraDist>
rotate x*CameraTilt
translate CameraFocus
}
#macro LightSource(Pos,Color)
light_source {
Pos
color Color
spotlight
point_at <0,0,0>
radius 175/vlength(Pos)
falloff 200/vlength(Pos)
area_light x*vlength(Pos)/10, y*vlength(Pos)/10, 9,9 adaptive 1 jitter circular orient
}
#end
LightSource(<-500,500,-500>,TestRed + <0.2,0.2,0.2>)
LightSource(< 0,500,-500>,TestGreen + <0.2,0.2,0.2>)
LightSource(< 500,500,-500>,TestBlue + <0.2,0.2,0.2>)
// ----------------------------------------
#macro DarkStripeBW(TargetBrightness)
#if (TargetBrightness < 0.5)
(0.0)
#else
(TargetBrightness*2 - 1.0)
#end
#end
#macro BrightStripeBW(TargetBrightness)
#if (TargetBrightness < 0.5)
(TargetBrightness*2)
#else
(1.0)
#end
#end
#macro DarkStripeRGB(TargetColor)
<DarkStripeBW(TargetColor.red),DarkStripeBW(TargetColor.green),DarkStripeBW(TargetColor.blue)>
#end
#macro BrightStripeRGB(TargetColor)
<BrightStripeBW(TargetColor.red),BrightStripeBW(TargetColor.green),BrightStripeBW(TargetColor.blue)>
#end
#macro StripedPigment(TargetColor)
#if (Stripes)
function { abs(mod(abs(image_height*CameraDepth*y/z+0.5),2.0)-1.0) }
color_map {
[0.5 color rgb DarkStripeRGB(TargetColor) ]
[0.5 color rgb BrightStripeRGB(TargetColor) ]
}
translate <0,0,-CameraDist>
rotate x*CameraTilt
translate CameraFocus
#else
color TargetColor
#end
#end
plane {
y, 0
texture { T_Stone11 }
interior { ior 1.5 }
}
#macro GammaAdjust(C,G)
#local C2 = color rgbft <pow(C.red,G),pow(C.green,G),pow(C.blue,G),pow(C.filter,G),pow(C.transmit,G)>;
(C2)
#end
#macro TestSphere(Pos,Radius,TargetColor,Split)
sphere {
Pos + y*Radius, Radius
texture { pigment { color GammaAdjust(TargetColor,Gamma) } }
interior { ior 1.5 }
}
#if (Split)
sphere {
Pos + y*Radius + x*0.001, Radius
texture { pigment { StripedPigment(TargetColor) } }
interior { ior 1.5 }
}
#end
#end
TestSphere(<-2,0,1>, 1, TestRed, true)
TestSphere(< 0,0,1>, 1, TestGreen, true)
TestSphere(< 2,0,1>, 1, TestBlue, true)
#local Steps = 6;
#for(I,0,1,1/Steps)
#if (I < 0.5)
#local Color2 = TestRed;
#else
#local Color2 = TestBlue;
#end
#local P = abs(I-0.5)*2;
TestSphere(<I*4-2,0,-0.5>, 2/Steps, (1-P)*TestGreen + P*Color2, true)
#end
#local Steps = 8;
#for(I,0,1,1/Steps)
TestSphere(<I*4-2,0,-1.5>, 2/Steps, rgb I, true)
TestSphere(<I*4-2,0,-2.0>, 2/Steps, GammaAdjust(rgb I, 2.2*Gamma), false)
#end

91
samples/POV-Ray SDL/sky.inc Executable file
View File

@@ -0,0 +1,91 @@
// This work is licensed under the Creative Commons Attribution-ShareAlike 3.0 Unported License.
// To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/3.0/ or send a
// letter to Creative Commons, 444 Castro Street, Suite 900, Mountain View, California, 94041, USA.
// Persistence Of Vision Ray Tracer Include File
// File: sky.inc
// Desc: sky for 'balcony.pov' demonstration scene
// Date: July/August 2001
// Auth: Christoph Hormann
// Updated: 09Aug2008 (jh) for v3.7 distribution
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#if (version < 3.7)
#version 3.5;
#end
#local P_Clouds=
pigment {
gradient z
pigment_map {
[ 0.0 color rgbt 1]
[ 0.1
bozo
color_map {
[0.0 color rgbt < 0.85, 0.88, 0.94, 0.0>]
[0.15 color rgbt < 0.91, 0.96, 0.99, 0.0>]
[0.35 color rgbt < 0.91, 0.96, 0.99, 1.0>]
}
turbulence 0.75
lambda 2.4
omega 0.6
octaves 8
scale <0.4,0.4,0.15>
]
[ 0.4
bozo
color_map {
[0.0 color rgbt < 0.85, 0.88, 0.94, 0.0>]
[0.15 color rgbt < 0.91, 0.96, 0.99, 0.0>]
[0.35 color rgbt < 0.91, 0.96, 0.99, 1.0>]
}
turbulence 0.75
lambda 2.4
omega 0.6
octaves 8
scale <0.4,0.4,0.15>
]
[ 0.65 color rgbt 1]
}
rotate 10*z
}
#local Tex_Sky =
texture {
pigment {
function { abs(z) }
color_map {
[0.0 color rgb < 0.640, 0.685, 0.800 >]
[0.3 color rgb < 0.400, 0.550, 0.900 >]
}
turbulence 0.05
}
finish {
diffuse 0
ambient 1
}
}
texture {
pigment { P_Clouds }
finish {
diffuse 0
ambient 1
}
}
sphere {
<0, 0, 0>, 1
texture { Tex_Sky }
scale<1000000, 1000000, 300000>
no_shadow
hollow on
photons{ collect off }
}
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/

171
samples/POV-Ray SDL/table.inc Executable file
View File

@@ -0,0 +1,171 @@
// This work is licensed under the Creative Commons Attribution-ShareAlike 3.0 Unported License.
// To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/3.0/ or send a
// letter to Creative Commons, 444 Castro Street, Suite 900, Mountain View, California, 94041, USA.
// Persistence Of Vision Ray Tracer Include File
// File: table.inc
// Desc: table for 'balcony.pov' demonstration scene
// Date: July/August 2001
// Auth: Christoph Hormann
// Updated: 09Aug2008 (jh) for v3.7 distribution
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#if (version < 3.7)
#version 3.5;
#end
#declare Tex_Table_Foot=
texture {
pigment {
color rgb 0.4
}
finish {
ambient 0.0
diffuse 0.3
specular 0.4
roughness 0.01
metallic
reflection {
0.8
metallic
}
}
}
#declare Tex_Table_Foot_Bottom=
texture {
pigment {
color rgb 0.2
}
finish {
ambient 0.0
diffuse 0.3
specular 0.4
roughness 0.02
}
}
#declare Tex_Dark_Wood=
texture {
pigment {
bozo
color_map {
[0.3 color rgb <0.0,0.0,0.16> ]
[0.5 color rgb <0.0,0.0,0.08> ]
[0.7 color rgb <0.0,0.0,0.0> ]
}
scale <4,1,1>*0.036
}
finish {
ambient 0.09
diffuse 0.3
specular 0.5
roughness 0.025
reflection {
0.15
metallic
}
}
normal {
granite 0.1
scale 0.03
accuracy 0.007
}
scale 0.5
rotate 90*y
}
#declare Tex_Dark_Wood2 =
texture {
pigment {
wood
color_map {
[ 0.0000 color rgb<0.6431, 0.3176, 0.0824> ]
[ 0.1000 color rgb<0.6196, 0.2824, 0.0588> ]
[ 0.2000 color rgb<0.7137, 0.3725, 0.1529> ]
[ 0.3000 color rgb<0.7529, 0.4157, 0.1922> ]
[ 0.4000 color rgb<0.8157, 0.4941, 0.2588> ]
[ 0.5000 color rgb<0.7686, 0.4745, 0.2196> ]
[ 0.6000 color rgb<0.8471, 0.5647, 0.2980> ]
[ 0.7000 color rgb<0.8627, 0.5843, 0.3137> ]
[ 0.8000 color rgb<0.8902, 0.6314, 0.3529> ]
[ 0.9000 color rgb<0.8627, 0.6118, 0.3294> ]
[ 1.0000 color rgb<0.8392, 0.5922, 0.3098> ]
}
turbulence <0.075, 0.075, 0.65>
scale <0.04, 0.04, 0.6>
scale 0.27
rotate 91*y
translate -0.1*z
}
finish {
ambient 0.0
diffuse 0.4
specular 0.3
roughness 0.025
reflection {
0.17
metallic
}
}
normal {
granite 0.015
scale <0.02, 0.02, 0.06>
rotate 91*y
accuracy 0.007
}
}
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#include "shapes.inc"
#declare Table_Height=0.66;
#declare Table=
union {
torus { 0.49, 0.01 sturm rotate 90*x translate z*(Table_Height-0.01) }
cylinder { z*(Table_Height-0.05), z*(Table_Height-0.01), 0.5 }
cylinder { z*(Table_Height-0.01), z*Table_Height, 0.49 }
union {
cylinder { z*0.01, z*0.63, 0.03 translate 0.37*x }
cylinder { z*0.01, z*0.63, 0.03 translate 0.37*x rotate 120*z }
cylinder { z*0.01, z*0.63, 0.03 translate 0.37*x rotate 240*z }
texture { Tex_Table_Foot }
rotate -70*z
}
union {
object { Round_Cylinder_Merge (0, z*0.03, 0.031, 0.005) translate 0.37*x }
object { Round_Cylinder_Merge (0, z*0.03, 0.031, 0.005) translate 0.37*x rotate 120*z }
object { Round_Cylinder_Merge (0, z*0.03, 0.031, 0.005) translate 0.37*x rotate 240*z }
texture { Tex_Table_Foot_Bottom }
rotate -70*z
}
texture { Tex_Dark_Wood2 }
#if (show_TableCloth)
scale <0.97, 0.97, 0.99>
#else
scale <0.97, 0.97, 1.00>
#end
}
object { Table translate <3.3,2.52,0> }
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/

View File

@@ -0,0 +1,91 @@
// This work is licensed under the Creative Commons Attribution-ShareAlike 3.0 Unported License.
// To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/3.0/ or send a
// letter to Creative Commons, 444 Castro Street, Suite 900, Mountain View, California, 94041, USA.
// Persistence Of Vision Ray Tracer Include File
// File: table_cloth.inc
// Desc: table cloth for 'balcony.pov' demonstration scene
// Date: July/August 2001
// Auth: Christoph Hormann
// Updated: 09Aug2008 (jh) for v3.7 distribution
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#if (version < 3.7)
#version 3.5;
#end
#declare ClCol01=color rgb <0.8, 0.7, 0.4>;
#declare ClCol02=color rgb <0.07, 0.12, 0.4>;
#declare CPig1=
pigment {
gradient x
triangle_wave
color_map {
[0.04 ClCol01 ]
[0.04 ClCol02 ]
[0.06 ClCol02 ]
[0.06 ClCol01 ]
[0.09 ClCol01 ]
[0.09 ClCol02 ]
[0.13 ClCol02 ]
[0.13 ClCol01 ]
[0.16 ClCol01 ]
[0.16 ClCol02 ]
[0.18 ClCol02 ]
[0.18 ClCol01 ]
}
}
#declare CPig2=
pigment {
gradient y
triangle_wave
pigment_map {
[0.04 CPig1 ]
[0.04 ClCol02 ]
[0.06 ClCol02 ]
[0.06 CPig1 ]
[0.09 CPig1 ]
[0.09 ClCol02 ]
[0.13 ClCol02 ]
[0.13 CPig1 ]
[0.16 CPig1 ]
[0.16 ClCol02 ]
[0.18 ClCol02 ]
[0.18 CPig1 ]
}
}
/*
#include "clothutil.inc"
ReadClothFile("cloth.cth")
DrawSmoothTriangles2(Points, 90, 90, on, true, "cloth.inc")
*/
#declare Table_Cloth=
mesh2{
#include "cloth.inc"
texture {
uv_mapping
pigment {
CPig2
}
finish {
ambient 0.0
diffuse 0.6
}
normal {
quilted 0.16
scale 0.008
}
}
rotate -30*z
}
object { Table_Cloth translate <3.3,2.52,0> }
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/

View File

@@ -0,0 +1,136 @@
// This work is licensed under the Creative Commons Attribution-ShareAlike 3.0 Unported License.
// To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/3.0/ or send a
// letter to Creative Commons, 444 Castro Street, Suite 900, Mountain View, California, 94041, USA.
// Persistence Of Vision Ray Tracer Include File
// File: table_stuff.inc
// Desc: stuff on the table for 'balcony.pov' demonstration scene
// Date: July/August 2001
// Auth: Christoph Hormann
// Updated: 09Aug2008 (jh) for v3.7 distribution
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#if (version < 3.7)
#version 3.5;
#end
#declare Mat_Glass=
material {
texture {
pigment { color rgbt 1 }
finish {
ambient 0.0
diffuse 0.1
specular 0.5
roughness 0.01
reflection {
0.15, 1.0
fresnel on
}
conserve_energy
}
}
interior {
ior 1.5
fade_distance 0.1
fade_power 1001
fade_color <0.4,0.4,0.8>
}
}
#declare Tex_Box_Metal=
texture {
pigment {
color rgb <0.5,0.45,0.4>
}
finish {
ambient 0.0
diffuse 0.05
specular 0.5
roughness 0.01
metallic
reflection {
0.8
metallic
}
}
}
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#include "shapes.inc"
#include "functions.inc"
#declare Table_Height=0.66;
#declare Box_Iso=
isosurface {
function { -f_superellipsoid(x,y,z, 0.2, 0.2) }
contained_by {box { -1.2, 1.2 }}
max_gradient 1.1
translate 1.001*z
}
#declare Box=
union {
intersection {
object { Box_Iso }
object { Round_Box_Merge (<-1.1,-1.1,1.6>, <1.1,1.1,-0.1>, 0.4) }
}
intersection {
object { Box_Iso }
object { Round_Box_Merge (<-1.1,-1.1,1.6>, <1.1,1.1,2.2>, 0.4) }
scale 1.01
rotate 0.2
}
torus {
0.6, 0.13
rotate 90*z
translate 2*z
}
scale <1,1,0.6>
}
#include "bglass.inc"
union {
object {
Glass
photons{
target 1.0
refraction on
reflection on
}
translate <-0.16,-0.1,0>
}
object {
Box
texture {
Tex_Box_Metal
}
photons{
target 1.0
reflection on
}
scale 0.06
translate <-0.1,0.2,0>
}
translate <3.3,2.52,Table_Height>
}
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/

118
samples/POV-Ray SDL/terrain.inc Executable file
View File

@@ -0,0 +1,118 @@
// This work is licensed under the Creative Commons Attribution-ShareAlike 3.0 Unported License.
// To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/3.0/ or send a
// letter to Creative Commons, 444 Castro Street, Suite 900, Mountain View, California, 94041, USA.
// Persistence of Vision Ray Tracer Include File
// File: terrain.inc
// Desc: terrain for 'balcony.pov' demonstration scene
// Date: July/August 2001
// Auth: Christoph Hormann
// Updated: 09Aug2008 (jh) for v3.7 distribution
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#if (version < 3.7)
#version 3.5;
#end
#declare Tex_Vegetation=
texture {
pigment {
bozo
color_map {
[0.3 color rgb <0.20,0.35,0.1>*0.9 ]
[0.8 color rgb <0.12,0.35,0.1>*0.7 ]
}
scale 4
}
finish {
ambient 0.0
diffuse 0.5
brilliance 0.8
specular 0.1
}
normal {
granite 0.4
}
}
#declare Tex_Stone=
texture {
pigment {
color rgb <0.6,0.6,0.6>
}
finish {
ambient 0.0//0.1
diffuse 0.45
specular 0.15
}
}
#declare Tex_Terrain=
texture {
slope -z
texture_map {
[0.34 Tex_Vegetation ]
[0.34 Tex_Stone ]
}
}
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#declare Terrain=
object {
height_field {
function 300,300 {
pigment {
function { 1-(min(pow(x*x + z*z,1.3), 1) -0.0001) }
color_map {
[0.0 color rgb 0.0]
[1.0 color rgb 1.0]
}
scale 0.35
translate <0.5,0,0.5>
warp { turbulence 0.3 }
scale 3
warp { turbulence 0.4 lambda 2.2 octaves 8 }
scale 1/3
rotate -90*x
translate -0.5*y
scale <1, -1, 1>
translate 0.5*y
}
}
water_level 0.02
rotate 90*x
rotate -10*z
scale <4, 4, 1>
scale 30
}
}
union {
object {
Terrain
translate <130, 368, -10>
}
object {
Terrain
rotate -180*z
scale 0.3
translate <90, 97, -6>
}
texture { Tex_Terrain }
}
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/

74
samples/POV-Ray SDL/water.inc Executable file
View File

@@ -0,0 +1,74 @@
// This work is licensed under the Creative Commons Attribution-ShareAlike 3.0 Unported License.
// To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/3.0/ or send a
// letter to Creative Commons, 444 Castro Street, Suite 900, Mountain View, California, 94041, USA.
// Persistence Of Vision Ray Tracer Include File
// File: water.inc
// Desc: water for 'balcony.pov' demonstration scene
// Date: July/August 2001
// Auth: Christoph Hormann
// Updated: 09Aug2008 (jh) for v3.7 distribution
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#if (version < 3.7)
#version 3.5;
#end
#include "functions.inc"
#declare RMF=function{ f_ridged_mf(x, y, z, 0.07, 2.2, 7, 0.6, 0.9, 1)}
#declare M_Watx4 =
material {
texture {
pigment {
color rgbt <0.2, 0.22, 0.21, 0.94>
}
finish {
diffuse 0.0
ambient -0.2
reflection {
0.0, 0.95
fresnel on
}
conserve_energy
specular 0.4
roughness 0.007
}
normal{
function { RMF(x, y, z) } 0.8
scale 0.3
}
}
interior {
ior 1.31
fade_distance 5
fade_power 1001.0
fade_color <0.02, 0.20, 0.06>
}
}
plane {
z, -1
material {
M_Watx4
}
hollow on
}
plane {
z, -12.0
texture {
pigment { color rgb 0 }
finish { ambient 0.0 diffuse 0.0 }
}
hollow on
}
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/

280
samples/Prolog/queues.yap Normal file
View File

@@ -0,0 +1,280 @@
% This file has been included as an YAP library by Vitor Santos Costa, 1999
% File : QUEUES.PL
% Author : R.A.O'Keefe
% Updated: Friday November 18th, 1983, 8:09:31 pm
% Purpose: define queue operations
% Needs : lib(lists) for append/3.
/** @defgroup Queues Queues
@ingroup library
@{
The following queue manipulation routines are available once
included with the `use_module(library(queues))` command. Queues are
implemented with difference lists.
*/
/**
@pred make_queue(+ _Queue_)
Creates a new empty queue. It should only be used to create a new queue.
*/
/** @pred empty_queue(+ _Queue_)
Tests whether the queue is empty.
*/
/** @pred head_queue(+ _Queue_, ? _Head_)
Unifies Head with the first element of the queue.
*/
/** @pred join_queue(+ _Element_, + _OldQueue_, - _NewQueue_)
Adds the new element at the end of the queue.
*/
/** @pred jump_queue(+ _Element_, + _OldQueue_, - _NewQueue_)
Adds the new element at the front of the list.
*/
/** @pred length_queue(+ _Queue_, - _Length_)
Counts the number of elements currently in the queue.
*/
/** @pred list_join_queue(+ _List_, + _OldQueue_, - _NewQueue_)
Ads the new elements at the end of the queue.
*/
/** @pred list_jump_queue(+ _List_, + _OldQueue_, + _NewQueue_)
Adds all the elements of _List_ at the front of the queue.
*/
/** @pred list_to_queue(+ _List_, - _Queue_)
Creates a new queue with the same elements as _List._
*/
/** @pred queue_to_list(+ _Queue_, - _List_)
Creates a new list with the same elements as _Queue_.
*/
/** @pred serve_queue(+ _OldQueue_, + _Head_, - _NewQueue_)
Removes the first element of the queue for service.
*/
:- module(queues, [
make_queue/1, % create empty queue
join_queue/3, % add element to end of queue
list_join_queue/3, % add many elements to end of queue
jump_queue/3, % add element to front of queue
list_jump_queue/3, % add many elements to front of queue
head_queue/2, % look at first element of queue
serve_queue/3, % remove first element of queue
length_queue/2, % count elements of queue
empty_queue/1, % test whether queue is empty
list_to_queue/2, % convert list to queue
queue_to_list/2 % convert queue to list
]).
:- use_module(library(lists), [append/3]).
/*
:- mode
make_queue(-),
join_queue(+, +, -),
list_join_queue(+, +, -),
jump_queue(+, +, -),
list_jump_queue(+, +, -),
head_queue(+, ?),
serve_queue(+, ?, -),
length_queue(+, ?),
length_queue(+, +, +, -),
empty_queue(+),
list_to_queue(+, -),
queue_to_list(+, -),
queue_to_list(+, +, -).
*/
/* In this package, a queue is represented as a term Front-Back, where
Front is a list and Back is a tail of that list, and is normally a
variable. join_queue will only work when the Back is a variable,
the other routines will accept any tail. The elements of the queue
are the list difference, that is, all the elements starting at Front
and stopping at Back. Examples:
[a,b,c,d,e|Z]-Z has elements a,b,c,d,e
[a,b,c,d,e]-[d,e] has elements a,b,c
Z-Z has no elements
[1,2,3]-[1,2,3] has no elements
*/
% make_queue(Queue)
% creates a new empty queue. It will also match empty queues, but
% because Prolog doesn't do the occurs check, it will also match
% other queues, creating circular lists. So this should ONLY be
% used to make new queues.
make_queue(X-X).
% join_queue(Element, OldQueue, NewQueue)
% adds the new element at the end of the queue. The old queue is
% side-effected, so you *can't* do
% join_queue(1, OldQ, NewQ1),
% join_queue(2, OldQ, NewQ2).
% There isn't any easy way of doing that, sensible though it might
% be. You *can* do
% join_queue(1, OldQ, MidQ),
% join_queue(2, MidQ, NewQ).
% See list_join_queue.
join_queue(Element, Front-[Element|Back], Front-Back).
% list_join_queue(List, OldQueue, NewQueue)
% adds the new elements at the end of the queue. The elements are
% added in the same order that they appear in the list, e.g.
% list_join_queue([y,z], [a,b,c|M]-M, [a,b,c,y,z|N]-N).
list_join_queue(List, Front-OldBack, Front-NewBack) :-
append(List, OldBack, NewBack).
% jump_queue(Element, OldQueue, NewQueue)
% adds the new element at the front of the list. Unlike join_queue,
% jump_queue(1, OldQ, NewQ1),
% jump_queue(2, OldQ, NewQ2)
% *does* work, though if you add things at the end of NewQ1 they
% will also show up in NewQ2. Note that
% jump_queue(1, OldQ, MidQ),
% jump_queue(2, MidQ, NewQ)
% makes NewQ start 2, 1, ...
jump_queue(Element, Front-Back, [Element|Front]-Back).
% list_jump_queue(List, OldQueue, NewQueue)
% adds all the elements of List at the front of the queue. There are
% two ways we might do this. We could add all the elements one at a
% time, so that they would appear at the beginning of the queue in the
% opposite order to the order they had in the list, or we could add
% them in one lump, so that they have the same order in the queue as
% in the list. As you can easily add the elements one at a time if
% that is what you want, I have chosen the latter.
list_jump_queue(List, OldFront-Back, NewFront-Back) :-
append(List, OldFront, NewFront).
% reverse(List, OldFront, NewFront). % for the other definition
% head_queue(Queue, Head)
% unifies Head with the first element of the queue. The tricky part
% is that we might be at the end of a queue: Back-Back, with Back a
% variable, and in that case this predicate should not succeed, as we
% don't know what that element is or whether it exists yet.
head_queue(Front-Back, Head) :-
Front \== Back, % the queue is not empty
Front = [Head|_].
% serve_queue(OldQueue, Head, NewQueue)
% removes the first element of the queue for service.
serve_queue(OldFront-Back, Head, NewFront-Back) :-
OldFront \== Back,
OldFront = [Head|NewFront].
% empty_queue(Queue)
% tests whether the queue is empty. If the back of a queue were
% guaranteed to be a variable, we could have
% empty_queue(Front-Back) :- var(Front).
% but I don't see why you shouldn't be able to treat difference
% lists as queues if you want to.
empty_queue(Front-Back) :-
Front == Back.
% length_queue(Queue, Length)
% counts the number of elements currently in the queue. Note that
% we have to be careful in checking for the end of the list, we
% can't test for [] the way length(List) does.
length_queue(Front-Back, Length) :-
length_queue(Front, Back, 0, N),
Length = N.
length_queue(Front, Back, N, N) :-
Front == Back, !.
length_queue([_|Front], Back, K, N) :-
L is K+1,
length_queue(Front, Back, L, N).
% list_to_queue(List, Queue)
% creates a new queue with the same elements as List.
list_to_queue(List, Front-Back) :-
append(List, Back, Front).
% queue_to_list(Queue, List)
% creates a new list with the same elements as Queue.
queue_to_list(Front-Back, List) :-
queue_to_list(Front, Back, List).
queue_to_list(Front, Back, Ans) :-
Front == Back, !, Ans = [].
queue_to_list([Head|Front], Back, [Head|Tail]) :-
queue_to_list(Front, Back, Tail).

View File

@@ -0,0 +1,124 @@
# Copyright 2015 The Bazel Authors. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""Build definitions for JavaScript binaries compiled with the Closure Compiler.
A single file is produced with the _compiled.js suffix.
By default, the name of the entry point is assumed to be the same as that of the
build target. This behaviour may be overridden with the "main" attribute.
The optimization level may be set with the "compilation_level" attribute.
Supported values are: unobfuscated, simple, and advanced.
Example:
closure_js_binary(
name = "hello",
compilation_level = "simple",
language_in = "ecmascript6",
language_out = "ecmascript3",
externs = ["//third_party/javascript/google_cast/cast.js"],
deps = [
"@closure_library//:closure_library",
":hello_lib",
],
)
This rule will produce hello_combined.js.
"""
_COMPILATION_LEVELS = {
"whitespace_only": [
"--compilation_level=WHITESPACE_ONLY",
"--formatting=PRETTY_PRINT"
],
"simple": ["--compilation_level=SIMPLE"],
"advanced": ["--compilation_level=ADVANCED"]
}
_SUPPORTED_LANGUAGES = {
"es3": ["ES3"],
"ecmascript3": ["ECMASCRIPT3"],
"es5": ["ES5"],
"ecmascript5": ["ECMASCRIPT5"],
"es5_strict": ["ES5_STRICT"],
"ecmascript5_strict": ["ECMASCRIPT5_STRICT"],
"es6": ["ES6"],
"ecmascript6": ["ECMASCRIPT6"],
"es6_strict": ["ES6_STRICT"],
"ecmascript6_strict": ["ECMASCRIPT6_STRICT"],
"es6_typed": ["ES6_TYPED"],
"ecmascript6_typed": ["ECMASCRIPT6_TYPED"],
}
def _impl(ctx):
externs = set(order="compile")
srcs = set(order="compile")
for dep in ctx.attr.deps:
externs += dep.transitive_js_externs
srcs += dep.transitive_js_srcs
args = [
"--entry_point=goog:%s" % ctx.attr.main,
"--js_output_file=%s" % ctx.outputs.out.path,
"--dependency_mode=LOOSE",
"--warning_level=VERBOSE",
] + (["--js=%s" % src.path for src in srcs] +
["--externs=%s" % extern.path for extern in externs])
# Set the compilation level.
if ctx.attr.compilation_level in _COMPILATION_LEVELS:
args += _COMPILATION_LEVELS[ctx.attr.compilation_level]
else:
fail("Invalid compilation_level '%s', expected one of %s" %
(ctx.attr.compilation_level, _COMPILATION_LEVELS.keys()))
# Set the language in.
if ctx.attr.language_in in _SUPPORTED_LANGUAGES:
args += "--language_in=" + _SUPPORTED_LANGUAGES[ctx.attr.language_in]
else:
fail("Invalid language_in '%s', expected one of %s" %
(ctx.attr.language_in, _SUPPORTED_LANGUAGES.keys()))
# Set the language out.
if ctx.attr.language_out in _SUPPORTED_LANGUAGES:
args += "--language_out=" + _SUPPORTED_LANGUAGES[ctx.attr.language_out]
else:
fail("Invalid language_out '%s', expected one of %s" %
(ctx.attr.language_out, _SUPPORTED_LANGUAGES.keys()))
ctx.action(
inputs=list(srcs) + list(externs),
outputs=[ctx.outputs.out],
arguments=args,
executable=ctx.executable._closure_compiler)
return struct(files=set([ctx.outputs.out]))
closure_js_binary = rule(
implementation=_impl,
attrs={
"deps": attr.label_list(
allow_files=False,
providers=["transitive_js_externs", "transitive_js_srcs"]),
"main": attr.string(default="%{name}"),
"compilation_level": attr.string(default="advanced"),
"language_in": attr.string(default="ecmascript6"),
"language_out": attr.string(default="ecmascript3"),
"_closure_compiler": attr.label(
default=Label("//external:closure_compiler_"),
executable=True),
},
outputs={"out": "%{name}_combined.js"})

View File

@@ -0,0 +1,31 @@
include_defs('//tools/build.defs')
gerrit_war(name = 'gerrit')
gerrit_war(name = 'gwtgerrit', ui = 'ui_dbg')
gerrit_war(name = 'headless', ui = None)
gerrit_war(name = 'chrome', ui = 'ui_chrome')
gerrit_war(name = 'firefox', ui = 'ui_firefox')
gerrit_war(name = 'safari', ui = 'ui_safari')
gerrit_war(name = 'polygerrit', ui = 'polygerrit')
gerrit_war(name = 'withdocs', docs = True)
gerrit_war(name = 'release', ui = 'ui_optdbg_r', docs = True, context = ['//plugins:core'], visibility = ['//tools/maven:'])
API_DEPS = [
'//gerrit-acceptance-framework:acceptance-framework',
'//gerrit-acceptance-framework:acceptance-framework-src',
'//gerrit-acceptance-framework:acceptance-framework-javadoc',
'//gerrit-extension-api:extension-api',
'//gerrit-extension-api:extension-api-src',
'//gerrit-extension-api:extension-api-javadoc',
'//gerrit-plugin-api:plugin-api',
'//gerrit-plugin-api:plugin-api-src',
'//gerrit-plugin-api:plugin-api-javadoc',
'//gerrit-plugin-gwtui:gwtui-api',
'//gerrit-plugin-gwtui:gwtui-api-src',
'//gerrit-plugin-gwtui:gwtui-api-javadoc',
]
zip_file(
name = 'api',
srcs = API_DEPS,
)

View File

@@ -0,0 +1,45 @@
package(default_visibility = ["//scripts/release:__pkg__"])
filegroup(
name = "git",
srcs = glob([".git/**"]),
)
filegroup(
name = "dummy",
visibility = ["//visibility:public"],
)
filegroup(
name = "srcs",
srcs = glob(
["**"],
exclude = [
"bazel-*/**",
"output/**",
".*/**",
],
) + [
"//examples:srcs",
"//scripts:srcs",
"//site:srcs",
"//src:srcs",
"//tools:srcs",
"//third_party:srcs",
],
visibility = ["//visibility:private"],
)
load("//tools/build_defs/pkg:pkg.bzl", "pkg_tar")
pkg_tar(
name = "bazel-srcs",
files = [":srcs"],
strip_prefix = ".",
# Public but bazel-only visibility.
visibility = ["//:__subpackages__"],
)
load("//tools/build_rules/go:def.bzl", "go_prefix")
go_prefix("github.com/bazelbuild/bazel")

View File

@@ -0,0 +1,49 @@
# Copyright (c) Twisted Matrix Laboratories.
# See LICENSE for details.
"""
An example client. Run simpleserv.py first before running this.
"""
from twisted.internet import reactor, protocol
# a client protocol
class EchoClient(protocol.Protocol):
"""Once connected, send a message, then print the result."""
def connectionMade(self):
self.transport.write("hello, world!")
def dataReceived(self, data):
"As soon as any data is received, write it back."
print "Server said:", data
self.transport.loseConnection()
def connectionLost(self, reason):
print "connection lost"
class EchoFactory(protocol.ClientFactory):
protocol = EchoClient
def clientConnectionFailed(self, connector, reason):
print "Connection failed - goodbye!"
reactor.stop()
def clientConnectionLost(self, connector, reason):
print "Connection lost - goodbye!"
reactor.stop()
# this connects the protocol to a server running on port 8000
def main():
f = EchoFactory()
reactor.connectTCP("localhost", 8000, f)
reactor.run()
# this only runs if the module was *not* imported
if __name__ == '__main__':
main()

View File

@@ -1421,7 +1421,4 @@ init:
# $ renpy.pause(1.0)
# hide text with dissolve
#
# return
Return to the tutorial.
# return

View File

@@ -0,0 +1,41 @@
Pakker uten en bestemt bolk\n Disse pakkene tilhører ingen bestemt bolk. Kanskje det er noe feil ved dem?
Virtuelle pakker\n Disse pakkene finnes ikke, de er navn som andre pakker bruker for å oppnå en eller annen egenskap.
Pakker som setter opp systemet ditt til å utføre en bestemt oppgave\n Pakkene i bolken «oppgaver» inneholder ingen filer, det kan hende de bare er avhengige av andre pakker. Disse pakkene gjør det mulig å installere pakker for en bestemt oppgave på en lett måte.
Administrative verktøy\n Pakkene i bolken «admin» gjør det mulig å utføre administrative oppgaver, som å installere programmer, opprette eller slette brukere, vise informasjon om systemet eller nettverkstrafikken osv.
Pakker som er laget av pakker i et annet format (rpm, tgz mm)\n Pakkene i bolken «alien» ble laget av programmet «alien» fra et annet format enn Debians eget pakkeformat, f.eks fra RPM-pakker
Debians grunnsystem\n Pakkene i bolken «grunnsystem» hører med til første del av Debian-installasjonen.
Programmer for faksmodem og andre kommunikasjonsenheter\n Pakkene i bolken «Kommunikasjon» brukes til å styre modemer og andre enheter på maskinen, deriblant programvare for styring av faksmodemer (for eksempel, PPP for oppringt internettforbindelse og programmer som opprinnelig er skrevet for dette, slik som zmodem og kermit), og programmer for å styre mobiltelefoner, snakke med FidoNet og kjøre et BBS.
Verktøy og programmer for programvareutvikling\n Pakker i seksjonen «utvikling» blir brukt til å skrive nye programmer og for å jobbe med videre med programmer som allerede er laget. Vanlige brukere som ikke kompilerer (setter sammen) sine egne programmer trenger neppe så mange programmer herfra.\n .\n Her finner du kompilatorer, avlusingsverktøy, skriveprogrammer som hjelper til med programmeringen, verktøy for håndtering av kildekode og andre ting som har med utvikling av programmer å gjøre.
Dokumentasjon og spesialiserte program for visning av dokumentasjon\n Pakker i «dok»-seksjonen dokumenterer deler av Debian-systemet eller viser fram dokumenter i forskjellige format.
Skriveprogram og tekstbehandlere\n Pakker i bolken «skriveprogram» lar deg redigere ren ASCII-tekst. Dette er nødvendigvis ikke tekstbehandlere, selv om du kan finne noen av dem her i denne bolken.
Program for å jobba med elektronikk og elektriske kretser\n Pakker i «elektronikk»-seksjonen inneholder verktøy for design av elektriske kretser, simulatorer og assemblere for mikrokontrollere og andre liknende programmer.
Programmer for innebygde systemer\nPakker i bolken «innebygd» er ment til å kjøre på innebygde systemer. Dette er spesialisert maskinvare med mye mindre datakraft enn en typisk skrivebordssystem, for eksempel en PDA, en mobiltelefon eller en Tivo.
Skrivebordssystemet GNOME\n GNOME er en samling programvare som danner et lettbrukt skrivbordsmiljø for Linux. Pakker i «gnome»-bolken er enten deler av GNOME-miljøet eller tett sammenvevd med det.
Spill, leketøy og andre programmer som bare er for gøy\n Pakker i «spill»-bolken er stort sett bare til for underholdningens skyld.
Verktøy for å lage, vise og redigere grafikkfiler\n Pakker i «grafikk»-bolken er programmer for visning av bildefiler, bildebehandlingsprogrammer, støtteprogrammer for forskjellig utstyr (som videokort, skanner og digitalt kamera) og programmeringsverktøy for å håndtere grafikk.
Programvare for radioamatører\n Pakker i «hamradio»-bolken er stort sett ment for radioamatører.
Programmer som kjører skriptspråk\n Pakker i «tolkeprogram»-bolken er programmer som kompilerer og kjører språk som Python, Perl og Ruby, og som sørger for standardbibliotek for disse språkene.
Skrivebordssystemet KDE\n KDE er en samling programvare som danner et lettbrukt skrivbordsmiljø for Linux. Pakker i «kde»-bolken er enten deler av KDE-miljøet eller tett sammenvevd med det.
Utviklingsfiler for biblioteker\n Pakker i «libdevel»-bolken inneholder filer som trengs for å lage programmer som bruker biblioteker i «libs»-bolken. Du trenger ikke pakker fra denne bolken hvis du ikke har tenkt å lage programmer selv.
Samling av programvarerutiner\n Pakker i «libs»-seksjonen sørger for nødvendige funksjoner som er felles for andre programmer på maskinen. Med svært få unntak skal det ikke værenødvendig å be om at slike pakker blir installert. Pakkesystemet sørger for å installere dem når de andre programmene trenger dem.
Perl-tolker og biblioteker\n Pakker i «perl»-bolken sørger for programmeringsspråket Perl og mange tredjeparts-biblioteker til Perl. Hvis du ikke er Perl-programmerer selv, så trenger du ikke uttrykkelig installere pakker fra denne bolken, pakkesystemet installerer dem selv hvis det er nødvendig.
Python-tolker og biblioteker\n Pakker i «python»-bolken sørger for programmeringsspråket Python og mange tredjeparts-biblioteker til det. Hvis du ikke er Python-programmerer selv, så trenger du ikke uttrykkelig installere pakker fra denne bolken, pakkesystemet installerer dem selv hvis det er nødvendig.
Program for å skrive, sende og omdirigere epostmeldinger\n Pakker i «epost»-bolken inneholder epostlesere, nisser som flytter eposten dit den skal, programvare for epostlister og filter for søppelpost. Det fins også diverse andre programmer som gjør noe med elektronisk post, men som ikke er så lette å plassere i grupper.
Numerisk analyse og andre matematikkrelaterte programmer\n Blant pakker i «matte»-bolken fins kalkulatorer, språk for matematiske utregninger, symbolsk algebra og programmer for å tegne ut matematiske objekter.
Ymse programvare\n Pakker i «ymse»-bolken er ofte vanskelige å klassifisere, men det betyr ikke at de ikke finnes.
Programmer for å koble til og tilby ulike tjenester i et nettverk\n Blant pakker i «nett»-bolken finner du klienter og tjenere for mange protokoller, verktøy for å manipulere og avluse lavnivå nettverksprotokoller, system for direkte meldingstjeneste og andre nettverksrelaterte programmer.
Klienter og tjenere for Usenet\n Pakker i bolken «nyheter» henger sammen med til det distribuerte nyhetssystemet Usenet. Seksjonen tjenere og leseprogrammer (klienter) for dette systemet.
Foreldede programbibliotek\n Pakker i bolken «gamle bibliotek» er foreldede og bør ikke brukes i ny programvare. De er tilgjengelige for at eldre programmer som er avhengige av programmene her fortsatt skal kunne virke.\n .\n Du skal normalt ikke behøve å be om å få installert pakker herfra. Pakkesystemet vil ta med disse pakkene når andre pakker krever det.
Programmer som etterlikner andre datasystemer og og programmer som hjelper deg med å lese fremmede filsystem\n Pakker i bolken «andreosfs» etterlikner maskinvare og operativsystem og tilbyr verktøy for å overføre data mellom ulike operativsystem og maskinvareplattformer. (For eksempel verktøy for å lese DOS-disketter, og verktøy til å kommunisere med håndholdte maskiner som Palm Pilot)\n .\n Programmer for å brenne CD-plater er også med i denne seksjonen.
Programvare for vitenskaplig arbeid\n Pakker i «vitenskap»-bolken er verktøy for astronomi, biologi og kjemi, pluss andre programmer man bruker i vitenskapelig arbeide.
Kommandoskall og alternative konsollmiljø\n Pakker i «skall» er programmer som tilbyr grensesnitt med kommandolinje.
Verktøy for å spille av og ta opp lyd\nI «lyd»-bolken finner du lydavspillere, opptakere, lydkomprimeringsprogram for mange format, miksere og lydstyring, program for MIDI-sekvenser og program for å lage noter. Her finner du også drivere for lydkort og programmer for lydprosessering.
TeX typografi-systemet\n Pakker i bolken «tex» er deler i et system for å produsere utskrifter og andre slags utdata med høy typografisk kvalitet. Det omfatter selve TeX, TeX-pakker, skriveprogrammer som hjelper deg med å lage dokumenter i TeX, verktøy for å gjøre om TeX og TeX utdatafiler til ulike andre format, TeX-skrifttyper og annen programvare knyttet TeX.
Tekstverktøy\n I bolken «tekst» finner du skriveprogrammer og tekstfiltere, stavekontroll, ordbøker og verktøy for å oversette mellom tegnkoding og tekst-filformater (for eksempel Unix og DOS) og programmer for å formatere, skrive ut og redigere som ren tekst.
Forskjellige systemverktøy\n Pakkene i bolken «verktøy» har oppgaver som faller utenfor de andre kategoriene.
Nettlesere, tjenere, mellomtjenere og andre verktøy\n I bolken «nett» finner du blant annet nettlesere, tjenere og mellomtjenere, programmer for å skrive CGI-skript eller nettbaserte programmer og andre programmer som har med verdensveven å gjøre.
Vindussystemet «X» og beslektede programmer\n Pakkene i bolken «X11» inneholder også grunnpakka for vindussystemet «X», vindusbehandlere, verktøy for X og andre programmer med en X-grensesnitt som ble plassert her fordi de ikke passet inn noen andre steder.
Debians hovedarkiv\n Selve Debian-distribusjonen består av pakker fra hovedbolken. Alle pakkene her er fri programvare.\n .\n For mer informasjon om hva Debian mener med «fri programvare», se http://www.debian.org/social_contract#guidelines
Programmer som avhenger av programvare utenfor Debian.\n Pakker i bolken«bidrag» er ikke med i Debian.\n\n Disse pakkene er fri programvare, men de avhenger av programmer som ikke er en del av Debian. Dette kan skyldes at de ikke er fri programvare og ligger i bolken «ufri» i pakkearkivet, og disse kan Debian slett ikke distribuere, eller - i noen sjeldne tilfeller - at ingen har laget en pakke av dette ennå.\n .\n For mer informasjon om hva Debian mener med «fri programvare», se http://www.debian.org/social_contract#guidelines
Programmer som ikke er fri programvare \n Pakkene i bolken «ufri» er ikke en del av Debian\n .\n Disse pakkene passet ikke med en eller flere av betingelsene i Debians retningslinjer for fri programvare (Debian Free Software Guidelines; se nedenfor). Du bør lese lisensen for programmene i denne bolken for å være sikker på at du har rett til å bruke dem slik du har tenkt.\n .\n For mer informasjon om hva Debian mener med «Fri programvare», se http://www.debian.org/social_contract#guidelines
Programmer som er lagret utenfor USA på grunn av eksportforbud.\n Det er stor sjanse for at pakkene i «utenfor USA» inneholder kryptografi, og noen få av dem inneholder patenterte algoritmer. På grunn av dette kan de ikke eksporteres ut av USA, og lagres derfor på en tjener i «den frie verden».\n .\n Merk: Debian-prosjektet er, etter samtale med eksperter på rettsvesenet om nye endringer i eksporteringsreglene, i ferd med å flette kryptografiske programmer inn i de USA-baserte arkivene. De fleste pakkene som før lå i denne bolken er derfor flyttet til «hoved».

View File

@@ -0,0 +1 @@
Please read me.

View File

@@ -0,0 +1,9 @@
To run the "Conway's game of life" macros:
1. Type ":so life.vim". This loads the macros.
2. Type "g" to run the macros.
3. Type CTRL-C to interrupt.
4. Type ":q!" to get out.
See life.vim for more advanced usage.

View File

@@ -0,0 +1 @@
Delete me.

View File

@@ -0,0 +1 @@
Keep me.

View File

@@ -0,0 +1 @@
Read me now!

View File

@@ -0,0 +1 @@
Test me.

973
samples/Text/tutor.nb Normal file
View File

@@ -0,0 +1,973 @@
===============================================================================
= V e l k o m m e n t i l i n n f ø r i n g e n i V i m -- Ver. 1.7 =
===============================================================================
Vim er en meget kraftig editor med mange kommandoer, alt for mange til å
kunne gå gjennom alle i en innføring som denne. Den er beregnet på å
sette deg inn i bruken av nok kommandoer så du vil være i stand til lett
å kunne bruke Vim som en editor til alle formål.
Tiden som kreves for å gå gjennom denne innføringen tar ca. 25-30
minutter, avhengig av hvor mye tid du bruker til eksperimentering.
MERK:
Kommandoene i leksjonene vil modifisere teksten. Lag en kopi av denne
filen som du kan øve deg på (hvis du kjørte Ŧvimtutorŧ-kommandoen, er
dette allerede en kopi).
Det er viktig å huske at denne innføringen er beregnet på læring gjennom
bruk. Det betyr at du må utføre kommandoene for å lære dem skikkelig.
Hvis du bare leser teksten, vil du glemme kommandoene!
Først av alt, sjekk at ŦCaps Lockŧ IKKE er aktiv og trykk Ŧjŧ-tasten for
å flytte markøren helt til leksjon 1.1 fyller skjermen.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 1.1: FLYTTING AV MARKØREN
** For å flytte markøren, trykk tastene h, j, k, l som vist. **
^
k Tips: h-tasten er til venstre og flytter til venstre.
< h l > l-tasten er til høyre og flytter til høyre.
j j-tasten ser ut som en pil som peker nedover.
v
1. Flytt markøren rundt på skjermen til du har fått det inn i fingrene.
2. Hold inne nedovertasten (j) til den repeterer.
Nå vet du hvordan du beveger deg til neste leksjon.
3. Gå til leksjon 1.2 ved hjelp av nedovertasten.
Merk: Hvis du blir usikker på noe du har skrevet, trykk <ESC> for å gå til
normalmodus. Skriv deretter kommandoen du ønsket på nytt.
Merk: Piltastene skal også virke. Men ved å bruke hjkl vil du være i stand til
å bevege markøren mye raskere når du er blitt vant til det. Helt sant!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 1.2: AVSLUTTE VIM
!! MERK: Før du utfører noen av punktene nedenfor, les hele leksjonen!!
1. Trykk <ESC>-tasten (for å forsikre deg om at du er i normalmodus).
2. Skriv: :q! <ENTER>.
Dette avslutter editoren og FORKASTER alle forandringer som du har gjort.
3. Når du ser kommandolinjen i skallet, skriv kommandoen som startet denne
innføringen. Den er: vimtutor <ENTER>
4. Hvis du er sikker på at du husker dette, utfør punktene 1 til 3 for å
avslutte og starte editoren på nytt.
MERK: :q! <ENTER> forkaster alle forandringer som du gjorde. I løpet av noen
få leksjoner vil du lære hvordan du lagrer forandringene til en fil.
5. Flytt markøren ned til leksjon 1.3.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 1.3: REDIGERING AV TEKST -- SLETTING
** Trykk x for å slette tegnet under markøren. **
1. Flytt markøren til den første linjen merket med --->.
2. For å ordne feilene på linjen, flytt markøren til den er oppå tegnet som
skal slettes.
3. Trykk tasten x for å slette det uønskede tegnet.
4. Repeter punkt 2 til 4 til setningen er lik den som er under.
---> Hessstennnn brrråsnudddde ii gaaata.
---> Hesten bråsnudde i gata.
5. Nå som linjen er korrekt, gå til leksjon 1.4.
MERK: Når du går gjennom innføringen, ikke bare prøv å huske kommandoene, men
bruk dem helt til de sitter.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 1.4: REDIGERING AV TEKST -- INNSETTING
** Trykk i for å sette inn tekst. **
1. Flytt markøren til den første linjen som er merket med --->.
2. For å gjøre den første linjen lik den andre, flytt markøren til den står
på tegnet ETTER posisjonen der teksten skal settes inn.
3. Trykk i og skriv inn teksten som mangler.
4. Etterhvert som hver feil er fikset, trykk <ESC> for å returnere til
normalmodus. Repeter punkt 2 til 4 til setningen er korrekt.
---> Det er tkst som mnglr .
---> Det er ganske mye tekst som mangler her.
5. Når du føler deg komfortabel med å sette inn tekst, gå til oppsummeringen
nedenfor.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 1.5: REDIGERING AV TEKST -- LEGGE TIL
** Trykk A for å legge til tekst. **
1. Flytt markøren til den første linjen nedenfor merket --->.
Det har ikke noe å si hvor markøren er plassert på den linjen.
2. Trykk A og skriv inn det som skal legges til.
3. Når teksten er lagt til, trykk <ESC> for å returnere til normalmodusen.
4. Flytt markøren til den andre linjen markert med ---> og repeter steg 2 og
3 for å reparere denne setningen.
---> Det mangler noe tekst p
Det mangler noe tekst på denne linjen.
---> Det mangler også litt tek
Det mangler også litt tekst på denne linjen.
5. Når du føler at du behersker å legge til tekst, gå til leksjon 1.6.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 1.6: REDIGERE EN FIL
** Bruk :wq for å lagre en fil og avslutte. **
!! MERK: Før du utfører noen av stegene nedenfor, les hele denne leksjonen!!
1. Avslutt denne innføringen som du gjorde i leksjon 1.2: :q!
2. Skriv denne kommandoen på kommandolinja: vim tutor <ENTER>
Ŧvimŧ er kommandoen for å starte Vim-editoren, Ŧtutorŧ er navnet på fila
som du vil redigere. Bruk en fil som kan forandres.
3. Sett inn og slett tekst som du lærte i de foregående leksjonene.
4. Lagre filen med forandringene og avslutt Vim med: :wq <ENTER>
5. Start innføringen på nytt og flytt ned til oppsummeringen som følger.
6. Etter å ha lest og forstått stegene ovenfor: Sett i gang.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
OPPSUMMERING AV LEKSJON 1
1. Markøren beveges ved hjelp av piltastene eller hjkl-tastene.
h (venstre) j (ned) k (opp) l (høyre)
2. For å starte Vim fra skall-kommandolinjen, skriv: vim FILNAVN <ENTER>
3. For å avslutte Vim, skriv: <ESC> :q! <ENTER> for å forkaste endringer.
ELLER skriv: <ESC> :wq <ENTER> for å lagre forandringene.
4. For å slette tegnet under markøren, trykk: x
5. For å sette inn eller legge til tekst, trykk:
i skriv innsatt tekst <ESC> sett inn før markøren
A skriv tillagt tekst <ESC> legg til på slutten av linjen
MERK: Når du trykker <ESC> går du til normalmodus eller du avbryter en uønsket
og delvis fullført kommando.
Nå kan du gå videre til leksjon 2.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 2.1: SLETTEKOMMANDOER
** Trykk dw for å slette et ord. **
1. Trykk <ESC> for å være sikker på at du er i normalmodus.
2. Flytt markøren til den første linjen nedenfor merket --->.
3. Flytt markøren til begynnelsen av ordet som skal slettes.
4. Trykk dw og ordet vil forsvinne.
MERK: Bokstaven d vil komme til syne på den nederste linjen på skjermen når
du skriver den. Vim venter på at du skal skrive w . Hvis du ser et annet
tegn enn d har du skrevet noe feil; trykk <ESC> og start på nytt.
---> Det er agurk tre ord eple som ikke hører pære hjemme i denne setningen.
---> Det er tre ord som ikke hører hjemme i denne setningen.
5. Repeter punkt 3 og 4 til den første setningen er lik den andre. Gå
deretter til leksjon 2.2.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 2.2: FLERE SLETTEKOMMANDOER
** Trykk d$ for å slette til slutten av linjen. **
1. Trykk <ESC> for å være sikker på at du er i normalmodus.
2. Flytt markøren til linjen nedenfor merket --->.
3. Flytt markøren til punktet der linjen skal kuttes (ETTER første punktum).
4. Trykk d$ for å slette alt til slutten av linjen.
---> Noen skrev slutten på linjen en gang for mye. linjen en gang for mye.
5. Gå til leksjon 2.3 for å forstå hva som skjer.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 2.3: OM OPERATORER OG BEVEGELSER
Mange kommandoer som forandrer teksten er laget ut i fra en operator og en
bevegelse. Formatet for en slettekommando med sletteoperatoren d er:
d bevegelse
Der:
d - er sletteoperatoren.
bevegelse - er hva operatoren vil opere på (listet nedenfor).
En kort liste med bevegelser:
w - til starten av det neste ordet, UNNTATT det første tegnet.
e - til slutten av det nåværende ordet, INKLUDERT det siste tegnet.
$ - til slutten av linjen, INKLUDERT det siste tegnet.
Ved å skrive de vil altså alt fra markøren til slutten av ordet bli
slettet.
MERK: Ved å skrive kun bevegelsen i normalmodusen uten en operator vil
markøren flyttes som spesifisert.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
LEKSJON 2.4: BRUK AV TELLER FOR EN BEVEGELSE
** Ved å skrive et tall foran en bevegelse repeterer den så mange ganger. **
1. Flytt markøren til starten av linjen markert ---> nedenfor.
2. Skriv 2w for å flytte markøren to ord framover.
3. Skriv 3e for å flytte markøren framover til slutten av det tredje
ordet.
4. Skriv 0 (null) for å flytte til starten av linjen.
5. Repeter steg 2 og 3 med forskjellige tall.
---> Dette er en linje med noen ord som du kan bevege deg rundt på.
6. Gå videre til leksjon 2.5.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 2.5: BRUK AV ANTALL FOR Å SLETTE MER
** Et tall sammen med en operator repeterer den så mange ganger. **
I kombinasjonen med sletteoperatoren og en bevegelse nevnt ovenfor setter du
inn antall før bevegelsen for å slette mer:
d nummer bevegelse
1. Flytt markøren til det første ordet med STORE BOKSTAVER på linjen markert
med --->.
2. Skriv 2dw for å slette de to ordene med store bokstaver.
3. Repeter steg 1 og 2 med forskjelling antall for å slette de etterfølgende
ordene som har store bokstaver.
---> Denne ABC DE linjen FGHI JK LMN OP er nå Q RS TUV litt mer lesbar.
MERK: Et antall mellom operatoren d og bevegelsen virker på samme måte som å
bruke bevegelsen uten en operator.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 2.6: OPERERE PÅ LINJER
** Trykk dd for å slette en hel linje. **
På grunn av at sletting av linjer er mye brukt, fant utviklerne av Vi ut at
det vil være lettere å rett og slett trykke to d-er for å slette en linje.
1. Flytt markøren til den andre linjen i verset nedenfor.
2. Trykk dd å slette linjen.
3. Flytt deretter til den fjerde linjen.
4. Trykk 2dd for å slette to linjer.
---> 1) Roser er røde,
---> 2) Gjørme er gøy,
---> 3) Fioler er blå,
---> 4) Jeg har en bil,
---> 5) Klokker viser tiden,
---> 6) Druer er søte
---> 7) Og du er likeså.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 2.7: ANGRE-KOMMANDOEN
** Trykk u for å angre siste kommando, U for å fikse en hel linje. **
1. Flytt markøren til linjen nedenfor merket ---> og plasser den på den
første feilen.
2. Trykk x for å slette det første uønskede tegnet.
3. Trykk så u for å angre den siste utførte kommandoen.
4. Deretter ordner du alle feilene på linjene ved å bruke kommandoen x .
5. Trykk nå en stor U for å sette linjen tilbake til det den var
originalt.
6. Trykk u noen ganger for å angre U og foregående kommandoer.
7. Deretter trykker du CTRL-R (hold CTRL nede mens du trykker R) noen
ganger for å gjenopprette kommandoene (omgjøre angrekommandoene).
---> RReparer feiilene påå denne linnnjen oog erssstatt dem meed angre.
8. Dette er meget nyttige kommandoer. Nå kan du gå til oppsummeringen av
leksjon 2.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
OPPSUMMERING AV LEKSJON 2
1. For å slette fra markøren fram til det neste ordet, trykk: dw
2. For å slette fra markøren til slutten av en linje, trykk: d$
3. For å slette en hel linje, trykk: dd
4. For å repetere en bevegelse, sett et nummer foran: 2w
5. Formatet for en forandringskommando er:
operator [nummer] bevegelse
der:
operator - hva som skal gjøres, f.eks. d for å slette
[nummer] - et valgfritt antall for å repetere bevegelsen
bevegelse - hva kommandoen skal operere på, eksempelvis w (ord),
$ (til slutten av linjen) og så videre.
6. For å gå til starten av en linje, bruk en null: 0
7. For å angre tidligere endringer, skriv: u (liten u)
For å angre alle forandringer på en linje, skriv: U (stor U)
For å omgjøre angringen, trykk: CTRL-R
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 3.1: ŦLIM INNŧ-KOMMANDOEN
** Trykk p for å lime inn tidligere slettet tekst etter markøren **
1. Flytt markøren til den første linjen med ---> nedenfor.
2. Trykk dd for å slette linjen og lagre den i et Vim-register.
3. Flytt markøren til c)-linjen, OVER posisjonen linjen skal settes inn.
4. Trykk p for å legge linjen under markøren.
5. Repeter punkt 2 til 4 helt til linjene er i riktig rekkefølge.
---> d) Kan du også lære?
---> b) Fioler er blå,
---> c) Intelligens må læres,
---> a) Roser er røde,
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 3.2: ŦERSTATTŧ-KOMMANDOEN
** Trykk rx for å erstatte tegnet under markøren med x. **
1. Flytt markøren til den første linjen nedenfor merket --->.
2. Flytt markøren så den står oppå den første feilen.
3. Trykk r og deretter tegnet som skal være der.
4. Repeter punkt 2 og 3 til den første linjen er lik den andre.
---> Da dfnne lynjxn ble zkrevet, var det nøen som tjykket feite taster!
---> Da denne linjen ble skrevet, var det noen som trykket feile taster!
5. Gå videre til leksjon 3.2.
MERK: Husk at du bør lære ved å BRUKE, ikke pugge.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 3.3: ŦFORANDREŧ-OPERATOREN
** For å forandre til slutten av et ord, trykk ce . **
1. Flytt markøren til den første linjen nedenfor som er merket --->.
2. Plasser markøren på u i Ŧlubjwrŧ.
3. Trykk ce og det korrekte ordet (i dette tilfellet, skriv Ŧinjenŧ).
4. Trykk <ESC> og gå til det neste tegnet som skal forandres.
5. Repeter punkt 3 og 4 helt til den første setningen er lik den andre.
---> Denne lubjwr har noen wgh som må forkwåp med Ŧforækzryasŧ-kommandoen.
---> Denne linjen har noen ord som må forandres med Ŧforandreŧ-kommandoen.
Vær oppmerksom på at ce sletter ordet og går inn i innsettingsmodus.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 3.4: FLERE FORANDRINGER VED BRUK AV c
** Forandringskommandoen blir brukt med de samme bevegelser som Ŧslettŧ. **
1. Forandringsoperatoren fungerer på samme måte som Ŧslettŧ. Formatet er:
c [nummer] bevegelse
2. Bevegelsene er de samme, som for eksempel w (ord) og $ (slutten av en
linje).
3. Gå til den første linjen nedenfor som er merket --->.
4. Flytt markøren til den første feilen.
5. Skriv c$ og skriv resten av linjen lik den andre og trykk <ESC>.
---> Slutten på denne linjen trenger litt hjelp for å gjøre den lik den neste.
---> Slutten på denne linjen trenger å bli rettet ved bruk av c$-kommandoen.
MERK: Du kan bruke slettetasten for å rette feil mens du skriver.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
OPPSUMMERING AV LEKSJON 3
1. For å legge tilbake tekst som nettopp er blitt slettet, trykk p . Dette
limer inn den slettede teksten ETTER markøren (hvis en linje ble slettet
vil den bli limt inn på linjen under markøren).
2. For å erstatte et tegn under markøren, trykk r og deretter tegnet som
du vil ha der.
3. Forandringsoperatoren lar deg forandre fra markøren til dit bevegelsen
tar deg. Det vil si, skriv ce for å forandre fra markøren til slutten
av ordet, c$ for å forandre til slutten av linjen.
4. Formatet for Ŧforandreŧ er:
c [nummer] bevegelse
Nå kan du gå til neste leksjon.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 4.1: POSISJONERING AV MARKØREN OG FILSTATUS
** Trykk CTRL-G for å vise posisjonen i filen og filstatusen.
Trykk G for å gå til en spesifikk linje i filen. **
Merk: Les hele leksjonen før du utfører noen av punktene!
1. Hold nede Ctrl-tasten og trykk g . Vi kaller dette CTRL-G. En melding
vil komme til syne på bunnen av skjermen med filnavnet og posisjonen i
filen. Husk linjenummeret for bruk i steg 3.
Merk: Du kan se markørposisjonen i nederste høyre hjørne av skjermen. Dette
skjer når Ŧrulerŧ-valget er satt (forklart i leksjon 6).
2. Trykk G for å gå til bunnen av filen.
Skriv gg for å gå til begynnelsen av filen.
3. Skriv inn linjenummeret du var på og deretter G . Dette vil føre deg
tilbake til linjen du var på da du først trykket CTRL-G.
4. Utfør steg 1 til 3 hvis du føler deg sikker på prosedyren.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 4.2: SØKEKOMMANDOEN
** Skriv / etterfulgt av en søkestreng som du vil lete etter. **
1. Trykk / når du er i normalmodusen. Legg merke til at skråstreken og
markøren kommer til syne på bunnen av skjermen i likhet med
Ŧ:ŧ-kommandoene.
2. Skriv Ŧfeeeiilŧ og trykk <ENTER>. Dette er teksten du vil lete etter.
3. For å finne neste forekomst av søkestrengen, trykk n .
For å lete etter samme søketeksten i motsatt retning, trykk N .
4. For å lete etter en tekst bakover i filen, bruk ? istedenfor / .
5. For å gå tilbake til der du kom fra, trykk CTRL-O (Hold Ctrl nede mens
du trykker bokstaven o ). Repeter for å gå enda lengre tilbake. CTRL-I
går framover.
---> Ŧfeeeiilŧ er ikke måten å skrive Ŧfeilŧ på, feeeiil er helt feil.
Merk: Når søkingen når slutten av filen, vil den fortsette fra starten unntatt
hvis Ŧwrapscanŧ-valget er resatt.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 4.3: FINN SAMSVARENDE PARENTESER
** Trykk % for å finne en samsvarende ), ] eller } . **
1. Plasser markøren på en (, [ eller { på linjen nedenfor merket --->.
2. Trykk % .
3. Markøren vil gå til den samsvarende parentesen eller hakeparentesen.
4. Trykk % for å flytte markøren til den andre samsvarende parentesen.
5. Flytt markøren til en annen (, ), [, ], { eller } og se hva % gjør.
---> Dette ( er en testlinje med (, [ ] og { } i den )).
Merk: Dette er veldig nyttig til feilsøking i programmer som har ubalansert
antall parenteser!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 4.4: ERSTATT-KOMMANDOEN
** Skriv :s/gammel/ny/g for å erstatte Ŧgammelŧ med Ŧnyŧ. **
1. Flytt markøren til linjen nedenfor som er merket med --->.
2. Skriv :s/deen/den/ <ENTER> . Legg merke til at denne kommandoen bare
forandrer den første forekomsten av Ŧdeenŧ på linjen.
3. Skriv :s/deen/den/g . Når g-flagget legges til, betyr dette global
erstatning på linjen og erstatter alle forekomster av Ŧdeenŧ på linjen.
---> deen som kan kaste deen tyngste steinen lengst er deen beste
4. For å erstatte alle forekomster av en tekststreng mellom to linjer,
skriv :#,#s/gammel/ny/g der #,# er linjenumrene på de to linjene for
linjeområdet erstatningen skal gjøres.
Skriv :%s/gammel/ny/g for å erstatte tekst i hele filen.
Skriv :%s/gammel/ny/gc for å finne alle forekomster i hele filen, og
deretter spørre om teksten skal erstattes eller
ikke.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
OPPSUMMERING AV LEKSJON 4
1. Ctrl-G viser nåværende posisjon i filen og filstatusen.
G går til slutten av filen.
nummer G går til det linjenummeret.
gg går til den første linjen.
2. Skriv / etterfulgt av en søketekst for å lete FRAMOVER etter teksten.
Skriv ? etterfulgt av en søketekst for å lete BAKOVER etter teksten.
Etter et søk kan du trykke n for å finne neste forekomst i den samme
retningen eller N for å lete i motsatt retning.
CTRL-O tar deg tilbake til gamle posisjoner, CTRL-I til nyere posisjoner.
3. Skriv % når markøren står på en (, ), [, ], { eller } for å finne den
som samsvarer.
4. Erstatte Ŧgammelŧ med første Ŧnyŧ på en linje: :s/gammel/ny
Erstatte alle Ŧgammelŧ med Ŧnyŧ på en linje: :s/gammel/ny/g
Erstatte tekst mellom to linjenumre: :#,#s/gammel/ny/g
Erstatte alle forekomster i en fil: :%s/gammel/ny/g
For å godkjenne hver erstatning, legg til Ŧcŧ: :%s/gammel/ny/gc
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 5.1: HVORDAN UTFØRE EN EKSTERN KOMMANDO
** Skriv :! etterfulgt av en ekstern kommando for å utføre denne. **
1. Skriv den velkjente kommandoen : for å plassere markøren på bunnen av
skjermen. Dette lar deg skrive en kommandolinjekommando.
2. Nå kan du skrive tegnet ! . Dette lar deg utføre en hvilken som helst
ekstern kommando.
3. Som et eksempel, skriv ls etter utropstegnet og trykk <ENTER>. Du vil
nå få en liste over filene i katalogen, akkurat som om du hadde kjørt
kommandoen direkte fra kommandolinjen i skallet. Eller bruk :!dir hvis
Ŧlsŧ ikke virker.
MERK: Det er mulig å kjøre alle eksterne kommandoer på denne måten, også med
parametere.
MERK: Alle Ŧ:ŧ-kommandoer må avsluttes med <ENTER>. Fra dette punktet er det
ikke alltid vi nevner det.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 5.2: MER OM LAGRING AV FILER
** For å lagre endringene gjort i en tekst, skriv :w FILNAVN. **
1. Skriv :!dir eller :!ls for å få en liste over filene i katalogen. Du
vet allerede at du må trykke <ENTER> etter dette.
2. Velg et filnavn på en fil som ikke finnes, som for eksempel TEST .
3. Skriv :w TEST (der TEST er filnavnet du velger).
4. Dette lagrer hele filen (denne innføringen) under navnet TEST . For å
sjekke dette, skriv :!dir eller :!ls igjen for å se innholdet av
katalogen.
Merk: Hvis du nå hadde avsluttet Vim og startet på nytt igjen med Ŧvim TESTŧ,
ville filen vært en eksakt kopi av innføringen da du lagret den.
5. Fjern filen ved å skrive :!rm TEST hvis du er på et Unix-lignende
operativsystem, eller :!del TEST hvis du bruker MS-DOS.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 5.3: VELGE TEKST SOM SKAL LAGRES
** For å lagre en del av en fil, skriv v bevegelse :w FILNAVN **
1. Flytt markøren til denne linjen.
2. Trykk v og flytt markøren til det femte elementet nedenfor. Legg merke
til at teksten blir markert.
3. Trykk : (kolon). På bunnen av skjermen vil :'<,'> komme til syne.
4. Trykk w TEST , der TEST er et filnavn som ikke finnes enda. Kontroller
at du ser :'<,'>w TEST før du trykker Enter.
5. Vim vil skrive de valgte linjene til filen TEST. Bruk :!dir eller :!ls
for å se den. Ikke slett den enda! Vi vil bruke den i neste leksjon.
MERK: Ved å trykke v startes visuelt valg. Du kan flytte markøren rundt for
å gjøre det valgte området større eller mindre. Deretter kan du bruke en
operator for å gjøre noe med teksten. For eksempel sletter d teksten.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 5.4: HENTING OG SAMMENSLÅING AV FILER
** For å lese inn en annen fil inn i nåværende buffer, skriv :r FILNAVN **
1. Plasser markøren like over denne linjen.
MERK: Etter å ha utført steg 2 vil du se teksten fra leksjon 5.3. Gå deretter
NED for å se denne leksjonen igjen.
2. Hent TEST-filen ved å bruke kommandoen :r TEST der TEST er navnet på
filen du brukte. Filen du henter blir plassert nedenfor markørlinjen.
3. For å sjekke at filen ble hentet, gå tilbake og se at det er to kopier av
leksjon 5.3, originalen og denne versjonen.
MERK: Du kan også lese utdataene av en ekstern kommando. For eksempel, :r !ls
leser utdataene av ls-kommandoen og legger dem nedenfor markøren.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
OPPSUMMERING AV LEKSJON 5
1. :!kommando utfører en ekstern kommandio.
Noen nyttige eksempler er:
(MS-DOS) (Unix)
:!dir :!ls - List filene i katalogen.
:!del FILNAVN :!rm FILNAVN - Slett filen FILNAVN.
2. :w FILNAVN skriver den nåværende Vim-filen disken med navnet FILNAVN .
3. v bevegelse :w FILNAVN lagrer de visuelt valgte linjene til filen
FILNAVN.
4. :r FILNAVN henter filen FILNAVN og legger den inn nedenfor markøren.
5. :r !dir leser utdataene fra Ŧdirŧ-kommandoen og legger dem nedenfor
markørposisjonen.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 6.1: ŦÅPNE LINJEŧ-KOMMANDOEN
** Skriv o for å Ŧåpne oppŧ for en ny linje etter markøren og gå til
innsettingsmodus **
1. Flytt markøren til linjen nedenfor merket --->.
2. Skriv o (liten o) for å åpne opp en linje NEDENFOR markøren og gå inn i
innsettingsmodus.
3. Skriv litt tekst og trykk <ESC> for å gå ut av innsettingsmodusen.
---> Etter at o er skrevet blir markøren plassert på den tomme linjen.
4. For å åpne en ny linje OVER markøren, trykk rett og slett en stor O
istedenfor en liten o . Prøv dette på linjen nedenfor.
---> Lag ny linje over denne ved å trykke O mens markøren er på denne linjen.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 6.2: ŦLEGG TILŧ-KOMMANDOEN
** Skriv a for å legge til tekst ETTER markøren. **
1. Flytt markøren til starten av linjen merket ---> nedenfor.
2. Trykk e til markøren er på slutten av Ŧliŧ.
3. Trykk a (liten a) for å legge til tekst ETTER markøren.
4. Fullfør ordet sånn som på linjen nedenfor. Trykk <ESC> for å gå ut av
innsettingsmodusen.
5. Bruk e for å gå til det neste ufullstendige ordet og repeter steg 3 og
4.
---> Denne li lar deg øve på å leg til tek på en linje.
---> Denne linjen lar deg øve på å legge til tekst på en linje.
Merk: a, i og A går alle til den samme innsettingsmodusen, den eneste
forskjellen er hvor tegnene blir satt inn.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 6.3: EN ANNEN MÅTE Å ERSTATTE PÅ
** Skriv en stor R for å erstatte mer enn ett tegn. **
1. Flytt markøren til den første linjen nedenfor merket --->. Flytt markøren
til begynnelsen av den første Ŧxxxŧ-en.
2. Trykk R og skriv inn tallet som står nedenfor på den andre linjen så
det erstatter xxx.
3. Trykk <ESC> for å gå ut av erstatningsmodusen. Legg merke til at resten
av linjen forblir uforandret.
4. Repeter stegene for å erstatte den gjenværende xxx.
---> Ved å legge 123 til xxx får vi xxx.
---> Ved å legge 123 til 456 får vi 579.
MERK: Erstatningsmodus er lik insettingsmodus, men hvert tegn som skrives
erstatter et eksisterende tegn.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 6.4: KOPIERE OG LIME INN TEKST
** Bruk y-operatoren for å kopiere tekst og p for å lime den inn **
1. Gå til linjen merket ---> nedenfor og plasser markøren etter Ŧa)ŧ.
2. Gå inn i visuell modus med v og flytt markøren til like før Ŧførsteŧ.
3. Trykk y for å kopiere (engelsk: Ŧyankŧ) den uthevede teksten.
4. Flytt markøren til slutten av den neste linjen: j$
5. Trykk p for å lime inn teksten. Trykk deretter: a andre <ESC> .
6. Bruk visuell modus for å velge Ŧ valget.ŧ, kopier det med y , gå til
slutten av den neste linjen med j$ og legg inn teksten der med p .
---> a) Dette er det første valget.
b)
Merk: Du kan også bruke y som en operator; yw kopierer ett ord.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 6.5: SETT VALG
** Sett et valg så søk eller erstatning ignorerer store/små bokstaver. **
1. Let etter Ŧignoreŧ ved å skrive: /ignore <ENTER>
Repeter flere ganger ved å trykke n .
2. Sett Ŧicŧ-valget (Ignore Case) ved å skrive: :set ic
3. Søk etter Ŧignoreŧ igjen ved å trykke n .
Legg merke til at både ŦIgnoreŧ og ŦIGNOREŧ blir funnet.
4. Sett Ŧhlsearchŧ- og Ŧincsearchŧ-valgene: :set hls is
5. Skriv søkekommandoen igjen og se hva som skjer: /ignore <ENTER>
6. For å slå av ignorering av store/små bokstaver, skriv: :set noic
Merk: For å fjerne uthevingen av treff, skriv: :nohlsearch
Merk: Hvis du vil ignorere store/små bokstaver for kun en søkekommando, bruk
\c i uttrykket: /ignore\c <ENTER>
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
OPPSUMMERING AV LEKSJON 6
1. Trykk o for å legge til en linje NEDENFOR markøren og gå inn i
innsettingsmodus.
Trykk O for å åpne en linje OVER markøren.
2. Skriv a for å sette inn tekst ETTER markøren.
Skriv A for å sette inn tekst etter slutten av linjen.
3. Kommandoen e går til slutten av et ord.
4. Operatoren y (Ŧyankŧ) kopierer tekst, p (Ŧpasteŧ) limer den inn.
5. Ved å trykke R går du inn i erstatningsmodus helt til <ESC> trykkes.
6. Skriv Ŧ:set xxxŧ for å sette valget Ŧxxxŧ. Noen valg er:
Ŧicŧ Ŧignorecaseŧ ignorer store/små bokstaver under søk
Ŧisŧ Ŧincsearchŧ vis delvise treff for en søketekst
Ŧhlsŧ Ŧhlsearchŧ uthev alle søketreff
7. Legg til Ŧnoŧ foran valget for å slå det av: :set noic
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 7.1: FÅ HJELP
** Bruk det innebygde hjelpesystemet. **
Vim har et omfattende innebygget hjelpesystem. For å starte det, prøv en av
disse måtene:
- Trykk Hjelp-tasten (hvis du har en)
- Trykk F1-tasten (hvis du har en)
- Skriv :help <ENTER>
Les teksten i hjelpevinduet for å finne ut hvordan hjelpen virker.
Skriv CTRL-W CTRL-W for å hoppe fra et vindu til et annet
Skriv :q <ENTER> for å lukke hjelpevinduet.
Du kan få hjelp for omtrent alle temaer om Vim ved å skrive et parameter til
Ŧ:helpŧ-kommandoen. Prøv disse (ikke glem å trykke <ENTER>):
:help w
:help c_CTRL-D
:help insert-index
:help user-manual
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 7.2: LAG ET OPPSTARTSSKRIPT
** Slå på funksjoner i Vim **
Vim har mange flere funksjoner enn Vi, men flesteparten av dem er slått av
som standard. For å begynne å bruke flere funksjoner må du lage en
Ŧvimrcŧ-fil.
1. Start redigeringen av Ŧvimrcŧ-filen. Dette avhenger av systemet ditt:
:e ~/.vimrc for Unix
:e $VIM/_vimrc for MS Windows
2. Les inn eksempelfilen for Ŧvimrcŧ:
:r $VIMRUNTIME/vimrc_example.vim
3. Lagre filen med:
:w
Neste gang du starter Vim vil den bruke syntaks-utheving. Du kan legge til
alle dine foretrukne oppsett i denne Ŧvimrcŧ-filen.
For mer informasjon, skriv :help vimrc-intro
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 7.3: FULLFØRING
** Kommandolinjefullføring med CTRL-D og <TAB> **
1. Vær sikker på at Vim ikke er i Vi-kompatibel modus: :set nocp
2. Se hvilke filer som er i katalogen: :!ls eller :!dir
3. Skriv starten på en kommando: :e
4. Trykk CTRL-D og Vim vil vise en liste over kommandoer som starter med
Ŧeŧ.
5. Trykk <TAB> og Vim vil fullføre kommandonavnet til Ŧ:editŧ.
6. Legg til et mellomrom og starten på et eksisterende filnavn: :edit FIL
7. Trykk <TAB>. Vim vil fullføre navnet (hvis det er unikt).
MERK: Fullføring fungerer for mange kommandoer. Prøv ved å trykke CTRL-D og
<TAB>. Det er spesielt nyttig for bruk sammen med :help .
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
OPPSUMMERING AV LEKSJON 7
1. Skriv :help eller trykk <F1> eller <Help> for å åpne et hjelpevindu.
2. Skriv :help kommando for å få hjelp om kommando .
3. Trykk CTRL-W CTRL-W for å hoppe til et annet vindu.
4. Trykk :q for å lukke hjelpevinduet.
5. Opprett et vimrc-oppstartsskript for å lagre favorittvalgene dine.
6. Når du skriver en Ŧ:ŧ-kommando, trykk CTRL-D for å se mulige
fullføringer. Trykk <TAB> for å bruke en fullføring.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Her slutter innføringen i Vim. Den var ment som en rask oversikt over
editoren, akkurat nok til å la deg sette i gang med enkel bruk. Den er på
langt nær komplett, da Vim har mange flere kommandoer. Les bruksanvisningen
ved å skrive :help user-manual .
For videre lesing og studier, kan denne boken anbefales:
ŦVim - Vi Improvedŧ av Steve Oualline
Utgiver: New Riders
Den første boken som er fullt og helt dedisert til Vim. Spesielt nyttig for
nybegynnere. Inneholder mange eksempler og illustrasjoner.
Se http://iccf-holland.org/click5.html
Denne boken er eldre og handler mer om Vi enn Vim, men anbefales også:
ŦLearning the Vi Editorŧ av Linda Lamb
Utgiver: O'Reilly & Associates Inc.
Det er en god bok for å få vite omtrent hva som helst om Vi.
Den sjette utgaven inneholder også informasjon om Vim.
Denne innføringen er skrevet av Michael C. Pierce og Robert K. Ware,
Colorado School of Mines med idéer av Charles Smith, Colorado State
University. E-mail: bware@mines.colorado.edu .
Modifisert for Vim av Bram Moolenaar.
Oversatt av Øyvind A. Holm. E-mail: vimtutor _AT_ sunbase.org
Id: tutor.no 406 2007-03-18 22:48:36Z sunny
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
vim: set ts=8 :

973
samples/Text/tutor.no Normal file
View File

@@ -0,0 +1,973 @@
===============================================================================
= V e l k o m m e n t i l i n n f ø r i n g e n i V i m -- Ver. 1.7 =
===============================================================================
Vim er en meget kraftig editor med mange kommandoer, alt for mange til å
kunne gå gjennom alle i en innføring som denne. Den er beregnet på å
sette deg inn i bruken av nok kommandoer så du vil være i stand til lett
å kunne bruke Vim som en editor til alle formål.
Tiden som kreves for å gå gjennom denne innføringen tar ca. 25-30
minutter, avhengig av hvor mye tid du bruker til eksperimentering.
MERK:
Kommandoene i leksjonene vil modifisere teksten. Lag en kopi av denne
filen som du kan øve deg på (hvis du kjørte «vimtutor»-kommandoen, er
dette allerede en kopi).
Det er viktig å huske at denne innføringen er beregnet på læring gjennom
bruk. Det betyr at du må utføre kommandoene for å lære dem skikkelig.
Hvis du bare leser teksten, vil du glemme kommandoene!
Først av alt, sjekk at «Caps Lock» IKKE er aktiv og trykk «j»-tasten for
å flytte markøren helt til leksjon 1.1 fyller skjermen.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 1.1: FLYTTING AV MARKØREN
** For å flytte markøren, trykk tastene h, j, k, l som vist. **
^
k Tips: h-tasten er til venstre og flytter til venstre.
< h l > l-tasten er til høyre og flytter til høyre.
j j-tasten ser ut som en pil som peker nedover.
v
1. Flytt markøren rundt på skjermen til du har fått det inn i fingrene.
2. Hold inne nedovertasten (j) til den repeterer.
Nå vet du hvordan du beveger deg til neste leksjon.
3. Gå til leksjon 1.2 ved hjelp av nedovertasten.
Merk: Hvis du blir usikker på noe du har skrevet, trykk <ESC> for å gå til
normalmodus. Skriv deretter kommandoen du ønsket på nytt.
Merk: Piltastene skal også virke. Men ved å bruke hjkl vil du være i stand til
å bevege markøren mye raskere når du er blitt vant til det. Helt sant!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 1.2: AVSLUTTE VIM
!! MERK: Før du utfører noen av punktene nedenfor, les hele leksjonen!!
1. Trykk <ESC>-tasten (for å forsikre deg om at du er i normalmodus).
2. Skriv: :q! <ENTER>.
Dette avslutter editoren og FORKASTER alle forandringer som du har gjort.
3. Når du ser kommandolinjen i skallet, skriv kommandoen som startet denne
innføringen. Den er: vimtutor <ENTER>
4. Hvis du er sikker på at du husker dette, utfør punktene 1 til 3 for å
avslutte og starte editoren på nytt.
MERK: :q! <ENTER> forkaster alle forandringer som du gjorde. I løpet av noen
få leksjoner vil du lære hvordan du lagrer forandringene til en fil.
5. Flytt markøren ned til leksjon 1.3.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 1.3: REDIGERING AV TEKST -- SLETTING
** Trykk x for å slette tegnet under markøren. **
1. Flytt markøren til den første linjen merket med --->.
2. For å ordne feilene på linjen, flytt markøren til den er oppå tegnet som
skal slettes.
3. Trykk tasten x for å slette det uønskede tegnet.
4. Repeter punkt 2 til 4 til setningen er lik den som er under.
---> Hessstennnn brrråsnudddde ii gaaata.
---> Hesten bråsnudde i gata.
5. Nå som linjen er korrekt, gå til leksjon 1.4.
MERK: Når du går gjennom innføringen, ikke bare prøv å huske kommandoene, men
bruk dem helt til de sitter.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 1.4: REDIGERING AV TEKST -- INNSETTING
** Trykk i for å sette inn tekst. **
1. Flytt markøren til den første linjen som er merket med --->.
2. For å gjøre den første linjen lik den andre, flytt markøren til den står
på tegnet ETTER posisjonen der teksten skal settes inn.
3. Trykk i og skriv inn teksten som mangler.
4. Etterhvert som hver feil er fikset, trykk <ESC> for å returnere til
normalmodus. Repeter punkt 2 til 4 til setningen er korrekt.
---> Det er tkst som mnglr .
---> Det er ganske mye tekst som mangler her.
5. Når du føler deg komfortabel med å sette inn tekst, gå til oppsummeringen
nedenfor.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 1.5: REDIGERING AV TEKST -- LEGGE TIL
** Trykk A for å legge til tekst. **
1. Flytt markøren til den første linjen nedenfor merket --->.
Det har ikke noe å si hvor markøren er plassert på den linjen.
2. Trykk A og skriv inn det som skal legges til.
3. Når teksten er lagt til, trykk <ESC> for å returnere til normalmodusen.
4. Flytt markøren til den andre linjen markert med ---> og repeter steg 2 og
3 for å reparere denne setningen.
---> Det mangler noe tekst p
Det mangler noe tekst på denne linjen.
---> Det mangler også litt tek
Det mangler også litt tekst på denne linjen.
5. Når du føler at du behersker å legge til tekst, gå til leksjon 1.6.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 1.6: REDIGERE EN FIL
** Bruk :wq for å lagre en fil og avslutte. **
!! MERK: Før du utfører noen av stegene nedenfor, les hele denne leksjonen!!
1. Avslutt denne innføringen som du gjorde i leksjon 1.2: :q!
2. Skriv denne kommandoen på kommandolinja: vim tutor <ENTER>
«vim» er kommandoen for å starte Vim-editoren, «tutor» er navnet på fila
som du vil redigere. Bruk en fil som kan forandres.
3. Sett inn og slett tekst som du lærte i de foregående leksjonene.
4. Lagre filen med forandringene og avslutt Vim med: :wq <ENTER>
5. Start innføringen på nytt og flytt ned til oppsummeringen som følger.
6. Etter å ha lest og forstått stegene ovenfor: Sett i gang.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
OPPSUMMERING AV LEKSJON 1
1. Markøren beveges ved hjelp av piltastene eller hjkl-tastene.
h (venstre) j (ned) k (opp) l (høyre)
2. For å starte Vim fra skall-kommandolinjen, skriv: vim FILNAVN <ENTER>
3. For å avslutte Vim, skriv: <ESC> :q! <ENTER> for å forkaste endringer.
ELLER skriv: <ESC> :wq <ENTER> for å lagre forandringene.
4. For å slette tegnet under markøren, trykk: x
5. For å sette inn eller legge til tekst, trykk:
i skriv innsatt tekst <ESC> sett inn før markøren
A skriv tillagt tekst <ESC> legg til på slutten av linjen
MERK: Når du trykker <ESC> går du til normalmodus eller du avbryter en uønsket
og delvis fullført kommando.
Nå kan du gå videre til leksjon 2.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 2.1: SLETTEKOMMANDOER
** Trykk dw for å slette et ord. **
1. Trykk <ESC> for å være sikker på at du er i normalmodus.
2. Flytt markøren til den første linjen nedenfor merket --->.
3. Flytt markøren til begynnelsen av ordet som skal slettes.
4. Trykk dw og ordet vil forsvinne.
MERK: Bokstaven d vil komme til syne på den nederste linjen på skjermen når
du skriver den. Vim venter på at du skal skrive w . Hvis du ser et annet
tegn enn d har du skrevet noe feil; trykk <ESC> og start på nytt.
---> Det er agurk tre ord eple som ikke hører pære hjemme i denne setningen.
---> Det er tre ord som ikke hører hjemme i denne setningen.
5. Repeter punkt 3 og 4 til den første setningen er lik den andre. Gå
deretter til leksjon 2.2.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 2.2: FLERE SLETTEKOMMANDOER
** Trykk d$ for å slette til slutten av linjen. **
1. Trykk <ESC> for å være sikker på at du er i normalmodus.
2. Flytt markøren til linjen nedenfor merket --->.
3. Flytt markøren til punktet der linjen skal kuttes (ETTER første punktum).
4. Trykk d$ for å slette alt til slutten av linjen.
---> Noen skrev slutten på linjen en gang for mye. linjen en gang for mye.
5. Gå til leksjon 2.3 for å forstå hva som skjer.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 2.3: OM OPERATORER OG BEVEGELSER
Mange kommandoer som forandrer teksten er laget ut i fra en operator og en
bevegelse. Formatet for en slettekommando med sletteoperatoren d er:
d bevegelse
Der:
d - er sletteoperatoren.
bevegelse - er hva operatoren vil opere på (listet nedenfor).
En kort liste med bevegelser:
w - til starten av det neste ordet, UNNTATT det første tegnet.
e - til slutten av det nåværende ordet, INKLUDERT det siste tegnet.
$ - til slutten av linjen, INKLUDERT det siste tegnet.
Ved å skrive de vil altså alt fra markøren til slutten av ordet bli
slettet.
MERK: Ved å skrive kun bevegelsen i normalmodusen uten en operator vil
markøren flyttes som spesifisert.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
LEKSJON 2.4: BRUK AV TELLER FOR EN BEVEGELSE
** Ved å skrive et tall foran en bevegelse repeterer den så mange ganger. **
1. Flytt markøren til starten av linjen markert ---> nedenfor.
2. Skriv 2w for å flytte markøren to ord framover.
3. Skriv 3e for å flytte markøren framover til slutten av det tredje
ordet.
4. Skriv 0 (null) for å flytte til starten av linjen.
5. Repeter steg 2 og 3 med forskjellige tall.
---> Dette er en linje med noen ord som du kan bevege deg rundt på.
6. Gå videre til leksjon 2.5.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 2.5: BRUK AV ANTALL FOR Å SLETTE MER
** Et tall sammen med en operator repeterer den så mange ganger. **
I kombinasjonen med sletteoperatoren og en bevegelse nevnt ovenfor setter du
inn antall før bevegelsen for å slette mer:
d nummer bevegelse
1. Flytt markøren til det første ordet med STORE BOKSTAVER på linjen markert
med --->.
2. Skriv 2dw for å slette de to ordene med store bokstaver.
3. Repeter steg 1 og 2 med forskjelling antall for å slette de etterfølgende
ordene som har store bokstaver.
---> Denne ABC DE linjen FGHI JK LMN OP er nå Q RS TUV litt mer lesbar.
MERK: Et antall mellom operatoren d og bevegelsen virker på samme måte som å
bruke bevegelsen uten en operator.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 2.6: OPERERE PÅ LINJER
** Trykk dd for å slette en hel linje. **
På grunn av at sletting av linjer er mye brukt, fant utviklerne av Vi ut at
det vil være lettere å rett og slett trykke to d-er for å slette en linje.
1. Flytt markøren til den andre linjen i verset nedenfor.
2. Trykk dd å slette linjen.
3. Flytt deretter til den fjerde linjen.
4. Trykk 2dd for å slette to linjer.
---> 1) Roser er røde,
---> 2) Gjørme er gøy,
---> 3) Fioler er blå,
---> 4) Jeg har en bil,
---> 5) Klokker viser tiden,
---> 6) Druer er søte
---> 7) Og du er likeså.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 2.7: ANGRE-KOMMANDOEN
** Trykk u for å angre siste kommando, U for å fikse en hel linje. **
1. Flytt markøren til linjen nedenfor merket ---> og plasser den på den
første feilen.
2. Trykk x for å slette det første uønskede tegnet.
3. Trykk så u for å angre den siste utførte kommandoen.
4. Deretter ordner du alle feilene på linjene ved å bruke kommandoen x .
5. Trykk nå en stor U for å sette linjen tilbake til det den var
originalt.
6. Trykk u noen ganger for å angre U og foregående kommandoer.
7. Deretter trykker du CTRL-R (hold CTRL nede mens du trykker R) noen
ganger for å gjenopprette kommandoene (omgjøre angrekommandoene).
---> RReparer feiilene påå denne linnnjen oog erssstatt dem meed angre.
8. Dette er meget nyttige kommandoer. Nå kan du gå til oppsummeringen av
leksjon 2.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
OPPSUMMERING AV LEKSJON 2
1. For å slette fra markøren fram til det neste ordet, trykk: dw
2. For å slette fra markøren til slutten av en linje, trykk: d$
3. For å slette en hel linje, trykk: dd
4. For å repetere en bevegelse, sett et nummer foran: 2w
5. Formatet for en forandringskommando er:
operator [nummer] bevegelse
der:
operator - hva som skal gjøres, f.eks. d for å slette
[nummer] - et valgfritt antall for å repetere bevegelsen
bevegelse - hva kommandoen skal operere på, eksempelvis w (ord),
$ (til slutten av linjen) og så videre.
6. For å gå til starten av en linje, bruk en null: 0
7. For å angre tidligere endringer, skriv: u (liten u)
For å angre alle forandringer på en linje, skriv: U (stor U)
For å omgjøre angringen, trykk: CTRL-R
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 3.1: «LIM INN»-KOMMANDOEN
** Trykk p for å lime inn tidligere slettet tekst etter markøren **
1. Flytt markøren til den første linjen med ---> nedenfor.
2. Trykk dd for å slette linjen og lagre den i et Vim-register.
3. Flytt markøren til c)-linjen, OVER posisjonen linjen skal settes inn.
4. Trykk p for å legge linjen under markøren.
5. Repeter punkt 2 til 4 helt til linjene er i riktig rekkefølge.
---> d) Kan du også lære?
---> b) Fioler er blå,
---> c) Intelligens må læres,
---> a) Roser er røde,
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 3.2: «ERSTATT»-KOMMANDOEN
** Trykk rx for å erstatte tegnet under markøren med x. **
1. Flytt markøren til den første linjen nedenfor merket --->.
2. Flytt markøren så den står oppå den første feilen.
3. Trykk r og deretter tegnet som skal være der.
4. Repeter punkt 2 og 3 til den første linjen er lik den andre.
---> Da dfnne lynjxn ble zkrevet, var det nøen som tjykket feite taster!
---> Da denne linjen ble skrevet, var det noen som trykket feile taster!
5. Gå videre til leksjon 3.2.
MERK: Husk at du bør lære ved å BRUKE, ikke pugge.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 3.3: «FORANDRE»-OPERATOREN
** For å forandre til slutten av et ord, trykk ce . **
1. Flytt markøren til den første linjen nedenfor som er merket --->.
2. Plasser markøren på u i «lubjwr».
3. Trykk ce og det korrekte ordet (i dette tilfellet, skriv «injen»).
4. Trykk <ESC> og gå til det neste tegnet som skal forandres.
5. Repeter punkt 3 og 4 helt til den første setningen er lik den andre.
---> Denne lubjwr har noen wgh som må forkwåp med «forækzryas»-kommandoen.
---> Denne linjen har noen ord som må forandres med «forandre»-kommandoen.
Vær oppmerksom på at ce sletter ordet og går inn i innsettingsmodus.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 3.4: FLERE FORANDRINGER VED BRUK AV c
** Forandringskommandoen blir brukt med de samme bevegelser som «slett». **
1. Forandringsoperatoren fungerer på samme måte som «slett». Formatet er:
c [nummer] bevegelse
2. Bevegelsene er de samme, som for eksempel w (ord) og $ (slutten av en
linje).
3. Gå til den første linjen nedenfor som er merket --->.
4. Flytt markøren til den første feilen.
5. Skriv c$ og skriv resten av linjen lik den andre og trykk <ESC>.
---> Slutten på denne linjen trenger litt hjelp for å gjøre den lik den neste.
---> Slutten på denne linjen trenger å bli rettet ved bruk av c$-kommandoen.
MERK: Du kan bruke slettetasten for å rette feil mens du skriver.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
OPPSUMMERING AV LEKSJON 3
1. For å legge tilbake tekst som nettopp er blitt slettet, trykk p . Dette
limer inn den slettede teksten ETTER markøren (hvis en linje ble slettet
vil den bli limt inn på linjen under markøren).
2. For å erstatte et tegn under markøren, trykk r og deretter tegnet som
du vil ha der.
3. Forandringsoperatoren lar deg forandre fra markøren til dit bevegelsen
tar deg. Det vil si, skriv ce for å forandre fra markøren til slutten
av ordet, c$ for å forandre til slutten av linjen.
4. Formatet for «forandre» er:
c [nummer] bevegelse
Nå kan du gå til neste leksjon.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 4.1: POSISJONERING AV MARKØREN OG FILSTATUS
** Trykk CTRL-G for å vise posisjonen i filen og filstatusen.
Trykk G for å gå til en spesifikk linje i filen. **
Merk: Les hele leksjonen før du utfører noen av punktene!
1. Hold nede Ctrl-tasten og trykk g . Vi kaller dette CTRL-G. En melding
vil komme til syne på bunnen av skjermen med filnavnet og posisjonen i
filen. Husk linjenummeret for bruk i steg 3.
Merk: Du kan se markørposisjonen i nederste høyre hjørne av skjermen. Dette
skjer når «ruler»-valget er satt (forklart i leksjon 6).
2. Trykk G for å gå til bunnen av filen.
Skriv gg for å gå til begynnelsen av filen.
3. Skriv inn linjenummeret du var på og deretter G . Dette vil føre deg
tilbake til linjen du var på da du først trykket CTRL-G.
4. Utfør steg 1 til 3 hvis du føler deg sikker på prosedyren.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 4.2: SØKEKOMMANDOEN
** Skriv / etterfulgt av en søkestreng som du vil lete etter. **
1. Trykk / når du er i normalmodusen. Legg merke til at skråstreken og
markøren kommer til syne på bunnen av skjermen i likhet med
«:»-kommandoene.
2. Skriv «feeeiil» og trykk <ENTER>. Dette er teksten du vil lete etter.
3. For å finne neste forekomst av søkestrengen, trykk n .
For å lete etter samme søketeksten i motsatt retning, trykk N .
4. For å lete etter en tekst bakover i filen, bruk ? istedenfor / .
5. For å gå tilbake til der du kom fra, trykk CTRL-O (Hold Ctrl nede mens
du trykker bokstaven o ). Repeter for å gå enda lengre tilbake. CTRL-I
går framover.
---> «feeeiil» er ikke måten å skrive «feil» på, feeeiil er helt feil.
Merk: Når søkingen når slutten av filen, vil den fortsette fra starten unntatt
hvis «wrapscan»-valget er resatt.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 4.3: FINN SAMSVARENDE PARENTESER
** Trykk % for å finne en samsvarende ), ] eller } . **
1. Plasser markøren på en (, [ eller { på linjen nedenfor merket --->.
2. Trykk % .
3. Markøren vil gå til den samsvarende parentesen eller hakeparentesen.
4. Trykk % for å flytte markøren til den andre samsvarende parentesen.
5. Flytt markøren til en annen (, ), [, ], { eller } og se hva % gjør.
---> Dette ( er en testlinje med (, [ ] og { } i den )).
Merk: Dette er veldig nyttig til feilsøking i programmer som har ubalansert
antall parenteser!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 4.4: ERSTATT-KOMMANDOEN
** Skriv :s/gammel/ny/g for å erstatte «gammel» med «ny». **
1. Flytt markøren til linjen nedenfor som er merket med --->.
2. Skriv :s/deen/den/ <ENTER> . Legg merke til at denne kommandoen bare
forandrer den første forekomsten av «deen» på linjen.
3. Skriv :s/deen/den/g . Når g-flagget legges til, betyr dette global
erstatning på linjen og erstatter alle forekomster av «deen» på linjen.
---> deen som kan kaste deen tyngste steinen lengst er deen beste
4. For å erstatte alle forekomster av en tekststreng mellom to linjer,
skriv :#,#s/gammel/ny/g der #,# er linjenumrene på de to linjene for
linjeområdet erstatningen skal gjøres.
Skriv :%s/gammel/ny/g for å erstatte tekst i hele filen.
Skriv :%s/gammel/ny/gc for å finne alle forekomster i hele filen, og
deretter spørre om teksten skal erstattes eller
ikke.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
OPPSUMMERING AV LEKSJON 4
1. Ctrl-G viser nåværende posisjon i filen og filstatusen.
G går til slutten av filen.
nummer G går til det linjenummeret.
gg går til den første linjen.
2. Skriv / etterfulgt av en søketekst for å lete FRAMOVER etter teksten.
Skriv ? etterfulgt av en søketekst for å lete BAKOVER etter teksten.
Etter et søk kan du trykke n for å finne neste forekomst i den samme
retningen eller N for å lete i motsatt retning.
CTRL-O tar deg tilbake til gamle posisjoner, CTRL-I til nyere posisjoner.
3. Skriv % når markøren står på en (, ), [, ], { eller } for å finne den
som samsvarer.
4. Erstatte «gammel» med første «ny» på en linje: :s/gammel/ny
Erstatte alle «gammel» med «ny» på en linje: :s/gammel/ny/g
Erstatte tekst mellom to linjenumre: :#,#s/gammel/ny/g
Erstatte alle forekomster i en fil: :%s/gammel/ny/g
For å godkjenne hver erstatning, legg til «c»: :%s/gammel/ny/gc
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 5.1: HVORDAN UTFØRE EN EKSTERN KOMMANDO
** Skriv :! etterfulgt av en ekstern kommando for å utføre denne. **
1. Skriv den velkjente kommandoen : for å plassere markøren på bunnen av
skjermen. Dette lar deg skrive en kommandolinjekommando.
2. Nå kan du skrive tegnet ! . Dette lar deg utføre en hvilken som helst
ekstern kommando.
3. Som et eksempel, skriv ls etter utropstegnet og trykk <ENTER>. Du vil
nå få en liste over filene i katalogen, akkurat som om du hadde kjørt
kommandoen direkte fra kommandolinjen i skallet. Eller bruk :!dir hvis
«ls» ikke virker.
MERK: Det er mulig å kjøre alle eksterne kommandoer på denne måten, også med
parametere.
MERK: Alle «:»-kommandoer må avsluttes med <ENTER>. Fra dette punktet er det
ikke alltid vi nevner det.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 5.2: MER OM LAGRING AV FILER
** For å lagre endringene gjort i en tekst, skriv :w FILNAVN. **
1. Skriv :!dir eller :!ls for å få en liste over filene i katalogen. Du
vet allerede at du må trykke <ENTER> etter dette.
2. Velg et filnavn på en fil som ikke finnes, som for eksempel TEST .
3. Skriv :w TEST (der TEST er filnavnet du velger).
4. Dette lagrer hele filen (denne innføringen) under navnet TEST . For å
sjekke dette, skriv :!dir eller :!ls igjen for å se innholdet av
katalogen.
Merk: Hvis du nå hadde avsluttet Vim og startet på nytt igjen med «vim TEST»,
ville filen vært en eksakt kopi av innføringen da du lagret den.
5. Fjern filen ved å skrive :!rm TEST hvis du er på et Unix-lignende
operativsystem, eller :!del TEST hvis du bruker MS-DOS.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 5.3: VELGE TEKST SOM SKAL LAGRES
** For å lagre en del av en fil, skriv v bevegelse :w FILNAVN **
1. Flytt markøren til denne linjen.
2. Trykk v og flytt markøren til det femte elementet nedenfor. Legg merke
til at teksten blir markert.
3. Trykk : (kolon). På bunnen av skjermen vil :'<,'> komme til syne.
4. Trykk w TEST , der TEST er et filnavn som ikke finnes enda. Kontroller
at du ser :'<,'>w TEST før du trykker Enter.
5. Vim vil skrive de valgte linjene til filen TEST. Bruk :!dir eller :!ls
for å se den. Ikke slett den enda! Vi vil bruke den i neste leksjon.
MERK: Ved å trykke v startes visuelt valg. Du kan flytte markøren rundt for
å gjøre det valgte området større eller mindre. Deretter kan du bruke en
operator for å gjøre noe med teksten. For eksempel sletter d teksten.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 5.4: HENTING OG SAMMENSLÅING AV FILER
** For å lese inn en annen fil inn i nåværende buffer, skriv :r FILNAVN **
1. Plasser markøren like over denne linjen.
MERK: Etter å ha utført steg 2 vil du se teksten fra leksjon 5.3. Gå deretter
NED for å se denne leksjonen igjen.
2. Hent TEST-filen ved å bruke kommandoen :r TEST der TEST er navnet på
filen du brukte. Filen du henter blir plassert nedenfor markørlinjen.
3. For å sjekke at filen ble hentet, gå tilbake og se at det er to kopier av
leksjon 5.3, originalen og denne versjonen.
MERK: Du kan også lese utdataene av en ekstern kommando. For eksempel, :r !ls
leser utdataene av ls-kommandoen og legger dem nedenfor markøren.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
OPPSUMMERING AV LEKSJON 5
1. :!kommando utfører en ekstern kommandio.
Noen nyttige eksempler er:
(MS-DOS) (Unix)
:!dir :!ls - List filene i katalogen.
:!del FILNAVN :!rm FILNAVN - Slett filen FILNAVN.
2. :w FILNAVN skriver den nåværende Vim-filen disken med navnet FILNAVN .
3. v bevegelse :w FILNAVN lagrer de visuelt valgte linjene til filen
FILNAVN.
4. :r FILNAVN henter filen FILNAVN og legger den inn nedenfor markøren.
5. :r !dir leser utdataene fra «dir»-kommandoen og legger dem nedenfor
markørposisjonen.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 6.1: «ÅPNE LINJE»-KOMMANDOEN
** Skriv o for å «åpne opp» for en ny linje etter markøren og gå til
innsettingsmodus **
1. Flytt markøren til linjen nedenfor merket --->.
2. Skriv o (liten o) for å åpne opp en linje NEDENFOR markøren og gå inn i
innsettingsmodus.
3. Skriv litt tekst og trykk <ESC> for å gå ut av innsettingsmodusen.
---> Etter at o er skrevet blir markøren plassert på den tomme linjen.
4. For å åpne en ny linje OVER markøren, trykk rett og slett en stor O
istedenfor en liten o . Prøv dette på linjen nedenfor.
---> Lag ny linje over denne ved å trykke O mens markøren er på denne linjen.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 6.2: «LEGG TIL»-KOMMANDOEN
** Skriv a for å legge til tekst ETTER markøren. **
1. Flytt markøren til starten av linjen merket ---> nedenfor.
2. Trykk e til markøren er på slutten av «li».
3. Trykk a (liten a) for å legge til tekst ETTER markøren.
4. Fullfør ordet sånn som på linjen nedenfor. Trykk <ESC> for å gå ut av
innsettingsmodusen.
5. Bruk e for å gå til det neste ufullstendige ordet og repeter steg 3 og
4.
---> Denne li lar deg øve på å leg til tek på en linje.
---> Denne linjen lar deg øve på å legge til tekst på en linje.
Merk: a, i og A går alle til den samme innsettingsmodusen, den eneste
forskjellen er hvor tegnene blir satt inn.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 6.3: EN ANNEN MÅTE Å ERSTATTE PÅ
** Skriv en stor R for å erstatte mer enn ett tegn. **
1. Flytt markøren til den første linjen nedenfor merket --->. Flytt markøren
til begynnelsen av den første «xxx»-en.
2. Trykk R og skriv inn tallet som står nedenfor på den andre linjen så
det erstatter xxx.
3. Trykk <ESC> for å gå ut av erstatningsmodusen. Legg merke til at resten
av linjen forblir uforandret.
4. Repeter stegene for å erstatte den gjenværende xxx.
---> Ved å legge 123 til xxx får vi xxx.
---> Ved å legge 123 til 456 får vi 579.
MERK: Erstatningsmodus er lik insettingsmodus, men hvert tegn som skrives
erstatter et eksisterende tegn.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 6.4: KOPIERE OG LIME INN TEKST
** Bruk y-operatoren for å kopiere tekst og p for å lime den inn **
1. Gå til linjen merket ---> nedenfor og plasser markøren etter «a)».
2. Gå inn i visuell modus med v og flytt markøren til like før «første».
3. Trykk y for å kopiere (engelsk: «yank») den uthevede teksten.
4. Flytt markøren til slutten av den neste linjen: j$
5. Trykk p for å lime inn teksten. Trykk deretter: a andre <ESC> .
6. Bruk visuell modus for å velge « valget.», kopier det med y , gå til
slutten av den neste linjen med j$ og legg inn teksten der med p .
---> a) Dette er det første valget.
b)
Merk: Du kan også bruke y som en operator; yw kopierer ett ord.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 6.5: SETT VALG
** Sett et valg så søk eller erstatning ignorerer store/små bokstaver. **
1. Let etter «ignore» ved å skrive: /ignore <ENTER>
Repeter flere ganger ved å trykke n .
2. Sett «ic»-valget (Ignore Case) ved å skrive: :set ic
3. Søk etter «ignore» igjen ved å trykke n .
Legg merke til at både «Ignore» og «IGNORE» blir funnet.
4. Sett «hlsearch»- og «incsearch»-valgene: :set hls is
5. Skriv søkekommandoen igjen og se hva som skjer: /ignore <ENTER>
6. For å slå av ignorering av store/små bokstaver, skriv: :set noic
Merk: For å fjerne uthevingen av treff, skriv: :nohlsearch
Merk: Hvis du vil ignorere store/små bokstaver for kun en søkekommando, bruk
\c i uttrykket: /ignore\c <ENTER>
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
OPPSUMMERING AV LEKSJON 6
1. Trykk o for å legge til en linje NEDENFOR markøren og gå inn i
innsettingsmodus.
Trykk O for å åpne en linje OVER markøren.
2. Skriv a for å sette inn tekst ETTER markøren.
Skriv A for å sette inn tekst etter slutten av linjen.
3. Kommandoen e går til slutten av et ord.
4. Operatoren y («yank») kopierer tekst, p («paste») limer den inn.
5. Ved å trykke R går du inn i erstatningsmodus helt til <ESC> trykkes.
6. Skriv «:set xxx» for å sette valget «xxx». Noen valg er:
«ic» «ignorecase» ignorer store/små bokstaver under søk
«is» «incsearch» vis delvise treff for en søketekst
«hls» «hlsearch» uthev alle søketreff
7. Legg til «no» foran valget for å slå det av: :set noic
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 7.1: FÅ HJELP
** Bruk det innebygde hjelpesystemet. **
Vim har et omfattende innebygget hjelpesystem. For å starte det, prøv en av
disse måtene:
- Trykk Hjelp-tasten (hvis du har en)
- Trykk F1-tasten (hvis du har en)
- Skriv :help <ENTER>
Les teksten i hjelpevinduet for å finne ut hvordan hjelpen virker.
Skriv CTRL-W CTRL-W for å hoppe fra et vindu til et annet
Skriv :q <ENTER> for å lukke hjelpevinduet.
Du kan få hjelp for omtrent alle temaer om Vim ved å skrive et parameter til
«:help»-kommandoen. Prøv disse (ikke glem å trykke <ENTER>):
:help w
:help c_CTRL-D
:help insert-index
:help user-manual
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 7.2: LAG ET OPPSTARTSSKRIPT
** Slå på funksjoner i Vim **
Vim har mange flere funksjoner enn Vi, men flesteparten av dem er slått av
som standard. For å begynne å bruke flere funksjoner må du lage en
«vimrc»-fil.
1. Start redigeringen av «vimrc»-filen. Dette avhenger av systemet ditt:
:e ~/.vimrc for Unix
:e $VIM/_vimrc for MS Windows
2. Les inn eksempelfilen for «vimrc»:
:r $VIMRUNTIME/vimrc_example.vim
3. Lagre filen med:
:w
Neste gang du starter Vim vil den bruke syntaks-utheving. Du kan legge til
alle dine foretrukne oppsett i denne «vimrc»-filen.
For mer informasjon, skriv :help vimrc-intro
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Leksjon 7.3: FULLFØRING
** Kommandolinjefullføring med CTRL-D og <TAB> **
1. Vær sikker på at Vim ikke er i Vi-kompatibel modus: :set nocp
2. Se hvilke filer som er i katalogen: :!ls eller :!dir
3. Skriv starten på en kommando: :e
4. Trykk CTRL-D og Vim vil vise en liste over kommandoer som starter med
«e».
5. Trykk <TAB> og Vim vil fullføre kommandonavnet til «:edit».
6. Legg til et mellomrom og starten på et eksisterende filnavn: :edit FIL
7. Trykk <TAB>. Vim vil fullføre navnet (hvis det er unikt).
MERK: Fullføring fungerer for mange kommandoer. Prøv ved å trykke CTRL-D og
<TAB>. Det er spesielt nyttig for bruk sammen med :help .
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
OPPSUMMERING AV LEKSJON 7
1. Skriv :help eller trykk <F1> eller <Help> for å åpne et hjelpevindu.
2. Skriv :help kommando for å få hjelp om kommando .
3. Trykk CTRL-W CTRL-W for å hoppe til et annet vindu.
4. Trykk :q for å lukke hjelpevinduet.
5. Opprett et vimrc-oppstartsskript for å lagre favorittvalgene dine.
6. Når du skriver en «:»-kommando, trykk CTRL-D for å se mulige
fullføringer. Trykk <TAB> for å bruke en fullføring.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Her slutter innføringen i Vim. Den var ment som en rask oversikt over
editoren, akkurat nok til å la deg sette i gang med enkel bruk. Den er på
langt nær komplett, da Vim har mange flere kommandoer. Les bruksanvisningen
ved å skrive :help user-manual .
For videre lesing og studier, kan denne boken anbefales:
«Vim - Vi Improved» av Steve Oualline
Utgiver: New Riders
Den første boken som er fullt og helt dedisert til Vim. Spesielt nyttig for
nybegynnere. Inneholder mange eksempler og illustrasjoner.
Se http://iccf-holland.org/click5.html
Denne boken er eldre og handler mer om Vi enn Vim, men anbefales også:
«Learning the Vi Editor» av Linda Lamb
Utgiver: O'Reilly & Associates Inc.
Det er en god bok for å få vite omtrent hva som helst om Vi.
Den sjette utgaven inneholder også informasjon om Vim.
Denne innføringen er skrevet av Michael C. Pierce og Robert K. Ware,
Colorado School of Mines med idéer av Charles Smith, Colorado State
University. E-mail: bware@mines.colorado.edu .
Modifisert for Vim av Bram Moolenaar.
Oversatt av Øyvind A. Holm. E-mail: vimtutor _AT_ sunbase.org
Id: tutor.no 406 2007-03-18 22:48:36Z sunny
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
vim: set ts=8 :

154
samples/Uno/PlayerPads.uno Normal file
View File

@@ -0,0 +1,154 @@
using Uno;
using Uno.Collections;
using Uno.Graphics;
using Uno.Scenes;
using Uno.Designer;
using Uno.Content;
using Uno.Content.Models;
using Uno.UI;
namespace PONG2D
{
public class PlayerPads : Node
{
Image _player1Image;
Image _player2Image;
[Inline]
public Image Player1
{
get { return _player1Image; }
set
{
if (_player1Image != value)
{
_player1Image = value;
}
}
}
[Inline]
public Image Player2
{
get { return _player2Image; }
set
{
if (_player2Image != value)
{
_player2Image = value;
}
}
}
[Hide]
public float2 Player1Pos
{
get { return (Player1.ActualPosition); }
set
{
if (Player1 != null)
Player1.Position = value;
}
}
[Hide]
public float2 Player2Pos
{
get { return (Player2.ActualPosition); }
set
{
if (Player2 != null)
Player2.Position = value;
}
}
public Rect Player1Rect
{
get { return new Rect(Player1Pos, float2(Player1.Width, Player2.Height)); }
set
{
Player1Pos = value.Position;
if (Player1 != null)
{
Player1.Width = value.Size.X;
Player1.Height = value.Size.Y;
}
}
}
public Rect Player2Rect
{
get { return new Rect(Player2Pos, float2(Player2.Width, Player2.Height)); }
set
{
Player2Pos = value.Position;
if (Player2 != null)
{
Player2.Width = value.Size.X;
Player2.Height = value.Size.Y;
}
}
}
public Ball Ball
{
get;
set;
}
public float PadVelocity { get; set; }
public PlayerPads()
{
}
void UpdatePositions()
{
}
protected override void OnUpdate()
{
base.OnUpdate();
if (Input.IsKeyDown(Uno.Platform.Key.W))
{
Player1Pos = float2(0, Player1Pos.Y - PadVelocity);
}
if (Input.IsKeyDown(Uno.Platform.Key.S))
{
Player1Pos = float2(0, Player1Pos.Y + PadVelocity);
}
if (Input.IsKeyDown(Uno.Platform.Key.Up))
{
Player2Pos = float2(0, Player2Pos.Y - PadVelocity);
}
if (Input.IsKeyDown(Uno.Platform.Key.Down))
{
Player2Pos = float2(0, Player2Pos.Y + PadVelocity);
}
if (Ball != null)
{
if (Ball.BallRectangle.Intersects(Player1Rect) ||
Ball.BallRectangle.Intersects(Player2Rect))
{
Ball.BallVelocity = float2(Ball.BallVelocity.X * -1f, Ball.BallVelocity.Y);
}
}
}
}
}

139
samples/Uno/Pong.uno Normal file
View File

@@ -0,0 +1,139 @@
using Uno;
using Uno.Collections;
using Uno.Graphics;
using Uno.Scenes;
using Uno.Content;
using Uno.Content.Models;
namespace PONG2D
{
public class Pong : Node
{
float2 _player1Pos;
float2 _player2Pos;
float2 ballPosition;
float2 ballVelocity;
float2 rectangleSize;
Rect player1Rect;
Rect player2Rect;
Rect ballRect;
float2 resolution = Context.VirtualResolution;
Random random = new Random(1);
float2 Player1Pos
{
get { return _player1Pos; }
set
{
_player1Pos = Math.Clamp(value, float2(0, 0), resolution - rectangleSize);
}
}
float2 Player2Pos
{
get { return _player2Pos; }
set
{
_player2Pos = Math.Clamp(value, float2(0, 0), resolution - rectangleSize);
}
}
public Pong()
{
Uno.Scenes.Input.AddGlobalListener(this);
}
protected override void OnInitialize()
{
base.OnInitialize();
UpdateValues();
}
void UpdateValues()
{
rectangleSize = float2(resolution.X / 80f, resolution.Y / 5f);
_player1Pos = float2(0f);
_player2Pos = float2(Context.VirtualResolution.X - rectangleSize.X, 0f);
player1Rect = new Rect(_player1Pos, rectangleSize);
player2Rect = new Rect(_player2Pos, rectangleSize);
ballPosition = float2(resolution.X * 0.5f - 10f, resolution.Y * 0.5f - 10f);
ballRect = new Rect(ballPosition, float2(20f));
SpwanBall();
}
void SpwanBall()
{
ballRect.Position = float2(resolution.X * 0.5f - 10f, resolution.Y * 0.5f - 10f);
ballVelocity = float2(5f, 10f) * 0.5f;
}
void OnWindowResize(object sender, EventArgs args)
{
//UpdateValues();
}
protected override void OnUpdate()
{
base.OnUpdate();
var padVelocity = resolution.Y * (float)Application.Current.FrameInterval * 4f;
if (Input.IsKeyDown(Uno.Platform.Key.Up))
{
Player1Pos = float2(Player1Pos.X, Player1Pos.Y - padVelocity);
}
if (Input.IsKeyDown(Uno.Platform.Key.Down))
{
Player1Pos = float2(Player1Pos.X, Player1Pos.Y + padVelocity);
}
if (Input.IsKeyDown(Uno.Platform.Key.W))
{
Player2Pos = float2(Player2Pos.X, Player2Pos.Y - padVelocity);
}
if (Input.IsKeyDown(Uno.Platform.Key.S))
{
Player2Pos = float2(Player2Pos.X, Player2Pos.Y + padVelocity);
}
player1Rect.Position = Player1Pos;
player2Rect.Position = Player2Pos;
if (ballRect.Position.X > resolution.X || ballRect.Position.X < 0)
{
SpwanBall();
}
if (ballRect.Position.Y > resolution.Y ||
ballRect.Position.Y < 0)
{
ballVelocity.Y *= -1f;
}
if (ballRect.Intersects(player1Rect) ||
ballRect.Intersects(player2Rect))
{
ballVelocity.X *= -1f;
}
ballRect.Position += ballVelocity;
}
protected override void OnDraw()
{
Uno.Drawing.RoundedRectangle.Draw(player1Rect.Position, player1Rect.Size, float4(1f), 0);
Uno.Drawing.RoundedRectangle.Draw(player2Rect.Position, player2Rect.Size, float4(1f), 0);
Uno.Drawing.RoundedRectangle.Draw(ballRect.Position, ballRect.Size, float4(1f), 0f);
}
}
}

136
samples/Uno/TowerBlock.uno Normal file
View File

@@ -0,0 +1,136 @@
using Uno;
using Uno.Collections;
using Uno.Graphics;
using Uno.Scenes;
using Uno.Content;
using Uno.Content.Models;
using Uno.Physics.Box2D;
using TowerBuilder.Box2DMath;
namespace TowerBuilder
{
public class TowerBlock : TestBed
{
Body floorBody, deleteBody, mouseBody;
private List<Body> bodies = new List<Body>();
private List<Body> bodiesToDelete = new List<Body>();
private ContactListener contactListener;
protected override void OnInitializeTestBed()
{
World.Gravity = float2(0, -25.0f);
World.ContactListener = contactListener = new ContactListener(this);
bodies.Clear();
bodiesToDelete.Clear();
CreateFloor();
CreateDeleteBody();
CreateBox2();
}
void CreateFloor()
{
var bodyDef = new BodyDef();
bodyDef.position = float2(0, -40.0f);
floorBody = World.CreateBody(bodyDef);
var shape = new PolygonShape();
shape.SetAsBox(30.0f, 10.0f);
var fixtureDef = new FixtureDef();
fixtureDef.shape = shape;
fixtureDef.density = 1.0f;
floorBody.CreateFixture(fixtureDef);
}
void CreateDeleteBody()
{
var bodyDef = new BodyDef();
bodyDef.position = float2(0, -44.0f);
deleteBody = World.CreateBody(bodyDef);
var shape = new PolygonShape();
shape.SetAsBox(200.0f, 10.0f);
var fixtureDef = new FixtureDef();
fixtureDef.shape = shape;
fixtureDef.density = 1.0f;
deleteBody.CreateFixture(fixtureDef);
}
Random random = new Random((int) (Uno.Diagnostics.Clock.GetSeconds() * 1000000));
void CreateBox2()
{
var bodyDef = new BodyDef();
bodyDef.type = BodyType.Dynamic;
bodyDef.position = float2(random.NextFloat(-25f, 25f), 50.0f);
bodyDef.angularVelocity = random.NextFloat() * 40 - 20;
bodyDef.userData = float3(0, 0, 0);
var body = World.CreateBody(bodyDef);
var shape = new PolygonShape();
shape.SetAsBox(0.75f, 0.75f);
var fixtureDef = new FixtureDef();
fixtureDef.shape = shape;
fixtureDef.density = 5.0f;
//fixtureDef.friction = 0.75f;
body.CreateFixture(fixtureDef);
bodies.Add(body);
}
private int c = 0;
protected override void OnFixedUpdate()
{
base.OnFixedUpdate();
debug_log bodies.Count;
if(c++ % 8 == 0 && bodies.Count < 20) CreateBox2();
foreach(var body in bodiesToDelete)
{
World.DestroyBody(body);
bodies.Remove(body);
}
bodiesToDelete.Clear();
}
public class ContactListener : IContactListener
{
private TowerBlock b;
public ContactListener(TowerBlock b)
{
this.b = b;
}
public void BeginContact(Contact contact)
{
if(contact.GetFixtureA().GetBody() == b.deleteBody)
{
b.bodiesToDelete.Add(contact.GetFixtureB().GetBody());
}
else if(contact.GetFixtureB().GetBody() == b.deleteBody)
{
b.bodiesToDelete.Add(contact.GetFixtureA().GetBody());
}
}
public void EndContact(Contact contact) {}
public void PreSolve(Contact contact, ref Manifold manifold) {}
public void PostSolve(Contact contact, ref ContactImpulse impulse) {}
}
}
}

57
samples/XML/MainView.ux Normal file
View File

@@ -0,0 +1,57 @@
<App Theme="Basic">
<DockPanel>
<TopFrameBackground Dock="Top" />
<Panel>
<Rectangle ux:Name="newLayoutMaster" Width="50" Height="50" Color="#8889" Alignment="TopLeft" Margin="20,50"/>
<StackPanel Alignment="Top">
<TextInput PlaceholderText="Click me to show the keyboard" Alignment="Center">
<WhileKeyboardVisible>
<Move Target="rect3" RelativeTo="Keyboard" Y="-1" Duration="0.5" />
</WhileKeyboardVisible>
</TextInput>
<Button Text="Click me" Alignment="Center">
<WhilePressed>
<Move Target="rect1" RelativeTo="Size" Y="-1" Duration="0.5" />
<Move Target="rect2" RelativeTo="ParentSize" Y="-1" Duration="0.5" />
<Move Target="rect5" RelativeTo="Size" RelativeNode="relativeNode" Y="-1" Duration="0.5" />
</WhilePressed>
</Button>
<Switch>
<WhileTrue>
<Change rect4.LayoutMaster="newLayoutMaster" />
</WhileTrue>
</Switch>
</StackPanel>
<Rectangle ux:Name="relativeNode" Height="400" Width="50" Color="#bbf" Alignment="BottomRight">
<VerticalText Alignment="Center" Width="200">relativeNode</VerticalText>
</Rectangle>
<Text ux:Class="VerticalText" TransformOrigin="Center" Alignment="Bottom" TextColor="#000">
<Rotation Degrees="-90" />
</Text>
<Grid ColumnCount="5" Rows="3*,1*" Color="#ddd" Width="80%" Height="100%" Alignment="BottomLeft">
<VerticalText Width="200">RelativeTo="Size"</VerticalText>
<VerticalText Width="200">RelativeTo="ParentSize"</VerticalText>
<VerticalText Width="200">RelativeTo="Keyboard"</VerticalText>
<VerticalText Width="200">RelativeTo="PositionChange"</VerticalText>
<VerticalText Width="200">RelativeNode="relativeNode"</VerticalText>
<Rectangle ux:Name="rect1" Width="50" Height="50" Color="#f00" Alignment="Bottom"/>
<Rectangle ux:Name="rect2" Width="50" Height="50" Color="#0f0" Alignment="Bottom"/>
<Rectangle ux:Name="rect3" Width="50" Height="50" Color="#00f" Alignment="Bottom"/>
<Panel Alignment="Bottom" Width="50" Height="50">
<Rectangle ux:Name="rect4" Width="50" Height="50" Color="#0ff" LayoutMaster="layoutMaster">
<LayoutAnimation>
<Move RelativeTo="PositionChange" X="1" Y="1" Duration="0.5" />
</LayoutAnimation>
</Rectangle>
<Rectangle ux:Name="layoutMaster" Width="50" Height="50"/>
</Panel>
<Rectangle ux:Name="rect5" Width="50" Height="50" Color="#f0f" Alignment="Bottom"/>
</Grid>
</Panel>
</DockPanel>
</App>

11
samples/XML/MyApp.ux Normal file
View File

@@ -0,0 +1,11 @@
<App Theme="Basic">
<EdgeNavigator HitTestMode="LocalBoundsAndChildren">
<Panel Width="150" EdgeNavigation.Edge="Left" Background="#f63" />
<Panel>
<Text Alignment="Center">
This is an example of EdgeNavigator!
</Text>
</Panel>
</EdgeNavigator>
</App>

View File

@@ -0,0 +1,29 @@
%YAML 1.2
---
# http://www.sublimetext.com/docs/3/syntax.html
name: Hex Inspect
file_extensions: []
hidden: true
scope: source.inspect
contexts:
main:
- match: '([\w\-]+)\s*(:)\s*'
captures:
1: support.function.key.inspect
2: support.function.punctuation.inspect
push:
- meta_scope: item.inspect
- match: '([\d\-\w]+)'
captures:
1: data.inspect
pop: true
- match: '^(\s*[\w\-\s]+)\s*(:)\s*'
captures:
1: keyword.title.inspect
2: keyword.title-punctuation.inspect
push:
- meta_scope: item.inspect
- match: $
pop: true
- match: '[\w\s]+'
scope: title-info.inspect

View File

@@ -0,0 +1,55 @@
module sfc-lisp-impl {
yang-version 1;
namespace "urn:opendaylight:params:xml:ns:yang:controller:config:sfc-lisp:impl";
prefix "sfc-lisp-impl";
import config { prefix config; revision-date 2013-04-05; }
import rpc-context { prefix rpcx; revision-date 2013-06-17; }
import opendaylight-md-sal-binding { prefix mdsal; revision-date 2013-10-28; }
description
"This module contains the base YANG definitions for
sfc-lisp implementation.";
revision "2015-04-27" {
description
"Initial revision.";
}
// This is the definition of the service implementation as a module identity
identity sfc-lisp-impl {
base config:module-type;
// Specifies the prefix for generated java classes.
config:java-name-prefix SfcLisp;
}
// Augments the 'configuration' choice node under modules/module.
augment "/config:modules/config:module/config:configuration" {
case sfc-lisp-impl {
when "/config:modules/config:module/config:type = 'sfc-lisp-impl'";
//wires in the data-broker service
container data-broker {
uses config:service-ref {
refine type {
mandatory false;
config:required-identity mdsal:binding-async-data-broker;
}
}
}
container rpc-registry {
uses config:service-ref {
refine type {
mandatory true;
config:required-identity mdsal:binding-rpc-registry;
}
}
}
}
}
}

View File

@@ -152,7 +152,7 @@ class TestBlob < Minitest::Test
end
def test_csv
assert fixture_blob("Data/cars.csv").csv?
assert sample_blob("CSV/cars.csv").csv?
end
def test_pdf
@@ -522,6 +522,9 @@ class TestBlob < Minitest::Test
assert sample_blob("myapp/My Template.xctemplate/___FILEBASENAME___.h").vendored?
assert sample_blob("myapp/My Images.xcassets/some/stuff.imageset/Contents.json").vendored?
assert !sample_blob("myapp/MyData.json").vendored?
# Jenkins
assert sample_blob("Jenkinsfile").vendored?
end
def test_documentation

View File

@@ -69,5 +69,11 @@ class TestGenerated < Minitest::Test
# Specflow
generated_fixture_without_loading_data("Features/BindingCulture.feature.cs")
# JFlex
generated_sample_loading_data("Java/JFlexLexer.java")
# GrammarKit
generated_sample_loading_data("Java/GrammarKit.java")
end
end

View File

@@ -13,7 +13,8 @@ class TestHeuristcs < Minitest::Test
end
def all_fixtures(language_name, file="*")
Dir.glob("#{samples_path}/#{language_name}/#{file}")
Dir.glob("#{samples_path}/#{language_name}/#{file}") -
["#{samples_path}/#{language_name}/filenames"]
end
def test_no_match

View File

@@ -0,0 +1,2 @@
.DS_Store

View File

@@ -0,0 +1,6 @@
<snippet>
<content><![CDATA[Book $1 - ${2:Title}
]]></content>
<tabTrigger>book</tabTrigger>
<scope>source.Inform7</scope>
</snippet>

View File

@@ -0,0 +1,6 @@
<snippet>
<content><![CDATA[Chapter $1 - ${2:Title}
]]></content>
<tabTrigger>chapter</tabTrigger>
<scope>source.Inform7</scope>
</snippet>

View File

@@ -0,0 +1,7 @@
<snippet>
<content><![CDATA[
${1:DoorName} is a door. $1 is ${2:Direction} from ${3:Room}.
]]></content>
<tabTrigger>door</tabTrigger>
<scope>source.Inform7</scope>
</snippet>

View File

@@ -0,0 +1,34 @@
{ "name": "Inform7",
"scopeName": "source.Inform7",
"fileTypes": ["i7x"],
"patterns": [
{ "name": "keyword.control.Inform7",
"match": "\\b(Include|Release)\\b"
},
{ "name" : "comment.block.Inform7",
"begin" : "\\[",
"end" : "\\]",
"comment" : "All comments in Inform7 are delimited this way."
},
{ "name" : "string.quoted.double.Inform7",
"begin" : "\"",
"end" : "\"",
"patterns": [
{ "name" : "keyword.operator.Inform7",
"begin" : "\\[",
"end" : "\\]",
"comment" : "For logic inside of strings."
}
]
},
{ "name" : "storage.type.Inform7",
"match" : "(Volume|Book|Chapter|Part|Section|Table)\\s+\\d?\\s+-?\\s+((?:\\w|\\s|-)*)",
"comment": "Matches headings for major sections in Inform7"
},
{ "name": "constant.numeric.Inform7",
"match": "([0-9])+",
"comment":"Gotta call out the numbers!"
}
],
"uuid": "0c4cbdee-beb7-4ea6-af56-27246d479373"
}

View File

@@ -0,0 +1,74 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>fileTypes</key>
<array>
<string>i7x</string>
<string>inform</string>
<string>ni</string>
</array>
<key>name</key>
<string>Inform7</string>
<key>patterns</key>
<array>
<dict>
<key>match</key>
<string>\b(Include|Release)\b</string>
<key>name</key>
<string>keyword.control.Inform7</string>
</dict>
<dict>
<key>begin</key>
<string>\[</string>
<key>comment</key>
<string>All comments in Inform7 are delimited this way.</string>
<key>end</key>
<string>\]</string>
<key>name</key>
<string>comment.block.Inform7</string>
</dict>
<dict>
<key>begin</key>
<string>"</string>
<key>end</key>
<string>"</string>
<key>name</key>
<string>string.quoted.double.Inform7</string>
<key>patterns</key>
<array>
<dict>
<key>begin</key>
<string>\[</string>
<key>comment</key>
<string>For logic inside of strings.</string>
<key>end</key>
<string>\]</string>
<key>name</key>
<string>keyword.operator.Inform7</string>
</dict>
</array>
</dict>
<dict>
<key>comment</key>
<string>Matches headings for major sections in Inform7</string>
<key>match</key>
<string>(Volume|Book|Chapter|Part|Section|Table)\s+\d?\s+-?\s+((?:\w|\s|-)*)</string>
<key>name</key>
<string>storage.type.Inform7</string>
</dict>
<dict>
<key>comment</key>
<string>Gotta call out the numbers!</string>
<key>match</key>
<string>([0-9])+</string>
<key>name</key>
<string>constant.numeric.Inform7</string>
</dict>
</array>
<key>scopeName</key>
<string>source.Inform7</string>
<key>uuid</key>
<string>0c4cbdee-beb7-4ea6-af56-27246d479373</string>
</dict>
</plist>

View File

@@ -0,0 +1,8 @@
<snippet>
<content><![CDATA[
$1 is a portable thing in ${2:Room} ${3:ShortDescription}
The description of $1 is ${4:Description}
]]></content>
<tabTrigger>object</tabTrigger>
<scope>source.Inform7</scope>
</snippet>

View File

@@ -0,0 +1,6 @@
<snippet>
<content><![CDATA[Part $1 - ${2:Title}
]]></content>
<tabTrigger>part</tabTrigger>
<scope>source.Inform7</scope>
</snippet>

View File

@@ -0,0 +1,7 @@
<snippet>
<content><![CDATA[
${1:RoomName} is a room in ${2:Region}. "${3:Description}"
]]></content>
<tabTrigger>room</tabTrigger>
<scope>source.Inform7</scope>
</snippet>

View File

@@ -0,0 +1,11 @@
<snippet>
<content><![CDATA[
${1:SceneName} is a Scene.
$1 begins when $2 .
$1 ends when $3 .
When $1 begins: $4 .
When $1 ends: $5 .
]]></content>
<tabTrigger>scene</tabTrigger>
<scope>source.Inform7</scope>
</snippet>

View File

@@ -0,0 +1,6 @@
<snippet>
<content><![CDATA[Section $1 - ${2:Title}
]]></content>
<tabTrigger>section</tabTrigger>
<scope>source.Inform7</scope>
</snippet>

View File

@@ -0,0 +1,6 @@
<snippet>
<content><![CDATA[Volume $1 - ${2:Title}
]]></content>
<tabTrigger>volume</tabTrigger>
<scope>source.Inform7</scope>
</snippet>

View File

@@ -0,0 +1,21 @@
The MIT License (MIT)
Copyright (c) 2014 Nate Dickson
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View File

@@ -0,0 +1,8 @@
#Inform7 Package for Sublime Text 2
This package has a lot of little files that make Inform7 easier to edit in Sublime Text 2. that's why it's called what it is, you see.
##Usage
Grab the zip file, unzip it, and put it in your ```Packages``` Directory.
That's pretty much it. Open an ```i7x``` file in Sublime Text 2 and it'll be all highlighted and there's a bunch of snippets you can use and all that.
##Want to submit a pull request for this readme file?
Please, please do.

Some files were not shown because too many files have changed in this diff Show More