mirror of
https://github.com/KevinMidboe/linguist.git
synced 2025-10-29 17:50:22 +00:00
Compare commits
130 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1efd9b384d | ||
|
|
c1e71dc215 | ||
|
|
d2c7d27d13 | ||
|
|
1efd4c83f9 | ||
|
|
0f7677423f | ||
|
|
2a0b0e9f93 | ||
|
|
faec60188f | ||
|
|
709a688858 | ||
|
|
2448ff8314 | ||
|
|
fb727ce731 | ||
|
|
6af499e352 | ||
|
|
66ec33cf8e | ||
|
|
f2694f3a74 | ||
|
|
d069d0e444 | ||
|
|
56ee61b17c | ||
|
|
b945726017 | ||
|
|
6f8a7d1070 | ||
|
|
b032886c21 | ||
|
|
988739d566 | ||
|
|
8cd80801e8 | ||
|
|
c3b7a1a6fb | ||
|
|
9d0eff75ad | ||
|
|
3ccb548b6d | ||
|
|
eeedd53f32 | ||
|
|
11a3b5b73c | ||
|
|
eacc48e8c7 | ||
|
|
5b72b4d353 | ||
|
|
3f940ce8b8 | ||
|
|
b2e3ea2334 | ||
|
|
4637da8c32 | ||
|
|
6b88c5ba86 | ||
|
|
5fdb596214 | ||
|
|
c989b02285 | ||
|
|
c8301dc20b | ||
|
|
ca4ea03828 | ||
|
|
ae27c71d5a | ||
|
|
3d1555e278 | ||
|
|
54fab9eb4e | ||
|
|
8fea8a0b47 | ||
|
|
f14ae8e51b | ||
|
|
6b60e5e786 | ||
|
|
40413dfcc7 | ||
|
|
07f5ad1daa | ||
|
|
57f5a3e780 | ||
|
|
3be007526c | ||
|
|
9bfbd0550c | ||
|
|
0301a5dcdf | ||
|
|
db994a1197 | ||
|
|
855c13ea2a | ||
|
|
bfa7eced44 | ||
|
|
b1d103b1f3 | ||
|
|
fc816d3429 | ||
|
|
04a4e8c8e6 | ||
|
|
ab69fd01ac | ||
|
|
cc6106f31b | ||
|
|
ead85379ed | ||
|
|
f8d6be55ee | ||
|
|
a241d75043 | ||
|
|
864a6c0a20 | ||
|
|
1c20c54191 | ||
|
|
4d722d1fd1 | ||
|
|
b67254e986 | ||
|
|
041cf9c94e | ||
|
|
b08c5a8421 | ||
|
|
125eaa4cc3 | ||
|
|
6b001cf861 | ||
|
|
5c4129f85b | ||
|
|
41713d7719 | ||
|
|
17a9463588 | ||
|
|
fb9f271720 | ||
|
|
8de50edb41 | ||
|
|
ab33fccddd | ||
|
|
bd95ac0beb | ||
|
|
7b3efb185f | ||
|
|
a0065febe2 | ||
|
|
9374784651 | ||
|
|
aa6af3deed | ||
|
|
a19e501b44 | ||
|
|
889a395340 | ||
|
|
eb8eb28ca7 | ||
|
|
697b3351e6 | ||
|
|
9fd80bfd67 | ||
|
|
7b58b1ea59 | ||
|
|
c454396c26 | ||
|
|
c46900396a | ||
|
|
b235ed1223 | ||
|
|
16d9612603 | ||
|
|
721e5b4656 | ||
|
|
9961f8bc1c | ||
|
|
c066867d59 | ||
|
|
21093165e1 | ||
|
|
df88de14e3 | ||
|
|
94de431aa5 | ||
|
|
502557a97f | ||
|
|
52938f6dbf | ||
|
|
d87fad649c | ||
|
|
d8666e5309 | ||
|
|
9d11128362 | ||
|
|
ee17ab3e26 | ||
|
|
06af36dac2 | ||
|
|
51d6d741e5 | ||
|
|
b593a8ae67 | ||
|
|
7b30240a7f | ||
|
|
71f124faa5 | ||
|
|
15232fc072 | ||
|
|
0a7aab947c | ||
|
|
5906fa81bb | ||
|
|
4d2b38497d | ||
|
|
fc5ae1cfbc | ||
|
|
7e76d1cc6b | ||
|
|
cf834e8a21 | ||
|
|
ee61466042 | ||
|
|
35884d482c | ||
|
|
802de8112c | ||
|
|
9a76cfc85f | ||
|
|
dc41dd888d | ||
|
|
827ad80311 | ||
|
|
9e3d8ac4e9 | ||
|
|
1b327e29ba | ||
|
|
26a35ea43d | ||
|
|
81ebef2e29 | ||
|
|
1068cfb4b5 | ||
|
|
73b1737dc7 | ||
|
|
1d86f40fcd | ||
|
|
59fb481138 | ||
|
|
16e22b3b77 | ||
|
|
aa701c6766 | ||
|
|
924fddf698 | ||
|
|
23e55e92ca | ||
|
|
0cfdbfb91c |
21
.gitmodules
vendored
21
.gitmodules
vendored
@@ -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
|
||||
@@ -676,7 +673,7 @@
|
||||
url = https://github.com/CausalityLtd/sublime-pony
|
||||
[submodule "vendor/grammars/X10"]
|
||||
path = vendor/grammars/X10
|
||||
url = git@github.com:x10-lang/x10-highlighting.git
|
||||
url = https://github.com/x10-lang/x10-highlighting
|
||||
[submodule "vendor/grammars/language-babel"]
|
||||
path = vendor/grammars/language-babel
|
||||
url = https://github.com/gandm/language-babel
|
||||
@@ -691,7 +688,7 @@
|
||||
url = https://github.com/freemarker/FreeMarker.tmbundle
|
||||
[submodule "vendor/grammars/MagicPython"]
|
||||
path = vendor/grammars/MagicPython
|
||||
url = git@github.com:MagicStack/MagicPython.git
|
||||
url = https://github.com/MagicStack/MagicPython
|
||||
[submodule "vendor/grammars/language-click"]
|
||||
path = vendor/grammars/language-click
|
||||
url = https://github.com/stenverbois/language-click.git
|
||||
@@ -706,4 +703,16 @@
|
||||
url = https://github.com/erkyrath/language-inform7
|
||||
[submodule "vendor/grammars/atom-language-stan"]
|
||||
path = vendor/grammars/atom-language-stan
|
||||
url = git@github.com:jrnold/atom-language-stan.git
|
||||
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
|
||||
|
||||
1
Gemfile
1
Gemfile
@@ -1,4 +1,3 @@
|
||||
source 'https://rubygems.org'
|
||||
gemspec :name => "github-linguist"
|
||||
gemspec :name => "github-linguist-grammars"
|
||||
gem 'byebug' if RUBY_VERSION >= '2.0'
|
||||
|
||||
10
README.md
10
README.md
@@ -59,6 +59,9 @@ Alternatively, you can use Vim or Emacs style modelines to set the language for
|
||||
|
||||
##### Vim
|
||||
```
|
||||
# Some examples of various styles:
|
||||
vim: syntax=java
|
||||
vim: set syntax=ruby:
|
||||
vim: set filetype=prolog:
|
||||
vim: set ft=cpp:
|
||||
```
|
||||
@@ -111,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`.
|
||||
|
||||
8
Rakefile
8
Rakefile
@@ -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"
|
||||
|
||||
|
||||
@@ -111,7 +111,7 @@ def git_linguist(args)
|
||||
parser.parse!(args)
|
||||
|
||||
git_dir = `git rev-parse --git-dir`.strip
|
||||
raise "git-linguist must be ran in a Git repository" unless $?.success?
|
||||
raise "git-linguist must be ran in a Git repository (#{Dir.pwd})" unless $?.success?
|
||||
wrapper = GitLinguist.new(git_dir, commit, incremental)
|
||||
|
||||
case args.pop
|
||||
|
||||
@@ -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
|
||||
@@ -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
12
grammars.yml
Normal file → Executable 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:
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
require 'linguist/blob_helper'
|
||||
require 'linguist/generated'
|
||||
require 'linguist/grammars'
|
||||
require 'linguist/heuristics'
|
||||
require 'linguist/language'
|
||||
require 'linguist/repository'
|
||||
@@ -8,8 +9,85 @@ require 'linguist/shebang'
|
||||
require 'linguist/version'
|
||||
|
||||
class << Linguist
|
||||
# Public: Detects the Language of the blob.
|
||||
#
|
||||
# blob - an object that includes the Linguist `BlobHelper` interface;
|
||||
# see Linguist::LazyBlob and Linguist::FileBlob for examples
|
||||
#
|
||||
# Returns Language or nil.
|
||||
def detect(blob)
|
||||
# Bail early if the blob is binary or empty.
|
||||
return nil if blob.likely_binary? || blob.binary? || blob.empty?
|
||||
|
||||
Linguist.instrument("linguist.detection", :blob => blob) do
|
||||
# Call each strategy until one candidate is returned.
|
||||
languages = []
|
||||
returning_strategy = nil
|
||||
|
||||
STRATEGIES.each do |strategy|
|
||||
returning_strategy = strategy
|
||||
candidates = Linguist.instrument("linguist.strategy", :blob => blob, :strategy => strategy, :candidates => languages) do
|
||||
strategy.call(blob, languages)
|
||||
end
|
||||
if candidates.size == 1
|
||||
languages = candidates
|
||||
break
|
||||
elsif candidates.size > 1
|
||||
# More than one candidate was found, pass them to the next strategy.
|
||||
languages = candidates
|
||||
else
|
||||
# No candidates, try the next strategy
|
||||
end
|
||||
end
|
||||
|
||||
Linguist.instrument("linguist.detected", :blob => blob, :strategy => returning_strategy, :language => languages.first)
|
||||
|
||||
languages.first
|
||||
end
|
||||
end
|
||||
|
||||
# Internal: The strategies used to detect the language of a file.
|
||||
#
|
||||
# A strategy is an object that has a `.call` method that takes two arguments:
|
||||
#
|
||||
# blob - An object that quacks like a blob.
|
||||
# languages - An Array of candidate Language objects that were returned by the
|
||||
# previous strategy.
|
||||
#
|
||||
# A strategy should return an Array of Language candidates.
|
||||
#
|
||||
# Strategies are called in turn until a single Language is returned.
|
||||
STRATEGIES = [
|
||||
Linguist::Strategy::Modeline,
|
||||
Linguist::Shebang,
|
||||
Linguist::Strategy::Filename,
|
||||
Linguist::Heuristics,
|
||||
Linguist::Classifier
|
||||
]
|
||||
|
||||
# Public: Set an instrumenter.
|
||||
#
|
||||
# class CustomInstrumenter
|
||||
# def instrument(name, payload = {})
|
||||
# warn "Instrumenting #{name}: #{payload[:blob]}"
|
||||
# end
|
||||
# end
|
||||
#
|
||||
# Linguist.instrumenter = CustomInstrumenter
|
||||
#
|
||||
# The instrumenter must conform to the `ActiveSupport::Notifications`
|
||||
# interface, which defines `#instrument` and accepts:
|
||||
#
|
||||
# name - the String name of the event (e.g. "linguist.detected")
|
||||
# payload - a Hash of the exception context.
|
||||
attr_accessor :instrumenter
|
||||
|
||||
# Internal: Perform instrumentation on a block
|
||||
#
|
||||
# Linguist.instrument("linguist.dosomething", :blob => blob) do
|
||||
# # logic to instrument here.
|
||||
# end
|
||||
#
|
||||
def instrument(*args, &bk)
|
||||
if instrumenter
|
||||
instrumenter.instrument(*args, &bk)
|
||||
@@ -17,4 +95,5 @@ class << Linguist
|
||||
yield
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
@@ -6,7 +6,7 @@ require 'yaml'
|
||||
|
||||
module Linguist
|
||||
# DEPRECATED Avoid mixing into Blob classes. Prefer functional interfaces
|
||||
# like `Language.detect` over `Blob#language`. Functions are much easier to
|
||||
# like `Linguist.detect` over `Blob#language`. Functions are much easier to
|
||||
# cache and compose.
|
||||
#
|
||||
# Avoid adding additional bloat to this module.
|
||||
@@ -325,7 +325,7 @@ module Linguist
|
||||
#
|
||||
# Returns a Language or nil if none is detected
|
||||
def language
|
||||
@language ||= Language.detect(self)
|
||||
@language ||= Linguist.detect(self)
|
||||
end
|
||||
|
||||
# Internal: Get the TextMate compatible scope for the blob
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -293,6 +293,14 @@ module Linguist
|
||||
end
|
||||
end
|
||||
|
||||
disambiguate ".pod" do |data|
|
||||
if /^=\w+$/.match(data)
|
||||
Language["Pod"]
|
||||
else
|
||||
Language["Perl"]
|
||||
end
|
||||
end
|
||||
|
||||
disambiguate ".pro" do |data|
|
||||
if /^[^#]+:-/.match(data)
|
||||
Language["Prolog"]
|
||||
@@ -305,6 +313,14 @@ module Linguist
|
||||
end
|
||||
end
|
||||
|
||||
disambiguate ".props" do |data|
|
||||
if /^(\s*)(<Project|<Import|<Property|<?xml|xmlns)/i.match(data)
|
||||
Language["XML"]
|
||||
elsif /\w+\s*=\s*/i.match(data)
|
||||
Language["INI"]
|
||||
end
|
||||
end
|
||||
|
||||
disambiguate ".r" do |data|
|
||||
if /\bRebol\b/i.match(data)
|
||||
Language["Rebol"]
|
||||
@@ -313,6 +329,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"]
|
||||
@@ -330,7 +354,7 @@ module Linguist
|
||||
end
|
||||
|
||||
disambiguate ".sql" do |data|
|
||||
if /^\\i\b|AS \$\$|LANGUAGE '+plpgsql'+/i.match(data) || /SECURITY (DEFINER|INVOKER)/i.match(data) || /BEGIN( WORK| TRANSACTION)?;/i.match(data)
|
||||
if /^\\i\b|AS \$\$|LANGUAGE '?plpgsql'?/i.match(data) || /SECURITY (DEFINER|INVOKER)/i.match(data) || /BEGIN( WORK| TRANSACTION)?;/i.match(data)
|
||||
#Postgres
|
||||
Language["PLpgSQL"]
|
||||
elsif /(alter module)|(language sql)|(begin( NOT)+ atomic)/i.match(data) || /signal SQLSTATE '[0-9]+'/i.match(data)
|
||||
|
||||
@@ -87,14 +87,6 @@ module Linguist
|
||||
language
|
||||
end
|
||||
|
||||
STRATEGIES = [
|
||||
Linguist::Strategy::Modeline,
|
||||
Linguist::Shebang,
|
||||
Linguist::Strategy::Filename,
|
||||
Linguist::Heuristics,
|
||||
Linguist::Classifier
|
||||
]
|
||||
|
||||
# Public: Detects the Language of the blob.
|
||||
#
|
||||
# blob - an object that includes the Linguist `BlobHelper` interface;
|
||||
@@ -102,34 +94,8 @@ module Linguist
|
||||
#
|
||||
# Returns Language or nil.
|
||||
def self.detect(blob)
|
||||
# Bail early if the blob is binary or empty.
|
||||
return nil if blob.likely_binary? || blob.binary? || blob.empty?
|
||||
|
||||
Linguist.instrument("linguist.detection", :blob => blob) do
|
||||
# Call each strategy until one candidate is returned.
|
||||
languages = []
|
||||
returning_strategy = nil
|
||||
|
||||
STRATEGIES.each do |strategy|
|
||||
returning_strategy = strategy
|
||||
candidates = Linguist.instrument("linguist.strategy", :blob => blob, :strategy => strategy, :candidates => languages) do
|
||||
strategy.call(blob, languages)
|
||||
end
|
||||
if candidates.size == 1
|
||||
languages = candidates
|
||||
break
|
||||
elsif candidates.size > 1
|
||||
# More than one candidate was found, pass them to the next strategy.
|
||||
languages = candidates
|
||||
else
|
||||
# No candidates, try the next strategy
|
||||
end
|
||||
end
|
||||
|
||||
Linguist.instrument("linguist.detected", :blob => blob, :strategy => returning_strategy, :language => languages.first)
|
||||
|
||||
languages.first
|
||||
end
|
||||
warn "[DEPRECATED] `Linguist::Language.detect` is deprecated. Use `Linguist.detect`. #{caller[0]}"
|
||||
Linguist.detect(blob)
|
||||
end
|
||||
|
||||
# Public: Get all Languages
|
||||
|
||||
121
lib/linguist/languages.yml
Normal file → Executable file
121
lib/linguist/languages.yml
Normal file → Executable file
@@ -183,6 +183,7 @@ AppleScript:
|
||||
interpreters:
|
||||
- osascript
|
||||
ace_mode: applescript
|
||||
color: "#101F1F"
|
||||
|
||||
Arc:
|
||||
type: programming
|
||||
@@ -290,6 +291,7 @@ Batchfile:
|
||||
- .cmd
|
||||
tm_scope: source.dosbatch
|
||||
ace_mode: batchfile
|
||||
color: "#C1F12E"
|
||||
|
||||
Befunge:
|
||||
type: programming
|
||||
@@ -304,6 +306,7 @@ Bison:
|
||||
extensions:
|
||||
- .bison
|
||||
ace_mode: text
|
||||
color: "#6A463F"
|
||||
|
||||
BitBake:
|
||||
type: programming
|
||||
@@ -472,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
|
||||
@@ -638,7 +648,7 @@ Common Lisp:
|
||||
|
||||
Component Pascal:
|
||||
type: programming
|
||||
color: "#b0ce4e"
|
||||
color: "#B0CE4E"
|
||||
extensions:
|
||||
- .cp
|
||||
- .cps
|
||||
@@ -701,6 +711,7 @@ Cucumber:
|
||||
aliases:
|
||||
- gherkin
|
||||
ace_mode: text
|
||||
color: "#5B2063"
|
||||
|
||||
Cuda:
|
||||
type: programming
|
||||
@@ -709,6 +720,7 @@ Cuda:
|
||||
- .cuh
|
||||
tm_scope: source.cuda-c++
|
||||
ace_mode: c_cpp
|
||||
color: "#3A4E3A"
|
||||
|
||||
Cycript:
|
||||
type: programming
|
||||
@@ -801,7 +813,6 @@ Dart:
|
||||
|
||||
Diff:
|
||||
type: data
|
||||
color: "#88dddd"
|
||||
extensions:
|
||||
- .diff
|
||||
- .patch
|
||||
@@ -939,6 +950,8 @@ Erlang:
|
||||
- .es
|
||||
- .escript
|
||||
- .hrl
|
||||
- .xrl
|
||||
- .yrl
|
||||
filenames:
|
||||
- rebar.config
|
||||
- rebar.config.lock
|
||||
@@ -1277,6 +1290,7 @@ Groff:
|
||||
- '.8'
|
||||
- '.9'
|
||||
- .l
|
||||
- .me
|
||||
- .ms
|
||||
- .n
|
||||
- .rno
|
||||
@@ -1297,6 +1311,8 @@ Groovy:
|
||||
- .gvy
|
||||
interpreters:
|
||||
- groovy
|
||||
filenames:
|
||||
- Jenkinsfile
|
||||
|
||||
Groovy Server Pages:
|
||||
type: programming
|
||||
@@ -1317,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
|
||||
@@ -1390,6 +1416,7 @@ Hack:
|
||||
- .hh
|
||||
- .php
|
||||
tm_scope: text.html.php
|
||||
color: "#878787"
|
||||
|
||||
Haml:
|
||||
group: HTML
|
||||
@@ -1398,6 +1425,7 @@ Haml:
|
||||
- .haml
|
||||
- .haml.deface
|
||||
ace_mode: haml
|
||||
color: "#ECE2A9"
|
||||
|
||||
Handlebars:
|
||||
type: markup
|
||||
@@ -1764,6 +1792,7 @@ LLVM:
|
||||
extensions:
|
||||
- .ll
|
||||
ace_mode: text
|
||||
color: "#185619"
|
||||
|
||||
LOLCODE:
|
||||
type: programming
|
||||
@@ -1827,6 +1856,7 @@ Less:
|
||||
- .less
|
||||
tm_scope: source.css.less
|
||||
ace_mode: less
|
||||
color: "#A1D9A1"
|
||||
|
||||
Lex:
|
||||
type: programming
|
||||
@@ -1978,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"
|
||||
@@ -2019,6 +2068,8 @@ Makefile:
|
||||
- GNUmakefile
|
||||
- Kbuild
|
||||
- Makefile
|
||||
- Makefile.am
|
||||
- Makefile.in
|
||||
- Makefile.inc
|
||||
- makefile
|
||||
interpreters:
|
||||
@@ -2045,6 +2096,7 @@ Markdown:
|
||||
- .mkdown
|
||||
- .ron
|
||||
tm_scope: source.gfm
|
||||
color: "#083FA1"
|
||||
|
||||
Mask:
|
||||
type: markup
|
||||
@@ -2284,6 +2336,7 @@ Nginx:
|
||||
aliases:
|
||||
- nginx configuration file
|
||||
ace_mode: text
|
||||
color: "#9469E9"
|
||||
|
||||
Nimrod:
|
||||
type: programming
|
||||
@@ -2342,6 +2395,7 @@ NumPy:
|
||||
- .numsc
|
||||
tm_scope: none
|
||||
ace_mode: text
|
||||
color: "#9C8AF9"
|
||||
|
||||
OCaml:
|
||||
type: programming
|
||||
@@ -2542,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'
|
||||
@@ -2592,7 +2656,7 @@ Parrot Internal Representation:
|
||||
|
||||
Pascal:
|
||||
type: programming
|
||||
color: "#b0ce4e"
|
||||
color: "#E3F171"
|
||||
extensions:
|
||||
- .pas
|
||||
- .dfm
|
||||
@@ -2641,7 +2705,7 @@ Perl6:
|
||||
- Rexfile
|
||||
interpreters:
|
||||
- perl6
|
||||
tm_scope: source.perl.6
|
||||
tm_scope: source.perl6fe
|
||||
ace_mode: perl
|
||||
|
||||
Pickle:
|
||||
@@ -2736,8 +2800,10 @@ Prolog:
|
||||
- .pl
|
||||
- .pro
|
||||
- .prolog
|
||||
- .yap
|
||||
interpreters:
|
||||
- swipl
|
||||
- yap
|
||||
tm_scope: source.prolog
|
||||
ace_mode: prolog
|
||||
|
||||
@@ -2807,6 +2873,7 @@ Python:
|
||||
color: "#3572A5"
|
||||
extensions:
|
||||
- .py
|
||||
- .bzl
|
||||
- .cgi
|
||||
- .fcgi
|
||||
- .gyp
|
||||
@@ -2815,10 +2882,12 @@ Python:
|
||||
- .pyp
|
||||
- .pyt
|
||||
- .pyw
|
||||
- .rpy
|
||||
- .tac
|
||||
- .wsgi
|
||||
- .xpy
|
||||
filenames:
|
||||
- BUCK
|
||||
- BUILD
|
||||
- SConscript
|
||||
- SConstruct
|
||||
@@ -2860,7 +2929,7 @@ QMake:
|
||||
|
||||
R:
|
||||
type: programming
|
||||
color: "#198ce7"
|
||||
color: "#198CE7"
|
||||
aliases:
|
||||
- R
|
||||
- Rscript
|
||||
@@ -2890,6 +2959,7 @@ RDoc:
|
||||
extensions:
|
||||
- .rdoc
|
||||
tm_scope: text.rdoc
|
||||
color: "#8E84BF"
|
||||
|
||||
REALbasic:
|
||||
type: programming
|
||||
@@ -2987,7 +3057,6 @@ Redcode:
|
||||
|
||||
Ren'Py:
|
||||
type: programming
|
||||
group: Python
|
||||
aliases:
|
||||
- renpy
|
||||
color: "#ff7f7f"
|
||||
@@ -3099,6 +3168,7 @@ SCSS:
|
||||
ace_mode: scss
|
||||
extensions:
|
||||
- .scss
|
||||
color: "#CF649A"
|
||||
|
||||
SMT:
|
||||
type: programming
|
||||
@@ -3201,6 +3271,7 @@ Sass:
|
||||
extensions:
|
||||
- .sass
|
||||
ace_mode: sass
|
||||
color: "#CF649A"
|
||||
|
||||
Scala:
|
||||
type: programming
|
||||
@@ -3258,6 +3329,7 @@ Shell:
|
||||
color: "#89e051"
|
||||
aliases:
|
||||
- sh
|
||||
- shell-script
|
||||
- bash
|
||||
- zsh
|
||||
extensions:
|
||||
@@ -3268,6 +3340,7 @@ Shell:
|
||||
- .command
|
||||
- .fcgi
|
||||
- .ksh
|
||||
- .sh.in
|
||||
- .tmux
|
||||
- .tool
|
||||
- .zsh
|
||||
@@ -3500,7 +3573,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
|
||||
|
||||
@@ -3566,7 +3652,6 @@ Unified Parallel C:
|
||||
Unity3D Asset:
|
||||
type: data
|
||||
ace_mode: yaml
|
||||
color: "#ab69a1"
|
||||
extensions:
|
||||
- .anim
|
||||
- .asset
|
||||
@@ -3576,6 +3661,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"
|
||||
@@ -3761,6 +3853,7 @@ XML:
|
||||
- .osm
|
||||
- .plist
|
||||
- .pluginspec
|
||||
- .props
|
||||
- .ps1xml
|
||||
- .psc1
|
||||
- .pt
|
||||
@@ -3782,6 +3875,7 @@ XML:
|
||||
- .tsx
|
||||
- .ui
|
||||
- .urdf
|
||||
- .ux
|
||||
- .vbproj
|
||||
- .vcxproj
|
||||
- .vxml
|
||||
@@ -3798,6 +3892,7 @@ XML:
|
||||
- .xliff
|
||||
- .xmi
|
||||
- .xml.dist
|
||||
- .xproj
|
||||
- .xsd
|
||||
- .xul
|
||||
- .zcml
|
||||
@@ -3854,6 +3949,7 @@ XSLT:
|
||||
- .xsl
|
||||
tm_scope: text.xml.xsl
|
||||
ace_mode: xml
|
||||
color: "#EB8CEB"
|
||||
|
||||
Xojo:
|
||||
type: programming
|
||||
@@ -3882,11 +3978,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:
|
||||
@@ -3895,6 +3999,7 @@ Yacc:
|
||||
- .yy
|
||||
tm_scope: source.bison
|
||||
ace_mode: text
|
||||
color: "#4B6C4B"
|
||||
|
||||
Zephir:
|
||||
type: programming
|
||||
@@ -3934,7 +4039,6 @@ eC:
|
||||
edn:
|
||||
type: data
|
||||
ace_mode: clojure
|
||||
color: "#db5855"
|
||||
extensions:
|
||||
- .edn
|
||||
tm_scope: source.clojure
|
||||
@@ -3979,6 +4083,7 @@ reStructuredText:
|
||||
- .rest.txt
|
||||
- .rst.txt
|
||||
ace_mode: text
|
||||
color: "#B3BCBC"
|
||||
|
||||
wisp:
|
||||
type: programming
|
||||
|
||||
@@ -1,8 +1,19 @@
|
||||
module Linguist
|
||||
module Strategy
|
||||
class Modeline
|
||||
EmacsModeline = /-\*-\s*(?:(?!mode)[\w-]+\s*:\s*(?:[\w+-]+)\s*;?\s*)*(?:mode\s*:)?\s*([\w+-]+)\s*(?:;\s*(?!mode)[\w-]+\s*:\s*[\w+-]+\s*)*;?\s*-\*-/i
|
||||
VimModeline = /vim:\s*set.*\s(?:ft|filetype)=(\w+)\s?.*:/i
|
||||
EMACS_MODELINE = /-\*-\s*(?:(?!mode)[\w-]+\s*:\s*(?:[\w+-]+)\s*;?\s*)*(?:mode\s*:)?\s*([\w+-]+)\s*(?:;\s*(?!mode)[\w-]+\s*:\s*[\w+-]+\s*)*;?\s*-\*-/i
|
||||
|
||||
# First form vim modeline
|
||||
# [text]{white}{vi:|vim:|ex:}[white]{options}
|
||||
# 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=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]
|
||||
|
||||
# Public: Detects language based on Vim and Emacs modelines
|
||||
#
|
||||
@@ -22,7 +33,7 @@ module Linguist
|
||||
#
|
||||
# Returns a String or nil
|
||||
def self.modeline(data)
|
||||
match = data.match(EmacsModeline) || data.match(VimModeline)
|
||||
match = MODELINES.map { |regex| data.match(regex) }.reject(&:nil?).first
|
||||
match[1] if match
|
||||
end
|
||||
end
|
||||
|
||||
@@ -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$
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
module Linguist
|
||||
VERSION = "4.7.4"
|
||||
VERSION = "4.8.0"
|
||||
end
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
Year,Make,Model,Length
|
||||
1997,Ford,E350,2.34
|
||||
2000,Mercury,Cougar,2.38
|
||||
2000,Mercury,Cougar,2.38
|
||||
|
856
samples/Erlang/elixir_parser.yrl
Normal file
856
samples/Erlang/elixir_parser.yrl
Normal file
@@ -0,0 +1,856 @@
|
||||
Nonterminals
|
||||
grammar expr_list
|
||||
expr container_expr block_expr access_expr
|
||||
no_parens_expr no_parens_zero_expr no_parens_one_expr no_parens_one_ambig_expr
|
||||
bracket_expr bracket_at_expr bracket_arg matched_expr unmatched_expr max_expr
|
||||
unmatched_op_expr matched_op_expr no_parens_op_expr no_parens_many_expr
|
||||
comp_op_eol at_op_eol unary_op_eol and_op_eol or_op_eol capture_op_eol
|
||||
add_op_eol mult_op_eol two_op_eol three_op_eol pipe_op_eol stab_op_eol
|
||||
arrow_op_eol match_op_eol when_op_eol in_op_eol in_match_op_eol
|
||||
type_op_eol rel_op_eol
|
||||
open_paren close_paren empty_paren eoe
|
||||
list list_args open_bracket close_bracket
|
||||
tuple open_curly close_curly
|
||||
bit_string open_bit close_bit
|
||||
map map_op map_close map_args map_expr struct_op
|
||||
assoc_op_eol assoc_expr assoc_base assoc_update assoc_update_kw assoc
|
||||
container_args_base container_args
|
||||
call_args_parens_expr call_args_parens_base call_args_parens parens_call
|
||||
call_args_no_parens_one call_args_no_parens_ambig call_args_no_parens_expr
|
||||
call_args_no_parens_comma_expr call_args_no_parens_all call_args_no_parens_many
|
||||
call_args_no_parens_many_strict
|
||||
stab stab_eoe stab_expr stab_op_eol_and_expr stab_parens_many
|
||||
kw_eol kw_base kw call_args_no_parens_kw_expr call_args_no_parens_kw
|
||||
dot_op dot_alias dot_alias_container
|
||||
dot_identifier dot_op_identifier dot_do_identifier
|
||||
dot_paren_identifier dot_bracket_identifier
|
||||
do_block fn_eoe do_eoe end_eoe block_eoe block_item block_list
|
||||
.
|
||||
|
||||
Terminals
|
||||
identifier kw_identifier kw_identifier_safe kw_identifier_unsafe bracket_identifier
|
||||
paren_identifier do_identifier block_identifier
|
||||
fn 'end' aliases
|
||||
number atom atom_safe atom_unsafe bin_string list_string sigil
|
||||
dot_call_op op_identifier
|
||||
comp_op at_op unary_op and_op or_op arrow_op match_op in_op in_match_op
|
||||
type_op dual_op add_op mult_op two_op three_op pipe_op stab_op when_op assoc_op
|
||||
capture_op rel_op
|
||||
'true' 'false' 'nil' 'do' eol ';' ',' '.'
|
||||
'(' ')' '[' ']' '{' '}' '<<' '>>' '%{}' '%'
|
||||
.
|
||||
|
||||
Rootsymbol grammar.
|
||||
|
||||
%% Two shift/reduce conflicts coming from call_args_parens.
|
||||
Expect 2.
|
||||
|
||||
%% Changes in ops and precedence should be reflected on lib/elixir/lib/macro.ex
|
||||
%% Note though the operator => in practice has lower precedence than all others,
|
||||
%% its entry in the table is only to support the %{user | foo => bar} syntax.
|
||||
Left 5 do.
|
||||
Right 10 stab_op_eol. %% ->
|
||||
Left 20 ','.
|
||||
Nonassoc 30 capture_op_eol. %% &
|
||||
Left 40 in_match_op_eol. %% <-, \\ (allowed in matches along =)
|
||||
Right 50 when_op_eol. %% when
|
||||
Right 60 type_op_eol. %% ::
|
||||
Right 70 pipe_op_eol. %% |
|
||||
Right 80 assoc_op_eol. %% =>
|
||||
Right 90 match_op_eol. %% =
|
||||
Left 130 or_op_eol. %% ||, |||, or
|
||||
Left 140 and_op_eol. %% &&, &&&, and
|
||||
Left 150 comp_op_eol. %% ==, !=, =~, ===, !==
|
||||
Left 160 rel_op_eol. %% <, >, <=, >=
|
||||
Left 170 arrow_op_eol. %% |>, <<<, >>>, ~>>, <<~, ~>, <~, <~>, <|>
|
||||
Left 180 in_op_eol. %% in
|
||||
Left 190 three_op_eol. %% ^^^
|
||||
Right 200 two_op_eol. %% ++, --, .., <>
|
||||
Left 210 add_op_eol. %% +, -
|
||||
Left 220 mult_op_eol. %% *, /
|
||||
Nonassoc 300 unary_op_eol. %% +, -, !, ^, not, ~~~
|
||||
Left 310 dot_call_op.
|
||||
Left 310 dot_op. %% .
|
||||
Nonassoc 320 at_op_eol. %% @
|
||||
Nonassoc 330 dot_identifier.
|
||||
|
||||
%%% MAIN FLOW OF EXPRESSIONS
|
||||
|
||||
grammar -> eoe : nil.
|
||||
grammar -> expr_list : to_block('$1').
|
||||
grammar -> eoe expr_list : to_block('$2').
|
||||
grammar -> expr_list eoe : to_block('$1').
|
||||
grammar -> eoe expr_list eoe : to_block('$2').
|
||||
grammar -> '$empty' : nil.
|
||||
|
||||
% Note expressions are on reverse order
|
||||
expr_list -> expr : ['$1'].
|
||||
expr_list -> expr_list eoe expr : ['$3'|'$1'].
|
||||
|
||||
expr -> matched_expr : '$1'.
|
||||
expr -> no_parens_expr : '$1'.
|
||||
expr -> unmatched_expr : '$1'.
|
||||
|
||||
%% In Elixir we have three main call syntaxes: with parentheses,
|
||||
%% without parentheses and with do blocks. They are represented
|
||||
%% in the AST as matched, no_parens and unmatched.
|
||||
%%
|
||||
%% Calls without parentheses are further divided according to how
|
||||
%% problematic they are:
|
||||
%%
|
||||
%% (a) no_parens_one: a call with one unproblematic argument
|
||||
%% (e.g. `f a` or `f g a` and similar) (includes unary operators)
|
||||
%%
|
||||
%% (b) no_parens_many: a call with several arguments (e.g. `f a, b`)
|
||||
%%
|
||||
%% (c) no_parens_one_ambig: a call with one argument which is
|
||||
%% itself a no_parens_many or no_parens_one_ambig (e.g. `f g a, b`
|
||||
%% or `f g h a, b` and similar)
|
||||
%%
|
||||
%% Note, in particular, that no_parens_one_ambig expressions are
|
||||
%% ambiguous and are interpreted such that the outer function has
|
||||
%% arity 1 (e.g. `f g a, b` is interpreted as `f(g(a, b))` rather
|
||||
%% than `f(g(a), b)`). Hence the name, no_parens_one_ambig.
|
||||
%%
|
||||
%% The distinction is required because we can't, for example, have
|
||||
%% a function call with a do block as argument inside another do
|
||||
%% block call, unless there are parentheses:
|
||||
%%
|
||||
%% if if true do true else false end do #=> invalid
|
||||
%% if(if true do true else false end) do #=> valid
|
||||
%%
|
||||
%% Similarly, it is not possible to nest calls without parentheses
|
||||
%% if their arity is more than 1:
|
||||
%%
|
||||
%% foo a, bar b, c #=> invalid
|
||||
%% foo(a, bar b, c) #=> invalid
|
||||
%% foo bar a, b #=> valid
|
||||
%% foo a, bar(b, c) #=> valid
|
||||
%%
|
||||
%% So the different grammar rules need to take into account
|
||||
%% if calls without parentheses are do blocks in particular
|
||||
%% segments and act accordingly.
|
||||
matched_expr -> matched_expr matched_op_expr : build_op(element(1, '$2'), '$1', element(2, '$2')).
|
||||
matched_expr -> unary_op_eol matched_expr : build_unary_op('$1', '$2').
|
||||
matched_expr -> at_op_eol matched_expr : build_unary_op('$1', '$2').
|
||||
matched_expr -> capture_op_eol matched_expr : build_unary_op('$1', '$2').
|
||||
matched_expr -> no_parens_one_expr : '$1'.
|
||||
matched_expr -> no_parens_zero_expr : '$1'.
|
||||
matched_expr -> access_expr : '$1'.
|
||||
matched_expr -> access_expr kw_identifier : throw_invalid_kw_identifier('$2').
|
||||
|
||||
unmatched_expr -> matched_expr unmatched_op_expr : build_op(element(1, '$2'), '$1', element(2, '$2')).
|
||||
unmatched_expr -> unmatched_expr matched_op_expr : build_op(element(1, '$2'), '$1', element(2, '$2')).
|
||||
unmatched_expr -> unmatched_expr unmatched_op_expr : build_op(element(1, '$2'), '$1', element(2, '$2')).
|
||||
unmatched_expr -> unmatched_expr no_parens_op_expr : build_op(element(1, '$2'), '$1', element(2, '$2')).
|
||||
unmatched_expr -> unary_op_eol expr : build_unary_op('$1', '$2').
|
||||
unmatched_expr -> at_op_eol expr : build_unary_op('$1', '$2').
|
||||
unmatched_expr -> capture_op_eol expr : build_unary_op('$1', '$2').
|
||||
unmatched_expr -> block_expr : '$1'.
|
||||
|
||||
no_parens_expr -> matched_expr no_parens_op_expr : build_op(element(1, '$2'), '$1', element(2, '$2')).
|
||||
no_parens_expr -> unary_op_eol no_parens_expr : build_unary_op('$1', '$2').
|
||||
no_parens_expr -> at_op_eol no_parens_expr : build_unary_op('$1', '$2').
|
||||
no_parens_expr -> capture_op_eol no_parens_expr : build_unary_op('$1', '$2').
|
||||
no_parens_expr -> no_parens_one_ambig_expr : '$1'.
|
||||
no_parens_expr -> no_parens_many_expr : '$1'.
|
||||
|
||||
block_expr -> parens_call call_args_parens do_block : build_identifier('$1', '$2' ++ '$3').
|
||||
block_expr -> parens_call call_args_parens call_args_parens do_block : build_nested_parens('$1', '$2', '$3' ++ '$4').
|
||||
block_expr -> dot_do_identifier do_block : build_identifier('$1', '$2').
|
||||
block_expr -> dot_identifier call_args_no_parens_all do_block : build_identifier('$1', '$2' ++ '$3').
|
||||
|
||||
matched_op_expr -> match_op_eol matched_expr : {'$1', '$2'}.
|
||||
matched_op_expr -> add_op_eol matched_expr : {'$1', '$2'}.
|
||||
matched_op_expr -> mult_op_eol matched_expr : {'$1', '$2'}.
|
||||
matched_op_expr -> two_op_eol matched_expr : {'$1', '$2'}.
|
||||
matched_op_expr -> three_op_eol matched_expr : {'$1', '$2'}.
|
||||
matched_op_expr -> and_op_eol matched_expr : {'$1', '$2'}.
|
||||
matched_op_expr -> or_op_eol matched_expr : {'$1', '$2'}.
|
||||
matched_op_expr -> in_op_eol matched_expr : {'$1', '$2'}.
|
||||
matched_op_expr -> in_match_op_eol matched_expr : {'$1', '$2'}.
|
||||
matched_op_expr -> type_op_eol matched_expr : {'$1', '$2'}.
|
||||
matched_op_expr -> when_op_eol matched_expr : {'$1', '$2'}.
|
||||
matched_op_expr -> pipe_op_eol matched_expr : {'$1', '$2'}.
|
||||
matched_op_expr -> comp_op_eol matched_expr : {'$1', '$2'}.
|
||||
matched_op_expr -> rel_op_eol matched_expr : {'$1', '$2'}.
|
||||
matched_op_expr -> arrow_op_eol matched_expr : {'$1', '$2'}.
|
||||
%% Warn for no parens subset
|
||||
matched_op_expr -> arrow_op_eol no_parens_one_expr : warn_pipe('$1', '$2'), {'$1', '$2'}.
|
||||
|
||||
unmatched_op_expr -> match_op_eol unmatched_expr : {'$1', '$2'}.
|
||||
unmatched_op_expr -> add_op_eol unmatched_expr : {'$1', '$2'}.
|
||||
unmatched_op_expr -> mult_op_eol unmatched_expr : {'$1', '$2'}.
|
||||
unmatched_op_expr -> two_op_eol unmatched_expr : {'$1', '$2'}.
|
||||
unmatched_op_expr -> three_op_eol unmatched_expr : {'$1', '$2'}.
|
||||
unmatched_op_expr -> and_op_eol unmatched_expr : {'$1', '$2'}.
|
||||
unmatched_op_expr -> or_op_eol unmatched_expr : {'$1', '$2'}.
|
||||
unmatched_op_expr -> in_op_eol unmatched_expr : {'$1', '$2'}.
|
||||
unmatched_op_expr -> in_match_op_eol unmatched_expr : {'$1', '$2'}.
|
||||
unmatched_op_expr -> type_op_eol unmatched_expr : {'$1', '$2'}.
|
||||
unmatched_op_expr -> when_op_eol unmatched_expr : {'$1', '$2'}.
|
||||
unmatched_op_expr -> pipe_op_eol unmatched_expr : {'$1', '$2'}.
|
||||
unmatched_op_expr -> comp_op_eol unmatched_expr : {'$1', '$2'}.
|
||||
unmatched_op_expr -> rel_op_eol unmatched_expr : {'$1', '$2'}.
|
||||
unmatched_op_expr -> arrow_op_eol unmatched_expr : {'$1', '$2'}.
|
||||
|
||||
no_parens_op_expr -> match_op_eol no_parens_expr : {'$1', '$2'}.
|
||||
no_parens_op_expr -> add_op_eol no_parens_expr : {'$1', '$2'}.
|
||||
no_parens_op_expr -> mult_op_eol no_parens_expr : {'$1', '$2'}.
|
||||
no_parens_op_expr -> two_op_eol no_parens_expr : {'$1', '$2'}.
|
||||
no_parens_op_expr -> three_op_eol no_parens_expr : {'$1', '$2'}.
|
||||
no_parens_op_expr -> and_op_eol no_parens_expr : {'$1', '$2'}.
|
||||
no_parens_op_expr -> or_op_eol no_parens_expr : {'$1', '$2'}.
|
||||
no_parens_op_expr -> in_op_eol no_parens_expr : {'$1', '$2'}.
|
||||
no_parens_op_expr -> in_match_op_eol no_parens_expr : {'$1', '$2'}.
|
||||
no_parens_op_expr -> type_op_eol no_parens_expr : {'$1', '$2'}.
|
||||
no_parens_op_expr -> when_op_eol no_parens_expr : {'$1', '$2'}.
|
||||
no_parens_op_expr -> pipe_op_eol no_parens_expr : {'$1', '$2'}.
|
||||
no_parens_op_expr -> comp_op_eol no_parens_expr : {'$1', '$2'}.
|
||||
no_parens_op_expr -> rel_op_eol no_parens_expr : {'$1', '$2'}.
|
||||
no_parens_op_expr -> arrow_op_eol no_parens_expr : {'$1', '$2'}.
|
||||
%% Warn for no parens subset
|
||||
no_parens_op_expr -> arrow_op_eol no_parens_one_ambig_expr : warn_pipe('$1', '$2'), {'$1', '$2'}.
|
||||
no_parens_op_expr -> arrow_op_eol no_parens_many_expr : warn_pipe('$1', '$2'), {'$1', '$2'}.
|
||||
|
||||
%% Allow when (and only when) with keywords
|
||||
no_parens_op_expr -> when_op_eol call_args_no_parens_kw : {'$1', '$2'}.
|
||||
|
||||
no_parens_one_ambig_expr -> dot_op_identifier call_args_no_parens_ambig : build_identifier('$1', '$2').
|
||||
no_parens_one_ambig_expr -> dot_identifier call_args_no_parens_ambig : build_identifier('$1', '$2').
|
||||
|
||||
no_parens_many_expr -> dot_op_identifier call_args_no_parens_many_strict : build_identifier('$1', '$2').
|
||||
no_parens_many_expr -> dot_identifier call_args_no_parens_many_strict : build_identifier('$1', '$2').
|
||||
|
||||
no_parens_one_expr -> dot_op_identifier call_args_no_parens_one : build_identifier('$1', '$2').
|
||||
no_parens_one_expr -> dot_identifier call_args_no_parens_one : build_identifier('$1', '$2').
|
||||
no_parens_zero_expr -> dot_do_identifier : build_identifier('$1', nil).
|
||||
no_parens_zero_expr -> dot_identifier : build_identifier('$1', nil).
|
||||
|
||||
%% From this point on, we just have constructs that can be
|
||||
%% used with the access syntax. Notice that (dot_)identifier
|
||||
%% is not included in this list simply because the tokenizer
|
||||
%% marks identifiers followed by brackets as bracket_identifier.
|
||||
access_expr -> bracket_at_expr : '$1'.
|
||||
access_expr -> bracket_expr : '$1'.
|
||||
access_expr -> at_op_eol number : build_unary_op('$1', ?exprs('$2')).
|
||||
access_expr -> unary_op_eol number : build_unary_op('$1', ?exprs('$2')).
|
||||
access_expr -> capture_op_eol number : build_unary_op('$1', ?exprs('$2')).
|
||||
access_expr -> fn_eoe stab end_eoe : build_fn('$1', reverse('$2')).
|
||||
access_expr -> open_paren stab close_paren : build_stab(reverse('$2')).
|
||||
access_expr -> open_paren stab ';' close_paren : build_stab(reverse('$2')).
|
||||
access_expr -> open_paren ';' stab ';' close_paren : build_stab(reverse('$3')).
|
||||
access_expr -> open_paren ';' stab close_paren : build_stab(reverse('$3')).
|
||||
access_expr -> open_paren ';' close_paren : build_stab([]).
|
||||
access_expr -> empty_paren : nil.
|
||||
access_expr -> number : ?exprs('$1').
|
||||
access_expr -> list : element(1, '$1').
|
||||
access_expr -> map : '$1'.
|
||||
access_expr -> tuple : '$1'.
|
||||
access_expr -> 'true' : ?id('$1').
|
||||
access_expr -> 'false' : ?id('$1').
|
||||
access_expr -> 'nil' : ?id('$1').
|
||||
access_expr -> bin_string : build_bin_string('$1').
|
||||
access_expr -> list_string : build_list_string('$1').
|
||||
access_expr -> bit_string : '$1'.
|
||||
access_expr -> sigil : build_sigil('$1').
|
||||
access_expr -> max_expr : '$1'.
|
||||
|
||||
%% Aliases and properly formed calls. Used by map_expr.
|
||||
max_expr -> atom : ?exprs('$1').
|
||||
max_expr -> atom_safe : build_quoted_atom('$1', true).
|
||||
max_expr -> atom_unsafe : build_quoted_atom('$1', false).
|
||||
max_expr -> parens_call call_args_parens : build_identifier('$1', '$2').
|
||||
max_expr -> parens_call call_args_parens call_args_parens : build_nested_parens('$1', '$2', '$3').
|
||||
max_expr -> dot_alias : '$1'.
|
||||
|
||||
bracket_arg -> open_bracket kw close_bracket : build_list('$1', '$2').
|
||||
bracket_arg -> open_bracket container_expr close_bracket : build_list('$1', '$2').
|
||||
bracket_arg -> open_bracket container_expr ',' close_bracket : build_list('$1', '$2').
|
||||
|
||||
bracket_expr -> dot_bracket_identifier bracket_arg : build_access(build_identifier('$1', nil), '$2').
|
||||
bracket_expr -> access_expr bracket_arg : build_access('$1', '$2').
|
||||
|
||||
bracket_at_expr -> at_op_eol dot_bracket_identifier bracket_arg :
|
||||
build_access(build_unary_op('$1', build_identifier('$2', nil)), '$3').
|
||||
bracket_at_expr -> at_op_eol access_expr bracket_arg :
|
||||
build_access(build_unary_op('$1', '$2'), '$3').
|
||||
|
||||
%% Blocks
|
||||
|
||||
do_block -> do_eoe 'end' : [[{do, nil}]].
|
||||
do_block -> do_eoe stab end_eoe : [[{do, build_stab(reverse('$2'))}]].
|
||||
do_block -> do_eoe block_list 'end' : [[{do, nil}|'$2']].
|
||||
do_block -> do_eoe stab_eoe block_list 'end' : [[{do, build_stab(reverse('$2'))}|'$3']].
|
||||
|
||||
eoe -> eol : '$1'.
|
||||
eoe -> ';' : '$1'.
|
||||
eoe -> eol ';' : '$1'.
|
||||
|
||||
fn_eoe -> 'fn' : '$1'.
|
||||
fn_eoe -> 'fn' eoe : '$1'.
|
||||
|
||||
do_eoe -> 'do' : '$1'.
|
||||
do_eoe -> 'do' eoe : '$1'.
|
||||
|
||||
end_eoe -> 'end' : '$1'.
|
||||
end_eoe -> eoe 'end' : '$2'.
|
||||
|
||||
block_eoe -> block_identifier : '$1'.
|
||||
block_eoe -> block_identifier eoe : '$1'.
|
||||
|
||||
stab -> stab_expr : ['$1'].
|
||||
stab -> stab eoe stab_expr : ['$3'|'$1'].
|
||||
|
||||
stab_eoe -> stab : '$1'.
|
||||
stab_eoe -> stab eoe : '$1'.
|
||||
|
||||
%% Here, `element(1, Token)` is the stab operator,
|
||||
%% while `element(2, Token)` is the expression.
|
||||
stab_expr -> expr :
|
||||
'$1'.
|
||||
stab_expr -> stab_op_eol_and_expr :
|
||||
build_op(element(1, '$1'), [], element(2, '$1')).
|
||||
stab_expr -> empty_paren stab_op_eol_and_expr :
|
||||
build_op(element(1, '$2'), [], element(2, '$2')).
|
||||
stab_expr -> call_args_no_parens_all stab_op_eol_and_expr :
|
||||
build_op(element(1, '$2'), unwrap_when(unwrap_splice('$1')), element(2, '$2')).
|
||||
stab_expr -> stab_parens_many stab_op_eol_and_expr :
|
||||
build_op(element(1, '$2'), unwrap_splice('$1'), element(2, '$2')).
|
||||
stab_expr -> stab_parens_many when_op expr stab_op_eol_and_expr :
|
||||
build_op(element(1, '$4'), [{'when', meta_from_token('$2'), unwrap_splice('$1') ++ ['$3']}], element(2, '$4')).
|
||||
|
||||
stab_op_eol_and_expr -> stab_op_eol expr : {'$1', '$2'}.
|
||||
stab_op_eol_and_expr -> stab_op_eol : warn_empty_stab_clause('$1'), {'$1', nil}.
|
||||
|
||||
block_item -> block_eoe stab_eoe : {?exprs('$1'), build_stab(reverse('$2'))}.
|
||||
block_item -> block_eoe : {?exprs('$1'), nil}.
|
||||
|
||||
block_list -> block_item : ['$1'].
|
||||
block_list -> block_item block_list : ['$1'|'$2'].
|
||||
|
||||
%% Helpers
|
||||
|
||||
open_paren -> '(' : '$1'.
|
||||
open_paren -> '(' eol : '$1'.
|
||||
close_paren -> ')' : '$1'.
|
||||
close_paren -> eol ')' : '$2'.
|
||||
|
||||
empty_paren -> open_paren ')' : '$1'.
|
||||
|
||||
open_bracket -> '[' : '$1'.
|
||||
open_bracket -> '[' eol : '$1'.
|
||||
close_bracket -> ']' : '$1'.
|
||||
close_bracket -> eol ']' : '$2'.
|
||||
|
||||
open_bit -> '<<' : '$1'.
|
||||
open_bit -> '<<' eol : '$1'.
|
||||
close_bit -> '>>' : '$1'.
|
||||
close_bit -> eol '>>' : '$2'.
|
||||
|
||||
open_curly -> '{' : '$1'.
|
||||
open_curly -> '{' eol : '$1'.
|
||||
close_curly -> '}' : '$1'.
|
||||
close_curly -> eol '}' : '$2'.
|
||||
|
||||
% Operators
|
||||
|
||||
add_op_eol -> add_op : '$1'.
|
||||
add_op_eol -> add_op eol : '$1'.
|
||||
add_op_eol -> dual_op : '$1'.
|
||||
add_op_eol -> dual_op eol : '$1'.
|
||||
|
||||
mult_op_eol -> mult_op : '$1'.
|
||||
mult_op_eol -> mult_op eol : '$1'.
|
||||
|
||||
two_op_eol -> two_op : '$1'.
|
||||
two_op_eol -> two_op eol : '$1'.
|
||||
|
||||
three_op_eol -> three_op : '$1'.
|
||||
three_op_eol -> three_op eol : '$1'.
|
||||
|
||||
pipe_op_eol -> pipe_op : '$1'.
|
||||
pipe_op_eol -> pipe_op eol : '$1'.
|
||||
|
||||
capture_op_eol -> capture_op : '$1'.
|
||||
capture_op_eol -> capture_op eol : '$1'.
|
||||
|
||||
unary_op_eol -> unary_op : '$1'.
|
||||
unary_op_eol -> unary_op eol : '$1'.
|
||||
unary_op_eol -> dual_op : '$1'.
|
||||
unary_op_eol -> dual_op eol : '$1'.
|
||||
|
||||
match_op_eol -> match_op : '$1'.
|
||||
match_op_eol -> match_op eol : '$1'.
|
||||
|
||||
and_op_eol -> and_op : '$1'.
|
||||
and_op_eol -> and_op eol : '$1'.
|
||||
|
||||
or_op_eol -> or_op : '$1'.
|
||||
or_op_eol -> or_op eol : '$1'.
|
||||
|
||||
in_op_eol -> in_op : '$1'.
|
||||
in_op_eol -> in_op eol : '$1'.
|
||||
|
||||
in_match_op_eol -> in_match_op : '$1'.
|
||||
in_match_op_eol -> in_match_op eol : '$1'.
|
||||
|
||||
type_op_eol -> type_op : '$1'.
|
||||
type_op_eol -> type_op eol : '$1'.
|
||||
|
||||
when_op_eol -> when_op : '$1'.
|
||||
when_op_eol -> when_op eol : '$1'.
|
||||
|
||||
stab_op_eol -> stab_op : '$1'.
|
||||
stab_op_eol -> stab_op eol : '$1'.
|
||||
|
||||
at_op_eol -> at_op : '$1'.
|
||||
at_op_eol -> at_op eol : '$1'.
|
||||
|
||||
comp_op_eol -> comp_op : '$1'.
|
||||
comp_op_eol -> comp_op eol : '$1'.
|
||||
|
||||
rel_op_eol -> rel_op : '$1'.
|
||||
rel_op_eol -> rel_op eol : '$1'.
|
||||
|
||||
arrow_op_eol -> arrow_op : '$1'.
|
||||
arrow_op_eol -> arrow_op eol : '$1'.
|
||||
|
||||
% Dot operator
|
||||
|
||||
dot_op -> '.' : '$1'.
|
||||
dot_op -> '.' eol : '$1'.
|
||||
|
||||
dot_identifier -> identifier : '$1'.
|
||||
dot_identifier -> matched_expr dot_op identifier : build_dot('$2', '$1', '$3').
|
||||
|
||||
dot_alias -> aliases : {'__aliases__', meta_from_token('$1', 0), ?exprs('$1')}.
|
||||
dot_alias -> matched_expr dot_op aliases : build_dot_alias('$2', '$1', '$3').
|
||||
dot_alias -> matched_expr dot_op dot_alias_container : build_dot_container('$2', '$1', '$3').
|
||||
|
||||
dot_alias_container -> open_curly '}' : [].
|
||||
dot_alias_container -> open_curly container_args close_curly : '$2'.
|
||||
|
||||
dot_op_identifier -> op_identifier : '$1'.
|
||||
dot_op_identifier -> matched_expr dot_op op_identifier : build_dot('$2', '$1', '$3').
|
||||
|
||||
dot_do_identifier -> do_identifier : '$1'.
|
||||
dot_do_identifier -> matched_expr dot_op do_identifier : build_dot('$2', '$1', '$3').
|
||||
|
||||
dot_bracket_identifier -> bracket_identifier : '$1'.
|
||||
dot_bracket_identifier -> matched_expr dot_op bracket_identifier : build_dot('$2', '$1', '$3').
|
||||
|
||||
dot_paren_identifier -> paren_identifier : '$1'.
|
||||
dot_paren_identifier -> matched_expr dot_op paren_identifier : build_dot('$2', '$1', '$3').
|
||||
|
||||
parens_call -> dot_paren_identifier : '$1'.
|
||||
parens_call -> matched_expr dot_call_op : {'.', meta_from_token('$2'), ['$1']}. % Fun/local calls
|
||||
|
||||
% Function calls with no parentheses
|
||||
|
||||
call_args_no_parens_expr -> matched_expr : '$1'.
|
||||
call_args_no_parens_expr -> no_parens_expr : throw_no_parens_many_strict('$1').
|
||||
|
||||
call_args_no_parens_comma_expr -> matched_expr ',' call_args_no_parens_expr : ['$3', '$1'].
|
||||
call_args_no_parens_comma_expr -> call_args_no_parens_comma_expr ',' call_args_no_parens_expr : ['$3'|'$1'].
|
||||
|
||||
call_args_no_parens_all -> call_args_no_parens_one : '$1'.
|
||||
call_args_no_parens_all -> call_args_no_parens_ambig : '$1'.
|
||||
call_args_no_parens_all -> call_args_no_parens_many : '$1'.
|
||||
|
||||
call_args_no_parens_one -> call_args_no_parens_kw : ['$1'].
|
||||
call_args_no_parens_one -> matched_expr : ['$1'].
|
||||
|
||||
call_args_no_parens_ambig -> no_parens_expr : ['$1'].
|
||||
|
||||
call_args_no_parens_many -> matched_expr ',' call_args_no_parens_kw : ['$1', '$3'].
|
||||
call_args_no_parens_many -> call_args_no_parens_comma_expr : reverse('$1').
|
||||
call_args_no_parens_many -> call_args_no_parens_comma_expr ',' call_args_no_parens_kw : reverse(['$3'|'$1']).
|
||||
|
||||
call_args_no_parens_many_strict -> call_args_no_parens_many : '$1'.
|
||||
call_args_no_parens_many_strict -> open_paren call_args_no_parens_kw close_paren : throw_no_parens_strict('$1').
|
||||
call_args_no_parens_many_strict -> open_paren call_args_no_parens_many close_paren : throw_no_parens_strict('$1').
|
||||
|
||||
stab_parens_many -> open_paren call_args_no_parens_kw close_paren : ['$2'].
|
||||
stab_parens_many -> open_paren call_args_no_parens_many close_paren : '$2'.
|
||||
|
||||
% Containers
|
||||
|
||||
container_expr -> matched_expr : '$1'.
|
||||
container_expr -> unmatched_expr : '$1'.
|
||||
container_expr -> no_parens_expr : throw_no_parens_container_strict('$1').
|
||||
|
||||
container_args_base -> container_expr : ['$1'].
|
||||
container_args_base -> container_args_base ',' container_expr : ['$3'|'$1'].
|
||||
|
||||
container_args -> container_args_base : lists:reverse('$1').
|
||||
container_args -> container_args_base ',' : lists:reverse('$1').
|
||||
container_args -> container_args_base ',' kw : lists:reverse(['$3'|'$1']).
|
||||
|
||||
% Function calls with parentheses
|
||||
|
||||
call_args_parens_expr -> matched_expr : '$1'.
|
||||
call_args_parens_expr -> unmatched_expr : '$1'.
|
||||
call_args_parens_expr -> no_parens_expr : throw_no_parens_many_strict('$1').
|
||||
|
||||
call_args_parens_base -> call_args_parens_expr : ['$1'].
|
||||
call_args_parens_base -> call_args_parens_base ',' call_args_parens_expr : ['$3'|'$1'].
|
||||
|
||||
call_args_parens -> empty_paren : [].
|
||||
call_args_parens -> open_paren no_parens_expr close_paren : ['$2'].
|
||||
call_args_parens -> open_paren kw close_paren : ['$2'].
|
||||
call_args_parens -> open_paren call_args_parens_base close_paren : reverse('$2').
|
||||
call_args_parens -> open_paren call_args_parens_base ',' kw close_paren : reverse(['$4'|'$2']).
|
||||
|
||||
% KV
|
||||
|
||||
kw_eol -> kw_identifier : ?exprs('$1').
|
||||
kw_eol -> kw_identifier eol : ?exprs('$1').
|
||||
kw_eol -> kw_identifier_safe : build_quoted_atom('$1', true).
|
||||
kw_eol -> kw_identifier_safe eol : build_quoted_atom('$1', true).
|
||||
kw_eol -> kw_identifier_unsafe : build_quoted_atom('$1', false).
|
||||
kw_eol -> kw_identifier_unsafe eol : build_quoted_atom('$1', false).
|
||||
|
||||
kw_base -> kw_eol container_expr : [{'$1', '$2'}].
|
||||
kw_base -> kw_base ',' kw_eol container_expr : [{'$3', '$4'}|'$1'].
|
||||
|
||||
kw -> kw_base : reverse('$1').
|
||||
kw -> kw_base ',' : reverse('$1').
|
||||
|
||||
call_args_no_parens_kw_expr -> kw_eol matched_expr : {'$1', '$2'}.
|
||||
call_args_no_parens_kw_expr -> kw_eol no_parens_expr : {'$1', '$2'}.
|
||||
|
||||
call_args_no_parens_kw -> call_args_no_parens_kw_expr : ['$1'].
|
||||
call_args_no_parens_kw -> call_args_no_parens_kw_expr ',' call_args_no_parens_kw : ['$1'|'$3'].
|
||||
|
||||
% Lists
|
||||
|
||||
list_args -> kw : '$1'.
|
||||
list_args -> container_args_base : reverse('$1').
|
||||
list_args -> container_args_base ',' : reverse('$1').
|
||||
list_args -> container_args_base ',' kw : reverse('$1', '$3').
|
||||
|
||||
list -> open_bracket ']' : build_list('$1', []).
|
||||
list -> open_bracket list_args close_bracket : build_list('$1', '$2').
|
||||
|
||||
% Tuple
|
||||
|
||||
tuple -> open_curly '}' : build_tuple('$1', []).
|
||||
tuple -> open_curly container_args close_curly : build_tuple('$1', '$2').
|
||||
|
||||
% Bitstrings
|
||||
|
||||
bit_string -> open_bit '>>' : build_bit('$1', []).
|
||||
bit_string -> open_bit container_args close_bit : build_bit('$1', '$2').
|
||||
|
||||
% Map and structs
|
||||
|
||||
%% Allow unquote/@something/aliases inside maps and structs.
|
||||
map_expr -> max_expr : '$1'.
|
||||
map_expr -> dot_identifier : build_identifier('$1', nil).
|
||||
map_expr -> at_op_eol map_expr : build_unary_op('$1', '$2').
|
||||
|
||||
assoc_op_eol -> assoc_op : '$1'.
|
||||
assoc_op_eol -> assoc_op eol : '$1'.
|
||||
|
||||
assoc_expr -> matched_expr assoc_op_eol matched_expr : {'$1', '$3'}.
|
||||
assoc_expr -> unmatched_expr assoc_op_eol unmatched_expr : {'$1', '$3'}.
|
||||
assoc_expr -> matched_expr assoc_op_eol unmatched_expr : {'$1', '$3'}.
|
||||
assoc_expr -> unmatched_expr assoc_op_eol matched_expr : {'$1', '$3'}.
|
||||
assoc_expr -> map_expr : '$1'.
|
||||
|
||||
assoc_update -> matched_expr pipe_op_eol assoc_expr : {'$2', '$1', ['$3']}.
|
||||
assoc_update -> unmatched_expr pipe_op_eol assoc_expr : {'$2', '$1', ['$3']}.
|
||||
|
||||
assoc_update_kw -> matched_expr pipe_op_eol kw : {'$2', '$1', '$3'}.
|
||||
assoc_update_kw -> unmatched_expr pipe_op_eol kw : {'$2', '$1', '$3'}.
|
||||
|
||||
assoc_base -> assoc_expr : ['$1'].
|
||||
assoc_base -> assoc_base ',' assoc_expr : ['$3'|'$1'].
|
||||
|
||||
assoc -> assoc_base : reverse('$1').
|
||||
assoc -> assoc_base ',' : reverse('$1').
|
||||
|
||||
map_op -> '%{}' : '$1'.
|
||||
map_op -> '%{}' eol : '$1'.
|
||||
|
||||
map_close -> kw close_curly : '$1'.
|
||||
map_close -> assoc close_curly : '$1'.
|
||||
map_close -> assoc_base ',' kw close_curly : reverse('$1', '$3').
|
||||
|
||||
map_args -> open_curly '}' : build_map('$1', []).
|
||||
map_args -> open_curly map_close : build_map('$1', '$2').
|
||||
map_args -> open_curly assoc_update close_curly : build_map_update('$1', '$2', []).
|
||||
map_args -> open_curly assoc_update ',' close_curly : build_map_update('$1', '$2', []).
|
||||
map_args -> open_curly assoc_update ',' map_close : build_map_update('$1', '$2', '$4').
|
||||
map_args -> open_curly assoc_update_kw close_curly : build_map_update('$1', '$2', []).
|
||||
|
||||
struct_op -> '%' : '$1'.
|
||||
|
||||
map -> map_op map_args : '$2'.
|
||||
map -> struct_op map_expr map_args : {'%', meta_from_token('$1'), ['$2', '$3']}.
|
||||
map -> struct_op map_expr eol map_args : {'%', meta_from_token('$1'), ['$2', '$4']}.
|
||||
|
||||
Erlang code.
|
||||
|
||||
-define(file(), get(elixir_parser_file)).
|
||||
-define(id(Token), element(1, Token)).
|
||||
-define(location(Token), element(2, Token)).
|
||||
-define(exprs(Token), element(3, Token)).
|
||||
-define(meta(Node), element(2, Node)).
|
||||
-define(rearrange_uop(Op), (Op == 'not' orelse Op == '!')).
|
||||
|
||||
%% The following directive is needed for (significantly) faster
|
||||
%% compilation of the generated .erl file by the HiPE compiler
|
||||
-compile([{hipe, [{regalloc, linear_scan}]}]).
|
||||
-import(lists, [reverse/1, reverse/2]).
|
||||
|
||||
meta_from_token(Token, Counter) -> [{counter, Counter}|meta_from_token(Token)].
|
||||
meta_from_token(Token) -> meta_from_location(?location(Token)).
|
||||
|
||||
meta_from_location({Line, Column, EndColumn})
|
||||
when is_integer(Line), is_integer(Column), is_integer(EndColumn) -> [{line, Line}].
|
||||
|
||||
%% Operators
|
||||
|
||||
build_op({_Kind, Location, 'in'}, {UOp, _, [Left]}, Right) when ?rearrange_uop(UOp) ->
|
||||
{UOp, meta_from_location(Location), [{'in', meta_from_location(Location), [Left, Right]}]};
|
||||
|
||||
build_op({_Kind, Location, Op}, Left, Right) ->
|
||||
{Op, meta_from_location(Location), [Left, Right]}.
|
||||
|
||||
build_unary_op({_Kind, Location, Op}, Expr) ->
|
||||
{Op, meta_from_location(Location), [Expr]}.
|
||||
|
||||
build_list(Marker, Args) ->
|
||||
{Args, ?location(Marker)}.
|
||||
|
||||
build_tuple(_Marker, [Left, Right]) ->
|
||||
{Left, Right};
|
||||
build_tuple(Marker, Args) ->
|
||||
{'{}', meta_from_token(Marker), Args}.
|
||||
|
||||
build_bit(Marker, Args) ->
|
||||
{'<<>>', meta_from_token(Marker), Args}.
|
||||
|
||||
build_map(Marker, Args) ->
|
||||
{'%{}', meta_from_token(Marker), Args}.
|
||||
|
||||
build_map_update(Marker, {Pipe, Left, Right}, Extra) ->
|
||||
{'%{}', meta_from_token(Marker), [build_op(Pipe, Left, Right ++ Extra)]}.
|
||||
|
||||
%% Blocks
|
||||
|
||||
build_block([{Op, _, [_]}]=Exprs) when ?rearrange_uop(Op) -> {'__block__', [], Exprs};
|
||||
build_block([{unquote_splicing, _, Args}]=Exprs) when
|
||||
length(Args) =< 2 -> {'__block__', [], Exprs};
|
||||
build_block([Expr]) -> Expr;
|
||||
build_block(Exprs) -> {'__block__', [], Exprs}.
|
||||
|
||||
%% Dots
|
||||
|
||||
build_dot_alias(Dot, {'__aliases__', _, Left}, {'aliases', _, Right}) ->
|
||||
{'__aliases__', meta_from_token(Dot), Left ++ Right};
|
||||
|
||||
build_dot_alias(_Dot, Atom, {'aliases', _, _} = Token) when is_atom(Atom) ->
|
||||
throw_bad_atom(Token);
|
||||
|
||||
build_dot_alias(Dot, Other, {'aliases', _, Right}) ->
|
||||
{'__aliases__', meta_from_token(Dot), [Other|Right]}.
|
||||
|
||||
build_dot_container(Dot, Left, Right) ->
|
||||
Meta = meta_from_token(Dot),
|
||||
{{'.', Meta, [Left, '{}']}, Meta, Right}.
|
||||
|
||||
build_dot(Dot, Left, Right) ->
|
||||
{'.', meta_from_token(Dot), [Left, extract_identifier(Right)]}.
|
||||
|
||||
extract_identifier({Kind, _, Identifier}) when
|
||||
Kind == identifier; Kind == bracket_identifier; Kind == paren_identifier;
|
||||
Kind == do_identifier; Kind == op_identifier ->
|
||||
Identifier.
|
||||
|
||||
%% Identifiers
|
||||
|
||||
build_nested_parens(Dot, Args1, Args2) ->
|
||||
Identifier = build_identifier(Dot, Args1),
|
||||
Meta = ?meta(Identifier),
|
||||
{Identifier, Meta, Args2}.
|
||||
|
||||
build_identifier({'.', Meta, _} = Dot, Args) ->
|
||||
FArgs = case Args of
|
||||
nil -> [];
|
||||
_ -> Args
|
||||
end,
|
||||
{Dot, Meta, FArgs};
|
||||
|
||||
build_identifier({op_identifier, Location, Identifier}, [Arg]) ->
|
||||
{Identifier, [{ambiguous_op, nil}|meta_from_location(Location)], [Arg]};
|
||||
|
||||
build_identifier({_, Location, Identifier}, Args) ->
|
||||
{Identifier, meta_from_location(Location), Args}.
|
||||
|
||||
%% Fn
|
||||
|
||||
build_fn(Op, [{'->', _, [_, _]}|_] = Stab) ->
|
||||
{fn, meta_from_token(Op), build_stab(Stab)};
|
||||
build_fn(Op, _Stab) ->
|
||||
throw(meta_from_token(Op), "expected clauses to be defined with -> inside: ", "'fn'").
|
||||
|
||||
%% Access
|
||||
|
||||
build_access(Expr, {List, Location}) ->
|
||||
Meta = meta_from_location(Location),
|
||||
{{'.', Meta, ['Elixir.Access', get]}, Meta, [Expr, List]}.
|
||||
|
||||
%% Interpolation aware
|
||||
|
||||
build_sigil({sigil, Location, Sigil, Parts, Modifiers}) ->
|
||||
Meta = meta_from_location(Location),
|
||||
{list_to_atom("sigil_" ++ [Sigil]), Meta, [{'<<>>', Meta, string_parts(Parts)}, Modifiers]}.
|
||||
|
||||
build_bin_string({bin_string, _Location, [H]}) when is_binary(H) ->
|
||||
H;
|
||||
build_bin_string({bin_string, Location, Args}) ->
|
||||
{'<<>>', meta_from_location(Location), string_parts(Args)}.
|
||||
|
||||
build_list_string({list_string, _Location, [H]}) when is_binary(H) ->
|
||||
elixir_utils:characters_to_list(H);
|
||||
build_list_string({list_string, Location, Args}) ->
|
||||
Meta = meta_from_location(Location),
|
||||
{{'.', Meta, ['Elixir.String', to_char_list]}, Meta, [{'<<>>', Meta, string_parts(Args)}]}.
|
||||
|
||||
build_quoted_atom({_, _Location, [H]}, Safe) when is_binary(H) ->
|
||||
Op = binary_to_atom_op(Safe), erlang:Op(H, utf8);
|
||||
build_quoted_atom({_, Location, Args}, Safe) ->
|
||||
Meta = meta_from_location(Location),
|
||||
{{'.', Meta, [erlang, binary_to_atom_op(Safe)]}, Meta, [{'<<>>', Meta, string_parts(Args)}, utf8]}.
|
||||
|
||||
binary_to_atom_op(true) -> binary_to_existing_atom;
|
||||
binary_to_atom_op(false) -> binary_to_atom.
|
||||
|
||||
string_parts(Parts) ->
|
||||
[string_part(Part) || Part <- Parts].
|
||||
string_part(Binary) when is_binary(Binary) ->
|
||||
Binary;
|
||||
string_part({Location, Tokens}) ->
|
||||
Form = string_tokens_parse(Tokens),
|
||||
Meta = meta_from_location(Location),
|
||||
{'::', Meta, [{{'.', Meta, ['Elixir.Kernel', to_string]}, Meta, [Form]}, {binary, Meta, nil}]}.
|
||||
|
||||
string_tokens_parse(Tokens) ->
|
||||
case parse(Tokens) of
|
||||
{ok, Forms} -> Forms;
|
||||
{error, _} = Error -> throw(Error)
|
||||
end.
|
||||
|
||||
%% Keywords
|
||||
|
||||
build_stab([{'->', Meta, [Left, Right]}|T]) ->
|
||||
build_stab(Meta, T, Left, [Right], []);
|
||||
|
||||
build_stab(Else) ->
|
||||
build_block(Else).
|
||||
|
||||
build_stab(Old, [{'->', New, [Left, Right]}|T], Marker, Temp, Acc) ->
|
||||
H = {'->', Old, [Marker, build_block(reverse(Temp))]},
|
||||
build_stab(New, T, Left, [Right], [H|Acc]);
|
||||
|
||||
build_stab(Meta, [H|T], Marker, Temp, Acc) ->
|
||||
build_stab(Meta, T, Marker, [H|Temp], Acc);
|
||||
|
||||
build_stab(Meta, [], Marker, Temp, Acc) ->
|
||||
H = {'->', Meta, [Marker, build_block(reverse(Temp))]},
|
||||
reverse([H|Acc]).
|
||||
|
||||
%% Every time the parser sees a (unquote_splicing())
|
||||
%% it assumes that a block is being spliced, wrapping
|
||||
%% the splicing in a __block__. But in the stab clause,
|
||||
%% we can have (unquote_splicing(1, 2, 3)) -> :ok, in such
|
||||
%% case, we don't actually want the block, since it is
|
||||
%% an arg style call. unwrap_splice unwraps the splice
|
||||
%% from such blocks.
|
||||
unwrap_splice([{'__block__', [], [{unquote_splicing, _, _}] = Splice}]) ->
|
||||
Splice;
|
||||
|
||||
unwrap_splice(Other) -> Other.
|
||||
|
||||
unwrap_when(Args) ->
|
||||
case elixir_utils:split_last(Args) of
|
||||
{Start, {'when', Meta, [_, _] = End}} ->
|
||||
[{'when', Meta, Start ++ End}];
|
||||
{_, _} ->
|
||||
Args
|
||||
end.
|
||||
|
||||
to_block([One]) -> One;
|
||||
to_block(Other) -> {'__block__', [], reverse(Other)}.
|
||||
|
||||
%% Warnings and errors
|
||||
|
||||
throw(Meta, Error, Token) ->
|
||||
Line =
|
||||
case lists:keyfind(line, 1, Meta) of
|
||||
{line, L} -> L;
|
||||
false -> 0
|
||||
end,
|
||||
throw({error, {Line, ?MODULE, [Error, Token]}}).
|
||||
|
||||
throw_bad_atom(Token) ->
|
||||
throw(meta_from_token(Token), "atom cannot be followed by an alias. If the '.' was meant to be "
|
||||
"part of the atom's name, the atom name must be quoted. Syntax error before: ", "'.'").
|
||||
|
||||
throw_no_parens_strict(Token) ->
|
||||
throw(meta_from_token(Token), "unexpected parentheses. If you are making a "
|
||||
"function call, do not insert spaces between the function name and the "
|
||||
"opening parentheses. Syntax error before: ", "'('").
|
||||
|
||||
throw_no_parens_many_strict(Node) ->
|
||||
throw(?meta(Node),
|
||||
"unexpected comma. Parentheses are required to solve ambiguity in nested calls.\n\n"
|
||||
"This error happens when you have nested function calls without parentheses. "
|
||||
"For example:\n\n"
|
||||
" one a, two b, c, d\n\n"
|
||||
"In the example above, we don't know if the parameters \"c\" and \"d\" apply "
|
||||
"to the function \"one\" or \"two\". You can solve this by explicitly adding "
|
||||
"parentheses:\n\n"
|
||||
" one a, two(b, c, d)\n\n"
|
||||
"Elixir cannot compile otherwise. Syntax error before: ", "','").
|
||||
|
||||
throw_no_parens_container_strict(Node) ->
|
||||
throw(?meta(Node),
|
||||
"unexpected comma. Parentheses are required to solve ambiguity inside containers.\n\n"
|
||||
"This error may happen when you forget a comma in a list or other container:\n\n"
|
||||
" [a, b c, d]\n\n"
|
||||
"Or when you have ambiguous calls:\n\n"
|
||||
" [one, two three, four, five]\n\n"
|
||||
"In the example above, we don't know if the parameters \"four\" and \"five\" "
|
||||
"belongs to the list or the function \"two\". You can solve this by explicitly "
|
||||
"adding parentheses:\n\n"
|
||||
" [one, two(three, four), five]\n\n"
|
||||
"Elixir cannot compile otherwise. Syntax error before: ", "','").
|
||||
|
||||
throw_invalid_kw_identifier({_, _, do} = Token) ->
|
||||
throw(meta_from_token(Token), elixir_tokenizer:invalid_do_error("unexpected keyword \"do:\""), "'do:'");
|
||||
throw_invalid_kw_identifier({_, _, KW} = Token) ->
|
||||
throw(meta_from_token(Token), "syntax error before: ", "'" ++ atom_to_list(KW) ++ "':").
|
||||
|
||||
%% TODO: Make those warnings errors.
|
||||
warn_empty_stab_clause({stab_op, {Line, _Begin, _End}, '->'}) ->
|
||||
elixir_errors:warn(Line, ?file(),
|
||||
"an expression is always required on the right side of ->. "
|
||||
"Please provide a value after ->").
|
||||
|
||||
warn_pipe({arrow_op, {Line, _Begin, _End}, Op}, {_, [_|_], [_|_]}) ->
|
||||
elixir_errors:warn(Line, ?file(),
|
||||
io_lib:format(
|
||||
"you are piping into a function call without parentheses, which may be ambiguous. "
|
||||
"Please wrap the function you are piping into in parentheses. For example:\n\n"
|
||||
" foo 1 ~ts bar 2 ~ts baz 3\n\n"
|
||||
"Should be written as:\n\n"
|
||||
" foo(1) ~ts bar(2) ~ts baz(3)\n",
|
||||
[Op, Op, Op, Op]
|
||||
)
|
||||
);
|
||||
warn_pipe(_Token, _) ->
|
||||
ok.
|
||||
256
samples/Erlang/lfe_scan.xrl
Normal file
256
samples/Erlang/lfe_scan.xrl
Normal file
@@ -0,0 +1,256 @@
|
||||
%% Copyright (c) 2008-2013 Robert Virding
|
||||
%%
|
||||
%% 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.
|
||||
|
||||
%% File : lfe_scan.xrl
|
||||
%% Author : Robert Virding
|
||||
%% Purpose : Token definitions for Lisp Flavoured Erlang.
|
||||
|
||||
Definitions.
|
||||
B = [01]
|
||||
O = [0-7]
|
||||
D = [0-9]
|
||||
H = [0-9a-fA-F]
|
||||
B36 = [0-9a-zA-Z]
|
||||
U = [A-Z]
|
||||
L = [a-z]
|
||||
A = ({U}|{L})
|
||||
DEL = [][()}{";\000-\s]
|
||||
SYM = [^][()}{";\000-\s\177-\237]
|
||||
SSYM = [^][()}{"|;#`',\000-\s\177-\237]
|
||||
WS = ([\000-\s]|;[^\n]*)
|
||||
|
||||
Rules.
|
||||
%% Bracketed Comments using #| foo |#
|
||||
#{D}*\|[^\|]*\|+([^#\|][^\|]*\|+)*# :
|
||||
block_comment(string:substr(TokenChars, 3)).
|
||||
|
||||
%% Separators
|
||||
' : {token,{'\'',TokenLine}}.
|
||||
` : {token,{'`',TokenLine}}.
|
||||
, : {token,{',',TokenLine}}.
|
||||
,@ : {token,{',@',TokenLine}}.
|
||||
\. : {token,{'.',TokenLine}}.
|
||||
[][()}{] : {token,{list_to_atom(TokenChars),TokenLine}}.
|
||||
|
||||
#{D}*[bB]\( : {token,{'#B(',TokenLine}}.
|
||||
#{D}*[mM]\( : {token,{'#M(',TokenLine}}.
|
||||
#{D}*\( : {token,{'#(',TokenLine}}.
|
||||
#{D}*\. : {token,{'#.',TokenLine}}.
|
||||
|
||||
#{D}*` : {token,{'#`',TokenLine}}.
|
||||
#{D}*; : {token,{'#;',TokenLine}}.
|
||||
#{D}*, : {token,{'#,',TokenLine}}.
|
||||
#{D}*,@ : {token,{'#,@',TokenLine}}.
|
||||
|
||||
%% Characters
|
||||
#{D}*\\(x{H}+|.) : char_token(skip_past(TokenChars, $\\, $\\), TokenLine).
|
||||
|
||||
%% Based numbers
|
||||
#{D}*\*{SYM}+ : base_token(skip_past(TokenChars, $*, $*), 2, TokenLine).
|
||||
#{D}*[bB]{SYM}+ : base_token(skip_past(TokenChars, $b, $B), 2, TokenLine).
|
||||
#{D}*[oO]{SYM}+ : base_token(skip_past(TokenChars, $o, $O), 8, TokenLine).
|
||||
#{D}*[dD]{SYM}+ : base_token(skip_past(TokenChars, $d, $D), 10, TokenLine).
|
||||
#{D}*[xX]{SYM}+ : base_token(skip_past(TokenChars, $x, $X), 16, TokenLine).
|
||||
#{D}*[rR]{SYM}+ :
|
||||
%% Scan over digit chars to get base.
|
||||
{Base,[_|Ds]} = base1(tl(TokenChars), 10, 0),
|
||||
base_token(Ds, Base, TokenLine).
|
||||
|
||||
%% String
|
||||
"(\\x{H}+;|\\.|[^"\\])*" :
|
||||
%% Strip quotes.
|
||||
S = string:substr(TokenChars, 2, TokenLen - 2),
|
||||
{token,{string,TokenLine,chars(S)}}.
|
||||
%% Binary string
|
||||
#"(\\x{H}+;|\\.|[^"\\])*" :
|
||||
%% Strip quotes.
|
||||
S = string:substr(TokenChars, 3, TokenLen - 3),
|
||||
Bin = unicode:characters_to_binary(chars(S), utf8, utf8),
|
||||
{token,{binary,TokenLine,Bin}}.
|
||||
%% Symbols
|
||||
\|(\\x{H}+;|\\.|[^|\\])*\| :
|
||||
%% Strip quotes.
|
||||
S = string:substr(TokenChars, 2, TokenLen - 2),
|
||||
symbol_token(chars(S), TokenLine).
|
||||
%% Funs
|
||||
#'{SSYM}{SYM}*/{D}+ :
|
||||
%% Strip sharpsign single-quote.
|
||||
FunStr = string:substr(TokenChars,3),
|
||||
{token,{'#\'',TokenLine,FunStr}}.
|
||||
%% Atoms
|
||||
[+-]?{D}+ :
|
||||
case catch {ok,list_to_integer(TokenChars)} of
|
||||
{ok,I} -> {token,{number,TokenLine,I}};
|
||||
_ -> {error,"illegal integer"}
|
||||
end.
|
||||
[+-]?{D}+\.{D}+([eE][+-]?{D}+)? :
|
||||
case catch {ok,list_to_float(TokenChars)} of
|
||||
{ok,F} -> {token,{number,TokenLine,F}};
|
||||
_ -> {error,"illegal float"}
|
||||
end.
|
||||
{SSYM}{SYM}* :
|
||||
symbol_token(TokenChars, TokenLine).
|
||||
{WS}+ : skip_token.
|
||||
|
||||
Erlang code.
|
||||
%% Copyright (c) 2008-2013 Robert Virding
|
||||
%%
|
||||
%% 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.
|
||||
|
||||
%% File : lfe_scan.erl
|
||||
%% Author : Robert Virding
|
||||
%% Purpose : Token definitions for Lisp Flavoured Erlang.
|
||||
|
||||
-export([start_symbol_char/1,symbol_char/1]).
|
||||
|
||||
-import(string, [substr/2,substr/3]).
|
||||
|
||||
%% start_symbol_char(Char) -> true | false.
|
||||
%% symbol_char(Char) -> true | false.
|
||||
%% Define start symbol chars and symbol chars.
|
||||
|
||||
start_symbol_char($#) -> false;
|
||||
start_symbol_char($`) -> false;
|
||||
start_symbol_char($') -> false; %'
|
||||
start_symbol_char($,) -> false;
|
||||
start_symbol_char($|) -> false; %Symbol quote character
|
||||
start_symbol_char(C) -> symbol_char(C).
|
||||
|
||||
symbol_char($() -> false;
|
||||
symbol_char($)) -> false;
|
||||
symbol_char($[) -> false;
|
||||
symbol_char($]) -> false;
|
||||
symbol_char(${) -> false;
|
||||
symbol_char($}) -> false;
|
||||
symbol_char($") -> false;
|
||||
symbol_char($;) -> false;
|
||||
symbol_char(C) -> ((C > $\s) and (C =< $~)) orelse (C > $\240).
|
||||
|
||||
%% symbol_token(Chars, Line) -> {token,{symbol,Line,Symbol}} | {error,E}.
|
||||
%% Build a symbol from list of legal characters, else error.
|
||||
|
||||
symbol_token(Cs, L) ->
|
||||
case catch {ok,list_to_atom(Cs)} of
|
||||
{ok,S} -> {token,{symbol,L,S}};
|
||||
_ -> {error,"illegal symbol"}
|
||||
end.
|
||||
|
||||
%% base_token(Chars, Base, Line) -> Integer.
|
||||
%% Convert a string of Base characters into a number. We only allow
|
||||
%% base betqeen 2 and 36, and an optional sign character first.
|
||||
|
||||
base_token(_, B, _) when B < 2; B > 36 ->
|
||||
{error,"illegal number base"};
|
||||
base_token([$+|Cs], B, L) -> base_token(Cs, B, +1, L);
|
||||
base_token([$-|Cs], B, L) -> base_token(Cs, B, -1, L);
|
||||
base_token(Cs, B, L) -> base_token(Cs, B, +1, L).
|
||||
|
||||
base_token(Cs, B, S, L) ->
|
||||
case base1(Cs, B, 0) of
|
||||
{N,[]} -> {token,{number,L,S*N}};
|
||||
{_,_} -> {error,"illegal based number"}
|
||||
end.
|
||||
|
||||
base1([C|Cs], Base, SoFar) when C >= $0, C =< $9, C < Base + $0 ->
|
||||
Next = SoFar * Base + (C - $0),
|
||||
base1(Cs, Base, Next);
|
||||
base1([C|Cs], Base, SoFar) when C >= $a, C =< $z, C < Base + $a - 10 ->
|
||||
Next = SoFar * Base + (C - $a + 10),
|
||||
base1(Cs, Base, Next);
|
||||
base1([C|Cs], Base, SoFar) when C >= $A, C =< $Z, C < Base + $A - 10 ->
|
||||
Next = SoFar * Base + (C - $A + 10),
|
||||
base1(Cs, Base, Next);
|
||||
base1([C|Cs], _Base, SoFar) -> {SoFar,[C|Cs]};
|
||||
base1([], _Base, N) -> {N,[]}.
|
||||
|
||||
-define(IS_UNICODE(C), ((C >= 0) and (C =< 16#10FFFF))).
|
||||
|
||||
%% char_token(InputChars, Line) -> {token,{number,L,N}} | {error,E}.
|
||||
%% Convert an input string into the corresponding character. For a
|
||||
%% sequence of hex characters we check resultant is code is in the
|
||||
%% unicode range.
|
||||
|
||||
char_token([$x,C|Cs], L) ->
|
||||
case base1([C|Cs], 16, 0) of
|
||||
{N,[]} when ?IS_UNICODE(N) -> {token,{number,L,N}};
|
||||
_ -> {error,"illegal character"}
|
||||
end;
|
||||
char_token([C], L) -> {token,{number,L,C}}.
|
||||
|
||||
%% chars(InputChars) -> Chars.
|
||||
%% Convert an input string into the corresponding string characters.
|
||||
%% We know that the input string is correct.
|
||||
|
||||
chars([$\\,$x,C|Cs0]) ->
|
||||
case hex_char(C) of
|
||||
true ->
|
||||
case base1([C|Cs0], 16, 0) of
|
||||
{N,[$;|Cs1]} -> [N|chars(Cs1)];
|
||||
_Other -> [escape_char($x)|chars([C|Cs0])]
|
||||
end;
|
||||
false -> [escape_char($x)|chars([C|Cs0])]
|
||||
end;
|
||||
chars([$\\,C|Cs]) -> [escape_char(C)|chars(Cs)];
|
||||
chars([C|Cs]) -> [C|chars(Cs)];
|
||||
chars([]) -> [].
|
||||
|
||||
hex_char(C) when C >= $0, C =< $9 -> true;
|
||||
hex_char(C) when C >= $a, C =< $f -> true;
|
||||
hex_char(C) when C >= $A, C =< $F -> true;
|
||||
hex_char(_) -> false.
|
||||
|
||||
escape_char($b) -> $\b; %\b = BS
|
||||
escape_char($t) -> $\t; %\t = TAB
|
||||
escape_char($n) -> $\n; %\n = LF
|
||||
escape_char($v) -> $\v; %\v = VT
|
||||
escape_char($f) -> $\f; %\f = FF
|
||||
escape_char($r) -> $\r; %\r = CR
|
||||
escape_char($e) -> $\e; %\e = ESC
|
||||
escape_char($s) -> $\s; %\s = SPC
|
||||
escape_char($d) -> $\d; %\d = DEL
|
||||
escape_char(C) -> C.
|
||||
|
||||
%% Block Comment:
|
||||
%% Provide a sensible error when people attempt to include nested
|
||||
%% comments because currently the parser cannot process them without
|
||||
%% a rebuild. But simply exploding on a '#|' is not going to be that
|
||||
%% helpful.
|
||||
|
||||
block_comment(TokenChars) ->
|
||||
%% Check we're not opening another comment block.
|
||||
case string:str(TokenChars, "#|") of
|
||||
0 -> skip_token; %% No nesting found
|
||||
_ -> {error, "illegal nested block comment"}
|
||||
end.
|
||||
|
||||
%% skip_until(String, Char1, Char2) -> String.
|
||||
%% skip_past(String, Char1, Char2) -> String.
|
||||
|
||||
%% skip_until([C|_]=Cs, C1, C2) when C =:= C1 ; C =:= C2 -> Cs;
|
||||
%% skip_until([_|Cs], C1, C2) -> skip_until(Cs, C1, C2);
|
||||
%% skip_until([], _, _) -> [].
|
||||
|
||||
skip_past([C|Cs], C1, C2) when C =:= C1 ; C =:= C2 -> Cs;
|
||||
skip_past([_|Cs], C1, C2) -> skip_past(Cs, C1, C2);
|
||||
skip_past([], _, _) -> [].
|
||||
54
samples/FLUX/gameserver.fx
Normal file
54
samples/FLUX/gameserver.fx
Normal 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};
|
||||
|
||||
|
||||
44
samples/FLUX/imageserver.fx
Normal file
44
samples/FLUX/imageserver.fx
Normal 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
151
samples/FLUX/mbittorrent.fx
Normal 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
38
samples/FLUX/test.fx
Normal 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
46
samples/Groovy/filenames/Jenkinsfile
vendored
Normal 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}"
|
||||
}
|
||||
}
|
||||
}
|
||||
27
samples/HLSL/accelerated_surface_win.hlsl
Normal file
27
samples/HLSL/accelerated_surface_win.hlsl
Normal 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
105
samples/HLSL/corridor.fx
Normal 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
119
samples/HLSL/jellyfish.fx
Normal 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
41
samples/HLSL/noise.fx
Normal 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();
|
||||
}
|
||||
}
|
||||
625
samples/Java/GrammarKit.java
Normal file
625
samples/Java/GrammarKit.java
Normal 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);
|
||||
}
|
||||
};
|
||||
}
|
||||
482
samples/Java/JFlexLexer.java
Normal file
482
samples/Java/JFlexLexer.java
Normal 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
38
samples/M4/htmlgen.m4
Normal 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>
|
||||
172
samples/M4Sugar/ax_ruby_devel.m4
Normal file
172
samples/M4Sugar/ax_ruby_devel.m4
Normal 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!
|
||||
#
|
||||
])
|
||||
143
samples/M4Sugar/filenames/configure.ac
Normal file
143
samples/M4Sugar/filenames/configure.ac
Normal 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
46
samples/M4Sugar/list.m4
Normal 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]]))]
|
||||
)])
|
||||
|
||||
31
samples/PLpgSQL/procedures.sql
Normal file
31
samples/PLpgSQL/procedures.sql
Normal file
@@ -0,0 +1,31 @@
|
||||
load 'plpgsql';
|
||||
load 'plpgsql_lint';
|
||||
|
||||
DROP FUNCTION IF EXISTS list_sites();
|
||||
CREATE OR REPLACE FUNCTION list_sites() RETURNS TABLE (fc json) AS
|
||||
$func$
|
||||
BEGIN
|
||||
RETURN QUERY SELECT row_to_json(feat_col) FROM (
|
||||
SELECT 'FeatureCollection' AS type, array_to_json(array_agg(feat)) AS features FROM (
|
||||
SELECT DISTINCT ON (new_id) 'Feature' AS type, ST_ASGeoJSON(loc.geom)::json AS geometry, row_to_json(
|
||||
(SELECT prop FROM (SELECT new_id) AS prop)) AS properties FROM location loc) AS feat) AS feat_col;
|
||||
END;
|
||||
$func$ LANGUAGE plpgsql;
|
||||
|
||||
|
||||
DROP FUNCTION IF EXISTS get_observations(character varying, integer);
|
||||
CREATE OR REPLACE FUNCTION get_observations(kind varchar, site_id integer) RETURNS TABLE (fc json) AS
|
||||
$func$
|
||||
BEGIN
|
||||
IF kind = 'o2_abs' THEN
|
||||
RETURN QUERY SELECT array_to_json(array_agg(row_to_json(obs))) FROM (
|
||||
SELECT observation_date AS date, o2_abs AS value FROM oxygen WHERE new_id = site_id) AS obs;
|
||||
ELSIF kind = 'o2_rel' THEN
|
||||
RETURN QUERY SELECT array_to_json(array_agg(row_to_json(obs))) FROM (
|
||||
SELECT observation_date AS date, o2_rel AS value FROM oxygen WHERE new_id = site_id) AS obs;
|
||||
ELSIF kind = 'temp' THEN
|
||||
RETURN QUERY SELECT array_to_json(array_agg(row_to_json(obs))) FROM (
|
||||
SELECT observation_date AS date, temp AS value FROM oxygen WHERE new_id = site_id) AS obs;
|
||||
END IF;
|
||||
END;
|
||||
$func$ LANGUAGE plpgsql;
|
||||
207
samples/POV-Ray SDL/balcony.pov
Executable file
207
samples/POV-Ray SDL/balcony.pov
Executable 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
117
samples/POV-Ray SDL/bglass.inc
Executable 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
212
samples/POV-Ray SDL/building.inc
Executable 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
382
samples/POV-Ray SDL/chair.inc
Executable 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
12217
samples/POV-Ray SDL/cloth.inc
Executable file
File diff suppressed because it is too large
Load Diff
188
samples/POV-Ray SDL/gamma_showcase.pov
Executable file
188
samples/POV-Ray SDL/gamma_showcase.pov
Executable 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
91
samples/POV-Ray SDL/sky.inc
Executable 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
171
samples/POV-Ray SDL/table.inc
Executable 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> }
|
||||
|
||||
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
|
||||
91
samples/POV-Ray SDL/table_cloth.inc
Executable file
91
samples/POV-Ray SDL/table_cloth.inc
Executable 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> }
|
||||
|
||||
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
|
||||
|
||||
136
samples/POV-Ray SDL/table_stuff.inc
Executable file
136
samples/POV-Ray SDL/table_stuff.inc
Executable 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
118
samples/POV-Ray SDL/terrain.inc
Executable 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
74
samples/POV-Ray SDL/water.inc
Executable 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
|
||||
}
|
||||
|
||||
/*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
|
||||
10
samples/Perl/Sample.pod
Normal file
10
samples/Perl/Sample.pod
Normal file
@@ -0,0 +1,10 @@
|
||||
use strict;
|
||||
use warnings;
|
||||
package DZT::Sample;
|
||||
|
||||
sub return_arrayref_of_values_passed {
|
||||
my $invocant = shift;
|
||||
return \@_;
|
||||
}
|
||||
|
||||
1;
|
||||
280
samples/Prolog/queues.yap
Normal file
280
samples/Prolog/queues.yap
Normal 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).
|
||||
|
||||
124
samples/Python/closure_js_binary.bzl
Normal file
124
samples/Python/closure_js_binary.bzl
Normal 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"})
|
||||
31
samples/Python/filenames/BUCK
Normal file
31
samples/Python/filenames/BUCK
Normal 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,
|
||||
)
|
||||
45
samples/Python/filenames/BUILD
Normal file
45
samples/Python/filenames/BUILD
Normal 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")
|
||||
49
samples/Python/simpleclient.rpy
Normal file
49
samples/Python/simpleclient.rpy
Normal 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()
|
||||
@@ -1421,7 +1421,4 @@ init:
|
||||
# $ renpy.pause(1.0)
|
||||
# hide text with dissolve
|
||||
#
|
||||
# return
|
||||
|
||||
|
||||
Return to the tutorial.
|
||||
# return
|
||||
41
samples/Text/aptitude-defaults.nb
Normal file
41
samples/Text/aptitude-defaults.nb
Normal 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».
|
||||
1
samples/Text/filenames/README.me
Normal file
1
samples/Text/filenames/README.me
Normal file
@@ -0,0 +1 @@
|
||||
Please read me.
|
||||
9
samples/Text/filenames/click.me
Normal file
9
samples/Text/filenames/click.me
Normal 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.
|
||||
1
samples/Text/filenames/delete.me
Normal file
1
samples/Text/filenames/delete.me
Normal file
@@ -0,0 +1 @@
|
||||
Delete me.
|
||||
1
samples/Text/filenames/keep.me
Normal file
1
samples/Text/filenames/keep.me
Normal file
@@ -0,0 +1 @@
|
||||
Keep me.
|
||||
1
samples/Text/filenames/read.me
Normal file
1
samples/Text/filenames/read.me
Normal file
@@ -0,0 +1 @@
|
||||
Read me now!
|
||||
1
samples/Text/filenames/test.me
Normal file
1
samples/Text/filenames/test.me
Normal file
@@ -0,0 +1 @@
|
||||
Test me.
|
||||
973
samples/Text/tutor.nb
Normal file
973
samples/Text/tutor.nb
Normal 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
973
samples/Text/tutor.no
Normal 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
154
samples/Uno/PlayerPads.uno
Normal 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
139
samples/Uno/Pong.uno
Normal 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
136
samples/Uno/TowerBlock.uno
Normal 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) {}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
29
samples/XML/Default.props
Normal file
29
samples/XML/Default.props
Normal file
@@ -0,0 +1,29 @@
|
||||
<!--
|
||||
***********************************************************************************************
|
||||
Default.props
|
||||
|
||||
WARNING: DO NOT MODIFY this file unless you are knowledgeable about MSBuild and have
|
||||
created a backup copy. Incorrect changes to this file will make it
|
||||
impossible to load or build your projects from the command-line or the IDE.
|
||||
|
||||
Copyright (C) Microsoft Corporation. All rights reserved.
|
||||
***********************************************************************************************
|
||||
-->
|
||||
|
||||
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
|
||||
<!-- Import Before -->
|
||||
<Import Condition="Exists('$(MSBuildThisFileDirectory)ImportBefore\Default')" Project="$(MSBuildThisFileDirectory)ImportBefore\Default\*.props" />
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetOsAndVersion>Windows Phone Silverlight 8.1</TargetOsAndVersion>
|
||||
<RealOSVersion>6.3</RealOSVersion>
|
||||
<PlatformToolset Condition="'$(PlatformToolset)' == ''">v120</PlatformToolset>
|
||||
|
||||
<_PlatformToolsetFriendlyNameFor_v120>Windows Phone Silverlight 8.1 (v120)</_PlatformToolsetFriendlyNameFor_v120>
|
||||
<_PlatformToolsetShortNameFor_v120>Windows Phone Silverlight 8.1</_PlatformToolsetShortNameFor_v120>
|
||||
</PropertyGroup>
|
||||
|
||||
<!-- Import After -->
|
||||
<Import Condition="Exists('$(MSBuildThisFileDirectory)ImportAfter\Default')" Project="$(MSBuildThisFileDirectory)ImportAfter\Default\*.props" />
|
||||
</Project>
|
||||
57
samples/XML/MainView.ux
Normal file
57
samples/XML/MainView.ux
Normal 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
11
samples/XML/MyApp.ux
Normal 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>
|
||||
29
samples/YAML/HexInspect.sublime-syntax
Normal file
29
samples/YAML/HexInspect.sublime-syntax
Normal 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
|
||||
55
samples/YANG/sfc-lisp-impl.yang
Normal file
55
samples/YANG/sfc-lisp-impl.yang
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
3
test/fixtures/Data/Modelines/ruby4
vendored
Normal file
3
test/fixtures/Data/Modelines/ruby4
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
# vim: filetype=ruby
|
||||
|
||||
# I am Ruby
|
||||
3
test/fixtures/Data/Modelines/ruby5
vendored
Normal file
3
test/fixtures/Data/Modelines/ruby5
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
# vim: ft=ruby
|
||||
|
||||
# I am Ruby
|
||||
3
test/fixtures/Data/Modelines/ruby6
vendored
Normal file
3
test/fixtures/Data/Modelines/ruby6
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
# vim: syntax=Ruby
|
||||
|
||||
# I am Ruby
|
||||
3
test/fixtures/Data/Modelines/ruby7
vendored
Normal file
3
test/fixtures/Data/Modelines/ruby7
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
# vim: se syntax=ruby:
|
||||
|
||||
# I am Ruby
|
||||
3
test/fixtures/Data/Modelines/ruby8
vendored
Normal file
3
test/fixtures/Data/Modelines/ruby8
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
# vim: set syntax=ruby:
|
||||
|
||||
# I am Ruby
|
||||
3
test/fixtures/Data/Modelines/ruby9
vendored
Normal file
3
test/fixtures/Data/Modelines/ruby9
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
# ex: syntax=ruby
|
||||
|
||||
# I am Ruby
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -113,6 +113,20 @@ class TestGrammars < Minitest::Test
|
||||
assert_equal [], licensed, msg
|
||||
end
|
||||
|
||||
def test_submodules_use_https_links
|
||||
File.open(".gitmodules", "r") do |fh|
|
||||
ssh_submodules = []
|
||||
fh.each_line do |line|
|
||||
if matches = line.match(/url = (git@.*)/)
|
||||
submodule_link = matches.captures[0]
|
||||
ssh_submodules.push(submodule_link)
|
||||
end
|
||||
end
|
||||
msg = "The following submodules don't have an HTTPS link:\n* #{ssh_submodules.join("\n* ")}"
|
||||
assert_equal [], ssh_submodules, msg
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def submodule_paths
|
||||
|
||||
@@ -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
|
||||
@@ -35,7 +36,7 @@ class TestHeuristcs < Minitest::Test
|
||||
|
||||
def test_detect_still_works_if_nothing_matches
|
||||
blob = Linguist::FileBlob.new(File.join(samples_path, "Objective-C/hello.m"))
|
||||
match = Language.detect(blob)
|
||||
match = Linguist.detect(blob)
|
||||
assert_equal Language["Objective-C"], match
|
||||
end
|
||||
|
||||
@@ -155,6 +156,14 @@ class TestHeuristcs < Minitest::Test
|
||||
})
|
||||
end
|
||||
|
||||
# Candidate languages = ["Pod", "Perl"]
|
||||
def test_pod_by_heuristics
|
||||
assert_heuristics({
|
||||
"Perl" => all_fixtures("Perl", "*.pod"),
|
||||
"Pod" => all_fixtures("Pod", "*.pod")
|
||||
})
|
||||
end
|
||||
|
||||
# Candidate languages = ["IDL", "Prolog", "QMake", "INI"]
|
||||
def test_pro_by_heuristics
|
||||
assert_heuristics({
|
||||
@@ -180,6 +189,16 @@ class TestHeuristcs < Minitest::Test
|
||||
})
|
||||
end
|
||||
|
||||
# Candidate languages = ["SQL", "PLpgSQL", "SQLPL", "PLSQL"]
|
||||
def test_sql_by_heuristics
|
||||
assert_heuristics({
|
||||
"SQL" => ["SQL/create_stuff.sql", "SQL/db.sql", "SQL/dual.sql"],
|
||||
"PLpgSQL" => all_fixtures("PLpgSQL", "*.sql"),
|
||||
"SQLPL" => ["SQLPL/trigger.sql"],
|
||||
"PLSQL" => all_fixtures("PLSQL", "*.sql")
|
||||
})
|
||||
end
|
||||
|
||||
# Candidate languages = ["Perl", "Perl6"]
|
||||
def test_t_perl_by_heuristics
|
||||
assert_heuristics({
|
||||
|
||||
@@ -28,7 +28,7 @@ class TestInstrumentation < Minitest::Test
|
||||
|
||||
def test_detection_instrumentation_with_binary_blob
|
||||
binary_blob = fixture_blob("Binary/octocat.ai")
|
||||
Language.detect(binary_blob)
|
||||
Linguist.detect(binary_blob)
|
||||
|
||||
# Shouldn't instrument this (as it's binary)
|
||||
assert_equal 0, Linguist.instrumenter.events.size
|
||||
@@ -36,7 +36,7 @@ class TestInstrumentation < Minitest::Test
|
||||
|
||||
def test_modeline_instrumentation
|
||||
blob = fixture_blob("Data/Modelines/ruby")
|
||||
Language.detect(blob)
|
||||
Linguist.detect(blob)
|
||||
|
||||
detect_event = Linguist.instrumenter.events.last
|
||||
detect_event_payload = detect_event[:args].first
|
||||
|
||||
@@ -11,6 +11,12 @@ class TestModelines < Minitest::Test
|
||||
assert_modeline Language["Ruby"], fixture_blob("Data/Modelines/ruby")
|
||||
assert_modeline Language["Ruby"], fixture_blob("Data/Modelines/ruby2")
|
||||
assert_modeline Language["Ruby"], fixture_blob("Data/Modelines/ruby3")
|
||||
assert_modeline Language["Ruby"], fixture_blob("Data/Modelines/ruby4")
|
||||
assert_modeline Language["Ruby"], fixture_blob("Data/Modelines/ruby5")
|
||||
assert_modeline Language["Ruby"], fixture_blob("Data/Modelines/ruby6")
|
||||
assert_modeline Language["Ruby"], fixture_blob("Data/Modelines/ruby7")
|
||||
assert_modeline Language["Ruby"], fixture_blob("Data/Modelines/ruby8")
|
||||
assert_modeline Language["Ruby"], fixture_blob("Data/Modelines/ruby9")
|
||||
assert_modeline Language["C++"], fixture_blob("Data/Modelines/seeplusplus")
|
||||
assert_modeline Language["C++"], fixture_blob("Data/Modelines/seeplusplusEmacs1")
|
||||
assert_modeline Language["C++"], fixture_blob("Data/Modelines/seeplusplusEmacs2")
|
||||
|
||||
2
vendor/grammars/AutoHotkey
vendored
2
vendor/grammars/AutoHotkey
vendored
Submodule vendor/grammars/AutoHotkey updated: 4da62de23d...d31adb9184
2
vendor/grammars/Elm.tmLanguage
vendored
2
vendor/grammars/Elm.tmLanguage
vendored
Submodule vendor/grammars/Elm.tmLanguage updated: 494145bded...155ce91c81
2
vendor/grammars/Handlebars
vendored
2
vendor/grammars/Handlebars
vendored
Submodule vendor/grammars/Handlebars updated: 7e5396d9be...2e9f688400
2
vendor/grammars/Lean.tmbundle
vendored
2
vendor/grammars/Lean.tmbundle
vendored
Submodule vendor/grammars/Lean.tmbundle updated: 943ac84bf6...a1a3818ecf
2
vendor/grammars/MagicPython
vendored
2
vendor/grammars/MagicPython
vendored
Submodule vendor/grammars/MagicPython updated: d7855f98ce...7d07d6f5b0
2
vendor/grammars/NimLime
vendored
2
vendor/grammars/NimLime
vendored
Submodule vendor/grammars/NimLime updated: 4e60e5657f...0c6c6207a6
2
vendor/grammars/Sublime-Inform/.gitignore
vendored
Normal file
2
vendor/grammars/Sublime-Inform/.gitignore
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
|
||||
.DS_Store
|
||||
6
vendor/grammars/Sublime-Inform/Inform7/book.sublime-snippet
vendored
Normal file
6
vendor/grammars/Sublime-Inform/Inform7/book.sublime-snippet
vendored
Normal file
@@ -0,0 +1,6 @@
|
||||
<snippet>
|
||||
<content><![CDATA[Book $1 - ${2:Title}
|
||||
]]></content>
|
||||
<tabTrigger>book</tabTrigger>
|
||||
<scope>source.Inform7</scope>
|
||||
</snippet>
|
||||
6
vendor/grammars/Sublime-Inform/Inform7/chapter.sublime-snippet
vendored
Normal file
6
vendor/grammars/Sublime-Inform/Inform7/chapter.sublime-snippet
vendored
Normal file
@@ -0,0 +1,6 @@
|
||||
<snippet>
|
||||
<content><![CDATA[Chapter $1 - ${2:Title}
|
||||
]]></content>
|
||||
<tabTrigger>chapter</tabTrigger>
|
||||
<scope>source.Inform7</scope>
|
||||
</snippet>
|
||||
7
vendor/grammars/Sublime-Inform/Inform7/door.sublime-snippet
vendored
Normal file
7
vendor/grammars/Sublime-Inform/Inform7/door.sublime-snippet
vendored
Normal 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>
|
||||
34
vendor/grammars/Sublime-Inform/Inform7/inform7.JSON-tmLanguage
vendored
Normal file
34
vendor/grammars/Sublime-Inform/Inform7/inform7.JSON-tmLanguage
vendored
Normal 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"
|
||||
}
|
||||
74
vendor/grammars/Sublime-Inform/Inform7/inform7.tmLanguage
vendored
Executable file
74
vendor/grammars/Sublime-Inform/Inform7/inform7.tmLanguage
vendored
Executable 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>
|
||||
8
vendor/grammars/Sublime-Inform/Inform7/object.sublime-snippet
vendored
Normal file
8
vendor/grammars/Sublime-Inform/Inform7/object.sublime-snippet
vendored
Normal 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>
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user